asciify-engine 1.0.24 → 1.0.25
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.cjs +28 -28
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +28 -28
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/types.ts","../src/core/utils.ts","../src/core/animation.ts","../src/backgrounds/_shared.ts","../src/backgrounds/wave.ts","../src/core/renderer.ts","../src/core/embed-gen.ts","../src/core/simple-api.ts","../src/backgrounds/rain.ts","../src/backgrounds/stars.ts","../src/backgrounds/pulse.ts","../src/backgrounds/noise.ts","../src/backgrounds/grid.ts","../src/backgrounds/aurora.ts","../src/backgrounds/silk.ts","../src/backgrounds/void.ts","../src/backgrounds/morph.ts","../src/backgrounds/fire.ts","../src/backgrounds/dna.ts","../src/backgrounds/terrain.ts","../src/backgrounds/circuit.ts","../src/backgrounds/index.ts","../src/core/ascii-text.ts","../src/core/record.ts","../src/webgl-engine.ts"],"names":["fade","parseGIF","decompressFrames","alpha","render"],"mappings":"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","file":"index.cjs","sourcesContent":["// ─── Asciify Types ────────────────────────────────────────────────\n\nexport type ColorMode = 'grayscale' | 'fullcolor' | 'matrix' | 'accent';\nexport type RenderMode = 'ascii' | 'dots';\nexport type AnimationStyle = 'none' | 'wave' | 'pulse' | 'rain' | 'breathe' | 'sparkle' | 'glitch' | 'spiral' | 'typewriter' | 'scatter' | 'waveField' | 'ripple' | 'melt' | 'orbit' | 'cellular';\nexport type ArtStyle = 'classic' | 'particles' | 'letters' | 'claudeCode' | 'art' | 'terminal' | 'box' | 'lines' | 'braille' | 'katakana' | 'musical' | 'emoji';\nexport type HoverEffect = 'spotlight' | 'magnify' | 'repel' | 'glow' | 'colorShift' | 'attract' | 'shatter' | 'trail';\nexport type HoverPreset = 'none' | 'subtle' | 'flashlight' | 'magnifier' | 'forceField' | 'neon' | 'fire' | 'ice' | 'gravity' | 'shatter' | 'ghost';\n\n/**\n * Named colour palette presets — pass as `colorMode` for themed rendering.\n * Applied as a post-process colour remap over the standard grayscale output.\n */\nexport type PaletteTheme = 'dracula' | 'monokai' | 'nord' | 'catppuccin' | 'solarized' | 'gruvbox';\n\nexport const PALETTE_THEMES: Record<PaletteTheme, { name: string; accent: string; bg: string; fg: string }> = {\n dracula: { name: 'Dracula', accent: '#bd93f9', bg: '#282a36', fg: '#f8f8f2' },\n monokai: { name: 'Monokai', accent: '#a6e22e', bg: '#272822', fg: '#f8f8f2' },\n nord: { name: 'Nord', accent: '#88c0d0', bg: '#2e3440', fg: '#eceff4' },\n catppuccin: { name: 'Catppuccin',accent: '#cba6f7', bg: '#1e1e2e', fg: '#cdd6f4' },\n solarized: { name: 'Solarized', accent: '#268bd2', bg: '#002b36', fg: '#839496' },\n gruvbox: { name: 'Gruvbox', accent: '#b8bb26', bg: '#282828', fg: '#ebdbb2' },\n};\nexport type SourceType = 'image' | 'video' | 'gif' | null;\n\nexport interface AsciiOptions {\n fontSize: number;\n charSpacing: number;\n brightness: number;\n contrast: number;\n charset: string;\n colorMode: ColorMode;\n accentColor: string;\n invert: boolean;\n renderMode: RenderMode;\n animationStyle: AnimationStyle;\n animationSpeed: number;\n dotSizeRatio: number;\n ditherStrength: number;\n hoverStrength: number;\n hoverRadius: number;\n hoverEffect: HoverEffect;\n hoverColor: string;\n artStyle: ArtStyle;\n customText: string;\n}\n\nexport interface AsciiCell {\n char: string;\n r: number;\n g: number;\n b: number;\n a: number;\n}\n\nexport type AsciiFrame = AsciiCell[][];\n\nexport interface AsciiResult {\n frames: AsciiFrame[];\n cols: number;\n rows: number;\n fps: number;\n}\n\nexport const CHARSETS = {\n standard: ' .:-=+*#%@',\n blocks: ' ░▒▓█',\n minimal: ' .:+',\n dense: ' .\\'`^\",:;Il!i><~+_-?][}{1)(|\\/tfjrxnuvczXYUJCLQ0OZmwqpdbkhao*#MW&8%B@$',\n binary: '01',\n dots: ' ⠁⠃⠇⡇⣇⣧⣷⣿',\n letters: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz',\n claudeCode: ' ╔╗╚╝║═╠╣╦╩╬░▒▓█│─┌┐└┘├┤┬┴┼',\n box: ' ▪◾◼■█',\n lines: ' ˗‐–—―━',\n braille: ' ⠁⠂⠃⠄⠅⠆⠇⠈⠉⠊⠋⠌⠍⠎⠏⠐⠑⠒⠓⠔⠕⠖⠗⠘⠙⠚⠛⠜⠝⠞⠟⠠⠡⠢⠣⠤⠥⠦⠧⠨⠩⠪⠫⠬⠭⠮⠯⠰⠱⠲⠳⠴⠵⠶⠷⠸⠹⠺⠻⠼⠽⠾⠿⡀⡁⡂⡃⡄⡅⡆⡇⣀⣁⣂⣃⣄⣅⣆⣇⣈⣉⣊⣋⣌⣍⣎⣏⣐⣑⣒⣓⣔⣕⣖⣗⣘⣙⣚⣛⣜⣝⣞⣟⣠⣡⣢⣣⣤⣥⣦⣧⣨⣩⣪⣫⣬⣭⣮⣯⣰⣱⣲⣳⣴⣵⣶⣷⣸⣹⣺⣻⣼⣽⣾⣿',\n katakana: ' ヲァィゥェォャュョッアイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワン',\n musical: ' ♩♪♫♬♭♮♯',\n emoji: ' ⬛🟫🟥🟧🟨🟩🟦🟪⬜',\n} as const;\n\nexport type CharsetKey = keyof typeof CHARSETS;\n\n/**\n * Art Style presets — each one sets render mode, charset, color mode, etc.\n */\nexport const ART_STYLE_PRESETS: Record<ArtStyle, Partial<AsciiOptions>> = {\n classic: {\n renderMode: 'ascii',\n charset: CHARSETS.standard,\n colorMode: 'grayscale',\n },\n particles: {\n renderMode: 'dots',\n colorMode: 'fullcolor',\n dotSizeRatio: 0.8,\n },\n letters: {\n renderMode: 'ascii',\n charset: CHARSETS.letters,\n colorMode: 'fullcolor',\n },\n claudeCode: {\n renderMode: 'ascii',\n charset: CHARSETS.claudeCode,\n colorMode: 'accent',\n accentColor: '#f97316',\n },\n art: {\n renderMode: 'ascii',\n charset: CHARSETS.dense,\n colorMode: 'fullcolor',\n },\n terminal: {\n renderMode: 'ascii',\n charset: CHARSETS.standard,\n colorMode: 'matrix',\n },\n box: {\n renderMode: 'ascii',\n charset: CHARSETS.box,\n colorMode: 'grayscale',\n },\n lines: {\n renderMode: 'ascii',\n charset: CHARSETS.lines,\n colorMode: 'fullcolor',\n },\n braille: {\n renderMode: 'ascii',\n charset: CHARSETS.braille,\n colorMode: 'fullcolor',\n },\n katakana: {\n renderMode: 'ascii',\n charset: CHARSETS.katakana,\n colorMode: 'matrix',\n },\n musical: {\n renderMode: 'ascii',\n charset: CHARSETS.musical,\n colorMode: 'accent',\n accentColor: '#e040fb',\n },\n emoji: {\n renderMode: 'ascii',\n charset: CHARSETS.emoji,\n colorMode: 'fullcolor',\n },\n};\n\nexport const DEFAULT_OPTIONS: AsciiOptions = {\n fontSize: 10,\n charSpacing: 1,\n brightness: 0,\n contrast: 0,\n charset: CHARSETS.standard,\n colorMode: 'grayscale',\n accentColor: '#d4ff00',\n invert: false,\n renderMode: 'ascii',\n animationStyle: 'none',\n animationSpeed: 1,\n dotSizeRatio: 0.8,\n ditherStrength: 0,\n hoverStrength: 0,\n hoverRadius: 0.2,\n hoverEffect: 'spotlight',\n hoverColor: '#ffffff',\n artStyle: 'classic',\n customText: '',\n};\n\n/**\n * Hover presets — one-click configurations for the hover system.\n */\nexport const HOVER_PRESETS: Record<HoverPreset, { label: string; options: Partial<AsciiOptions> }> = {\n none: {\n label: 'Off',\n options: { hoverStrength: 0, hoverEffect: 'spotlight', hoverRadius: 0.2, hoverColor: '#ffffff' },\n },\n subtle: {\n label: 'Subtle',\n options: { hoverStrength: 0.25, hoverEffect: 'glow', hoverRadius: 0.12, hoverColor: '#ffffff' },\n },\n flashlight: {\n label: 'Flashlight',\n options: { hoverStrength: 0.6, hoverEffect: 'spotlight', hoverRadius: 0.15, hoverColor: '#fffbe6' },\n },\n magnifier: {\n label: 'Magnifier',\n options: { hoverStrength: 0.7, hoverEffect: 'magnify', hoverRadius: 0.12, hoverColor: '#ffffff' },\n },\n forceField: {\n label: 'Force Field',\n options: { hoverStrength: 0.7, hoverEffect: 'repel', hoverRadius: 0.15, hoverColor: '#a0e8ff' },\n },\n neon: {\n label: 'Neon',\n options: { hoverStrength: 0.6, hoverEffect: 'colorShift', hoverRadius: 0.15, hoverColor: '#d946ef' },\n },\n fire: {\n label: 'Fire',\n options: { hoverStrength: 0.7, hoverEffect: 'spotlight', hoverRadius: 0.15, hoverColor: '#ff6b2b' },\n },\n ice: {\n label: 'Ice',\n options: { hoverStrength: 0.5, hoverEffect: 'glow', hoverRadius: 0.15, hoverColor: '#60d5f7' },\n },\n gravity: {\n label: 'Gravity',\n options: { hoverStrength: 0.7, hoverEffect: 'attract', hoverRadius: 0.18, hoverColor: '#a5d6ff' },\n },\n shatter: {\n label: 'Shatter',\n options: { hoverStrength: 0.8, hoverEffect: 'shatter', hoverRadius: 0.14, hoverColor: '#ff6090' },\n },\n ghost: {\n label: 'Ghost',\n options: { hoverStrength: 0.55, hoverEffect: 'trail', hoverRadius: 0.2, hoverColor: '#b39ddb' },\n },\n};\n","/**\n * Low-level canvas and color utilities shared across the entire engine.\n * No imports from other engine modules — pure logic.\n */\n\nimport type { AsciiCell } from '../types';\n\n// ─── Offscreen canvas ─────────────────────────────────────────────\n\nexport function createOffscreenCanvas(width: number, height: number): {\n canvas: HTMLCanvasElement | OffscreenCanvas;\n ctx: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D;\n} {\n const canvas = document.createElement('canvas');\n canvas.width = width;\n canvas.height = height;\n const ctx = canvas.getContext('2d', { willReadFrequently: true })!;\n return { canvas, ctx };\n}\n\n// ─── Luminance helpers ────────────────────────────────────────────\n\nexport function adjustLuminance(lum: number, brightness: number, contrast: number): number {\n let adjusted = lum + brightness * 255;\n const factor = (259 * (contrast * 255 + 255)) / (255 * (259 - contrast * 255));\n adjusted = factor * (adjusted - 128) + 128;\n return Math.max(0, Math.min(255, adjusted));\n}\n\nexport function luminanceToChar(lum: number, charset: string, invert: boolean): string {\n const normalized = invert ? 1 - lum / 255 : lum / 255;\n const chars = [...charset]; // Unicode-aware split (handles surrogate pairs / emoji)\n const index = Math.floor(normalized * (chars.length - 1));\n return chars[Math.max(0, Math.min(chars.length - 1, index))];\n}\n\nexport function customTextToChar(\n lum: number, text: string, x: number, y: number, cols: number, invert: boolean\n): string {\n const normalized = invert ? 1 - lum / 255 : lum / 255;\n if (normalized < 0.12) return ' ';\n const chars = [...text];\n const pos = y * cols + x;\n return chars[pos % chars.length];\n}\n\n// ─── Dithering ────────────────────────────────────────────────────\n\nconst BAYER_4X4 = [\n [ 0, 8, 2,10],\n [12, 4,14, 6],\n [ 3,11, 1, 9],\n [15, 7,13, 5],\n] as const;\n\nexport function applyDither(lum: number, x: number, y: number, strength: number): number {\n if (strength <= 0) return lum;\n const threshold = (BAYER_4X4[y % 4][x % 4] / 16 - 0.5) * strength * 128;\n return Math.max(0, Math.min(255, lum + threshold));\n}\n\n// ─── Pre-computed Color LUTs ──────────────────────────────────────\n\nexport const GRAY_LUT: string[] = new Array(256);\nexport const GREEN_LUT: string[] = new Array(256);\nfor (let _i = 0; _i < 256; _i++) {\n GRAY_LUT[_i] = `rgb(${_i},${_i},${_i})`;\n GREEN_LUT[_i] = `rgb(0,${_i},0)`;\n}\n\n// ─── Cell color resolution ────────────────────────────────────────\n\nexport function getCellColorStr(\n cell: AsciiCell, colorMode: string, acR: number, acG: number, acB: number\n): string {\n switch (colorMode) {\n case 'fullcolor':\n return `rgb(${cell.r},${cell.g},${cell.b})`;\n case 'matrix':\n return GREEN_LUT[(0.299 * cell.r + 0.587 * cell.g + 0.114 * cell.b) | 0];\n case 'accent': {\n const ab = (0.299 * cell.r + 0.587 * cell.g + 0.114 * cell.b) / 255;\n return `rgb(${(acR * ab) | 0},${(acG * ab) | 0},${(acB * ab) | 0})`;\n }\n default:\n return GRAY_LUT[(0.299 * cell.r + 0.587 * cell.g + 0.114 * cell.b) | 0];\n }\n}\n\nconst _colorRGB = [0, 0, 0];\nexport function getCellColorRGB(\n cell: AsciiCell, colorMode: string, acR: number, acG: number, acB: number\n): number[] {\n switch (colorMode) {\n case 'fullcolor':\n _colorRGB[0] = cell.r; _colorRGB[1] = cell.g; _colorRGB[2] = cell.b;\n break;\n case 'matrix': {\n const mb = (0.299 * cell.r + 0.587 * cell.g + 0.114 * cell.b) | 0;\n _colorRGB[0] = 0; _colorRGB[1] = mb; _colorRGB[2] = 0;\n break;\n }\n case 'accent': {\n const ab = (0.299 * cell.r + 0.587 * cell.g + 0.114 * cell.b) / 255;\n _colorRGB[0] = (acR * ab) | 0; _colorRGB[1] = (acG * ab) | 0; _colorRGB[2] = (acB * ab) | 0;\n break;\n }\n default: {\n const gray = (0.299 * cell.r + 0.587 * cell.g + 0.114 * cell.b) | 0;\n _colorRGB[0] = gray; _colorRGB[1] = gray; _colorRGB[2] = gray;\n break;\n }\n }\n return _colorRGB;\n}\n\n// ─── Glow sprite cache ────────────────────────────────────────────\n\nlet _glowCache: { canvas: HTMLCanvasElement; size: number; r: number; g: number; b: number } | null = null;\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nexport function getGlowSprite(radius: number, r: number, g: number, b: number): HTMLCanvasElement {\n const size = Math.ceil(radius / 4) * 4;\n if (_glowCache && _glowCache.size === size && _glowCache.r === r && _glowCache.g === g && _glowCache.b === b) {\n return _glowCache.canvas;\n }\n const dim = size * 2;\n const canvas = document.createElement('canvas');\n canvas.width = dim;\n canvas.height = dim;\n const gCtx = canvas.getContext('2d')!;\n const gradient = gCtx.createRadialGradient(size, size, 0, size, size, size);\n gradient.addColorStop(0, `rgba(${r},${g},${b},1)`);\n gradient.addColorStop(0.4, `rgba(${r},${g},${b},0.4)`);\n gradient.addColorStop(1, `rgba(${r},${g},${b},0)`);\n gCtx.fillStyle = gradient;\n gCtx.fillRect(0, 0, dim, dim);\n _glowCache = { canvas, size, r, g, b };\n return canvas;\n}\n","/**\n * Animation multiplier and hover effect computations.\n */\n\nimport type { AnimationStyle } from '../types';\nimport type { HoverEffect } from '../types';\n\nexport function smoothstep(t: number): number {\n return t * t * (3 - 2 * t);\n}\n\nexport function getAnimationMultiplier(\n x: number,\n y: number,\n cols: number,\n rows: number,\n time: number,\n style: AnimationStyle,\n speed: number\n): number {\n if (style === 'none') return 1;\n\n const t = time * speed;\n\n switch (style) {\n case 'wave': {\n const wave = Math.sin((x / cols) * Math.PI * 4 + t * 3) * 0.5 + 0.5;\n const wave2 = Math.sin((y / rows) * Math.PI * 3 + t * 2) * 0.5 + 0.5;\n return 0.3 + 0.7 * (wave * 0.6 + wave2 * 0.4);\n }\n case 'pulse': {\n const cx = cols / 2;\n const cy = rows / 2;\n const dist = Math.sqrt((x - cx) ** 2 + (y - cy) ** 2);\n const maxDist = Math.sqrt(cx ** 2 + cy ** 2);\n const ring = Math.sin(dist / maxDist * Math.PI * 6 - t * 4) * 0.5 + 0.5;\n return 0.2 + 0.8 * ring;\n }\n case 'rain': {\n const drop = Math.sin(y / rows * Math.PI * 8 - t * 5 + x * 0.3) * 0.5 + 0.5;\n const fade = Math.sin(x / cols * Math.PI * 2 + t) * 0.3 + 0.7;\n return 0.1 + 0.9 * drop * fade;\n }\n case 'breathe': {\n const breathe = Math.sin(t * 2) * 0.3 + 0.7;\n const subtle = Math.sin((x + y) * 0.1 + t) * 0.1;\n return Math.max(0.1, Math.min(1, breathe + subtle));\n }\n case 'sparkle': {\n const hash = Math.sin(x * 127.1 + y * 311.7 + Math.floor(t * 8) * 43758.5453) * 43758.5453;\n const sparkle = (hash - Math.floor(hash));\n return sparkle > 0.7 ? 1 : 0.15 + sparkle * 0.4;\n }\n case 'glitch': {\n const band = Math.floor(y / (rows * 0.05));\n const glitchHash = Math.sin(band * 43.23 + Math.floor(t * 6) * 17.89) * 43758.5453;\n const glitchVal = glitchHash - Math.floor(glitchHash);\n if (glitchVal > 0.85) {\n const flicker = Math.sin(t * 30 + band) * 0.5 + 0.5;\n return flicker < 0.3 ? 0 : flicker;\n }\n return 1;\n }\n case 'spiral': {\n const cx = cols / 2;\n const cy = rows / 2;\n const dx = x - cx;\n const dy = y - cy;\n const angle = Math.atan2(dy, dx);\n const dist = Math.sqrt(dx * dx + dy * dy);\n const maxDist = Math.sqrt(cx * cx + cy * cy);\n const spiral = Math.sin(angle * 3 + dist / maxDist * Math.PI * 8 - t * 3) * 0.5 + 0.5;\n return 0.15 + 0.85 * spiral;\n }\n case 'typewriter': {\n const totalCells = cols * rows;\n const cellIndex = y * cols + x;\n const progress = ((t * 0.5) % 1);\n const revealPoint = progress * totalCells * 1.3;\n const dist = cellIndex - revealPoint;\n if (dist > 0) return 0;\n const fade = Math.max(0, 1 + dist / (totalCells * 0.15));\n return Math.min(1, fade);\n }\n case 'scatter': {\n const scx = cols / 2;\n const scy = rows / 2;\n const sdx = x - scx;\n const sdy = y - scy;\n const sdist = Math.sqrt(sdx * sdx + sdy * sdy) / Math.sqrt(scx * scx + scy * scy);\n const phase = Math.sin(t * 1.5) * 0.5 + 0.5;\n const threshold = phase;\n if (sdist > threshold) {\n return Math.max(0, 1 - (sdist - threshold) * 3);\n }\n return 0.7 + 0.3 * Math.sin(sdist * 10 - t * 2);\n }\n case 'waveField':\n // waveField is handled as a full short-circuit in renderFrameToCanvas\n return 1;\n case 'ripple': {\n // Ripples emanate from the center outward over time.\n const cx2 = cols / 2;\n const cy2 = rows / 2;\n const dx2 = x - cx2;\n const dy2 = y - cy2;\n const dist2 = Math.sqrt(dx2 * dx2 + dy2 * dy2);\n const maxDist2 = Math.sqrt(cx2 * cx2 + cy2 * cy2);\n const ripple = Math.sin((dist2 / maxDist2) * Math.PI * 10 - t * 5) * 0.5 + 0.5;\n const fadeEdge = 1 - Math.min(1, dist2 / (maxDist2 * 1.1));\n return 0.1 + 0.9 * ripple * (0.4 + fadeEdge * 0.6);\n }\n case 'melt': {\n // Chars droop downward as if melting — lower rows lag behind.\n const lagPhase = (y / rows) * Math.PI;\n const drip = Math.sin(lagPhase - t * 1.8 + x * 0.15) * 0.5 + 0.5;\n const gravity = Math.max(0, (y / rows - 0.1)) / 0.9;\n return 0.05 + 0.95 * (drip * (1 - gravity * 0.6));\n }\n case 'orbit': {\n // Each cell rotates around the center at a speed proportional to radius.\n const ocx = cols / 2;\n const ocy = rows / 2;\n const odx = x - ocx;\n const ody = y - ocy;\n const oAngle = Math.atan2(ody, odx);\n const oDist = Math.sqrt(odx * odx + ody * ody) / Math.sqrt(ocx * ocx + ocy * ocy);\n const orbit = Math.sin(oAngle * 2 + oDist * 6 - t * 2.5) * 0.5 + 0.5;\n return 0.1 + 0.9 * orbit;\n }\n case 'cellular': {\n // Conway-ish: cell \"lives\" based on a hash of its neighbours at a quantised time.\n const tick = Math.floor(t * 4);\n const alive = (cx: number, cy: number): number => {\n const h = Math.sin(cx * 127.1 + cy * 311.7 + tick * 43758.5453) * 43758.5453;\n return h - Math.floor(h) > 0.38 ? 1 : 0;\n };\n const self = alive(x, y);\n const neighbours =\n alive(x - 1, y) + alive(x + 1, y) +\n alive(x, y - 1) + alive(x, y + 1) +\n alive(x - 1, y - 1) + alive(x + 1, y - 1) +\n alive(x - 1, y + 1) + alive(x + 1, y + 1);\n const nextAlive = self === 1\n ? (neighbours === 2 || neighbours === 3 ? 1 : 0)\n : (neighbours === 3 ? 1 : 0);\n return nextAlive === 1 ? 1 : 0.05;\n }\n default:\n return 1;\n }\n}\n\nconst _hoverResult = { scale: 1, offsetX: 0, offsetY: 0, glow: 0, colorBlend: 0, proximity: 0 };\n\nexport function computeHoverEffect(\n nx: number,\n ny: number,\n hoverX: number,\n hoverY: number,\n hoverIntensity: number,\n strength: number,\n cellW: number,\n cellH: number,\n effect: HoverEffect = 'spotlight',\n radiusFactor: number = 0.5\n): typeof _hoverResult {\n const dx = nx - hoverX;\n const dy = ny - hoverY;\n const distSq = dx * dx + dy * dy;\n\n const radius = (0.08 + radiusFactor * 0.35) + strength * 0.04;\n\n if (distSq >= radius * radius) {\n _hoverResult.scale = 1;\n _hoverResult.offsetX = 0;\n _hoverResult.offsetY = 0;\n _hoverResult.glow = 0;\n _hoverResult.colorBlend = 0;\n _hoverResult.proximity = 0;\n return _hoverResult;\n }\n\n const dist = Math.sqrt(distSq);\n const t = 1 - dist / radius;\n const eased = smoothstep(t) * hoverIntensity;\n\n let scale = 1;\n let offsetX = 0;\n let offsetY = 0;\n let glow = 0;\n let colorBlend = 0;\n\n switch (effect) {\n case 'spotlight': {\n scale = 1 + eased * strength * 1.8;\n const angle = Math.atan2(dy, dx);\n const pushForce = eased * eased * strength * 0.6;\n offsetX = Math.cos(angle) * pushForce * cellW;\n offsetY = Math.sin(angle) * pushForce * cellH;\n glow = eased * strength * 0.4;\n colorBlend = eased * eased * strength * 0.25;\n break;\n }\n case 'magnify':\n scale = 1 + eased * strength * 2.5;\n glow = eased * strength * 0.15;\n break;\n case 'repel': {\n scale = 1 + eased * strength * 0.3;\n const angle2 = Math.atan2(dy, dx);\n const push = eased * eased * strength * 1.2;\n offsetX = Math.cos(angle2) * push * cellW;\n offsetY = Math.sin(angle2) * push * cellH;\n break;\n }\n case 'glow':\n glow = eased * strength * 0.8;\n colorBlend = eased * strength * 0.4;\n break;\n case 'colorShift':\n scale = 1 + eased * strength * 0.4;\n glow = eased * strength * 0.2;\n colorBlend = eased * strength * 0.7;\n break;\n case 'attract': {\n // Inverse of repel — chars drift toward the cursor.\n const angle3 = Math.atan2(dy, dx);\n const pull = eased * eased * strength * 1.0;\n // Offset toward cursor (negative direction = toward)\n offsetX = -Math.cos(angle3) * pull * cellW;\n offsetY = -Math.sin(angle3) * pull * cellH;\n glow = eased * strength * 0.3;\n break;\n }\n case 'shatter': {\n // Chars scatter radially outward with jitter, then reform.\n const angle4 = Math.atan2(dy, dx);\n const jitter = Math.sin(dx * 43.7 + dy * 29.3) * 0.5;\n const scatter = eased * strength * 1.4 * (0.7 + jitter * 0.3);\n offsetX = Math.cos(angle4 + jitter) * scatter * cellW;\n offsetY = Math.sin(angle4 + jitter) * scatter * cellH;\n scale = Math.max(0.1, 1 - eased * strength * 0.6);\n glow = eased * strength * 0.25;\n break;\n }\n case 'trail': {\n // Leaves a fading colour ghost: increase colorBlend and glow strongly within radius.\n colorBlend = eased * strength * 0.9;\n glow = eased * strength * 0.6;\n scale = 1 + eased * strength * 0.15;\n break;\n }\n }\n\n _hoverResult.scale = scale;\n _hoverResult.offsetX = offsetX;\n _hoverResult.offsetY = offsetY;\n _hoverResult.glow = glow;\n _hoverResult.colorBlend = colorBlend;\n _hoverResult.proximity = eased;\n return _hoverResult;\n}\n","/**\n * Shared utilities for all background renderers:\n * - CSS color parser\n * - Value noise helpers (fade, lerp, hash2, vnoise, fbm)\n */\n\n// ─── Color parser ─────────────────────────────────────────────────\n\n/** Parse a hex or rgb CSS colour string into { r, g, b }. Returns null on failure. */\nexport function parseColor(c: string): { r: number; g: number; b: number } | null {\n const hex = c.match(/^#([0-9a-f]{3,8})$/i)?.[1];\n if (hex) {\n const h = hex.length <= 4\n ? hex.split('').map(x => parseInt(x + x, 16))\n : [parseInt(hex.slice(0,2),16), parseInt(hex.slice(2,4),16), parseInt(hex.slice(4,6),16)];\n return { r: h[0], g: h[1], b: h[2] };\n }\n const rgb = c.match(/rgba?\\(\\s*(\\d+)[,\\s]+(\\d+)[,\\s]+(\\d+)/i);\n if (rgb) return { r: +rgb[1], g: +rgb[2], b: +rgb[3] };\n return null;\n}\n\n// ─── Value-noise helpers ──────────────────────────────────────────\n\nexport function fade(t: number): number { return t * t * t * (t * (t * 6 - 15) + 10); }\nexport function lerp(a: number, b: number, t: number): number { return a + (b - a) * t; }\n\n/** Fast 2-D hash → pseudo-random gradient value between -1 and 1 */\nexport function hash2(ix: number, iy: number): number {\n let n = ix * 127 + iy * 311;\n n = ((n >> 13) ^ n);\n return ((n * (n * n * 15731 + 789221) + 1376312589) & 0x7fffffff) / 0x7fffffff;\n}\n\n/** Single octave value noise */\nexport function vnoise(x: number, y: number): number {\n const ix = Math.floor(x), iy = Math.floor(y);\n const fx = x - ix, fy = y - iy;\n const ux = fade(fx), uy = fade(fy);\n const v00 = hash2(ix, iy );\n const v10 = hash2(ix + 1, iy );\n const v01 = hash2(ix, iy + 1);\n const v11 = hash2(ix + 1, iy + 1);\n return lerp(lerp(v00, v10, ux), lerp(v01, v11, ux), uy); // -1..1\n}\n\n/** 3-octave FBM (fractal Brownian motion) */\nexport function fbm(x: number, y: number): number {\n return (\n vnoise(x, y ) * 0.500 +\n vnoise(x * 2.1, y * 2.1) * 0.250 +\n vnoise(x * 4.3, y * 4.3) * 0.125\n ) / 0.875;\n}\n","/**\n * renderWaveBackground — interactive ASCII wave field with vortex, sparkles,\n * breathe pulse, and cursor proximity spotlight.\n */\nimport { hash2, fbm } from './_shared';\n\nexport interface WaveBackgroundOptions {\n /** Font size in CSS pixels (default: 13) */\n fontSize?: number;\n /** Character aspect ratio width/height (default: 0.62) */\n charAspect?: number;\n /** Line height multiplier (default: 1.4) */\n lineHeightRatio?: number;\n /** Character set from dark→bright (default: ' .:-=+*#%@') */\n chars?: string;\n /** Base colour — use '{a}' as alpha placeholder */\n baseColor?: string;\n /** Accent colour applied near the cursor and on wave peaks (default: '#d4ff00') */\n accentColor?: string;\n /** Accent threshold: normalised intensity above which accent kicks in (default: 0.52) */\n accentThreshold?: number;\n /** How strongly the mouse influences local intensity (default: 0.55) */\n mouseInfluence?: number;\n /** Radial falloff for mouse influence (default: 2.8) */\n mouseFalloff?: number;\n /** Base wave animation speed (default: 1) */\n speed?: number;\n /** Enable vortex swirl effect around cursor (default: true) */\n vortex?: boolean;\n /** Enable sparkle / pop flicker (default: true) */\n sparkles?: boolean;\n /** Enable a slow global breathe pulse (default: true) */\n breathe?: boolean;\n /** Light mode: swap fill colours to dark-on-light (default: false) */\n lightMode?: boolean;\n}\n\nexport function renderWaveBackground(\n ctx: CanvasRenderingContext2D,\n width: number,\n height: number,\n time: number,\n mousePos: { x: number; y: number } = { x: 0.5, y: 0.5 },\n options: WaveBackgroundOptions = {},\n): void {\n const {\n fontSize = 13,\n charAspect = 0.62,\n lineHeightRatio = 1.4,\n chars = ' .:-=+*#%@',\n baseColor = null as string | null,\n accentColor = undefined as string | undefined,\n accentThreshold = 0.52,\n mouseInfluence = 0.55,\n mouseFalloff = 2.8,\n speed = 1,\n vortex = true,\n sparkles = true,\n breathe = true,\n lightMode = false,\n } = options;\n const resolvedAccent = accentColor ?? (lightMode ? '#6b8700' : '#d4ff00');\n\n const charW = fontSize * charAspect;\n const lineH = fontSize * lineHeightRatio;\n const cols = Math.ceil(width / charW);\n const rows = Math.ceil(height / lineH);\n const mx = mousePos.x;\n const my = mousePos.y;\n\n let acR = 212, acG = 255, acB = 0;\n {\n const hex = resolvedAccent.replace('#', '');\n if (hex.length === 6) {\n acR = parseInt(hex.slice(0, 2), 16);\n acG = parseInt(hex.slice(2, 4), 16);\n acB = parseInt(hex.slice(4, 6), 16);\n }\n }\n\n ctx.clearRect(0, 0, width, height);\n ctx.font = `${fontSize}px \"JetBrains Mono\", monospace`;\n ctx.textBaseline = 'top';\n\n const t = time * speed;\n const breatheAmp = breathe ? (Math.sin(t * 0.22) * 0.5 + 0.5) * 0.12 : 0;\n\n for (let row = 0; row < rows; row++) {\n for (let col = 0; col < cols; col++) {\n const nx = col / cols;\n const ny = row / rows;\n\n const w1 = Math.sin(col * 0.08 + row * 0.05 + t * 0.60) * 0.5 + 0.5;\n const w2 = Math.sin(col * 0.03 - row * 0.07 + t * 0.40) * 0.5 + 0.5;\n const w3 = Math.sin(col * 0.05 + row * 0.03 + t * 0.80) * 0.5 + 0.5;\n const sinePart = (w1 + w2 + w3) / 3;\n\n const noiseScale = 0.045;\n const noiseShift = t * 0.08;\n const noisePart = (fbm(col * noiseScale + noiseShift, row * noiseScale * 1.4 - noiseShift * 0.7) * 0.5 + 0.5);\n\n const driftFreq = 0.06;\n const driftPart = Math.sin((col + row * 0.65) * driftFreq + t * 1.1) * 0.5 + 0.5;\n\n const wavePart = sinePart * 0.45 + noisePart * 0.35 + driftPart * 0.20 + breatheAmp;\n\n const dxRaw = nx - mx;\n const dyRaw = ny - my;\n const distRaw = Math.sqrt(dxRaw * dxRaw + dyRaw * dyRaw);\n let vortexBump = 0;\n if (vortex && distRaw < 0.35) {\n const angle = Math.atan2(dyRaw, dxRaw);\n const swirl = Math.sin(angle * 4 + t * 2.2 - distRaw * 14);\n const falloff = Math.max(0, 1 - distRaw / 0.35);\n vortexBump = swirl * falloff * falloff * 0.22;\n }\n\n const proximity = Math.max(0, 1 - distRaw * mouseFalloff);\n const intensity = (\n wavePart * (1 - mouseInfluence) +\n (proximity + vortexBump * 0.5) * mouseInfluence\n ) + vortexBump * 0.15;\n const clamped = Math.min(1, Math.max(0, intensity));\n\n let finalIntensity = clamped;\n if (sparkles && clamped > 0.72) {\n const bucket = Math.floor(t * 8);\n const sparkleSeed = hash2(col * 7 + bucket * 3, row * 11 + bucket);\n if (sparkleSeed > 0.88) {\n finalIntensity = Math.min(1, clamped + (sparkleSeed - 0.88) * 4);\n }\n }\n\n const charIdx = Math.floor(finalIntensity * (chars.length - 1));\n if (chars[charIdx] === ' ') continue;\n\n const alpha = 0.015 + finalIntensity * 0.07;\n const isAccent = finalIntensity > accentThreshold;\n\n if (isAccent) {\n const accentAlpha = Math.min(lightMode ? 0.90 : 0.28, alpha * (lightMode ? 14 : 2.8));\n ctx.fillStyle = `rgba(${acR},${acG},${acB},${accentAlpha})`;\n } else if (baseColor) {\n ctx.fillStyle = baseColor.replace('{a}', String(alpha));\n } else if (lightMode) {\n ctx.fillStyle = `rgba(0,0,0,${alpha * 7})`;\n } else {\n ctx.fillStyle = `rgba(255,255,255,${alpha})`;\n }\n\n ctx.fillText(chars[charIdx], col * charW, row * lineH);\n }\n }\n}\n","/**\n * Core frame-to-canvas renderer and source-to-frame converters.\n */\n\nimport type { AsciiOptions, AsciiCell, AsciiFrame } from '../types';\nimport { DEFAULT_OPTIONS } from '../types';\nimport { parseGIF, decompressFrames } from 'gifuct-js';\nimport {\n createOffscreenCanvas,\n adjustLuminance,\n luminanceToChar,\n customTextToChar,\n applyDither,\n getCellColorStr,\n getCellColorRGB,\n} from './utils';\nimport { getAnimationMultiplier, computeHoverEffect } from './animation';\nimport { renderWaveBackground } from '../backgrounds/wave';\n\n// Re-export AsciiFrame for downstream consumers that import from this module\nexport type { AsciiFrame };\nvoid DEFAULT_OPTIONS; // keep import alive for tree-shaking hint\n\n/**\n * Convert an image element or canvas to a single ASCII frame.\n */\nexport function imageToAsciiFrame(\n source: HTMLImageElement | HTMLVideoElement | HTMLCanvasElement,\n options: AsciiOptions,\n targetWidth?: number,\n targetHeight?: number\n): { frame: AsciiFrame; cols: number; rows: number } {\n const srcWidth = source instanceof HTMLVideoElement ? source.videoWidth : source.width;\n const srcHeight = source instanceof HTMLVideoElement ? source.videoHeight : source.height;\n\n if (srcWidth === 0 || srcHeight === 0) {\n return { frame: [], cols: 0, rows: 0 };\n }\n\n const charAspect = 0.55;\n const cellW = options.fontSize * options.charSpacing;\n const cellH = options.fontSize / charAspect * options.charSpacing;\n\n const renderW = targetWidth || srcWidth;\n const renderH = targetHeight || srcHeight;\n const cols = Math.floor(renderW / cellW);\n const rows = Math.floor(renderH / cellH);\n\n if (cols <= 0 || rows <= 0) {\n return { frame: [], cols: 0, rows: 0 };\n }\n\n const { ctx } = createOffscreenCanvas(cols, rows);\n ctx.drawImage(source, 0, 0, cols, rows);\n const imageData = ctx.getImageData(0, 0, cols, rows);\n const pixels = imageData.data;\n\n const frame: AsciiFrame = [];\n\n for (let y = 0; y < rows; y++) {\n const row: AsciiCell[] = [];\n for (let x = 0; x < cols; x++) {\n const i = (y * cols + x) * 4;\n const r = pixels[i];\n const g = pixels[i + 1];\n const b = pixels[i + 2];\n const a = pixels[i + 3];\n\n const lum = 0.299 * r + 0.587 * g + 0.114 * b;\n const adjustedLum = adjustLuminance(lum, options.brightness, options.contrast);\n const ditheredLum = applyDither(adjustedLum, x, y, options.ditherStrength);\n const char = options.customText\n ? customTextToChar(ditheredLum, options.customText, x, y, cols, options.invert)\n : luminanceToChar(ditheredLum, options.charset, options.invert);\n\n row.push({ char, r, g, b, a });\n }\n frame.push(row);\n }\n\n return { frame, cols, rows };\n}\n\n/**\n * Extract frames from a video element for ASCII animation.\n */\nexport async function videoToAsciiFrames(\n video: HTMLVideoElement,\n options: AsciiOptions,\n targetWidth: number,\n targetHeight: number,\n targetFps: number = 12,\n maxDuration: number = 10,\n onProgress?: (progress: number) => void\n): Promise<{ frames: AsciiFrame[]; cols: number; rows: number; fps: number }> {\n const duration = Math.min(video.duration, maxDuration);\n const totalFrames = Math.ceil(duration * targetFps);\n const frames: AsciiFrame[] = [];\n let cols = 0;\n let rows = 0;\n\n for (let i = 0; i < totalFrames; i++) {\n const time = (i / targetFps);\n if (time > duration) break;\n\n video.currentTime = time;\n await new Promise<void>((resolve) => {\n const handler = () => {\n video.removeEventListener('seeked', handler);\n resolve();\n };\n video.addEventListener('seeked', handler);\n });\n\n const result = imageToAsciiFrame(video, options, targetWidth, targetHeight);\n frames.push(result.frame);\n cols = result.cols;\n rows = result.rows;\n\n onProgress?.((i + 1) / totalFrames);\n }\n\n return { frames, cols, rows, fps: targetFps };\n}\n\n/**\n * Extract frames from an animated GIF file buffer.\n */\nexport async function gifToAsciiFrames(\n buffer: ArrayBuffer,\n options: AsciiOptions,\n targetWidth: number,\n targetHeight: number,\n onProgress?: (progress: number) => void\n): Promise<{ frames: AsciiFrame[]; cols: number; rows: number; fps: number }> {\n const gif = parseGIF(buffer);\n const rawFrames = decompressFrames(gif, true);\n\n if (rawFrames.length === 0) {\n return { frames: [], cols: 0, rows: 0, fps: 10 };\n }\n\n const gifW = rawFrames[0].dims.width;\n const gifH = rawFrames[0].dims.height;\n const logicalW = gif.lsd?.width || gifW;\n const logicalH = gif.lsd?.height || gifH;\n\n const compCanvas = document.createElement('canvas');\n compCanvas.width = logicalW;\n compCanvas.height = logicalH;\n const compCtx = compCanvas.getContext('2d')!;\n\n const prevCanvas = document.createElement('canvas');\n prevCanvas.width = logicalW;\n prevCanvas.height = logicalH;\n const prevCtx = prevCanvas.getContext('2d')!;\n\n const frames: AsciiFrame[] = [];\n let cols = 0;\n let rows = 0;\n\n let totalDelay = 0;\n for (const f of rawFrames) { totalDelay += (f.delay || 100); }\n const avgDelay = totalDelay / rawFrames.length;\n const fps = Math.round(Math.min(30, Math.max(5, 1000 / avgDelay)));\n\n const maxFrames = Math.min(rawFrames.length, 300);\n\n for (let i = 0; i < maxFrames; i++) {\n const f = rawFrames[i];\n const { dims, patch, disposalType } = f;\n\n if (disposalType === 3) {\n prevCtx.clearRect(0, 0, logicalW, logicalH);\n prevCtx.drawImage(compCanvas, 0, 0);\n }\n\n const frameImageData = new ImageData(new Uint8ClampedArray(patch.buffer), dims.width, dims.height);\n const tempCanvas = document.createElement('canvas');\n tempCanvas.width = dims.width;\n tempCanvas.height = dims.height;\n const tempCtx = tempCanvas.getContext('2d')!;\n tempCtx.putImageData(frameImageData, 0, 0);\n\n compCtx.drawImage(tempCanvas, dims.left || 0, dims.top || 0);\n\n const result = imageToAsciiFrame(compCanvas, options, targetWidth, targetHeight);\n frames.push(result.frame);\n cols = result.cols;\n rows = result.rows;\n\n if (disposalType === 2) {\n compCtx.clearRect(dims.left || 0, dims.top || 0, dims.width, dims.height);\n } else if (disposalType === 3) {\n compCtx.clearRect(0, 0, logicalW, logicalH);\n compCtx.drawImage(prevCanvas, 0, 0);\n }\n\n onProgress?.((i + 1) / maxFrames);\n }\n\n return { frames, cols, rows, fps };\n}\n\n/**\n * Render an ASCII frame to a canvas context.\n * Supports both ASCII text mode and Dots mode.\n */\nexport function renderFrameToCanvas(\n ctx: CanvasRenderingContext2D,\n frame: AsciiFrame,\n options: AsciiOptions,\n canvasWidth: number,\n canvasHeight: number,\n time: number = 0,\n hoverPos?: { x: number; y: number; intensity?: number } | null\n) {\n // waveField short-circuit\n if (options.animationStyle === 'waveField') {\n const mouseNorm = hoverPos ? { x: hoverPos.x, y: hoverPos.y } : { x: 0.5, y: 0.5 };\n const acHexWF = (options.accentColor || '#d4ff00').replace('#', '');\n renderWaveBackground(ctx, canvasWidth, canvasHeight, time, mouseNorm, {\n accentColor: `#${acHexWF}`,\n accentThreshold: 0.52,\n mouseInfluence: options.hoverStrength > 0 ? Math.min(1, 0.3 + options.hoverStrength * 0.5) : 0.55,\n mouseFalloff: 2.8,\n speed: options.animationSpeed,\n vortex: options.hoverStrength > 0,\n sparkles: true,\n breathe: true,\n });\n return;\n }\n\n const rows = frame.length;\n if (rows === 0) return;\n const cols = frame[0].length;\n\n ctx.clearRect(0, 0, canvasWidth, canvasHeight);\n\n let hasTransparency = false;\n const sampleStepY = Math.max(1, rows >> 2);\n const sampleStepX = Math.max(1, cols >> 2);\n outer:\n for (let sampleY = 0; sampleY < rows; sampleY += sampleStepY) {\n const row = frame[sampleY];\n for (let sampleX = 0; sampleX < cols; sampleX += sampleStepX) {\n if (row[sampleX].a < 200) { hasTransparency = true; break outer; }\n }\n }\n\n if (!hasTransparency) {\n ctx.fillStyle = '#0a0a0a';\n ctx.fillRect(0, 0, canvasWidth, canvasHeight);\n }\n\n const cellW = canvasWidth / cols;\n const cellH = canvasHeight / rows;\n const totalCells = rows * cols;\n\n const hoverIntensity = hoverPos?.intensity ?? 1;\n const animationActive = options.animationStyle !== 'none';\n const suppressHover = animationActive && totalCells > 5_000;\n const hoverActive = !suppressHover && !!(hoverPos && options.hoverStrength > 0 && hoverIntensity > 0.005);\n\n const hc = options.hoverColor || '#ffffff';\n const hcR = parseInt(hc.slice(1, 3), 16) || 255;\n const hcG = parseInt(hc.slice(3, 5), 16) || 255;\n const hcB = parseInt(hc.slice(5, 7), 16) || 255;\n\n const acHex = (options.accentColor || '#ffffff').replace('#', '');\n const acR = parseInt(acHex.substring(0, 2), 16) || 255;\n const acG = parseInt(acHex.substring(2, 4), 16) || 255;\n const acB = parseInt(acHex.substring(4, 6), 16) || 255;\n\n const radiusScale = totalCells > 30_000 ? 0.25\n : totalCells > 15_000 ? 0.4\n : totalCells > 5_000 ? 0.6\n : 1;\n const effectiveHoverRadius = options.hoverRadius * radiusScale;\n\n let hoverMinCol = 0, hoverMaxCol = cols, hoverMinRow = 0, hoverMaxRow = rows;\n let hoverPosX = 0, hoverPosY = 0;\n if (hoverActive && hoverPos) {\n hoverPosX = hoverPos.x;\n hoverPosY = hoverPos.y;\n const hoverNormRadius = (0.08 + effectiveHoverRadius * 0.35) + options.hoverStrength * 0.04;\n hoverMinCol = Math.max(0, Math.floor((hoverPosX - hoverNormRadius) * cols) - 1);\n hoverMaxCol = Math.min(cols, Math.ceil((hoverPosX + hoverNormRadius) * cols) + 1);\n hoverMinRow = Math.max(0, Math.floor((hoverPosY - hoverNormRadius) * rows) - 1);\n hoverMaxRow = Math.min(rows, Math.ceil((hoverPosY + hoverNormRadius) * rows) + 1);\n }\n\n const animStyle = options.animationStyle;\n const animSpeed = options.animationSpeed;\n const noAnimation = animStyle === 'none';\n const hoverStrength = options.hoverStrength;\n const hoverEffect = options.hoverEffect;\n const hoverRadiusFactor = effectiveHoverRadius;\n const isInverted = options.invert;\n const colorMode = options.colorMode;\n const TWO_PI = Math.PI * 2;\n const invCols = 1 / cols;\n const invRows = 1 / rows;\n\n let lastFillStyle = '';\n let lastAlpha = -1;\n\n if (options.renderMode === 'dots') {\n const maxRadius = Math.min(cellW, cellH) * 0.5 * options.dotSizeRatio;\n\n for (let y = 0; y < rows; y++) {\n const rowData = frame[y];\n for (let x = 0; x < cols; x++) {\n const cell = rowData[x];\n if (cell.a < 10) continue;\n\n const lum = (0.299 * cell.r + 0.587 * cell.g + 0.114 * cell.b) * 0.00392156863;\n const intensity = isInverted ? 1 - lum : lum;\n if (intensity < 0.02) continue;\n\n const animMul = noAnimation ? 1\n : getAnimationMultiplier(x, y, cols, rows, time, animStyle, animSpeed);\n\n let hoverMul = 1;\n let hoverOffX = 0;\n let hoverOffY = 0;\n let hoverGlow = 0;\n let hoverBlend = 0;\n\n if (hoverActive && x >= hoverMinCol && x <= hoverMaxCol && y >= hoverMinRow && y <= hoverMaxRow) {\n const fx = computeHoverEffect(\n x * invCols, y * invRows, hoverPosX, hoverPosY, hoverIntensity,\n hoverStrength, cellW, cellH, hoverEffect, hoverRadiusFactor\n );\n hoverMul = fx.scale;\n hoverOffX = fx.offsetX;\n hoverOffY = fx.offsetY;\n hoverGlow = fx.glow;\n hoverBlend = fx.colorBlend;\n }\n\n const radius = maxRadius * intensity * animMul * hoverMul;\n if (radius < 0.3) continue;\n\n const px = x * cellW + cellW * 0.5 + hoverOffX;\n const py = y * cellH + cellH * 0.5 + hoverOffY;\n\n let color: string;\n if (hoverBlend > 0) {\n const rgb = getCellColorRGB(cell, colorMode, acR, acG, acB);\n const cr = Math.min(255, (rgb[0] + (hcR - rgb[0]) * hoverBlend) | 0);\n const cg = Math.min(255, (rgb[1] + (hcG - rgb[1]) * hoverBlend) | 0);\n const cb = Math.min(255, (rgb[2] + (hcB - rgb[2]) * hoverBlend) | 0);\n color = `rgb(${cr},${cg},${cb})`;\n } else {\n color = getCellColorStr(cell, colorMode, acR, acG, acB);\n }\n\n const alpha = Math.min(1, (cell.a * 0.00392156863) * animMul * (1 + hoverGlow));\n\n if (alpha !== lastAlpha) { ctx.globalAlpha = alpha; lastAlpha = alpha; }\n if (color !== lastFillStyle) { ctx.fillStyle = color; lastFillStyle = color; }\n\n if (radius <= 3) {\n const d = radius * 2;\n ctx.fillRect(px - radius, py - radius, d, d);\n } else {\n ctx.beginPath();\n ctx.arc(px, py, radius, 0, TWO_PI);\n ctx.fill();\n }\n }\n }\n } else {\n const charAspect = 0.55;\n const fontSize = Math.min(cellW / charAspect, cellH) * 0.9;\n const useFastRect = fontSize < 6;\n\n if (!useFastRect) {\n const isEmoji = options.artStyle === 'emoji';\n ctx.font = isEmoji\n ? `${fontSize}px \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Noto Color Emoji\", \"Twemoji Mozilla\", sans-serif`\n : `${fontSize}px \"JetBrains Mono\", monospace`;\n ctx.textAlign = 'center';\n ctx.textBaseline = 'middle';\n }\n\n let charWeights: Record<string, number> | null = null;\n if (useFastRect) {\n charWeights = {};\n const csChars = [...options.charset]; // Unicode-aware\n const csLen = csChars.length;\n for (let i = 0; i < csLen; i++) {\n charWeights[csChars[i]] = Math.max(0.1, (i + 0.3) / csLen);\n }\n }\n\n const baseTransform = !useFastRect ? ctx.getTransform() : null;\n\n for (let y = 0; y < rows; y++) {\n const rowData = frame[y];\n for (let x = 0; x < cols; x++) {\n const cell = rowData[x];\n if (cell.char === ' ' || cell.a < 10) continue;\n\n const animMul = noAnimation ? 1\n : getAnimationMultiplier(x, y, cols, rows, time, animStyle, animSpeed);\n if (animMul < 0.05) continue;\n\n let hoverScale = 1;\n let hoverOffX = 0;\n let hoverOffY = 0;\n let hoverGlow = 0;\n let hoverBlend = 0;\n\n if (hoverActive && x >= hoverMinCol && x <= hoverMaxCol && y >= hoverMinRow && y <= hoverMaxRow) {\n const fx = computeHoverEffect(\n x * invCols, y * invRows, hoverPosX, hoverPosY, hoverIntensity,\n hoverStrength, cellW, cellH, hoverEffect, hoverRadiusFactor\n );\n hoverScale = fx.scale;\n hoverOffX = fx.offsetX;\n hoverOffY = fx.offsetY;\n hoverGlow = fx.glow;\n hoverBlend = fx.colorBlend;\n }\n\n const px = x * cellW + cellW * 0.5 + hoverOffX;\n const py = y * cellH + cellH * 0.5 + hoverOffY;\n\n let color: string;\n if (hoverBlend > 0) {\n const rgb = getCellColorRGB(cell, colorMode, acR, acG, acB);\n const cr = Math.min(255, (rgb[0] + (hcR - rgb[0]) * hoverBlend) | 0);\n const cg = Math.min(255, (rgb[1] + (hcG - rgb[1]) * hoverBlend) | 0);\n const cb = Math.min(255, (rgb[2] + (hcB - rgb[2]) * hoverBlend) | 0);\n color = `rgb(${cr},${cg},${cb})`;\n } else {\n color = getCellColorStr(cell, colorMode, acR, acG, acB);\n }\n\n if (useFastRect) {\n const weight = charWeights![cell.char] ?? 0.5;\n const effAlpha = Math.min(1, (cell.a * 0.00392156863) * animMul * (1 + hoverGlow)) * weight;\n if (effAlpha < 0.02) continue;\n if (effAlpha !== lastAlpha) { ctx.globalAlpha = effAlpha; lastAlpha = effAlpha; }\n if (color !== lastFillStyle) { ctx.fillStyle = color; lastFillStyle = color; }\n const rw = cellW * hoverScale;\n const rh = cellH * hoverScale;\n ctx.fillRect(px - rw * 0.5, py - rh * 0.5, rw, rh);\n } else {\n const alpha = Math.min(1, (cell.a * 0.00392156863) * animMul * (1 + hoverGlow));\n if (alpha !== lastAlpha) { ctx.globalAlpha = alpha; lastAlpha = alpha; }\n if (color !== lastFillStyle) { ctx.fillStyle = color; lastFillStyle = color; }\n if (hoverScale !== 1) {\n ctx.translate(px, py);\n ctx.scale(hoverScale, hoverScale);\n ctx.fillText(cell.char, 0, 0);\n ctx.setTransform(baseTransform!);\n } else {\n ctx.fillText(cell.char, px, py);\n }\n }\n }\n }\n }\n\n ctx.globalAlpha = 1;\n}\n","/**\n * Embed code generation — serializes ASCII frames into self-contained\n * HTML snippets that replay via the CDN embed runtime.\n */\n\nimport type { AsciiOptions, AsciiFrame } from '../types';\n\nexport const EMBED_CDN_VERSION = '1.0.17';\n\n/** Compact frame serialiser.\n * fullcolor → 3 bytes/cell (r,g,b); otherwise 1 byte/cell (luma).\n * First byte is a stride marker so the runtime can auto-detect format.\n */\nfunction serializeFrame(frame: AsciiFrame, fullColor: boolean): string {\n const rows = frame.length;\n const cols = rows > 0 ? frame[0].length : 0;\n const stride = fullColor ? 3 : 1;\n const buf = new Uint8Array(1 + rows * cols * stride);\n buf[0] = stride;\n let i = 1;\n for (let y = 0; y < rows; y++) {\n for (let x = 0; x < cols; x++) {\n const cell = frame[y][x];\n if (fullColor) {\n buf[i++] = cell.r;\n buf[i++] = cell.g;\n buf[i++] = cell.b;\n } else {\n buf[i++] = Math.round(0.299 * cell.r + 0.587 * cell.g + 0.114 * cell.b);\n }\n }\n }\n let binary = '';\n for (let j = 0; j < buf.length; j++) binary += String.fromCharCode(buf[j]);\n return btoa(binary);\n}\n\nfunction buildEmbedOpts(\n options: AsciiOptions,\n rows: number,\n cols: number,\n width: number,\n height: number,\n fps?: number,\n animated?: boolean\n): string {\n const o: Record<string, unknown> = {\n r: rows, c: cols, w: width, h: height,\n cs: options.charset,\n cm: options.colorMode,\n as: options.animationStyle,\n sp: options.animationSpeed,\n inv: options.invert,\n hs: options.hoverStrength,\n hr: options.hoverRadius,\n he: options.hoverEffect,\n hc: options.hoverColor,\n dr: options.dotSizeRatio,\n dots: options.renderMode === 'dots',\n };\n if (options.colorMode === 'accent') o.ac = options.accentColor;\n if (fps !== undefined) o.fps = fps;\n if (animated) o.anim = true;\n return JSON.stringify(o);\n}\n\nconst CDN_SCRIPT = `<script src=\"https://cdn.jsdelivr.net/npm/asciify-engine@${EMBED_CDN_VERSION}/dist/embed.js\" async></` + `script>`;\n\n/**\n * Generate a static single-frame embed snippet.\n */\nexport function generateEmbedCode(\n frame: AsciiFrame,\n options: AsciiOptions,\n width: number,\n height: number\n): string {\n const rows = frame.length;\n if (rows === 0) return '';\n const cols = frame[0].length;\n const isFullColor = options.colorMode === 'fullcolor';\n const data = serializeFrame(frame, isFullColor);\n const id = `ar-${Math.random().toString(36).slice(2, 9)}`;\n const opts = buildEmbedOpts(options, rows, cols, width, height);\n\n return `<!-- Asciify Embed -->\n<canvas id=\"${id}\" data-asciify-opts='${opts}' width=\"${width}\" height=\"${height}\"></canvas>\n<script type=\"application/json\" id=\"${id}-d\">\"${data}\"</script>\n${CDN_SCRIPT}\n<!-- /Asciify Embed -->`;\n}\n\n/**\n * Generate an animated multi-frame embed snippet (GIF / video).\n */\nexport function generateAnimatedEmbedCode(\n frames: AsciiFrame[],\n options: AsciiOptions,\n fps: number,\n width: number,\n height: number\n): string {\n if (frames.length === 0) return '';\n const rows = frames[0].length;\n const cols = frames[0][0].length;\n const isFullColor = options.colorMode === 'fullcolor';\n const allData = frames.map(f => serializeFrame(f, isFullColor));\n const id = `ar-${Math.random().toString(36).slice(2, 9)}`;\n const opts = buildEmbedOpts(options, rows, cols, width, height, fps, true);\n\n return `<!-- Asciify Animated Embed -->\n<canvas id=\"${id}\" data-asciify-opts='${opts}' width=\"${width}\" height=\"${height}\"></canvas>\n<script type=\"application/json\" id=\"${id}-d\">${JSON.stringify(allData)}</script>\n${CDN_SCRIPT}\n<!-- /Asciify Animated Embed -->`;\n}\n","/**\n * Simple one-call asciify API.\n * Wraps imageToAsciiFrame + renderFrameToCanvas behind easy-to-use helpers.\n */\n\nimport type { AsciiOptions, ArtStyle } from '../types';\nimport { DEFAULT_OPTIONS, ART_STYLE_PRESETS } from '../types';\nimport { imageToAsciiFrame, videoToAsciiFrames, gifToAsciiFrames, renderFrameToCanvas } from './renderer';\n\nexport { videoToAsciiFrames, gifToAsciiFrames };\n\nexport interface AsciifySimpleOptions {\n /** Character size in pixels. Default: 10 */\n fontSize?: number;\n /** Art style preset. Default: 'classic' */\n style?: ArtStyle;\n /** Extra options to merge on top of the preset */\n options?: Partial<AsciiOptions>;\n}\n\n/**\n * Convert an image/video/canvas element to ASCII art and render it onto a canvas.\n *\n * @example\n * await asciify(document.querySelector('img'), canvas);\n * await asciify(img, canvas, { fontSize: 8, style: 'letters' });\n */\nexport async function asciify(\n source: HTMLImageElement | HTMLVideoElement | HTMLCanvasElement | string,\n canvas: HTMLCanvasElement,\n { fontSize = 10, style = 'classic', options = {} }: AsciifySimpleOptions = {}\n): Promise<void> {\n let el: HTMLImageElement | HTMLVideoElement | HTMLCanvasElement;\n if (typeof source === 'string') {\n const img = new Image();\n img.crossOrigin = 'anonymous';\n await new Promise<void>((resolve, reject) => {\n img.onload = () => resolve();\n img.onerror = () => reject(new Error(`Failed to load image: ${source}`));\n img.src = source;\n });\n el = img;\n } else if (source instanceof HTMLImageElement && !source.complete) {\n await new Promise<void>((resolve, reject) => {\n source.onload = () => resolve();\n source.onerror = () => reject(new Error('Image failed to load'));\n });\n el = source;\n } else {\n el = source;\n }\n\n const preset = ART_STYLE_PRESETS[style];\n const merged: AsciiOptions = { ...DEFAULT_OPTIONS, ...preset, ...options, fontSize };\n\n const ctx = canvas.getContext('2d');\n if (!ctx) throw new Error('Could not get 2d context from canvas');\n\n const { frame } = imageToAsciiFrame(el, merged, canvas.width, canvas.height);\n renderFrameToCanvas(ctx, frame, merged, canvas.width, canvas.height);\n}\n\n/**\n * Fetch a GIF, convert it to ASCII, and start an animation loop on a canvas.\n * Returns a `stop()` function that cancels the loop.\n *\n * @example\n * const stop = await asciifyGif('animation.gif', canvas);\n * // later: stop();\n */\nexport async function asciifyGif(\n source: string | ArrayBuffer,\n canvas: HTMLCanvasElement,\n { fontSize = 10, style = 'classic', options = {} }: AsciifySimpleOptions = {}\n): Promise<() => void> {\n const buffer = typeof source === 'string'\n ? await fetch(source).then(r => r.arrayBuffer())\n : source;\n\n const merged: AsciiOptions = { ...DEFAULT_OPTIONS, ...ART_STYLE_PRESETS[style], ...options, fontSize };\n const ctx = canvas.getContext('2d');\n if (!ctx) throw new Error('Could not get 2d context from canvas');\n\n const { frames, fps } = await gifToAsciiFrames(buffer, merged, canvas.width, canvas.height);\n\n let cancelled = false;\n let animId: number;\n let i = 0;\n let last = performance.now();\n const interval = 1000 / fps;\n\n const tick = (now: number) => {\n if (cancelled) return;\n if (now - last >= interval) {\n renderFrameToCanvas(ctx, frames[i], merged, canvas.width, canvas.height);\n i = (i + 1) % frames.length;\n last = now;\n }\n animId = requestAnimationFrame(tick);\n };\n animId = requestAnimationFrame(tick);\n\n return () => { cancelled = true; cancelAnimationFrame(animId); };\n}\n\n/**\n * Convert a video element to ASCII art and start an animation loop on a canvas.\n * Returns a `stop()` function that cancels the loop.\n *\n * @example\n * const stop = await asciifyVideo(video, canvas);\n * // later: stop();\n */\nexport async function asciifyVideo(\n source: HTMLVideoElement | string,\n canvas: HTMLCanvasElement,\n { fontSize = 10, style = 'classic', options = {} }: AsciifySimpleOptions = {}\n): Promise<() => void> {\n let video: HTMLVideoElement;\n if (typeof source === 'string') {\n video = document.createElement('video');\n video.crossOrigin = 'anonymous';\n video.src = source;\n await new Promise<void>((resolve, reject) => {\n video.onloadeddata = () => resolve();\n video.onerror = () => reject(new Error(`Failed to load video: ${source}`));\n });\n } else {\n video = source;\n }\n\n const merged: AsciiOptions = { ...DEFAULT_OPTIONS, ...ART_STYLE_PRESETS[style], ...options, fontSize };\n const ctx = canvas.getContext('2d');\n if (!ctx) throw new Error('Could not get 2d context from canvas');\n\n const { frames, fps } = await videoToAsciiFrames(video, merged, canvas.width, canvas.height);\n\n let cancelled = false;\n let animId: number;\n let i = 0;\n let last = performance.now();\n const interval = 1000 / fps;\n\n const tick = (now: number) => {\n if (cancelled) return;\n if (now - last >= interval) {\n renderFrameToCanvas(ctx, frames[i], merged, canvas.width, canvas.height);\n i = (i + 1) % frames.length;\n last = now;\n }\n animId = requestAnimationFrame(tick);\n };\n animId = requestAnimationFrame(tick);\n\n return () => { cancelled = true; cancelAnimationFrame(animId); };\n}\n","/**\n * renderRainBackground — digital column rain (Matrix-style).\n */\nimport { parseColor, hash2 } from './_shared';\n\nexport interface RainBackgroundOptions {\n fontSize?: number;\n /** Characters drawn in columns */\n chars?: string;\n /** Head / accent colour (default: '#d4ff00') */\n accentColor?: string;\n /** Custom character colour */\n color?: string;\n /** Global speed multiplier (default: 1) */\n speed?: number;\n /** Fraction of columns active at once 0-1 (default: 0.55) */\n density?: number;\n /** Number of cells in the fading tail (default: 14) */\n tailLength?: number;\n /** Light mode (default: false) */\n lightMode?: boolean;\n}\n\nexport function renderRainBackground(\n ctx: CanvasRenderingContext2D,\n width: number,\n height: number,\n time: number,\n options: RainBackgroundOptions = {},\n): void {\n const {\n fontSize = 13,\n chars = '0123456789ABCDEF@#$&*+=/<>',\n accentColor = undefined as string | undefined,\n color,\n speed = 1,\n density = 0.55,\n tailLength = 14,\n lightMode = false,\n } = options;\n const resolvedAccent = accentColor ?? (lightMode ? '#6b8700' : '#d4ff00');\n\n const charW = fontSize * 0.62;\n const lineH = fontSize * 1.4;\n const cols = Math.ceil(width / charW);\n const rows = Math.ceil(height / lineH);\n\n ctx.clearRect(0, 0, width, height);\n ctx.font = `${fontSize}px monospace`;\n ctx.textBaseline = 'top';\n\n let br = 255, bg = 255, bb = 255;\n if (lightMode) { br = 0; bg = 0; bb = 0; }\n if (color) {\n const p = parseColor(color);\n if (p) { br = p.r; bg = p.g; bb = p.b; }\n }\n\n let acR = 212, acG = 255, acB = 0;\n const ap = parseColor(resolvedAccent);\n if (ap) { acR = ap.r; acG = ap.g; acB = ap.b; }\n\n const period = rows + tailLength;\n\n for (let c = 0; c < cols; c++) {\n if (hash2(c * 17, 3) > density) continue;\n\n const colSpeed = (0.5 + hash2(c * 31, 7) * 1.5) * speed;\n const phase = hash2(c * 13, 11) * period;\n const headRow = Math.floor((time * colSpeed * 7 + phase) % period);\n const x = c * charW;\n\n for (let k = 0; k <= tailLength; k++) {\n const row = headRow - (tailLength - k);\n if (row < 0 || row >= rows) continue;\n\n const y = row * lineH;\n const charSeed = hash2(c * 53 + Math.floor(time * 5 + k), row * 7);\n const ch = chars[Math.floor(charSeed * chars.length)];\n const tRatio = k / tailLength;\n\n if (k === tailLength) {\n ctx.fillStyle = `rgba(${acR},${acG},${acB},${lightMode ? 0.70 : 0.85})`;\n } else {\n const alpha = lightMode ? tRatio * 0.85 : tRatio * 0.15;\n ctx.fillStyle = `rgba(${br},${bg},${bb},${alpha})`;\n }\n ctx.fillText(ch, x, y);\n }\n }\n}\n","/**\n * renderStarsBackground — 3-D star-warp / hyperspace ASCII effect.\n */\nimport { parseColor, hash2 } from './_shared';\n\nexport interface StarsBackgroundOptions {\n fontSize?: number;\n /** Characters used as stars */\n chars?: string;\n /** Accent/trail colour for fast near-edge stars (default: '#d4ff00') */\n accentColor?: string;\n /** Custom base colour */\n color?: string;\n /** Global speed multiplier (default: 1) */\n speed?: number;\n /** Number of star particles (default: 180) */\n count?: number;\n /** Light mode (default: false) */\n lightMode?: boolean;\n}\n\nexport function renderStarsBackground(\n ctx: CanvasRenderingContext2D,\n width: number,\n height: number,\n time: number,\n mousePos: { x: number; y: number } = { x: 0.5, y: 0.5 },\n options: StarsBackgroundOptions = {},\n): void {\n const {\n fontSize = 14,\n chars = ' . · * + ° ★',\n accentColor = undefined as string | undefined,\n color,\n speed = 1,\n count = 180,\n lightMode = false,\n } = options;\n const resolvedAccent = accentColor ?? (lightMode ? '#6b8700' : '#d4ff00');\n\n ctx.clearRect(0, 0, width, height);\n ctx.textBaseline = 'middle';\n ctx.textAlign = 'center';\n\n const cx = width * (0.2 + mousePos.x * 0.6);\n const cy = height * (0.2 + mousePos.y * 0.6);\n const maxR = Math.sqrt(width * width + height * height) * 0.65;\n\n let br = 255, bg = 255, bb = 255;\n if (lightMode) { br = 0; bg = 0; bb = 0; }\n if (color) { const p = parseColor(color); if (p) { br = p.r; bg = p.g; bb = p.b; } }\n\n let acR = 212, acG = 255, acB = 0;\n const ap = parseColor(resolvedAccent);\n if (ap) { acR = ap.r; acG = ap.g; acB = ap.b; }\n\n const charArr = chars.replace(/ /g,'').split('');\n if (charArr.length === 0) return;\n\n for (let i = 0; i < count; i++) {\n const angle = hash2(i * 17, 3) * Math.PI * 2;\n const baseSpd = 0.15 + hash2(i * 31, 7) * 0.85;\n const phase = hash2(i * 13, 11);\n\n const r = ((time * baseSpd * speed * 0.22 + phase) % 1.0);\n\n const x = cx + Math.cos(angle) * r * maxR;\n const y = cy + Math.sin(angle) * r * maxR;\n\n if (x < -20 || x > width + 20 || y < -20 || y > height + 20) continue;\n\n const sz = Math.max(6, fontSize * (0.4 + r * 0.9));\n ctx.font = `${sz}px monospace`;\n\n const charIdx = Math.min(charArr.length - 1, Math.floor(r * charArr.length));\n const ch = charArr[charIdx];\n const isAccent = r > 0.72;\n const alpha = lightMode ? r * 0.85 : r * 0.20;\n\n ctx.fillStyle = isAccent\n ? `rgba(${acR},${acG},${acB},${Math.min(lightMode ? 0.92 : 0.32, alpha * 2.2)})`\n : `rgba(${br},${bg},${bb},${alpha})`;\n\n ctx.fillText(ch, x, y);\n }\n\n ctx.textAlign = 'left';\n}\n","/**\n * renderPulseBackground — concentric ASCII ring pulses emanating from the cursor.\n */\nimport { parseColor } from './_shared';\n\nexport interface PulseBackgroundOptions {\n fontSize?: number;\n /** Characters to tile (default: '. · ○ ◎ ●') */\n chars?: string;\n /** Ring peak colour (default: '#00ffcc') */\n accentColor?: string;\n /** Custom base colour */\n color?: string;\n /** Number of simultaneous rings (default: 5) */\n rings?: number;\n /** Animation speed (default: 1) */\n speed?: number;\n /** Ring edge sharpness 1–10 (default: 4) */\n sharpness?: number;\n /** Light mode (default: false) */\n lightMode?: boolean;\n}\n\nexport function renderPulseBackground(\n ctx: CanvasRenderingContext2D,\n width: number,\n height: number,\n time: number,\n mousePos: { x: number; y: number } = { x: 0.5, y: 0.5 },\n options: PulseBackgroundOptions = {},\n): void {\n const {\n fontSize = 14,\n chars = '. · ○ ◎ ●',\n accentColor = undefined as string | undefined,\n color,\n rings = 5,\n speed = 1,\n sharpness = 4,\n lightMode = false,\n } = options;\n const resolvedAccent = accentColor ?? (lightMode ? '#007a5e' : '#00ffcc');\n\n ctx.clearRect(0, 0, width, height);\n ctx.textBaseline = 'middle';\n ctx.textAlign = 'center';\n\n const cx = width * mousePos.x;\n const cy = height * mousePos.y;\n const maxDist = Math.sqrt(cx * cx + cy * cy) * 1.6 + Math.sqrt(width * width + height * height) * 0.2;\n\n let br = 255, bg = 255, bb = 255;\n if (lightMode) { br = 0; bg = 0; bb = 0; }\n if (color) { const p = parseColor(color); if (p) { br = p.r; bg = p.g; bb = p.b; } }\n\n let acR = 0, acG = 255, acB = 204;\n const ap = parseColor(resolvedAccent);\n if (ap) { acR = ap.r; acG = ap.g; acB = ap.b; }\n\n const charArr = chars.replace(/ /g,'').split('');\n if (charArr.length === 0) return;\n\n const cols = Math.ceil(width / fontSize);\n const rows = Math.ceil(height / fontSize);\n\n for (let row = 0; row < rows; row++) {\n for (let col = 0; col < cols; col++) {\n const px = col * fontSize + fontSize * 0.5;\n const py = row * fontSize + fontSize * 0.5;\n const dx = px - cx;\n const dy = py - cy;\n const dist = Math.sqrt(dx * dx + dy * dy);\n const norm = dist / maxDist; // 0..1+\n\n let totalIntensity = 0;\n for (let r = 0; r < rings; r++) {\n const phase = r / rings;\n const t = ((time * speed * 0.38 + phase) % 1.0);\n const ringDist = Math.abs(norm - t);\n const ringNorm = Math.max(0, 1 - ringDist * maxDist / (fontSize * (12 - sharpness)));\n totalIntensity += Math.cos(ringNorm * Math.PI * 0.5) * ringNorm;\n }\n totalIntensity = Math.min(1, totalIntensity);\n\n if (totalIntensity < 0.02) continue;\n\n const isAccent = totalIntensity > 0.6;\n ctx.font = `${fontSize}px monospace`;\n const charIdx = Math.floor(totalIntensity * (charArr.length - 1));\n const ch = charArr[Math.min(charIdx, charArr.length - 1)];\n const alpha = lightMode ? totalIntensity * 0.88 : totalIntensity * 0.22;\n\n ctx.fillStyle = isAccent\n ? `rgba(${acR},${acG},${acB},${Math.min(lightMode ? 0.95 : 0.4, totalIntensity * 0.55)})`\n : `rgba(${br},${bg},${bb},${alpha})`;\n\n ctx.fillText(ch, px, py);\n }\n }\n\n ctx.textAlign = 'left';\n}\n","/**\n * renderNoiseBackground — slow-drifting organic fractal noise field.\n * No directional pattern — pure ambient texture. Mouse warps the field.\n */\nimport { parseColor, vnoise } from './_shared';\n\nexport interface NoiseBackgroundOptions {\n /** Font size in CSS pixels (default: 14). */\n fontSize?: number;\n /** Character ramp dark → bright (default: ' .·:;=+*#%@░▒▓'). */\n chars?: string;\n /** Accent colour on intensity peaks (default: '#d4ff00'). */\n accentColor?: string;\n /** Custom base character colour (any CSS colour string). */\n color?: string;\n /** Number of noise octaves for FBM detail (default: 4, max: 6). */\n octaves?: number;\n /** Drift / scroll speed (default: 1). */\n speed?: number;\n /** Noise scale — lower = larger blobs (default: 1). */\n scale?: number;\n /** Accent threshold 0-1 (default: 0.78). */\n accentThreshold?: number;\n /** Mouse warp radius 0-1 (default: 0.3). */\n mouseWarp?: number;\n /** Light mode (default: false). */\n lightMode?: boolean;\n}\n\nexport function renderNoiseBackground(\n ctx: CanvasRenderingContext2D,\n width: number,\n height: number,\n time: number,\n mousePos: { x: number; y: number } = { x: 0.5, y: 0.5 },\n options: NoiseBackgroundOptions = {},\n): void {\n const {\n fontSize = 14,\n chars = ' .·:;=+*#%@░▒▓',\n accentColor = undefined as string | undefined,\n color,\n octaves = 4,\n speed = 1,\n scale = 1,\n accentThreshold = 0.78,\n mouseWarp = 0.3,\n lightMode = false,\n } = options;\n const resolvedAccent = accentColor ?? (lightMode ? '#6b8700' : '#d4ff00');\n\n const charW = fontSize * 0.62;\n const lineH = fontSize * 1.4;\n const cols = Math.ceil(width / charW);\n const rows = Math.ceil(height / lineH);\n\n ctx.clearRect(0, 0, width, height);\n ctx.font = `${fontSize}px monospace`;\n ctx.textBaseline = 'top';\n\n let br = 255, bgc = 255, bb = 255;\n if (lightMode) { br = 0; bgc = 0; bb = 0; }\n if (color) { const p = parseColor(color); if (p) { br = p.r; bgc = p.g; bb = p.b; } }\n let acR = 212, acG = 255, acB = 0;\n const ap = parseColor(resolvedAccent); if (ap) { acR = ap.r; acG = ap.g; acB = ap.b; }\n\n const noiseScale = 0.035 * scale;\n const t = time * speed;\n const oct = Math.min(6, Math.max(1, octaves));\n\n // FBM with configurable octaves\n const fbmN = (x: number, y: number): number => {\n let v = 0, amp = 0.5, freq = 1, norm = 0;\n for (let o = 0; o < oct; o++) {\n v += vnoise(x * freq, y * freq) * amp;\n norm += amp;\n amp *= 0.5;\n freq *= 2.1;\n }\n return v / norm; // -1..1\n };\n\n for (let row = 0; row < rows; row++) {\n for (let col = 0; col < cols; col++) {\n const nx = col * noiseScale + t * 0.06;\n const ny = row * noiseScale * 1.3 - t * 0.04;\n\n // Mouse warp: displace sample coords near cursor\n const dx = col / cols - mousePos.x;\n const dy = row / rows - mousePos.y;\n const dist = Math.sqrt(dx * dx + dy * dy);\n const warp = mouseWarp > 0 ? Math.max(0, 1 - dist / mouseWarp) * 0.12 : 0;\n const wx = nx + warp * Math.sin(t * 1.3 + dy * 8);\n const wy = ny + warp * Math.cos(t * 0.9 + dx * 8);\n\n const raw = fbmN(wx, wy); // -1..1\n const norm2 = raw * 0.5 + 0.5; // 0..1\n\n if (norm2 < 0.12) continue;\n\n const charIdx = Math.floor(norm2 * (chars.length - 1));\n const ch = chars[charIdx];\n if (ch === ' ') continue;\n\n const isAccent = norm2 > accentThreshold;\n const alpha = lightMode ? norm2 * 0.82 : norm2 * 0.13;\n\n ctx.fillStyle = isAccent\n ? `rgba(${acR},${acG},${acB},${lightMode ? 0.92 : 0.28})`\n : `rgba(${br},${bgc},${bb},${alpha})`;\n\n ctx.fillText(ch, col * charW, row * lineH);\n }\n }\n}\n","/**\n * renderGridBackground — CRT-style horizontal scan-line sweep.\n * Bright scan bands travel downward continuously; cursor creates a local glitch zone.\n */\nimport { parseColor, hash2 } from './_shared';\n\nexport interface GridBackgroundOptions {\n /** Font size in CSS pixels (default: 12). */\n fontSize?: number;\n /** Character set (default: '·-=+|/'). */\n chars?: string;\n /** Accent / scan-band colour (default: '#d4ff00'). */\n accentColor?: string;\n /** Custom base character colour (any CSS colour string). */\n color?: string;\n /** Number of scan bands visible at once (default: 3). */\n bands?: number;\n /** Band travel speed (default: 1). */\n speed?: number;\n /** Band width as fraction of canvas height (default: 0.12). */\n bandWidth?: number;\n /** Enable cursor disruption glitch zone (default: true). */\n glitch?: boolean;\n /** Light mode (default: false). */\n lightMode?: boolean;\n}\n\nexport function renderGridBackground(\n ctx: CanvasRenderingContext2D,\n width: number,\n height: number,\n time: number,\n mousePos: { x: number; y: number } = { x: 0.5, y: 0.5 },\n options: GridBackgroundOptions = {},\n): void {\n const {\n fontSize = 12,\n chars = '·-=+|/',\n accentColor = undefined as string | undefined,\n color,\n bands = 3,\n speed = 1,\n bandWidth = 0.12,\n glitch = true,\n lightMode = false,\n } = options;\n const resolvedAccent = accentColor ?? (lightMode ? '#6b8700' : '#d4ff00');\n\n const charW = fontSize * 0.62;\n const lineH = fontSize * 1.4;\n const cols = Math.ceil(width / charW);\n const rows = Math.ceil(height / lineH);\n\n ctx.clearRect(0, 0, width, height);\n ctx.font = `${fontSize}px monospace`;\n ctx.textBaseline = 'top';\n\n let br = 255, bgv = 255, bb = 255;\n if (lightMode) { br = 0; bgv = 0; bb = 0; }\n if (color) { const p = parseColor(color); if (p) { br = p.r; bgv = p.g; bb = p.b; } }\n let acR = 212, acG = 255, acB = 0;\n const ap = parseColor(resolvedAccent); if (ap) { acR = ap.r; acG = ap.g; acB = ap.b; }\n\n const t = time * speed;\n\n for (let row = 0; row < rows; row++) {\n for (let col = 0; col < cols; col++) {\n const ny = row / rows;\n\n // Scan-band phase: bands cycle 0→1 over time\n const scanPhase = ((ny * bands - t * 0.5) % 1.0 + 1.0) % 1.0;\n // Intensity spike at scanPhase ≈ 0 (leading edge)\n const bandIntensity = Math.max(0, 1 - scanPhase / bandWidth);\n\n // Base grid texture via hash\n const gridSeed = hash2(col * 3, row * 7);\n const gridBase = (gridSeed * 0.5 + 0.5) * 0.35;\n\n // Cursor glitch zone\n let glitchBump = 0;\n if (glitch) {\n const dx = col / cols - mousePos.x;\n const dy = ny - mousePos.y;\n const d = Math.sqrt(dx * dx + dy * dy);\n if (d < 0.18) {\n const g = hash2(col * 11 + Math.floor(t * 12), row * 5);\n glitchBump = Math.max(0, 1 - d / 0.18) * (g > 0.5 ? g - 0.3 : 0);\n }\n }\n\n const intensity = Math.min(1, gridBase + bandIntensity * 0.8 + glitchBump * 0.6);\n if (intensity < 0.04) continue;\n\n const charIdx = Math.floor(intensity * (chars.length - 1));\n const ch = chars[charIdx];\n\n const isAccent = bandIntensity > 0.55;\n const alpha = lightMode ? intensity * 0.82 : intensity * 0.12;\n\n ctx.fillStyle = isAccent\n ? `rgba(${acR},${acG},${acB},${lightMode ? 0.92 : 0.28})`\n : `rgba(${br},${bgv},${bb},${alpha})`;\n\n ctx.fillText(ch, col * charW, row * lineH);\n }\n }\n}\n","/**\n * renderAuroraBackground — premium slow-drifting light bands.\n * Multiple sine layers create smooth organic interference patterns —\n * like silk, aurora borealis, or light through water.\n */\nimport { parseColor, hash2 } from './_shared';\n\nexport interface AuroraBackgroundOptions {\n /** Character grid density. Default 14. */\n fontSize?: number;\n /** Character ramp from sparse to dense. */\n chars?: string;\n /** Base character color. Default theme-aware white/black. */\n color?: string;\n /** Accent color for intensity peaks. Default '#d4ff00'. */\n accentColor?: string;\n /** Animation speed multiplier. Default 1. */\n speed?: number;\n /** Number of wave layers stacked. More = richer interference. Default 5. */\n layers?: number;\n /** Wave spread/softness — higher = broader, more diffuse bands. Default 1.2. */\n softness?: number;\n /** Mouse distortion radius (0–1). Elegant ripple that follows the cursor. Default 0.2. */\n mouseRipple?: number;\n /** Force light mode (dark chars on light bg). Default false. */\n lightMode?: boolean;\n}\n\nexport function renderAuroraBackground(\n ctx: CanvasRenderingContext2D,\n width: number,\n height: number,\n time: number,\n mousePos: { x: number; y: number } = { x: 0.5, y: 0.5 },\n options: AuroraBackgroundOptions = {},\n): void {\n const {\n fontSize = 14,\n chars = ' ·∙•:;+=≡≣#@',\n color,\n accentColor = undefined as string | undefined,\n speed = 1,\n layers = 5,\n softness = 1.2,\n mouseRipple = 0.2,\n lightMode = false,\n } = options;\n const resolvedAccent = accentColor ?? (lightMode ? '#6b8700' : '#d4ff00');\n\n const charW = fontSize * 0.62;\n const lineH = fontSize * 1.4;\n const cols = Math.ceil(width / charW);\n const rows = Math.ceil(height / lineH);\n\n ctx.clearRect(0, 0, width, height);\n ctx.font = `${fontSize}px monospace`;\n ctx.textBaseline = 'top';\n\n let cr = 255, cg = 255, cb = 255;\n if (lightMode) { cr = 0; cg = 0; cb = 0; }\n if (color) { const p = parseColor(color); if (p) { cr = p.r; cg = p.g; cb = p.b; } }\n let acR = 212, acG = 255, acB = 0;\n const ap = parseColor(resolvedAccent); if (ap) { acR = ap.r; acG = ap.g; acB = ap.b; }\n\n const t = time * speed;\n\n // Pre-bake layer parameters — each layer has unique freq, direction, phase offset\n const layerParams: Array<{ fx: number; fy: number; phase: number; dt: number; amp: number }> = [];\n for (let l = 0; l < layers; l++) {\n const seed = hash2(l * 17, l * 31 + 7);\n const seed2 = hash2(l * 23 + 5, l * 11);\n layerParams.push({\n fx: 0.8 + seed * 2.2,\n fy: 1.2 + seed2 * 1.8,\n phase: seed * Math.PI * 4,\n dt: (0.3 + hash2(l * 7, l * 13 + 3) * 0.5) * (l % 2 === 0 ? 1 : -1),\n amp: 0.55 + hash2(l * 29, l * 3) * 0.45,\n });\n }\n\n for (let row = 0; row < rows; row++) {\n const ny = row / rows;\n\n for (let col = 0; col < cols; col++) {\n const nx = col / cols;\n\n // Mouse distortion: gaussian lens warp\n const mdx = nx - mousePos.x;\n const mdy = ny - mousePos.y;\n const md = Math.sqrt(mdx * mdx + mdy * mdy);\n const warp = mouseRipple * Math.exp(-md * md / 0.06);\n const wx = nx + mdx * warp;\n const wy = ny + mdy * warp;\n\n // Sum wave layers\n let sum = 0;\n let totalAmp = 0;\n for (let l = 0; l < layers; l++) {\n const { fx, fy, phase, dt, amp } = layerParams[l];\n const wave = Math.sin(wx * fx * Math.PI * 2 + t * dt + phase)\n * Math.cos(wy * fy * Math.PI * 2 + t * dt * 0.7 + phase * 1.3);\n sum += wave * amp;\n totalAmp += amp;\n }\n\n // Normalise to 0→1 with soft sigmoid\n const rawVal = sum / totalAmp;\n const curved = 0.5 + 0.5 * Math.tanh(rawVal * softness * 2.2);\n\n if (curved < 0.12) continue;\n\n const normalized = (curved - 0.12) / 0.88;\n const charIdx = Math.min(chars.length - 1, Math.floor(normalized * chars.length));\n const ch = chars[charIdx];\n\n const isAccent = curved > 0.82;\n const alpha = lightMode ? curved * 0.82 : curved * 0.14;\n\n ctx.fillStyle = isAccent\n ? `rgba(${acR},${acG},${acB},${lightMode ? 0.92 : 0.32})`\n : `rgba(${cr},${cg},${cb},${alpha})`;\n\n ctx.fillText(ch, col * charW, row * lineH);\n }\n }\n}\n","/**\n * renderSilkBackground — smooth directional flow-field ribbons.\n * Each cell reads its angle from a slow-drifting vector field.\n * No mouse interaction by design — pure ambient texture.\n */\nimport { parseColor, hash2 } from './_shared';\n\nexport interface SilkBackgroundOptions {\n /** Character grid density. Default 13. */\n fontSize?: number;\n /** Base character color. Default theme-aware white/black. */\n color?: string;\n /** Accent color for intensity peaks. Default '#d4ff00'. */\n accentColor?: string;\n /** Animation speed multiplier. Default 0.4 (intentionally slow). */\n speed?: number;\n /** Number of flow-field layers. More = richer ribbons. Default 4. */\n layers?: number;\n /** Flow turbulence (0–2). Higher = more folded, tangled ribbons. Default 0.8. */\n turbulence?: number;\n /** Force light mode. Default false. */\n lightMode?: boolean;\n}\n\nexport function renderSilkBackground(\n ctx: CanvasRenderingContext2D,\n width: number,\n height: number,\n time: number,\n options: SilkBackgroundOptions = {},\n): void {\n const {\n fontSize = 13,\n color,\n accentColor = undefined as string | undefined,\n speed = 0.4,\n layers = 4,\n turbulence = 0.8,\n lightMode = false,\n } = options;\n const resolvedAccent = accentColor ?? (lightMode ? '#6b8700' : '#d4ff00');\n\n const charW = fontSize * 0.62;\n const lineH = fontSize * 1.4;\n const cols = Math.ceil(width / charW);\n const rows = Math.ceil(height / lineH);\n\n ctx.clearRect(0, 0, width, height);\n ctx.font = `${fontSize}px monospace`;\n ctx.textBaseline = 'top';\n\n let cr = 255, cg = 255, cb = 255;\n if (lightMode) { cr = 0; cg = 0; cb = 0; }\n if (color) { const p = parseColor(color); if (p) { cr = p.r; cg = p.g; cb = p.b; } }\n let acR = 212, acG = 255, acB = 0;\n const ap = parseColor(resolvedAccent); if (ap) { acR = ap.r; acG = ap.g; acB = ap.b; }\n\n const t = time * speed;\n\n // Direction chars: flow-angle-mapped for the ribbon illusion\n const dirChars = ['─', '─', '╌', '·', '╌', '─', '─', '╌', '·'];\n\n for (let row = 0; row < rows; row++) {\n const ny = row / rows;\n for (let col = 0; col < cols; col++) {\n const nx = col / cols;\n\n // Stack multiple sine-based flow layers\n let angleSum = 0;\n let intensitySum = 0;\n for (let l = 0; l < layers; l++) {\n const ls = hash2(l * 13, l * 7 + 3);\n const ls2 = hash2(l * 29, l * 11 + 1);\n const fx = 1.1 + ls * 2.4;\n const fy = 0.9 + ls2 * 2.0;\n const ph = ls * Math.PI * 6;\n const dr = (0.2 + hash2(l * 41, l * 17) * 0.5) * (l % 2 === 0 ? 1 : -1.3);\n\n const u = Math.sin(nx * fx * Math.PI * 2 + t * dr + ph);\n const v = Math.cos(ny * fy * Math.PI * 2 + t * dr * 0.6 + ph * 1.7);\n\n const cross = Math.sin(nx * fy * Math.PI * turbulence + ny * fx * Math.PI * turbulence + t * dr * 0.4);\n\n angleSum += Math.atan2(v + cross * 0.3, u);\n intensitySum += (u * v + 1) * 0.5;\n }\n\n const angle = angleSum / layers;\n const intensity = Math.min(1, intensitySum / layers);\n\n if (intensity < 0.1) continue;\n\n const angleNorm = (angle + Math.PI) / (Math.PI * 2);\n const charIdx = Math.floor(angleNorm * dirChars.length) % dirChars.length;\n const ch = dirChars[charIdx];\n\n const isAccent = intensity > 0.80;\n const alpha = lightMode ? intensity * 0.80 : intensity * 0.13;\n\n ctx.fillStyle = isAccent\n ? `rgba(${acR},${acG},${acB},${lightMode ? 0.90 : 0.26})`\n : `rgba(${cr},${cg},${cb},${alpha})`;\n\n ctx.fillText(ch, col * charW, row * lineH);\n }\n }\n}\n","/**\n * renderVoidBackground — gravitational singularity follows the cursor.\n * Characters are pulled inward and spiral around the attractor.\n */\nimport { parseColor, hash2 } from './_shared';\n\nexport interface VoidBackgroundOptions {\n /** Character grid density. Default 13. */\n fontSize?: number;\n /** Character ramp. Default space-to-dense. */\n chars?: string;\n /** Base character color. Default theme-aware. */\n color?: string;\n /** Accent color for the inner singularity ring. Default '#d4ff00'. */\n accentColor?: string;\n /** Animation speed multiplier. Default 1. */\n speed?: number;\n /** Gravity well radius (fraction of canvas width). Default 0.38. */\n radius?: number;\n /** Spiral tightness — higher = more rotation per unit distance. Default 3. */\n swirl?: number;\n /** Force light mode. Default false. */\n lightMode?: boolean;\n}\n\nexport function renderVoidBackground(\n ctx: CanvasRenderingContext2D,\n width: number,\n height: number,\n time: number,\n mousePos: { x: number; y: number } = { x: 0.5, y: 0.5 },\n options: VoidBackgroundOptions = {},\n): void {\n const {\n fontSize = 13,\n chars = ' ·:;=+*#%@',\n color,\n accentColor = undefined as string | undefined,\n speed = 1,\n radius = 0.38,\n swirl = 3,\n lightMode = false,\n } = options;\n const resolvedAccent = accentColor ?? (lightMode ? '#6b8700' : '#d4ff00');\n\n const charW = fontSize * 0.62;\n const lineH = fontSize * 1.4;\n const cols = Math.ceil(width / charW);\n const rows = Math.ceil(height / lineH);\n const aspect = width / height;\n\n ctx.clearRect(0, 0, width, height);\n ctx.font = `${fontSize}px monospace`;\n ctx.textBaseline = 'top';\n\n let cr = 255, cg = 255, cb = 255;\n if (lightMode) { cr = 0; cg = 0; cb = 0; }\n if (color) { const p = parseColor(color); if (p) { cr = p.r; cg = p.g; cb = p.b; } }\n let acR = 212, acG = 255, acB = 0;\n const ap = parseColor(resolvedAccent); if (ap) { acR = ap.r; acG = ap.g; acB = ap.b; }\n\n const t = time * speed;\n\n for (let row = 0; row < rows; row++) {\n const ny = row / rows;\n for (let col = 0; col < cols; col++) {\n const nx = col / cols;\n\n const dx = (nx - mousePos.x) * aspect;\n const dy = ny - mousePos.y;\n const dist = Math.sqrt(dx * dx + dy * dy);\n const r = dist / radius;\n\n // Outside radius: very faint scattered field\n if (r > 1) {\n const outerNoise = hash2(col * 3, row * 7) * Math.max(0, 1 - (r - 1) * 3);\n if (outerNoise < 0.62) continue;\n const alpha = outerNoise * (lightMode ? 0.28 : 0.04);\n ctx.fillStyle = `rgba(${cr},${cg},${cb},${alpha})`;\n ctx.fillText(chars[1], col * charW, row * lineH);\n continue;\n }\n\n // Spiral displacement: angle rotates faster near center\n const baseAngle = Math.atan2(dy, dx * aspect);\n const swirlAmt = (1 - r) * swirl;\n const angle = baseAngle + swirlAmt + t * 0.4;\n\n // Intensity: rises sharply toward center, with animated pulse ring\n const pulseRing = Math.max(0, 1 - Math.abs(r - (0.15 + 0.12 * Math.sin(t * 1.1))) / 0.07);\n const gravity = Math.pow(1 - r, 2.2);\n const intensity = Math.min(1, gravity + pulseRing * 0.6);\n\n if (intensity < 0.06) continue;\n\n void angle; // angle influences char variety at mid-range (kept for future use)\n const densityI = Math.floor(intensity * (chars.length - 1));\n const charIdx = Math.min(chars.length - 1, densityI);\n const ch = chars[charIdx];\n\n const isAccent = pulseRing > 0.35 || r < 0.08;\n const alpha = lightMode ? intensity * 0.85 : intensity * 0.18;\n\n ctx.fillStyle = isAccent\n ? `rgba(${acR},${acG},${acB},${lightMode ? 0.95 : 0.38})`\n : `rgba(${cr},${cg},${cb},${alpha})`;\n\n ctx.fillText(ch, col * charW, row * lineH);\n }\n }\n}\n","/**\n * renderMorphBackground — per-cell multi-frequency oscillation.\n * Each cell uses a unique rhythm. Pure ambient texture. No mouse interaction.\n */\nimport { parseColor, hash2 } from './_shared';\n\nexport interface MorphBackgroundOptions {\n /** Character grid density. Default 14. */\n fontSize?: number;\n /** Character ramp. Default clean gradient. */\n chars?: string;\n /** Base character color. Default theme-aware. */\n color?: string;\n /** Accent color for intensity peaks. Default '#d4ff00'. */\n accentColor?: string;\n /** Animation speed multiplier. Default 0.5 (intentionally slow). */\n speed?: number;\n /** How many frequency harmonics per cell. More = richer shimmer. Default 3. */\n harmonics?: number;\n /** Force light mode. Default false. */\n lightMode?: boolean;\n}\n\nexport function renderMorphBackground(\n ctx: CanvasRenderingContext2D,\n width: number,\n height: number,\n time: number,\n options: MorphBackgroundOptions = {},\n): void {\n const {\n fontSize = 14,\n chars = ' ·∙•:-=+*#',\n color,\n accentColor = undefined as string | undefined,\n speed = 0.5,\n harmonics = 3,\n lightMode = false,\n } = options;\n const resolvedAccent = accentColor ?? (lightMode ? '#6b8700' : '#d4ff00');\n\n const charW = fontSize * 0.62;\n const lineH = fontSize * 1.4;\n const cols = Math.ceil(width / charW);\n const rows = Math.ceil(height / lineH);\n\n ctx.clearRect(0, 0, width, height);\n ctx.font = `${fontSize}px monospace`;\n ctx.textBaseline = 'top';\n\n let cr = 255, cg = 255, cb = 255;\n if (lightMode) { cr = 0; cg = 0; cb = 0; }\n if (color) { const p = parseColor(color); if (p) { cr = p.r; cg = p.g; cb = p.b; } }\n let acR = 212, acG = 255, acB = 0;\n const ap = parseColor(resolvedAccent); if (ap) { acR = ap.r; acG = ap.g; acB = ap.b; }\n\n const t = time * speed;\n\n // Max possible sum: sum(1/(h+1)) for h=0..harmonics-1\n const maxV = Array.from({ length: harmonics }, (_, h) => 1 / (h + 1)).reduce((a, b) => a + b, 0);\n\n for (let row = 0; row < rows; row++) {\n for (let col = 0; col < cols; col++) {\n // Each cell gets unique frequency seeds derived from its position\n let v = 0;\n for (let h = 0; h < harmonics; h++) {\n const fBase = hash2(col * (h + 3) + 7, row * (h + 5) + 11);\n const fineF = 0.18 + fBase * 1.4;\n const phase = hash2(col * (h + 7), row * (h + 9) + 3) * Math.PI * 2;\n const weight = 1 / (h + 1);\n v += Math.sin(t * fineF + phase) * weight;\n }\n\n const norm = (v / maxV + 1) * 0.5; // 0→1\n\n if (norm < 0.28) continue;\n\n const remapped = (norm - 0.28) / 0.72;\n const charIdx = Math.min(chars.length - 1, Math.floor(remapped * chars.length));\n const ch = chars[charIdx];\n\n const isAccent = norm > 0.88;\n const alpha = lightMode ? remapped * 0.82 : remapped * 0.13;\n\n ctx.fillStyle = isAccent\n ? `rgba(${acR},${acG},${acB},${lightMode ? 0.92 : 0.28})`\n : `rgba(${cr},${cg},${cb},${alpha})`;\n\n ctx.fillText(ch, col * charW, row * lineH);\n }\n }\n}\n","/**\n * renderFireBackground — upward-drifting fire simulation using a cellular\n * automata heat-propagation approach rendered as ASCII chars.\n */\nimport { parseColor } from './_shared';\n\nexport interface FireBackgroundOptions {\n /** Font size in CSS pixels (default: 13) */\n fontSize?: number;\n /** Characters mapped from cool→hot (default: ' .,:;i+xX#&@') */\n chars?: string;\n /** Base flame colour (default: '#ff4500') */\n color?: string;\n /** Secondary hot-tip colour (default: '#ffe066') */\n hotColor?: string;\n /** Flame intensity 0–1 (default: 0.85) */\n intensity?: number;\n /** Horizontal wind force -1..1 (default: 0) */\n wind?: number;\n /** Global speed multiplier (default: 1) */\n speed?: number;\n /** Light mode: invert text colours (default: false) */\n lightMode?: boolean;\n}\n\nexport function renderFireBackground(\n ctx: CanvasRenderingContext2D,\n width: number,\n height: number,\n time: number,\n options: FireBackgroundOptions = {},\n): void {\n const {\n fontSize = 13,\n chars = ' .,:;i+xX#&@',\n color = '#ff4500',\n hotColor = '#ffe066',\n intensity = 0.85,\n wind = 0,\n speed = 1,\n lightMode = false,\n } = options;\n\n const charW = fontSize * 0.62;\n const lineH = fontSize * 1.4;\n const cols = Math.ceil(width / charW);\n const rows = Math.ceil(height / lineH);\n const len = cols * rows;\n\n // Persistent heat buffer stored on the canvas element to survive redraws.\n const key = '__fire_heat__';\n const canvasAny = ctx.canvas as unknown as Record<string, Float32Array>;\n let heat: Float32Array = canvasAny[key] as Float32Array;\n if (!heat || heat.length !== len) {\n heat = new Float32Array(len);\n canvasAny[key] = heat;\n }\n\n const dt = 0.016 * speed;\n const coolingRate = 0.18 * dt;\n const windShift = wind * speed * 0.8;\n\n // Seed the bottom 2 rows with hot cells every frame.\n const baseRow = rows - 1;\n const t = time * speed;\n for (let c = 0; c < cols; c++) {\n const flicker = Math.sin(c * 0.31 + t * 4.1) * 0.5 + 0.5;\n const flicker2 = Math.sin(c * 0.73 - t * 2.7) * 0.5 + 0.5;\n const seed = (flicker * 0.6 + flicker2 * 0.4) * intensity;\n heat[baseRow * cols + c] = Math.min(1, seed + Math.random() * 0.15 * intensity);\n if (baseRow > 0) heat[(baseRow - 1) * cols + c] = Math.min(1, seed * 0.85 + Math.random() * 0.1 * intensity);\n }\n\n // Propagate heat upward.\n const newHeat = new Float32Array(len);\n for (let r = 0; r < rows - 2; r++) {\n for (let c = 0; c < cols; c++) {\n const below = heat[(r + 1) * cols + c];\n const below2 = heat[(r + 2) * cols + Math.max(0, Math.min(cols - 1, c + Math.round(windShift)))];\n const left = heat[(r + 1) * cols + Math.max(0, c - 1)];\n const right = heat[(r + 1) * cols + Math.min(cols - 1, c + 1)];\n const avg = (below * 0.4 + below2 * 0.25 + left * 0.175 + right * 0.175);\n newHeat[r * cols + c] = Math.max(0, avg - coolingRate - Math.random() * 0.02 * speed);\n }\n }\n // Copy bottom seeded rows unchanged.\n for (let c = 0; c < cols; c++) {\n newHeat[(rows - 1) * cols + c] = heat[(rows - 1) * cols + c];\n if (rows > 1) newHeat[(rows - 2) * cols + c] = heat[(rows - 2) * cols + c];\n }\n canvasAny[key] = newHeat;\n\n // Parse colours.\n const cp = parseColor(color) ?? { r: 255, g: 69, b: 0 };\n const hp = parseColor(hotColor) ?? { r: 255, g: 224, b: 102 };\n\n ctx.clearRect(0, 0, width, height);\n ctx.font = `${fontSize}px \"JetBrains Mono\", monospace`;\n ctx.textBaseline = 'top';\n\n for (let r = 0; r < rows; r++) {\n for (let c = 0; c < cols; c++) {\n const v = newHeat[r * cols + c];\n if (v < 0.03) continue;\n\n const charIdx = Math.min(chars.length - 1, Math.floor(v * chars.length));\n const ch = chars[charIdx];\n if (ch === ' ') continue;\n\n // Interpolate colour from base to hot tip.\n const blend = Math.min(1, v * 1.2);\n const r2 = (cp.r + (hp.r - cp.r) * blend) | 0;\n const g2 = (cp.g + (hp.g - cp.g) * blend) | 0;\n const b2 = (cp.b + (hp.b - cp.b) * blend) | 0;\n\n const alpha = lightMode ? (1 - v * 0.3) : Math.min(1, v + 0.15);\n ctx.globalAlpha = alpha;\n ctx.fillStyle = `rgb(${r2},${g2},${b2})`;\n ctx.fillText(ch, c * charW, r * lineH);\n }\n }\n ctx.globalAlpha = 1;\n}\n","/**\n * renderDnaBackground — animated double-helix DNA strands scrolling vertically\n * with base-pair characters between them.\n */\nimport { parseColor, hash2 } from './_shared';\n\nexport interface DnaBackgroundOptions {\n /** Font size in CSS pixels (default: 13) */\n fontSize?: number;\n /** Characters for strand nodes (default: 'ATCG') */\n baseChars?: string;\n /** Characters for the connectors between strands (default: '-=≡') */\n bridgeChars?: string;\n /** Primary strand colour (default: '#00e5ff') */\n color?: string;\n /** Secondary strand colour (default: '#ff4081') */\n color2?: string;\n /** Bridge / connector colour (default: '#88ffcc') */\n bridgeColor?: string;\n /** Speed multiplier (default: 1) */\n speed?: number;\n /** Number of helix columns (default: auto, ~1 per 80px) */\n helixCount?: number;\n /** Light mode (default: false) */\n lightMode?: boolean;\n}\n\nexport function renderDnaBackground(\n ctx: CanvasRenderingContext2D,\n width: number,\n height: number,\n time: number,\n options: DnaBackgroundOptions = {},\n): void {\n const {\n fontSize = 13,\n baseChars = 'ATCG',\n bridgeChars = '-=≡',\n color = '#00e5ff',\n color2 = '#ff4081',\n bridgeColor = '#88ffcc',\n speed = 1,\n helixCount,\n lightMode = false,\n } = options;\n\n const charW = fontSize * 0.62;\n const lineH = fontSize * 1.4;\n const cols = Math.ceil(width / charW);\n const rows = Math.ceil(height / lineH);\n\n const numHelix = helixCount ?? Math.max(1, Math.floor(width / 80));\n const sectionW = cols / numHelix;\n\n const cp = parseColor(color) ?? { r: 0, g: 229, b: 255 };\n const cp2 = parseColor(color2) ?? { r: 255, g: 64, b: 129 };\n const bp = parseColor(bridgeColor) ?? { r: 136, g: 255, b: 204 };\n\n const defaultColor = lightMode ? 'rgb(20,20,20)' : 'rgb(255,255,255)';\n void defaultColor; // used below\n\n ctx.clearRect(0, 0, width, height);\n ctx.font = `${fontSize}px \"JetBrains Mono\", monospace`;\n ctx.textBaseline = 'top';\n\n const t = time * speed;\n const amplitude = (sectionW * 0.35);\n\n for (let h = 0; h < numHelix; h++) {\n const centerCol = sectionW * (h + 0.5);\n\n for (let r = 0; r < rows; r++) {\n const phase = (r / rows) * Math.PI * 6 - t * 1.8;\n const strand1ColF = centerCol + Math.sin(phase) * amplitude;\n const strand2ColF = centerCol + Math.sin(phase + Math.PI) * amplitude;\n const strand1Col = Math.round(strand1ColF);\n const strand2Col = Math.round(strand2ColF);\n\n if (strand1Col < 0 || strand1Col >= cols) continue;\n const baseSeed1 = hash2(h * 31 + r * 7, 3);\n const ch1 = baseChars[Math.floor(baseSeed1 * baseChars.length)];\n\n // Depth cue: alpha based on sine value (-1..1)\n const depth1 = (Math.sin(phase) + 1) * 0.5;\n const depth2 = (Math.sin(phase + Math.PI) + 1) * 0.5;\n\n ctx.globalAlpha = 0.35 + depth1 * 0.65;\n ctx.fillStyle = `rgb(${cp.r},${cp.g},${cp.b})`;\n ctx.fillText(ch1, strand1Col * charW, r * lineH);\n\n if (strand2Col >= 0 && strand2Col < cols) {\n const baseSeed2 = hash2(h * 53 + r * 11, 7);\n const ch2 = baseChars[Math.floor(baseSeed2 * baseChars.length)];\n ctx.globalAlpha = 0.35 + depth2 * 0.65;\n ctx.fillStyle = `rgb(${cp2.r},${cp2.g},${cp2.b})`;\n ctx.fillText(ch2, strand2Col * charW, r * lineH);\n }\n\n // Draw bridge every ~3 rows when strands are roughly horizontal.\n const bridgeInterval = 3;\n if (r % bridgeInterval === 0) {\n const minC = Math.min(strand1Col, strand2Col);\n const maxC = Math.max(strand1Col, strand2Col);\n const bridgeLen = maxC - minC;\n if (bridgeLen > 1) {\n const bSeed = hash2(r * 17 + h * 43, 5);\n const bCh = bridgeChars[Math.floor(bSeed * bridgeChars.length)];\n const midBridgeAlpha = (depth1 + depth2) * 0.25 + 0.2;\n ctx.globalAlpha = midBridgeAlpha;\n ctx.fillStyle = `rgb(${bp.r},${bp.g},${bp.b})`;\n for (let bc = minC + 1; bc < maxC; bc++) {\n ctx.fillText(bCh, bc * charW, r * lineH);\n }\n }\n }\n }\n }\n\n ctx.globalAlpha = 1;\n}\n","/**\n * renderTerrainBackground — scrolling ASCII side-scroll heightmap landscape\n * generated from layered Perlin-style noise.\n */\nimport { parseColor, fbm, hash2 } from './_shared';\n\nexport interface TerrainBackgroundOptions {\n /** Font size in CSS pixels (default: 13) */\n fontSize?: number;\n /** Characters for terrain density (default: ' .,:;+*#@') */\n chars?: string;\n /** Foreground ground colour (default: '#4caf50') */\n color?: string;\n /** Sky / star colour (default: '#1a237e') */\n skyColor?: string;\n /** Peak / snow-cap colour (default: '#e0e0e0') */\n peakColor?: string;\n /** Horizontal scroll speed (default: 1) */\n speed?: number;\n /** Terrain roughness 0.1–1 (default: 0.55) */\n roughness?: number;\n /** Mountain height fraction 0–1 (default: 0.55) */\n heightScale?: number;\n /** Show faint background stars (default: true) */\n stars?: boolean;\n /** Light mode (default: false) */\n lightMode?: boolean;\n}\n\nexport function renderTerrainBackground(\n ctx: CanvasRenderingContext2D,\n width: number,\n height: number,\n time: number,\n options: TerrainBackgroundOptions = {},\n): void {\n const {\n fontSize = 13,\n chars = ' .,:;+*#@',\n color = '#4caf50',\n skyColor = '#1a237e',\n peakColor = '#e0e0e0',\n speed = 1,\n roughness = 0.55,\n heightScale = 0.55,\n stars = true,\n lightMode = false,\n } = options;\n\n const charW = fontSize * 0.62;\n const lineH = fontSize * 1.4;\n const cols = Math.ceil(width / charW);\n const rows = Math.ceil(height / lineH);\n\n const cp = parseColor(color) ?? { r: 76, g: 175, b: 80 };\n const sky = parseColor(skyColor) ?? { r: 26, g: 35, b: 126 };\n const peak = parseColor(peakColor) ?? { r: 224, g: 224, b: 224 };\n void lightMode;\n\n ctx.clearRect(0, 0, width, height);\n ctx.font = `${fontSize}px \"JetBrains Mono\", monospace`;\n ctx.textBaseline = 'top';\n\n const scroll = time * speed * 0.4;\n\n // Pre-compute terrain height per column.\n const terrainRow: number[] = new Array(cols);\n for (let c = 0; c < cols; c++) {\n const nx = (c / cols + scroll) * roughness * 3;\n const h = (fbm(nx, 0.5) * 0.5 + 0.5) * heightScale;\n terrainRow[c] = Math.floor(h * rows);\n }\n\n for (let r = 0; r < rows; r++) {\n for (let c = 0; c < cols; c++) {\n const terrainStart = rows - 1 - terrainRow[c];\n const isGround = r >= terrainStart;\n const isNearPeak = r === terrainStart;\n\n if (!isGround) {\n // Sky region: occasional stars.\n if (stars) {\n const starSeed = hash2(c * 7 + Math.floor(scroll * 0.3), r * 13);\n if (starSeed > 0.97) {\n const twinkle = Math.sin(time * 2 + starSeed * 100) * 0.3 + 0.7;\n ctx.globalAlpha = twinkle * 0.5;\n ctx.fillStyle = `rgb(${sky.r + 60},${sky.g + 60},${sky.b + 80})`;\n ctx.fillText('·', c * charW, r * lineH);\n }\n }\n continue;\n }\n\n // Ground: depth based on distance from surface.\n const depth = (r - terrainStart) / Math.max(1, terrainRow[c]);\n const charIdx = Math.min(chars.length - 1, Math.floor(depth * chars.length));\n const ch = chars[charIdx];\n if (ch === ' ' && !isNearPeak) continue;\n\n const blendPeak = isNearPeak ? 1 : Math.max(0, 1 - depth * 4);\n const r2 = ((cp.r + (peak.r - cp.r) * blendPeak) | 0);\n const g2 = ((cp.g + (peak.g - cp.g) * blendPeak) | 0);\n const b2 = ((cp.b + (peak.b - cp.b) * blendPeak) | 0);\n\n ctx.globalAlpha = 0.5 + depth * 0.5;\n ctx.fillStyle = `rgb(${r2},${g2},${b2})`;\n ctx.fillText(isNearPeak ? chars[chars.length - 1] : ch, c * charW, r * lineH);\n }\n }\n\n ctx.globalAlpha = 1;\n}\n","/**\n * renderCircuitBackground — procedural PCB trace growth with signal pulses\n * traveling along horizontal and vertical edges.\n */\nimport { parseColor, hash2 } from './_shared';\n\nexport interface CircuitBackgroundOptions {\n /** Font size in CSS pixels (default: 13) */\n fontSize?: number;\n /** Trace characters (default: '─│┌┐└┘├┤┬┴┼') */\n chars?: string;\n /** Trace colour (default: '#00ff88') */\n color?: string;\n /** Signal pulse colour (default: '#ffffff') */\n pulseColor?: string;\n /** Fraction of cells that have a trace (default: 0.38) */\n density?: number;\n /** Signal pulse speed (default: 1) */\n speed?: number;\n /** Light mode (default: false) */\n lightMode?: boolean;\n}\n\n// Direction flags (bit-field per cell)\nconst EAST = 1;\nconst WEST = 2;\nconst NORTH = 4;\nconst SOUTH = 8;\n\nconst DIR_CHARS: Record<number, string> = {\n [EAST | WEST]: '─',\n [NORTH | SOUTH]: '│',\n [EAST | SOUTH]: '┌',\n [WEST | SOUTH]: '┐',\n [EAST | NORTH]: '└',\n [WEST | NORTH]: '┘',\n [EAST | WEST | SOUTH]: '┬',\n [EAST | WEST | NORTH]: '┴',\n [NORTH | SOUTH | EAST]: '├',\n [NORTH | SOUTH | WEST]: '┤',\n [EAST | WEST | NORTH | SOUTH]: '┼',\n [EAST]: '╶',\n [WEST]: '╴',\n [NORTH]: '╵',\n [SOUTH]: '╷',\n};\n\nexport function renderCircuitBackground(\n ctx: CanvasRenderingContext2D,\n width: number,\n height: number,\n time: number,\n options: CircuitBackgroundOptions = {},\n): void {\n const {\n fontSize = 13,\n pulseColor = '#ffffff',\n color = '#00ff88',\n density = 0.38,\n speed = 1,\n lightMode = false,\n } = options;\n\n const charW = fontSize * 0.62;\n const lineH = fontSize * 1.4;\n const cols = Math.ceil(width / charW);\n const rows = Math.ceil(height / lineH);\n\n const cp = parseColor(color) ?? { r: 0, g: 255, b: 136 };\n const pp = parseColor(pulseColor) ?? { r: 255, g: 255, b: 255 };\n void lightMode;\n\n // Build a stable grid from hash functions (no per-frame allocation).\n // Each cell stores a bitmask of connections.\n const getConnections = (c: number, r: number): number => {\n if (hash2(c * 17 + 1, r * 7 + 2) > density) return 0;\n let mask = 0;\n if (c + 1 < cols && hash2(c * 17 + 1, r * 7 + 2) > 0.15) mask |= EAST;\n if (c - 1 >= 0 && hash2((c-1)*17+1, r*7+2) > 0.15) mask |= WEST;\n if (r + 1 < rows && hash2(c * 17 + 1, (r+1)*7+2) > 0.15) mask |= SOUTH;\n if (r - 1 >= 0 && hash2(c*17+1,(r-1)*7+2) > 0.15) mask |= NORTH;\n return mask;\n };\n\n ctx.clearRect(0, 0, width, height);\n ctx.font = `${fontSize}px \"JetBrains Mono\", monospace`;\n ctx.textBaseline = 'top';\n\n const t = time * speed;\n\n for (let r = 0; r < rows; r++) {\n for (let c = 0; c < cols; c++) {\n const mask = getConnections(c, r);\n if (mask === 0) continue;\n\n const ch = DIR_CHARS[mask] ?? '·';\n\n // Pulse wave along horizontal traces.\n const pulsePosH = ((t * 8 + hash2(c, r * 23) * 40) % cols);\n const pulsePosV = ((t * 6 + hash2(r * 17, c * 11) * 40) % rows);\n const nearH = (mask & EAST || mask & WEST) && Math.abs(c - pulsePosH) < 1.5;\n const nearV = (mask & NORTH || mask & SOUTH) && Math.abs(r - pulsePosV) < 1.5;\n const isPulse = nearH || nearV;\n\n const baseAlpha = 0.25 + hash2(c * 3, r * 5) * 0.35;\n\n if (isPulse) {\n ctx.globalAlpha = 0.95;\n ctx.fillStyle = `rgb(${pp.r},${pp.g},${pp.b})`;\n } else {\n ctx.globalAlpha = baseAlpha;\n ctx.fillStyle = `rgb(${cp.r},${cp.g},${cp.b})`;\n }\n\n ctx.fillText(ch, c * charW, r * lineH);\n }\n }\n\n ctx.globalAlpha = 1;\n}\n","/**\n * ASCII Background — public entry point for the backgrounds sub-system.\n *\n * Exports:\n * - All 10 render functions\n * - All 10 option interfaces\n * - `AsciiBackgroundOptions` — combined union type + mount options\n * - `asciiBackground()` — the drop-in mount helper\n * - `mountWaveBackground` / `MountWaveOptions` — deprecated aliases\n */\n\nexport type { WaveBackgroundOptions } from './wave';\nexport { renderWaveBackground } from './wave';\n\nexport type { RainBackgroundOptions } from './rain';\nexport { renderRainBackground } from './rain';\n\nexport type { StarsBackgroundOptions } from './stars';\nexport { renderStarsBackground } from './stars';\n\nexport type { PulseBackgroundOptions } from './pulse';\nexport { renderPulseBackground } from './pulse';\n\nexport type { NoiseBackgroundOptions } from './noise';\nexport { renderNoiseBackground } from './noise';\n\nexport type { GridBackgroundOptions } from './grid';\nexport { renderGridBackground } from './grid';\n\nexport type { AuroraBackgroundOptions } from './aurora';\nexport { renderAuroraBackground } from './aurora';\n\nexport type { SilkBackgroundOptions } from './silk';\nexport { renderSilkBackground } from './silk';\n\nexport type { VoidBackgroundOptions } from './void';\nexport { renderVoidBackground } from './void';\n\nexport type { MorphBackgroundOptions } from './morph';\nexport { renderMorphBackground } from './morph';\n\nexport type { FireBackgroundOptions } from './fire';\nexport { renderFireBackground } from './fire';\n\nexport type { DnaBackgroundOptions } from './dna';\nexport { renderDnaBackground } from './dna';\n\nexport type { TerrainBackgroundOptions } from './terrain';\nexport { renderTerrainBackground } from './terrain';\n\nexport type { CircuitBackgroundOptions } from './circuit';\nexport { renderCircuitBackground } from './circuit';\n\nimport { renderWaveBackground } from './wave';\nimport type { WaveBackgroundOptions } from './wave';\nimport { renderRainBackground } from './rain';\nimport type { RainBackgroundOptions } from './rain';\nimport { renderStarsBackground } from './stars';\nimport type { StarsBackgroundOptions } from './stars';\nimport { renderPulseBackground } from './pulse';\nimport type { PulseBackgroundOptions } from './pulse';\nimport { renderNoiseBackground } from './noise';\nimport type { NoiseBackgroundOptions } from './noise';\nimport { renderGridBackground } from './grid';\nimport type { GridBackgroundOptions } from './grid';\nimport { renderAuroraBackground } from './aurora';\nimport type { AuroraBackgroundOptions } from './aurora';\nimport { renderSilkBackground } from './silk';\nimport type { SilkBackgroundOptions } from './silk';\nimport { renderVoidBackground } from './void';\nimport type { VoidBackgroundOptions } from './void';\nimport { renderMorphBackground } from './morph';\nimport type { MorphBackgroundOptions } from './morph';\nimport { renderFireBackground } from './fire';\nimport type { FireBackgroundOptions } from './fire';\nimport { renderDnaBackground } from './dna';\nimport type { DnaBackgroundOptions } from './dna';\nimport { renderTerrainBackground } from './terrain';\nimport type { TerrainBackgroundOptions } from './terrain';\nimport { renderCircuitBackground } from './circuit';\nimport type { CircuitBackgroundOptions } from './circuit';\n\n// Inline _parseColor for the inject helper (avoids circular dep through _shared re-export)\nfunction _parseColor(c: string): { r: number; g: number; b: number } | null {\n const hex = c.match(/^#([0-9a-f]{3,8})$/i)?.[1];\n if (hex) {\n const h = hex.length <= 4\n ? hex.split('').map(x => parseInt(x + x, 16))\n : [parseInt(hex.slice(0,2),16), parseInt(hex.slice(2,4),16), parseInt(hex.slice(4,6),16)];\n return { r: h[0], g: h[1], b: h[2] };\n }\n const rgb = c.match(/rgba?\\(\\s*(\\d+)[,\\s]+(\\d+)[,\\s]+(\\d+)/i);\n if (rgb) return { r: +rgb[1], g: +rgb[2], b: +rgb[3] };\n return null;\n}\n\n/**\n * Combined options for `asciiBackground()`. Extends all 10 background option\n * interfaces so every background's options can be passed through one object.\n */\nexport interface AsciiBackgroundOptions extends\n WaveBackgroundOptions,\n RainBackgroundOptions,\n StarsBackgroundOptions,\n PulseBackgroundOptions,\n NoiseBackgroundOptions,\n GridBackgroundOptions,\n AuroraBackgroundOptions,\n SilkBackgroundOptions,\n VoidBackgroundOptions,\n MorphBackgroundOptions,\n FireBackgroundOptions,\n DnaBackgroundOptions,\n TerrainBackgroundOptions,\n CircuitBackgroundOptions\n{\n /**\n * Which background to render (default: 'wave').\n * - 'wave' — interactive ASCII field with vortex, sparkles, breathe\n * - 'rain' — digital column rain (Matrix-style falling characters)\n * - 'stars' — 3D star-warp / hyperspace chars fly toward the viewer\n * - 'pulse' — concentric ASCII ripples radiating from the mouse\n * - 'noise' — slow-drifting organic fractal noise field\n * - 'grid' — CRT-style horizontal scan bands with cursor glitch zone\n * - 'aurora' — premium slow-drifting light bands\n * - 'silk' — smooth directional flow-field ribbons\n * - 'void' — gravitational singularity follows the cursor\n * - 'morph' — per-cell multi-frequency shimmer\n * - 'fire' — upward cellular-automata flame simulation\n * - 'dna' — double-helix strand scrolling with base-pair chars\n * - 'terrain' — scrolling ASCII side-scroll heightmap landscape\n * - 'circuit' — procedural PCB traces with traveling signal pulses\n */\n type?: 'wave' | 'rain' | 'stars' | 'pulse' | 'noise' | 'grid' | 'aurora' | 'silk' | 'void' | 'morph' | 'fire' | 'dna' | 'terrain' | 'circuit';\n /** CSS opacity applied to the canvas element (default: 0.2) */\n opacity?: number;\n /** Extra CSS class names added to the injected canvas */\n className?: string;\n /** z-index of the canvas (default: 0) */\n zIndex?: number;\n /**\n * Colour scheme handling (default: 'auto').\n * - 'auto' — follows system prefers-color-scheme and updates live\n * - 'dark' — always render bright chars on dark background\n * - 'light' — always render dark chars on light background\n */\n colorScheme?: 'auto' | 'light' | 'dark';\n /**\n * Custom character colour. Accepts any CSS colour string: hex, rgb(), hsl().\n * Overrides the default white/black for ASCII chars.\n * @example '#6b8700'\n */\n color?: string;\n}\n\n/**\n * Drop-in helper that mounts an interactive ASCII background onto any element.\n * Injects a canvas, wires DPR resize, mouse tracking, and the RAF loop.\n * Auto-detects light/dark mode and stays in sync if the system theme changes.\n *\n * Returns a `destroy()` function to clean everything up.\n *\n * @example\n * ```ts\n * // 1 line:\n * const { destroy } = asciiBackground('#hero', { opacity: 0.2 });\n *\n * // React — return destroy as cleanup:\n * useEffect(() => asciiBackground(ref.current).destroy, []);\n * ```\n */\nexport function asciiBackground(\n target: string | HTMLElement | null,\n options: AsciiBackgroundOptions = {},\n): { destroy: () => void } {\n const {\n type = 'wave',\n opacity = 0.2,\n className,\n zIndex = 0,\n colorScheme = 'auto',\n color,\n ...renderOpts\n } = options;\n\n const container = typeof target === 'string'\n ? (document.querySelector(target) as HTMLElement | null)\n : target;\n\n if (!container) {\n console.warn('[asciify] asciiBackground: target not found', target);\n return { destroy: () => {} };\n }\n\n const prevPosition = container.style.position;\n if (getComputedStyle(container).position === 'static') {\n container.style.position = 'relative';\n }\n\n const canvas = document.createElement('canvas');\n canvas.style.cssText = [\n 'position:absolute', 'inset:0', 'width:100%', 'height:100%',\n `opacity:${opacity}`, 'pointer-events:none', `z-index:${zIndex}`,\n ].join(';');\n if (className) canvas.className = className;\n container.prepend(canvas);\n\n const ctx = canvas.getContext('2d')!;\n const dpr = window.devicePixelRatio || 1;\n const mouse = { x: 0.5, y: 0.5 };\n const smoothMouse = { x: 0.5, y: 0.5 };\n\n // ── Color scheme ──\n const mq = window.matchMedia('(prefers-color-scheme: light)');\n const isLight = (): boolean => {\n if (colorScheme === 'light') return true;\n if (colorScheme === 'dark') return false;\n return mq.matches;\n };\n\n const parsedColor = color ? _parseColor(color) : null;\n\n type AnyRenderOpts =\n | WaveBackgroundOptions | RainBackgroundOptions | StarsBackgroundOptions\n | PulseBackgroundOptions | NoiseBackgroundOptions | GridBackgroundOptions\n | AuroraBackgroundOptions | SilkBackgroundOptions | VoidBackgroundOptions\n | MorphBackgroundOptions | FireBackgroundOptions | DnaBackgroundOptions\n | TerrainBackgroundOptions | CircuitBackgroundOptions;\n\n const buildWaveOpts = (): WaveBackgroundOptions => ({\n ...renderOpts,\n lightMode: renderOpts.lightMode !== undefined ? renderOpts.lightMode : isLight(),\n baseColor: parsedColor\n ? `rgba(${parsedColor.r},${parsedColor.g},${parsedColor.b},{a})`\n : (renderOpts as WaveBackgroundOptions).baseColor,\n });\n const buildRainOpts = (): RainBackgroundOptions => ({\n ...renderOpts,\n lightMode: renderOpts.lightMode !== undefined ? renderOpts.lightMode : isLight(),\n color: color ?? (renderOpts as RainBackgroundOptions).color,\n });\n const buildStarsOpts = (): StarsBackgroundOptions => ({\n ...renderOpts,\n lightMode: renderOpts.lightMode !== undefined ? renderOpts.lightMode : isLight(),\n color: color ?? (renderOpts as StarsBackgroundOptions).color,\n });\n const buildPulseOpts = (): PulseBackgroundOptions => ({\n ...renderOpts,\n lightMode: renderOpts.lightMode !== undefined ? renderOpts.lightMode : isLight(),\n color: color ?? (renderOpts as PulseBackgroundOptions).color,\n });\n const buildNoiseOpts = (): NoiseBackgroundOptions => ({\n ...renderOpts,\n lightMode: renderOpts.lightMode !== undefined ? renderOpts.lightMode : isLight(),\n color: color ?? (renderOpts as NoiseBackgroundOptions).color,\n });\n const buildGridOpts = (): GridBackgroundOptions => ({\n ...renderOpts,\n lightMode: renderOpts.lightMode !== undefined ? renderOpts.lightMode : isLight(),\n color: color ?? (renderOpts as GridBackgroundOptions).color,\n });\n const buildAuroraOpts = (): AuroraBackgroundOptions => ({\n ...renderOpts,\n lightMode: renderOpts.lightMode !== undefined ? renderOpts.lightMode : isLight(),\n color: color ?? (renderOpts as AuroraBackgroundOptions).color,\n });\n const buildSilkOpts = (): SilkBackgroundOptions => ({\n ...renderOpts,\n lightMode: renderOpts.lightMode !== undefined ? renderOpts.lightMode : isLight(),\n color: color ?? (renderOpts as SilkBackgroundOptions).color,\n });\n const buildVoidOpts = (): VoidBackgroundOptions => ({\n ...renderOpts,\n lightMode: renderOpts.lightMode !== undefined ? renderOpts.lightMode : isLight(),\n color: color ?? (renderOpts as VoidBackgroundOptions).color,\n });\n const buildMorphOpts = (): MorphBackgroundOptions => ({\n ...renderOpts,\n lightMode: renderOpts.lightMode !== undefined ? renderOpts.lightMode : isLight(),\n color: color ?? (renderOpts as MorphBackgroundOptions).color,\n });\n const buildFireOpts = (): FireBackgroundOptions => ({\n ...renderOpts,\n color: color ?? (renderOpts as FireBackgroundOptions).color,\n });\n const buildDnaOpts = (): DnaBackgroundOptions => ({\n ...renderOpts,\n color: color ?? (renderOpts as DnaBackgroundOptions).color,\n });\n const buildTerrainOpts = (): TerrainBackgroundOptions => ({\n ...renderOpts,\n color: color ?? (renderOpts as TerrainBackgroundOptions).color,\n lightMode: renderOpts.lightMode !== undefined ? renderOpts.lightMode : isLight(),\n });\n const buildCircuitOpts = (): CircuitBackgroundOptions => ({\n ...renderOpts,\n color: color ?? (renderOpts as CircuitBackgroundOptions).color,\n lightMode: renderOpts.lightMode !== undefined ? renderOpts.lightMode : isLight(),\n });\n\n const optsRef = { current: buildWaveOpts() as AnyRenderOpts };\n const rebuildOpts = () => {\n if (type === 'rain') optsRef.current = buildRainOpts();\n else if (type === 'stars') optsRef.current = buildStarsOpts();\n else if (type === 'pulse') optsRef.current = buildPulseOpts();\n else if (type === 'noise') optsRef.current = buildNoiseOpts();\n else if (type === 'grid') optsRef.current = buildGridOpts();\n else if (type === 'aurora') optsRef.current = buildAuroraOpts();\n else if (type === 'silk') optsRef.current = buildSilkOpts();\n else if (type === 'void') optsRef.current = buildVoidOpts();\n else if (type === 'morph') optsRef.current = buildMorphOpts();\n else if (type === 'fire') optsRef.current = buildFireOpts();\n else if (type === 'dna') optsRef.current = buildDnaOpts();\n else if (type === 'terrain') optsRef.current = buildTerrainOpts();\n else if (type === 'circuit') optsRef.current = buildCircuitOpts();\n else optsRef.current = buildWaveOpts();\n };\n rebuildOpts();\n\n const onSchemeChange = () => { rebuildOpts(); };\n if (colorScheme === 'auto') mq.addEventListener('change', onSchemeChange);\n\n const resize = () => {\n const r = container.getBoundingClientRect();\n canvas.width = r.width * dpr;\n canvas.height = r.height * dpr;\n ctx.setTransform(dpr, 0, 0, dpr, 0, 0);\n };\n resize();\n\n const onMouseMove = (e: MouseEvent) => {\n const r = container.getBoundingClientRect();\n mouse.x = (e.clientX - r.left) / r.width;\n mouse.y = (e.clientY - r.top) / r.height;\n };\n const ro = new ResizeObserver(resize);\n ro.observe(container);\n window.addEventListener('mousemove', onMouseMove);\n\n let time = 0;\n let raf = 0;\n const tick = () => {\n smoothMouse.x += (mouse.x - smoothMouse.x) * 0.07;\n smoothMouse.y += (mouse.y - smoothMouse.y) * 0.07;\n const r = container.getBoundingClientRect();\n\n if (type === 'rain') {\n renderRainBackground(ctx, r.width, r.height, time, optsRef.current as RainBackgroundOptions);\n } else if (type === 'stars') {\n renderStarsBackground(ctx, r.width, r.height, time, smoothMouse, optsRef.current as StarsBackgroundOptions);\n } else if (type === 'pulse') {\n renderPulseBackground(ctx, r.width, r.height, time, smoothMouse, optsRef.current as PulseBackgroundOptions);\n } else if (type === 'noise') {\n renderNoiseBackground(ctx, r.width, r.height, time, smoothMouse, optsRef.current as NoiseBackgroundOptions);\n } else if (type === 'grid') {\n renderGridBackground(ctx, r.width, r.height, time, smoothMouse, optsRef.current as GridBackgroundOptions);\n } else if (type === 'aurora') {\n renderAuroraBackground(ctx, r.width, r.height, time, smoothMouse, optsRef.current as AuroraBackgroundOptions);\n } else if (type === 'silk') {\n renderSilkBackground(ctx, r.width, r.height, time, optsRef.current as SilkBackgroundOptions);\n } else if (type === 'void') {\n renderVoidBackground(ctx, r.width, r.height, time, smoothMouse, optsRef.current as VoidBackgroundOptions);\n } else if (type === 'morph') {\n renderMorphBackground(ctx, r.width, r.height, time, optsRef.current as MorphBackgroundOptions);\n } else if (type === 'fire') {\n renderFireBackground(ctx, r.width, r.height, time, optsRef.current as FireBackgroundOptions);\n } else if (type === 'dna') {\n renderDnaBackground(ctx, r.width, r.height, time, optsRef.current as DnaBackgroundOptions);\n } else if (type === 'terrain') {\n renderTerrainBackground(ctx, r.width, r.height, time, optsRef.current as TerrainBackgroundOptions);\n } else if (type === 'circuit') {\n renderCircuitBackground(ctx, r.width, r.height, time, optsRef.current as CircuitBackgroundOptions);\n } else {\n renderWaveBackground(ctx, r.width, r.height, time, smoothMouse, optsRef.current as WaveBackgroundOptions);\n }\n\n time += 0.016;\n raf = requestAnimationFrame(tick);\n };\n raf = requestAnimationFrame(tick);\n\n return {\n destroy: () => {\n cancelAnimationFrame(raf);\n ro.disconnect();\n if (colorScheme === 'auto') mq.removeEventListener('change', onSchemeChange);\n window.removeEventListener('mousemove', onMouseMove);\n canvas.remove();\n container.style.position = prevPosition;\n },\n };\n}\n\n/** @deprecated Use `asciiBackground` instead. */\nexport const mountWaveBackground = asciiBackground;\n\n/** @deprecated Use `AsciiBackgroundOptions` instead. */\nexport type MountWaveOptions = AsciiBackgroundOptions;\n","/**\n * asciiText — pure string output (no canvas required).\n * Converts an image/video/canvas element to a plain-text ASCII string\n * suitable for server-side rendering, clipboard export, or terminal output.\n */\nimport type { AsciiOptions } from '../types';\nimport { DEFAULT_OPTIONS } from '../types';\nimport { imageToAsciiFrame } from './renderer';\n\n/**\n * Convert any image/video/canvas source to a plain multi-line string of ASCII.\n *\n * @example\n * ```ts\n * const text = asciiText(imgEl, { fontSize: 8, colorMode: 'grayscale' });\n * console.log(text);\n * ```\n *\n * @example SSR (Node/JSDOM)\n * ```ts\n * const { createCanvas, loadImage } = require('@napi-rs/canvas');\n * const img = await loadImage('./photo.jpg');\n * const canvas = createCanvas(img.width, img.height);\n * const ctx = canvas.getContext('2d');\n * ctx.drawImage(img, 0, 0);\n * const text = asciiText(canvas as unknown as HTMLCanvasElement, { fontSize: 10 });\n * ```\n */\nexport function asciiText(\n source: HTMLImageElement | HTMLVideoElement | HTMLCanvasElement,\n options: Partial<AsciiOptions> = {},\n targetWidth?: number,\n targetHeight?: number,\n): string {\n const opts: AsciiOptions = { ...DEFAULT_OPTIONS, ...options };\n const { frame, cols } = imageToAsciiFrame(source, opts, targetWidth, targetHeight);\n if (!frame.length || cols === 0) return '';\n\n const lines: string[] = [];\n for (const row of frame) {\n lines.push(row.map(cell => cell.char).join(''));\n }\n return lines.join('\\n');\n}\n\n/**\n * Convert any source to an ASCII string with ANSI 256-colour escape codes.\n * Works in any terminal that supports ANSI colours.\n *\n * @example\n * ```ts\n * process.stdout.write(asciiTextAnsi(imgEl, { fontSize: 8 }));\n * ```\n */\nexport function asciiTextAnsi(\n source: HTMLImageElement | HTMLVideoElement | HTMLCanvasElement,\n options: Partial<AsciiOptions> = {},\n targetWidth?: number,\n targetHeight?: number,\n): string {\n const opts: AsciiOptions = { ...DEFAULT_OPTIONS, ...options };\n const { frame, cols } = imageToAsciiFrame(source, opts, targetWidth, targetHeight);\n if (!frame.length || cols === 0) return '';\n\n const RESET = '\\x1b[0m';\n const lines: string[] = [];\n\n for (const row of frame) {\n let line = '';\n for (const cell of row) {\n if (cell.char === ' ' || cell.a < 10) {\n line += ' ';\n } else {\n // Truecolor ANSI: \\x1b[38;2;R;G;Bm\n line += `\\x1b[38;2;${cell.r};${cell.g};${cell.b}m${cell.char}${RESET}`;\n }\n }\n lines.push(line);\n }\n return lines.join('\\n');\n}\n","/**\n * record() — capture a rolling frame buffer from a running ASCII canvas\n * and export it as a downloadable animated GIF or WebP data URL.\n *\n * Usage:\n * ```ts\n * const recorder = createRecorder(canvasEl, { fps: 15, maxFrames: 120 });\n * recorder.start();\n * // ... after a few seconds ...\n * const dataUrl = await recorder.stop(); // 'data:image/gif;base64,...'\n * ```\n */\n\nexport interface RecorderOptions {\n /** Target capture frame rate (default: 15) */\n fps?: number;\n /** Maximum number of frames to buffer (default: 120 → 8 s at 15 fps) */\n maxFrames?: number;\n /**\n * Output format.\n * - 'gif' — animated GIF via gif.js worker (requires gif.worker.js in public/)\n * - 'webp' — animated WebP via MediaRecorder API (Chrome/Edge only)\n * - 'png-sequence' — returns a JSON array of PNG data URLs (universal)\n * Default: 'gif'\n */\n format?: 'gif' | 'webp' | 'png-sequence';\n /** GIF quality 1 (best) – 30 (smallest) — only used for format:'gif' (default: 10) */\n quality?: number;\n /**\n * Scale factor applied to the canvas before capture (default: 1).\n * Use 0.5 to halve dimensions and reduce file size.\n */\n scale?: number;\n}\n\nexport interface Recorder {\n /** Start capturing frames from the canvas. */\n start(): void;\n /**\n * Stop capturing and encode.\n * Resolves with a data URL (gif/webp) or JSON string (png-sequence).\n */\n stop(): Promise<string>;\n /** True while recording. */\n readonly isRecording: boolean;\n /** Number of frames captured so far. */\n readonly frameCount: number;\n}\n\n/**\n * Create a Recorder bound to a canvas element.\n */\nexport function createRecorder(\n canvas: HTMLCanvasElement,\n options: RecorderOptions = {},\n): Recorder {\n const {\n fps = 15,\n maxFrames = 120,\n format = 'gif',\n quality = 10,\n scale = 1,\n } = options;\n\n const interval = 1000 / fps;\n let recording = false;\n let timerId = -1;\n const blobs: string[] = []; // base64 PNG data URLs\n\n const captureFrame = () => {\n if (!recording || blobs.length >= maxFrames) return;\n let src: HTMLCanvasElement = canvas;\n if (scale !== 1) {\n const off = document.createElement('canvas');\n off.width = Math.round(canvas.width * scale);\n off.height = Math.round(canvas.height * scale);\n const offCtx = off.getContext('2d')!;\n offCtx.drawImage(canvas, 0, 0, off.width, off.height);\n src = off;\n }\n blobs.push(src.toDataURL('image/png'));\n };\n\n const encodeGif = async (frames: string[]): Promise<string> => {\n // gif.js must be loaded as a script in the page.\n // We use a dynamic import polyfill approach for the worker.\n return new Promise((resolve, reject) => {\n // @ts-ignore — GIF is a global injected by gif.js\n if (typeof GIF === 'undefined') {\n reject(new Error('[asciify recorder] gif.js not found. Add <script src=\"/gif.worker.js\"> to your page.'));\n return;\n }\n // @ts-ignore\n const gif = new GIF({\n workers: 2,\n quality,\n workerScript: '/gif.worker.js',\n });\n\n let loaded = 0;\n const total = frames.length;\n frames.forEach((dataUrl) => {\n const img = new Image();\n img.onload = () => {\n gif.addFrame(img, { delay: interval, copy: true });\n loaded++;\n if (loaded === total) gif.render();\n };\n img.src = dataUrl;\n });\n\n gif.on('finished', (blob: Blob) => {\n const reader = new FileReader();\n reader.onload = () => resolve(reader.result as string);\n reader.readAsDataURL(blob);\n });\n gif.on('error', reject);\n });\n };\n\n const encodeWebP = async (frames: string[], _fps: number): Promise<string> => {\n // Encode via canvas + MediaRecorder if available.\n if (typeof MediaRecorder === 'undefined') {\n throw new Error('[asciify recorder] MediaRecorder not available in this browser.');\n }\n const off = document.createElement('canvas');\n if (frames.length === 0) return '';\n const probe = new Image();\n await new Promise<void>((res) => { probe.onload = () => res(); probe.src = frames[0]; });\n off.width = probe.naturalWidth;\n off.height = probe.naturalHeight;\n const offCtx = off.getContext('2d')!;\n\n const stream = off.captureStream(_fps);\n const recorder = new MediaRecorder(stream, { mimeType: 'video/webm;codecs=vp9' });\n const chunks: BlobPart[] = [];\n recorder.ondataavailable = (e) => chunks.push(e.data);\n\n return new Promise((resolve, reject) => {\n recorder.onstop = () => {\n const blob = new Blob(chunks, { type: 'video/webm' });\n const reader = new FileReader();\n reader.onload = () => resolve(reader.result as string);\n reader.readAsDataURL(blob);\n };\n recorder.onerror = reject;\n recorder.start();\n\n let idx = 0;\n const drawNext = () => {\n if (idx >= frames.length) { recorder.stop(); return; }\n const img = new Image();\n img.onload = () => {\n offCtx.drawImage(img, 0, 0);\n idx++;\n setTimeout(drawNext, interval);\n };\n img.src = frames[idx];\n };\n drawNext();\n });\n };\n\n return {\n get isRecording() { return recording; },\n get frameCount() { return blobs.length; },\n\n start() {\n if (recording) return;\n blobs.length = 0;\n recording = true;\n timerId = window.setInterval(captureFrame, interval);\n },\n\n async stop(): Promise<string> {\n if (!recording) return '';\n recording = false;\n clearInterval(timerId);\n\n const frames = blobs.slice();\n\n if (format === 'png-sequence') {\n return JSON.stringify(frames);\n }\n if (format === 'webp') {\n return encodeWebP(frames, fps);\n }\n // default: gif\n return encodeGif(frames);\n },\n };\n}\n\n/**\n * Convenience: record for a fixed duration and auto-download.\n *\n * @example\n * ```ts\n * await recordAndDownload(canvasEl, 3000, { fps: 15, format: 'gif' });\n * ```\n */\nexport async function recordAndDownload(\n canvas: HTMLCanvasElement,\n durationMs: number,\n options: RecorderOptions & { filename?: string } = {},\n): Promise<void> {\n const { filename = 'asciify-recording', ...recOpts } = options;\n const recorder = createRecorder(canvas, recOpts);\n recorder.start();\n await new Promise<void>((res) => setTimeout(res, durationMs));\n const dataUrl = await recorder.stop();\n\n const ext = options.format === 'webp' ? 'webm'\n : options.format === 'png-sequence' ? 'json'\n : 'gif';\n const a = document.createElement('a');\n a.href = dataUrl;\n a.download = `${filename}.${ext}`;\n a.click();\n}\n","// ─── Asciify WebGL Renderer ───────────────────────────────────────\n// GPU-accelerated drop-in replacement for renderFrameToCanvas.\n// All cells rendered in ONE instanced draw call per frame.\n// Animation + hover effects computed entirely in GLSL shaders.\n// No glyph atlas — uses solid rect/dots per cell (matches Canvas2D fillRect fast path).\n// Falls back gracefully to null if WebGL2 is unavailable.\n\nimport type { AsciiFrame, AsciiOptions } from './types';\n\n// ─── Types ────────────────────────────────────────────────────────\n\nexport interface WebGLRenderer {\n render(\n frame: AsciiFrame,\n options: AsciiOptions,\n displayW: number,\n displayH: number,\n time: number,\n hoverPos?: { x: number; y: number; intensity?: number } | null\n ): void;\n /** Call when options or the source frame has changed to invalidate cell data cache. */\n notifyDirty(): void;\n destroy(): void;\n}\n\n// ─── Vertex Shader ────────────────────────────────────────────────\n// One instance = one cell. Position, animation, hover, color all computed on GPU.\n// Cell data arrives as a single RGBA8 texture:\n// .rgb = cell color (normalized 0-1)\n// .a = char weight (0=space/invisible … 1=densest char, fully opaque)\n\nconst VERT_SRC = /* glsl */`#version 300 es\nprecision highp float;\nprecision highp int;\n\n// Unit quad corners: (-0.5,-0.5) to (0.5,0.5) - TRIANGLE_STRIP, 4 verts\nin vec2 a_corner;\n\n// Layout\nuniform vec2 u_canvasSize;\nuniform vec2 u_gridSize;\nuniform vec2 u_cellSize;\n\n// Animation\nuniform float u_time;\nuniform float u_animSpeed;\nuniform int u_animStyle;\n\n// Color\nuniform int u_colorMode;\nuniform vec3 u_accentColor;\nuniform int u_invert;\n\n// Hover\nuniform float u_hoverStrength;\nuniform float u_hoverIntensity;\nuniform vec2 u_hoverPos;\nuniform float u_hoverRadius;\nuniform int u_hoverEffect;\nuniform vec3 u_hoverColor;\n\n// Render mode: 0=rect 1=dots\nuniform int u_renderMode;\nuniform float u_dotSizeRatio;\n\n// Cell data: RGBA8 texture (cols x rows)\n// rgb = cell colour, a = source alpha\nuniform sampler2D u_cellTex;\n\nout vec4 v_color;\nout float v_alpha;\nout vec2 v_localUv;\n\n#define PI 3.141592653589793\n\nfloat ss(float t) { return t * t * (3.0 - 2.0 * t); }\n\nfloat getAnim(float nx, float ny, float cx, float cy, float t) {\n if (u_animStyle == 0) return 1.0;\n if (u_animStyle == 1) { // wave\n return 0.3 + 0.7 * (sin(nx * PI * 4.0 + t * 3.0) * 0.3 + 0.5\n + sin(ny * PI * 3.0 + t * 2.0) * 0.2);\n }\n if (u_animStyle == 2) { // pulse\n float d = length(vec2(nx - 0.5, ny - 0.5)) * 1.41421;\n return 0.2 + 0.8 * (sin(d * PI * 6.0 - t * 4.0) * 0.5 + 0.5);\n }\n if (u_animStyle == 3) { // rain\n float drop = sin(ny * PI * 8.0 - t * 5.0 + cx * 0.3) * 0.5 + 0.5;\n return 0.1 + 0.9 * drop * (sin(nx * PI * 2.0 + t) * 0.3 + 0.7);\n }\n if (u_animStyle == 4) { // breathe\n return clamp(sin(t * 2.0) * 0.3 + 0.7 + sin((cx + cy) * 0.1 + t) * 0.1, 0.1, 1.0);\n }\n if (u_animStyle == 5) { // sparkle\n float sp = fract(sin(cx * 127.1 + cy * 311.7 + floor(t * 8.0) * 43758.5453) * 43758.5453);\n return sp > 0.7 ? 1.0 : 0.15 + sp * 0.4;\n }\n if (u_animStyle == 6) { // glitch\n float band = floor(cy / max(1.0, u_gridSize.y * 0.05));\n float gv = fract(sin(band * 43.23 + floor(t * 6.0) * 17.89) * 43758.5453);\n if (gv > 0.85) { float fl = sin(t * 30.0 + band) * 0.5 + 0.5; return fl < 0.3 ? 0.0 : fl; }\n return 1.0;\n }\n if (u_animStyle == 7) { // spiral\n float angle = atan(ny - 0.5, nx - 0.5);\n float dist = length(vec2(nx - 0.5, ny - 0.5)) * 1.41421;\n return 0.15 + 0.85 * (sin(angle * 3.0 + dist * PI * 8.0 - t * 3.0) * 0.5 + 0.5);\n }\n if (u_animStyle == 8) { // typewriter\n float reveal = fract(t * 0.5) * u_gridSize.x * u_gridSize.y * 1.3;\n float dist = cy * u_gridSize.x + cx - reveal;\n if (dist > 0.0) return 0.0;\n return clamp(1.0 + dist / (u_gridSize.x * u_gridSize.y * 0.15), 0.0, 1.0);\n }\n if (u_animStyle == 9) { // scatter\n float d = length(vec2(nx - 0.5, ny - 0.5)) * 1.41421;\n float phase = sin(t * 1.5) * 0.5 + 0.5;\n if (d > phase) return max(0.0, 1.0 - (d - phase) * 3.0);\n return 0.7 + 0.3 * sin(d * 10.0 - t * 2.0);\n }\n return 1.0;\n}\n\nvec3 applyColorMode(vec3 rgb) {\n float lum = dot(rgb, vec3(0.299, 0.587, 0.114));\n if (u_colorMode == 0) return vec3(lum);\n if (u_colorMode == 2) return vec3(0.0, lum, 0.0);\n if (u_colorMode == 3) return lum * u_accentColor;\n return rgb;\n}\n\nvoid main() {\n int cols = int(u_gridSize.x);\n int rows = int(u_gridSize.y);\n int cx = gl_InstanceID % cols;\n int cy = gl_InstanceID / cols;\n\n float fnx = (float(cx) + 0.5) / float(cols);\n float fny = (float(cy) + 0.5) / float(rows);\n\n // Sample cell data\n vec4 cell = texture(u_cellTex, vec2(fnx, fny));\n // cell.rgb = colour, cell.a = source alpha (0=transparent, 1=opaque)\n\n // Invisible cells (fully transparent source pixel)\n if (cell.a < 0.004) {\n gl_Position = vec4(2.0, 2.0, 0.0, 1.0); v_alpha = 0.0; return;\n }\n\n // Char weight: 0=dark/space .. 1=dense/bright (luminance, matches luminanceToChar ordering)\n float charW = dot(cell.rgb, vec3(0.299, 0.587, 0.114));\n\n float cellW = u_cellSize.x;\n float cellH = u_cellSize.y;\n\n // Animation\n float t = u_time * u_animSpeed;\n float am = getAnim(fnx, fny, float(cx), float(cy), t);\n if (am < 0.04) {\n gl_Position = vec4(2.0, 2.0, 0.0, 1.0); v_alpha = 0.0; return;\n }\n\n // Hover\n float hoverScale = 1.0;\n vec2 hoverOff = vec2(0.0);\n float hoverGlow = 0.0;\n float hoverBlend = 0.0;\n\n if (u_hoverStrength > 0.0 && u_hoverIntensity > 0.005) {\n vec2 d = vec2(fnx - u_hoverPos.x, fny - u_hoverPos.y);\n float r = 0.08 + u_hoverRadius * 0.35 + u_hoverStrength * 0.04;\n float dist = length(d);\n if (dist < r) {\n float tv = 1.0 - dist / r;\n float e = ss(tv) * u_hoverIntensity;\n if (u_hoverEffect == 0) { // spotlight\n hoverScale = 1.0 + e * u_hoverStrength * 1.8;\n float ang = atan(d.y, d.x);\n hoverOff = vec2(cos(ang), sin(ang)) * e * e * u_hoverStrength * 0.6 * vec2(cellW, cellH);\n hoverGlow = e * u_hoverStrength * 0.4;\n hoverBlend = e * e * u_hoverStrength * 0.25;\n } else if (u_hoverEffect == 1) { // magnify\n hoverScale = 1.0 + e * u_hoverStrength * 2.5;\n hoverGlow = e * u_hoverStrength * 0.15;\n } else if (u_hoverEffect == 2) { // repel\n hoverScale = 1.0 + e * u_hoverStrength * 0.3;\n float ang = atan(d.y, d.x);\n hoverOff = vec2(cos(ang), sin(ang)) * e * e * u_hoverStrength * 1.2 * vec2(cellW, cellH);\n } else if (u_hoverEffect == 3) { // glow\n hoverGlow = e * u_hoverStrength * 0.8;\n hoverBlend = e * u_hoverStrength * 0.4;\n } else { // colorShift\n hoverScale = 1.0 + e * u_hoverStrength * 0.4;\n hoverGlow = e * u_hoverStrength * 0.2;\n hoverBlend = e * u_hoverStrength * 0.7;\n }\n }\n }\n\n // Final colour\n vec3 rgb = (u_invert == 1) ? (1.0 - cell.rgb) : cell.rgb;\n vec3 baseColor = applyColorMode(rgb);\n v_color = vec4(mix(baseColor, u_hoverColor, hoverBlend), 1.0);\n\n // Quad size & alpha\n vec2 quadSize;\n float finalAlpha;\n\n if (u_renderMode == 1) { // dots: radius driven by char weight (bright=big dot)\n float maxR = min(cellW, cellH) * 0.5 * u_dotSizeRatio;\n float radius = maxR * charW * am * hoverScale;\n if (radius < 0.3) { gl_Position = vec4(2.0, 2.0, 0.0, 1.0); v_alpha = 0.0; return; }\n quadSize = vec2(radius * 2.0);\n finalAlpha = min(1.0, cell.a * am * (1.0 + hoverGlow));\n } else { // rect: size proportional to luminance — dark=tiny, bright=full (ASCII density look)\n if (charW < 0.01) { gl_Position = vec4(2.0, 2.0, 0.0, 1.0); v_alpha = 0.0; return; }\n quadSize = vec2(cellW * charW * hoverScale, cellH * charW * hoverScale);\n finalAlpha = min(1.0, am * (1.0 + hoverGlow));\n }\n\n v_alpha = finalAlpha;\n v_localUv = a_corner;\n\n // NDC position (Y flipped: WebGL bottom-up, canvas top-down)\n float px = float(cx) * cellW + cellW * 0.5 + hoverOff.x;\n float py = float(cy) * cellH + cellH * 0.5 + hoverOff.y;\n vec2 pos = vec2(px, py) + a_corner * quadSize;\n vec2 ndc = pos / u_canvasSize * 2.0 - 1.0;\n ndc.y = -ndc.y;\n gl_Position = vec4(ndc, 0.0, 1.0);\n}\n`;\n\n// ─── Fragment Shader ──────────────────────────────────────────────\n\nconst FRAG_SRC = /* glsl */`#version 300 es\nprecision mediump float;\nprecision highp int;\n\nin vec4 v_color;\nin float v_alpha;\nin vec2 v_localUv;\n\nuniform int u_renderMode;\n\nout vec4 outColor;\n\nvoid main() {\n if (v_alpha < 0.01) discard;\n if (u_renderMode == 1) {\n // Dots: circle SDF clip\n if (length(v_localUv) > 0.5) discard;\n }\n outColor = vec4(v_color.rgb, v_alpha);\n}\n`;\n\n// ─── WebGL Helpers ────────────────────────────────────────────────\n\nfunction compileShader(gl: WebGL2RenderingContext, type: number, src: string): WebGLShader {\n const sh = gl.createShader(type)!;\n gl.shaderSource(sh, src);\n gl.compileShader(sh);\n if (!gl.getShaderParameter(sh, gl.COMPILE_STATUS)) {\n const info = gl.getShaderInfoLog(sh) ?? 'unknown';\n gl.deleteShader(sh);\n throw new Error(`Shader compile error: ${info}`);\n }\n return sh;\n}\n\nfunction linkProgram(gl: WebGL2RenderingContext, vert: WebGLShader, frag: WebGLShader): WebGLProgram {\n const prog = gl.createProgram()!;\n gl.attachShader(prog, vert);\n gl.attachShader(prog, frag);\n gl.linkProgram(prog);\n if (!gl.getProgramParameter(prog, gl.LINK_STATUS)) {\n const info = gl.getProgramInfoLog(prog) ?? 'unknown';\n gl.deleteProgram(prog);\n throw new Error(`Program link error: ${info}`);\n }\n return prog;\n}\n\nfunction makeTexture(gl: WebGL2RenderingContext, filter: number = gl.NEAREST): WebGLTexture {\n const t = gl.createTexture()!;\n gl.bindTexture(gl.TEXTURE_2D, t);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, filter);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, filter);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n return t;\n}\n\n// ─── Animation / color / hover index maps ────────────────────────\nconst ANIM_STYLES = ['none','wave','pulse','rain','breathe','sparkle','glitch','spiral','typewriter','scatter','waveField','ripple','melt','orbit','cellular'] as const;\nconst HOVER_EFFECTS = ['spotlight','magnify','repel','glow','colorShift','attract','shatter','trail'] as const;\nconst COLOR_MODES = ['grayscale','fullcolor','matrix','accent'] as const;\n\n// ─── Main Factory ─────────────────────────────────────────────────\n\n/**\n * Try to create a WebGL2 renderer for the given canvas.\n * Returns null if WebGL2 is unavailable (caller can then use Canvas2D).\n * On setup failure after context is claimed, returns a stub that clears to dark.\n */\nexport function tryCreateWebGLRenderer(canvas: HTMLCanvasElement): WebGLRenderer | null {\n const glOrNull = canvas.getContext('webgl2', {\n alpha: true,\n antialias: false,\n premultipliedAlpha: false,\n preserveDrawingBuffer: false,\n }) as WebGL2RenderingContext | null;\n\n if (!glOrNull) return null;\n const gl: WebGL2RenderingContext = glOrNull; // non-null, stable in closures\n\n try {\n // ─── Compile shaders ─────────────────────────────────────────\n const vert = compileShader(gl, gl.VERTEX_SHADER, VERT_SRC);\n const frag = compileShader(gl, gl.FRAGMENT_SHADER, FRAG_SRC);\n const prog = linkProgram(gl, vert, frag);\n gl.deleteShader(vert);\n gl.deleteShader(frag);\n\n // ─── VAO: unit quad (TRIANGLE_STRIP, 4 vertices) ─────────────\n const vao = gl.createVertexArray()!;\n gl.bindVertexArray(vao);\n\n const corners = new Float32Array([-0.5,-0.5, 0.5,-0.5, -0.5,0.5, 0.5,0.5]);\n const vbo = gl.createBuffer()!;\n gl.bindBuffer(gl.ARRAY_BUFFER, vbo);\n gl.bufferData(gl.ARRAY_BUFFER, corners, gl.STATIC_DRAW);\n\n const aCorner = gl.getAttribLocation(prog, 'a_corner');\n gl.enableVertexAttribArray(aCorner);\n gl.vertexAttribPointer(aCorner, 2, gl.FLOAT, false, 0, 0);\n\n gl.bindVertexArray(null);\n\n // ─── Single cell data texture (RGBA8: rgb=colour, a=charWeight 0-255) ─\n const cellTex = makeTexture(gl);\n\n // ─── Cached uniform locations ─────────────────────────────────\n const g = (n: string) => gl.getUniformLocation(prog, n)!;\n const u = {\n canvasSize: g('u_canvasSize'),\n gridSize: g('u_gridSize'),\n cellSize: g('u_cellSize'),\n time: g('u_time'),\n animSpeed: g('u_animSpeed'),\n animStyle: g('u_animStyle'),\n colorMode: g('u_colorMode'),\n accentColor: g('u_accentColor'),\n invert: g('u_invert'),\n hoverStrength: g('u_hoverStrength'),\n hoverIntensity:g('u_hoverIntensity'),\n hoverPos: g('u_hoverPos'),\n hoverRadius: g('u_hoverRadius'),\n hoverEffect: g('u_hoverEffect'),\n hoverColor: g('u_hoverColor'),\n renderMode: g('u_renderMode'),\n dotSizeRatio: g('u_dotSizeRatio'),\n cellTexU: g('u_cellTex'),\n };\n\n // ─── State ────────────────────────────────────────────────────\n let lastCols = 0;\n let lastRows = 0;\n let cellBuf = new Uint8Array(0); // rgba: rgb=colour, a=sourceAlpha\n let cellDataDirty = true;\n\n gl.enable(gl.BLEND);\n gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);\n\n // ─── Render ───────────────────────────────────────────────────\n function render(\n frame: AsciiFrame,\n options: AsciiOptions,\n displayW: number,\n displayH: number,\n time: number,\n hoverPos?: { x: number; y: number; intensity?: number } | null\n ): void {\n const rows = frame.length;\n if (rows === 0) return;\n const cols = frame[0].length;\n if (cols === 0) return;\n\n gl.viewport(0, 0, gl.canvas.width, gl.canvas.height);\n\n // Clear to dark or transparent based on source alpha\n let hasTransparency = false;\n const sy = Math.max(1, rows >> 2), sx = Math.max(1, cols >> 2);\n outer: for (let iy = 0; iy < rows; iy += sy)\n for (let ix = 0; ix < cols; ix += sx)\n if (frame[iy][ix].a < 200) { hasTransparency = true; break outer; }\n gl.clearColor(hasTransparency ? 0 : 0.0392,\n hasTransparency ? 0 : 0.0392,\n hasTransparency ? 0 : 0.0392,\n hasTransparency ? 0 : 1.0);\n gl.clear(gl.COLOR_BUFFER_BIT);\n\n // Re-allocate cell buffer when grid changes\n if (cols !== lastCols || rows !== lastRows) {\n cellBuf = new Uint8Array(cols * rows * 4);\n lastCols = cols;\n lastRows = rows;\n cellDataDirty = true;\n }\n\n // Upload cell data (rgb = colour, a = char weight 0-255)\n if (cellDataDirty) {\n for (let y = 0; y < rows; y++) {\n const row = frame[y];\n for (let x = 0; x < cols; x++) {\n const cell = row[x];\n const i = (y * cols + x) * 4;\n cellBuf[i] = cell.r;\n cellBuf[i + 1] = cell.g;\n cellBuf[i + 2] = cell.b;\n // alpha channel = source alpha (used for transparency masking in shader)\n cellBuf[i + 3] = cell.a;\n }\n }\n gl.activeTexture(gl.TEXTURE0);\n gl.bindTexture(gl.TEXTURE_2D, cellTex);\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, cols, rows, 0,\n gl.RGBA, gl.UNSIGNED_BYTE, cellBuf);\n cellDataDirty = false;\n }\n\n gl.activeTexture(gl.TEXTURE0);\n gl.bindTexture(gl.TEXTURE_2D, cellTex);\n\n gl.useProgram(prog);\n gl.bindVertexArray(vao);\n\n const cellW = displayW / cols;\n const cellH = displayH / rows;\n\n gl.uniform2f(u.canvasSize, displayW, displayH);\n gl.uniform2f(u.gridSize, cols, rows);\n gl.uniform2f(u.cellSize, cellW, cellH);\n gl.uniform1f(u.time, time);\n gl.uniform1f(u.animSpeed, options.animationSpeed);\n gl.uniform1i(u.animStyle, ANIM_STYLES.indexOf(options.animationStyle));\n gl.uniform1i(u.colorMode, COLOR_MODES.indexOf(options.colorMode));\n\n const acHex = (options.accentColor || '#ffffff').replace('#', '');\n gl.uniform3f(u.accentColor,\n parseInt(acHex.slice(0, 2), 16) / 255,\n parseInt(acHex.slice(2, 4), 16) / 255,\n parseInt(acHex.slice(4, 6), 16) / 255);\n gl.uniform1i(u.invert, options.invert ? 1 : 0);\n\n const totalCells = rows * cols;\n const animActive = options.animationStyle !== 'none';\n const suppressHover = animActive && totalCells > 5_000;\n const hoverActive = !suppressHover && !!hoverPos && options.hoverStrength > 0;\n const radiusScale = totalCells > 30_000 ? 0.25\n : totalCells > 15_000 ? 0.4\n : totalCells > 5_000 ? 0.6 : 1;\n\n gl.uniform1f(u.hoverStrength, hoverActive ? options.hoverStrength : 0);\n gl.uniform1f(u.hoverIntensity, hoverActive ? (hoverPos?.intensity ?? 0) : 0);\n gl.uniform2f(u.hoverPos, hoverPos?.x ?? 0.5, hoverPos?.y ?? 0.5);\n gl.uniform1f(u.hoverRadius, options.hoverRadius * radiusScale);\n gl.uniform1i(u.hoverEffect, HOVER_EFFECTS.indexOf(options.hoverEffect));\n const hc = options.hoverColor || '#ffffff';\n gl.uniform3f(u.hoverColor,\n parseInt(hc.slice(1, 3), 16) / 255,\n parseInt(hc.slice(3, 5), 16) / 255,\n parseInt(hc.slice(5, 7), 16) / 255);\n\n gl.uniform1i(u.renderMode, options.renderMode === 'dots' ? 1 : 0);\n gl.uniform1f(u.dotSizeRatio, options.dotSizeRatio);\n gl.uniform1i(u.cellTexU, 0);\n\n gl.drawArraysInstanced(gl.TRIANGLE_STRIP, 0, 4, cols * rows);\n gl.bindVertexArray(null);\n }\n\n return {\n render,\n notifyDirty() { cellDataDirty = true; },\n destroy() {\n gl.deleteProgram(prog);\n gl.deleteVertexArray(vao);\n gl.deleteBuffer(vbo);\n gl.deleteTexture(cellTex);\n },\n };\n\n } catch (err) {\n console.error('[asciify] WebGL renderer setup FAILED (returning stub):', err);\n const stub: WebGLRenderer = {\n render() {\n try { gl.clearColor(0.039, 0.039, 0.039, 1); gl.clear(gl.COLOR_BUFFER_BIT); } catch { /* */ }\n },\n notifyDirty() {},\n destroy() {},\n };\n return stub;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/types.ts","../src/core/utils.ts","../src/core/animation.ts","../src/backgrounds/_shared.ts","../src/backgrounds/wave.ts","../src/core/renderer.ts","../src/core/embed-gen.ts","../src/core/simple-api.ts","../src/backgrounds/rain.ts","../src/backgrounds/stars.ts","../src/backgrounds/pulse.ts","../src/backgrounds/noise.ts","../src/backgrounds/grid.ts","../src/backgrounds/aurora.ts","../src/backgrounds/silk.ts","../src/backgrounds/void.ts","../src/backgrounds/morph.ts","../src/backgrounds/fire.ts","../src/backgrounds/dna.ts","../src/backgrounds/terrain.ts","../src/backgrounds/circuit.ts","../src/backgrounds/index.ts","../src/core/ascii-text.ts","../src/core/record.ts","../src/webgl-engine.ts"],"names":["fade","parseGIF","decompressFrames","alpha","render"],"mappings":";;;;;AAeO,IAAM,cAAA,GAAiG;AAAA,EAC5G,OAAA,EAAY,EAAE,IAAA,EAAM,SAAA,EAAc,QAAQ,SAAA,EAAW,EAAA,EAAI,SAAA,EAAW,EAAA,EAAI,SAAA,EAAU;AAAA,EAClF,OAAA,EAAY,EAAE,IAAA,EAAM,SAAA,EAAa,QAAQ,SAAA,EAAW,EAAA,EAAI,SAAA,EAAW,EAAA,EAAI,SAAA,EAAU;AAAA,EACjF,IAAA,EAAY,EAAE,IAAA,EAAM,MAAA,EAAa,QAAQ,SAAA,EAAW,EAAA,EAAI,SAAA,EAAW,EAAA,EAAI,SAAA,EAAU;AAAA,EACjF,UAAA,EAAY,EAAE,IAAA,EAAM,YAAA,EAAa,QAAQ,SAAA,EAAW,EAAA,EAAI,SAAA,EAAW,EAAA,EAAI,SAAA,EAAU;AAAA,EACjF,SAAA,EAAY,EAAE,IAAA,EAAM,WAAA,EAAa,QAAQ,SAAA,EAAW,EAAA,EAAI,SAAA,EAAW,EAAA,EAAI,SAAA,EAAU;AAAA,EACjF,OAAA,EAAY,EAAE,IAAA,EAAM,SAAA,EAAa,QAAQ,SAAA,EAAW,EAAA,EAAI,SAAA,EAAW,EAAA,EAAI,SAAA;AACzE;AA0CO,IAAM,QAAA,GAAW;AAAA,EACtB,QAAA,EAAU,YAAA;AAAA,EACV,MAAA,EAAQ,2BAAA;AAAA,EACR,OAAA,EAAS,MAAA;AAAA,EACT,KAAA,EAAO,wEAAA;AAAA,EACP,MAAA,EAAQ,IAAA;AAAA,EACR,IAAA,EAAM,mDAAA;AAAA,EACN,OAAA,EAAS,sDAAA;AAAA,EACT,UAAA,EAAY,+JAAA;AAAA,EACZ,GAAA,EAAK,iCAAA;AAAA,EACL,KAAA,EAAO,uCAAA;AAAA,EACP,OAAA,EAAS,6yBAAA;AAAA,EACT,QAAA,EAAU,6UAAA;AAAA,EACV,OAAA,EAAS,6CAAA;AAAA,EACT,KAAA,EAAO;AACT;AAOO,IAAM,iBAAA,GAA6D;AAAA,EACxE,OAAA,EAAS;AAAA,IACP,UAAA,EAAY,OAAA;AAAA,IACZ,SAAS,QAAA,CAAS,QAAA;AAAA,IAClB,SAAA,EAAW;AAAA,GACb;AAAA,EACA,SAAA,EAAW;AAAA,IACT,UAAA,EAAY,MAAA;AAAA,IACZ,SAAA,EAAW,WAAA;AAAA,IACX,YAAA,EAAc;AAAA,GAChB;AAAA,EACA,OAAA,EAAS;AAAA,IACP,UAAA,EAAY,OAAA;AAAA,IACZ,SAAS,QAAA,CAAS,OAAA;AAAA,IAClB,SAAA,EAAW;AAAA,GACb;AAAA,EACA,UAAA,EAAY;AAAA,IACV,UAAA,EAAY,OAAA;AAAA,IACZ,SAAS,QAAA,CAAS,UAAA;AAAA,IAClB,SAAA,EAAW,QAAA;AAAA,IACX,WAAA,EAAa;AAAA,GACf;AAAA,EACA,GAAA,EAAK;AAAA,IACH,UAAA,EAAY,OAAA;AAAA,IACZ,SAAS,QAAA,CAAS,KAAA;AAAA,IAClB,SAAA,EAAW;AAAA,GACb;AAAA,EACA,QAAA,EAAU;AAAA,IACR,UAAA,EAAY,OAAA;AAAA,IACZ,SAAS,QAAA,CAAS,QAAA;AAAA,IAClB,SAAA,EAAW;AAAA,GACb;AAAA,EACA,GAAA,EAAK;AAAA,IACH,UAAA,EAAY,OAAA;AAAA,IACZ,SAAS,QAAA,CAAS,GAAA;AAAA,IAClB,SAAA,EAAW;AAAA,GACb;AAAA,EACA,KAAA,EAAO;AAAA,IACL,UAAA,EAAY,OAAA;AAAA,IACZ,SAAS,QAAA,CAAS,KAAA;AAAA,IAClB,SAAA,EAAW;AAAA,GACb;AAAA,EACA,OAAA,EAAS;AAAA,IACP,UAAA,EAAY,OAAA;AAAA,IACZ,SAAS,QAAA,CAAS,OAAA;AAAA,IAClB,SAAA,EAAW;AAAA,GACb;AAAA,EACA,QAAA,EAAU;AAAA,IACR,UAAA,EAAY,OAAA;AAAA,IACZ,SAAS,QAAA,CAAS,QAAA;AAAA,IAClB,SAAA,EAAW;AAAA,GACb;AAAA,EACA,OAAA,EAAS;AAAA,IACP,UAAA,EAAY,OAAA;AAAA,IACZ,SAAS,QAAA,CAAS,OAAA;AAAA,IAClB,SAAA,EAAW,QAAA;AAAA,IACX,WAAA,EAAa;AAAA,GACf;AAAA,EACA,KAAA,EAAO;AAAA,IACL,UAAA,EAAY,OAAA;AAAA,IACZ,SAAS,QAAA,CAAS,KAAA;AAAA,IAClB,SAAA,EAAW;AAAA;AAEf;AAEO,IAAM,eAAA,GAAgC;AAAA,EAC3C,QAAA,EAAU,EAAA;AAAA,EACV,WAAA,EAAa,CAAA;AAAA,EACb,UAAA,EAAY,CAAA;AAAA,EACZ,QAAA,EAAU,CAAA;AAAA,EACV,SAAS,QAAA,CAAS,QAAA;AAAA,EAClB,SAAA,EAAW,WAAA;AAAA,EACX,WAAA,EAAa,SAAA;AAAA,EACb,MAAA,EAAQ,KAAA;AAAA,EACR,UAAA,EAAY,OAAA;AAAA,EACZ,cAAA,EAAgB,MAAA;AAAA,EAChB,cAAA,EAAgB,CAAA;AAAA,EAChB,YAAA,EAAc,GAAA;AAAA,EACd,cAAA,EAAgB,CAAA;AAAA,EAChB,aAAA,EAAe,CAAA;AAAA,EACf,WAAA,EAAa,GAAA;AAAA,EACb,WAAA,EAAa,WAAA;AAAA,EACb,UAAA,EAAY,SAAA;AAAA,EACZ,QAAA,EAAU,SAAA;AAAA,EACV,UAAA,EAAY;AACd;AAKO,IAAM,aAAA,GAAwF;AAAA,EACnG,IAAA,EAAM;AAAA,IACJ,KAAA,EAAO,KAAA;AAAA,IACP,OAAA,EAAS,EAAE,aAAA,EAAe,CAAA,EAAG,aAAa,WAAA,EAAa,WAAA,EAAa,GAAA,EAAK,UAAA,EAAY,SAAA;AAAU,GACjG;AAAA,EACA,MAAA,EAAQ;AAAA,IACN,KAAA,EAAO,QAAA;AAAA,IACP,OAAA,EAAS,EAAE,aAAA,EAAe,IAAA,EAAM,aAAa,MAAA,EAAQ,WAAA,EAAa,IAAA,EAAM,UAAA,EAAY,SAAA;AAAU,GAChG;AAAA,EACA,UAAA,EAAY;AAAA,IACV,KAAA,EAAO,YAAA;AAAA,IACP,OAAA,EAAS,EAAE,aAAA,EAAe,GAAA,EAAK,aAAa,WAAA,EAAa,WAAA,EAAa,IAAA,EAAM,UAAA,EAAY,SAAA;AAAU,GACpG;AAAA,EACA,SAAA,EAAW;AAAA,IACT,KAAA,EAAO,WAAA;AAAA,IACP,OAAA,EAAS,EAAE,aAAA,EAAe,GAAA,EAAK,aAAa,SAAA,EAAW,WAAA,EAAa,IAAA,EAAM,UAAA,EAAY,SAAA;AAAU,GAClG;AAAA,EACA,UAAA,EAAY;AAAA,IACV,KAAA,EAAO,aAAA;AAAA,IACP,OAAA,EAAS,EAAE,aAAA,EAAe,GAAA,EAAK,aAAa,OAAA,EAAS,WAAA,EAAa,IAAA,EAAM,UAAA,EAAY,SAAA;AAAU,GAChG;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,KAAA,EAAO,MAAA;AAAA,IACP,OAAA,EAAS,EAAE,aAAA,EAAe,GAAA,EAAK,aAAa,YAAA,EAAc,WAAA,EAAa,IAAA,EAAM,UAAA,EAAY,SAAA;AAAU,GACrG;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,KAAA,EAAO,MAAA;AAAA,IACP,OAAA,EAAS,EAAE,aAAA,EAAe,GAAA,EAAK,aAAa,WAAA,EAAa,WAAA,EAAa,IAAA,EAAM,UAAA,EAAY,SAAA;AAAU,GACpG;AAAA,EACA,GAAA,EAAK;AAAA,IACH,KAAA,EAAO,KAAA;AAAA,IACP,OAAA,EAAS,EAAE,aAAA,EAAe,GAAA,EAAK,aAAa,MAAA,EAAQ,WAAA,EAAa,IAAA,EAAM,UAAA,EAAY,SAAA;AAAU,GAC/F;AAAA,EACA,OAAA,EAAS;AAAA,IACP,KAAA,EAAO,SAAA;AAAA,IACP,OAAA,EAAS,EAAE,aAAA,EAAe,GAAA,EAAK,aAAa,SAAA,EAAW,WAAA,EAAa,IAAA,EAAM,UAAA,EAAY,SAAA;AAAU,GAClG;AAAA,EACA,OAAA,EAAS;AAAA,IACP,KAAA,EAAO,SAAA;AAAA,IACP,OAAA,EAAS,EAAE,aAAA,EAAe,GAAA,EAAK,aAAa,SAAA,EAAW,WAAA,EAAa,IAAA,EAAM,UAAA,EAAY,SAAA;AAAU,GAClG;AAAA,EACA,KAAA,EAAO;AAAA,IACL,KAAA,EAAO,OAAA;AAAA,IACP,OAAA,EAAS,EAAE,aAAA,EAAe,IAAA,EAAM,aAAa,OAAA,EAAS,WAAA,EAAa,GAAA,EAAK,UAAA,EAAY,SAAA;AAAU;AAElG;;;ACpNO,SAAS,qBAAA,CAAsB,OAAe,MAAA,EAGnD;AACA,EAAA,MAAM,MAAA,GAAS,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AAC9C,EAAA,MAAA,CAAO,KAAA,GAAQ,KAAA;AACf,EAAA,MAAA,CAAO,MAAA,GAAS,MAAA;AAChB,EAAA,MAAM,MAAM,MAAA,CAAO,UAAA,CAAW,MAAM,EAAE,kBAAA,EAAoB,MAAM,CAAA;AAChE,EAAA,OAAO,EAAE,QAAQ,GAAA,EAAI;AACvB;AAIO,SAAS,eAAA,CAAgB,GAAA,EAAa,UAAA,EAAoB,QAAA,EAA0B;AACzF,EAAA,IAAI,QAAA,GAAW,MAAM,UAAA,GAAa,GAAA;AAClC,EAAA,MAAM,SAAU,GAAA,IAAO,QAAA,GAAW,MAAM,GAAA,CAAA,IAAS,GAAA,IAAO,MAAM,QAAA,GAAW,GAAA,CAAA,CAAA;AACzE,EAAA,QAAA,GAAW,MAAA,IAAU,WAAW,GAAA,CAAA,GAAO,GAAA;AACvC,EAAA,OAAO,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,CAAI,GAAA,EAAK,QAAQ,CAAC,CAAA;AAC5C;AAEO,SAAS,eAAA,CAAgB,GAAA,EAAa,OAAA,EAAiB,MAAA,EAAyB;AACrF,EAAA,MAAM,UAAA,GAAa,MAAA,GAAS,CAAA,GAAI,GAAA,GAAM,MAAM,GAAA,GAAM,GAAA;AAClD,EAAA,MAAM,KAAA,GAAQ,CAAC,GAAG,OAAO,CAAA;AACzB,EAAA,MAAM,QAAQ,IAAA,CAAK,KAAA,CAAM,UAAA,IAAc,KAAA,CAAM,SAAS,CAAA,CAAE,CAAA;AACxD,EAAA,OAAO,KAAA,CAAM,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG,KAAK,CAAC,CAAC,CAAA;AAC7D;AAEO,SAAS,iBACd,GAAA,EAAa,IAAA,EAAc,CAAA,EAAW,CAAA,EAAW,MAAc,MAAA,EACvD;AACR,EAAA,MAAM,UAAA,GAAa,MAAA,GAAS,CAAA,GAAI,GAAA,GAAM,MAAM,GAAA,GAAM,GAAA;AAClD,EAAA,IAAI,UAAA,GAAa,MAAM,OAAO,GAAA;AAC9B,EAAA,MAAM,KAAA,GAAQ,CAAC,GAAG,IAAI,CAAA;AACtB,EAAA,MAAM,GAAA,GAAM,IAAI,IAAA,GAAO,CAAA;AACvB,EAAA,OAAO,KAAA,CAAM,GAAA,GAAM,KAAA,CAAM,MAAM,CAAA;AACjC;AAIA,IAAM,SAAA,GAAY;AAAA,EAChB,CAAE,CAAA,EAAG,CAAA,EAAG,CAAA,EAAE,EAAE,CAAA;AAAA,EACZ,CAAC,EAAA,EAAI,CAAA,EAAE,EAAA,EAAI,CAAC,CAAA;AAAA,EACZ,CAAE,CAAA,EAAE,EAAA,EAAI,CAAA,EAAG,CAAC,CAAA;AAAA,EACZ,CAAC,EAAA,EAAI,CAAA,EAAE,EAAA,EAAI,CAAC;AACd,CAAA;AAEO,SAAS,WAAA,CAAY,GAAA,EAAa,CAAA,EAAW,CAAA,EAAW,QAAA,EAA0B;AACvF,EAAA,IAAI,QAAA,IAAY,GAAG,OAAO,GAAA;AAC1B,EAAA,MAAM,SAAA,GAAA,CAAa,SAAA,CAAU,CAAA,GAAI,CAAC,CAAA,CAAE,IAAI,CAAC,CAAA,GAAI,EAAA,GAAK,GAAA,IAAO,QAAA,GAAW,GAAA;AACpE,EAAA,OAAO,IAAA,CAAK,IAAI,CAAA,EAAG,IAAA,CAAK,IAAI,GAAA,EAAK,GAAA,GAAM,SAAS,CAAC,CAAA;AACnD;AAIO,IAAM,QAAA,GAAqB,IAAI,KAAA,CAAM,GAAG,CAAA;AACxC,IAAM,SAAA,GAAsB,IAAI,KAAA,CAAM,GAAG,CAAA;AAChD,KAAA,IAAS,EAAA,GAAK,CAAA,EAAG,EAAA,GAAK,GAAA,EAAK,EAAA,EAAA,EAAM;AAC/B,EAAA,QAAA,CAAS,EAAE,CAAA,GAAK,CAAA,IAAA,EAAO,EAAE,CAAA,CAAA,EAAI,EAAE,IAAI,EAAE,CAAA,CAAA,CAAA;AACrC,EAAA,SAAA,CAAU,EAAE,CAAA,GAAI,CAAA,MAAA,EAAS,EAAE,CAAA,GAAA,CAAA;AAC7B;AAIO,SAAS,eAAA,CACd,IAAA,EAAiB,SAAA,EAAmB,GAAA,EAAa,KAAa,GAAA,EACtD;AACR,EAAA,QAAQ,SAAA;AAAW,IACjB,KAAK,WAAA;AACH,MAAA,OAAO,CAAA,IAAA,EAAO,KAAK,CAAC,CAAA,CAAA,EAAI,KAAK,CAAC,CAAA,CAAA,EAAI,KAAK,CAAC,CAAA,CAAA,CAAA;AAAA,IAC1C,KAAK,QAAA;AACH,MAAA,OAAO,SAAA,CAAW,KAAA,GAAQ,IAAA,CAAK,CAAA,GAAI,KAAA,GAAQ,KAAK,CAAA,GAAI,KAAA,GAAQ,IAAA,CAAK,CAAA,GAAK,CAAC,CAAA;AAAA,IACzE,KAAK,QAAA,EAAU;AACb,MAAA,MAAM,EAAA,GAAA,CAAM,QAAQ,IAAA,CAAK,CAAA,GAAI,QAAQ,IAAA,CAAK,CAAA,GAAI,KAAA,GAAQ,IAAA,CAAK,CAAA,IAAK,GAAA;AAChE,MAAA,OAAO,CAAA,IAAA,EAAQ,GAAA,GAAM,EAAA,GAAM,CAAC,CAAA,CAAA,EAAK,GAAA,GAAM,EAAA,GAAM,CAAC,CAAA,CAAA,EAAK,GAAA,GAAM,EAAA,GAAM,CAAC,CAAA,CAAA,CAAA;AAAA,IAClE;AAAA,IACA;AACE,MAAA,OAAO,QAAA,CAAU,KAAA,GAAQ,IAAA,CAAK,CAAA,GAAI,KAAA,GAAQ,KAAK,CAAA,GAAI,KAAA,GAAQ,IAAA,CAAK,CAAA,GAAK,CAAC,CAAA;AAAA;AAE5E;AAEA,IAAM,SAAA,GAAY,CAAC,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA;AACnB,SAAS,eAAA,CACd,IAAA,EAAiB,SAAA,EAAmB,GAAA,EAAa,KAAa,GAAA,EACpD;AACV,EAAA,QAAQ,SAAA;AAAW,IACjB,KAAK,WAAA;AACH,MAAA,SAAA,CAAU,CAAC,IAAI,IAAA,CAAK,CAAA;AAAG,MAAA,SAAA,CAAU,CAAC,IAAI,IAAA,CAAK,CAAA;AAAG,MAAA,SAAA,CAAU,CAAC,IAAI,IAAA,CAAK,CAAA;AAClE,MAAA;AAAA,IACF,KAAK,QAAA,EAAU;AACb,MAAA,MAAM,EAAA,GAAM,QAAQ,IAAA,CAAK,CAAA,GAAI,QAAQ,IAAA,CAAK,CAAA,GAAI,KAAA,GAAQ,IAAA,CAAK,CAAA,GAAK,CAAA;AAChE,MAAA,SAAA,CAAU,CAAC,CAAA,GAAI,CAAA;AAAG,MAAA,SAAA,CAAU,CAAC,CAAA,GAAI,EAAA;AAAI,MAAA,SAAA,CAAU,CAAC,CAAA,GAAI,CAAA;AACpD,MAAA;AAAA,IACF;AAAA,IACA,KAAK,QAAA,EAAU;AACb,MAAA,MAAM,EAAA,GAAA,CAAM,QAAQ,IAAA,CAAK,CAAA,GAAI,QAAQ,IAAA,CAAK,CAAA,GAAI,KAAA,GAAQ,IAAA,CAAK,CAAA,IAAK,GAAA;AAChE,MAAA,SAAA,CAAU,CAAC,CAAA,GAAK,GAAA,GAAM,EAAA,GAAM,CAAA;AAAG,MAAA,SAAA,CAAU,CAAC,CAAA,GAAK,GAAA,GAAM,EAAA,GAAM,CAAA;AAAG,MAAA,SAAA,CAAU,CAAC,CAAA,GAAK,GAAA,GAAM,EAAA,GAAM,CAAA;AAC1F,MAAA;AAAA,IACF;AAAA,IACA,SAAS;AACP,MAAA,MAAM,IAAA,GAAQ,QAAQ,IAAA,CAAK,CAAA,GAAI,QAAQ,IAAA,CAAK,CAAA,GAAI,KAAA,GAAQ,IAAA,CAAK,CAAA,GAAK,CAAA;AAClE,MAAA,SAAA,CAAU,CAAC,CAAA,GAAI,IAAA;AAAM,MAAA,SAAA,CAAU,CAAC,CAAA,GAAI,IAAA;AAAM,MAAA,SAAA,CAAU,CAAC,CAAA,GAAI,IAAA;AACzD,MAAA;AAAA,IACF;AAAA;AAEF,EAAA,OAAO,SAAA;AACT;;;AC3GO,SAAS,WAAW,CAAA,EAAmB;AAC5C,EAAA,OAAO,CAAA,GAAI,CAAA,IAAK,CAAA,GAAI,CAAA,GAAI,CAAA,CAAA;AAC1B;AAEO,SAAS,uBACd,CAAA,EACA,CAAA,EACA,MACA,IAAA,EACA,IAAA,EACA,OACA,KAAA,EACQ;AACR,EAAA,IAAI,KAAA,KAAU,QAAQ,OAAO,CAAA;AAE7B,EAAA,MAAM,IAAI,IAAA,GAAO,KAAA;AAEjB,EAAA,QAAQ,KAAA;AAAO,IACb,KAAK,MAAA,EAAQ;AACX,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAK,CAAA,GAAI,IAAA,GAAQ,IAAA,CAAK,EAAA,GAAK,CAAA,GAAI,CAAA,GAAI,CAAC,CAAA,GAAI,GAAA,GAAM,GAAA;AAChE,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAK,CAAA,GAAI,IAAA,GAAQ,IAAA,CAAK,EAAA,GAAK,CAAA,GAAI,CAAA,GAAI,CAAC,CAAA,GAAI,GAAA,GAAM,GAAA;AACjE,MAAA,OAAO,GAAA,GAAM,GAAA,IAAO,IAAA,GAAO,GAAA,GAAM,KAAA,GAAQ,GAAA,CAAA;AAAA,IAC3C;AAAA,IACA,KAAK,OAAA,EAAS;AACZ,MAAA,MAAM,KAAK,IAAA,GAAO,CAAA;AAClB,MAAA,MAAM,KAAK,IAAA,GAAO,CAAA;AAClB,MAAA,MAAM,IAAA,GAAO,KAAK,IAAA,CAAA,CAAM,CAAA,GAAI,OAAO,CAAA,GAAA,CAAK,CAAA,GAAI,OAAO,CAAC,CAAA;AACpD,MAAA,MAAM,UAAU,IAAA,CAAK,IAAA,CAAK,EAAA,IAAM,CAAA,GAAI,MAAM,CAAC,CAAA;AAC3C,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,IAAA,GAAO,OAAA,GAAU,IAAA,CAAK,EAAA,GAAK,CAAA,GAAI,CAAA,GAAI,CAAC,CAAA,GAAI,GAAA,GAAM,GAAA;AACpE,MAAA,OAAO,MAAM,GAAA,GAAM,IAAA;AAAA,IACrB;AAAA,IACA,KAAK,MAAA,EAAQ;AACX,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,CAAA,GAAI,IAAA,GAAO,IAAA,CAAK,EAAA,GAAK,CAAA,GAAI,CAAA,GAAI,CAAA,GAAI,CAAA,GAAI,GAAG,IAAI,GAAA,GAAM,GAAA;AACxE,MAAA,MAAMA,KAAAA,GAAO,IAAA,CAAK,GAAA,CAAI,CAAA,GAAI,IAAA,GAAO,KAAK,EAAA,GAAK,CAAA,GAAI,CAAC,CAAA,GAAI,GAAA,GAAM,GAAA;AAC1D,MAAA,OAAO,GAAA,GAAM,MAAM,IAAA,GAAOA,KAAAA;AAAA,IAC5B;AAAA,IACA,KAAK,SAAA,EAAW;AACd,MAAA,MAAM,UAAU,IAAA,CAAK,GAAA,CAAI,CAAA,GAAI,CAAC,IAAI,GAAA,GAAM,GAAA;AACxC,MAAA,MAAM,SAAS,IAAA,CAAK,GAAA,CAAA,CAAK,IAAI,CAAA,IAAK,GAAA,GAAM,CAAC,CAAA,GAAI,GAAA;AAC7C,MAAA,OAAO,IAAA,CAAK,IAAI,GAAA,EAAK,IAAA,CAAK,IAAI,CAAA,EAAG,OAAA,GAAU,MAAM,CAAC,CAAA;AAAA,IACpD;AAAA,IACA,KAAK,SAAA,EAAW;AACd,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,CAAA,GAAI,KAAA,GAAQ,CAAA,GAAI,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,CAAA,GAAI,CAAC,CAAA,GAAI,UAAU,CAAA,GAAI,UAAA;AAChF,MAAA,MAAM,OAAA,GAAW,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA;AACvC,MAAA,OAAO,OAAA,GAAU,GAAA,GAAM,CAAA,GAAI,IAAA,GAAO,OAAA,GAAU,GAAA;AAAA,IAC9C;AAAA,IACA,KAAK,QAAA,EAAU;AACb,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,CAAA,IAAK,OAAO,IAAA,CAAK,CAAA;AACzC,MAAA,MAAM,UAAA,GAAa,IAAA,CAAK,GAAA,CAAI,IAAA,GAAO,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,CAAA,GAAI,CAAC,CAAA,GAAI,KAAK,CAAA,GAAI,UAAA;AACxE,MAAA,MAAM,SAAA,GAAY,UAAA,GAAa,IAAA,CAAK,KAAA,CAAM,UAAU,CAAA;AACpD,MAAA,IAAI,YAAY,IAAA,EAAM;AACpB,QAAA,MAAM,UAAU,IAAA,CAAK,GAAA,CAAI,IAAI,EAAA,GAAK,IAAI,IAAI,GAAA,GAAM,GAAA;AAChD,QAAA,OAAO,OAAA,GAAU,MAAM,CAAA,GAAI,OAAA;AAAA,MAC7B;AACA,MAAA,OAAO,CAAA;AAAA,IACT;AAAA,IACA,KAAK,QAAA,EAAU;AACb,MAAA,MAAM,KAAK,IAAA,GAAO,CAAA;AAClB,MAAA,MAAM,KAAK,IAAA,GAAO,CAAA;AAClB,MAAA,MAAM,KAAK,CAAA,GAAI,EAAA;AACf,MAAA,MAAM,KAAK,CAAA,GAAI,EAAA;AACf,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,EAAA,EAAI,EAAE,CAAA;AAC/B,MAAA,MAAM,OAAO,IAAA,CAAK,IAAA,CAAK,EAAA,GAAK,EAAA,GAAK,KAAK,EAAE,CAAA;AACxC,MAAA,MAAM,UAAU,IAAA,CAAK,IAAA,CAAK,EAAA,GAAK,EAAA,GAAK,KAAK,EAAE,CAAA;AAC3C,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,KAAA,GAAQ,CAAA,GAAI,IAAA,GAAO,OAAA,GAAU,IAAA,CAAK,EAAA,GAAK,CAAA,GAAI,CAAA,GAAI,CAAC,IAAI,GAAA,GAAM,GAAA;AAClF,MAAA,OAAO,OAAO,IAAA,GAAO,MAAA;AAAA,IACvB;AAAA,IACA,KAAK,YAAA,EAAc;AACjB,MAAA,MAAM,aAAa,IAAA,GAAO,IAAA;AAC1B,MAAA,MAAM,SAAA,GAAY,IAAI,IAAA,GAAO,CAAA;AAC7B,MAAA,MAAM,QAAA,GAAa,IAAI,GAAA,GAAO,CAAA;AAC9B,MAAA,MAAM,WAAA,GAAc,WAAW,UAAA,GAAa,GAAA;AAC5C,MAAA,MAAM,OAAO,SAAA,GAAY,WAAA;AACzB,MAAA,IAAI,IAAA,GAAO,GAAG,OAAO,CAAA;AACrB,MAAA,MAAMA,QAAO,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA,GAAI,IAAA,IAAQ,aAAa,IAAA,CAAK,CAAA;AACvD,MAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAA,EAAGA,KAAI,CAAA;AAAA,IACzB;AAAA,IACA,KAAK,SAAA,EAAW;AACd,MAAA,MAAM,MAAM,IAAA,GAAO,CAAA;AACnB,MAAA,MAAM,MAAM,IAAA,GAAO,CAAA;AACnB,MAAA,MAAM,MAAM,CAAA,GAAI,GAAA;AAChB,MAAA,MAAM,MAAM,CAAA,GAAI,GAAA;AAChB,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,IAAA,CAAK,GAAA,GAAM,GAAA,GAAM,GAAA,GAAM,GAAG,CAAA,GAAI,IAAA,CAAK,IAAA,CAAK,GAAA,GAAM,GAAA,GAAM,MAAM,GAAG,CAAA;AAChF,MAAA,MAAM,QAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,GAAI,GAAG,IAAI,GAAA,GAAM,GAAA;AACxC,MAAA,MAAM,SAAA,GAAY,KAAA;AAClB,MAAA,IAAI,QAAQ,SAAA,EAAW;AACrB,QAAA,OAAO,KAAK,GAAA,CAAI,CAAA,EAAG,CAAA,GAAA,CAAK,KAAA,GAAQ,aAAa,CAAC,CAAA;AAAA,MAChD;AACA,MAAA,OAAO,MAAM,GAAA,GAAM,IAAA,CAAK,IAAI,KAAA,GAAQ,EAAA,GAAK,IAAI,CAAC,CAAA;AAAA,IAChD;AAAA,IACA,KAAK,WAAA;AAEH,MAAA,OAAO,CAAA;AAAA,IACT,KAAK,QAAA,EAAU;AAEb,MAAA,MAAM,MAAM,IAAA,GAAO,CAAA;AACnB,MAAA,MAAM,MAAM,IAAA,GAAO,CAAA;AACnB,MAAA,MAAM,MAAM,CAAA,GAAI,GAAA;AAChB,MAAA,MAAM,MAAM,CAAA,GAAI,GAAA;AAChB,MAAA,MAAM,QAAQ,IAAA,CAAK,IAAA,CAAK,GAAA,GAAM,GAAA,GAAM,MAAM,GAAG,CAAA;AAC7C,MAAA,MAAM,WAAW,IAAA,CAAK,IAAA,CAAK,GAAA,GAAM,GAAA,GAAM,MAAM,GAAG,CAAA;AAChD,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,GAAA,CAAK,KAAA,GAAQ,QAAA,GAAY,IAAA,CAAK,EAAA,GAAK,EAAA,GAAK,CAAA,GAAI,CAAC,CAAA,GAAI,GAAA,GAAM,GAAA;AAC3E,MAAA,MAAM,WAAW,CAAA,GAAI,IAAA,CAAK,IAAI,CAAA,EAAG,KAAA,IAAS,WAAW,GAAA,CAAI,CAAA;AACzD,MAAA,OAAO,GAAA,GAAM,GAAA,GAAM,MAAA,IAAU,GAAA,GAAM,QAAA,GAAW,GAAA,CAAA;AAAA,IAChD;AAAA,IACA,KAAK,MAAA,EAAQ;AAEX,MAAA,MAAM,QAAA,GAAY,CAAA,GAAI,IAAA,GAAQ,IAAA,CAAK,EAAA;AACnC,MAAA,MAAM,IAAA,GAAO,KAAK,GAAA,CAAI,QAAA,GAAW,IAAI,GAAA,GAAM,CAAA,GAAI,IAAI,CAAA,GAAI,GAAA,GAAM,GAAA;AAC7D,MAAA,MAAM,UAAU,IAAA,CAAK,GAAA,CAAI,GAAI,CAAA,GAAI,IAAA,GAAO,GAAI,CAAA,GAAI,GAAA;AAChD,MAAA,OAAO,IAAA,GAAO,IAAA,IAAQ,IAAA,IAAQ,CAAA,GAAI,OAAA,GAAU,GAAA,CAAA,CAAA;AAAA,IAC9C;AAAA,IACA,KAAK,OAAA,EAAS;AAEZ,MAAA,MAAM,MAAM,IAAA,GAAO,CAAA;AACnB,MAAA,MAAM,MAAM,IAAA,GAAO,CAAA;AACnB,MAAA,MAAM,MAAM,CAAA,GAAI,GAAA;AAChB,MAAA,MAAM,MAAM,CAAA,GAAI,GAAA;AAChB,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,GAAA,EAAK,GAAG,CAAA;AAClC,MAAA,MAAM,KAAA,GAAS,IAAA,CAAK,IAAA,CAAK,GAAA,GAAM,GAAA,GAAM,GAAA,GAAM,GAAG,CAAA,GAAI,IAAA,CAAK,IAAA,CAAK,GAAA,GAAM,GAAA,GAAM,MAAM,GAAG,CAAA;AACjF,MAAA,MAAM,KAAA,GAAS,IAAA,CAAK,GAAA,CAAI,MAAA,GAAS,CAAA,GAAI,QAAQ,CAAA,GAAI,CAAA,GAAI,GAAG,CAAA,GAAI,GAAA,GAAM,GAAA;AAClE,MAAA,OAAO,MAAM,GAAA,GAAM,KAAA;AAAA,IACrB;AAAA,IACA,KAAK,UAAA,EAAY;AAEf,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,CAAA,GAAI,CAAC,CAAA;AAC7B,MAAA,MAAM,KAAA,GAAQ,CAAC,EAAA,EAAY,EAAA,KAAuB;AAChD,QAAA,MAAM,CAAA,GAAI,KAAK,GAAA,CAAI,EAAA,GAAK,QAAQ,EAAA,GAAK,KAAA,GAAQ,IAAA,GAAO,UAAU,CAAA,GAAI,UAAA;AAClE,QAAA,OAAO,IAAI,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA,GAAI,OAAO,CAAA,GAAI,CAAA;AAAA,MACxC,CAAA;AACA,MAAA,MAAM,IAAA,GAAO,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA;AACvB,MAAA,MAAM,aACJ,KAAA,CAAM,CAAA,GAAI,GAAG,CAAC,CAAA,GAAI,MAAM,CAAA,GAAI,CAAA,EAAG,CAAC,CAAA,GAChC,KAAA,CAAM,GAAG,CAAA,GAAI,CAAC,IAAI,KAAA,CAAM,CAAA,EAAG,IAAI,CAAC,CAAA,GAChC,MAAM,CAAA,GAAI,CAAA,EAAG,IAAI,CAAC,CAAA,GAAI,MAAM,CAAA,GAAI,CAAA,EAAG,IAAI,CAAC,CAAA,GACxC,MAAM,CAAA,GAAI,CAAA,EAAG,IAAI,CAAC,CAAA,GAAI,MAAM,CAAA,GAAI,CAAA,EAAG,IAAI,CAAC,CAAA;AAC1C,MAAA,MAAM,SAAA,GAAY,IAAA,KAAS,CAAA,GACtB,UAAA,KAAe,CAAA,IAAK,UAAA,KAAe,CAAA,GAAI,CAAA,GAAI,CAAA,GAC3C,UAAA,KAAe,CAAA,GAAI,CAAA,GAAI,CAAA;AAC5B,MAAA,OAAO,SAAA,KAAc,IAAI,CAAA,GAAI,IAAA;AAAA,IAC/B;AAAA,IACA;AACE,MAAA,OAAO,CAAA;AAAA;AAEb;AAEA,IAAM,YAAA,GAAe,EAAE,KAAA,EAAO,CAAA,EAAG,OAAA,EAAS,CAAA,EAAG,OAAA,EAAS,CAAA,EAAG,IAAA,EAAM,CAAA,EAAG,UAAA,EAAY,CAAA,EAAG,WAAW,CAAA,EAAE;AAEvF,SAAS,kBAAA,CACd,EAAA,EACA,EAAA,EACA,MAAA,EACA,MAAA,EACA,cAAA,EACA,QAAA,EACA,KAAA,EACA,KAAA,EACA,MAAA,GAAsB,WAAA,EACtB,YAAA,GAAuB,GAAA,EACF;AACrB,EAAA,MAAM,KAAK,EAAA,GAAK,MAAA;AAChB,EAAA,MAAM,KAAK,EAAA,GAAK,MAAA;AAChB,EAAA,MAAM,MAAA,GAAS,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,EAAA;AAE9B,EAAA,MAAM,MAAA,GAAU,IAAA,GAAO,YAAA,GAAe,IAAA,GAAQ,QAAA,GAAW,IAAA;AAEzD,EAAA,IAAI,MAAA,IAAU,SAAS,MAAA,EAAQ;AAC7B,IAAA,YAAA,CAAa,KAAA,GAAQ,CAAA;AACrB,IAAA,YAAA,CAAa,OAAA,GAAU,CAAA;AACvB,IAAA,YAAA,CAAa,OAAA,GAAU,CAAA;AACvB,IAAA,YAAA,CAAa,IAAA,GAAO,CAAA;AACpB,IAAA,YAAA,CAAa,UAAA,GAAa,CAAA;AAC1B,IAAA,YAAA,CAAa,SAAA,GAAY,CAAA;AACzB,IAAA,OAAO,YAAA;AAAA,EACT;AAEA,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,IAAA,CAAK,MAAM,CAAA;AAC7B,EAAA,MAAM,CAAA,GAAI,IAAI,IAAA,GAAO,MAAA;AACrB,EAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,CAAC,CAAA,GAAI,cAAA;AAE9B,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,IAAI,OAAA,GAAU,CAAA;AACd,EAAA,IAAI,OAAA,GAAU,CAAA;AACd,EAAA,IAAI,IAAA,GAAO,CAAA;AACX,EAAA,IAAI,UAAA,GAAa,CAAA;AAEjB,EAAA,QAAQ,MAAA;AAAQ,IACd,KAAK,WAAA,EAAa;AAChB,MAAA,KAAA,GAAQ,CAAA,GAAI,QAAQ,QAAA,GAAW,GAAA;AAC/B,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,EAAA,EAAI,EAAE,CAAA;AAC/B,MAAA,MAAM,SAAA,GAAY,KAAA,GAAQ,KAAA,GAAQ,QAAA,GAAW,GAAA;AAC7C,MAAA,OAAA,GAAU,IAAA,CAAK,GAAA,CAAI,KAAK,CAAA,GAAI,SAAA,GAAY,KAAA;AACxC,MAAA,OAAA,GAAU,IAAA,CAAK,GAAA,CAAI,KAAK,CAAA,GAAI,SAAA,GAAY,KAAA;AACxC,MAAA,IAAA,GAAO,QAAQ,QAAA,GAAW,GAAA;AAC1B,MAAA,UAAA,GAAa,KAAA,GAAQ,QAAQ,QAAA,GAAW,IAAA;AACxC,MAAA;AAAA,IACF;AAAA,IACA,KAAK,SAAA;AACH,MAAA,KAAA,GAAQ,CAAA,GAAI,QAAQ,QAAA,GAAW,GAAA;AAC/B,MAAA,IAAA,GAAO,QAAQ,QAAA,GAAW,IAAA;AAC1B,MAAA;AAAA,IACF,KAAK,OAAA,EAAS;AACZ,MAAA,KAAA,GAAQ,CAAA,GAAI,QAAQ,QAAA,GAAW,GAAA;AAC/B,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,EAAA,EAAI,EAAE,CAAA;AAChC,MAAA,MAAM,IAAA,GAAO,KAAA,GAAQ,KAAA,GAAQ,QAAA,GAAW,GAAA;AACxC,MAAA,OAAA,GAAU,IAAA,CAAK,GAAA,CAAI,MAAM,CAAA,GAAI,IAAA,GAAO,KAAA;AACpC,MAAA,OAAA,GAAU,IAAA,CAAK,GAAA,CAAI,MAAM,CAAA,GAAI,IAAA,GAAO,KAAA;AACpC,MAAA;AAAA,IACF;AAAA,IACA,KAAK,MAAA;AACH,MAAA,IAAA,GAAO,QAAQ,QAAA,GAAW,GAAA;AAC1B,MAAA,UAAA,GAAa,QAAQ,QAAA,GAAW,GAAA;AAChC,MAAA;AAAA,IACF,KAAK,YAAA;AACH,MAAA,KAAA,GAAQ,CAAA,GAAI,QAAQ,QAAA,GAAW,GAAA;AAC/B,MAAA,IAAA,GAAO,QAAQ,QAAA,GAAW,GAAA;AAC1B,MAAA,UAAA,GAAa,QAAQ,QAAA,GAAW,GAAA;AAChC,MAAA;AAAA,IACF,KAAK,SAAA,EAAW;AAEd,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,EAAA,EAAI,EAAE,CAAA;AAChC,MAAA,MAAM,IAAA,GAAO,KAAA,GAAQ,KAAA,GAAQ,QAAA,GAAW,CAAA;AAExC,MAAA,OAAA,GAAU,CAAC,IAAA,CAAK,GAAA,CAAI,MAAM,IAAI,IAAA,GAAO,KAAA;AACrC,MAAA,OAAA,GAAU,CAAC,IAAA,CAAK,GAAA,CAAI,MAAM,IAAI,IAAA,GAAO,KAAA;AACrC,MAAA,IAAA,GAAO,QAAQ,QAAA,GAAW,GAAA;AAC1B,MAAA;AAAA,IACF;AAAA,IACA,KAAK,SAAA,EAAW;AAEd,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,EAAA,EAAI,EAAE,CAAA;AAChC,MAAA,MAAM,SAAS,IAAA,CAAK,GAAA,CAAI,KAAK,IAAA,GAAO,EAAA,GAAK,IAAI,CAAA,GAAI,GAAA;AACjD,MAAA,MAAM,OAAA,GAAU,KAAA,GAAQ,QAAA,GAAW,GAAA,IAAO,MAAM,MAAA,GAAS,GAAA,CAAA;AACzD,MAAA,OAAA,GAAU,IAAA,CAAK,GAAA,CAAI,MAAA,GAAS,MAAM,IAAI,OAAA,GAAU,KAAA;AAChD,MAAA,OAAA,GAAU,IAAA,CAAK,GAAA,CAAI,MAAA,GAAS,MAAM,IAAI,OAAA,GAAU,KAAA;AAChD,MAAA,KAAA,GAAQ,KAAK,GAAA,CAAI,GAAA,EAAK,CAAA,GAAI,KAAA,GAAQ,WAAW,GAAG,CAAA;AAChD,MAAA,IAAA,GAAO,QAAQ,QAAA,GAAW,IAAA;AAC1B,MAAA;AAAA,IACF;AAAA,IACA,KAAK,OAAA,EAAS;AAEZ,MAAA,UAAA,GAAa,QAAQ,QAAA,GAAW,GAAA;AAChC,MAAA,IAAA,GAAO,QAAQ,QAAA,GAAW,GAAA;AAC1B,MAAA,KAAA,GAAQ,CAAA,GAAI,QAAQ,QAAA,GAAW,IAAA;AAC/B,MAAA;AAAA,IACF;AAAA;AAGF,EAAA,YAAA,CAAa,KAAA,GAAQ,KAAA;AACrB,EAAA,YAAA,CAAa,OAAA,GAAU,OAAA;AACvB,EAAA,YAAA,CAAa,OAAA,GAAU,OAAA;AACvB,EAAA,YAAA,CAAa,IAAA,GAAO,IAAA;AACpB,EAAA,YAAA,CAAa,UAAA,GAAa,UAAA;AAC1B,EAAA,YAAA,CAAa,SAAA,GAAY,KAAA;AACzB,EAAA,OAAO,YAAA;AACT;;;AC7PO,SAAS,WAAW,CAAA,EAAuD;AAChF,EAAA,MAAM,GAAA,GAAM,CAAA,CAAE,KAAA,CAAM,qBAAqB,IAAI,CAAC,CAAA;AAC9C,EAAA,IAAI,GAAA,EAAK;AACP,IAAA,MAAM,IAAI,GAAA,CAAI,MAAA,IAAU,IACpB,GAAA,CAAI,KAAA,CAAM,EAAE,CAAA,CAAE,GAAA,CAAI,CAAA,CAAA,KAAK,QAAA,CAAS,IAAI,CAAA,EAAG,EAAE,CAAC,CAAA,GAC1C,CAAC,SAAS,GAAA,CAAI,KAAA,CAAM,CAAA,EAAE,CAAC,GAAE,EAAE,CAAA,EAAG,SAAS,GAAA,CAAI,KAAA,CAAM,GAAE,CAAC,CAAA,EAAE,EAAE,CAAA,EAAG,SAAS,GAAA,CAAI,KAAA,CAAM,GAAE,CAAC,CAAA,EAAE,EAAE,CAAC,CAAA;AAC1F,IAAA,OAAO,EAAE,CAAA,EAAG,CAAA,CAAE,CAAC,CAAA,EAAG,CAAA,EAAG,CAAA,CAAE,CAAC,CAAA,EAAG,CAAA,EAAG,CAAA,CAAE,CAAC,CAAA,EAAE;AAAA,EACrC;AACA,EAAA,MAAM,GAAA,GAAM,CAAA,CAAE,KAAA,CAAM,wCAAwC,CAAA;AAC5D,EAAA,IAAI,KAAK,OAAO,EAAE,CAAA,EAAG,CAAC,IAAI,CAAC,CAAA,EAAG,CAAA,EAAG,CAAC,IAAI,CAAC,CAAA,EAAG,GAAG,CAAC,GAAA,CAAI,CAAC,CAAA,EAAE;AACrD,EAAA,OAAO,IAAA;AACT;AAIO,SAAS,KAAK,CAAA,EAAmB;AAAE,EAAA,OAAO,IAAI,CAAA,GAAI,CAAA,IAAK,CAAA,IAAK,CAAA,GAAI,IAAI,EAAA,CAAA,GAAM,EAAA,CAAA;AAAK;AAC/E,SAAS,IAAA,CAAK,CAAA,EAAW,CAAA,EAAW,CAAA,EAAmB;AAAE,EAAA,OAAO,CAAA,GAAA,CAAK,IAAI,CAAA,IAAK,CAAA;AAAG;AAGjF,SAAS,KAAA,CAAM,IAAY,EAAA,EAAoB;AACpD,EAAA,IAAI,CAAA,GAAI,EAAA,GAAK,GAAA,GAAM,EAAA,GAAK,GAAA;AACxB,EAAA,CAAA,GAAM,KAAK,EAAA,GAAM,CAAA;AACjB,EAAA,OAAA,CAAS,KAAK,CAAA,GAAI,CAAA,GAAI,KAAA,GAAQ,MAAA,CAAA,GAAU,aAAc,UAAA,IAAc,UAAA;AACtE;AAGO,SAAS,MAAA,CAAO,GAAW,CAAA,EAAmB;AACnD,EAAA,MAAM,EAAA,GAAK,KAAK,KAAA,CAAM,CAAC,GAAG,EAAA,GAAK,IAAA,CAAK,MAAM,CAAC,CAAA;AAC3C,EAAA,MAAM,EAAA,GAAK,CAAA,GAAI,EAAA,EAAI,EAAA,GAAK,CAAA,GAAI,EAAA;AAC5B,EAAA,MAAM,KAAK,IAAA,CAAK,EAAE,CAAA,EAAG,EAAA,GAAK,KAAK,EAAE,CAAA;AACjC,EAAA,MAAM,GAAA,GAAM,KAAA,CAAM,EAAA,EAAQ,EAAM,CAAA;AAChC,EAAA,MAAM,GAAA,GAAM,KAAA,CAAM,EAAA,GAAK,CAAA,EAAG,EAAM,CAAA;AAChC,EAAA,MAAM,GAAA,GAAM,KAAA,CAAM,EAAA,EAAQ,EAAA,GAAK,CAAC,CAAA;AAChC,EAAA,MAAM,GAAA,GAAM,KAAA,CAAM,EAAA,GAAK,CAAA,EAAG,KAAK,CAAC,CAAA;AAChC,EAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,EAAK,GAAA,EAAK,EAAE,CAAA,EAAG,IAAA,CAAK,GAAA,EAAK,GAAA,EAAK,EAAE,CAAA,EAAG,EAAE,CAAA;AACxD;AAGO,SAAS,GAAA,CAAI,GAAW,CAAA,EAAmB;AAChD,EAAA,OAAA,CACE,OAAO,CAAA,EAAS,CAAO,IAAI,GAAA,GAC3B,MAAA,CAAO,IAAI,GAAA,EAAK,CAAA,GAAI,GAAG,CAAA,GAAI,OAC3B,MAAA,CAAO,CAAA,GAAI,KAAK,CAAA,GAAI,GAAG,IAAI,KAAA,IACzB,KAAA;AACN;;;AChBO,SAAS,oBAAA,CACd,GAAA,EACA,KAAA,EACA,MAAA,EACA,MACA,QAAA,GAAqC,EAAE,CAAA,EAAG,GAAA,EAAK,CAAA,EAAG,GAAA,EAAI,EACtD,OAAA,GAAiC,EAAC,EAC5B;AACN,EAAA,MAAM;AAAA,IACJ,QAAA,GAAkB,EAAA;AAAA,IAClB,UAAA,GAAkB,IAAA;AAAA,IAClB,eAAA,GAAkB,GAAA;AAAA,IAClB,KAAA,GAAkB,YAAA;AAAA,IAClB,SAAA,GAAkB,IAAA;AAAA,IAClB,WAAA,GAAkB,MAAA;AAAA,IAClB,eAAA,GAAkB,IAAA;AAAA,IAClB,cAAA,GAAkB,IAAA;AAAA,IAClB,YAAA,GAAkB,GAAA;AAAA,IAClB,KAAA,GAAkB,CAAA;AAAA,IAClB,MAAA,GAAkB,IAAA;AAAA,IAClB,QAAA,GAAkB,IAAA;AAAA,IAClB,OAAA,GAAkB,IAAA;AAAA,IAClB,SAAA,GAAkB;AAAA,GACpB,GAAI,OAAA;AACJ,EAAA,MAAM,cAAA,GAAiB,WAAA,KAAgB,SAAA,GAAY,SAAA,GAAY,SAAA,CAAA;AAE/D,EAAA,MAAM,QAAQ,QAAA,GAAW,UAAA;AACzB,EAAA,MAAM,QAAQ,QAAA,GAAW,eAAA;AACzB,EAAA,MAAM,IAAA,GAAQ,IAAA,CAAK,IAAA,CAAK,KAAA,GAAS,KAAK,CAAA;AACtC,EAAA,MAAM,IAAA,GAAQ,IAAA,CAAK,IAAA,CAAK,MAAA,GAAS,KAAK,CAAA;AACtC,EAAA,MAAM,KAAK,QAAA,CAAS,CAAA;AACpB,EAAA,MAAM,KAAK,QAAA,CAAS,CAAA;AAEpB,EAAA,IAAI,GAAA,GAAM,GAAA,EAAK,GAAA,GAAM,GAAA,EAAK,GAAA,GAAM,CAAA;AAChC,EAAA;AACE,IAAA,MAAM,GAAA,GAAM,cAAA,CAAe,OAAA,CAAQ,GAAA,EAAK,EAAE,CAAA;AAC1C,IAAA,IAAI,GAAA,CAAI,WAAW,CAAA,EAAG;AACpB,MAAA,GAAA,GAAM,SAAS,GAAA,CAAI,KAAA,CAAM,CAAA,EAAG,CAAC,GAAG,EAAE,CAAA;AAClC,MAAA,GAAA,GAAM,SAAS,GAAA,CAAI,KAAA,CAAM,CAAA,EAAG,CAAC,GAAG,EAAE,CAAA;AAClC,MAAA,GAAA,GAAM,SAAS,GAAA,CAAI,KAAA,CAAM,CAAA,EAAG,CAAC,GAAG,EAAE,CAAA;AAAA,IACpC;AAAA,EACF;AAEA,EAAA,GAAA,CAAI,SAAA,CAAU,CAAA,EAAG,CAAA,EAAG,KAAA,EAAO,MAAM,CAAA;AACjC,EAAA,GAAA,CAAI,IAAA,GAAO,GAAG,QAAQ,CAAA,8BAAA,CAAA;AACtB,EAAA,GAAA,CAAI,YAAA,GAAe,KAAA;AAEnB,EAAA,MAAM,IAAI,IAAA,GAAO,KAAA;AACjB,EAAA,MAAM,UAAA,GAAa,WAAW,IAAA,CAAK,GAAA,CAAI,IAAI,IAAI,CAAA,GAAI,GAAA,GAAM,GAAA,IAAO,IAAA,GAAO,CAAA;AAEvE,EAAA,KAAA,IAAS,GAAA,GAAM,CAAA,EAAG,GAAA,GAAM,IAAA,EAAM,GAAA,EAAA,EAAO;AACnC,IAAA,KAAA,IAAS,GAAA,GAAM,CAAA,EAAG,GAAA,GAAM,IAAA,EAAM,GAAA,EAAA,EAAO;AACnC,MAAA,MAAM,KAAK,GAAA,GAAM,IAAA;AACjB,MAAA,MAAM,KAAK,GAAA,GAAM,IAAA;AAEjB,MAAA,MAAM,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,GAAA,GAAM,IAAA,GAAO,MAAM,IAAA,GAAO,CAAA,GAAI,GAAI,CAAA,GAAI,GAAA,GAAM,GAAA;AAChE,MAAA,MAAM,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,GAAA,GAAM,IAAA,GAAO,MAAM,IAAA,GAAO,CAAA,GAAI,GAAI,CAAA,GAAI,GAAA,GAAM,GAAA;AAChE,MAAA,MAAM,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,GAAA,GAAM,IAAA,GAAO,MAAM,IAAA,GAAO,CAAA,GAAI,GAAI,CAAA,GAAI,GAAA,GAAM,GAAA;AAChE,MAAA,MAAM,QAAA,GAAA,CAAY,EAAA,GAAK,EAAA,GAAK,EAAA,IAAM,CAAA;AAElC,MAAA,MAAM,UAAA,GAAa,KAAA;AACnB,MAAA,MAAM,aAAa,CAAA,GAAI,IAAA;AACvB,MAAA,MAAM,SAAA,GAAa,GAAA,CAAI,GAAA,GAAM,UAAA,GAAa,UAAA,EAAY,GAAA,GAAM,UAAA,GAAa,GAAA,GAAM,UAAA,GAAa,GAAG,CAAA,GAAI,GAAA,GAAM,GAAA;AAEzG,MAAA,MAAM,SAAA,GAAY,IAAA;AAClB,MAAA,MAAM,SAAA,GAAY,IAAA,CAAK,GAAA,CAAA,CAAK,GAAA,GAAM,GAAA,GAAM,QAAQ,SAAA,GAAY,CAAA,GAAI,GAAG,CAAA,GAAI,GAAA,GAAM,GAAA;AAE7E,MAAA,MAAM,WAAW,QAAA,GAAW,IAAA,GAAO,SAAA,GAAY,IAAA,GAAO,YAAY,GAAA,GAAO,UAAA;AAEzE,MAAA,MAAM,QAAQ,EAAA,GAAK,EAAA;AACnB,MAAA,MAAM,QAAQ,EAAA,GAAK,EAAA;AACnB,MAAA,MAAM,UAAU,IAAA,CAAK,IAAA,CAAK,KAAA,GAAQ,KAAA,GAAQ,QAAQ,KAAK,CAAA;AACvD,MAAA,IAAI,UAAA,GAAa,CAAA;AACjB,MAAA,IAAI,MAAA,IAAU,UAAU,IAAA,EAAM;AAC5B,QAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,KAAA,EAAO,KAAK,CAAA;AACrC,QAAA,MAAM,KAAA,GAAQ,KAAK,GAAA,CAAI,KAAA,GAAQ,IAAI,CAAA,GAAI,GAAA,GAAM,UAAU,EAAE,CAAA;AACzD,QAAA,MAAM,UAAU,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,CAAA,GAAI,UAAU,IAAI,CAAA;AAC9C,QAAA,UAAA,GAAa,KAAA,GAAQ,UAAU,OAAA,GAAU,IAAA;AAAA,MAC3C;AAEA,MAAA,MAAM,YAAY,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,CAAA,GAAI,UAAU,YAAY,CAAA;AACxD,MAAA,MAAM,SAAA,GACJ,YAAY,CAAA,GAAI,cAAA,CAAA,GAAA,CACf,YAAY,UAAA,GAAa,GAAA,IAAO,iBAC/B,UAAA,GAAa,IAAA;AACjB,MAAA,MAAM,OAAA,GAAU,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,CAAI,CAAA,EAAG,SAAS,CAAC,CAAA;AAElD,MAAA,IAAI,cAAA,GAAiB,OAAA;AACrB,MAAA,IAAI,QAAA,IAAY,UAAU,IAAA,EAAM;AAC9B,QAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,CAAA,GAAI,CAAC,CAAA;AAC/B,QAAA,MAAM,WAAA,GAAc,MAAM,GAAA,GAAM,CAAA,GAAI,SAAS,CAAA,EAAG,GAAA,GAAM,KAAK,MAAM,CAAA;AACjE,QAAA,IAAI,cAAc,IAAA,EAAM;AACtB,UAAA,cAAA,GAAiB,KAAK,GAAA,CAAI,CAAA,EAAG,OAAA,GAAA,CAAW,WAAA,GAAc,QAAQ,CAAC,CAAA;AAAA,QACjE;AAAA,MACF;AAEA,MAAA,MAAM,UAAU,IAAA,CAAK,KAAA,CAAM,cAAA,IAAkB,KAAA,CAAM,SAAS,CAAA,CAAE,CAAA;AAC9D,MAAA,IAAI,KAAA,CAAM,OAAO,CAAA,KAAM,GAAA,EAAK;AAE5B,MAAA,MAAM,KAAA,GAAQ,QAAQ,cAAA,GAAiB,IAAA;AACvC,MAAA,MAAM,WAAW,cAAA,GAAiB,eAAA;AAElC,MAAA,IAAI,QAAA,EAAU;AACZ,QAAA,MAAM,WAAA,GAAc,KAAK,GAAA,CAAI,SAAA,GAAY,MAAO,IAAA,EAAM,KAAA,IAAS,SAAA,GAAY,EAAA,GAAK,GAAA,CAAI,CAAA;AACpF,QAAA,GAAA,CAAI,SAAA,GAAY,QAAQ,GAAG,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA,EAAI,GAAG,IAAI,WAAW,CAAA,CAAA,CAAA;AAAA,MAC1D,WAAW,SAAA,EAAW;AACpB,QAAA,GAAA,CAAI,YAAY,SAAA,CAAU,OAAA,CAAQ,KAAA,EAAO,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,MACxD,WAAW,SAAA,EAAW;AACpB,QAAA,GAAA,CAAI,SAAA,GAAY,CAAA,cAAA,EAAiB,KAAA,GAAQ,CAAC,CAAA,CAAA,CAAA;AAAA,MAC5C,CAAA,MAAO;AACL,QAAA,GAAA,CAAI,SAAA,GAAY,oBAAoB,KAAK,CAAA,CAAA,CAAA;AAAA,MAC3C;AAEA,MAAA,GAAA,CAAI,SAAS,KAAA,CAAM,OAAO,GAAG,GAAA,GAAM,KAAA,EAAO,MAAM,KAAK,CAAA;AAAA,IACvD;AAAA,EACF;AACF;;;AC/HO,SAAS,iBAAA,CACd,MAAA,EACA,OAAA,EACA,WAAA,EACA,YAAA,EACmD;AACnD,EAAA,MAAM,QAAA,GAAW,MAAA,YAAkB,gBAAA,GAAmB,MAAA,CAAO,aAAa,MAAA,CAAO,KAAA;AACjF,EAAA,MAAM,SAAA,GAAY,MAAA,YAAkB,gBAAA,GAAmB,MAAA,CAAO,cAAc,MAAA,CAAO,MAAA;AAEnF,EAAA,IAAI,QAAA,KAAa,CAAA,IAAK,SAAA,KAAc,CAAA,EAAG;AACrC,IAAA,OAAO,EAAE,KAAA,EAAO,IAAI,IAAA,EAAM,CAAA,EAAG,MAAM,CAAA,EAAE;AAAA,EACvC;AAEA,EAAA,MAAM,UAAA,GAAa,IAAA;AACnB,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,QAAA,GAAW,OAAA,CAAQ,WAAA;AACzC,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,QAAA,GAAW,UAAA,GAAa,OAAA,CAAQ,WAAA;AAEtD,EAAA,MAAM,UAAU,WAAA,IAAe,QAAA;AAC/B,EAAA,MAAM,UAAU,YAAA,IAAgB,SAAA;AAChC,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,OAAA,GAAU,KAAK,CAAA;AACvC,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,OAAA,GAAU,KAAK,CAAA;AAEvC,EAAA,IAAI,IAAA,IAAQ,CAAA,IAAK,IAAA,IAAQ,CAAA,EAAG;AAC1B,IAAA,OAAO,EAAE,KAAA,EAAO,IAAI,IAAA,EAAM,CAAA,EAAG,MAAM,CAAA,EAAE;AAAA,EACvC;AAEA,EAAA,MAAM,EAAE,GAAA,EAAI,GAAI,qBAAA,CAAsB,MAAM,IAAI,CAAA;AAChD,EAAA,GAAA,CAAI,SAAA,CAAU,MAAA,EAAQ,CAAA,EAAG,CAAA,EAAG,MAAM,IAAI,CAAA;AACtC,EAAA,MAAM,YAAY,GAAA,CAAI,YAAA,CAAa,CAAA,EAAG,CAAA,EAAG,MAAM,IAAI,CAAA;AACnD,EAAA,MAAM,SAAS,SAAA,CAAU,IAAA;AAEzB,EAAA,MAAM,QAAoB,EAAC;AAE3B,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,EAAM,CAAA,EAAA,EAAK;AAC7B,IAAA,MAAM,MAAmB,EAAC;AAC1B,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,EAAM,CAAA,EAAA,EAAK;AAC7B,MAAA,MAAM,CAAA,GAAA,CAAK,CAAA,GAAI,IAAA,GAAO,CAAA,IAAK,CAAA;AAC3B,MAAA,MAAM,CAAA,GAAI,OAAO,CAAC,CAAA;AAClB,MAAA,MAAM,CAAA,GAAI,MAAA,CAAO,CAAA,GAAI,CAAC,CAAA;AACtB,MAAA,MAAM,CAAA,GAAI,MAAA,CAAO,CAAA,GAAI,CAAC,CAAA;AACtB,MAAA,MAAM,CAAA,GAAI,MAAA,CAAO,CAAA,GAAI,CAAC,CAAA;AAEtB,MAAA,MAAM,GAAA,GAAM,KAAA,GAAQ,CAAA,GAAI,KAAA,GAAQ,IAAI,KAAA,GAAQ,CAAA;AAC5C,MAAA,MAAM,cAAc,eAAA,CAAgB,GAAA,EAAK,OAAA,CAAQ,UAAA,EAAY,QAAQ,QAAQ,CAAA;AAC7E,MAAA,MAAM,cAAc,WAAA,CAAY,WAAA,EAAa,CAAA,EAAG,CAAA,EAAG,QAAQ,cAAc,CAAA;AACzE,MAAA,MAAM,OAAO,OAAA,CAAQ,UAAA,GACjB,iBAAiB,WAAA,EAAa,OAAA,CAAQ,YAAY,CAAA,EAAG,CAAA,EAAG,IAAA,EAAM,OAAA,CAAQ,MAAM,CAAA,GAC5E,eAAA,CAAgB,aAAa,OAAA,CAAQ,OAAA,EAAS,QAAQ,MAAM,CAAA;AAEhE,MAAA,GAAA,CAAI,KAAK,EAAE,IAAA,EAAM,GAAG,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA;AAAA,IAC/B;AACA,IAAA,KAAA,CAAM,KAAK,GAAG,CAAA;AAAA,EAChB;AAEA,EAAA,OAAO,EAAE,KAAA,EAAO,IAAA,EAAM,IAAA,EAAK;AAC7B;AAKA,eAAsB,kBAAA,CACpB,OACA,OAAA,EACA,WAAA,EACA,cACA,SAAA,GAAoB,EAAA,EACpB,WAAA,GAAsB,EAAA,EACtB,UAAA,EAC4E;AAC5E,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,UAAU,WAAW,CAAA;AACrD,EAAA,MAAM,WAAA,GAAc,IAAA,CAAK,IAAA,CAAK,QAAA,GAAW,SAAS,CAAA;AAClD,EAAA,MAAM,SAAuB,EAAC;AAC9B,EAAA,IAAI,IAAA,GAAO,CAAA;AACX,EAAA,IAAI,IAAA,GAAO,CAAA;AAEX,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,WAAA,EAAa,CAAA,EAAA,EAAK;AACpC,IAAA,MAAM,OAAQ,CAAA,GAAI,SAAA;AAClB,IAAA,IAAI,OAAO,QAAA,EAAU;AAErB,IAAA,KAAA,CAAM,WAAA,GAAc,IAAA;AACpB,IAAA,MAAM,IAAI,OAAA,CAAc,CAAC,OAAA,KAAY;AACnC,MAAA,MAAM,UAAU,MAAM;AACpB,QAAA,KAAA,CAAM,mBAAA,CAAoB,UAAU,OAAO,CAAA;AAC3C,QAAA,OAAA,EAAQ;AAAA,MACV,CAAA;AACA,MAAA,KAAA,CAAM,gBAAA,CAAiB,UAAU,OAAO,CAAA;AAAA,IAC1C,CAAC,CAAA;AAED,IAAA,MAAM,MAAA,GAAS,iBAAA,CAAkB,KAAA,EAAO,OAAA,EAAS,aAAa,YAAY,CAAA;AAC1E,IAAA,MAAA,CAAO,IAAA,CAAK,OAAO,KAAK,CAAA;AACxB,IAAA,IAAA,GAAO,MAAA,CAAO,IAAA;AACd,IAAA,IAAA,GAAO,MAAA,CAAO,IAAA;AAEd,IAAA,UAAA,GAAA,CAAc,CAAA,GAAI,KAAK,WAAW,CAAA;AAAA,EACpC;AAEA,EAAA,OAAO,EAAE,MAAA,EAAQ,IAAA,EAAM,IAAA,EAAM,KAAK,SAAA,EAAU;AAC9C;AAKA,eAAsB,gBAAA,CACpB,MAAA,EACA,OAAA,EACA,WAAA,EACA,cACA,UAAA,EAC4E;AAC5E,EAAA,MAAM,GAAA,GAAMC,kBAAS,MAAM,CAAA;AAC3B,EAAA,MAAM,SAAA,GAAYC,yBAAA,CAAiB,GAAA,EAAK,IAAI,CAAA;AAE5C,EAAA,IAAI,SAAA,CAAU,WAAW,CAAA,EAAG;AAC1B,IAAA,OAAO,EAAE,QAAQ,EAAC,EAAG,MAAM,CAAA,EAAG,IAAA,EAAM,CAAA,EAAG,GAAA,EAAK,EAAA,EAAG;AAAA,EACjD;AAEA,EAAA,MAAM,IAAA,GAAO,SAAA,CAAU,CAAC,CAAA,CAAE,IAAA,CAAK,KAAA;AAC/B,EAAA,MAAM,IAAA,GAAO,SAAA,CAAU,CAAC,CAAA,CAAE,IAAA,CAAK,MAAA;AAC/B,EAAA,MAAM,QAAA,GAAW,GAAA,CAAI,GAAA,EAAK,KAAA,IAAS,IAAA;AACnC,EAAA,MAAM,QAAA,GAAW,GAAA,CAAI,GAAA,EAAK,MAAA,IAAU,IAAA;AAEpC,EAAA,MAAM,UAAA,GAAa,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AAClD,EAAA,UAAA,CAAW,KAAA,GAAQ,QAAA;AACnB,EAAA,UAAA,CAAW,MAAA,GAAS,QAAA;AACpB,EAAA,MAAM,OAAA,GAAU,UAAA,CAAW,UAAA,CAAW,IAAI,CAAA;AAE1C,EAAA,MAAM,UAAA,GAAa,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AAClD,EAAA,UAAA,CAAW,KAAA,GAAQ,QAAA;AACnB,EAAA,UAAA,CAAW,MAAA,GAAS,QAAA;AACpB,EAAA,MAAM,OAAA,GAAU,UAAA,CAAW,UAAA,CAAW,IAAI,CAAA;AAE1C,EAAA,MAAM,SAAuB,EAAC;AAC9B,EAAA,IAAI,IAAA,GAAO,CAAA;AACX,EAAA,IAAI,IAAA,GAAO,CAAA;AAEX,EAAA,IAAI,UAAA,GAAa,CAAA;AACjB,EAAA,KAAA,MAAW,KAAK,SAAA,EAAW;AAAE,IAAA,UAAA,IAAe,EAAE,KAAA,IAAS,GAAA;AAAA,EAAM;AAC7D,EAAA,MAAM,QAAA,GAAW,aAAa,SAAA,CAAU,MAAA;AACxC,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,GAAA,GAAO,QAAQ,CAAC,CAAC,CAAA;AAEjE,EAAA,MAAM,SAAA,GAAY,IAAA,CAAK,GAAA,CAAI,SAAA,CAAU,QAAQ,GAAG,CAAA;AAEhD,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,SAAA,EAAW,CAAA,EAAA,EAAK;AAClC,IAAA,MAAM,CAAA,GAAI,UAAU,CAAC,CAAA;AACrB,IAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAO,YAAA,EAAa,GAAI,CAAA;AAEtC,IAAA,IAAI,iBAAiB,CAAA,EAAG;AACtB,MAAA,OAAA,CAAQ,SAAA,CAAU,CAAA,EAAG,CAAA,EAAG,QAAA,EAAU,QAAQ,CAAA;AAC1C,MAAA,OAAA,CAAQ,SAAA,CAAU,UAAA,EAAY,CAAA,EAAG,CAAC,CAAA;AAAA,IACpC;AAEA,IAAA,MAAM,cAAA,GAAiB,IAAI,SAAA,CAAU,IAAI,iBAAA,CAAkB,KAAA,CAAM,MAAM,CAAA,EAAG,IAAA,CAAK,KAAA,EAAO,IAAA,CAAK,MAAM,CAAA;AACjG,IAAA,MAAM,UAAA,GAAa,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AAClD,IAAA,UAAA,CAAW,QAAQ,IAAA,CAAK,KAAA;AACxB,IAAA,UAAA,CAAW,SAAS,IAAA,CAAK,MAAA;AACzB,IAAA,MAAM,OAAA,GAAU,UAAA,CAAW,UAAA,CAAW,IAAI,CAAA;AAC1C,IAAA,OAAA,CAAQ,YAAA,CAAa,cAAA,EAAgB,CAAA,EAAG,CAAC,CAAA;AAEzC,IAAA,OAAA,CAAQ,UAAU,UAAA,EAAY,IAAA,CAAK,QAAQ,CAAA,EAAG,IAAA,CAAK,OAAO,CAAC,CAAA;AAE3D,IAAA,MAAM,MAAA,GAAS,iBAAA,CAAkB,UAAA,EAAY,OAAA,EAAS,aAAa,YAAY,CAAA;AAC/E,IAAA,MAAA,CAAO,IAAA,CAAK,OAAO,KAAK,CAAA;AACxB,IAAA,IAAA,GAAO,MAAA,CAAO,IAAA;AACd,IAAA,IAAA,GAAO,MAAA,CAAO,IAAA;AAEd,IAAA,IAAI,iBAAiB,CAAA,EAAG;AACtB,MAAA,OAAA,CAAQ,SAAA,CAAU,IAAA,CAAK,IAAA,IAAQ,CAAA,EAAG,IAAA,CAAK,OAAO,CAAA,EAAG,IAAA,CAAK,KAAA,EAAO,IAAA,CAAK,MAAM,CAAA;AAAA,IAC1E,CAAA,MAAA,IAAW,iBAAiB,CAAA,EAAG;AAC7B,MAAA,OAAA,CAAQ,SAAA,CAAU,CAAA,EAAG,CAAA,EAAG,QAAA,EAAU,QAAQ,CAAA;AAC1C,MAAA,OAAA,CAAQ,SAAA,CAAU,UAAA,EAAY,CAAA,EAAG,CAAC,CAAA;AAAA,IACpC;AAEA,IAAA,UAAA,GAAA,CAAc,CAAA,GAAI,KAAK,SAAS,CAAA;AAAA,EAClC;AAEA,EAAA,OAAO,EAAE,MAAA,EAAQ,IAAA,EAAM,IAAA,EAAM,GAAA,EAAI;AACnC;AAMO,SAAS,mBAAA,CACd,KACA,KAAA,EACA,OAAA,EACA,aACA,YAAA,EACA,IAAA,GAAe,GACf,QAAA,EACA;AAEA,EAAA,IAAI,OAAA,CAAQ,mBAAmB,WAAA,EAAa;AAC1C,IAAA,MAAM,SAAA,GAAY,QAAA,GAAW,EAAE,CAAA,EAAG,SAAS,CAAA,EAAG,CAAA,EAAG,QAAA,CAAS,CAAA,EAAE,GAAI,EAAE,CAAA,EAAG,GAAA,EAAK,GAAG,GAAA,EAAI;AACjF,IAAA,MAAM,WAAW,OAAA,CAAQ,WAAA,IAAe,SAAA,EAAW,OAAA,CAAQ,KAAK,EAAE,CAAA;AAClE,IAAA,oBAAA,CAAqB,GAAA,EAAK,WAAA,EAAa,YAAA,EAAc,IAAA,EAAM,SAAA,EAAW;AAAA,MACpE,WAAA,EAAa,IAAI,OAAO,CAAA,CAAA;AAAA,MACxB,eAAA,EAAiB,IAAA;AAAA,MACjB,cAAA,EAAgB,OAAA,CAAQ,aAAA,GAAgB,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,GAAA,GAAM,OAAA,CAAQ,aAAA,GAAgB,GAAG,CAAA,GAAI,IAAA;AAAA,MAC7F,YAAA,EAAc,GAAA;AAAA,MACd,OAAO,OAAA,CAAQ,cAAA;AAAA,MACf,MAAA,EAAQ,QAAQ,aAAA,GAAgB,CAAA;AAAA,MAChC,QAAA,EAAU,IAAA;AAAA,MACV,OAAA,EAAS;AAAA,KACV,CAAA;AACD,IAAA;AAAA,EACF;AAEA,EAAA,MAAM,OAAO,KAAA,CAAM,MAAA;AACnB,EAAA,IAAI,SAAS,CAAA,EAAG;AAChB,EAAA,MAAM,IAAA,GAAO,KAAA,CAAM,CAAC,CAAA,CAAE,MAAA;AAEtB,EAAA,GAAA,CAAI,SAAA,CAAU,CAAA,EAAG,CAAA,EAAG,WAAA,EAAa,YAAY,CAAA;AAE7C,EAAA,IAAI,eAAA,GAAkB,KAAA;AACtB,EAAA,MAAM,WAAA,GAAc,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,QAAQ,CAAC,CAAA;AACzC,EAAA,MAAM,WAAA,GAAc,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,QAAQ,CAAC,CAAA;AACzC,EAAA,KAAA;AACA,IAAA,KAAA,IAAS,OAAA,GAAU,CAAA,EAAG,OAAA,GAAU,IAAA,EAAM,WAAW,WAAA,EAAa;AAC5D,MAAA,MAAM,GAAA,GAAM,MAAM,OAAO,CAAA;AACzB,MAAA,KAAA,IAAS,OAAA,GAAU,CAAA,EAAG,OAAA,GAAU,IAAA,EAAM,WAAW,WAAA,EAAa;AAC5D,QAAA,IAAI,GAAA,CAAI,OAAO,CAAA,CAAE,CAAA,GAAI,GAAA,EAAK;AAAE,UAAA,eAAA,GAAkB,IAAA;AAAM,UAAA,MAAM,KAAA;AAAA,QAAO;AAAA,MACnE;AAAA,IACF;AAEA,EAAA,IAAI,CAAC,eAAA,EAAiB;AACpB,IAAA,GAAA,CAAI,SAAA,GAAY,SAAA;AAChB,IAAA,GAAA,CAAI,QAAA,CAAS,CAAA,EAAG,CAAA,EAAG,WAAA,EAAa,YAAY,CAAA;AAAA,EAC9C;AAEA,EAAA,MAAM,QAAQ,WAAA,GAAc,IAAA;AAC5B,EAAA,MAAM,QAAQ,YAAA,GAAe,IAAA;AAC7B,EAAA,MAAM,aAAa,IAAA,GAAO,IAAA;AAE1B,EAAA,MAAM,cAAA,GAAiB,UAAU,SAAA,IAAa,CAAA;AAC9C,EAAA,MAAM,eAAA,GAAkB,QAAQ,cAAA,KAAmB,MAAA;AACnD,EAAA,MAAM,aAAA,GAAgB,mBAAmB,UAAA,GAAa,GAAA;AACtD,EAAA,MAAM,WAAA,GAAc,CAAC,aAAA,IAAiB,CAAC,EAAE,QAAA,IAAY,OAAA,CAAQ,aAAA,GAAgB,CAAA,IAAK,cAAA,GAAiB,IAAA,CAAA;AAEnG,EAAA,MAAM,EAAA,GAAK,QAAQ,UAAA,IAAc,SAAA;AACjC,EAAA,MAAM,GAAA,GAAM,SAAS,EAAA,CAAG,KAAA,CAAM,GAAG,CAAC,CAAA,EAAG,EAAE,CAAA,IAAK,GAAA;AAC5C,EAAA,MAAM,GAAA,GAAM,SAAS,EAAA,CAAG,KAAA,CAAM,GAAG,CAAC,CAAA,EAAG,EAAE,CAAA,IAAK,GAAA;AAC5C,EAAA,MAAM,GAAA,GAAM,SAAS,EAAA,CAAG,KAAA,CAAM,GAAG,CAAC,CAAA,EAAG,EAAE,CAAA,IAAK,GAAA;AAE5C,EAAA,MAAM,SAAS,OAAA,CAAQ,WAAA,IAAe,SAAA,EAAW,OAAA,CAAQ,KAAK,EAAE,CAAA;AAChE,EAAA,MAAM,GAAA,GAAM,SAAS,KAAA,CAAM,SAAA,CAAU,GAAG,CAAC,CAAA,EAAG,EAAE,CAAA,IAAK,GAAA;AACnD,EAAA,MAAM,GAAA,GAAM,SAAS,KAAA,CAAM,SAAA,CAAU,GAAG,CAAC,CAAA,EAAG,EAAE,CAAA,IAAK,GAAA;AACnD,EAAA,MAAM,GAAA,GAAM,SAAS,KAAA,CAAM,SAAA,CAAU,GAAG,CAAC,CAAA,EAAG,EAAE,CAAA,IAAK,GAAA;AAEnD,EAAA,MAAM,WAAA,GAAc,aAAa,GAAA,GAAS,IAAA,GACtB,aAAa,IAAA,GAAS,GAAA,GACtB,UAAA,GAAa,GAAA,GAAS,GAAA,GACtB,CAAA;AACpB,EAAA,MAAM,oBAAA,GAAuB,QAAQ,WAAA,GAAc,WAAA;AAEnD,EAAA,IAAI,cAAc,CAAA,EAAG,WAAA,GAAc,IAAA,EAAM,WAAA,GAAc,GAAG,WAAA,GAAc,IAAA;AACxE,EAAA,IAAI,SAAA,GAAY,GAAG,SAAA,GAAY,CAAA;AAC/B,EAAA,IAAI,eAAe,QAAA,EAAU;AAC3B,IAAA,SAAA,GAAY,QAAA,CAAS,CAAA;AACrB,IAAA,SAAA,GAAY,QAAA,CAAS,CAAA;AACrB,IAAA,MAAM,eAAA,GAAmB,IAAA,GAAO,oBAAA,GAAuB,IAAA,GAAQ,QAAQ,aAAA,GAAgB,IAAA;AACvF,IAAA,WAAA,GAAc,IAAA,CAAK,IAAI,CAAA,EAAG,IAAA,CAAK,OAAO,SAAA,GAAY,eAAA,IAAmB,IAAI,CAAA,GAAI,CAAC,CAAA;AAC9E,IAAA,WAAA,GAAc,IAAA,CAAK,IAAI,IAAA,EAAM,IAAA,CAAK,MAAM,SAAA,GAAY,eAAA,IAAmB,IAAI,CAAA,GAAI,CAAC,CAAA;AAChF,IAAA,WAAA,GAAc,IAAA,CAAK,IAAI,CAAA,EAAG,IAAA,CAAK,OAAO,SAAA,GAAY,eAAA,IAAmB,IAAI,CAAA,GAAI,CAAC,CAAA;AAC9E,IAAA,WAAA,GAAc,IAAA,CAAK,IAAI,IAAA,EAAM,IAAA,CAAK,MAAM,SAAA,GAAY,eAAA,IAAmB,IAAI,CAAA,GAAI,CAAC,CAAA;AAAA,EAClF;AAEA,EAAA,MAAM,YAAY,OAAA,CAAQ,cAAA;AAC1B,EAAA,MAAM,YAAY,OAAA,CAAQ,cAAA;AAC1B,EAAA,MAAM,cAAc,SAAA,KAAc,MAAA;AAClC,EAAA,MAAM,gBAAgB,OAAA,CAAQ,aAAA;AAC9B,EAAA,MAAM,cAAc,OAAA,CAAQ,WAAA;AAC5B,EAAA,MAAM,iBAAA,GAAoB,oBAAA;AAC1B,EAAA,MAAM,aAAa,OAAA,CAAQ,MAAA;AAC3B,EAAA,MAAM,YAAY,OAAA,CAAQ,SAAA;AAC1B,EAAA,MAAM,MAAA,GAAS,KAAK,EAAA,GAAK,CAAA;AACzB,EAAA,MAAM,UAAU,CAAA,GAAI,IAAA;AACpB,EAAA,MAAM,UAAU,CAAA,GAAI,IAAA;AAEpB,EAAA,IAAI,aAAA,GAAgB,EAAA;AACpB,EAAA,IAAI,SAAA,GAAY,EAAA;AAEhB,EAAA,IAAI,OAAA,CAAQ,eAAe,MAAA,EAAQ;AACjC,IAAA,MAAM,YAAY,IAAA,CAAK,GAAA,CAAI,OAAO,KAAK,CAAA,GAAI,MAAM,OAAA,CAAQ,YAAA;AAEzD,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,EAAM,CAAA,EAAA,EAAK;AAC7B,MAAA,MAAM,OAAA,GAAU,MAAM,CAAC,CAAA;AACvB,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,EAAM,CAAA,EAAA,EAAK;AAC7B,QAAA,MAAM,IAAA,GAAO,QAAQ,CAAC,CAAA;AACtB,QAAA,IAAI,IAAA,CAAK,IAAI,EAAA,EAAI;AAEjB,QAAA,MAAM,GAAA,GAAA,CAAO,QAAQ,IAAA,CAAK,CAAA,GAAI,QAAQ,IAAA,CAAK,CAAA,GAAI,KAAA,GAAQ,IAAA,CAAK,CAAA,IAAK,aAAA;AACjE,QAAA,MAAM,SAAA,GAAY,UAAA,GAAa,CAAA,GAAI,GAAA,GAAM,GAAA;AACzC,QAAA,IAAI,YAAY,IAAA,EAAM;AAEtB,QAAA,MAAM,OAAA,GAAU,WAAA,GAAc,CAAA,GAC1B,sBAAA,CAAuB,CAAA,EAAG,GAAG,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,SAAA,EAAW,SAAS,CAAA;AAEvE,QAAA,IAAI,QAAA,GAAW,CAAA;AACf,QAAA,IAAI,SAAA,GAAY,CAAA;AAChB,QAAA,IAAI,SAAA,GAAY,CAAA;AAChB,QAAA,IAAI,SAAA,GAAY,CAAA;AAChB,QAAA,IAAI,UAAA,GAAa,CAAA;AAEjB,QAAA,IAAI,WAAA,IAAe,KAAK,WAAA,IAAe,CAAA,IAAK,eAAe,CAAA,IAAK,WAAA,IAAe,KAAK,WAAA,EAAa;AAC/F,UAAA,MAAM,EAAA,GAAK,kBAAA;AAAA,YACT,CAAA,GAAI,OAAA;AAAA,YAAS,CAAA,GAAI,OAAA;AAAA,YAAS,SAAA;AAAA,YAAW,SAAA;AAAA,YAAW,cAAA;AAAA,YAChD,aAAA;AAAA,YAAe,KAAA;AAAA,YAAO,KAAA;AAAA,YAAO,WAAA;AAAA,YAAa;AAAA,WAC5C;AACA,UAAA,QAAA,GAAW,EAAA,CAAG,KAAA;AACd,UAAA,SAAA,GAAY,EAAA,CAAG,OAAA;AACf,UAAA,SAAA,GAAY,EAAA,CAAG,OAAA;AACf,UAAA,SAAA,GAAY,EAAA,CAAG,IAAA;AACf,UAAA,UAAA,GAAa,EAAA,CAAG,UAAA;AAAA,QAClB;AAEA,QAAA,MAAM,MAAA,GAAS,SAAA,GAAY,SAAA,GAAY,OAAA,GAAU,QAAA;AACjD,QAAA,IAAI,SAAS,GAAA,EAAK;AAElB,QAAA,MAAM,EAAA,GAAK,CAAA,GAAI,KAAA,GAAQ,KAAA,GAAQ,GAAA,GAAM,SAAA;AACrC,QAAA,MAAM,EAAA,GAAK,CAAA,GAAI,KAAA,GAAQ,KAAA,GAAQ,GAAA,GAAM,SAAA;AAErC,QAAA,IAAI,KAAA;AACJ,QAAA,IAAI,aAAa,CAAA,EAAG;AAClB,UAAA,MAAM,MAAM,eAAA,CAAgB,IAAA,EAAM,SAAA,EAAW,GAAA,EAAK,KAAK,GAAG,CAAA;AAC1D,UAAA,MAAM,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,GAAA,EAAM,GAAA,CAAI,CAAC,CAAA,GAAA,CAAK,GAAA,GAAM,GAAA,CAAI,CAAC,CAAA,IAAK,UAAA,GAAc,CAAC,CAAA;AACnE,UAAA,MAAM,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,GAAA,EAAM,GAAA,CAAI,CAAC,CAAA,GAAA,CAAK,GAAA,GAAM,GAAA,CAAI,CAAC,CAAA,IAAK,UAAA,GAAc,CAAC,CAAA;AACnE,UAAA,MAAM,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,GAAA,EAAM,GAAA,CAAI,CAAC,CAAA,GAAA,CAAK,GAAA,GAAM,GAAA,CAAI,CAAC,CAAA,IAAK,UAAA,GAAc,CAAC,CAAA;AACnE,UAAA,KAAA,GAAQ,CAAA,IAAA,EAAO,EAAE,CAAA,CAAA,EAAI,EAAE,IAAI,EAAE,CAAA,CAAA,CAAA;AAAA,QAC/B,CAAA,MAAO;AACL,UAAA,KAAA,GAAQ,eAAA,CAAgB,IAAA,EAAM,SAAA,EAAW,GAAA,EAAK,KAAK,GAAG,CAAA;AAAA,QACxD;AAEA,QAAA,MAAM,KAAA,GAAQ,KAAK,GAAA,CAAI,CAAA,EAAI,KAAK,CAAA,GAAI,aAAA,GAAiB,OAAA,IAAW,CAAA,GAAI,SAAA,CAAU,CAAA;AAE9E,QAAA,IAAI,UAAU,SAAA,EAAW;AAAE,UAAA,GAAA,CAAI,WAAA,GAAc,KAAA;AAAO,UAAA,SAAA,GAAY,KAAA;AAAA,QAAO;AACvE,QAAA,IAAI,UAAU,aAAA,EAAe;AAAE,UAAA,GAAA,CAAI,SAAA,GAAY,KAAA;AAAO,UAAA,aAAA,GAAgB,KAAA;AAAA,QAAO;AAE7E,QAAA,IAAI,UAAU,CAAA,EAAG;AACf,UAAA,MAAM,IAAI,MAAA,GAAS,CAAA;AACnB,UAAA,GAAA,CAAI,SAAS,EAAA,GAAK,MAAA,EAAQ,EAAA,GAAK,MAAA,EAAQ,GAAG,CAAC,CAAA;AAAA,QAC7C,CAAA,MAAO;AACL,UAAA,GAAA,CAAI,SAAA,EAAU;AACd,UAAA,GAAA,CAAI,GAAA,CAAI,EAAA,EAAI,EAAA,EAAI,MAAA,EAAQ,GAAG,MAAM,CAAA;AACjC,UAAA,GAAA,CAAI,IAAA,EAAK;AAAA,QACX;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAA,MAAO;AACL,IAAA,MAAM,UAAA,GAAa,IAAA;AACnB,IAAA,MAAM,WAAW,IAAA,CAAK,GAAA,CAAI,KAAA,GAAQ,UAAA,EAAY,KAAK,CAAA,GAAI,GAAA;AACvD,IAAA,MAAM,cAAc,QAAA,GAAW,CAAA;AAE/B,IAAA,IAAI,CAAC,WAAA,EAAa;AAChB,MAAA,MAAM,OAAA,GAAU,QAAQ,QAAA,KAAa,OAAA;AACrC,MAAA,GAAA,CAAI,OAAO,OAAA,GACP,CAAA,EAAG,QAAQ,CAAA,2FAAA,CAAA,GACX,GAAG,QAAQ,CAAA,8BAAA,CAAA;AACf,MAAA,GAAA,CAAI,SAAA,GAAY,QAAA;AAChB,MAAA,GAAA,CAAI,YAAA,GAAe,QAAA;AAAA,IACrB;AAEA,IAAA,IAAI,WAAA,GAA6C,IAAA;AACjD,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,WAAA,GAAc,EAAC;AACf,MAAA,MAAM,OAAA,GAAU,CAAC,GAAG,OAAA,CAAQ,OAAO,CAAA;AACnC,MAAA,MAAM,QAAQ,OAAA,CAAQ,MAAA;AACtB,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,EAAO,CAAA,EAAA,EAAK;AAC9B,QAAA,WAAA,CAAY,OAAA,CAAQ,CAAC,CAAC,CAAA,GAAI,KAAK,GAAA,CAAI,GAAA,EAAA,CAAM,CAAA,GAAI,GAAA,IAAO,KAAK,CAAA;AAAA,MAC3D;AAAA,IACF;AAEA,IAAA,MAAM,aAAA,GAAgB,CAAC,WAAA,GAAc,GAAA,CAAI,cAAa,GAAI,IAAA;AAE1D,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,EAAM,CAAA,EAAA,EAAK;AAC7B,MAAA,MAAM,OAAA,GAAU,MAAM,CAAC,CAAA;AACvB,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,EAAM,CAAA,EAAA,EAAK;AAC7B,QAAA,MAAM,IAAA,GAAO,QAAQ,CAAC,CAAA;AACtB,QAAA,IAAI,IAAA,CAAK,IAAA,KAAS,GAAA,IAAO,IAAA,CAAK,IAAI,EAAA,EAAI;AAEtC,QAAA,MAAM,OAAA,GAAU,WAAA,GAAc,CAAA,GAC1B,sBAAA,CAAuB,CAAA,EAAG,GAAG,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,SAAA,EAAW,SAAS,CAAA;AACvE,QAAA,IAAI,UAAU,IAAA,EAAM;AAEpB,QAAA,IAAI,UAAA,GAAa,CAAA;AACjB,QAAA,IAAI,SAAA,GAAY,CAAA;AAChB,QAAA,IAAI,SAAA,GAAY,CAAA;AAChB,QAAA,IAAI,SAAA,GAAY,CAAA;AAChB,QAAA,IAAI,UAAA,GAAa,CAAA;AAEjB,QAAA,IAAI,WAAA,IAAe,KAAK,WAAA,IAAe,CAAA,IAAK,eAAe,CAAA,IAAK,WAAA,IAAe,KAAK,WAAA,EAAa;AAC/F,UAAA,MAAM,EAAA,GAAK,kBAAA;AAAA,YACT,CAAA,GAAI,OAAA;AAAA,YAAS,CAAA,GAAI,OAAA;AAAA,YAAS,SAAA;AAAA,YAAW,SAAA;AAAA,YAAW,cAAA;AAAA,YAChD,aAAA;AAAA,YAAe,KAAA;AAAA,YAAO,KAAA;AAAA,YAAO,WAAA;AAAA,YAAa;AAAA,WAC5C;AACA,UAAA,UAAA,GAAa,EAAA,CAAG,KAAA;AAChB,UAAA,SAAA,GAAY,EAAA,CAAG,OAAA;AACf,UAAA,SAAA,GAAY,EAAA,CAAG,OAAA;AACf,UAAA,SAAA,GAAY,EAAA,CAAG,IAAA;AACf,UAAA,UAAA,GAAa,EAAA,CAAG,UAAA;AAAA,QAClB;AAEA,QAAA,MAAM,EAAA,GAAK,CAAA,GAAI,KAAA,GAAQ,KAAA,GAAQ,GAAA,GAAM,SAAA;AACrC,QAAA,MAAM,EAAA,GAAK,CAAA,GAAI,KAAA,GAAQ,KAAA,GAAQ,GAAA,GAAM,SAAA;AAErC,QAAA,IAAI,KAAA;AACJ,QAAA,IAAI,aAAa,CAAA,EAAG;AAClB,UAAA,MAAM,MAAM,eAAA,CAAgB,IAAA,EAAM,SAAA,EAAW,GAAA,EAAK,KAAK,GAAG,CAAA;AAC1D,UAAA,MAAM,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,GAAA,EAAM,GAAA,CAAI,CAAC,CAAA,GAAA,CAAK,GAAA,GAAM,GAAA,CAAI,CAAC,CAAA,IAAK,UAAA,GAAc,CAAC,CAAA;AACnE,UAAA,MAAM,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,GAAA,EAAM,GAAA,CAAI,CAAC,CAAA,GAAA,CAAK,GAAA,GAAM,GAAA,CAAI,CAAC,CAAA,IAAK,UAAA,GAAc,CAAC,CAAA;AACnE,UAAA,MAAM,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,GAAA,EAAM,GAAA,CAAI,CAAC,CAAA,GAAA,CAAK,GAAA,GAAM,GAAA,CAAI,CAAC,CAAA,IAAK,UAAA,GAAc,CAAC,CAAA;AACnE,UAAA,KAAA,GAAQ,CAAA,IAAA,EAAO,EAAE,CAAA,CAAA,EAAI,EAAE,IAAI,EAAE,CAAA,CAAA,CAAA;AAAA,QAC/B,CAAA,MAAO;AACL,UAAA,KAAA,GAAQ,eAAA,CAAgB,IAAA,EAAM,SAAA,EAAW,GAAA,EAAK,KAAK,GAAG,CAAA;AAAA,QACxD;AAEA,QAAA,IAAI,WAAA,EAAa;AACf,UAAA,MAAM,MAAA,GAAS,WAAA,CAAa,IAAA,CAAK,IAAI,CAAA,IAAK,GAAA;AAC1C,UAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,CAAI,CAAA,EAAI,IAAA,CAAK,IAAI,aAAA,GAAiB,OAAA,IAAW,CAAA,GAAI,SAAA,CAAU,CAAA,GAAI,MAAA;AACrF,UAAA,IAAI,WAAW,IAAA,EAAM;AACrB,UAAA,IAAI,aAAa,SAAA,EAAW;AAAE,YAAA,GAAA,CAAI,WAAA,GAAc,QAAA;AAAU,YAAA,SAAA,GAAY,QAAA;AAAA,UAAU;AAChF,UAAA,IAAI,UAAU,aAAA,EAAe;AAAE,YAAA,GAAA,CAAI,SAAA,GAAY,KAAA;AAAO,YAAA,aAAA,GAAgB,KAAA;AAAA,UAAO;AAC7E,UAAA,MAAM,KAAK,KAAA,GAAQ,UAAA;AACnB,UAAA,MAAM,KAAK,KAAA,GAAQ,UAAA;AACnB,UAAA,GAAA,CAAI,QAAA,CAAS,KAAK,EAAA,GAAK,GAAA,EAAK,KAAK,EAAA,GAAK,GAAA,EAAK,IAAI,EAAE,CAAA;AAAA,QACnD,CAAA,MAAO;AACL,UAAA,MAAM,KAAA,GAAQ,KAAK,GAAA,CAAI,CAAA,EAAI,KAAK,CAAA,GAAI,aAAA,GAAiB,OAAA,IAAW,CAAA,GAAI,SAAA,CAAU,CAAA;AAC9E,UAAA,IAAI,UAAU,SAAA,EAAW;AAAE,YAAA,GAAA,CAAI,WAAA,GAAc,KAAA;AAAO,YAAA,SAAA,GAAY,KAAA;AAAA,UAAO;AACvE,UAAA,IAAI,UAAU,aAAA,EAAe;AAAE,YAAA,GAAA,CAAI,SAAA,GAAY,KAAA;AAAO,YAAA,aAAA,GAAgB,KAAA;AAAA,UAAO;AAC7E,UAAA,IAAI,eAAe,CAAA,EAAG;AACpB,YAAA,GAAA,CAAI,SAAA,CAAU,IAAI,EAAE,CAAA;AACpB,YAAA,GAAA,CAAI,KAAA,CAAM,YAAY,UAAU,CAAA;AAChC,YAAA,GAAA,CAAI,QAAA,CAAS,IAAA,CAAK,IAAA,EAAM,CAAA,EAAG,CAAC,CAAA;AAC5B,YAAA,GAAA,CAAI,aAAa,aAAc,CAAA;AAAA,UACjC,CAAA,MAAO;AACL,YAAA,GAAA,CAAI,QAAA,CAAS,IAAA,CAAK,IAAA,EAAM,EAAA,EAAI,EAAE,CAAA;AAAA,UAChC;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,GAAA,CAAI,WAAA,GAAc,CAAA;AACpB;;;AC9cO,IAAM,iBAAA,GAAoB,QAAA;AAMjC,SAAS,cAAA,CAAe,OAAmB,SAAA,EAA4B;AACrE,EAAA,MAAM,OAAO,KAAA,CAAM,MAAA;AACnB,EAAA,MAAM,OAAO,IAAA,GAAO,CAAA,GAAI,KAAA,CAAM,CAAC,EAAE,MAAA,GAAS,CAAA;AAC1C,EAAA,MAAM,MAAA,GAAS,YAAY,CAAA,GAAI,CAAA;AAC/B,EAAA,MAAM,MAAM,IAAI,UAAA,CAAW,CAAA,GAAI,IAAA,GAAO,OAAO,MAAM,CAAA;AACnD,EAAA,GAAA,CAAI,CAAC,CAAA,GAAI,MAAA;AACT,EAAA,IAAI,CAAA,GAAI,CAAA;AACR,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,EAAM,CAAA,EAAA,EAAK;AAC7B,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,EAAM,CAAA,EAAA,EAAK;AAC7B,MAAA,MAAM,IAAA,GAAO,KAAA,CAAM,CAAC,CAAA,CAAE,CAAC,CAAA;AACvB,MAAA,IAAI,SAAA,EAAW;AACb,QAAA,GAAA,CAAI,CAAA,EAAG,IAAI,IAAA,CAAK,CAAA;AAChB,QAAA,GAAA,CAAI,CAAA,EAAG,IAAI,IAAA,CAAK,CAAA;AAChB,QAAA,GAAA,CAAI,CAAA,EAAG,IAAI,IAAA,CAAK,CAAA;AAAA,MAClB,CAAA,MAAO;AACL,QAAA,GAAA,CAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,KAAA,GAAQ,IAAA,CAAK,CAAA,GAAI,KAAA,GAAQ,IAAA,CAAK,CAAA,GAAI,KAAA,GAAQ,IAAA,CAAK,CAAC,CAAA;AAAA,MACxE;AAAA,IACF;AAAA,EACF;AACA,EAAA,IAAI,MAAA,GAAS,EAAA;AACb,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,GAAA,CAAI,MAAA,EAAQ,CAAA,EAAA,EAAK,MAAA,IAAU,MAAA,CAAO,YAAA,CAAa,GAAA,CAAI,CAAC,CAAC,CAAA;AACzE,EAAA,OAAO,KAAK,MAAM,CAAA;AACpB;AAEA,SAAS,eACP,OAAA,EACA,IAAA,EACA,MACA,KAAA,EACA,MAAA,EACA,KACA,QAAA,EACQ;AACR,EAAA,MAAM,CAAA,GAA6B;AAAA,IACjC,CAAA,EAAG,IAAA;AAAA,IAAM,CAAA,EAAG,IAAA;AAAA,IAAM,CAAA,EAAG,KAAA;AAAA,IAAO,CAAA,EAAG,MAAA;AAAA,IAC/B,IAAI,OAAA,CAAQ,OAAA;AAAA,IACZ,IAAI,OAAA,CAAQ,SAAA;AAAA,IACZ,IAAI,OAAA,CAAQ,cAAA;AAAA,IACZ,IAAI,OAAA,CAAQ,cAAA;AAAA,IACZ,KAAK,OAAA,CAAQ,MAAA;AAAA,IACb,IAAI,OAAA,CAAQ,aAAA;AAAA,IACZ,IAAI,OAAA,CAAQ,WAAA;AAAA,IACZ,IAAI,OAAA,CAAQ,WAAA;AAAA,IACZ,IAAI,OAAA,CAAQ,UAAA;AAAA,IACZ,IAAI,OAAA,CAAQ,YAAA;AAAA,IACZ,IAAA,EAAM,QAAQ,UAAA,KAAe;AAAA,GAC/B;AACA,EAAA,IAAI,OAAA,CAAQ,SAAA,KAAc,QAAA,EAAU,CAAA,CAAE,KAAK,OAAA,CAAQ,WAAA;AACnD,EAAA,IAAI,GAAA,KAAQ,MAAA,EAAW,CAAA,CAAE,GAAA,GAAM,GAAA;AAC/B,EAAA,IAAI,QAAA,IAAY,IAAA,GAAO,IAAA;AACvB,EAAA,OAAO,IAAA,CAAK,UAAU,CAAC,CAAA;AACzB;AAEA,IAAM,UAAA,GAAa,4DAA4D,iBAAiB,CAAA,+BAAA,CAAA;AAKzF,SAAS,iBAAA,CACd,KAAA,EACA,OAAA,EACA,KAAA,EACA,MAAA,EACQ;AACR,EAAA,MAAM,OAAO,KAAA,CAAM,MAAA;AACnB,EAAA,IAAI,IAAA,KAAS,GAAG,OAAO,EAAA;AACvB,EAAA,MAAM,IAAA,GAAO,KAAA,CAAM,CAAC,CAAA,CAAE,MAAA;AACtB,EAAA,MAAM,WAAA,GAAc,QAAQ,SAAA,KAAc,WAAA;AAC1C,EAAA,MAAM,IAAA,GAAO,cAAA,CAAe,KAAA,EAAO,WAAW,CAAA;AAC9C,EAAA,MAAM,EAAA,GAAK,CAAA,GAAA,EAAM,IAAA,CAAK,MAAA,EAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA;AACvD,EAAA,MAAM,OAAO,cAAA,CAAe,OAAA,EAAS,IAAA,EAAM,IAAA,EAAM,OAAO,MAAM,CAAA;AAE9D,EAAA,OAAO,CAAA;AAAA,YAAA,EACK,EAAE,CAAA,qBAAA,EAAwB,IAAI,CAAA,SAAA,EAAY,KAAK,aAAa,MAAM,CAAA;AAAA,oCAAA,EAC1C,EAAE,QAAQ,IAAI,CAAA;AAAA,EAClD,UAAU;AAAA,uBAAA,CAAA;AAEZ;AAKO,SAAS,yBAAA,CACd,MAAA,EACA,OAAA,EACA,GAAA,EACA,OACA,MAAA,EACQ;AACR,EAAA,IAAI,MAAA,CAAO,MAAA,KAAW,CAAA,EAAG,OAAO,EAAA;AAChC,EAAA,MAAM,IAAA,GAAO,MAAA,CAAO,CAAC,CAAA,CAAE,MAAA;AACvB,EAAA,MAAM,IAAA,GAAO,MAAA,CAAO,CAAC,CAAA,CAAE,CAAC,CAAA,CAAE,MAAA;AAC1B,EAAA,MAAM,WAAA,GAAc,QAAQ,SAAA,KAAc,WAAA;AAC1C,EAAA,MAAM,UAAU,MAAA,CAAO,GAAA,CAAI,OAAK,cAAA,CAAe,CAAA,EAAG,WAAW,CAAC,CAAA;AAC9D,EAAA,MAAM,EAAA,GAAK,CAAA,GAAA,EAAM,IAAA,CAAK,MAAA,EAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA;AACvD,EAAA,MAAM,IAAA,GAAO,eAAe,OAAA,EAAS,IAAA,EAAM,MAAM,KAAA,EAAO,MAAA,EAAQ,KAAK,IAAI,CAAA;AAEzE,EAAA,OAAO,CAAA;AAAA,YAAA,EACK,EAAE,CAAA,qBAAA,EAAwB,IAAI,CAAA,SAAA,EAAY,KAAK,aAAa,MAAM,CAAA;AAAA,oCAAA,EAC1C,EAAE,CAAA,IAAA,EAAO,IAAA,CAAK,SAAA,CAAU,OAAO,CAAC,CAAA;AAAA,EACpE,UAAU;AAAA,gCAAA,CAAA;AAEZ;;;ACxFA,eAAsB,OAAA,CACpB,MAAA,EACA,MAAA,EACA,EAAE,QAAA,GAAW,EAAA,EAAI,KAAA,GAAQ,SAAA,EAAW,OAAA,GAAU,EAAC,EAAE,GAA0B,EAAC,EAC7D;AACf,EAAA,IAAI,EAAA;AACJ,EAAA,IAAI,OAAO,WAAW,QAAA,EAAU;AAC9B,IAAA,MAAM,GAAA,GAAM,IAAI,KAAA,EAAM;AACtB,IAAA,GAAA,CAAI,WAAA,GAAc,WAAA;AAClB,IAAA,MAAM,IAAI,OAAA,CAAc,CAAC,OAAA,EAAS,MAAA,KAAW;AAC3C,MAAA,GAAA,CAAI,MAAA,GAAS,MAAM,OAAA,EAAQ;AAC3B,MAAA,GAAA,CAAI,OAAA,GAAU,MAAM,MAAA,CAAO,IAAI,MAAM,CAAA,sBAAA,EAAyB,MAAM,EAAE,CAAC,CAAA;AACvE,MAAA,GAAA,CAAI,GAAA,GAAM,MAAA;AAAA,IACZ,CAAC,CAAA;AACD,IAAA,EAAA,GAAK,GAAA;AAAA,EACP,CAAA,MAAA,IAAW,MAAA,YAAkB,gBAAA,IAAoB,CAAC,OAAO,QAAA,EAAU;AACjE,IAAA,MAAM,IAAI,OAAA,CAAc,CAAC,OAAA,EAAS,MAAA,KAAW;AAC3C,MAAA,MAAA,CAAO,MAAA,GAAS,MAAM,OAAA,EAAQ;AAC9B,MAAA,MAAA,CAAO,UAAU,MAAM,MAAA,CAAO,IAAI,KAAA,CAAM,sBAAsB,CAAC,CAAA;AAAA,IACjE,CAAC,CAAA;AACD,IAAA,EAAA,GAAK,MAAA;AAAA,EACP,CAAA,MAAO;AACL,IAAA,EAAA,GAAK,MAAA;AAAA,EACP;AAEA,EAAA,MAAM,MAAA,GAAS,kBAAkB,KAAK,CAAA;AACtC,EAAA,MAAM,MAAA,GAAuB,EAAE,GAAG,eAAA,EAAiB,GAAG,MAAA,EAAQ,GAAG,SAAS,QAAA,EAAS;AAEnF,EAAA,MAAM,GAAA,GAAM,MAAA,CAAO,UAAA,CAAW,IAAI,CAAA;AAClC,EAAA,IAAI,CAAC,GAAA,EAAK,MAAM,IAAI,MAAM,sCAAsC,CAAA;AAEhE,EAAA,MAAM,EAAE,OAAM,GAAI,iBAAA,CAAkB,IAAI,MAAA,EAAQ,MAAA,CAAO,KAAA,EAAO,MAAA,CAAO,MAAM,CAAA;AAC3E,EAAA,mBAAA,CAAoB,KAAK,KAAA,EAAO,MAAA,EAAQ,MAAA,CAAO,KAAA,EAAO,OAAO,MAAM,CAAA;AACrE;AAUA,eAAsB,UAAA,CACpB,MAAA,EACA,MAAA,EACA,EAAE,QAAA,GAAW,EAAA,EAAI,KAAA,GAAQ,SAAA,EAAW,OAAA,GAAU,EAAC,EAAE,GAA0B,EAAC,EACvD;AACrB,EAAA,MAAM,MAAA,GAAS,OAAO,MAAA,KAAW,QAAA,GAC7B,MAAM,KAAA,CAAM,MAAM,CAAA,CAAE,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,WAAA,EAAa,CAAA,GAC7C,MAAA;AAEJ,EAAA,MAAM,MAAA,GAAuB,EAAE,GAAG,eAAA,EAAiB,GAAG,kBAAkB,KAAK,CAAA,EAAG,GAAG,OAAA,EAAS,QAAA,EAAS;AACrG,EAAA,MAAM,GAAA,GAAM,MAAA,CAAO,UAAA,CAAW,IAAI,CAAA;AAClC,EAAA,IAAI,CAAC,GAAA,EAAK,MAAM,IAAI,MAAM,sCAAsC,CAAA;AAEhE,EAAA,MAAM,EAAE,MAAA,EAAQ,GAAA,EAAI,GAAI,MAAM,gBAAA,CAAiB,MAAA,EAAQ,MAAA,EAAQ,MAAA,CAAO,KAAA,EAAO,MAAA,CAAO,MAAM,CAAA;AAE1F,EAAA,IAAI,SAAA,GAAY,KAAA;AAChB,EAAA,IAAI,MAAA;AACJ,EAAA,IAAI,CAAA,GAAI,CAAA;AACR,EAAA,IAAI,IAAA,GAAO,YAAY,GAAA,EAAI;AAC3B,EAAA,MAAM,WAAW,GAAA,GAAO,GAAA;AAExB,EAAA,MAAM,IAAA,GAAO,CAAC,GAAA,KAAgB;AAC5B,IAAA,IAAI,SAAA,EAAW;AACf,IAAA,IAAI,GAAA,GAAM,QAAQ,QAAA,EAAU;AAC1B,MAAA,mBAAA,CAAoB,GAAA,EAAK,OAAO,CAAC,CAAA,EAAG,QAAQ,MAAA,CAAO,KAAA,EAAO,OAAO,MAAM,CAAA;AACvE,MAAA,CAAA,GAAA,CAAK,CAAA,GAAI,KAAK,MAAA,CAAO,MAAA;AACrB,MAAA,IAAA,GAAO,GAAA;AAAA,IACT;AACA,IAAA,MAAA,GAAS,sBAAsB,IAAI,CAAA;AAAA,EACrC,CAAA;AACA,EAAA,MAAA,GAAS,sBAAsB,IAAI,CAAA;AAEnC,EAAA,OAAO,MAAM;AAAE,IAAA,SAAA,GAAY,IAAA;AAAM,IAAA,oBAAA,CAAqB,MAAM,CAAA;AAAA,EAAG,CAAA;AACjE;AAUA,eAAsB,YAAA,CACpB,MAAA,EACA,MAAA,EACA,EAAE,QAAA,GAAW,EAAA,EAAI,KAAA,GAAQ,SAAA,EAAW,OAAA,GAAU,EAAC,EAAE,GAA0B,EAAC,EACvD;AACrB,EAAA,IAAI,KAAA;AACJ,EAAA,IAAI,OAAO,WAAW,QAAA,EAAU;AAC9B,IAAA,KAAA,GAAQ,QAAA,CAAS,cAAc,OAAO,CAAA;AACtC,IAAA,KAAA,CAAM,WAAA,GAAc,WAAA;AACpB,IAAA,KAAA,CAAM,GAAA,GAAM,MAAA;AACZ,IAAA,MAAM,IAAI,OAAA,CAAc,CAAC,OAAA,EAAS,MAAA,KAAW;AAC3C,MAAA,KAAA,CAAM,YAAA,GAAe,MAAM,OAAA,EAAQ;AACnC,MAAA,KAAA,CAAM,OAAA,GAAU,MAAM,MAAA,CAAO,IAAI,MAAM,CAAA,sBAAA,EAAyB,MAAM,EAAE,CAAC,CAAA;AAAA,IAC3E,CAAC,CAAA;AAAA,EACH,CAAA,MAAO;AACL,IAAA,KAAA,GAAQ,MAAA;AAAA,EACV;AAEA,EAAA,MAAM,MAAA,GAAuB,EAAE,GAAG,eAAA,EAAiB,GAAG,kBAAkB,KAAK,CAAA,EAAG,GAAG,OAAA,EAAS,QAAA,EAAS;AACrG,EAAA,MAAM,GAAA,GAAM,MAAA,CAAO,UAAA,CAAW,IAAI,CAAA;AAClC,EAAA,IAAI,CAAC,GAAA,EAAK,MAAM,IAAI,MAAM,sCAAsC,CAAA;AAEhE,EAAA,MAAM,EAAE,MAAA,EAAQ,GAAA,EAAI,GAAI,MAAM,kBAAA,CAAmB,KAAA,EAAO,MAAA,EAAQ,MAAA,CAAO,KAAA,EAAO,MAAA,CAAO,MAAM,CAAA;AAE3F,EAAA,IAAI,SAAA,GAAY,KAAA;AAChB,EAAA,IAAI,MAAA;AACJ,EAAA,IAAI,CAAA,GAAI,CAAA;AACR,EAAA,IAAI,IAAA,GAAO,YAAY,GAAA,EAAI;AAC3B,EAAA,MAAM,WAAW,GAAA,GAAO,GAAA;AAExB,EAAA,MAAM,IAAA,GAAO,CAAC,GAAA,KAAgB;AAC5B,IAAA,IAAI,SAAA,EAAW;AACf,IAAA,IAAI,GAAA,GAAM,QAAQ,QAAA,EAAU;AAC1B,MAAA,mBAAA,CAAoB,GAAA,EAAK,OAAO,CAAC,CAAA,EAAG,QAAQ,MAAA,CAAO,KAAA,EAAO,OAAO,MAAM,CAAA;AACvE,MAAA,CAAA,GAAA,CAAK,CAAA,GAAI,KAAK,MAAA,CAAO,MAAA;AACrB,MAAA,IAAA,GAAO,GAAA;AAAA,IACT;AACA,IAAA,MAAA,GAAS,sBAAsB,IAAI,CAAA;AAAA,EACrC,CAAA;AACA,EAAA,MAAA,GAAS,sBAAsB,IAAI,CAAA;AAEnC,EAAA,OAAO,MAAM;AAAE,IAAA,SAAA,GAAY,IAAA;AAAM,IAAA,oBAAA,CAAqB,MAAM,CAAA;AAAA,EAAG,CAAA;AACjE;;;ACpIO,SAAS,qBACd,GAAA,EACA,KAAA,EACA,QACA,IAAA,EACA,OAAA,GAAiC,EAAC,EAC5B;AACN,EAAA,MAAM;AAAA,IACJ,QAAA,GAAc,EAAA;AAAA,IACd,KAAA,GAAc,4BAAA;AAAA,IACd,WAAA,GAAc,MAAA;AAAA,IACd,KAAA;AAAA,IACA,KAAA,GAAc,CAAA;AAAA,IACd,OAAA,GAAc,IAAA;AAAA,IACd,UAAA,GAAc,EAAA;AAAA,IACd,SAAA,GAAc;AAAA,GAChB,GAAI,OAAA;AACJ,EAAA,MAAM,cAAA,GAAiB,WAAA,KAAgB,SAAA,GAAY,SAAA,GAAY,SAAA,CAAA;AAE/D,EAAA,MAAM,QAAQ,QAAA,GAAW,IAAA;AACzB,EAAA,MAAM,QAAQ,QAAA,GAAW,GAAA;AACzB,EAAA,MAAM,IAAA,GAAQ,IAAA,CAAK,IAAA,CAAK,KAAA,GAAS,KAAK,CAAA;AACtC,EAAA,MAAM,IAAA,GAAQ,IAAA,CAAK,IAAA,CAAK,MAAA,GAAS,KAAK,CAAA;AAEtC,EAAA,GAAA,CAAI,SAAA,CAAU,CAAA,EAAG,CAAA,EAAG,KAAA,EAAO,MAAM,CAAA;AACjC,EAAA,GAAA,CAAI,IAAA,GAAO,GAAG,QAAQ,CAAA,YAAA,CAAA;AACtB,EAAA,GAAA,CAAI,YAAA,GAAe,KAAA;AAEnB,EAAA,IAAI,EAAA,GAAK,GAAA,EAAK,EAAA,GAAK,GAAA,EAAK,EAAA,GAAK,GAAA;AAC7B,EAAA,IAAI,SAAA,EAAW;AAAE,IAAA,EAAA,GAAK,EAAA;AAAI,IAAA,EAAA,GAAK,EAAA;AAAI,IAAA,EAAA,GAAK,EAAA;AAAA,EAAI;AAC5C,EAAA,IAAI,KAAA,EAAO;AACT,IAAA,MAAM,CAAA,GAAI,WAAW,KAAK,CAAA;AAC1B,IAAA,IAAI,CAAA,EAAG;AAAE,MAAA,EAAA,GAAK,CAAA,CAAE,CAAA;AAAG,MAAA,EAAA,GAAK,CAAA,CAAE,CAAA;AAAG,MAAA,EAAA,GAAK,CAAA,CAAE,CAAA;AAAA,IAAG;AAAA,EACzC;AAEA,EAAA,IAAI,GAAA,GAAM,GAAA,EAAK,GAAA,GAAM,GAAA,EAAK,GAAA,GAAM,CAAA;AAChC,EAAA,MAAM,EAAA,GAAK,WAAW,cAAc,CAAA;AACpC,EAAA,IAAI,EAAA,EAAI;AAAE,IAAA,GAAA,GAAM,EAAA,CAAG,CAAA;AAAG,IAAA,GAAA,GAAM,EAAA,CAAG,CAAA;AAAG,IAAA,GAAA,GAAM,EAAA,CAAG,CAAA;AAAA,EAAG;AAE9C,EAAA,MAAM,SAAS,IAAA,GAAO,UAAA;AAEtB,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,EAAM,CAAA,EAAA,EAAK;AAC7B,IAAA,IAAI,KAAA,CAAM,CAAA,GAAI,EAAA,EAAI,CAAC,IAAI,OAAA,EAAS;AAEhC,IAAA,MAAM,YAAY,GAAA,GAAM,KAAA,CAAM,IAAI,EAAA,EAAI,CAAC,IAAI,GAAA,IAAO,KAAA;AAClD,IAAA,MAAM,KAAA,GAAW,KAAA,CAAM,CAAA,GAAI,EAAA,EAAI,EAAE,CAAA,GAAI,MAAA;AACrC,IAAA,MAAM,UAAW,IAAA,CAAK,KAAA,CAAA,CAAO,OAAO,QAAA,GAAW,CAAA,GAAI,SAAS,MAAM,CAAA;AAClE,IAAA,MAAM,IAAW,CAAA,GAAI,KAAA;AAErB,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,IAAK,UAAA,EAAY,CAAA,EAAA,EAAK;AACpC,MAAA,MAAM,GAAA,GAAM,WAAW,UAAA,GAAa,CAAA,CAAA;AACpC,MAAA,IAAI,GAAA,GAAM,CAAA,IAAK,GAAA,IAAO,IAAA,EAAM;AAE5B,MAAA,MAAM,IAAI,GAAA,GAAM,KAAA;AAChB,MAAA,MAAM,QAAA,GAAW,KAAA,CAAM,CAAA,GAAI,EAAA,GAAK,IAAA,CAAK,KAAA,CAAM,IAAA,GAAO,CAAA,GAAI,CAAC,CAAA,EAAG,GAAA,GAAM,CAAC,CAAA;AACjE,MAAA,MAAM,KAAK,KAAA,CAAM,IAAA,CAAK,MAAM,QAAA,GAAW,KAAA,CAAM,MAAM,CAAC,CAAA;AACpD,MAAA,MAAM,SAAS,CAAA,GAAI,UAAA;AAEnB,MAAA,IAAI,MAAM,UAAA,EAAY;AACpB,QAAA,GAAA,CAAI,SAAA,GAAY,CAAA,KAAA,EAAQ,GAAG,CAAA,CAAA,EAAI,GAAG,IAAI,GAAG,CAAA,CAAA,EAAI,SAAA,GAAY,GAAA,GAAO,IAAI,CAAA,CAAA,CAAA;AAAA,MACtE,CAAA,MAAO;AACL,QAAA,MAAM,KAAA,GAAQ,SAAA,GAAY,MAAA,GAAS,IAAA,GAAO,MAAA,GAAS,IAAA;AACnD,QAAA,GAAA,CAAI,SAAA,GAAY,QAAQ,EAAE,CAAA,CAAA,EAAI,EAAE,CAAA,CAAA,EAAI,EAAE,IAAI,KAAK,CAAA,CAAA,CAAA;AAAA,MACjD;AACA,MAAA,GAAA,CAAI,QAAA,CAAS,EAAA,EAAI,CAAA,EAAG,CAAC,CAAA;AAAA,IACvB;AAAA,EACF;AACF;;;ACrEO,SAAS,qBAAA,CACd,GAAA,EACA,KAAA,EACA,MAAA,EACA,MACA,QAAA,GAAqC,EAAE,CAAA,EAAG,GAAA,EAAK,CAAA,EAAG,GAAA,EAAI,EACtD,OAAA,GAAkC,EAAC,EAC7B;AACN,EAAA,MAAM;AAAA,IACJ,QAAA,GAAc,EAAA;AAAA,IACd,KAAA,GAAc,yBAAA;AAAA,IACd,WAAA,GAAc,MAAA;AAAA,IACd,KAAA;AAAA,IACA,KAAA,GAAc,CAAA;AAAA,IACd,KAAA,GAAc,GAAA;AAAA,IACd,SAAA,GAAc;AAAA,GAChB,GAAI,OAAA;AACJ,EAAA,MAAM,cAAA,GAAiB,WAAA,KAAgB,SAAA,GAAY,SAAA,GAAY,SAAA,CAAA;AAE/D,EAAA,GAAA,CAAI,SAAA,CAAU,CAAA,EAAG,CAAA,EAAG,KAAA,EAAO,MAAM,CAAA;AACjC,EAAA,GAAA,CAAI,YAAA,GAAe,QAAA;AACnB,EAAA,GAAA,CAAI,SAAA,GAAe,QAAA;AAEnB,EAAA,MAAM,EAAA,GAAK,KAAA,IAAU,GAAA,GAAM,QAAA,CAAS,CAAA,GAAI,GAAA,CAAA;AACxC,EAAA,MAAM,EAAA,GAAK,MAAA,IAAU,GAAA,GAAM,QAAA,CAAS,CAAA,GAAI,GAAA,CAAA;AACxC,EAAA,MAAM,OAAO,IAAA,CAAK,IAAA,CAAK,QAAQ,KAAA,GAAQ,MAAA,GAAS,MAAM,CAAA,GAAI,IAAA;AAE1D,EAAA,IAAI,EAAA,GAAK,GAAA,EAAK,EAAA,GAAK,GAAA,EAAK,EAAA,GAAK,GAAA;AAC7B,EAAA,IAAI,SAAA,EAAW;AAAE,IAAA,EAAA,GAAK,EAAA;AAAI,IAAA,EAAA,GAAK,EAAA;AAAI,IAAA,EAAA,GAAK,EAAA;AAAA,EAAI;AAC5C,EAAA,IAAI,KAAA,EAAO;AAAE,IAAA,MAAM,CAAA,GAAI,WAAW,KAAK,CAAA;AAAG,IAAA,IAAI,CAAA,EAAG;AAAE,MAAA,EAAA,GAAK,CAAA,CAAE,CAAA;AAAG,MAAA,EAAA,GAAK,CAAA,CAAE,CAAA;AAAG,MAAA,EAAA,GAAK,CAAA,CAAE,CAAA;AAAA,IAAG;AAAA,EAAE;AAEnF,EAAA,IAAI,GAAA,GAAM,GAAA,EAAK,GAAA,GAAM,GAAA,EAAK,GAAA,GAAM,CAAA;AAChC,EAAA,MAAM,EAAA,GAAK,WAAW,cAAc,CAAA;AACpC,EAAA,IAAI,EAAA,EAAI;AAAE,IAAA,GAAA,GAAM,EAAA,CAAG,CAAA;AAAG,IAAA,GAAA,GAAM,EAAA,CAAG,CAAA;AAAG,IAAA,GAAA,GAAM,EAAA,CAAG,CAAA;AAAA,EAAG;AAE9C,EAAA,MAAM,UAAU,KAAA,CAAM,OAAA,CAAQ,MAAK,EAAE,CAAA,CAAE,MAAM,EAAE,CAAA;AAC/C,EAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AAE1B,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,EAAO,CAAA,EAAA,EAAK;AAC9B,IAAA,MAAM,QAAU,KAAA,CAAM,CAAA,GAAI,IAAK,CAAC,CAAA,GAAI,KAAK,EAAA,GAAK,CAAA;AAC9C,IAAA,MAAM,UAAU,IAAA,GAAO,KAAA,CAAM,CAAA,GAAI,EAAA,EAAI,CAAC,CAAA,GAAI,IAAA;AAC1C,IAAA,MAAM,KAAA,GAAU,KAAA,CAAM,CAAA,GAAI,EAAA,EAAI,EAAE,CAAA;AAEhC,IAAA,MAAM,CAAA,GAAA,CAAM,IAAA,GAAO,OAAA,GAAU,KAAA,GAAQ,OAAO,KAAA,IAAS,CAAA;AAErD,IAAA,MAAM,IAAI,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,KAAK,IAAI,CAAA,GAAI,IAAA;AACrC,IAAA,MAAM,IAAI,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,KAAK,IAAI,CAAA,GAAI,IAAA;AAErC,IAAA,IAAI,CAAA,GAAI,OAAO,CAAA,GAAI,KAAA,GAAQ,MAAM,CAAA,GAAI,GAAA,IAAO,CAAA,GAAI,MAAA,GAAS,EAAA,EAAI;AAE7D,IAAA,MAAM,KAAK,IAAA,CAAK,GAAA,CAAI,GAAG,QAAA,IAAY,GAAA,GAAM,IAAI,GAAA,CAAI,CAAA;AACjD,IAAA,GAAA,CAAI,IAAA,GAAO,GAAG,EAAE,CAAA,YAAA,CAAA;AAEhB,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,GAAA,CAAI,OAAA,CAAQ,MAAA,GAAS,CAAA,EAAG,IAAA,CAAK,KAAA,CAAM,CAAA,GAAI,OAAA,CAAQ,MAAM,CAAC,CAAA;AAC3E,IAAA,MAAM,EAAA,GAAK,QAAQ,OAAO,CAAA;AAC1B,IAAA,MAAM,WAAW,CAAA,GAAI,IAAA;AACnB,IAAA,MAAM,KAAA,GAAQ,SAAA,GAAY,CAAA,GAAI,IAAA,GAAO,CAAA,GAAI,GAAA;AAEzC,IAAA,GAAA,CAAI,SAAA,GAAY,QAAA,GACZ,CAAA,KAAA,EAAQ,GAAG,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA,EAAI,IAAA,CAAK,GAAA,CAAI,SAAA,GAAY,OAAO,IAAA,EAAM,KAAA,GAAQ,GAAG,CAAC,CAAA,CAAA,CAAA,GAC7E,CAAA,KAAA,EAAQ,EAAE,CAAA,CAAA,EAAI,EAAE,CAAA,CAAA,EAAI,EAAE,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA,CAAA;AAEnC,IAAA,GAAA,CAAI,QAAA,CAAS,EAAA,EAAI,CAAA,EAAG,CAAC,CAAA;AAAA,EACvB;AAEA,EAAA,GAAA,CAAI,SAAA,GAAY,MAAA;AAClB;;;AChEO,SAAS,qBAAA,CACd,GAAA,EACA,KAAA,EACA,MAAA,EACA,MACA,QAAA,GAAqC,EAAE,CAAA,EAAG,GAAA,EAAK,CAAA,EAAG,GAAA,EAAI,EACtD,OAAA,GAAkC,EAAC,EAC7B;AACN,EAAA,MAAM;AAAA,IACJ,QAAA,GAAa,EAAA;AAAA,IACb,KAAA,GAAa,6BAAA;AAAA,IACb,WAAA,GAAc,MAAA;AAAA,IACd,KAAA;AAAA,IACA,KAAA,GAAa,CAAA;AAAA,IACb,KAAA,GAAa,CAAA;AAAA,IACb,SAAA,GAAa,CAAA;AAAA,IACb,SAAA,GAAa;AAAA,GACf,GAAI,OAAA;AACJ,EAAA,MAAM,cAAA,GAAiB,WAAA,KAAgB,SAAA,GAAY,SAAA,GAAY,SAAA,CAAA;AAE/D,EAAA,GAAA,CAAI,SAAA,CAAU,CAAA,EAAG,CAAA,EAAG,KAAA,EAAO,MAAM,CAAA;AACjC,EAAA,GAAA,CAAI,YAAA,GAAe,QAAA;AACnB,EAAA,GAAA,CAAI,SAAA,GAAe,QAAA;AAEnB,EAAA,MAAM,EAAA,GAAK,QAAS,QAAA,CAAS,CAAA;AAC7B,EAAA,MAAM,EAAA,GAAK,SAAS,QAAA,CAAS,CAAA;AAC7B,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,IAAA,CAAK,EAAA,GAAK,KAAK,EAAA,GAAK,EAAE,CAAA,GAAI,GAAA,GAAM,KAAK,IAAA,CAAK,KAAA,GAAQ,KAAA,GAAQ,MAAA,GAAS,MAAM,CAAA,GAAI,GAAA;AAElG,EAAA,IAAI,EAAA,GAAK,GAAA,EAAK,EAAA,GAAK,GAAA,EAAK,EAAA,GAAK,GAAA;AAC7B,EAAA,IAAI,SAAA,EAAW;AAAE,IAAA,EAAA,GAAK,EAAA;AAAI,IAAA,EAAA,GAAK,EAAA;AAAI,IAAA,EAAA,GAAK,EAAA;AAAA,EAAI;AAC5C,EAAA,IAAI,KAAA,EAAO;AAAE,IAAA,MAAM,CAAA,GAAI,WAAW,KAAK,CAAA;AAAG,IAAA,IAAI,CAAA,EAAG;AAAE,MAAA,EAAA,GAAK,CAAA,CAAE,CAAA;AAAG,MAAA,EAAA,GAAK,CAAA,CAAE,CAAA;AAAG,MAAA,EAAA,GAAK,CAAA,CAAE,CAAA;AAAA,IAAG;AAAA,EAAE;AAEnF,EAAA,IAAI,GAAA,GAAM,CAAA,EAAG,GAAA,GAAM,GAAA,EAAK,GAAA,GAAM,GAAA;AAC9B,EAAA,MAAM,EAAA,GAAK,WAAW,cAAc,CAAA;AACpC,EAAA,IAAI,EAAA,EAAI;AAAE,IAAA,GAAA,GAAM,EAAA,CAAG,CAAA;AAAG,IAAA,GAAA,GAAM,EAAA,CAAG,CAAA;AAAG,IAAA,GAAA,GAAM,EAAA,CAAG,CAAA;AAAA,EAAG;AAE9C,EAAA,MAAM,UAAU,KAAA,CAAM,OAAA,CAAQ,MAAK,EAAE,CAAA,CAAE,MAAM,EAAE,CAAA;AAC/C,EAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AAE1B,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,IAAA,CAAK,KAAA,GAAS,QAAQ,CAAA;AACxC,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,IAAA,CAAK,MAAA,GAAS,QAAQ,CAAA;AAExC,EAAA,KAAA,IAAS,GAAA,GAAM,CAAA,EAAG,GAAA,GAAM,IAAA,EAAM,GAAA,EAAA,EAAO;AACnC,IAAA,KAAA,IAAS,GAAA,GAAM,CAAA,EAAG,GAAA,GAAM,IAAA,EAAM,GAAA,EAAA,EAAO;AACnC,MAAA,MAAM,EAAA,GAAK,GAAA,GAAM,QAAA,GAAW,QAAA,GAAW,GAAA;AACvC,MAAA,MAAM,EAAA,GAAK,GAAA,GAAM,QAAA,GAAW,QAAA,GAAW,GAAA;AACvC,MAAA,MAAM,KAAK,EAAA,GAAK,EAAA;AAChB,MAAA,MAAM,KAAK,EAAA,GAAK,EAAA;AAChB,MAAA,MAAM,OAAO,IAAA,CAAK,IAAA,CAAK,EAAA,GAAK,EAAA,GAAK,KAAK,EAAE,CAAA;AACxC,MAAA,MAAM,OAAO,IAAA,GAAO,OAAA;AAEpB,MAAA,IAAI,cAAA,GAAiB,CAAA;AACrB,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,EAAO,CAAA,EAAA,EAAK;AAC9B,QAAA,MAAM,QAAQ,CAAA,GAAI,KAAA;AAClB,QAAA,MAAM,CAAA,GAAA,CAAM,IAAA,GAAO,KAAA,GAAQ,IAAA,GAAO,KAAA,IAAS,CAAA;AAC3C,QAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,CAAI,IAAA,GAAO,CAAC,CAAA;AAClC,QAAA,MAAM,QAAA,GAAW,KAAK,GAAA,CAAI,CAAA,EAAG,IAAI,QAAA,GAAW,OAAA,IAAW,QAAA,IAAY,EAAA,GAAK,SAAA,CAAA,CAAW,CAAA;AACnF,QAAA,cAAA,IAAkB,KAAK,GAAA,CAAI,QAAA,GAAW,IAAA,CAAK,EAAA,GAAK,GAAG,CAAA,GAAI,QAAA;AAAA,MACzD;AACA,MAAA,cAAA,GAAiB,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,cAAc,CAAA;AAE3C,MAAA,IAAI,iBAAiB,IAAA,EAAM;AAE3B,MAAA,MAAM,WAAW,cAAA,GAAiB,GAAA;AAClC,MAAA,GAAA,CAAI,IAAA,GAAO,GAAG,QAAQ,CAAA,YAAA,CAAA;AACtB,MAAA,MAAM,UAAU,IAAA,CAAK,KAAA,CAAM,cAAA,IAAkB,OAAA,CAAQ,SAAS,CAAA,CAAE,CAAA;AAChE,MAAA,MAAM,EAAA,GAAK,QAAQ,IAAA,CAAK,GAAA,CAAI,SAAS,OAAA,CAAQ,MAAA,GAAS,CAAC,CAAC,CAAA;AACxD,MAAA,MAAM,KAAA,GAAQ,SAAA,GAAY,cAAA,GAAiB,IAAA,GAAO,cAAA,GAAiB,IAAA;AAEnE,MAAA,GAAA,CAAI,SAAA,GAAY,QAAA,GACZ,CAAA,KAAA,EAAQ,GAAG,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA,EAAI,IAAA,CAAK,GAAA,CAAI,SAAA,GAAY,OAAO,GAAA,EAAK,cAAA,GAAiB,IAAI,CAAC,CAAA,CAAA,CAAA,GACpF,CAAA,KAAA,EAAQ,EAAE,CAAA,CAAA,EAAI,EAAE,CAAA,CAAA,EAAI,EAAE,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA,CAAA;AAEnC,MAAA,GAAA,CAAI,QAAA,CAAS,EAAA,EAAI,EAAA,EAAI,EAAE,CAAA;AAAA,IACzB;AAAA,EACF;AAEA,EAAA,GAAA,CAAI,SAAA,GAAY,MAAA;AAClB;;;ACxEO,SAAS,qBAAA,CACd,GAAA,EACA,KAAA,EACA,MAAA,EACA,MACA,QAAA,GAAqC,EAAE,CAAA,EAAG,GAAA,EAAK,CAAA,EAAG,GAAA,EAAI,EACtD,OAAA,GAAkC,EAAC,EAC7B;AACN,EAAA,MAAM;AAAA,IACJ,QAAA,GAAkB,EAAA;AAAA,IAClB,KAAA,GAAkB,kCAAA;AAAA,IAClB,WAAA,GAAkB,MAAA;AAAA,IAClB,KAAA;AAAA,IACA,OAAA,GAAkB,CAAA;AAAA,IAClB,KAAA,GAAkB,CAAA;AAAA,IAClB,KAAA,GAAkB,CAAA;AAAA,IAClB,eAAA,GAAkB,IAAA;AAAA,IAClB,SAAA,GAAkB,GAAA;AAAA,IAClB,SAAA,GAAkB;AAAA,GACpB,GAAI,OAAA;AACJ,EAAA,MAAM,cAAA,GAAiB,WAAA,KAAgB,SAAA,GAAY,SAAA,GAAY,SAAA,CAAA;AAE/D,EAAA,MAAM,QAAQ,QAAA,GAAW,IAAA;AACzB,EAAA,MAAM,QAAQ,QAAA,GAAW,GAAA;AACzB,EAAA,MAAM,IAAA,GAAQ,IAAA,CAAK,IAAA,CAAK,KAAA,GAAS,KAAK,CAAA;AACtC,EAAA,MAAM,IAAA,GAAQ,IAAA,CAAK,IAAA,CAAK,MAAA,GAAS,KAAK,CAAA;AAEtC,EAAA,GAAA,CAAI,SAAA,CAAU,CAAA,EAAG,CAAA,EAAG,KAAA,EAAO,MAAM,CAAA;AACjC,EAAA,GAAA,CAAI,IAAA,GAAO,GAAG,QAAQ,CAAA,YAAA,CAAA;AACtB,EAAA,GAAA,CAAI,YAAA,GAAe,KAAA;AAEnB,EAAA,IAAI,EAAA,GAAK,GAAA,EAAK,GAAA,GAAM,GAAA,EAAK,EAAA,GAAK,GAAA;AAC9B,EAAA,IAAI,SAAA,EAAW;AAAE,IAAA,EAAA,GAAK,EAAA;AAAI,IAAA,GAAA,GAAM,EAAA;AAAI,IAAA,EAAA,GAAK,EAAA;AAAA,EAAI;AAC7C,EAAA,IAAI,KAAA,EAAO;AAAE,IAAA,MAAM,CAAA,GAAI,WAAW,KAAK,CAAA;AAAG,IAAA,IAAI,CAAA,EAAG;AAAE,MAAA,EAAA,GAAK,CAAA,CAAE,CAAA;AAAG,MAAA,GAAA,GAAM,CAAA,CAAE,CAAA;AAAG,MAAA,EAAA,GAAK,CAAA,CAAE,CAAA;AAAA,IAAG;AAAA,EAAE;AACpF,EAAA,IAAI,GAAA,GAAM,GAAA,EAAK,GAAA,GAAM,GAAA,EAAK,GAAA,GAAM,CAAA;AAChC,EAAA,MAAM,EAAA,GAAK,WAAW,cAAc,CAAA;AAAG,EAAA,IAAI,EAAA,EAAI;AAAE,IAAA,GAAA,GAAM,EAAA,CAAG,CAAA;AAAG,IAAA,GAAA,GAAM,EAAA,CAAG,CAAA;AAAG,IAAA,GAAA,GAAM,EAAA,CAAG,CAAA;AAAA,EAAG;AAErF,EAAA,MAAM,aAAa,KAAA,GAAQ,KAAA;AAC3B,EAAA,MAAM,IAAI,IAAA,GAAO,KAAA;AACjB,EAAA,MAAM,GAAA,GAAM,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,CAAI,CAAA,EAAG,OAAO,CAAC,CAAA;AAG5C,EAAA,MAAM,IAAA,GAAO,CAAC,CAAA,EAAW,CAAA,KAAsB;AAC7C,IAAA,IAAI,IAAI,CAAA,EAAG,GAAA,GAAM,GAAA,EAAK,IAAA,GAAO,GAAG,IAAA,GAAO,CAAA;AACvC,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,GAAA,EAAK,CAAA,EAAA,EAAK;AAC5B,MAAA,CAAA,IAAQ,MAAA,CAAO,CAAA,GAAI,IAAA,EAAM,CAAA,GAAI,IAAI,CAAA,GAAI,GAAA;AACrC,MAAA,IAAA,IAAQ,GAAA;AACR,MAAA,GAAA,IAAQ,GAAA;AACR,MAAA,IAAA,IAAQ,GAAA;AAAA,IACV;AACA,IAAA,OAAO,CAAA,GAAI,IAAA;AAAA,EACb,CAAA;AAEA,EAAA,KAAA,IAAS,GAAA,GAAM,CAAA,EAAG,GAAA,GAAM,IAAA,EAAM,GAAA,EAAA,EAAO;AACnC,IAAA,KAAA,IAAS,GAAA,GAAM,CAAA,EAAG,GAAA,GAAM,IAAA,EAAM,GAAA,EAAA,EAAO;AACnC,MAAA,MAAM,EAAA,GAAK,GAAA,GAAM,UAAA,GAAa,CAAA,GAAI,IAAA;AAClC,MAAA,MAAM,EAAA,GAAK,GAAA,GAAM,UAAA,GAAa,GAAA,GAAM,CAAA,GAAI,IAAA;AAGxC,MAAA,MAAM,EAAA,GAAK,GAAA,GAAM,IAAA,GAAO,QAAA,CAAS,CAAA;AACjC,MAAA,MAAM,EAAA,GAAK,GAAA,GAAM,IAAA,GAAO,QAAA,CAAS,CAAA;AACjC,MAAA,MAAM,OAAO,IAAA,CAAK,IAAA,CAAK,EAAA,GAAK,EAAA,GAAK,KAAK,EAAE,CAAA;AACxC,MAAA,MAAM,IAAA,GAAO,SAAA,GAAY,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA,GAAI,IAAA,GAAO,SAAS,CAAA,GAAI,IAAA,GAAO,CAAA;AACxE,MAAA,MAAM,EAAA,GAAK,KAAK,IAAA,GAAO,IAAA,CAAK,IAAI,CAAA,GAAI,GAAA,GAAM,KAAK,CAAC,CAAA;AAChD,MAAA,MAAM,EAAA,GAAK,KAAK,IAAA,GAAO,IAAA,CAAK,IAAI,CAAA,GAAI,GAAA,GAAM,KAAK,CAAC,CAAA;AAEhD,MAAA,MAAM,GAAA,GAAO,IAAA,CAAK,EAAA,EAAI,EAAE,CAAA;AACxB,MAAA,MAAM,KAAA,GAAQ,MAAM,GAAA,GAAM,GAAA;AAE1B,MAAA,IAAI,QAAQ,IAAA,EAAM;AAElB,MAAA,MAAM,UAAU,IAAA,CAAK,KAAA,CAAM,KAAA,IAAS,KAAA,CAAM,SAAS,CAAA,CAAE,CAAA;AACrD,MAAA,MAAM,EAAA,GAAK,MAAM,OAAO,CAAA;AACxB,MAAA,IAAI,OAAO,GAAA,EAAK;AAEhB,MAAA,MAAM,WAAW,KAAA,GAAQ,eAAA;AACzB,MAAA,MAAM,KAAA,GAAQ,SAAA,GAAY,KAAA,GAAQ,IAAA,GAAO,KAAA,GAAQ,IAAA;AAEjD,MAAA,GAAA,CAAI,SAAA,GAAY,WACZ,CAAA,KAAA,EAAQ,GAAG,IAAI,GAAG,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA,EAAI,SAAA,GAAY,OAAO,IAAI,CAAA,CAAA,CAAA,GACpD,QAAQ,EAAE,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA,EAAI,EAAE,IAAI,KAAK,CAAA,CAAA,CAAA;AAEpC,MAAA,GAAA,CAAI,QAAA,CAAS,EAAA,EAAI,GAAA,GAAM,KAAA,EAAO,MAAM,KAAK,CAAA;AAAA,IAC3C;AAAA,EACF;AACF;;;ACvFO,SAAS,oBAAA,CACd,GAAA,EACA,KAAA,EACA,MAAA,EACA,MACA,QAAA,GAAqC,EAAE,CAAA,EAAG,GAAA,EAAK,CAAA,EAAG,GAAA,EAAI,EACtD,OAAA,GAAiC,EAAC,EAC5B;AACN,EAAA,MAAM;AAAA,IACJ,QAAA,GAAY,EAAA;AAAA,IACZ,KAAA,GAAY,WAAA;AAAA,IACZ,WAAA,GAAc,MAAA;AAAA,IACd,KAAA;AAAA,IACA,KAAA,GAAY,CAAA;AAAA,IACZ,KAAA,GAAY,CAAA;AAAA,IACZ,SAAA,GAAY,IAAA;AAAA,IACZ,MAAA,GAAY,IAAA;AAAA,IACZ,SAAA,GAAY;AAAA,GACd,GAAI,OAAA;AACJ,EAAA,MAAM,cAAA,GAAiB,WAAA,KAAgB,SAAA,GAAY,SAAA,GAAY,SAAA,CAAA;AAE/D,EAAA,MAAM,QAAQ,QAAA,GAAW,IAAA;AACzB,EAAA,MAAM,QAAQ,QAAA,GAAW,GAAA;AACzB,EAAA,MAAM,IAAA,GAAQ,IAAA,CAAK,IAAA,CAAK,KAAA,GAAS,KAAK,CAAA;AACtC,EAAA,MAAM,IAAA,GAAQ,IAAA,CAAK,IAAA,CAAK,MAAA,GAAS,KAAK,CAAA;AAEtC,EAAA,GAAA,CAAI,SAAA,CAAU,CAAA,EAAG,CAAA,EAAG,KAAA,EAAO,MAAM,CAAA;AACjC,EAAA,GAAA,CAAI,IAAA,GAAO,GAAG,QAAQ,CAAA,YAAA,CAAA;AACtB,EAAA,GAAA,CAAI,YAAA,GAAe,KAAA;AAEnB,EAAA,IAAI,EAAA,GAAK,GAAA,EAAK,GAAA,GAAM,GAAA,EAAK,EAAA,GAAK,GAAA;AAC9B,EAAA,IAAI,SAAA,EAAW;AAAE,IAAA,EAAA,GAAK,EAAA;AAAI,IAAA,GAAA,GAAM,EAAA;AAAI,IAAA,EAAA,GAAK,EAAA;AAAA,EAAI;AAC7C,EAAA,IAAI,KAAA,EAAO;AAAE,IAAA,MAAM,CAAA,GAAI,WAAW,KAAK,CAAA;AAAG,IAAA,IAAI,CAAA,EAAG;AAAE,MAAA,EAAA,GAAK,CAAA,CAAE,CAAA;AAAG,MAAA,GAAA,GAAM,CAAA,CAAE,CAAA;AAAG,MAAA,EAAA,GAAK,CAAA,CAAE,CAAA;AAAA,IAAG;AAAA,EAAE;AACpF,EAAA,IAAI,GAAA,GAAM,GAAA,EAAK,GAAA,GAAM,GAAA,EAAK,GAAA,GAAM,CAAA;AAChC,EAAA,MAAM,EAAA,GAAK,WAAW,cAAc,CAAA;AAAG,EAAA,IAAI,EAAA,EAAI;AAAE,IAAA,GAAA,GAAM,EAAA,CAAG,CAAA;AAAG,IAAA,GAAA,GAAM,EAAA,CAAG,CAAA;AAAG,IAAA,GAAA,GAAM,EAAA,CAAG,CAAA;AAAA,EAAG;AAErF,EAAA,MAAM,IAAI,IAAA,GAAO,KAAA;AAEjB,EAAA,KAAA,IAAS,GAAA,GAAM,CAAA,EAAG,GAAA,GAAM,IAAA,EAAM,GAAA,EAAA,EAAO;AACnC,IAAA,KAAA,IAAS,GAAA,GAAM,CAAA,EAAG,GAAA,GAAM,IAAA,EAAM,GAAA,EAAA,EAAO;AACnC,MAAA,MAAM,KAAK,GAAA,GAAM,IAAA;AAGjB,MAAA,MAAM,cAAc,EAAA,GAAK,KAAA,GAAQ,CAAA,GAAI,GAAA,IAAO,IAAM,CAAA,IAAO,CAAA;AAEzD,MAAA,MAAM,gBAAgB,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,CAAA,GAAI,YAAY,SAAS,CAAA;AAG3D,MAAA,MAAM,QAAA,GAAW,KAAA,CAAM,GAAA,GAAM,CAAA,EAAG,MAAM,CAAC,CAAA;AACvC,MAAA,MAAM,QAAA,GAAA,CAAY,QAAA,GAAW,GAAA,GAAM,GAAA,IAAO,IAAA;AAG1C,MAAA,IAAI,UAAA,GAAa,CAAA;AACjB,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,MAAM,EAAA,GAAK,GAAA,GAAM,IAAA,GAAO,QAAA,CAAS,CAAA;AACjC,QAAA,MAAM,EAAA,GAAK,KAAK,QAAA,CAAS,CAAA;AACzB,QAAA,MAAM,IAAK,IAAA,CAAK,IAAA,CAAK,EAAA,GAAK,EAAA,GAAK,KAAK,EAAE,CAAA;AACtC,QAAA,IAAI,IAAI,IAAA,EAAM;AACZ,UAAA,MAAM,CAAA,GAAI,KAAA,CAAM,GAAA,GAAM,EAAA,GAAK,IAAA,CAAK,MAAM,CAAA,GAAI,EAAE,CAAA,EAAG,GAAA,GAAM,CAAC,CAAA;AACtD,UAAA,UAAA,GAAa,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,CAAA,GAAI,CAAA,GAAI,IAAI,CAAA,IAAK,CAAA,GAAI,GAAA,GAAM,CAAA,GAAI,GAAA,GAAM,CAAA,CAAA;AAAA,QAChE;AAAA,MACF;AAEA,MAAA,MAAM,SAAA,GAAY,KAAK,GAAA,CAAI,CAAA,EAAG,WAAW,aAAA,GAAgB,GAAA,GAAM,aAAa,GAAG,CAAA;AAC/E,MAAA,IAAI,YAAY,IAAA,EAAM;AAEtB,MAAA,MAAM,UAAU,IAAA,CAAK,KAAA,CAAM,SAAA,IAAa,KAAA,CAAM,SAAS,CAAA,CAAE,CAAA;AACzD,MAAA,MAAM,EAAA,GAAK,MAAM,OAAO,CAAA;AAExB,MAAA,MAAM,WAAW,aAAA,GAAgB,IAAA;AACjC,MAAA,MAAM,KAAA,GAAQ,SAAA,GAAY,SAAA,GAAY,IAAA,GAAO,SAAA,GAAY,IAAA;AAEzD,MAAA,GAAA,CAAI,SAAA,GAAY,WACZ,CAAA,KAAA,EAAQ,GAAG,IAAI,GAAG,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA,EAAI,SAAA,GAAY,OAAO,IAAI,CAAA,CAAA,CAAA,GACpD,QAAQ,EAAE,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA,EAAI,EAAE,IAAI,KAAK,CAAA,CAAA,CAAA;AAEpC,MAAA,GAAA,CAAI,QAAA,CAAS,EAAA,EAAI,GAAA,GAAM,KAAA,EAAO,MAAM,KAAK,CAAA;AAAA,IAC3C;AAAA,EACF;AACF;;;AC9EO,SAAS,sBAAA,CACd,GAAA,EACA,KAAA,EACA,MAAA,EACA,MACA,QAAA,GAAqC,EAAE,CAAA,EAAG,GAAA,EAAK,CAAA,EAAG,GAAA,EAAI,EACtD,OAAA,GAAmC,EAAC,EAC9B;AACN,EAAA,MAAM;AAAA,IACJ,QAAA,GAAc,EAAA;AAAA,IACd,KAAA,GAAc,qCAAA;AAAA,IACd,KAAA;AAAA,IACA,WAAA,GAAc,MAAA;AAAA,IACd,KAAA,GAAc,CAAA;AAAA,IACd,MAAA,GAAc,CAAA;AAAA,IACd,QAAA,GAAc,GAAA;AAAA,IACd,WAAA,GAAc,GAAA;AAAA,IACd,SAAA,GAAc;AAAA,GAChB,GAAI,OAAA;AACJ,EAAA,MAAM,cAAA,GAAiB,WAAA,KAAgB,SAAA,GAAY,SAAA,GAAY,SAAA,CAAA;AAE/D,EAAA,MAAM,QAAQ,QAAA,GAAW,IAAA;AACzB,EAAA,MAAM,QAAQ,QAAA,GAAW,GAAA;AACzB,EAAA,MAAM,IAAA,GAAQ,IAAA,CAAK,IAAA,CAAK,KAAA,GAAS,KAAK,CAAA;AACtC,EAAA,MAAM,IAAA,GAAQ,IAAA,CAAK,IAAA,CAAK,MAAA,GAAS,KAAK,CAAA;AAEtC,EAAA,GAAA,CAAI,SAAA,CAAU,CAAA,EAAG,CAAA,EAAG,KAAA,EAAO,MAAM,CAAA;AACjC,EAAA,GAAA,CAAI,IAAA,GAAO,GAAG,QAAQ,CAAA,YAAA,CAAA;AACtB,EAAA,GAAA,CAAI,YAAA,GAAe,KAAA;AAEnB,EAAA,IAAI,EAAA,GAAK,GAAA,EAAK,EAAA,GAAK,GAAA,EAAK,EAAA,GAAK,GAAA;AAC7B,EAAA,IAAI,SAAA,EAAW;AAAE,IAAA,EAAA,GAAK,EAAA;AAAI,IAAA,EAAA,GAAK,EAAA;AAAI,IAAA,EAAA,GAAK,EAAA;AAAA,EAAI;AAC5C,EAAA,IAAI,KAAA,EAAO;AAAE,IAAA,MAAM,CAAA,GAAI,WAAW,KAAK,CAAA;AAAG,IAAA,IAAI,CAAA,EAAG;AAAE,MAAA,EAAA,GAAK,CAAA,CAAE,CAAA;AAAG,MAAA,EAAA,GAAK,CAAA,CAAE,CAAA;AAAG,MAAA,EAAA,GAAK,CAAA,CAAE,CAAA;AAAA,IAAG;AAAA,EAAE;AACnF,EAAA,IAAI,GAAA,GAAM,GAAA,EAAK,GAAA,GAAM,GAAA,EAAK,GAAA,GAAM,CAAA;AAChC,EAAA,MAAM,EAAA,GAAK,WAAW,cAAc,CAAA;AAAG,EAAA,IAAI,EAAA,EAAI;AAAE,IAAA,GAAA,GAAM,EAAA,CAAG,CAAA;AAAG,IAAA,GAAA,GAAM,EAAA,CAAG,CAAA;AAAG,IAAA,GAAA,GAAM,EAAA,CAAG,CAAA;AAAA,EAAG;AAErF,EAAA,MAAM,IAAI,IAAA,GAAO,KAAA;AAGjB,EAAA,MAAM,cAAyF,EAAC;AAChG,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,MAAA,EAAQ,CAAA,EAAA,EAAK;AAC/B,IAAA,MAAM,OAAQ,KAAA,CAAM,CAAA,GAAI,EAAA,EAAI,CAAA,GAAI,KAAK,CAAC,CAAA;AACtC,IAAA,MAAM,QAAQ,KAAA,CAAM,CAAA,GAAI,EAAA,GAAK,CAAA,EAAG,IAAI,EAAE,CAAA;AACtC,IAAA,WAAA,CAAY,IAAA,CAAK;AAAA,MACf,EAAA,EAAO,MAAM,IAAA,GAAQ,GAAA;AAAA,MACrB,EAAA,EAAO,MAAM,KAAA,GAAQ,GAAA;AAAA,MACrB,KAAA,EAAO,IAAA,GAAO,IAAA,CAAK,EAAA,GAAK,CAAA;AAAA,MACxB,EAAA,EAAA,CAAQ,GAAA,GAAM,KAAA,CAAM,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,EAAA,GAAK,CAAC,CAAA,GAAI,GAAA,KAAQ,CAAA,GAAI,CAAA,KAAM,IAAI,CAAA,GAAI,EAAA,CAAA;AAAA,MACnE,KAAO,IAAA,GAAO,KAAA,CAAM,IAAI,EAAA,EAAI,CAAA,GAAI,CAAC,CAAA,GAAI;AAAA,KACtC,CAAA;AAAA,EACH;AAEA,EAAA,KAAA,IAAS,GAAA,GAAM,CAAA,EAAG,GAAA,GAAM,IAAA,EAAM,GAAA,EAAA,EAAO;AACnC,IAAA,MAAM,KAAK,GAAA,GAAM,IAAA;AAEjB,IAAA,KAAA,IAAS,GAAA,GAAM,CAAA,EAAG,GAAA,GAAM,IAAA,EAAM,GAAA,EAAA,EAAO;AACnC,MAAA,MAAM,KAAK,GAAA,GAAM,IAAA;AAGjB,MAAA,MAAM,GAAA,GAAM,KAAK,QAAA,CAAS,CAAA;AAC1B,MAAA,MAAM,GAAA,GAAM,KAAK,QAAA,CAAS,CAAA;AAC1B,MAAA,MAAM,KAAM,IAAA,CAAK,IAAA,CAAK,GAAA,GAAM,GAAA,GAAM,MAAM,GAAG,CAAA;AAC3C,MAAA,MAAM,OAAO,WAAA,GAAc,IAAA,CAAK,IAAI,CAAC,EAAA,GAAK,KAAK,IAAI,CAAA;AACnD,MAAA,MAAM,EAAA,GAAO,KAAK,GAAA,GAAM,IAAA;AACxB,MAAA,MAAM,EAAA,GAAO,KAAK,GAAA,GAAM,IAAA;AAGxB,MAAA,IAAI,GAAA,GAAM,CAAA;AACV,MAAA,IAAI,QAAA,GAAW,CAAA;AACf,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,MAAA,EAAQ,CAAA,EAAA,EAAK;AAC/B,QAAA,MAAM,EAAE,IAAI,EAAA,EAAI,KAAA,EAAO,IAAI,GAAA,EAAI,GAAI,YAAY,CAAC,CAAA;AAChD,QAAA,MAAM,IAAA,GAAO,KAAK,GAAA,CAAI,EAAA,GAAK,KAAK,IAAA,CAAK,EAAA,GAAK,CAAA,GAAI,CAAA,GAAI,EAAA,GAAK,KAAK,IAC/C,IAAA,CAAK,GAAA,CAAI,EAAA,GAAK,EAAA,GAAK,IAAA,CAAK,EAAA,GAAK,IAAI,CAAA,GAAI,EAAA,GAAK,GAAA,GAAM,KAAA,GAAQ,GAAG,CAAA;AACxE,QAAA,GAAA,IAAY,IAAA,GAAO,GAAA;AACnB,QAAA,QAAA,IAAY,GAAA;AAAA,MACd;AAGA,MAAA,MAAM,SAAS,GAAA,GAAM,QAAA;AACrB,MAAA,MAAM,SAAS,GAAA,GAAM,GAAA,GAAM,KAAK,IAAA,CAAK,MAAA,GAAS,WAAW,GAAG,CAAA;AAE5D,MAAA,IAAI,SAAS,IAAA,EAAM;AAEnB,MAAA,MAAM,UAAA,GAAA,CAAc,SAAS,IAAA,IAAQ,IAAA;AACrC,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG,IAAA,CAAK,KAAA,CAAM,UAAA,GAAa,KAAA,CAAM,MAAM,CAAC,CAAA;AAChF,MAAA,MAAM,EAAA,GAAK,MAAM,OAAO,CAAA;AAExB,MAAA,MAAM,WAAW,MAAA,GAAS,IAAA;AAC1B,MAAA,MAAM,KAAA,GAAQ,SAAA,GAAY,MAAA,GAAS,IAAA,GAAO,MAAA,GAAS,IAAA;AAEnD,MAAA,GAAA,CAAI,SAAA,GAAY,WACZ,CAAA,KAAA,EAAQ,GAAG,IAAI,GAAG,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA,EAAI,SAAA,GAAY,OAAO,IAAI,CAAA,CAAA,CAAA,GACpD,QAAQ,EAAE,CAAA,CAAA,EAAI,EAAE,CAAA,CAAA,EAAI,EAAE,IAAI,KAAK,CAAA,CAAA,CAAA;AAEnC,MAAA,GAAA,CAAI,QAAA,CAAS,EAAA,EAAI,GAAA,GAAM,KAAA,EAAO,MAAM,KAAK,CAAA;AAAA,IAC3C;AAAA,EACF;AACF;;;ACrGO,SAAS,qBACd,GAAA,EACA,KAAA,EACA,QACA,IAAA,EACA,OAAA,GAAiC,EAAC,EAC5B;AACN,EAAA,MAAM;AAAA,IACJ,QAAA,GAAa,EAAA;AAAA,IACb,KAAA;AAAA,IACA,WAAA,GAAc,MAAA;AAAA,IACd,KAAA,GAAa,GAAA;AAAA,IACb,MAAA,GAAa,CAAA;AAAA,IACb,UAAA,GAAa,GAAA;AAAA,IACb,SAAA,GAAa;AAAA,GACf,GAAI,OAAA;AACJ,EAAA,MAAM,cAAA,GAAiB,WAAA,KAAgB,SAAA,GAAY,SAAA,GAAY,SAAA,CAAA;AAE/D,EAAA,MAAM,QAAQ,QAAA,GAAW,IAAA;AACzB,EAAA,MAAM,QAAQ,QAAA,GAAW,GAAA;AACzB,EAAA,MAAM,IAAA,GAAQ,IAAA,CAAK,IAAA,CAAK,KAAA,GAAS,KAAK,CAAA;AACtC,EAAA,MAAM,IAAA,GAAQ,IAAA,CAAK,IAAA,CAAK,MAAA,GAAS,KAAK,CAAA;AAEtC,EAAA,GAAA,CAAI,SAAA,CAAU,CAAA,EAAG,CAAA,EAAG,KAAA,EAAO,MAAM,CAAA;AACjC,EAAA,GAAA,CAAI,IAAA,GAAO,GAAG,QAAQ,CAAA,YAAA,CAAA;AACtB,EAAA,GAAA,CAAI,YAAA,GAAe,KAAA;AAEnB,EAAA,IAAI,EAAA,GAAK,GAAA,EAAK,EAAA,GAAK,GAAA,EAAK,EAAA,GAAK,GAAA;AAC7B,EAAA,IAAI,SAAA,EAAW;AAAE,IAAA,EAAA,GAAK,EAAA;AAAI,IAAA,EAAA,GAAK,EAAA;AAAI,IAAA,EAAA,GAAK,EAAA;AAAA,EAAI;AAC5C,EAAA,IAAI,KAAA,EAAO;AAAE,IAAA,MAAM,CAAA,GAAI,WAAW,KAAK,CAAA;AAAG,IAAA,IAAI,CAAA,EAAG;AAAE,MAAA,EAAA,GAAK,CAAA,CAAE,CAAA;AAAG,MAAA,EAAA,GAAK,CAAA,CAAE,CAAA;AAAG,MAAA,EAAA,GAAK,CAAA,CAAE,CAAA;AAAA,IAAG;AAAA,EAAE;AACnF,EAAA,IAAI,GAAA,GAAM,GAAA,EAAK,GAAA,GAAM,GAAA,EAAK,GAAA,GAAM,CAAA;AAChC,EAAA,MAAM,EAAA,GAAK,WAAW,cAAc,CAAA;AAAG,EAAA,IAAI,EAAA,EAAI;AAAE,IAAA,GAAA,GAAM,EAAA,CAAG,CAAA;AAAG,IAAA,GAAA,GAAM,EAAA,CAAG,CAAA;AAAG,IAAA,GAAA,GAAM,EAAA,CAAG,CAAA;AAAA,EAAG;AAErF,EAAA,MAAM,IAAI,IAAA,GAAO,KAAA;AAGjB,EAAA,MAAM,QAAA,GAAW,CAAC,QAAA,EAAK,QAAA,EAAK,QAAA,EAAK,QAAK,QAAA,EAAK,QAAA,EAAK,QAAA,EAAK,QAAA,EAAK,MAAG,CAAA;AAE7D,EAAA,KAAA,IAAS,GAAA,GAAM,CAAA,EAAG,GAAA,GAAM,IAAA,EAAM,GAAA,EAAA,EAAO;AACnC,IAAA,MAAM,KAAK,GAAA,GAAM,IAAA;AACjB,IAAA,KAAA,IAAS,GAAA,GAAM,CAAA,EAAG,GAAA,GAAM,IAAA,EAAM,GAAA,EAAA,EAAO;AACnC,MAAA,MAAM,KAAK,GAAA,GAAM,IAAA;AAGjB,MAAA,IAAI,QAAA,GAAW,CAAA;AACf,MAAA,IAAI,YAAA,GAAe,CAAA;AACnB,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,MAAA,EAAQ,CAAA,EAAA,EAAK;AAC/B,QAAA,MAAM,KAAM,KAAA,CAAM,CAAA,GAAI,EAAA,EAAI,CAAA,GAAI,IAAI,CAAC,CAAA;AACnC,QAAA,MAAM,MAAM,KAAA,CAAM,CAAA,GAAI,EAAA,EAAI,CAAA,GAAI,KAAK,CAAC,CAAA;AACpC,QAAA,MAAM,EAAA,GAAM,MAAM,EAAA,GAAM,GAAA;AACxB,QAAA,MAAM,EAAA,GAAM,MAAM,GAAA,GAAM,CAAA;AACxB,QAAA,MAAM,EAAA,GAAM,EAAA,GAAK,IAAA,CAAK,EAAA,GAAK,CAAA;AAC3B,QAAA,MAAM,EAAA,GAAA,CAAO,GAAA,GAAM,KAAA,CAAM,CAAA,GAAI,EAAA,EAAI,CAAA,GAAI,EAAE,CAAA,GAAI,GAAA,KAAQ,CAAA,GAAI,CAAA,KAAM,CAAA,GAAI,CAAA,GAAI,IAAA,CAAA;AAErE,QAAA,MAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,EAAA,GAAK,EAAA,GAAK,KAAK,EAAA,GAAK,CAAA,GAAI,CAAA,GAAI,EAAA,GAAK,EAAE,CAAA;AACtD,QAAA,MAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,EAAA,GAAK,EAAA,GAAK,IAAA,CAAK,EAAA,GAAK,CAAA,GAAI,CAAA,GAAI,EAAA,GAAK,GAAA,GAAM,EAAA,GAAK,GAAG,CAAA;AAElE,QAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,EAAA,GAAK,KAAK,IAAA,CAAK,EAAA,GAAK,UAAA,GAAa,EAAA,GAAK,KAAK,IAAA,CAAK,EAAA,GAAK,UAAA,GAAa,CAAA,GAAI,KAAK,GAAG,CAAA;AAErG,QAAA,QAAA,IAAgB,IAAA,CAAK,KAAA,CAAM,CAAA,GAAI,KAAA,GAAQ,KAAK,CAAC,CAAA;AAC7C,QAAA,YAAA,IAAA,CAAiB,CAAA,GAAI,IAAI,CAAA,IAAK,GAAA;AAAA,MAChC;AAEA,MAAA,MAAM,QAAY,QAAA,GAAW,MAAA;AAC7B,MAAA,MAAM,SAAA,GAAY,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,eAAe,MAAM,CAAA;AAEnD,MAAA,IAAI,YAAY,GAAA,EAAK;AAErB,MAAA,MAAM,SAAA,GAAA,CAAa,KAAA,GAAQ,IAAA,CAAK,EAAA,KAAO,KAAK,EAAA,GAAK,CAAA,CAAA;AACjD,MAAA,MAAM,UAAY,IAAA,CAAK,KAAA,CAAM,YAAY,QAAA,CAAS,MAAM,IAAI,QAAA,CAAS,MAAA;AACrE,MAAA,MAAM,EAAA,GAAY,SAAS,OAAO,CAAA;AAElC,MAAA,MAAM,WAAW,SAAA,GAAY,GAAA;AAC7B,MAAA,MAAM,KAAA,GAAW,SAAA,GAAY,SAAA,GAAY,GAAA,GAAO,SAAA,GAAY,IAAA;AAE5D,MAAA,GAAA,CAAI,SAAA,GAAY,WACZ,CAAA,KAAA,EAAQ,GAAG,IAAI,GAAG,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA,EAAI,SAAA,GAAY,MAAO,IAAI,CAAA,CAAA,CAAA,GACpD,QAAQ,EAAE,CAAA,CAAA,EAAI,EAAE,CAAA,CAAA,EAAI,EAAE,IAAI,KAAK,CAAA,CAAA,CAAA;AAEnC,MAAA,GAAA,CAAI,QAAA,CAAS,EAAA,EAAI,GAAA,GAAM,KAAA,EAAO,MAAM,KAAK,CAAA;AAAA,IAC3C;AAAA,EACF;AACF;;;ACjFO,SAAS,oBAAA,CACd,GAAA,EACA,KAAA,EACA,MAAA,EACA,MACA,QAAA,GAAqC,EAAE,CAAA,EAAG,GAAA,EAAK,CAAA,EAAG,GAAA,EAAI,EACtD,OAAA,GAAiC,EAAC,EAC5B;AACN,EAAA,MAAM;AAAA,IACJ,QAAA,GAAc,EAAA;AAAA,IACd,KAAA,GAAc,eAAA;AAAA,IACd,KAAA;AAAA,IACA,WAAA,GAAc,MAAA;AAAA,IACd,KAAA,GAAc,CAAA;AAAA,IACd,MAAA,GAAc,IAAA;AAAA,IACd,KAAA,GAAc,CAAA;AAAA,IACd,SAAA,GAAc;AAAA,GAChB,GAAI,OAAA;AACJ,EAAA,MAAM,cAAA,GAAiB,WAAA,KAAgB,SAAA,GAAY,SAAA,GAAY,SAAA,CAAA;AAE/D,EAAA,MAAM,QAAS,QAAA,GAAW,IAAA;AAC1B,EAAA,MAAM,QAAS,QAAA,GAAW,GAAA;AAC1B,EAAA,MAAM,IAAA,GAAS,IAAA,CAAK,IAAA,CAAK,KAAA,GAAS,KAAK,CAAA;AACvC,EAAA,MAAM,IAAA,GAAS,IAAA,CAAK,IAAA,CAAK,MAAA,GAAS,KAAK,CAAA;AACvC,EAAA,MAAM,SAAS,KAAA,GAAQ,MAAA;AAEvB,EAAA,GAAA,CAAI,SAAA,CAAU,CAAA,EAAG,CAAA,EAAG,KAAA,EAAO,MAAM,CAAA;AACjC,EAAA,GAAA,CAAI,IAAA,GAAO,GAAG,QAAQ,CAAA,YAAA,CAAA;AACtB,EAAA,GAAA,CAAI,YAAA,GAAe,KAAA;AAEnB,EAAA,IAAI,EAAA,GAAK,GAAA,EAAK,EAAA,GAAK,GAAA,EAAK,EAAA,GAAK,GAAA;AAC7B,EAAA,IAAI,SAAA,EAAW;AAAE,IAAA,EAAA,GAAK,EAAA;AAAI,IAAA,EAAA,GAAK,EAAA;AAAI,IAAA,EAAA,GAAK,EAAA;AAAA,EAAI;AAC5C,EAAA,IAAI,KAAA,EAAO;AAAE,IAAA,MAAM,CAAA,GAAI,WAAW,KAAK,CAAA;AAAG,IAAA,IAAI,CAAA,EAAG;AAAE,MAAA,EAAA,GAAK,CAAA,CAAE,CAAA;AAAG,MAAA,EAAA,GAAK,CAAA,CAAE,CAAA;AAAG,MAAA,EAAA,GAAK,CAAA,CAAE,CAAA;AAAA,IAAG;AAAA,EAAE;AACnF,EAAA,IAAI,GAAA,GAAM,GAAA,EAAK,GAAA,GAAM,GAAA,EAAK,GAAA,GAAM,CAAA;AAChC,EAAA,MAAM,EAAA,GAAK,WAAW,cAAc,CAAA;AAAG,EAAA,IAAI,EAAA,EAAI;AAAE,IAAA,GAAA,GAAM,EAAA,CAAG,CAAA;AAAG,IAAA,GAAA,GAAM,EAAA,CAAG,CAAA;AAAG,IAAA,GAAA,GAAM,EAAA,CAAG,CAAA;AAAA,EAAG;AAErF,EAAA,MAAM,IAAI,IAAA,GAAO,KAAA;AAEjB,EAAA,KAAA,IAAS,GAAA,GAAM,CAAA,EAAG,GAAA,GAAM,IAAA,EAAM,GAAA,EAAA,EAAO;AACnC,IAAA,MAAM,KAAK,GAAA,GAAM,IAAA;AACjB,IAAA,KAAA,IAAS,GAAA,GAAM,CAAA,EAAG,GAAA,GAAM,IAAA,EAAM,GAAA,EAAA,EAAO;AACnC,MAAA,MAAM,KAAK,GAAA,GAAM,IAAA;AAEjB,MAAA,MAAM,EAAA,GAAA,CAAQ,EAAA,GAAK,QAAA,CAAS,CAAA,IAAK,MAAA;AACjC,MAAA,MAAM,EAAA,GAAO,KAAK,QAAA,CAAS,CAAA;AAC3B,MAAA,MAAM,OAAO,IAAA,CAAK,IAAA,CAAK,EAAA,GAAK,EAAA,GAAK,KAAK,EAAE,CAAA;AACxC,MAAA,MAAM,IAAO,IAAA,GAAO,MAAA;AAGpB,MAAA,IAAI,IAAI,CAAA,EAAG;AACT,QAAA,MAAM,UAAA,GAAa,KAAA,CAAM,GAAA,GAAM,CAAA,EAAG,GAAA,GAAM,CAAC,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,CAAA,GAAA,CAAK,CAAA,GAAI,KAAK,CAAC,CAAA;AACxE,QAAA,IAAI,aAAa,IAAA,EAAM;AACvB,QAAA,MAAMC,MAAAA,GAAQ,UAAA,IAAc,SAAA,GAAY,IAAA,GAAO,IAAA,CAAA;AAC/C,QAAA,GAAA,CAAI,SAAA,GAAY,QAAQ,EAAE,CAAA,CAAA,EAAI,EAAE,CAAA,CAAA,EAAI,EAAE,IAAIA,MAAK,CAAA,CAAA,CAAA;AAC/C,QAAA,GAAA,CAAI,SAAS,KAAA,CAAM,CAAC,GAAG,GAAA,GAAM,KAAA,EAAO,MAAM,KAAK,CAAA;AAC/C,QAAA;AAAA,MACF;AAQA,MAAA,MAAM,YAAY,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,CAAA,GAAI,KAAK,GAAA,CAAI,CAAA,IAAK,IAAA,GAAO,IAAA,GAAO,KAAK,GAAA,CAAI,CAAA,GAAI,GAAG,CAAA,CAAE,IAAI,IAAI,CAAA;AACxF,MAAA,MAAM,OAAA,GAAY,IAAA,CAAK,GAAA,CAAI,CAAA,GAAI,GAAG,GAAG,CAAA;AACrC,MAAA,MAAM,YAAY,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,OAAA,GAAU,YAAY,GAAG,CAAA;AAEvD,MAAA,IAAI,YAAY,IAAA,EAAM;AAGtB,MAAA,MAAM,WAAW,IAAA,CAAK,KAAA,CAAM,SAAA,IAAa,KAAA,CAAM,SAAS,CAAA,CAAE,CAAA;AAC1D,MAAA,MAAM,UAAW,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,MAAA,GAAS,GAAG,QAAQ,CAAA;AACpD,MAAA,MAAM,EAAA,GAAW,MAAM,OAAO,CAAA;AAE9B,MAAA,MAAM,QAAA,GAAW,SAAA,GAAY,IAAA,IAAQ,CAAA,GAAI,IAAA;AACzC,MAAA,MAAM,KAAA,GAAW,SAAA,GAAY,SAAA,GAAY,IAAA,GAAO,SAAA,GAAY,IAAA;AAE5D,MAAA,GAAA,CAAI,SAAA,GAAY,WACZ,CAAA,KAAA,EAAQ,GAAG,IAAI,GAAG,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA,EAAI,SAAA,GAAY,OAAO,IAAI,CAAA,CAAA,CAAA,GACpD,QAAQ,EAAE,CAAA,CAAA,EAAI,EAAE,CAAA,CAAA,EAAI,EAAE,IAAI,KAAK,CAAA,CAAA,CAAA;AAEnC,MAAA,GAAA,CAAI,QAAA,CAAS,EAAA,EAAI,GAAA,GAAM,KAAA,EAAO,MAAM,KAAK,CAAA;AAAA,IAC3C;AAAA,EACF;AACF;;;ACvFO,SAAS,sBACd,GAAA,EACA,KAAA,EACA,QACA,IAAA,EACA,OAAA,GAAkC,EAAC,EAC7B;AACN,EAAA,MAAM;AAAA,IACJ,QAAA,GAAa,EAAA;AAAA,IACb,KAAA,GAAa,yBAAA;AAAA,IACb,KAAA;AAAA,IACA,WAAA,GAAc,MAAA;AAAA,IACd,KAAA,GAAa,GAAA;AAAA,IACb,SAAA,GAAa,CAAA;AAAA,IACb,SAAA,GAAa;AAAA,GACf,GAAI,OAAA;AACJ,EAAA,MAAM,cAAA,GAAiB,WAAA,KAAgB,SAAA,GAAY,SAAA,GAAY,SAAA,CAAA;AAE/D,EAAA,MAAM,QAAQ,QAAA,GAAW,IAAA;AACzB,EAAA,MAAM,QAAQ,QAAA,GAAW,GAAA;AACzB,EAAA,MAAM,IAAA,GAAQ,IAAA,CAAK,IAAA,CAAK,KAAA,GAAS,KAAK,CAAA;AACtC,EAAA,MAAM,IAAA,GAAQ,IAAA,CAAK,IAAA,CAAK,MAAA,GAAS,KAAK,CAAA;AAEtC,EAAA,GAAA,CAAI,SAAA,CAAU,CAAA,EAAG,CAAA,EAAG,KAAA,EAAO,MAAM,CAAA;AACjC,EAAA,GAAA,CAAI,IAAA,GAAO,GAAG,QAAQ,CAAA,YAAA,CAAA;AACtB,EAAA,GAAA,CAAI,YAAA,GAAe,KAAA;AAEnB,EAAA,IAAI,EAAA,GAAK,GAAA,EAAK,EAAA,GAAK,GAAA,EAAK,EAAA,GAAK,GAAA;AAC7B,EAAA,IAAI,SAAA,EAAW;AAAE,IAAA,EAAA,GAAK,EAAA;AAAI,IAAA,EAAA,GAAK,EAAA;AAAI,IAAA,EAAA,GAAK,EAAA;AAAA,EAAI;AAC5C,EAAA,IAAI,KAAA,EAAO;AAAE,IAAA,MAAM,CAAA,GAAI,WAAW,KAAK,CAAA;AAAG,IAAA,IAAI,CAAA,EAAG;AAAE,MAAA,EAAA,GAAK,CAAA,CAAE,CAAA;AAAG,MAAA,EAAA,GAAK,CAAA,CAAE,CAAA;AAAG,MAAA,EAAA,GAAK,CAAA,CAAE,CAAA;AAAA,IAAG;AAAA,EAAE;AACnF,EAAA,IAAI,GAAA,GAAM,GAAA,EAAK,GAAA,GAAM,GAAA,EAAK,GAAA,GAAM,CAAA;AAChC,EAAA,MAAM,EAAA,GAAK,WAAW,cAAc,CAAA;AAAG,EAAA,IAAI,EAAA,EAAI;AAAE,IAAA,GAAA,GAAM,EAAA,CAAG,CAAA;AAAG,IAAA,GAAA,GAAM,EAAA,CAAG,CAAA;AAAG,IAAA,GAAA,GAAM,EAAA,CAAG,CAAA;AAAA,EAAG;AAErF,EAAA,MAAM,IAAI,IAAA,GAAO,KAAA;AAGjB,EAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,EAAE,QAAQ,SAAA,EAAU,EAAG,CAAC,CAAA,EAAG,CAAA,KAAM,KAAK,CAAA,GAAI,CAAA,CAAE,EAAE,MAAA,CAAO,CAAC,GAAG,CAAA,KAAM,CAAA,GAAI,GAAG,CAAC,CAAA;AAE/F,EAAA,KAAA,IAAS,GAAA,GAAM,CAAA,EAAG,GAAA,GAAM,IAAA,EAAM,GAAA,EAAA,EAAO;AACnC,IAAA,KAAA,IAAS,GAAA,GAAM,CAAA,EAAG,GAAA,GAAM,IAAA,EAAM,GAAA,EAAA,EAAO;AAEnC,MAAA,IAAI,CAAA,GAAI,CAAA;AACR,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,SAAA,EAAW,CAAA,EAAA,EAAK;AAClC,QAAA,MAAM,KAAA,GAAS,MAAM,GAAA,IAAO,CAAA,GAAI,KAAK,CAAA,EAAG,GAAA,IAAO,CAAA,GAAI,CAAA,CAAA,GAAK,EAAE,CAAA;AAC1D,QAAA,MAAM,KAAA,GAAS,OAAO,KAAA,GAAQ,GAAA;AAC9B,QAAA,MAAM,KAAA,GAAS,KAAA,CAAM,GAAA,IAAO,CAAA,GAAI,CAAA,CAAA,EAAI,GAAA,IAAO,CAAA,GAAI,CAAA,CAAA,GAAK,CAAC,CAAA,GAAI,IAAA,CAAK,EAAA,GAAK,CAAA;AACnE,QAAA,MAAM,MAAA,GAAS,KAAK,CAAA,GAAI,CAAA,CAAA;AACxB,QAAA,CAAA,IAAK,IAAA,CAAK,GAAA,CAAI,CAAA,GAAI,KAAA,GAAQ,KAAK,CAAA,GAAI,MAAA;AAAA,MACrC;AAEA,MAAA,MAAM,IAAA,GAAA,CAAQ,CAAA,GAAI,IAAA,GAAO,CAAA,IAAK,GAAA;AAE9B,MAAA,IAAI,OAAO,IAAA,EAAM;AAEjB,MAAA,MAAM,QAAA,GAAA,CAAY,OAAO,IAAA,IAAQ,IAAA;AACjC,MAAA,MAAM,OAAA,GAAW,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG,IAAA,CAAK,KAAA,CAAM,QAAA,GAAW,KAAA,CAAM,MAAM,CAAC,CAAA;AAC/E,MAAA,MAAM,EAAA,GAAW,MAAM,OAAO,CAAA;AAE9B,MAAA,MAAM,WAAW,IAAA,GAAO,IAAA;AACxB,MAAA,MAAM,KAAA,GAAW,SAAA,GAAY,QAAA,GAAW,IAAA,GAAO,QAAA,GAAW,IAAA;AAE1D,MAAA,GAAA,CAAI,SAAA,GAAY,WACZ,CAAA,KAAA,EAAQ,GAAG,IAAI,GAAG,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA,EAAI,SAAA,GAAY,OAAO,IAAI,CAAA,CAAA,CAAA,GACpD,QAAQ,EAAE,CAAA,CAAA,EAAI,EAAE,CAAA,CAAA,EAAI,EAAE,IAAI,KAAK,CAAA,CAAA,CAAA;AAEnC,MAAA,GAAA,CAAI,QAAA,CAAS,EAAA,EAAI,GAAA,GAAM,KAAA,EAAO,MAAM,KAAK,CAAA;AAAA,IAC3C;AAAA,EACF;AACF;;;AClEO,SAAS,qBACd,GAAA,EACA,KAAA,EACA,QACA,IAAA,EACA,OAAA,GAAiC,EAAC,EAC5B;AACN,EAAA,MAAM;AAAA,IACJ,QAAA,GAAY,EAAA;AAAA,IACZ,KAAA,GAAY,cAAA;AAAA,IACZ,KAAA,GAAY,SAAA;AAAA,IACZ,QAAA,GAAY,SAAA;AAAA,IACZ,SAAA,GAAY,IAAA;AAAA,IACZ,IAAA,GAAY,CAAA;AAAA,IACZ,KAAA,GAAY,CAAA;AAAA,IACZ,SAAA,GAAY;AAAA,GACd,GAAI,OAAA;AAEJ,EAAA,MAAM,QAAS,QAAA,GAAW,IAAA;AAC1B,EAAA,MAAM,QAAS,QAAA,GAAW,GAAA;AAC1B,EAAA,MAAM,IAAA,GAAS,IAAA,CAAK,IAAA,CAAK,KAAA,GAAS,KAAK,CAAA;AACvC,EAAA,MAAM,IAAA,GAAS,IAAA,CAAK,IAAA,CAAK,MAAA,GAAS,KAAK,CAAA;AACvC,EAAA,MAAM,MAAS,IAAA,GAAO,IAAA;AAGtB,EAAA,MAAM,GAAA,GAAM,eAAA;AACZ,EAAA,MAAM,YAAY,GAAA,CAAI,MAAA;AACtB,EAAA,IAAI,IAAA,GAAqB,UAAU,GAAG,CAAA;AACtC,EAAA,IAAI,CAAC,IAAA,IAAQ,IAAA,CAAK,MAAA,KAAW,GAAA,EAAK;AAChC,IAAA,IAAA,GAAO,IAAI,aAAa,GAAG,CAAA;AAC3B,IAAA,SAAA,CAAU,GAAG,CAAA,GAAI,IAAA;AAAA,EACnB;AAEA,EAAA,MAAM,KAAK,KAAA,GAAQ,KAAA;AACnB,EAAA,MAAM,cAAc,IAAA,GAAO,EAAA;AAC3B,EAAA,MAAM,SAAA,GAAc,OAAO,KAAA,GAAQ,GAAA;AAGnC,EAAA,MAAM,UAAU,IAAA,GAAO,CAAA;AACvB,EAAA,MAAM,IAAI,IAAA,GAAO,KAAA;AACjB,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,EAAM,CAAA,EAAA,EAAK;AAC7B,IAAA,MAAM,OAAA,GAAU,KAAK,GAAA,CAAI,CAAA,GAAI,OAAO,CAAA,GAAI,GAAG,IAAI,GAAA,GAAM,GAAA;AACrD,IAAA,MAAM,QAAA,GAAW,KAAK,GAAA,CAAI,CAAA,GAAI,OAAO,CAAA,GAAI,GAAG,IAAI,GAAA,GAAM,GAAA;AACtD,IAAA,MAAM,IAAA,GAAA,CAAQ,OAAA,GAAU,GAAA,GAAM,QAAA,GAAW,GAAA,IAAO,SAAA;AAChD,IAAA,IAAA,CAAK,OAAA,GAAU,IAAA,GAAO,CAAC,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,GAAO,IAAA,CAAK,MAAA,EAAO,GAAI,IAAA,GAAO,SAAS,CAAA;AAC9E,IAAA,IAAI,UAAU,CAAA,EAAG,IAAA,CAAA,CAAM,OAAA,GAAU,CAAA,IAAK,OAAO,CAAC,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,GAAG,IAAA,GAAO,IAAA,GAAO,KAAK,MAAA,EAAO,GAAI,MAAM,SAAS,CAAA;AAAA,EAC7G;AAGA,EAAA,MAAM,OAAA,GAAU,IAAI,YAAA,CAAa,GAAG,CAAA;AACpC,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,GAAO,GAAG,CAAA,EAAA,EAAK;AACjC,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,EAAM,CAAA,EAAA,EAAK;AAC7B,MAAA,MAAM,KAAA,GAAW,IAAA,CAAA,CAAM,CAAA,GAAI,CAAA,IAAK,OAAO,CAAC,CAAA;AACxC,MAAA,MAAM,SAAW,IAAA,CAAA,CAAM,CAAA,GAAI,KAAK,IAAA,GAAO,IAAA,CAAK,IAAI,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,IAAA,GAAO,GAAG,CAAA,GAAI,IAAA,CAAK,MAAM,SAAS,CAAC,CAAC,CAAC,CAAA;AACjG,MAAA,MAAM,IAAA,GAAW,IAAA,CAAA,CAAM,CAAA,GAAI,CAAA,IAAK,IAAA,GAAO,KAAK,GAAA,CAAI,CAAA,EAAG,CAAA,GAAI,CAAC,CAAC,CAAA;AACzD,MAAA,MAAM,KAAA,GAAW,IAAA,CAAA,CAAM,CAAA,GAAI,CAAA,IAAK,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,IAAA,GAAO,CAAA,EAAG,CAAA,GAAI,CAAC,CAAC,CAAA;AAChE,MAAA,MAAM,MAAY,KAAA,GAAQ,GAAA,GAAM,SAAS,IAAA,GAAO,IAAA,GAAO,QAAQ,KAAA,GAAQ,KAAA;AACvE,MAAA,OAAA,CAAQ,CAAA,GAAI,IAAA,GAAO,CAAC,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,GAAA,GAAM,WAAA,GAAc,IAAA,CAAK,MAAA,EAAO,GAAI,OAAO,KAAK,CAAA;AAAA,IACtF;AAAA,EACF;AAEA,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,EAAM,CAAA,EAAA,EAAK;AAC7B,IAAA,OAAA,CAAA,CAAS,IAAA,GAAO,KAAK,IAAA,GAAO,CAAC,IAAI,IAAA,CAAA,CAAM,IAAA,GAAO,CAAA,IAAK,IAAA,GAAO,CAAC,CAAA;AAC3D,IAAA,IAAI,IAAA,GAAO,CAAA,EAAG,OAAA,CAAA,CAAS,IAAA,GAAO,CAAA,IAAK,IAAA,GAAO,CAAC,CAAA,GAAI,IAAA,CAAA,CAAM,IAAA,GAAO,CAAA,IAAK,IAAA,GAAO,CAAC,CAAA;AAAA,EAC3E;AACA,EAAA,SAAA,CAAU,GAAG,CAAA,GAAI,OAAA;AAGjB,EAAA,MAAM,EAAA,GAAM,UAAA,CAAW,KAAK,CAAA,IAAQ,EAAE,GAAG,GAAA,EAAK,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,CAAA,EAAE;AAC1D,EAAA,MAAM,EAAA,GAAM,UAAA,CAAW,QAAQ,CAAA,IAAK,EAAE,GAAG,GAAA,EAAK,CAAA,EAAG,GAAA,EAAK,CAAA,EAAG,GAAA,EAAI;AAE7D,EAAA,GAAA,CAAI,SAAA,CAAU,CAAA,EAAG,CAAA,EAAG,KAAA,EAAO,MAAM,CAAA;AACjC,EAAA,GAAA,CAAI,IAAA,GAAO,GAAG,QAAQ,CAAA,8BAAA,CAAA;AACtB,EAAA,GAAA,CAAI,YAAA,GAAe,KAAA;AAEnB,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,EAAM,CAAA,EAAA,EAAK;AAC7B,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,EAAM,CAAA,EAAA,EAAK;AAC7B,MAAA,MAAM,CAAA,GAAI,OAAA,CAAQ,CAAA,GAAI,IAAA,GAAO,CAAC,CAAA;AAC9B,MAAA,IAAI,IAAI,IAAA,EAAM;AAEd,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG,IAAA,CAAK,KAAA,CAAM,CAAA,GAAI,KAAA,CAAM,MAAM,CAAC,CAAA;AACvE,MAAA,MAAM,EAAA,GAAK,MAAM,OAAO,CAAA;AACxB,MAAA,IAAI,OAAO,GAAA,EAAK;AAGhB,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAI,GAAG,CAAA;AACjC,MAAA,MAAM,KAAM,EAAA,CAAG,CAAA,GAAA,CAAK,GAAG,CAAA,GAAI,EAAA,CAAG,KAAK,KAAA,GAAS,CAAA;AAC5C,MAAA,MAAM,KAAM,EAAA,CAAG,CAAA,GAAA,CAAK,GAAG,CAAA,GAAI,EAAA,CAAG,KAAK,KAAA,GAAS,CAAA;AAC5C,MAAA,MAAM,KAAM,EAAA,CAAG,CAAA,GAAA,CAAK,GAAG,CAAA,GAAI,EAAA,CAAG,KAAK,KAAA,GAAS,CAAA;AAE5C,MAAA,MAAM,KAAA,GAAQ,YAAa,CAAA,GAAI,CAAA,GAAI,MAAO,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,CAAA,GAAI,IAAI,CAAA;AAC9D,MAAA,GAAA,CAAI,WAAA,GAAc,KAAA;AAClB,MAAA,GAAA,CAAI,YAAY,CAAA,IAAA,EAAO,EAAE,CAAA,CAAA,EAAI,EAAE,IAAI,EAAE,CAAA,CAAA,CAAA;AACrC,MAAA,GAAA,CAAI,QAAA,CAAS,EAAA,EAAI,CAAA,GAAI,KAAA,EAAO,IAAI,KAAK,CAAA;AAAA,IACvC;AAAA,EACF;AACA,EAAA,GAAA,CAAI,WAAA,GAAc,CAAA;AACpB;;;AC/FO,SAAS,oBACd,GAAA,EACA,KAAA,EACA,QACA,IAAA,EACA,OAAA,GAAgC,EAAC,EAC3B;AACN,EAAA,MAAM;AAAA,IACJ,QAAA,GAAc,EAAA;AAAA,IACd,SAAA,GAAc,MAAA;AAAA,IACd,WAAA,GAAc,UAAA;AAAA,IACd,KAAA,GAAc,SAAA;AAAA,IACd,MAAA,GAAc,SAAA;AAAA,IACd,WAAA,GAAc,SAAA;AAAA,IACd,KAAA,GAAc,CAAA;AAAA,IACd,UAAA;AAAA,IACA,SAAA,GAAc;AAAA,GAChB,GAAI,OAAA;AAEJ,EAAA,MAAM,QAAS,QAAA,GAAW,IAAA;AAC1B,EAAA,MAAM,QAAS,QAAA,GAAW,GAAA;AAC1B,EAAA,MAAM,IAAA,GAAS,IAAA,CAAK,IAAA,CAAK,KAAA,GAAS,KAAK,CAAA;AACvC,EAAA,MAAM,IAAA,GAAS,IAAA,CAAK,IAAA,CAAK,MAAA,GAAS,KAAK,CAAA;AAEvC,EAAA,MAAM,QAAA,GAAW,cAAc,IAAA,CAAK,GAAA,CAAI,GAAG,IAAA,CAAK,KAAA,CAAM,KAAA,GAAQ,EAAE,CAAC,CAAA;AACjE,EAAA,MAAM,WAAW,IAAA,GAAO,QAAA;AAExB,EAAA,MAAM,EAAA,GAAM,UAAA,CAAW,KAAK,CAAA,IAAW,EAAE,GAAG,CAAA,EAAK,CAAA,EAAG,GAAA,EAAK,CAAA,EAAG,GAAA,EAAI;AAChE,EAAA,MAAM,GAAA,GAAM,UAAA,CAAW,MAAM,CAAA,IAAU,EAAE,GAAG,GAAA,EAAK,CAAA,EAAG,EAAA,EAAK,CAAA,EAAG,GAAA,EAAI;AAChE,EAAA,MAAM,EAAA,GAAM,UAAA,CAAW,WAAW,CAAA,IAAK,EAAE,GAAG,GAAA,EAAK,CAAA,EAAG,GAAA,EAAK,CAAA,EAAG,GAAA,EAAI;AAKhE,EAAA,GAAA,CAAI,SAAA,CAAU,CAAA,EAAG,CAAA,EAAG,KAAA,EAAO,MAAM,CAAA;AACjC,EAAA,GAAA,CAAI,IAAA,GAAO,GAAG,QAAQ,CAAA,8BAAA,CAAA;AACtB,EAAA,GAAA,CAAI,YAAA,GAAe,KAAA;AAEnB,EAAA,MAAM,IAAI,IAAA,GAAO,KAAA;AACjB,EAAA,MAAM,YAAa,QAAA,GAAW,IAAA;AAE9B,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,QAAA,EAAU,CAAA,EAAA,EAAK;AACjC,IAAA,MAAM,SAAA,GAAY,YAAY,CAAA,GAAI,GAAA,CAAA;AAElC,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,EAAM,CAAA,EAAA,EAAK;AAC7B,MAAA,MAAM,QAAS,CAAA,GAAI,IAAA,GAAQ,IAAA,CAAK,EAAA,GAAK,IAAI,CAAA,GAAI,GAAA;AAC7C,MAAA,MAAM,WAAA,GAAc,SAAA,GAAY,IAAA,CAAK,GAAA,CAAI,KAAK,CAAA,GAAiB,SAAA;AAC/D,MAAA,MAAM,cAAc,SAAA,GAAY,IAAA,CAAK,IAAI,KAAA,GAAQ,IAAA,CAAK,EAAE,CAAA,GAAO,SAAA;AAC/D,MAAA,MAAM,UAAA,GAAc,IAAA,CAAK,KAAA,CAAM,WAAW,CAAA;AAC1C,MAAA,MAAM,UAAA,GAAc,IAAA,CAAK,KAAA,CAAM,WAAW,CAAA;AAE1C,MAAA,IAAI,UAAA,GAAa,CAAA,IAAK,UAAA,IAAc,IAAA,EAAM;AAC1C,MAAA,MAAM,YAAY,KAAA,CAAM,CAAA,GAAI,EAAA,GAAK,CAAA,GAAI,GAAG,CAAC,CAAA;AACzC,MAAA,MAAM,MAAM,SAAA,CAAU,IAAA,CAAK,MAAM,SAAA,GAAY,SAAA,CAAU,MAAM,CAAC,CAAA;AAG9D,MAAA,MAAM,MAAA,GAAA,CAAU,IAAA,CAAK,GAAA,CAAI,KAAK,IAAI,CAAA,IAAK,GAAA;AACvC,MAAA,MAAM,UAAU,IAAA,CAAK,GAAA,CAAI,QAAQ,IAAA,CAAK,EAAE,IAAI,CAAA,IAAK,GAAA;AAEjD,MAAA,GAAA,CAAI,WAAA,GAAc,OAAO,MAAA,GAAS,IAAA;AAClC,MAAA,GAAA,CAAI,SAAA,GAAY,OAAO,EAAA,CAAG,CAAC,IAAI,EAAA,CAAG,CAAC,CAAA,CAAA,EAAI,EAAA,CAAG,CAAC,CAAA,CAAA,CAAA;AAC3C,MAAA,GAAA,CAAI,QAAA,CAAS,GAAA,EAAK,UAAA,GAAa,KAAA,EAAO,IAAI,KAAK,CAAA;AAE/C,MAAA,IAAI,UAAA,IAAc,CAAA,IAAK,UAAA,GAAa,IAAA,EAAM;AACxC,QAAA,MAAM,YAAY,KAAA,CAAM,CAAA,GAAI,EAAA,GAAK,CAAA,GAAI,IAAI,CAAC,CAAA;AAC1C,QAAA,MAAM,MAAM,SAAA,CAAU,IAAA,CAAK,MAAM,SAAA,GAAY,SAAA,CAAU,MAAM,CAAC,CAAA;AAC9D,QAAA,GAAA,CAAI,WAAA,GAAc,OAAO,MAAA,GAAS,IAAA;AAClC,QAAA,GAAA,CAAI,SAAA,GAAY,OAAO,GAAA,CAAI,CAAC,IAAI,GAAA,CAAI,CAAC,CAAA,CAAA,EAAI,GAAA,CAAI,CAAC,CAAA,CAAA,CAAA;AAC9C,QAAA,GAAA,CAAI,QAAA,CAAS,GAAA,EAAK,UAAA,GAAa,KAAA,EAAO,IAAI,KAAK,CAAA;AAAA,MACjD;AAGA,MAAA,MAAM,cAAA,GAAiB,CAAA;AACvB,MAAA,IAAI,CAAA,GAAI,mBAAmB,CAAA,EAAG;AAC5B,QAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,UAAA,EAAY,UAAU,CAAA;AAC5C,QAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,UAAA,EAAY,UAAU,CAAA;AAC5C,QAAA,MAAM,YAAY,IAAA,GAAO,IAAA;AACzB,QAAA,IAAI,YAAY,CAAA,EAAG;AACjB,UAAA,MAAM,QAAQ,KAAA,CAAM,CAAA,GAAI,EAAA,GAAK,CAAA,GAAI,IAAI,CAAC,CAAA;AACtC,UAAA,MAAM,MAAQ,WAAA,CAAY,IAAA,CAAK,MAAM,KAAA,GAAQ,WAAA,CAAY,MAAM,CAAC,CAAA;AAChE,UAAA,MAAM,cAAA,GAAA,CAAkB,MAAA,GAAS,MAAA,IAAU,IAAA,GAAO,GAAA;AAClD,UAAA,GAAA,CAAI,WAAA,GAAc,cAAA;AAClB,UAAA,GAAA,CAAI,SAAA,GAAY,OAAO,EAAA,CAAG,CAAC,IAAI,EAAA,CAAG,CAAC,CAAA,CAAA,EAAI,EAAA,CAAG,CAAC,CAAA,CAAA,CAAA;AAC3C,UAAA,KAAA,IAAS,EAAA,GAAK,IAAA,GAAO,CAAA,EAAG,EAAA,GAAK,MAAM,EAAA,EAAA,EAAM;AACvC,YAAA,GAAA,CAAI,QAAA,CAAS,GAAA,EAAK,EAAA,GAAK,KAAA,EAAO,IAAI,KAAK,CAAA;AAAA,UACzC;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,GAAA,CAAI,WAAA,GAAc,CAAA;AACpB;;;AC1FO,SAAS,wBACd,GAAA,EACA,KAAA,EACA,QACA,IAAA,EACA,OAAA,GAAoC,EAAC,EAC/B;AACN,EAAA,MAAM;AAAA,IACJ,QAAA,GAAc,EAAA;AAAA,IACd,KAAA,GAAc,WAAA;AAAA,IACd,KAAA,GAAc,SAAA;AAAA,IACd,QAAA,GAAc,SAAA;AAAA,IACd,SAAA,GAAc,SAAA;AAAA,IACd,KAAA,GAAc,CAAA;AAAA,IACd,SAAA,GAAc,IAAA;AAAA,IACd,WAAA,GAAc,IAAA;AAAA,IACd,KAAA,GAAc,IAAA;AAAA,IACd,SAAA,GAAc;AAAA,GAChB,GAAI,OAAA;AAEJ,EAAA,MAAM,QAAQ,QAAA,GAAW,IAAA;AACzB,EAAA,MAAM,QAAQ,QAAA,GAAW,GAAA;AACzB,EAAA,MAAM,IAAA,GAAQ,IAAA,CAAK,IAAA,CAAK,KAAA,GAAS,KAAK,CAAA;AACtC,EAAA,MAAM,IAAA,GAAQ,IAAA,CAAK,IAAA,CAAK,MAAA,GAAS,KAAK,CAAA;AAEtC,EAAA,MAAM,EAAA,GAAO,UAAA,CAAW,KAAK,CAAA,IAAS,EAAE,GAAG,EAAA,EAAK,CAAA,EAAG,GAAA,EAAK,CAAA,EAAG,EAAA,EAAI;AAC/D,EAAA,MAAM,GAAA,GAAO,UAAA,CAAW,QAAQ,CAAA,IAAM,EAAE,GAAG,EAAA,EAAK,CAAA,EAAG,EAAA,EAAK,CAAA,EAAG,GAAA,EAAI;AAC/D,EAAA,MAAM,IAAA,GAAO,UAAA,CAAW,SAAS,CAAA,IAAK,EAAE,GAAG,GAAA,EAAK,CAAA,EAAG,GAAA,EAAK,CAAA,EAAG,GAAA,EAAI;AAG/D,EAAA,GAAA,CAAI,SAAA,CAAU,CAAA,EAAG,CAAA,EAAG,KAAA,EAAO,MAAM,CAAA;AACjC,EAAA,GAAA,CAAI,IAAA,GAAO,GAAG,QAAQ,CAAA,8BAAA,CAAA;AACtB,EAAA,GAAA,CAAI,YAAA,GAAe,KAAA;AAEnB,EAAA,MAAM,MAAA,GAAS,OAAO,KAAA,GAAQ,GAAA;AAG9B,EAAA,MAAM,UAAA,GAAuB,IAAI,KAAA,CAAM,IAAI,CAAA;AAC3C,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,EAAM,CAAA,EAAA,EAAK;AAC7B,IAAA,MAAM,EAAA,GAAA,CAAM,CAAA,GAAI,IAAA,GAAO,MAAA,IAAU,SAAA,GAAY,CAAA;AAC7C,IAAA,MAAM,KAAK,GAAA,CAAI,EAAA,EAAI,GAAG,CAAA,GAAI,MAAM,GAAA,IAAO,WAAA;AACvC,IAAA,UAAA,CAAW,CAAC,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,IAAI,IAAI,CAAA;AAAA,EACrC;AAEA,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,EAAM,CAAA,EAAA,EAAK;AAC7B,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,EAAM,CAAA,EAAA,EAAK;AAC7B,MAAA,MAAM,YAAA,GAAe,IAAA,GAAO,CAAA,GAAI,UAAA,CAAW,CAAC,CAAA;AAC5C,MAAA,MAAM,WAAW,CAAA,IAAK,YAAA;AACtB,MAAA,MAAM,aAAa,CAAA,KAAM,YAAA;AAEzB,MAAA,IAAI,CAAC,QAAA,EAAU;AAEb,QAAA,IAAI,KAAA,EAAO;AACT,UAAA,MAAM,QAAA,GAAW,KAAA,CAAM,CAAA,GAAI,CAAA,GAAI,IAAA,CAAK,MAAM,MAAA,GAAS,GAAG,CAAA,EAAG,CAAA,GAAI,EAAE,CAAA;AAC/D,UAAA,IAAI,WAAW,IAAA,EAAM;AACnB,YAAA,MAAM,OAAA,GAAU,KAAK,GAAA,CAAI,IAAA,GAAO,IAAI,QAAA,GAAW,GAAG,IAAI,GAAA,GAAM,GAAA;AAC5D,YAAA,GAAA,CAAI,cAAc,OAAA,GAAU,GAAA;AAC5B,YAAA,GAAA,CAAI,SAAA,GAAY,CAAA,IAAA,EAAO,GAAA,CAAI,CAAA,GAAI,EAAE,CAAA,CAAA,EAAI,GAAA,CAAI,CAAA,GAAI,EAAE,CAAA,CAAA,EAAI,GAAA,CAAI,CAAA,GAAI,EAAE,CAAA,CAAA,CAAA;AAC7D,YAAA,GAAA,CAAI,QAAA,CAAS,MAAA,EAAK,CAAA,GAAI,KAAA,EAAO,IAAI,KAAK,CAAA;AAAA,UACxC;AAAA,QACF;AACA,QAAA;AAAA,MACF;AAGA,MAAA,MAAM,KAAA,GAAA,CAAS,IAAI,YAAA,IAAgB,IAAA,CAAK,IAAI,CAAA,EAAG,UAAA,CAAW,CAAC,CAAC,CAAA;AAC5D,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG,IAAA,CAAK,KAAA,CAAM,KAAA,GAAQ,KAAA,CAAM,MAAM,CAAC,CAAA;AAC3E,MAAA,MAAM,EAAA,GAAK,MAAM,OAAO,CAAA;AACxB,MAAA,IAAI,EAAA,KAAO,GAAA,IAAO,CAAC,UAAA,EAAY;AAE/B,MAAA,MAAM,SAAA,GAAY,aAAa,CAAA,GAAI,IAAA,CAAK,IAAI,CAAA,EAAG,CAAA,GAAI,QAAQ,CAAC,CAAA;AAC5D,MAAA,MAAM,KAAO,EAAA,CAAG,CAAA,GAAA,CAAK,KAAK,CAAA,GAAI,EAAA,CAAG,KAAK,SAAA,GAAa,CAAA;AACnD,MAAA,MAAM,KAAO,EAAA,CAAG,CAAA,GAAA,CAAK,KAAK,CAAA,GAAI,EAAA,CAAG,KAAK,SAAA,GAAa,CAAA;AACnD,MAAA,MAAM,KAAO,EAAA,CAAG,CAAA,GAAA,CAAK,KAAK,CAAA,GAAI,EAAA,CAAG,KAAK,SAAA,GAAa,CAAA;AAEnD,MAAA,GAAA,CAAI,WAAA,GAAc,MAAM,KAAA,GAAQ,GAAA;AAChC,MAAA,GAAA,CAAI,YAAY,CAAA,IAAA,EAAO,EAAE,CAAA,CAAA,EAAI,EAAE,IAAI,EAAE,CAAA,CAAA,CAAA;AACrC,MAAA,GAAA,CAAI,QAAA,CAAS,UAAA,GAAa,KAAA,CAAM,KAAA,CAAM,MAAA,GAAS,CAAC,CAAA,GAAI,EAAA,EAAI,CAAA,GAAI,KAAA,EAAO,CAAA,GAAI,KAAK,CAAA;AAAA,IAC9E;AAAA,EACF;AAEA,EAAA,GAAA,CAAI,WAAA,GAAc,CAAA;AACpB;;;ACvFA,IAAM,IAAA,GAAQ,CAAA;AACd,IAAM,IAAA,GAAQ,CAAA;AACd,IAAM,KAAA,GAAQ,CAAA;AACd,IAAM,KAAA,GAAQ,CAAA;AAEd,IAAM,SAAA,GAAoC;AAAA,EACxC,CAAC,IAAA,GAAO,IAAI,GAAgB,QAAA;AAAA,EAC5B,CAAC,KAAA,GAAQ,KAAK,GAAc,QAAA;AAAA,EAC5B,CAAC,IAAA,GAAO,KAAK,GAAe,QAAA;AAAA,EAC5B,CAAC,IAAA,GAAO,KAAK,GAAe,QAAA;AAAA,EAC5B,CAAC,IAAA,GAAO,KAAK,GAAe,QAAA;AAAA,EAC5B,CAAC,IAAA,GAAO,KAAK,GAAe,QAAA;AAAA,EAC5B,CAAC,IAAA,GAAO,IAAA,GAAO,KAAK,GAAQ,QAAA;AAAA,EAC5B,CAAC,IAAA,GAAO,IAAA,GAAO,KAAK,GAAQ,QAAA;AAAA,EAC5B,CAAC,KAAA,GAAQ,KAAA,GAAQ,IAAI,GAAO,QAAA;AAAA,EAC5B,CAAC,KAAA,GAAQ,KAAA,GAAQ,IAAI,GAAO,QAAA;AAAA,EAC5B,CAAC,IAAA,GAAO,IAAA,GAAO,KAAA,GAAQ,KAAK,GAAG,QAAA;AAAA,EAC/B,CAAC,IAAI,GAAI,QAAA;AAAA,EACT,CAAC,IAAI,GAAI,QAAA;AAAA,EACT,CAAC,KAAK,GAAG,QAAA;AAAA,EACT,CAAC,KAAK,GAAG;AACX,CAAA;AAEO,SAAS,wBACd,GAAA,EACA,KAAA,EACA,QACA,IAAA,EACA,OAAA,GAAoC,EAAC,EAC/B;AACN,EAAA,MAAM;AAAA,IACJ,QAAA,GAAa,EAAA;AAAA,IACb,UAAA,GAAa,SAAA;AAAA,IACb,KAAA,GAAa,SAAA;AAAA,IACb,OAAA,GAAa,IAAA;AAAA,IACb,KAAA,GAAa,CAAA;AAAA,IACb,SAAA,GAAa;AAAA,GACf,GAAI,OAAA;AAEJ,EAAA,MAAM,QAAQ,QAAA,GAAW,IAAA;AACzB,EAAA,MAAM,QAAQ,QAAA,GAAW,GAAA;AACzB,EAAA,MAAM,IAAA,GAAQ,IAAA,CAAK,IAAA,CAAK,KAAA,GAAS,KAAK,CAAA;AACtC,EAAA,MAAM,IAAA,GAAQ,IAAA,CAAK,IAAA,CAAK,MAAA,GAAS,KAAK,CAAA;AAEtC,EAAA,MAAM,EAAA,GAAK,UAAA,CAAW,KAAK,CAAA,IAAU,EAAE,GAAG,CAAA,EAAK,CAAA,EAAG,GAAA,EAAK,CAAA,EAAG,GAAA,EAAI;AAC9D,EAAA,MAAM,EAAA,GAAK,UAAA,CAAW,UAAU,CAAA,IAAK,EAAE,GAAG,GAAA,EAAK,CAAA,EAAG,GAAA,EAAK,CAAA,EAAG,GAAA,EAAI;AAK9D,EAAA,MAAM,cAAA,GAAiB,CAAC,CAAA,EAAW,CAAA,KAAsB;AACvD,IAAA,IAAI,KAAA,CAAM,IAAI,EAAA,GAAK,CAAA,EAAG,IAAI,CAAA,GAAI,CAAC,CAAA,GAAI,OAAA,EAAS,OAAO,CAAA;AACnD,IAAA,IAAI,IAAA,GAAO,CAAA;AACX,IAAA,IAAI,CAAA,GAAI,CAAA,GAAI,IAAA,IAAQ,KAAA,CAAM,CAAA,GAAI,EAAA,GAAK,CAAA,EAAG,CAAA,GAAI,CAAA,GAAI,CAAC,CAAA,GAAI,IAAA,EAAM,IAAA,IAAQ,IAAA;AACjE,IAAA,IAAI,CAAA,GAAI,CAAA,IAAK,CAAA,IAAO,KAAA,CAAA,CAAO,CAAA,GAAE,CAAA,IAAG,EAAA,GAAG,CAAA,EAAG,CAAA,GAAE,CAAA,GAAE,CAAC,CAAA,GAAI,MAAW,IAAA,IAAQ,IAAA;AAClE,IAAA,IAAI,CAAA,GAAI,CAAA,GAAI,IAAA,IAAQ,KAAA,CAAM,CAAA,GAAI,EAAA,GAAK,CAAA,EAAA,CAAI,CAAA,GAAE,CAAA,IAAG,CAAA,GAAE,CAAC,CAAA,GAAI,MAAO,IAAA,IAAQ,KAAA;AAClE,IAAA,IAAI,CAAA,GAAI,CAAA,IAAK,CAAA,IAAO,KAAA,CAAM,CAAA,GAAE,EAAA,GAAG,CAAA,EAAA,CAAG,CAAA,GAAE,CAAA,IAAG,CAAA,GAAE,CAAC,CAAA,GAAI,MAAY,IAAA,IAAQ,KAAA;AAClE,IAAA,OAAO,IAAA;AAAA,EACT,CAAA;AAEA,EAAA,GAAA,CAAI,SAAA,CAAU,CAAA,EAAG,CAAA,EAAG,KAAA,EAAO,MAAM,CAAA;AACjC,EAAA,GAAA,CAAI,IAAA,GAAO,GAAG,QAAQ,CAAA,8BAAA,CAAA;AACtB,EAAA,GAAA,CAAI,YAAA,GAAe,KAAA;AAEnB,EAAA,MAAM,IAAI,IAAA,GAAO,KAAA;AAEjB,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,EAAM,CAAA,EAAA,EAAK;AAC7B,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,EAAM,CAAA,EAAA,EAAK;AAC7B,MAAA,MAAM,IAAA,GAAO,cAAA,CAAe,CAAA,EAAG,CAAC,CAAA;AAChC,MAAA,IAAI,SAAS,CAAA,EAAG;AAEhB,MAAA,MAAM,EAAA,GAAK,SAAA,CAAU,IAAI,CAAA,IAAK,MAAA;AAG9B,MAAA,MAAM,SAAA,GAAA,CAAc,IAAI,CAAA,GAAI,KAAA,CAAM,GAAG,CAAA,GAAI,EAAE,IAAI,EAAA,IAAM,IAAA;AACrD,MAAA,MAAM,SAAA,GAAA,CAAc,IAAI,CAAA,GAAI,KAAA,CAAM,IAAI,EAAA,EAAI,CAAA,GAAI,EAAE,CAAA,GAAI,EAAA,IAAM,IAAA;AAC1D,MAAA,MAAM,KAAA,GAAA,CAAS,OAAO,IAAA,IAAQ,IAAA,GAAO,SAAS,IAAA,CAAK,GAAA,CAAI,CAAA,GAAI,SAAS,CAAA,GAAI,GAAA;AACxE,MAAA,MAAM,KAAA,GAAA,CAAS,OAAO,KAAA,IAAS,IAAA,GAAO,UAAU,IAAA,CAAK,GAAA,CAAI,CAAA,GAAI,SAAS,CAAA,GAAI,GAAA;AAC1E,MAAA,MAAM,UAAU,KAAA,IAAS,KAAA;AAEzB,MAAA,MAAM,YAAY,IAAA,GAAO,KAAA,CAAM,IAAI,CAAA,EAAG,CAAA,GAAI,CAAC,CAAA,GAAI,IAAA;AAE/C,MAAA,IAAI,OAAA,EAAS;AACX,QAAA,GAAA,CAAI,WAAA,GAAc,IAAA;AAClB,QAAA,GAAA,CAAI,SAAA,GAAY,OAAO,EAAA,CAAG,CAAC,IAAI,EAAA,CAAG,CAAC,CAAA,CAAA,EAAI,EAAA,CAAG,CAAC,CAAA,CAAA,CAAA;AAAA,MAC7C,CAAA,MAAO;AACL,QAAA,GAAA,CAAI,WAAA,GAAc,SAAA;AAClB,QAAA,GAAA,CAAI,SAAA,GAAY,OAAO,EAAA,CAAG,CAAC,IAAI,EAAA,CAAG,CAAC,CAAA,CAAA,EAAI,EAAA,CAAG,CAAC,CAAA,CAAA,CAAA;AAAA,MAC7C;AAEA,MAAA,GAAA,CAAI,QAAA,CAAS,EAAA,EAAI,CAAA,GAAI,KAAA,EAAO,IAAI,KAAK,CAAA;AAAA,IACvC;AAAA,EACF;AAEA,EAAA,GAAA,CAAI,WAAA,GAAc,CAAA;AACpB;;;ACpCA,SAAS,YAAY,CAAA,EAAuD;AAC1E,EAAA,MAAM,GAAA,GAAM,CAAA,CAAE,KAAA,CAAM,qBAAqB,IAAI,CAAC,CAAA;AAC9C,EAAA,IAAI,GAAA,EAAK;AACP,IAAA,MAAM,IAAI,GAAA,CAAI,MAAA,IAAU,IACpB,GAAA,CAAI,KAAA,CAAM,EAAE,CAAA,CAAE,GAAA,CAAI,CAAA,CAAA,KAAK,QAAA,CAAS,IAAI,CAAA,EAAG,EAAE,CAAC,CAAA,GAC1C,CAAC,SAAS,GAAA,CAAI,KAAA,CAAM,CAAA,EAAE,CAAC,GAAE,EAAE,CAAA,EAAG,SAAS,GAAA,CAAI,KAAA,CAAM,GAAE,CAAC,CAAA,EAAE,EAAE,CAAA,EAAG,SAAS,GAAA,CAAI,KAAA,CAAM,GAAE,CAAC,CAAA,EAAE,EAAE,CAAC,CAAA;AAC1F,IAAA,OAAO,EAAE,CAAA,EAAG,CAAA,CAAE,CAAC,CAAA,EAAG,CAAA,EAAG,CAAA,CAAE,CAAC,CAAA,EAAG,CAAA,EAAG,CAAA,CAAE,CAAC,CAAA,EAAE;AAAA,EACrC;AACA,EAAA,MAAM,GAAA,GAAM,CAAA,CAAE,KAAA,CAAM,wCAAwC,CAAA;AAC5D,EAAA,IAAI,KAAK,OAAO,EAAE,CAAA,EAAG,CAAC,IAAI,CAAC,CAAA,EAAG,CAAA,EAAG,CAAC,IAAI,CAAC,CAAA,EAAG,GAAG,CAAC,GAAA,CAAI,CAAC,CAAA,EAAE;AACrD,EAAA,OAAO,IAAA;AACT;AA6EO,SAAS,eAAA,CACd,MAAA,EACA,OAAA,GAAkC,EAAC,EACV;AACzB,EAAA,MAAM;AAAA,IACJ,IAAA,GAAc,MAAA;AAAA,IACd,OAAA,GAAc,GAAA;AAAA,IACd,SAAA;AAAA,IACA,MAAA,GAAc,CAAA;AAAA,IACd,WAAA,GAAc,MAAA;AAAA,IACd,KAAA;AAAA,IACA,GAAG;AAAA,GACL,GAAI,OAAA;AAEJ,EAAA,MAAM,YAAY,OAAO,MAAA,KAAW,WAC/B,QAAA,CAAS,aAAA,CAAc,MAAM,CAAA,GAC9B,MAAA;AAEJ,EAAA,IAAI,CAAC,SAAA,EAAW;AACd,IAAA,OAAA,CAAQ,IAAA,CAAK,+CAA+C,MAAM,CAAA;AAClE,IAAA,OAAO,EAAE,SAAS,MAAM;AAAA,IAAC,CAAA,EAAE;AAAA,EAC7B;AAEA,EAAA,MAAM,YAAA,GAAe,UAAU,KAAA,CAAM,QAAA;AACrC,EAAA,IAAI,gBAAA,CAAiB,SAAS,CAAA,CAAE,QAAA,KAAa,QAAA,EAAU;AACrD,IAAA,SAAA,CAAU,MAAM,QAAA,GAAW,UAAA;AAAA,EAC7B;AAEA,EAAA,MAAM,MAAA,GAAS,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AAC9C,EAAA,MAAA,CAAO,MAAM,OAAA,GAAU;AAAA,IACrB,mBAAA;AAAA,IAAqB,SAAA;AAAA,IAAW,YAAA;AAAA,IAAc,aAAA;AAAA,IAC9C,WAAW,OAAO,CAAA,CAAA;AAAA,IAAI,qBAAA;AAAA,IAAuB,WAAW,MAAM,CAAA;AAAA,GAChE,CAAE,KAAK,GAAG,CAAA;AACV,EAAA,IAAI,SAAA,SAAkB,SAAA,GAAY,SAAA;AAClC,EAAA,SAAA,CAAU,QAAQ,MAAM,CAAA;AAExB,EAAA,MAAM,GAAA,GAAM,MAAA,CAAO,UAAA,CAAW,IAAI,CAAA;AAClC,EAAA,MAAM,GAAA,GAAM,OAAO,gBAAA,IAAoB,CAAA;AACvC,EAAA,MAAM,KAAA,GAAc,EAAE,CAAA,EAAG,GAAA,EAAK,GAAG,GAAA,EAAI;AACrC,EAAA,MAAM,WAAA,GAAc,EAAE,CAAA,EAAG,GAAA,EAAK,GAAG,GAAA,EAAI;AAGrC,EAAA,MAAM,EAAA,GAAK,MAAA,CAAO,UAAA,CAAW,+BAA+B,CAAA;AAC5D,EAAA,MAAM,UAAU,MAAe;AAC7B,IAAA,IAAI,WAAA,KAAgB,SAAS,OAAO,IAAA;AACpC,IAAA,IAAI,WAAA,KAAgB,QAAS,OAAO,KAAA;AACpC,IAAA,OAAO,EAAA,CAAG,OAAA;AAAA,EACZ,CAAA;AAEA,EAAA,MAAM,WAAA,GAAc,KAAA,GAAQ,WAAA,CAAY,KAAK,CAAA,GAAI,IAAA;AASjD,EAAA,MAAM,gBAAgB,OAA8B;AAAA,IAClD,GAAG,UAAA;AAAA,IACH,WAAW,UAAA,CAAW,SAAA,KAAc,MAAA,GAAY,UAAA,CAAW,YAAY,OAAA,EAAQ;AAAA,IAC/E,SAAA,EAAW,WAAA,GACP,CAAA,KAAA,EAAQ,WAAA,CAAY,CAAC,CAAA,CAAA,EAAI,WAAA,CAAY,CAAC,CAAA,CAAA,EAAI,WAAA,CAAY,CAAC,CAAA,KAAA,CAAA,GACtD,UAAA,CAAqC;AAAA,GAC5C,CAAA;AACA,EAAA,MAAM,gBAAiB,OAA8B;AAAA,IACnD,GAAG,UAAA;AAAA,IACH,WAAW,UAAA,CAAW,SAAA,KAAc,MAAA,GAAY,UAAA,CAAW,YAAY,OAAA,EAAQ;AAAA,IAC/E,KAAA,EAAO,SAAU,UAAA,CAAqC;AAAA,GACxD,CAAA;AACA,EAAA,MAAM,iBAAiB,OAA+B;AAAA,IACpD,GAAG,UAAA;AAAA,IACH,WAAW,UAAA,CAAW,SAAA,KAAc,MAAA,GAAY,UAAA,CAAW,YAAY,OAAA,EAAQ;AAAA,IAC/E,KAAA,EAAO,SAAU,UAAA,CAAsC;AAAA,GACzD,CAAA;AACA,EAAA,MAAM,iBAAiB,OAA+B;AAAA,IACpD,GAAG,UAAA;AAAA,IACH,WAAW,UAAA,CAAW,SAAA,KAAc,MAAA,GAAY,UAAA,CAAW,YAAY,OAAA,EAAQ;AAAA,IAC/E,KAAA,EAAO,SAAU,UAAA,CAAsC;AAAA,GACzD,CAAA;AACA,EAAA,MAAM,iBAAiB,OAA+B;AAAA,IACpD,GAAG,UAAA;AAAA,IACH,WAAW,UAAA,CAAW,SAAA,KAAc,MAAA,GAAY,UAAA,CAAW,YAAY,OAAA,EAAQ;AAAA,IAC/E,KAAA,EAAO,SAAU,UAAA,CAAsC;AAAA,GACzD,CAAA;AACA,EAAA,MAAM,gBAAgB,OAA8B;AAAA,IAClD,GAAG,UAAA;AAAA,IACH,WAAW,UAAA,CAAW,SAAA,KAAc,MAAA,GAAY,UAAA,CAAW,YAAY,OAAA,EAAQ;AAAA,IAC/E,KAAA,EAAO,SAAU,UAAA,CAAqC;AAAA,GACxD,CAAA;AACA,EAAA,MAAM,kBAAkB,OAAgC;AAAA,IACtD,GAAG,UAAA;AAAA,IACH,WAAW,UAAA,CAAW,SAAA,KAAc,MAAA,GAAY,UAAA,CAAW,YAAY,OAAA,EAAQ;AAAA,IAC/E,KAAA,EAAO,SAAU,UAAA,CAAuC;AAAA,GAC1D,CAAA;AACA,EAAA,MAAM,gBAAgB,OAA8B;AAAA,IAClD,GAAG,UAAA;AAAA,IACH,WAAW,UAAA,CAAW,SAAA,KAAc,MAAA,GAAY,UAAA,CAAW,YAAY,OAAA,EAAQ;AAAA,IAC/E,KAAA,EAAO,SAAU,UAAA,CAAqC;AAAA,GACxD,CAAA;AACA,EAAA,MAAM,gBAAgB,OAA8B;AAAA,IAClD,GAAG,UAAA;AAAA,IACH,WAAW,UAAA,CAAW,SAAA,KAAc,MAAA,GAAY,UAAA,CAAW,YAAY,OAAA,EAAQ;AAAA,IAC/E,KAAA,EAAO,SAAU,UAAA,CAAqC;AAAA,GACxD,CAAA;AACA,EAAA,MAAM,iBAAiB,OAA+B;AAAA,IACpD,GAAG,UAAA;AAAA,IACH,WAAW,UAAA,CAAW,SAAA,KAAc,MAAA,GAAY,UAAA,CAAW,YAAY,OAAA,EAAQ;AAAA,IAC/E,KAAA,EAAO,SAAU,UAAA,CAAsC;AAAA,GACzD,CAAA;AACA,EAAA,MAAM,gBAAgB,OAA8B;AAAA,IAClD,GAAG,UAAA;AAAA,IACH,KAAA,EAAO,SAAU,UAAA,CAAqC;AAAA,GACxD,CAAA;AACA,EAAA,MAAM,eAAe,OAA6B;AAAA,IAChD,GAAG,UAAA;AAAA,IACH,KAAA,EAAO,SAAU,UAAA,CAAoC;AAAA,GACvD,CAAA;AACA,EAAA,MAAM,mBAAmB,OAAiC;AAAA,IACxD,GAAG,UAAA;AAAA,IACH,KAAA,EAAO,SAAU,UAAA,CAAwC,KAAA;AAAA,IACzD,WAAW,UAAA,CAAW,SAAA,KAAc,MAAA,GAAY,UAAA,CAAW,YAAY,OAAA;AAAQ,GACjF,CAAA;AACA,EAAA,MAAM,mBAAmB,OAAiC;AAAA,IACxD,GAAG,UAAA;AAAA,IACH,KAAA,EAAO,SAAU,UAAA,CAAwC,KAAA;AAAA,IACzD,WAAW,UAAA,CAAW,SAAA,KAAc,MAAA,GAAY,UAAA,CAAW,YAAY,OAAA;AAAQ,GACjF,CAAA;AAEA,EAAA,MAAM,OAAA,GAAU,EAAE,OAAA,EAAS,aAAA,EAAc,EAAmB;AAC5D,EAAA,MAAM,cAAc,MAAM;AACxB,IAAA,IAAS,IAAA,KAAS,MAAA,EAAW,OAAA,CAAQ,OAAA,GAAU,aAAA,EAAc;AAAA,SAAA,IACpD,IAAA,KAAS,OAAA,EAAW,OAAA,CAAQ,OAAA,GAAU,cAAA,EAAe;AAAA,SAAA,IACrD,IAAA,KAAS,OAAA,EAAW,OAAA,CAAQ,OAAA,GAAU,cAAA,EAAe;AAAA,SAAA,IACrD,IAAA,KAAS,OAAA,EAAW,OAAA,CAAQ,OAAA,GAAU,cAAA,EAAe;AAAA,SAAA,IACrD,IAAA,KAAS,MAAA,EAAW,OAAA,CAAQ,OAAA,GAAU,aAAA,EAAc;AAAA,SAAA,IACpD,IAAA,KAAS,QAAA,EAAW,OAAA,CAAQ,OAAA,GAAU,eAAA,EAAgB;AAAA,SAAA,IACtD,IAAA,KAAS,MAAA,EAAW,OAAA,CAAQ,OAAA,GAAU,aAAA,EAAc;AAAA,SAAA,IACpD,IAAA,KAAS,MAAA,EAAW,OAAA,CAAQ,OAAA,GAAU,aAAA,EAAc;AAAA,SAAA,IACpD,IAAA,KAAS,OAAA,EAAW,OAAA,CAAQ,OAAA,GAAU,cAAA,EAAe;AAAA,SAAA,IACrD,IAAA,KAAS,MAAA,EAAW,OAAA,CAAQ,OAAA,GAAU,aAAA,EAAc;AAAA,SAAA,IACpD,IAAA,KAAS,KAAA,EAAW,OAAA,CAAQ,OAAA,GAAU,YAAA,EAAa;AAAA,SAAA,IACnD,IAAA,KAAS,SAAA,EAAW,OAAA,CAAQ,OAAA,GAAU,gBAAA,EAAiB;AAAA,SAAA,IACvD,IAAA,KAAS,SAAA,EAAW,OAAA,CAAQ,OAAA,GAAU,gBAAA,EAAiB;AAAA,SACnC,OAAA,CAAQ,UAAU,aAAA,EAAc;AAAA,EAC/D,CAAA;AACA,EAAA,WAAA,EAAY;AAEZ,EAAA,MAAM,iBAAiB,MAAM;AAAE,IAAA,WAAA,EAAY;AAAA,EAAG,CAAA;AAC9C,EAAA,IAAI,WAAA,KAAgB,MAAA,EAAQ,EAAA,CAAG,gBAAA,CAAiB,UAAU,cAAc,CAAA;AAExE,EAAA,MAAM,SAAS,MAAM;AACnB,IAAA,MAAM,CAAA,GAAI,UAAU,qBAAA,EAAsB;AAC1C,IAAA,MAAA,CAAO,KAAA,GAAS,EAAE,KAAA,GAAS,GAAA;AAC3B,IAAA,MAAA,CAAO,MAAA,GAAS,EAAE,MAAA,GAAS,GAAA;AAC3B,IAAA,GAAA,CAAI,aAAa,GAAA,EAAK,CAAA,EAAG,CAAA,EAAG,GAAA,EAAK,GAAG,CAAC,CAAA;AAAA,EACvC,CAAA;AACA,EAAA,MAAA,EAAO;AAEP,EAAA,MAAM,WAAA,GAAc,CAAC,CAAA,KAAkB;AACrC,IAAA,MAAM,CAAA,GAAI,UAAU,qBAAA,EAAsB;AAC1C,IAAA,KAAA,CAAM,CAAA,GAAA,CAAK,CAAA,CAAE,OAAA,GAAU,CAAA,CAAE,QAAQ,CAAA,CAAE,KAAA;AACnC,IAAA,KAAA,CAAM,CAAA,GAAA,CAAK,CAAA,CAAE,OAAA,GAAU,CAAA,CAAE,OAAQ,CAAA,CAAE,MAAA;AAAA,EACrC,CAAA;AACA,EAAA,MAAM,EAAA,GAAK,IAAI,cAAA,CAAe,MAAM,CAAA;AACpC,EAAA,EAAA,CAAG,QAAQ,SAAS,CAAA;AACpB,EAAA,MAAA,CAAO,gBAAA,CAAiB,aAAa,WAAW,CAAA;AAEhD,EAAA,IAAI,IAAA,GAAO,CAAA;AACX,EAAA,IAAI,GAAA,GAAO,CAAA;AACX,EAAA,MAAM,OAAO,MAAM;AACjB,IAAA,WAAA,CAAY,CAAA,IAAA,CAAM,KAAA,CAAM,CAAA,GAAI,WAAA,CAAY,CAAA,IAAK,IAAA;AAC7C,IAAA,WAAA,CAAY,CAAA,IAAA,CAAM,KAAA,CAAM,CAAA,GAAI,WAAA,CAAY,CAAA,IAAK,IAAA;AAC7C,IAAA,MAAM,CAAA,GAAI,UAAU,qBAAA,EAAsB;AAE1C,IAAA,IAAI,SAAS,MAAA,EAAQ;AACnB,MAAA,oBAAA,CAAqB,KAAK,CAAA,CAAE,KAAA,EAAO,EAAE,MAAA,EAAQ,IAAA,EAAM,QAAQ,OAAgC,CAAA;AAAA,IAC7F,CAAA,MAAA,IAAW,SAAS,OAAA,EAAS;AAC3B,MAAA,qBAAA,CAAsB,GAAA,EAAK,EAAE,KAAA,EAAO,CAAA,CAAE,QAAQ,IAAA,EAAM,WAAA,EAAa,QAAQ,OAAiC,CAAA;AAAA,IAC5G,CAAA,MAAA,IAAW,SAAS,OAAA,EAAS;AAC3B,MAAA,qBAAA,CAAsB,GAAA,EAAK,EAAE,KAAA,EAAO,CAAA,CAAE,QAAQ,IAAA,EAAM,WAAA,EAAa,QAAQ,OAAiC,CAAA;AAAA,IAC5G,CAAA,MAAA,IAAW,SAAS,OAAA,EAAS;AAC3B,MAAA,qBAAA,CAAsB,GAAA,EAAK,EAAE,KAAA,EAAO,CAAA,CAAE,QAAQ,IAAA,EAAM,WAAA,EAAa,QAAQ,OAAiC,CAAA;AAAA,IAC5G,CAAA,MAAA,IAAW,SAAS,MAAA,EAAQ;AAC1B,MAAA,oBAAA,CAAqB,GAAA,EAAK,EAAE,KAAA,EAAO,CAAA,CAAE,QAAQ,IAAA,EAAM,WAAA,EAAa,QAAQ,OAAgC,CAAA;AAAA,IAC1G,CAAA,MAAA,IAAW,SAAS,QAAA,EAAU;AAC5B,MAAA,sBAAA,CAAuB,GAAA,EAAK,EAAE,KAAA,EAAO,CAAA,CAAE,QAAQ,IAAA,EAAM,WAAA,EAAa,QAAQ,OAAkC,CAAA;AAAA,IAC9G,CAAA,MAAA,IAAW,SAAS,MAAA,EAAQ;AAC1B,MAAA,oBAAA,CAAqB,KAAK,CAAA,CAAE,KAAA,EAAO,EAAE,MAAA,EAAQ,IAAA,EAAM,QAAQ,OAAgC,CAAA;AAAA,IAC7F,CAAA,MAAA,IAAW,SAAS,MAAA,EAAQ;AAC1B,MAAA,oBAAA,CAAqB,GAAA,EAAK,EAAE,KAAA,EAAO,CAAA,CAAE,QAAQ,IAAA,EAAM,WAAA,EAAa,QAAQ,OAAgC,CAAA;AAAA,IAC1G,CAAA,MAAA,IAAW,SAAS,OAAA,EAAS;AAC3B,MAAA,qBAAA,CAAsB,KAAK,CAAA,CAAE,KAAA,EAAO,EAAE,MAAA,EAAQ,IAAA,EAAM,QAAQ,OAAiC,CAAA;AAAA,IAC/F,CAAA,MAAA,IAAW,SAAS,MAAA,EAAQ;AAC1B,MAAA,oBAAA,CAAqB,KAAK,CAAA,CAAE,KAAA,EAAO,EAAE,MAAA,EAAQ,IAAA,EAAM,QAAQ,OAAgC,CAAA;AAAA,IAC7F,CAAA,MAAA,IAAW,SAAS,KAAA,EAAO;AACzB,MAAA,mBAAA,CAAoB,KAAK,CAAA,CAAE,KAAA,EAAO,EAAE,MAAA,EAAQ,IAAA,EAAM,QAAQ,OAA+B,CAAA;AAAA,IAC3F,CAAA,MAAA,IAAW,SAAS,SAAA,EAAW;AAC7B,MAAA,uBAAA,CAAwB,KAAK,CAAA,CAAE,KAAA,EAAO,EAAE,MAAA,EAAQ,IAAA,EAAM,QAAQ,OAAmC,CAAA;AAAA,IACnG,CAAA,MAAA,IAAW,SAAS,SAAA,EAAW;AAC7B,MAAA,uBAAA,CAAwB,KAAK,CAAA,CAAE,KAAA,EAAO,EAAE,MAAA,EAAQ,IAAA,EAAM,QAAQ,OAAmC,CAAA;AAAA,IACnG,CAAA,MAAO;AACL,MAAA,oBAAA,CAAqB,GAAA,EAAK,EAAE,KAAA,EAAO,CAAA,CAAE,QAAQ,IAAA,EAAM,WAAA,EAAa,QAAQ,OAAgC,CAAA;AAAA,IAC1G;AAEA,IAAA,IAAA,IAAQ,KAAA;AACR,IAAA,GAAA,GAAM,sBAAsB,IAAI,CAAA;AAAA,EAClC,CAAA;AACA,EAAA,GAAA,GAAM,sBAAsB,IAAI,CAAA;AAEhC,EAAA,OAAO;AAAA,IACL,SAAS,MAAM;AACb,MAAA,oBAAA,CAAqB,GAAG,CAAA;AACxB,MAAA,EAAA,CAAG,UAAA,EAAW;AACd,MAAA,IAAI,WAAA,KAAgB,MAAA,EAAQ,EAAA,CAAG,mBAAA,CAAoB,UAAU,cAAc,CAAA;AAC3E,MAAA,MAAA,CAAO,mBAAA,CAAoB,aAAa,WAAW,CAAA;AACnD,MAAA,MAAA,CAAO,MAAA,EAAO;AACd,MAAA,SAAA,CAAU,MAAM,QAAA,GAAW,YAAA;AAAA,IAC7B;AAAA,GACF;AACF;AAGO,IAAM,mBAAA,GAAsB;;;AC9W5B,SAAS,UACd,MAAA,EACA,OAAA,GAAiC,EAAC,EAClC,aACA,YAAA,EACQ;AACR,EAAA,MAAM,IAAA,GAAqB,EAAE,GAAG,eAAA,EAAiB,GAAG,OAAA,EAAQ;AAC5D,EAAA,MAAM,EAAE,OAAO,IAAA,EAAK,GAAI,kBAAkB,MAAA,EAAQ,IAAA,EAAM,aAAa,YAAY,CAAA;AACjF,EAAA,IAAI,CAAC,KAAA,CAAM,MAAA,IAAU,IAAA,KAAS,GAAG,OAAO,EAAA;AAExC,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,KAAA,MAAW,OAAO,KAAA,EAAO;AACvB,IAAA,KAAA,CAAM,IAAA,CAAK,IAAI,GAAA,CAAI,CAAA,IAAA,KAAQ,KAAK,IAAI,CAAA,CAAE,IAAA,CAAK,EAAE,CAAC,CAAA;AAAA,EAChD;AACA,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;AAWO,SAAS,cACd,MAAA,EACA,OAAA,GAAiC,EAAC,EAClC,aACA,YAAA,EACQ;AACR,EAAA,MAAM,IAAA,GAAqB,EAAE,GAAG,eAAA,EAAiB,GAAG,OAAA,EAAQ;AAC5D,EAAA,MAAM,EAAE,OAAO,IAAA,EAAK,GAAI,kBAAkB,MAAA,EAAQ,IAAA,EAAM,aAAa,YAAY,CAAA;AACjF,EAAA,IAAI,CAAC,KAAA,CAAM,MAAA,IAAU,IAAA,KAAS,GAAG,OAAO,EAAA;AAExC,EAAA,MAAM,KAAA,GAAQ,SAAA;AACd,EAAA,MAAM,QAAkB,EAAC;AAEzB,EAAA,KAAA,MAAW,OAAO,KAAA,EAAO;AACvB,IAAA,IAAI,IAAA,GAAO,EAAA;AACX,IAAA,KAAA,MAAW,QAAQ,GAAA,EAAK;AACtB,MAAA,IAAI,IAAA,CAAK,IAAA,KAAS,GAAA,IAAO,IAAA,CAAK,IAAI,EAAA,EAAI;AACpC,QAAA,IAAA,IAAQ,GAAA;AAAA,MACV,CAAA,MAAO;AAEL,QAAA,IAAA,IAAQ,CAAA,UAAA,EAAa,IAAA,CAAK,CAAC,CAAA,CAAA,EAAI,IAAA,CAAK,CAAC,CAAA,CAAA,EAAI,IAAA,CAAK,CAAC,CAAA,CAAA,EAAI,IAAA,CAAK,IAAI,GAAG,KAAK,CAAA,CAAA;AAAA,MACtE;AAAA,IACF;AACA,IAAA,KAAA,CAAM,KAAK,IAAI,CAAA;AAAA,EACjB;AACA,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;;;AC5BO,SAAS,cAAA,CACd,MAAA,EACA,OAAA,GAA2B,EAAC,EAClB;AACV,EAAA,MAAM;AAAA,IACJ,GAAA,GAAY,EAAA;AAAA,IACZ,SAAA,GAAY,GAAA;AAAA,IACZ,MAAA,GAAY,KAAA;AAAA,IACZ,OAAA,GAAY,EAAA;AAAA,IACZ,KAAA,GAAY;AAAA,GACd,GAAI,OAAA;AAEJ,EAAA,MAAM,WAAW,GAAA,GAAO,GAAA;AACxB,EAAA,IAAI,SAAA,GAAa,KAAA;AACjB,EAAA,IAAI,OAAA,GAAa,EAAA;AACjB,EAAA,MAAM,QAAkB,EAAC;AAEzB,EAAA,MAAM,eAAe,MAAM;AACzB,IAAA,IAAI,CAAC,SAAA,IAAa,KAAA,CAAM,MAAA,IAAU,SAAA,EAAW;AAC7C,IAAA,IAAI,GAAA,GAAyB,MAAA;AAC7B,IAAA,IAAI,UAAU,CAAA,EAAG;AACf,MAAA,MAAM,GAAA,GAAM,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AAC3C,MAAA,GAAA,CAAI,KAAA,GAAS,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,QAAS,KAAK,CAAA;AAC7C,MAAA,GAAA,CAAI,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,SAAS,KAAK,CAAA;AAC7C,MAAA,MAAM,MAAA,GAAS,GAAA,CAAI,UAAA,CAAW,IAAI,CAAA;AAClC,MAAA,MAAA,CAAO,UAAU,MAAA,EAAQ,CAAA,EAAG,GAAG,GAAA,CAAI,KAAA,EAAO,IAAI,MAAM,CAAA;AACpD,MAAA,GAAA,GAAM,GAAA;AAAA,IACR;AACA,IAAA,KAAA,CAAM,IAAA,CAAK,GAAA,CAAI,SAAA,CAAU,WAAW,CAAC,CAAA;AAAA,EACvC,CAAA;AAEA,EAAA,MAAM,SAAA,GAAY,OAAO,MAAA,KAAsC;AAG7D,IAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,EAAS,MAAA,KAAW;AAEtC,MAAA,IAAI,OAAO,QAAQ,WAAA,EAAa;AAC9B,QAAA,MAAA,CAAO,IAAI,KAAA,CAAM,sFAAsF,CAAC,CAAA;AACxG,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI;AAAA,QAClB,OAAA,EAAS,CAAA;AAAA,QACT,OAAA;AAAA,QACA,YAAA,EAAc;AAAA,OACf,CAAA;AAED,MAAA,IAAI,MAAA,GAAS,CAAA;AACb,MAAA,MAAM,QAAQ,MAAA,CAAO,MAAA;AACrB,MAAA,MAAA,CAAO,OAAA,CAAQ,CAAC,OAAA,KAAY;AAC1B,QAAA,MAAM,GAAA,GAAM,IAAI,KAAA,EAAM;AACtB,QAAA,GAAA,CAAI,SAAS,MAAM;AACjB,UAAA,GAAA,CAAI,SAAS,GAAA,EAAK,EAAE,OAAO,QAAA,EAAU,IAAA,EAAM,MAAM,CAAA;AACjD,UAAA,MAAA,EAAA;AACA,UAAA,IAAI,MAAA,KAAW,KAAA,EAAO,GAAA,CAAI,MAAA,EAAO;AAAA,QACnC,CAAA;AACA,QAAA,GAAA,CAAI,GAAA,GAAM,OAAA;AAAA,MACZ,CAAC,CAAA;AAED,MAAA,GAAA,CAAI,EAAA,CAAG,UAAA,EAAY,CAAC,IAAA,KAAe;AACjC,QAAA,MAAM,MAAA,GAAS,IAAI,UAAA,EAAW;AAC9B,QAAA,MAAA,CAAO,MAAA,GAAS,MAAM,OAAA,CAAQ,MAAA,CAAO,MAAgB,CAAA;AACrD,QAAA,MAAA,CAAO,cAAc,IAAI,CAAA;AAAA,MAC3B,CAAC,CAAA;AACD,MAAA,GAAA,CAAI,EAAA,CAAG,SAAS,MAAM,CAAA;AAAA,IACxB,CAAC,CAAA;AAAA,EACH,CAAA;AAEA,EAAA,MAAM,UAAA,GAAa,OAAO,MAAA,EAAkB,IAAA,KAAkC;AAE5E,IAAA,IAAI,OAAO,kBAAkB,WAAA,EAAa;AACxC,MAAA,MAAM,IAAI,MAAM,iEAAiE,CAAA;AAAA,IACnF;AACA,IAAA,MAAM,GAAA,GAAM,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AAC3C,IAAA,IAAI,MAAA,CAAO,MAAA,KAAW,CAAA,EAAG,OAAO,EAAA;AAChC,IAAA,MAAM,KAAA,GAAQ,IAAI,KAAA,EAAM;AACxB,IAAA,MAAM,IAAI,OAAA,CAAc,CAAC,GAAA,KAAQ;AAAE,MAAA,KAAA,CAAM,MAAA,GAAS,MAAM,GAAA,EAAI;AAAG,MAAA,KAAA,CAAM,GAAA,GAAM,OAAO,CAAC,CAAA;AAAA,IAAG,CAAC,CAAA;AACvF,IAAA,GAAA,CAAI,QAAS,KAAA,CAAM,YAAA;AACnB,IAAA,GAAA,CAAI,SAAS,KAAA,CAAM,aAAA;AACnB,IAAA,MAAM,MAAA,GAAS,GAAA,CAAI,UAAA,CAAW,IAAI,CAAA;AAElC,IAAA,MAAM,MAAA,GAAS,GAAA,CAAI,aAAA,CAAc,IAAI,CAAA;AACrC,IAAA,MAAM,WAAW,IAAI,aAAA,CAAc,QAAQ,EAAE,QAAA,EAAU,yBAAyB,CAAA;AAChF,IAAA,MAAM,SAAqB,EAAC;AAC5B,IAAA,QAAA,CAAS,kBAAkB,CAAC,CAAA,KAAM,MAAA,CAAO,IAAA,CAAK,EAAE,IAAI,CAAA;AAEpD,IAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,EAAS,MAAA,KAAW;AACtC,MAAA,QAAA,CAAS,SAAS,MAAM;AACtB,QAAA,MAAM,OAAO,IAAI,IAAA,CAAK,QAAQ,EAAE,IAAA,EAAM,cAAc,CAAA;AACpD,QAAA,MAAM,MAAA,GAAS,IAAI,UAAA,EAAW;AAC9B,QAAA,MAAA,CAAO,MAAA,GAAS,MAAM,OAAA,CAAQ,MAAA,CAAO,MAAgB,CAAA;AACrD,QAAA,MAAA,CAAO,cAAc,IAAI,CAAA;AAAA,MAC3B,CAAA;AACA,MAAA,QAAA,CAAS,OAAA,GAAU,MAAA;AACnB,MAAA,QAAA,CAAS,KAAA,EAAM;AAEf,MAAA,IAAI,GAAA,GAAM,CAAA;AACV,MAAA,MAAM,WAAW,MAAM;AACrB,QAAA,IAAI,GAAA,IAAO,OAAO,MAAA,EAAQ;AAAE,UAAA,QAAA,CAAS,IAAA,EAAK;AAAG,UAAA;AAAA,QAAQ;AACrD,QAAA,MAAM,GAAA,GAAM,IAAI,KAAA,EAAM;AACtB,QAAA,GAAA,CAAI,SAAS,MAAM;AACjB,UAAA,MAAA,CAAO,SAAA,CAAU,GAAA,EAAK,CAAA,EAAG,CAAC,CAAA;AAC1B,UAAA,GAAA,EAAA;AACA,UAAA,UAAA,CAAW,UAAU,QAAQ,CAAA;AAAA,QAC/B,CAAA;AACA,QAAA,GAAA,CAAI,GAAA,GAAM,OAAO,GAAG,CAAA;AAAA,MACtB,CAAA;AACA,MAAA,QAAA,EAAS;AAAA,IACX,CAAC,CAAA;AAAA,EACH,CAAA;AAEA,EAAA,OAAO;AAAA,IACL,IAAI,WAAA,GAAc;AAAE,MAAA,OAAO,SAAA;AAAA,IAAW,CAAA;AAAA,IACtC,IAAI,UAAA,GAAc;AAAE,MAAA,OAAO,KAAA,CAAM,MAAA;AAAA,IAAQ,CAAA;AAAA,IAEzC,KAAA,GAAQ;AACN,MAAA,IAAI,SAAA,EAAW;AACf,MAAA,KAAA,CAAM,MAAA,GAAS,CAAA;AACf,MAAA,SAAA,GAAe,IAAA;AACf,MAAA,OAAA,GAAU,MAAA,CAAO,WAAA,CAAY,YAAA,EAAc,QAAQ,CAAA;AAAA,IACrD,CAAA;AAAA,IAEA,MAAM,IAAA,GAAwB;AAC5B,MAAA,IAAI,CAAC,WAAW,OAAO,EAAA;AACvB,MAAA,SAAA,GAAY,KAAA;AACZ,MAAA,aAAA,CAAc,OAAO,CAAA;AAErB,MAAA,MAAM,MAAA,GAAS,MAAM,KAAA,EAAM;AAE3B,MAAA,IAAI,WAAW,cAAA,EAAgB;AAC7B,QAAA,OAAO,IAAA,CAAK,UAAU,MAAM,CAAA;AAAA,MAC9B;AACA,MAAA,IAAI,WAAW,MAAA,EAAQ;AACrB,QAAA,OAAO,UAAA,CAAW,QAAQ,GAAG,CAAA;AAAA,MAC/B;AAEA,MAAA,OAAO,UAAU,MAAM,CAAA;AAAA,IACzB;AAAA,GACF;AACF;AAUA,eAAsB,iBAAA,CACpB,MAAA,EACA,UAAA,EACA,OAAA,GAAmD,EAAC,EACrC;AACf,EAAA,MAAM,EAAE,QAAA,GAAW,mBAAA,EAAqB,GAAG,SAAQ,GAAI,OAAA;AACvD,EAAA,MAAM,QAAA,GAAW,cAAA,CAAe,MAAA,EAAQ,OAAO,CAAA;AAC/C,EAAA,QAAA,CAAS,KAAA,EAAM;AACf,EAAA,MAAM,IAAI,OAAA,CAAc,CAAC,QAAQ,UAAA,CAAW,GAAA,EAAK,UAAU,CAAC,CAAA;AAC5D,EAAA,MAAM,OAAA,GAAU,MAAM,QAAA,CAAS,IAAA,EAAK;AAEpC,EAAA,MAAM,GAAA,GAAM,QAAQ,MAAA,KAAW,MAAA,GAAS,SAC5B,OAAA,CAAQ,MAAA,KAAW,iBAAiB,MAAA,GACpC,KAAA;AACZ,EAAA,MAAM,CAAA,GAAI,QAAA,CAAS,aAAA,CAAc,GAAG,CAAA;AACpC,EAAA,CAAA,CAAE,IAAA,GAAW,OAAA;AACb,EAAA,CAAA,CAAE,QAAA,GAAW,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA;AAC/B,EAAA,CAAA,CAAE,KAAA,EAAM;AACV;;;AC5LA,IAAM,QAAA;AAAA;AAAA,EAAqB,CAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AA6M3B,IAAM,QAAA;AAAA;AAAA,EAAqB,CAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAwB3B,SAAS,aAAA,CAAc,EAAA,EAA4B,IAAA,EAAc,GAAA,EAA0B;AACzF,EAAA,MAAM,EAAA,GAAK,EAAA,CAAG,YAAA,CAAa,IAAI,CAAA;AAC/B,EAAA,EAAA,CAAG,YAAA,CAAa,IAAI,GAAG,CAAA;AACvB,EAAA,EAAA,CAAG,cAAc,EAAE,CAAA;AACnB,EAAA,IAAI,CAAC,EAAA,CAAG,kBAAA,CAAmB,EAAA,EAAI,EAAA,CAAG,cAAc,CAAA,EAAG;AACjD,IAAA,MAAM,IAAA,GAAO,EAAA,CAAG,gBAAA,CAAiB,EAAE,CAAA,IAAK,SAAA;AACxC,IAAA,EAAA,CAAG,aAAa,EAAE,CAAA;AAClB,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,sBAAA,EAAyB,IAAI,CAAA,CAAE,CAAA;AAAA,EACjD;AACA,EAAA,OAAO,EAAA;AACT;AAEA,SAAS,WAAA,CAAY,EAAA,EAA4B,IAAA,EAAmB,IAAA,EAAiC;AACnG,EAAA,MAAM,IAAA,GAAO,GAAG,aAAA,EAAc;AAC9B,EAAA,EAAA,CAAG,YAAA,CAAa,MAAM,IAAI,CAAA;AAC1B,EAAA,EAAA,CAAG,YAAA,CAAa,MAAM,IAAI,CAAA;AAC1B,EAAA,EAAA,CAAG,YAAY,IAAI,CAAA;AACnB,EAAA,IAAI,CAAC,EAAA,CAAG,mBAAA,CAAoB,IAAA,EAAM,EAAA,CAAG,WAAW,CAAA,EAAG;AACjD,IAAA,MAAM,IAAA,GAAO,EAAA,CAAG,iBAAA,CAAkB,IAAI,CAAA,IAAK,SAAA;AAC3C,IAAA,EAAA,CAAG,cAAc,IAAI,CAAA;AACrB,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,oBAAA,EAAuB,IAAI,CAAA,CAAE,CAAA;AAAA,EAC/C;AACA,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,WAAA,CAAY,EAAA,EAA4B,MAAA,GAAiB,EAAA,CAAG,OAAA,EAAuB;AAC1F,EAAA,MAAM,CAAA,GAAI,GAAG,aAAA,EAAc;AAC3B,EAAA,EAAA,CAAG,WAAA,CAAY,EAAA,CAAG,UAAA,EAAY,CAAC,CAAA;AAC/B,EAAA,EAAA,CAAG,aAAA,CAAc,EAAA,CAAG,UAAA,EAAY,EAAA,CAAG,oBAAoB,MAAM,CAAA;AAC7D,EAAA,EAAA,CAAG,aAAA,CAAc,EAAA,CAAG,UAAA,EAAY,EAAA,CAAG,oBAAoB,MAAM,CAAA;AAC7D,EAAA,EAAA,CAAG,cAAc,EAAA,CAAG,UAAA,EAAY,EAAA,CAAG,cAAA,EAAgB,GAAG,aAAa,CAAA;AACnE,EAAA,EAAA,CAAG,cAAc,EAAA,CAAG,UAAA,EAAY,EAAA,CAAG,cAAA,EAAgB,GAAG,aAAa,CAAA;AACnE,EAAA,OAAO,CAAA;AACT;AAGA,IAAM,cAAgB,CAAC,MAAA,EAAO,MAAA,EAAO,OAAA,EAAQ,QAAO,SAAA,EAAU,SAAA,EAAU,QAAA,EAAS,QAAA,EAAS,cAAa,SAAA,EAAU,WAAA,EAAY,QAAA,EAAS,MAAA,EAAO,SAAQ,UAAU,CAAA;AAC/J,IAAM,aAAA,GAAgB,CAAC,WAAA,EAAY,SAAA,EAAU,SAAQ,MAAA,EAAO,YAAA,EAAa,SAAA,EAAU,SAAA,EAAU,OAAO,CAAA;AACpG,IAAM,WAAA,GAAgB,CAAC,WAAA,EAAY,WAAA,EAAY,UAAS,QAAQ,CAAA;AASzD,SAAS,uBAAuB,MAAA,EAAiD;AACtF,EAAA,MAAM,QAAA,GAAW,MAAA,CAAO,UAAA,CAAW,QAAA,EAAU;AAAA,IAC3C,KAAA,EAAO,IAAA;AAAA,IACP,SAAA,EAAW,KAAA;AAAA,IACX,kBAAA,EAAoB,KAAA;AAAA,IACpB,qBAAA,EAAuB;AAAA,GACxB,CAAA;AAED,EAAA,IAAI,CAAC,UAAU,OAAO,IAAA;AACtB,EAAA,MAAM,EAAA,GAA6B,QAAA;AAEnC,EAAA,IAAI;AA2DF,IAAA,IAASC,UAAT,SACE,KAAA,EACA,SACA,QAAA,EACA,QAAA,EACA,MACA,QAAA,EACM;AACN,MAAA,MAAM,OAAO,KAAA,CAAM,MAAA;AACnB,MAAA,IAAI,SAAS,CAAA,EAAG;AAChB,MAAA,MAAM,IAAA,GAAO,KAAA,CAAM,CAAC,CAAA,CAAE,MAAA;AACtB,MAAA,IAAI,SAAS,CAAA,EAAG;AAEhB,MAAA,EAAA,CAAG,QAAA,CAAS,GAAG,CAAA,EAAG,EAAA,CAAG,OAAO,KAAA,EAAO,EAAA,CAAG,OAAO,MAAM,CAAA;AAGnD,MAAA,IAAI,eAAA,GAAkB,KAAA;AACtB,MAAA,MAAM,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,IAAQ,CAAC,CAAA,EAAG,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,IAAQ,CAAC,CAAA;AAC7D,MAAA,KAAA,EAAO,KAAA,IAAS,EAAA,GAAK,CAAA,EAAG,EAAA,GAAK,MAAM,EAAA,IAAM,EAAA;AACvC,QAAA,KAAA,IAAS,EAAA,GAAK,CAAA,EAAG,EAAA,GAAK,IAAA,EAAM,EAAA,IAAM,EAAA;AAChC,UAAA,IAAI,MAAM,EAAE,CAAA,CAAE,EAAE,CAAA,CAAE,IAAI,GAAA,EAAK;AAAE,YAAA,eAAA,GAAkB,IAAA;AAAM,YAAA,MAAM,KAAA;AAAA,UAAO;AACtE,MAAA,EAAA,CAAG,UAAA;AAAA,QAAW,kBAAkB,CAAA,GAAI,MAAA;AAAA,QACtB,kBAAkB,CAAA,GAAI,MAAA;AAAA,QACtB,kBAAkB,CAAA,GAAI,MAAA;AAAA,QACtB,kBAAkB,CAAA,GAAI;AAAA,OAAG;AACvC,MAAA,EAAA,CAAG,KAAA,CAAM,GAAG,gBAAgB,CAAA;AAG5B,MAAA,IAAI,IAAA,KAAS,QAAA,IAAY,IAAA,KAAS,QAAA,EAAU;AAC1C,QAAA,OAAA,GAAW,IAAI,UAAA,CAAW,IAAA,GAAO,IAAA,GAAO,CAAC,CAAA;AACzC,QAAA,QAAA,GAAW,IAAA;AACX,QAAA,QAAA,GAAW,IAAA;AACX,QAAA,aAAA,GAAgB,IAAA;AAAA,MAClB;AAGA,MAAA,IAAI,aAAA,EAAe;AACjB,QAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,EAAM,CAAA,EAAA,EAAK;AAC7B,UAAA,MAAM,GAAA,GAAM,MAAM,CAAC,CAAA;AACnB,UAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,EAAM,CAAA,EAAA,EAAK;AAC7B,YAAA,MAAM,IAAA,GAAO,IAAI,CAAC,CAAA;AAClB,YAAA,MAAM,CAAA,GAAA,CAAK,CAAA,GAAI,IAAA,GAAO,CAAA,IAAK,CAAA;AAC3B,YAAA,OAAA,CAAQ,CAAC,IAAQ,IAAA,CAAK,CAAA;AACtB,YAAA,OAAA,CAAQ,CAAA,GAAI,CAAC,CAAA,GAAI,IAAA,CAAK,CAAA;AACtB,YAAA,OAAA,CAAQ,CAAA,GAAI,CAAC,CAAA,GAAI,IAAA,CAAK,CAAA;AAEtB,YAAA,OAAA,CAAQ,CAAA,GAAI,CAAC,CAAA,GAAI,IAAA,CAAK,CAAA;AAAA,UACxB;AAAA,QACF;AACA,QAAA,EAAA,CAAG,aAAA,CAAc,GAAG,QAAQ,CAAA;AAC5B,QAAA,EAAA,CAAG,WAAA,CAAY,EAAA,CAAG,UAAA,EAAY,OAAO,CAAA;AACrC,QAAA,EAAA,CAAG,UAAA;AAAA,UAAW,EAAA,CAAG,UAAA;AAAA,UAAY,CAAA;AAAA,UAAG,EAAA,CAAG,IAAA;AAAA,UAAM,IAAA;AAAA,UAAM,IAAA;AAAA,UAAM,CAAA;AAAA,UACvC,EAAA,CAAG,IAAA;AAAA,UAAM,EAAA,CAAG,aAAA;AAAA,UAAe;AAAA,SAAO;AAChD,QAAA,aAAA,GAAgB,KAAA;AAAA,MAClB;AAEA,MAAA,EAAA,CAAG,aAAA,CAAc,GAAG,QAAQ,CAAA;AAC5B,MAAA,EAAA,CAAG,WAAA,CAAY,EAAA,CAAG,UAAA,EAAY,OAAO,CAAA;AAErC,MAAA,EAAA,CAAG,WAAW,IAAI,CAAA;AAClB,MAAA,EAAA,CAAG,gBAAgB,GAAG,CAAA;AAEtB,MAAA,MAAM,QAAQ,QAAA,GAAW,IAAA;AACzB,MAAA,MAAM,QAAQ,QAAA,GAAW,IAAA;AAEzB,MAAA,EAAA,CAAG,SAAA,CAAU,CAAA,CAAE,UAAA,EAAa,QAAA,EAAU,QAAQ,CAAA;AAC9C,MAAA,EAAA,CAAG,SAAA,CAAU,CAAA,CAAE,QAAA,EAAa,IAAA,EAAU,IAAI,CAAA;AAC1C,MAAA,EAAA,CAAG,SAAA,CAAU,CAAA,CAAE,QAAA,EAAa,KAAA,EAAU,KAAK,CAAA;AAC3C,MAAA,EAAA,CAAG,SAAA,CAAU,CAAA,CAAE,IAAA,EAAa,IAAI,CAAA;AAChC,MAAA,EAAA,CAAG,SAAA,CAAU,CAAA,CAAE,SAAA,EAAa,OAAA,CAAQ,cAAc,CAAA;AAClD,MAAA,EAAA,CAAG,UAAU,CAAA,CAAE,SAAA,EAAa,YAAY,OAAA,CAAQ,OAAA,CAAQ,cAAc,CAAC,CAAA;AACvE,MAAA,EAAA,CAAG,UAAU,CAAA,CAAE,SAAA,EAAa,YAAY,OAAA,CAAQ,OAAA,CAAQ,SAAS,CAAC,CAAA;AAElE,MAAA,MAAM,SAAS,OAAA,CAAQ,WAAA,IAAe,SAAA,EAAW,OAAA,CAAQ,KAAK,EAAE,CAAA;AAChE,MAAA,EAAA,CAAG,SAAA;AAAA,QAAU,CAAA,CAAE,WAAA;AAAA,QACb,SAAS,KAAA,CAAM,KAAA,CAAM,GAAG,CAAC,CAAA,EAAG,EAAE,CAAA,GAAI,GAAA;AAAA,QAClC,SAAS,KAAA,CAAM,KAAA,CAAM,GAAG,CAAC,CAAA,EAAG,EAAE,CAAA,GAAI,GAAA;AAAA,QAClC,SAAS,KAAA,CAAM,KAAA,CAAM,GAAG,CAAC,CAAA,EAAG,EAAE,CAAA,GAAI;AAAA,OAAG;AACvC,MAAA,EAAA,CAAG,UAAU,CAAA,CAAE,MAAA,EAAQ,OAAA,CAAQ,MAAA,GAAS,IAAI,CAAC,CAAA;AAE7C,MAAA,MAAM,aAAgB,IAAA,GAAO,IAAA;AAC7B,MAAA,MAAM,UAAA,GAAgB,QAAQ,cAAA,KAAmB,MAAA;AACjD,MAAA,MAAM,aAAA,GAAgB,cAAc,UAAA,GAAa,GAAA;AACjD,MAAA,MAAM,cAAgB,CAAC,aAAA,IAAiB,CAAC,CAAC,QAAA,IAAY,QAAQ,aAAA,GAAgB,CAAA;AAC9E,MAAA,MAAM,WAAA,GAAgB,aAAa,GAAA,GAAS,IAAA,GACtB,aAAa,IAAA,GAAS,GAAA,GACtB,UAAA,GAAa,GAAA,GAAS,GAAA,GAAM,CAAA;AAElD,MAAA,EAAA,CAAG,UAAU,CAAA,CAAE,aAAA,EAAgB,WAAA,GAAc,OAAA,CAAQ,gBAAgB,CAAC,CAAA;AACtE,MAAA,EAAA,CAAG,UAAU,CAAA,CAAE,cAAA,EAAgB,cAAe,QAAA,EAAU,SAAA,IAAa,IAAK,CAAC,CAAA;AAC3E,MAAA,EAAA,CAAG,SAAA,CAAU,EAAE,QAAA,EAAgB,QAAA,EAAU,KAAK,GAAA,EAAK,QAAA,EAAU,KAAK,GAAG,CAAA;AACrE,MAAA,EAAA,CAAG,SAAA,CAAU,CAAA,CAAE,WAAA,EAAgB,OAAA,CAAQ,cAAc,WAAW,CAAA;AAChE,MAAA,EAAA,CAAG,UAAU,CAAA,CAAE,WAAA,EAAgB,cAAc,OAAA,CAAQ,OAAA,CAAQ,WAAW,CAAC,CAAA;AACzE,MAAA,MAAM,EAAA,GAAK,QAAQ,UAAA,IAAc,SAAA;AACjC,MAAA,EAAA,CAAG,SAAA;AAAA,QAAU,CAAA,CAAE,UAAA;AAAA,QACb,SAAS,EAAA,CAAG,KAAA,CAAM,GAAG,CAAC,CAAA,EAAG,EAAE,CAAA,GAAI,GAAA;AAAA,QAC/B,SAAS,EAAA,CAAG,KAAA,CAAM,GAAG,CAAC,CAAA,EAAG,EAAE,CAAA,GAAI,GAAA;AAAA,QAC/B,SAAS,EAAA,CAAG,KAAA,CAAM,GAAG,CAAC,CAAA,EAAG,EAAE,CAAA,GAAI;AAAA,OAAG;AAEpC,MAAA,EAAA,CAAG,UAAU,CAAA,CAAE,UAAA,EAAc,QAAQ,UAAA,KAAe,MAAA,GAAS,IAAI,CAAC,CAAA;AAClE,MAAA,EAAA,CAAG,SAAA,CAAU,CAAA,CAAE,YAAA,EAAc,OAAA,CAAQ,YAAY,CAAA;AACjD,MAAA,EAAA,CAAG,SAAA,CAAU,CAAA,CAAE,QAAA,EAAc,CAAC,CAAA;AAE9B,MAAA,EAAA,CAAG,oBAAoB,EAAA,CAAG,cAAA,EAAgB,CAAA,EAAG,CAAA,EAAG,OAAO,IAAI,CAAA;AAC3D,MAAA,EAAA,CAAG,gBAAgB,IAAI,CAAA;AAAA,IACzB,CAAA;AAzGS,IAAA,IAAA,MAAA,GAAAA,OAAAA;AAzDT,IAAA,MAAM,IAAA,GAAO,aAAA,CAAc,EAAA,EAAI,EAAA,CAAG,eAAe,QAAQ,CAAA;AACzD,IAAA,MAAM,IAAA,GAAO,aAAA,CAAc,EAAA,EAAI,EAAA,CAAG,iBAAiB,QAAQ,CAAA;AAC3D,IAAA,MAAM,IAAA,GAAO,WAAA,CAAY,EAAA,EAAI,IAAA,EAAM,IAAI,CAAA;AACvC,IAAA,EAAA,CAAG,aAAa,IAAI,CAAA;AACpB,IAAA,EAAA,CAAG,aAAa,IAAI,CAAA;AAGpB,IAAA,MAAM,GAAA,GAAM,GAAG,iBAAA,EAAkB;AACjC,IAAA,EAAA,CAAG,gBAAgB,GAAG,CAAA;AAEtB,IAAA,MAAM,OAAA,GAAU,IAAI,YAAA,CAAa,CAAC,CAAA,GAAA,EAAK,CAAA,GAAA,EAAM,GAAA,EAAI,CAAA,GAAA,EAAM,CAAA,GAAA,EAAK,GAAA,EAAK,GAAA,EAAI,GAAG,CAAC,CAAA;AACzE,IAAA,MAAM,GAAA,GAAM,GAAG,YAAA,EAAa;AAC5B,IAAA,EAAA,CAAG,UAAA,CAAW,EAAA,CAAG,YAAA,EAAc,GAAG,CAAA;AAClC,IAAA,EAAA,CAAG,UAAA,CAAW,EAAA,CAAG,YAAA,EAAc,OAAA,EAAS,GAAG,WAAW,CAAA;AAEtD,IAAA,MAAM,OAAA,GAAU,EAAA,CAAG,iBAAA,CAAkB,IAAA,EAAM,UAAU,CAAA;AACrD,IAAA,EAAA,CAAG,wBAAwB,OAAO,CAAA;AAClC,IAAA,EAAA,CAAG,oBAAoB,OAAA,EAAS,CAAA,EAAG,GAAG,KAAA,EAAO,KAAA,EAAO,GAAG,CAAC,CAAA;AAExD,IAAA,EAAA,CAAG,gBAAgB,IAAI,CAAA;AAGvB,IAAA,MAAM,OAAA,GAAU,YAAY,EAAE,CAAA;AAG9B,IAAA,MAAM,IAAI,CAAC,CAAA,KAAc,EAAA,CAAG,kBAAA,CAAmB,MAAM,CAAC,CAAA;AACtD,IAAA,MAAM,CAAA,GAAI;AAAA,MACR,UAAA,EAAe,EAAE,cAAc,CAAA;AAAA,MAC/B,QAAA,EAAe,EAAE,YAAY,CAAA;AAAA,MAC7B,QAAA,EAAe,EAAE,YAAY,CAAA;AAAA,MAC7B,IAAA,EAAe,EAAE,QAAQ,CAAA;AAAA,MACzB,SAAA,EAAe,EAAE,aAAa,CAAA;AAAA,MAC9B,SAAA,EAAe,EAAE,aAAa,CAAA;AAAA,MAC9B,SAAA,EAAe,EAAE,aAAa,CAAA;AAAA,MAC9B,WAAA,EAAe,EAAE,eAAe,CAAA;AAAA,MAChC,MAAA,EAAe,EAAE,UAAU,CAAA;AAAA,MAC3B,aAAA,EAAe,EAAE,iBAAiB,CAAA;AAAA,MAClC,cAAA,EAAe,EAAE,kBAAkB,CAAA;AAAA,MACnC,QAAA,EAAe,EAAE,YAAY,CAAA;AAAA,MAC7B,WAAA,EAAe,EAAE,eAAe,CAAA;AAAA,MAChC,WAAA,EAAe,EAAE,eAAe,CAAA;AAAA,MAChC,UAAA,EAAe,EAAE,cAAc,CAAA;AAAA,MAC/B,UAAA,EAAe,EAAE,cAAc,CAAA;AAAA,MAC/B,YAAA,EAAe,EAAE,gBAAgB,CAAA;AAAA,MACjC,QAAA,EAAe,EAAE,WAAW;AAAA,KAC9B;AAGA,IAAA,IAAI,QAAA,GAAgB,CAAA;AACpB,IAAA,IAAI,QAAA,GAAgB,CAAA;AACpB,IAAA,IAAI,OAAA,GAAgB,IAAI,UAAA,CAAW,CAAC,CAAA;AACpC,IAAA,IAAI,aAAA,GAAgB,IAAA;AAEpB,IAAA,EAAA,CAAG,MAAA,CAAO,GAAG,KAAK,CAAA;AAClB,IAAA,EAAA,CAAG,SAAA,CAAU,EAAA,CAAG,SAAA,EAAW,EAAA,CAAG,mBAAmB,CAAA;AA8GjD,IAAA,OAAO;AAAA,MACL,MAAA,EAAAA,OAAAA;AAAA,MACA,WAAA,GAAc;AAAE,QAAA,aAAA,GAAgB,IAAA;AAAA,MAAM,CAAA;AAAA,MACtC,OAAA,GAAU;AACR,QAAA,EAAA,CAAG,cAAc,IAAI,CAAA;AACrB,QAAA,EAAA,CAAG,kBAAkB,GAAG,CAAA;AACxB,QAAA,EAAA,CAAG,aAAa,GAAG,CAAA;AACnB,QAAA,EAAA,CAAG,cAAc,OAAO,CAAA;AAAA,MAC1B;AAAA,KACF;AAAA,EAEF,SAAS,GAAA,EAAK;AACZ,IAAA,OAAA,CAAQ,KAAA,CAAM,2DAA2D,GAAG,CAAA;AAC5E,IAAA,MAAM,IAAA,GAAsB;AAAA,MAC1B,MAAA,GAAS;AACP,QAAA,IAAI;AAAE,UAAA,EAAA,CAAG,UAAA,CAAW,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,CAAC,CAAA;AAAG,UAAA,EAAA,CAAG,KAAA,CAAM,GAAG,gBAAgB,CAAA;AAAA,QAAG,CAAA,CAAA,MAAQ;AAAA,QAAQ;AAAA,MAC9F,CAAA;AAAA,MACA,WAAA,GAAc;AAAA,MAAC,CAAA;AAAA,MACf,OAAA,GAAU;AAAA,MAAC;AAAA,KACb;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AACF","file":"index.cjs","sourcesContent":["// ─── Asciify Types ────────────────────────────────────────────────\n\nexport type ColorMode = 'grayscale' | 'fullcolor' | 'matrix' | 'accent';\nexport type RenderMode = 'ascii' | 'dots';\nexport type AnimationStyle = 'none' | 'wave' | 'pulse' | 'rain' | 'breathe' | 'sparkle' | 'glitch' | 'spiral' | 'typewriter' | 'scatter' | 'waveField' | 'ripple' | 'melt' | 'orbit' | 'cellular';\nexport type ArtStyle = 'classic' | 'particles' | 'letters' | 'claudeCode' | 'art' | 'terminal' | 'box' | 'lines' | 'braille' | 'katakana' | 'musical' | 'emoji';\nexport type HoverEffect = 'spotlight' | 'magnify' | 'repel' | 'glow' | 'colorShift' | 'attract' | 'shatter' | 'trail';\nexport type HoverPreset = 'none' | 'subtle' | 'flashlight' | 'magnifier' | 'forceField' | 'neon' | 'fire' | 'ice' | 'gravity' | 'shatter' | 'ghost';\n\n/**\n * Named colour palette presets — pass as `colorMode` for themed rendering.\n * Applied as a post-process colour remap over the standard grayscale output.\n */\nexport type PaletteTheme = 'dracula' | 'monokai' | 'nord' | 'catppuccin' | 'solarized' | 'gruvbox';\n\nexport const PALETTE_THEMES: Record<PaletteTheme, { name: string; accent: string; bg: string; fg: string }> = {\n dracula: { name: 'Dracula', accent: '#bd93f9', bg: '#282a36', fg: '#f8f8f2' },\n monokai: { name: 'Monokai', accent: '#a6e22e', bg: '#272822', fg: '#f8f8f2' },\n nord: { name: 'Nord', accent: '#88c0d0', bg: '#2e3440', fg: '#eceff4' },\n catppuccin: { name: 'Catppuccin',accent: '#cba6f7', bg: '#1e1e2e', fg: '#cdd6f4' },\n solarized: { name: 'Solarized', accent: '#268bd2', bg: '#002b36', fg: '#839496' },\n gruvbox: { name: 'Gruvbox', accent: '#b8bb26', bg: '#282828', fg: '#ebdbb2' },\n};\nexport type SourceType = 'image' | 'video' | 'gif' | null;\n\nexport interface AsciiOptions {\n fontSize: number;\n charSpacing: number;\n brightness: number;\n contrast: number;\n charset: string;\n colorMode: ColorMode;\n accentColor: string;\n invert: boolean;\n renderMode: RenderMode;\n animationStyle: AnimationStyle;\n animationSpeed: number;\n dotSizeRatio: number;\n ditherStrength: number;\n hoverStrength: number;\n hoverRadius: number;\n hoverEffect: HoverEffect;\n hoverColor: string;\n artStyle: ArtStyle;\n customText: string;\n}\n\nexport interface AsciiCell {\n char: string;\n r: number;\n g: number;\n b: number;\n a: number;\n}\n\nexport type AsciiFrame = AsciiCell[][];\n\nexport interface AsciiResult {\n frames: AsciiFrame[];\n cols: number;\n rows: number;\n fps: number;\n}\n\nexport const CHARSETS = {\n standard: ' .:-=+*#%@',\n blocks: ' ░▒▓█',\n minimal: ' .:+',\n dense: ' .\\'`^\",:;Il!i><~+_-?][}{1)(|\\/tfjrxnuvczXYUJCLQ0OZmwqpdbkhao*#MW&8%B@$',\n binary: '01',\n dots: ' ⠁⠃⠇⡇⣇⣧⣷⣿',\n letters: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz',\n claudeCode: ' ╔╗╚╝║═╠╣╦╩╬░▒▓█│─┌┐└┘├┤┬┴┼',\n box: ' ▪◾◼■█',\n lines: ' ˗‐–—―━',\n braille: ' ⠁⠂⠃⠄⠅⠆⠇⠈⠉⠊⠋⠌⠍⠎⠏⠐⠑⠒⠓⠔⠕⠖⠗⠘⠙⠚⠛⠜⠝⠞⠟⠠⠡⠢⠣⠤⠥⠦⠧⠨⠩⠪⠫⠬⠭⠮⠯⠰⠱⠲⠳⠴⠵⠶⠷⠸⠹⠺⠻⠼⠽⠾⠿⡀⡁⡂⡃⡄⡅⡆⡇⣀⣁⣂⣃⣄⣅⣆⣇⣈⣉⣊⣋⣌⣍⣎⣏⣐⣑⣒⣓⣔⣕⣖⣗⣘⣙⣚⣛⣜⣝⣞⣟⣠⣡⣢⣣⣤⣥⣦⣧⣨⣩⣪⣫⣬⣭⣮⣯⣰⣱⣲⣳⣴⣵⣶⣷⣸⣹⣺⣻⣼⣽⣾⣿',\n katakana: ' ヲァィゥェォャュョッアイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワン',\n musical: ' ♩♪♫♬♭♮♯',\n emoji: ' ⬛🟫🟥🟧🟨🟩🟦🟪⬜',\n} as const;\n\nexport type CharsetKey = keyof typeof CHARSETS;\n\n/**\n * Art Style presets — each one sets render mode, charset, color mode, etc.\n */\nexport const ART_STYLE_PRESETS: Record<ArtStyle, Partial<AsciiOptions>> = {\n classic: {\n renderMode: 'ascii',\n charset: CHARSETS.standard,\n colorMode: 'grayscale',\n },\n particles: {\n renderMode: 'dots',\n colorMode: 'fullcolor',\n dotSizeRatio: 0.8,\n },\n letters: {\n renderMode: 'ascii',\n charset: CHARSETS.letters,\n colorMode: 'fullcolor',\n },\n claudeCode: {\n renderMode: 'ascii',\n charset: CHARSETS.claudeCode,\n colorMode: 'accent',\n accentColor: '#f97316',\n },\n art: {\n renderMode: 'ascii',\n charset: CHARSETS.dense,\n colorMode: 'fullcolor',\n },\n terminal: {\n renderMode: 'ascii',\n charset: CHARSETS.standard,\n colorMode: 'matrix',\n },\n box: {\n renderMode: 'ascii',\n charset: CHARSETS.box,\n colorMode: 'grayscale',\n },\n lines: {\n renderMode: 'ascii',\n charset: CHARSETS.lines,\n colorMode: 'fullcolor',\n },\n braille: {\n renderMode: 'ascii',\n charset: CHARSETS.braille,\n colorMode: 'fullcolor',\n },\n katakana: {\n renderMode: 'ascii',\n charset: CHARSETS.katakana,\n colorMode: 'matrix',\n },\n musical: {\n renderMode: 'ascii',\n charset: CHARSETS.musical,\n colorMode: 'accent',\n accentColor: '#e040fb',\n },\n emoji: {\n renderMode: 'ascii',\n charset: CHARSETS.emoji,\n colorMode: 'fullcolor',\n },\n};\n\nexport const DEFAULT_OPTIONS: AsciiOptions = {\n fontSize: 10,\n charSpacing: 1,\n brightness: 0,\n contrast: 0,\n charset: CHARSETS.standard,\n colorMode: 'grayscale',\n accentColor: '#d4ff00',\n invert: false,\n renderMode: 'ascii',\n animationStyle: 'none',\n animationSpeed: 1,\n dotSizeRatio: 0.8,\n ditherStrength: 0,\n hoverStrength: 0,\n hoverRadius: 0.2,\n hoverEffect: 'spotlight',\n hoverColor: '#ffffff',\n artStyle: 'classic',\n customText: '',\n};\n\n/**\n * Hover presets — one-click configurations for the hover system.\n */\nexport const HOVER_PRESETS: Record<HoverPreset, { label: string; options: Partial<AsciiOptions> }> = {\n none: {\n label: 'Off',\n options: { hoverStrength: 0, hoverEffect: 'spotlight', hoverRadius: 0.2, hoverColor: '#ffffff' },\n },\n subtle: {\n label: 'Subtle',\n options: { hoverStrength: 0.25, hoverEffect: 'glow', hoverRadius: 0.12, hoverColor: '#ffffff' },\n },\n flashlight: {\n label: 'Flashlight',\n options: { hoverStrength: 0.6, hoverEffect: 'spotlight', hoverRadius: 0.15, hoverColor: '#fffbe6' },\n },\n magnifier: {\n label: 'Magnifier',\n options: { hoverStrength: 0.7, hoverEffect: 'magnify', hoverRadius: 0.12, hoverColor: '#ffffff' },\n },\n forceField: {\n label: 'Force Field',\n options: { hoverStrength: 0.7, hoverEffect: 'repel', hoverRadius: 0.15, hoverColor: '#a0e8ff' },\n },\n neon: {\n label: 'Neon',\n options: { hoverStrength: 0.6, hoverEffect: 'colorShift', hoverRadius: 0.15, hoverColor: '#d946ef' },\n },\n fire: {\n label: 'Fire',\n options: { hoverStrength: 0.7, hoverEffect: 'spotlight', hoverRadius: 0.15, hoverColor: '#ff6b2b' },\n },\n ice: {\n label: 'Ice',\n options: { hoverStrength: 0.5, hoverEffect: 'glow', hoverRadius: 0.15, hoverColor: '#60d5f7' },\n },\n gravity: {\n label: 'Gravity',\n options: { hoverStrength: 0.7, hoverEffect: 'attract', hoverRadius: 0.18, hoverColor: '#a5d6ff' },\n },\n shatter: {\n label: 'Shatter',\n options: { hoverStrength: 0.8, hoverEffect: 'shatter', hoverRadius: 0.14, hoverColor: '#ff6090' },\n },\n ghost: {\n label: 'Ghost',\n options: { hoverStrength: 0.55, hoverEffect: 'trail', hoverRadius: 0.2, hoverColor: '#b39ddb' },\n },\n};\n","/**\n * Low-level canvas and color utilities shared across the entire engine.\n * No imports from other engine modules — pure logic.\n */\n\nimport type { AsciiCell } from '../types';\n\n// ─── Offscreen canvas ─────────────────────────────────────────────\n\nexport function createOffscreenCanvas(width: number, height: number): {\n canvas: HTMLCanvasElement | OffscreenCanvas;\n ctx: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D;\n} {\n const canvas = document.createElement('canvas');\n canvas.width = width;\n canvas.height = height;\n const ctx = canvas.getContext('2d', { willReadFrequently: true })!;\n return { canvas, ctx };\n}\n\n// ─── Luminance helpers ────────────────────────────────────────────\n\nexport function adjustLuminance(lum: number, brightness: number, contrast: number): number {\n let adjusted = lum + brightness * 255;\n const factor = (259 * (contrast * 255 + 255)) / (255 * (259 - contrast * 255));\n adjusted = factor * (adjusted - 128) + 128;\n return Math.max(0, Math.min(255, adjusted));\n}\n\nexport function luminanceToChar(lum: number, charset: string, invert: boolean): string {\n const normalized = invert ? 1 - lum / 255 : lum / 255;\n const chars = [...charset]; // Unicode-aware split (handles surrogate pairs / emoji)\n const index = Math.floor(normalized * (chars.length - 1));\n return chars[Math.max(0, Math.min(chars.length - 1, index))];\n}\n\nexport function customTextToChar(\n lum: number, text: string, x: number, y: number, cols: number, invert: boolean\n): string {\n const normalized = invert ? 1 - lum / 255 : lum / 255;\n if (normalized < 0.12) return ' ';\n const chars = [...text];\n const pos = y * cols + x;\n return chars[pos % chars.length];\n}\n\n// ─── Dithering ────────────────────────────────────────────────────\n\nconst BAYER_4X4 = [\n [ 0, 8, 2,10],\n [12, 4,14, 6],\n [ 3,11, 1, 9],\n [15, 7,13, 5],\n] as const;\n\nexport function applyDither(lum: number, x: number, y: number, strength: number): number {\n if (strength <= 0) return lum;\n const threshold = (BAYER_4X4[y % 4][x % 4] / 16 - 0.5) * strength * 128;\n return Math.max(0, Math.min(255, lum + threshold));\n}\n\n// ─── Pre-computed Color LUTs ──────────────────────────────────────\n\nexport const GRAY_LUT: string[] = new Array(256);\nexport const GREEN_LUT: string[] = new Array(256);\nfor (let _i = 0; _i < 256; _i++) {\n GRAY_LUT[_i] = `rgb(${_i},${_i},${_i})`;\n GREEN_LUT[_i] = `rgb(0,${_i},0)`;\n}\n\n// ─── Cell color resolution ────────────────────────────────────────\n\nexport function getCellColorStr(\n cell: AsciiCell, colorMode: string, acR: number, acG: number, acB: number\n): string {\n switch (colorMode) {\n case 'fullcolor':\n return `rgb(${cell.r},${cell.g},${cell.b})`;\n case 'matrix':\n return GREEN_LUT[(0.299 * cell.r + 0.587 * cell.g + 0.114 * cell.b) | 0];\n case 'accent': {\n const ab = (0.299 * cell.r + 0.587 * cell.g + 0.114 * cell.b) / 255;\n return `rgb(${(acR * ab) | 0},${(acG * ab) | 0},${(acB * ab) | 0})`;\n }\n default:\n return GRAY_LUT[(0.299 * cell.r + 0.587 * cell.g + 0.114 * cell.b) | 0];\n }\n}\n\nconst _colorRGB = [0, 0, 0];\nexport function getCellColorRGB(\n cell: AsciiCell, colorMode: string, acR: number, acG: number, acB: number\n): number[] {\n switch (colorMode) {\n case 'fullcolor':\n _colorRGB[0] = cell.r; _colorRGB[1] = cell.g; _colorRGB[2] = cell.b;\n break;\n case 'matrix': {\n const mb = (0.299 * cell.r + 0.587 * cell.g + 0.114 * cell.b) | 0;\n _colorRGB[0] = 0; _colorRGB[1] = mb; _colorRGB[2] = 0;\n break;\n }\n case 'accent': {\n const ab = (0.299 * cell.r + 0.587 * cell.g + 0.114 * cell.b) / 255;\n _colorRGB[0] = (acR * ab) | 0; _colorRGB[1] = (acG * ab) | 0; _colorRGB[2] = (acB * ab) | 0;\n break;\n }\n default: {\n const gray = (0.299 * cell.r + 0.587 * cell.g + 0.114 * cell.b) | 0;\n _colorRGB[0] = gray; _colorRGB[1] = gray; _colorRGB[2] = gray;\n break;\n }\n }\n return _colorRGB;\n}\n\n// ─── Glow sprite cache ────────────────────────────────────────────\n\nlet _glowCache: { canvas: HTMLCanvasElement; size: number; r: number; g: number; b: number } | null = null;\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nexport function getGlowSprite(radius: number, r: number, g: number, b: number): HTMLCanvasElement {\n const size = Math.ceil(radius / 4) * 4;\n if (_glowCache && _glowCache.size === size && _glowCache.r === r && _glowCache.g === g && _glowCache.b === b) {\n return _glowCache.canvas;\n }\n const dim = size * 2;\n const canvas = document.createElement('canvas');\n canvas.width = dim;\n canvas.height = dim;\n const gCtx = canvas.getContext('2d')!;\n const gradient = gCtx.createRadialGradient(size, size, 0, size, size, size);\n gradient.addColorStop(0, `rgba(${r},${g},${b},1)`);\n gradient.addColorStop(0.4, `rgba(${r},${g},${b},0.4)`);\n gradient.addColorStop(1, `rgba(${r},${g},${b},0)`);\n gCtx.fillStyle = gradient;\n gCtx.fillRect(0, 0, dim, dim);\n _glowCache = { canvas, size, r, g, b };\n return canvas;\n}\n","/**\n * Animation multiplier and hover effect computations.\n */\n\nimport type { AnimationStyle } from '../types';\nimport type { HoverEffect } from '../types';\n\nexport function smoothstep(t: number): number {\n return t * t * (3 - 2 * t);\n}\n\nexport function getAnimationMultiplier(\n x: number,\n y: number,\n cols: number,\n rows: number,\n time: number,\n style: AnimationStyle,\n speed: number\n): number {\n if (style === 'none') return 1;\n\n const t = time * speed;\n\n switch (style) {\n case 'wave': {\n const wave = Math.sin((x / cols) * Math.PI * 4 + t * 3) * 0.5 + 0.5;\n const wave2 = Math.sin((y / rows) * Math.PI * 3 + t * 2) * 0.5 + 0.5;\n return 0.3 + 0.7 * (wave * 0.6 + wave2 * 0.4);\n }\n case 'pulse': {\n const cx = cols / 2;\n const cy = rows / 2;\n const dist = Math.sqrt((x - cx) ** 2 + (y - cy) ** 2);\n const maxDist = Math.sqrt(cx ** 2 + cy ** 2);\n const ring = Math.sin(dist / maxDist * Math.PI * 6 - t * 4) * 0.5 + 0.5;\n return 0.2 + 0.8 * ring;\n }\n case 'rain': {\n const drop = Math.sin(y / rows * Math.PI * 8 - t * 5 + x * 0.3) * 0.5 + 0.5;\n const fade = Math.sin(x / cols * Math.PI * 2 + t) * 0.3 + 0.7;\n return 0.1 + 0.9 * drop * fade;\n }\n case 'breathe': {\n const breathe = Math.sin(t * 2) * 0.3 + 0.7;\n const subtle = Math.sin((x + y) * 0.1 + t) * 0.1;\n return Math.max(0.1, Math.min(1, breathe + subtle));\n }\n case 'sparkle': {\n const hash = Math.sin(x * 127.1 + y * 311.7 + Math.floor(t * 8) * 43758.5453) * 43758.5453;\n const sparkle = (hash - Math.floor(hash));\n return sparkle > 0.7 ? 1 : 0.15 + sparkle * 0.4;\n }\n case 'glitch': {\n const band = Math.floor(y / (rows * 0.05));\n const glitchHash = Math.sin(band * 43.23 + Math.floor(t * 6) * 17.89) * 43758.5453;\n const glitchVal = glitchHash - Math.floor(glitchHash);\n if (glitchVal > 0.85) {\n const flicker = Math.sin(t * 30 + band) * 0.5 + 0.5;\n return flicker < 0.3 ? 0 : flicker;\n }\n return 1;\n }\n case 'spiral': {\n const cx = cols / 2;\n const cy = rows / 2;\n const dx = x - cx;\n const dy = y - cy;\n const angle = Math.atan2(dy, dx);\n const dist = Math.sqrt(dx * dx + dy * dy);\n const maxDist = Math.sqrt(cx * cx + cy * cy);\n const spiral = Math.sin(angle * 3 + dist / maxDist * Math.PI * 8 - t * 3) * 0.5 + 0.5;\n return 0.15 + 0.85 * spiral;\n }\n case 'typewriter': {\n const totalCells = cols * rows;\n const cellIndex = y * cols + x;\n const progress = ((t * 0.5) % 1);\n const revealPoint = progress * totalCells * 1.3;\n const dist = cellIndex - revealPoint;\n if (dist > 0) return 0;\n const fade = Math.max(0, 1 + dist / (totalCells * 0.15));\n return Math.min(1, fade);\n }\n case 'scatter': {\n const scx = cols / 2;\n const scy = rows / 2;\n const sdx = x - scx;\n const sdy = y - scy;\n const sdist = Math.sqrt(sdx * sdx + sdy * sdy) / Math.sqrt(scx * scx + scy * scy);\n const phase = Math.sin(t * 1.5) * 0.5 + 0.5;\n const threshold = phase;\n if (sdist > threshold) {\n return Math.max(0, 1 - (sdist - threshold) * 3);\n }\n return 0.7 + 0.3 * Math.sin(sdist * 10 - t * 2);\n }\n case 'waveField':\n // waveField is handled as a full short-circuit in renderFrameToCanvas\n return 1;\n case 'ripple': {\n // Ripples emanate from the center outward over time.\n const cx2 = cols / 2;\n const cy2 = rows / 2;\n const dx2 = x - cx2;\n const dy2 = y - cy2;\n const dist2 = Math.sqrt(dx2 * dx2 + dy2 * dy2);\n const maxDist2 = Math.sqrt(cx2 * cx2 + cy2 * cy2);\n const ripple = Math.sin((dist2 / maxDist2) * Math.PI * 10 - t * 5) * 0.5 + 0.5;\n const fadeEdge = 1 - Math.min(1, dist2 / (maxDist2 * 1.1));\n return 0.1 + 0.9 * ripple * (0.4 + fadeEdge * 0.6);\n }\n case 'melt': {\n // Chars droop downward as if melting — lower rows lag behind.\n const lagPhase = (y / rows) * Math.PI;\n const drip = Math.sin(lagPhase - t * 1.8 + x * 0.15) * 0.5 + 0.5;\n const gravity = Math.max(0, (y / rows - 0.1)) / 0.9;\n return 0.05 + 0.95 * (drip * (1 - gravity * 0.6));\n }\n case 'orbit': {\n // Each cell rotates around the center at a speed proportional to radius.\n const ocx = cols / 2;\n const ocy = rows / 2;\n const odx = x - ocx;\n const ody = y - ocy;\n const oAngle = Math.atan2(ody, odx);\n const oDist = Math.sqrt(odx * odx + ody * ody) / Math.sqrt(ocx * ocx + ocy * ocy);\n const orbit = Math.sin(oAngle * 2 + oDist * 6 - t * 2.5) * 0.5 + 0.5;\n return 0.1 + 0.9 * orbit;\n }\n case 'cellular': {\n // Conway-ish: cell \"lives\" based on a hash of its neighbours at a quantised time.\n const tick = Math.floor(t * 4);\n const alive = (cx: number, cy: number): number => {\n const h = Math.sin(cx * 127.1 + cy * 311.7 + tick * 43758.5453) * 43758.5453;\n return h - Math.floor(h) > 0.38 ? 1 : 0;\n };\n const self = alive(x, y);\n const neighbours =\n alive(x - 1, y) + alive(x + 1, y) +\n alive(x, y - 1) + alive(x, y + 1) +\n alive(x - 1, y - 1) + alive(x + 1, y - 1) +\n alive(x - 1, y + 1) + alive(x + 1, y + 1);\n const nextAlive = self === 1\n ? (neighbours === 2 || neighbours === 3 ? 1 : 0)\n : (neighbours === 3 ? 1 : 0);\n return nextAlive === 1 ? 1 : 0.05;\n }\n default:\n return 1;\n }\n}\n\nconst _hoverResult = { scale: 1, offsetX: 0, offsetY: 0, glow: 0, colorBlend: 0, proximity: 0 };\n\nexport function computeHoverEffect(\n nx: number,\n ny: number,\n hoverX: number,\n hoverY: number,\n hoverIntensity: number,\n strength: number,\n cellW: number,\n cellH: number,\n effect: HoverEffect = 'spotlight',\n radiusFactor: number = 0.5\n): typeof _hoverResult {\n const dx = nx - hoverX;\n const dy = ny - hoverY;\n const distSq = dx * dx + dy * dy;\n\n const radius = (0.08 + radiusFactor * 0.35) + strength * 0.04;\n\n if (distSq >= radius * radius) {\n _hoverResult.scale = 1;\n _hoverResult.offsetX = 0;\n _hoverResult.offsetY = 0;\n _hoverResult.glow = 0;\n _hoverResult.colorBlend = 0;\n _hoverResult.proximity = 0;\n return _hoverResult;\n }\n\n const dist = Math.sqrt(distSq);\n const t = 1 - dist / radius;\n const eased = smoothstep(t) * hoverIntensity;\n\n let scale = 1;\n let offsetX = 0;\n let offsetY = 0;\n let glow = 0;\n let colorBlend = 0;\n\n switch (effect) {\n case 'spotlight': {\n scale = 1 + eased * strength * 1.8;\n const angle = Math.atan2(dy, dx);\n const pushForce = eased * eased * strength * 0.6;\n offsetX = Math.cos(angle) * pushForce * cellW;\n offsetY = Math.sin(angle) * pushForce * cellH;\n glow = eased * strength * 0.4;\n colorBlend = eased * eased * strength * 0.25;\n break;\n }\n case 'magnify':\n scale = 1 + eased * strength * 2.5;\n glow = eased * strength * 0.15;\n break;\n case 'repel': {\n scale = 1 + eased * strength * 0.3;\n const angle2 = Math.atan2(dy, dx);\n const push = eased * eased * strength * 1.2;\n offsetX = Math.cos(angle2) * push * cellW;\n offsetY = Math.sin(angle2) * push * cellH;\n break;\n }\n case 'glow':\n glow = eased * strength * 0.8;\n colorBlend = eased * strength * 0.4;\n break;\n case 'colorShift':\n scale = 1 + eased * strength * 0.4;\n glow = eased * strength * 0.2;\n colorBlend = eased * strength * 0.7;\n break;\n case 'attract': {\n // Inverse of repel — chars drift toward the cursor.\n const angle3 = Math.atan2(dy, dx);\n const pull = eased * eased * strength * 1.0;\n // Offset toward cursor (negative direction = toward)\n offsetX = -Math.cos(angle3) * pull * cellW;\n offsetY = -Math.sin(angle3) * pull * cellH;\n glow = eased * strength * 0.3;\n break;\n }\n case 'shatter': {\n // Chars scatter radially outward with jitter, then reform.\n const angle4 = Math.atan2(dy, dx);\n const jitter = Math.sin(dx * 43.7 + dy * 29.3) * 0.5;\n const scatter = eased * strength * 1.4 * (0.7 + jitter * 0.3);\n offsetX = Math.cos(angle4 + jitter) * scatter * cellW;\n offsetY = Math.sin(angle4 + jitter) * scatter * cellH;\n scale = Math.max(0.1, 1 - eased * strength * 0.6);\n glow = eased * strength * 0.25;\n break;\n }\n case 'trail': {\n // Leaves a fading colour ghost: increase colorBlend and glow strongly within radius.\n colorBlend = eased * strength * 0.9;\n glow = eased * strength * 0.6;\n scale = 1 + eased * strength * 0.15;\n break;\n }\n }\n\n _hoverResult.scale = scale;\n _hoverResult.offsetX = offsetX;\n _hoverResult.offsetY = offsetY;\n _hoverResult.glow = glow;\n _hoverResult.colorBlend = colorBlend;\n _hoverResult.proximity = eased;\n return _hoverResult;\n}\n","/**\n * Shared utilities for all background renderers:\n * - CSS color parser\n * - Value noise helpers (fade, lerp, hash2, vnoise, fbm)\n */\n\n// ─── Color parser ─────────────────────────────────────────────────\n\n/** Parse a hex or rgb CSS colour string into { r, g, b }. Returns null on failure. */\nexport function parseColor(c: string): { r: number; g: number; b: number } | null {\n const hex = c.match(/^#([0-9a-f]{3,8})$/i)?.[1];\n if (hex) {\n const h = hex.length <= 4\n ? hex.split('').map(x => parseInt(x + x, 16))\n : [parseInt(hex.slice(0,2),16), parseInt(hex.slice(2,4),16), parseInt(hex.slice(4,6),16)];\n return { r: h[0], g: h[1], b: h[2] };\n }\n const rgb = c.match(/rgba?\\(\\s*(\\d+)[,\\s]+(\\d+)[,\\s]+(\\d+)/i);\n if (rgb) return { r: +rgb[1], g: +rgb[2], b: +rgb[3] };\n return null;\n}\n\n// ─── Value-noise helpers ──────────────────────────────────────────\n\nexport function fade(t: number): number { return t * t * t * (t * (t * 6 - 15) + 10); }\nexport function lerp(a: number, b: number, t: number): number { return a + (b - a) * t; }\n\n/** Fast 2-D hash → pseudo-random gradient value between -1 and 1 */\nexport function hash2(ix: number, iy: number): number {\n let n = ix * 127 + iy * 311;\n n = ((n >> 13) ^ n);\n return ((n * (n * n * 15731 + 789221) + 1376312589) & 0x7fffffff) / 0x7fffffff;\n}\n\n/** Single octave value noise */\nexport function vnoise(x: number, y: number): number {\n const ix = Math.floor(x), iy = Math.floor(y);\n const fx = x - ix, fy = y - iy;\n const ux = fade(fx), uy = fade(fy);\n const v00 = hash2(ix, iy );\n const v10 = hash2(ix + 1, iy );\n const v01 = hash2(ix, iy + 1);\n const v11 = hash2(ix + 1, iy + 1);\n return lerp(lerp(v00, v10, ux), lerp(v01, v11, ux), uy); // -1..1\n}\n\n/** 3-octave FBM (fractal Brownian motion) */\nexport function fbm(x: number, y: number): number {\n return (\n vnoise(x, y ) * 0.500 +\n vnoise(x * 2.1, y * 2.1) * 0.250 +\n vnoise(x * 4.3, y * 4.3) * 0.125\n ) / 0.875;\n}\n","/**\n * renderWaveBackground — interactive ASCII wave field with vortex, sparkles,\n * breathe pulse, and cursor proximity spotlight.\n */\nimport { hash2, fbm } from './_shared';\n\nexport interface WaveBackgroundOptions {\n /** Font size in CSS pixels (default: 13) */\n fontSize?: number;\n /** Character aspect ratio width/height (default: 0.62) */\n charAspect?: number;\n /** Line height multiplier (default: 1.4) */\n lineHeightRatio?: number;\n /** Character set from dark→bright (default: ' .:-=+*#%@') */\n chars?: string;\n /** Base colour — use '{a}' as alpha placeholder */\n baseColor?: string;\n /** Accent colour applied near the cursor and on wave peaks (default: '#d4ff00') */\n accentColor?: string;\n /** Accent threshold: normalised intensity above which accent kicks in (default: 0.52) */\n accentThreshold?: number;\n /** How strongly the mouse influences local intensity (default: 0.55) */\n mouseInfluence?: number;\n /** Radial falloff for mouse influence (default: 2.8) */\n mouseFalloff?: number;\n /** Base wave animation speed (default: 1) */\n speed?: number;\n /** Enable vortex swirl effect around cursor (default: true) */\n vortex?: boolean;\n /** Enable sparkle / pop flicker (default: true) */\n sparkles?: boolean;\n /** Enable a slow global breathe pulse (default: true) */\n breathe?: boolean;\n /** Light mode: swap fill colours to dark-on-light (default: false) */\n lightMode?: boolean;\n}\n\nexport function renderWaveBackground(\n ctx: CanvasRenderingContext2D,\n width: number,\n height: number,\n time: number,\n mousePos: { x: number; y: number } = { x: 0.5, y: 0.5 },\n options: WaveBackgroundOptions = {},\n): void {\n const {\n fontSize = 13,\n charAspect = 0.62,\n lineHeightRatio = 1.4,\n chars = ' .:-=+*#%@',\n baseColor = null as string | null,\n accentColor = undefined as string | undefined,\n accentThreshold = 0.52,\n mouseInfluence = 0.55,\n mouseFalloff = 2.8,\n speed = 1,\n vortex = true,\n sparkles = true,\n breathe = true,\n lightMode = false,\n } = options;\n const resolvedAccent = accentColor ?? (lightMode ? '#6b8700' : '#d4ff00');\n\n const charW = fontSize * charAspect;\n const lineH = fontSize * lineHeightRatio;\n const cols = Math.ceil(width / charW);\n const rows = Math.ceil(height / lineH);\n const mx = mousePos.x;\n const my = mousePos.y;\n\n let acR = 212, acG = 255, acB = 0;\n {\n const hex = resolvedAccent.replace('#', '');\n if (hex.length === 6) {\n acR = parseInt(hex.slice(0, 2), 16);\n acG = parseInt(hex.slice(2, 4), 16);\n acB = parseInt(hex.slice(4, 6), 16);\n }\n }\n\n ctx.clearRect(0, 0, width, height);\n ctx.font = `${fontSize}px \"JetBrains Mono\", monospace`;\n ctx.textBaseline = 'top';\n\n const t = time * speed;\n const breatheAmp = breathe ? (Math.sin(t * 0.22) * 0.5 + 0.5) * 0.12 : 0;\n\n for (let row = 0; row < rows; row++) {\n for (let col = 0; col < cols; col++) {\n const nx = col / cols;\n const ny = row / rows;\n\n const w1 = Math.sin(col * 0.08 + row * 0.05 + t * 0.60) * 0.5 + 0.5;\n const w2 = Math.sin(col * 0.03 - row * 0.07 + t * 0.40) * 0.5 + 0.5;\n const w3 = Math.sin(col * 0.05 + row * 0.03 + t * 0.80) * 0.5 + 0.5;\n const sinePart = (w1 + w2 + w3) / 3;\n\n const noiseScale = 0.045;\n const noiseShift = t * 0.08;\n const noisePart = (fbm(col * noiseScale + noiseShift, row * noiseScale * 1.4 - noiseShift * 0.7) * 0.5 + 0.5);\n\n const driftFreq = 0.06;\n const driftPart = Math.sin((col + row * 0.65) * driftFreq + t * 1.1) * 0.5 + 0.5;\n\n const wavePart = sinePart * 0.45 + noisePart * 0.35 + driftPart * 0.20 + breatheAmp;\n\n const dxRaw = nx - mx;\n const dyRaw = ny - my;\n const distRaw = Math.sqrt(dxRaw * dxRaw + dyRaw * dyRaw);\n let vortexBump = 0;\n if (vortex && distRaw < 0.35) {\n const angle = Math.atan2(dyRaw, dxRaw);\n const swirl = Math.sin(angle * 4 + t * 2.2 - distRaw * 14);\n const falloff = Math.max(0, 1 - distRaw / 0.35);\n vortexBump = swirl * falloff * falloff * 0.22;\n }\n\n const proximity = Math.max(0, 1 - distRaw * mouseFalloff);\n const intensity = (\n wavePart * (1 - mouseInfluence) +\n (proximity + vortexBump * 0.5) * mouseInfluence\n ) + vortexBump * 0.15;\n const clamped = Math.min(1, Math.max(0, intensity));\n\n let finalIntensity = clamped;\n if (sparkles && clamped > 0.72) {\n const bucket = Math.floor(t * 8);\n const sparkleSeed = hash2(col * 7 + bucket * 3, row * 11 + bucket);\n if (sparkleSeed > 0.88) {\n finalIntensity = Math.min(1, clamped + (sparkleSeed - 0.88) * 4);\n }\n }\n\n const charIdx = Math.floor(finalIntensity * (chars.length - 1));\n if (chars[charIdx] === ' ') continue;\n\n const alpha = 0.015 + finalIntensity * 0.07;\n const isAccent = finalIntensity > accentThreshold;\n\n if (isAccent) {\n const accentAlpha = Math.min(lightMode ? 0.90 : 0.28, alpha * (lightMode ? 14 : 2.8));\n ctx.fillStyle = `rgba(${acR},${acG},${acB},${accentAlpha})`;\n } else if (baseColor) {\n ctx.fillStyle = baseColor.replace('{a}', String(alpha));\n } else if (lightMode) {\n ctx.fillStyle = `rgba(55,55,55,${alpha * 7})`;\n } else {\n ctx.fillStyle = `rgba(255,255,255,${alpha})`;\n }\n\n ctx.fillText(chars[charIdx], col * charW, row * lineH);\n }\n }\n}\n","/**\n * Core frame-to-canvas renderer and source-to-frame converters.\n */\n\nimport type { AsciiOptions, AsciiCell, AsciiFrame } from '../types';\nimport { DEFAULT_OPTIONS } from '../types';\nimport { parseGIF, decompressFrames } from 'gifuct-js';\nimport {\n createOffscreenCanvas,\n adjustLuminance,\n luminanceToChar,\n customTextToChar,\n applyDither,\n getCellColorStr,\n getCellColorRGB,\n} from './utils';\nimport { getAnimationMultiplier, computeHoverEffect } from './animation';\nimport { renderWaveBackground } from '../backgrounds/wave';\n\n// Re-export AsciiFrame for downstream consumers that import from this module\nexport type { AsciiFrame };\nvoid DEFAULT_OPTIONS; // keep import alive for tree-shaking hint\n\n/**\n * Convert an image element or canvas to a single ASCII frame.\n */\nexport function imageToAsciiFrame(\n source: HTMLImageElement | HTMLVideoElement | HTMLCanvasElement,\n options: AsciiOptions,\n targetWidth?: number,\n targetHeight?: number\n): { frame: AsciiFrame; cols: number; rows: number } {\n const srcWidth = source instanceof HTMLVideoElement ? source.videoWidth : source.width;\n const srcHeight = source instanceof HTMLVideoElement ? source.videoHeight : source.height;\n\n if (srcWidth === 0 || srcHeight === 0) {\n return { frame: [], cols: 0, rows: 0 };\n }\n\n const charAspect = 0.55;\n const cellW = options.fontSize * options.charSpacing;\n const cellH = options.fontSize / charAspect * options.charSpacing;\n\n const renderW = targetWidth || srcWidth;\n const renderH = targetHeight || srcHeight;\n const cols = Math.floor(renderW / cellW);\n const rows = Math.floor(renderH / cellH);\n\n if (cols <= 0 || rows <= 0) {\n return { frame: [], cols: 0, rows: 0 };\n }\n\n const { ctx } = createOffscreenCanvas(cols, rows);\n ctx.drawImage(source, 0, 0, cols, rows);\n const imageData = ctx.getImageData(0, 0, cols, rows);\n const pixels = imageData.data;\n\n const frame: AsciiFrame = [];\n\n for (let y = 0; y < rows; y++) {\n const row: AsciiCell[] = [];\n for (let x = 0; x < cols; x++) {\n const i = (y * cols + x) * 4;\n const r = pixels[i];\n const g = pixels[i + 1];\n const b = pixels[i + 2];\n const a = pixels[i + 3];\n\n const lum = 0.299 * r + 0.587 * g + 0.114 * b;\n const adjustedLum = adjustLuminance(lum, options.brightness, options.contrast);\n const ditheredLum = applyDither(adjustedLum, x, y, options.ditherStrength);\n const char = options.customText\n ? customTextToChar(ditheredLum, options.customText, x, y, cols, options.invert)\n : luminanceToChar(ditheredLum, options.charset, options.invert);\n\n row.push({ char, r, g, b, a });\n }\n frame.push(row);\n }\n\n return { frame, cols, rows };\n}\n\n/**\n * Extract frames from a video element for ASCII animation.\n */\nexport async function videoToAsciiFrames(\n video: HTMLVideoElement,\n options: AsciiOptions,\n targetWidth: number,\n targetHeight: number,\n targetFps: number = 12,\n maxDuration: number = 10,\n onProgress?: (progress: number) => void\n): Promise<{ frames: AsciiFrame[]; cols: number; rows: number; fps: number }> {\n const duration = Math.min(video.duration, maxDuration);\n const totalFrames = Math.ceil(duration * targetFps);\n const frames: AsciiFrame[] = [];\n let cols = 0;\n let rows = 0;\n\n for (let i = 0; i < totalFrames; i++) {\n const time = (i / targetFps);\n if (time > duration) break;\n\n video.currentTime = time;\n await new Promise<void>((resolve) => {\n const handler = () => {\n video.removeEventListener('seeked', handler);\n resolve();\n };\n video.addEventListener('seeked', handler);\n });\n\n const result = imageToAsciiFrame(video, options, targetWidth, targetHeight);\n frames.push(result.frame);\n cols = result.cols;\n rows = result.rows;\n\n onProgress?.((i + 1) / totalFrames);\n }\n\n return { frames, cols, rows, fps: targetFps };\n}\n\n/**\n * Extract frames from an animated GIF file buffer.\n */\nexport async function gifToAsciiFrames(\n buffer: ArrayBuffer,\n options: AsciiOptions,\n targetWidth: number,\n targetHeight: number,\n onProgress?: (progress: number) => void\n): Promise<{ frames: AsciiFrame[]; cols: number; rows: number; fps: number }> {\n const gif = parseGIF(buffer);\n const rawFrames = decompressFrames(gif, true);\n\n if (rawFrames.length === 0) {\n return { frames: [], cols: 0, rows: 0, fps: 10 };\n }\n\n const gifW = rawFrames[0].dims.width;\n const gifH = rawFrames[0].dims.height;\n const logicalW = gif.lsd?.width || gifW;\n const logicalH = gif.lsd?.height || gifH;\n\n const compCanvas = document.createElement('canvas');\n compCanvas.width = logicalW;\n compCanvas.height = logicalH;\n const compCtx = compCanvas.getContext('2d')!;\n\n const prevCanvas = document.createElement('canvas');\n prevCanvas.width = logicalW;\n prevCanvas.height = logicalH;\n const prevCtx = prevCanvas.getContext('2d')!;\n\n const frames: AsciiFrame[] = [];\n let cols = 0;\n let rows = 0;\n\n let totalDelay = 0;\n for (const f of rawFrames) { totalDelay += (f.delay || 100); }\n const avgDelay = totalDelay / rawFrames.length;\n const fps = Math.round(Math.min(30, Math.max(5, 1000 / avgDelay)));\n\n const maxFrames = Math.min(rawFrames.length, 300);\n\n for (let i = 0; i < maxFrames; i++) {\n const f = rawFrames[i];\n const { dims, patch, disposalType } = f;\n\n if (disposalType === 3) {\n prevCtx.clearRect(0, 0, logicalW, logicalH);\n prevCtx.drawImage(compCanvas, 0, 0);\n }\n\n const frameImageData = new ImageData(new Uint8ClampedArray(patch.buffer), dims.width, dims.height);\n const tempCanvas = document.createElement('canvas');\n tempCanvas.width = dims.width;\n tempCanvas.height = dims.height;\n const tempCtx = tempCanvas.getContext('2d')!;\n tempCtx.putImageData(frameImageData, 0, 0);\n\n compCtx.drawImage(tempCanvas, dims.left || 0, dims.top || 0);\n\n const result = imageToAsciiFrame(compCanvas, options, targetWidth, targetHeight);\n frames.push(result.frame);\n cols = result.cols;\n rows = result.rows;\n\n if (disposalType === 2) {\n compCtx.clearRect(dims.left || 0, dims.top || 0, dims.width, dims.height);\n } else if (disposalType === 3) {\n compCtx.clearRect(0, 0, logicalW, logicalH);\n compCtx.drawImage(prevCanvas, 0, 0);\n }\n\n onProgress?.((i + 1) / maxFrames);\n }\n\n return { frames, cols, rows, fps };\n}\n\n/**\n * Render an ASCII frame to a canvas context.\n * Supports both ASCII text mode and Dots mode.\n */\nexport function renderFrameToCanvas(\n ctx: CanvasRenderingContext2D,\n frame: AsciiFrame,\n options: AsciiOptions,\n canvasWidth: number,\n canvasHeight: number,\n time: number = 0,\n hoverPos?: { x: number; y: number; intensity?: number } | null\n) {\n // waveField short-circuit\n if (options.animationStyle === 'waveField') {\n const mouseNorm = hoverPos ? { x: hoverPos.x, y: hoverPos.y } : { x: 0.5, y: 0.5 };\n const acHexWF = (options.accentColor || '#d4ff00').replace('#', '');\n renderWaveBackground(ctx, canvasWidth, canvasHeight, time, mouseNorm, {\n accentColor: `#${acHexWF}`,\n accentThreshold: 0.52,\n mouseInfluence: options.hoverStrength > 0 ? Math.min(1, 0.3 + options.hoverStrength * 0.5) : 0.55,\n mouseFalloff: 2.8,\n speed: options.animationSpeed,\n vortex: options.hoverStrength > 0,\n sparkles: true,\n breathe: true,\n });\n return;\n }\n\n const rows = frame.length;\n if (rows === 0) return;\n const cols = frame[0].length;\n\n ctx.clearRect(0, 0, canvasWidth, canvasHeight);\n\n let hasTransparency = false;\n const sampleStepY = Math.max(1, rows >> 2);\n const sampleStepX = Math.max(1, cols >> 2);\n outer:\n for (let sampleY = 0; sampleY < rows; sampleY += sampleStepY) {\n const row = frame[sampleY];\n for (let sampleX = 0; sampleX < cols; sampleX += sampleStepX) {\n if (row[sampleX].a < 200) { hasTransparency = true; break outer; }\n }\n }\n\n if (!hasTransparency) {\n ctx.fillStyle = '#0a0a0a';\n ctx.fillRect(0, 0, canvasWidth, canvasHeight);\n }\n\n const cellW = canvasWidth / cols;\n const cellH = canvasHeight / rows;\n const totalCells = rows * cols;\n\n const hoverIntensity = hoverPos?.intensity ?? 1;\n const animationActive = options.animationStyle !== 'none';\n const suppressHover = animationActive && totalCells > 5_000;\n const hoverActive = !suppressHover && !!(hoverPos && options.hoverStrength > 0 && hoverIntensity > 0.005);\n\n const hc = options.hoverColor || '#ffffff';\n const hcR = parseInt(hc.slice(1, 3), 16) || 255;\n const hcG = parseInt(hc.slice(3, 5), 16) || 255;\n const hcB = parseInt(hc.slice(5, 7), 16) || 255;\n\n const acHex = (options.accentColor || '#ffffff').replace('#', '');\n const acR = parseInt(acHex.substring(0, 2), 16) || 255;\n const acG = parseInt(acHex.substring(2, 4), 16) || 255;\n const acB = parseInt(acHex.substring(4, 6), 16) || 255;\n\n const radiusScale = totalCells > 30_000 ? 0.25\n : totalCells > 15_000 ? 0.4\n : totalCells > 5_000 ? 0.6\n : 1;\n const effectiveHoverRadius = options.hoverRadius * radiusScale;\n\n let hoverMinCol = 0, hoverMaxCol = cols, hoverMinRow = 0, hoverMaxRow = rows;\n let hoverPosX = 0, hoverPosY = 0;\n if (hoverActive && hoverPos) {\n hoverPosX = hoverPos.x;\n hoverPosY = hoverPos.y;\n const hoverNormRadius = (0.08 + effectiveHoverRadius * 0.35) + options.hoverStrength * 0.04;\n hoverMinCol = Math.max(0, Math.floor((hoverPosX - hoverNormRadius) * cols) - 1);\n hoverMaxCol = Math.min(cols, Math.ceil((hoverPosX + hoverNormRadius) * cols) + 1);\n hoverMinRow = Math.max(0, Math.floor((hoverPosY - hoverNormRadius) * rows) - 1);\n hoverMaxRow = Math.min(rows, Math.ceil((hoverPosY + hoverNormRadius) * rows) + 1);\n }\n\n const animStyle = options.animationStyle;\n const animSpeed = options.animationSpeed;\n const noAnimation = animStyle === 'none';\n const hoverStrength = options.hoverStrength;\n const hoverEffect = options.hoverEffect;\n const hoverRadiusFactor = effectiveHoverRadius;\n const isInverted = options.invert;\n const colorMode = options.colorMode;\n const TWO_PI = Math.PI * 2;\n const invCols = 1 / cols;\n const invRows = 1 / rows;\n\n let lastFillStyle = '';\n let lastAlpha = -1;\n\n if (options.renderMode === 'dots') {\n const maxRadius = Math.min(cellW, cellH) * 0.5 * options.dotSizeRatio;\n\n for (let y = 0; y < rows; y++) {\n const rowData = frame[y];\n for (let x = 0; x < cols; x++) {\n const cell = rowData[x];\n if (cell.a < 10) continue;\n\n const lum = (0.299 * cell.r + 0.587 * cell.g + 0.114 * cell.b) * 0.00392156863;\n const intensity = isInverted ? 1 - lum : lum;\n if (intensity < 0.02) continue;\n\n const animMul = noAnimation ? 1\n : getAnimationMultiplier(x, y, cols, rows, time, animStyle, animSpeed);\n\n let hoverMul = 1;\n let hoverOffX = 0;\n let hoverOffY = 0;\n let hoverGlow = 0;\n let hoverBlend = 0;\n\n if (hoverActive && x >= hoverMinCol && x <= hoverMaxCol && y >= hoverMinRow && y <= hoverMaxRow) {\n const fx = computeHoverEffect(\n x * invCols, y * invRows, hoverPosX, hoverPosY, hoverIntensity,\n hoverStrength, cellW, cellH, hoverEffect, hoverRadiusFactor\n );\n hoverMul = fx.scale;\n hoverOffX = fx.offsetX;\n hoverOffY = fx.offsetY;\n hoverGlow = fx.glow;\n hoverBlend = fx.colorBlend;\n }\n\n const radius = maxRadius * intensity * animMul * hoverMul;\n if (radius < 0.3) continue;\n\n const px = x * cellW + cellW * 0.5 + hoverOffX;\n const py = y * cellH + cellH * 0.5 + hoverOffY;\n\n let color: string;\n if (hoverBlend > 0) {\n const rgb = getCellColorRGB(cell, colorMode, acR, acG, acB);\n const cr = Math.min(255, (rgb[0] + (hcR - rgb[0]) * hoverBlend) | 0);\n const cg = Math.min(255, (rgb[1] + (hcG - rgb[1]) * hoverBlend) | 0);\n const cb = Math.min(255, (rgb[2] + (hcB - rgb[2]) * hoverBlend) | 0);\n color = `rgb(${cr},${cg},${cb})`;\n } else {\n color = getCellColorStr(cell, colorMode, acR, acG, acB);\n }\n\n const alpha = Math.min(1, (cell.a * 0.00392156863) * animMul * (1 + hoverGlow));\n\n if (alpha !== lastAlpha) { ctx.globalAlpha = alpha; lastAlpha = alpha; }\n if (color !== lastFillStyle) { ctx.fillStyle = color; lastFillStyle = color; }\n\n if (radius <= 3) {\n const d = radius * 2;\n ctx.fillRect(px - radius, py - radius, d, d);\n } else {\n ctx.beginPath();\n ctx.arc(px, py, radius, 0, TWO_PI);\n ctx.fill();\n }\n }\n }\n } else {\n const charAspect = 0.55;\n const fontSize = Math.min(cellW / charAspect, cellH) * 0.9;\n const useFastRect = fontSize < 6;\n\n if (!useFastRect) {\n const isEmoji = options.artStyle === 'emoji';\n ctx.font = isEmoji\n ? `${fontSize}px \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Noto Color Emoji\", \"Twemoji Mozilla\", sans-serif`\n : `${fontSize}px \"JetBrains Mono\", monospace`;\n ctx.textAlign = 'center';\n ctx.textBaseline = 'middle';\n }\n\n let charWeights: Record<string, number> | null = null;\n if (useFastRect) {\n charWeights = {};\n const csChars = [...options.charset]; // Unicode-aware\n const csLen = csChars.length;\n for (let i = 0; i < csLen; i++) {\n charWeights[csChars[i]] = Math.max(0.1, (i + 0.3) / csLen);\n }\n }\n\n const baseTransform = !useFastRect ? ctx.getTransform() : null;\n\n for (let y = 0; y < rows; y++) {\n const rowData = frame[y];\n for (let x = 0; x < cols; x++) {\n const cell = rowData[x];\n if (cell.char === ' ' || cell.a < 10) continue;\n\n const animMul = noAnimation ? 1\n : getAnimationMultiplier(x, y, cols, rows, time, animStyle, animSpeed);\n if (animMul < 0.05) continue;\n\n let hoverScale = 1;\n let hoverOffX = 0;\n let hoverOffY = 0;\n let hoverGlow = 0;\n let hoverBlend = 0;\n\n if (hoverActive && x >= hoverMinCol && x <= hoverMaxCol && y >= hoverMinRow && y <= hoverMaxRow) {\n const fx = computeHoverEffect(\n x * invCols, y * invRows, hoverPosX, hoverPosY, hoverIntensity,\n hoverStrength, cellW, cellH, hoverEffect, hoverRadiusFactor\n );\n hoverScale = fx.scale;\n hoverOffX = fx.offsetX;\n hoverOffY = fx.offsetY;\n hoverGlow = fx.glow;\n hoverBlend = fx.colorBlend;\n }\n\n const px = x * cellW + cellW * 0.5 + hoverOffX;\n const py = y * cellH + cellH * 0.5 + hoverOffY;\n\n let color: string;\n if (hoverBlend > 0) {\n const rgb = getCellColorRGB(cell, colorMode, acR, acG, acB);\n const cr = Math.min(255, (rgb[0] + (hcR - rgb[0]) * hoverBlend) | 0);\n const cg = Math.min(255, (rgb[1] + (hcG - rgb[1]) * hoverBlend) | 0);\n const cb = Math.min(255, (rgb[2] + (hcB - rgb[2]) * hoverBlend) | 0);\n color = `rgb(${cr},${cg},${cb})`;\n } else {\n color = getCellColorStr(cell, colorMode, acR, acG, acB);\n }\n\n if (useFastRect) {\n const weight = charWeights![cell.char] ?? 0.5;\n const effAlpha = Math.min(1, (cell.a * 0.00392156863) * animMul * (1 + hoverGlow)) * weight;\n if (effAlpha < 0.02) continue;\n if (effAlpha !== lastAlpha) { ctx.globalAlpha = effAlpha; lastAlpha = effAlpha; }\n if (color !== lastFillStyle) { ctx.fillStyle = color; lastFillStyle = color; }\n const rw = cellW * hoverScale;\n const rh = cellH * hoverScale;\n ctx.fillRect(px - rw * 0.5, py - rh * 0.5, rw, rh);\n } else {\n const alpha = Math.min(1, (cell.a * 0.00392156863) * animMul * (1 + hoverGlow));\n if (alpha !== lastAlpha) { ctx.globalAlpha = alpha; lastAlpha = alpha; }\n if (color !== lastFillStyle) { ctx.fillStyle = color; lastFillStyle = color; }\n if (hoverScale !== 1) {\n ctx.translate(px, py);\n ctx.scale(hoverScale, hoverScale);\n ctx.fillText(cell.char, 0, 0);\n ctx.setTransform(baseTransform!);\n } else {\n ctx.fillText(cell.char, px, py);\n }\n }\n }\n }\n }\n\n ctx.globalAlpha = 1;\n}\n","/**\n * Embed code generation — serializes ASCII frames into self-contained\n * HTML snippets that replay via the CDN embed runtime.\n */\n\nimport type { AsciiOptions, AsciiFrame } from '../types';\n\nexport const EMBED_CDN_VERSION = '1.0.17';\n\n/** Compact frame serialiser.\n * fullcolor → 3 bytes/cell (r,g,b); otherwise 1 byte/cell (luma).\n * First byte is a stride marker so the runtime can auto-detect format.\n */\nfunction serializeFrame(frame: AsciiFrame, fullColor: boolean): string {\n const rows = frame.length;\n const cols = rows > 0 ? frame[0].length : 0;\n const stride = fullColor ? 3 : 1;\n const buf = new Uint8Array(1 + rows * cols * stride);\n buf[0] = stride;\n let i = 1;\n for (let y = 0; y < rows; y++) {\n for (let x = 0; x < cols; x++) {\n const cell = frame[y][x];\n if (fullColor) {\n buf[i++] = cell.r;\n buf[i++] = cell.g;\n buf[i++] = cell.b;\n } else {\n buf[i++] = Math.round(0.299 * cell.r + 0.587 * cell.g + 0.114 * cell.b);\n }\n }\n }\n let binary = '';\n for (let j = 0; j < buf.length; j++) binary += String.fromCharCode(buf[j]);\n return btoa(binary);\n}\n\nfunction buildEmbedOpts(\n options: AsciiOptions,\n rows: number,\n cols: number,\n width: number,\n height: number,\n fps?: number,\n animated?: boolean\n): string {\n const o: Record<string, unknown> = {\n r: rows, c: cols, w: width, h: height,\n cs: options.charset,\n cm: options.colorMode,\n as: options.animationStyle,\n sp: options.animationSpeed,\n inv: options.invert,\n hs: options.hoverStrength,\n hr: options.hoverRadius,\n he: options.hoverEffect,\n hc: options.hoverColor,\n dr: options.dotSizeRatio,\n dots: options.renderMode === 'dots',\n };\n if (options.colorMode === 'accent') o.ac = options.accentColor;\n if (fps !== undefined) o.fps = fps;\n if (animated) o.anim = true;\n return JSON.stringify(o);\n}\n\nconst CDN_SCRIPT = `<script src=\"https://cdn.jsdelivr.net/npm/asciify-engine@${EMBED_CDN_VERSION}/dist/embed.js\" async></` + `script>`;\n\n/**\n * Generate a static single-frame embed snippet.\n */\nexport function generateEmbedCode(\n frame: AsciiFrame,\n options: AsciiOptions,\n width: number,\n height: number\n): string {\n const rows = frame.length;\n if (rows === 0) return '';\n const cols = frame[0].length;\n const isFullColor = options.colorMode === 'fullcolor';\n const data = serializeFrame(frame, isFullColor);\n const id = `ar-${Math.random().toString(36).slice(2, 9)}`;\n const opts = buildEmbedOpts(options, rows, cols, width, height);\n\n return `<!-- Asciify Embed -->\n<canvas id=\"${id}\" data-asciify-opts='${opts}' width=\"${width}\" height=\"${height}\"></canvas>\n<script type=\"application/json\" id=\"${id}-d\">\"${data}\"</script>\n${CDN_SCRIPT}\n<!-- /Asciify Embed -->`;\n}\n\n/**\n * Generate an animated multi-frame embed snippet (GIF / video).\n */\nexport function generateAnimatedEmbedCode(\n frames: AsciiFrame[],\n options: AsciiOptions,\n fps: number,\n width: number,\n height: number\n): string {\n if (frames.length === 0) return '';\n const rows = frames[0].length;\n const cols = frames[0][0].length;\n const isFullColor = options.colorMode === 'fullcolor';\n const allData = frames.map(f => serializeFrame(f, isFullColor));\n const id = `ar-${Math.random().toString(36).slice(2, 9)}`;\n const opts = buildEmbedOpts(options, rows, cols, width, height, fps, true);\n\n return `<!-- Asciify Animated Embed -->\n<canvas id=\"${id}\" data-asciify-opts='${opts}' width=\"${width}\" height=\"${height}\"></canvas>\n<script type=\"application/json\" id=\"${id}-d\">${JSON.stringify(allData)}</script>\n${CDN_SCRIPT}\n<!-- /Asciify Animated Embed -->`;\n}\n","/**\n * Simple one-call asciify API.\n * Wraps imageToAsciiFrame + renderFrameToCanvas behind easy-to-use helpers.\n */\n\nimport type { AsciiOptions, ArtStyle } from '../types';\nimport { DEFAULT_OPTIONS, ART_STYLE_PRESETS } from '../types';\nimport { imageToAsciiFrame, videoToAsciiFrames, gifToAsciiFrames, renderFrameToCanvas } from './renderer';\n\nexport { videoToAsciiFrames, gifToAsciiFrames };\n\nexport interface AsciifySimpleOptions {\n /** Character size in pixels. Default: 10 */\n fontSize?: number;\n /** Art style preset. Default: 'classic' */\n style?: ArtStyle;\n /** Extra options to merge on top of the preset */\n options?: Partial<AsciiOptions>;\n}\n\n/**\n * Convert an image/video/canvas element to ASCII art and render it onto a canvas.\n *\n * @example\n * await asciify(document.querySelector('img'), canvas);\n * await asciify(img, canvas, { fontSize: 8, style: 'letters' });\n */\nexport async function asciify(\n source: HTMLImageElement | HTMLVideoElement | HTMLCanvasElement | string,\n canvas: HTMLCanvasElement,\n { fontSize = 10, style = 'classic', options = {} }: AsciifySimpleOptions = {}\n): Promise<void> {\n let el: HTMLImageElement | HTMLVideoElement | HTMLCanvasElement;\n if (typeof source === 'string') {\n const img = new Image();\n img.crossOrigin = 'anonymous';\n await new Promise<void>((resolve, reject) => {\n img.onload = () => resolve();\n img.onerror = () => reject(new Error(`Failed to load image: ${source}`));\n img.src = source;\n });\n el = img;\n } else if (source instanceof HTMLImageElement && !source.complete) {\n await new Promise<void>((resolve, reject) => {\n source.onload = () => resolve();\n source.onerror = () => reject(new Error('Image failed to load'));\n });\n el = source;\n } else {\n el = source;\n }\n\n const preset = ART_STYLE_PRESETS[style];\n const merged: AsciiOptions = { ...DEFAULT_OPTIONS, ...preset, ...options, fontSize };\n\n const ctx = canvas.getContext('2d');\n if (!ctx) throw new Error('Could not get 2d context from canvas');\n\n const { frame } = imageToAsciiFrame(el, merged, canvas.width, canvas.height);\n renderFrameToCanvas(ctx, frame, merged, canvas.width, canvas.height);\n}\n\n/**\n * Fetch a GIF, convert it to ASCII, and start an animation loop on a canvas.\n * Returns a `stop()` function that cancels the loop.\n *\n * @example\n * const stop = await asciifyGif('animation.gif', canvas);\n * // later: stop();\n */\nexport async function asciifyGif(\n source: string | ArrayBuffer,\n canvas: HTMLCanvasElement,\n { fontSize = 10, style = 'classic', options = {} }: AsciifySimpleOptions = {}\n): Promise<() => void> {\n const buffer = typeof source === 'string'\n ? await fetch(source).then(r => r.arrayBuffer())\n : source;\n\n const merged: AsciiOptions = { ...DEFAULT_OPTIONS, ...ART_STYLE_PRESETS[style], ...options, fontSize };\n const ctx = canvas.getContext('2d');\n if (!ctx) throw new Error('Could not get 2d context from canvas');\n\n const { frames, fps } = await gifToAsciiFrames(buffer, merged, canvas.width, canvas.height);\n\n let cancelled = false;\n let animId: number;\n let i = 0;\n let last = performance.now();\n const interval = 1000 / fps;\n\n const tick = (now: number) => {\n if (cancelled) return;\n if (now - last >= interval) {\n renderFrameToCanvas(ctx, frames[i], merged, canvas.width, canvas.height);\n i = (i + 1) % frames.length;\n last = now;\n }\n animId = requestAnimationFrame(tick);\n };\n animId = requestAnimationFrame(tick);\n\n return () => { cancelled = true; cancelAnimationFrame(animId); };\n}\n\n/**\n * Convert a video element to ASCII art and start an animation loop on a canvas.\n * Returns a `stop()` function that cancels the loop.\n *\n * @example\n * const stop = await asciifyVideo(video, canvas);\n * // later: stop();\n */\nexport async function asciifyVideo(\n source: HTMLVideoElement | string,\n canvas: HTMLCanvasElement,\n { fontSize = 10, style = 'classic', options = {} }: AsciifySimpleOptions = {}\n): Promise<() => void> {\n let video: HTMLVideoElement;\n if (typeof source === 'string') {\n video = document.createElement('video');\n video.crossOrigin = 'anonymous';\n video.src = source;\n await new Promise<void>((resolve, reject) => {\n video.onloadeddata = () => resolve();\n video.onerror = () => reject(new Error(`Failed to load video: ${source}`));\n });\n } else {\n video = source;\n }\n\n const merged: AsciiOptions = { ...DEFAULT_OPTIONS, ...ART_STYLE_PRESETS[style], ...options, fontSize };\n const ctx = canvas.getContext('2d');\n if (!ctx) throw new Error('Could not get 2d context from canvas');\n\n const { frames, fps } = await videoToAsciiFrames(video, merged, canvas.width, canvas.height);\n\n let cancelled = false;\n let animId: number;\n let i = 0;\n let last = performance.now();\n const interval = 1000 / fps;\n\n const tick = (now: number) => {\n if (cancelled) return;\n if (now - last >= interval) {\n renderFrameToCanvas(ctx, frames[i], merged, canvas.width, canvas.height);\n i = (i + 1) % frames.length;\n last = now;\n }\n animId = requestAnimationFrame(tick);\n };\n animId = requestAnimationFrame(tick);\n\n return () => { cancelled = true; cancelAnimationFrame(animId); };\n}\n","/**\n * renderRainBackground — digital column rain (Matrix-style).\n */\nimport { parseColor, hash2 } from './_shared';\n\nexport interface RainBackgroundOptions {\n fontSize?: number;\n /** Characters drawn in columns */\n chars?: string;\n /** Head / accent colour (default: '#d4ff00') */\n accentColor?: string;\n /** Custom character colour */\n color?: string;\n /** Global speed multiplier (default: 1) */\n speed?: number;\n /** Fraction of columns active at once 0-1 (default: 0.55) */\n density?: number;\n /** Number of cells in the fading tail (default: 14) */\n tailLength?: number;\n /** Light mode (default: false) */\n lightMode?: boolean;\n}\n\nexport function renderRainBackground(\n ctx: CanvasRenderingContext2D,\n width: number,\n height: number,\n time: number,\n options: RainBackgroundOptions = {},\n): void {\n const {\n fontSize = 13,\n chars = '0123456789ABCDEF@#$&*+=/<>',\n accentColor = undefined as string | undefined,\n color,\n speed = 1,\n density = 0.55,\n tailLength = 14,\n lightMode = false,\n } = options;\n const resolvedAccent = accentColor ?? (lightMode ? '#6b8700' : '#d4ff00');\n\n const charW = fontSize * 0.62;\n const lineH = fontSize * 1.4;\n const cols = Math.ceil(width / charW);\n const rows = Math.ceil(height / lineH);\n\n ctx.clearRect(0, 0, width, height);\n ctx.font = `${fontSize}px monospace`;\n ctx.textBaseline = 'top';\n\n let br = 255, bg = 255, bb = 255;\n if (lightMode) { br = 55; bg = 55; bb = 55; }\n if (color) {\n const p = parseColor(color);\n if (p) { br = p.r; bg = p.g; bb = p.b; }\n }\n\n let acR = 212, acG = 255, acB = 0;\n const ap = parseColor(resolvedAccent);\n if (ap) { acR = ap.r; acG = ap.g; acB = ap.b; }\n\n const period = rows + tailLength;\n\n for (let c = 0; c < cols; c++) {\n if (hash2(c * 17, 3) > density) continue;\n\n const colSpeed = (0.5 + hash2(c * 31, 7) * 1.5) * speed;\n const phase = hash2(c * 13, 11) * period;\n const headRow = Math.floor((time * colSpeed * 7 + phase) % period);\n const x = c * charW;\n\n for (let k = 0; k <= tailLength; k++) {\n const row = headRow - (tailLength - k);\n if (row < 0 || row >= rows) continue;\n\n const y = row * lineH;\n const charSeed = hash2(c * 53 + Math.floor(time * 5 + k), row * 7);\n const ch = chars[Math.floor(charSeed * chars.length)];\n const tRatio = k / tailLength;\n\n if (k === tailLength) {\n ctx.fillStyle = `rgba(${acR},${acG},${acB},${lightMode ? 0.70 : 0.85})`;\n } else {\n const alpha = lightMode ? tRatio * 0.85 : tRatio * 0.15;\n ctx.fillStyle = `rgba(${br},${bg},${bb},${alpha})`;\n }\n ctx.fillText(ch, x, y);\n }\n }\n}\n","/**\n * renderStarsBackground — 3-D star-warp / hyperspace ASCII effect.\n */\nimport { parseColor, hash2 } from './_shared';\n\nexport interface StarsBackgroundOptions {\n fontSize?: number;\n /** Characters used as stars */\n chars?: string;\n /** Accent/trail colour for fast near-edge stars (default: '#d4ff00') */\n accentColor?: string;\n /** Custom base colour */\n color?: string;\n /** Global speed multiplier (default: 1) */\n speed?: number;\n /** Number of star particles (default: 180) */\n count?: number;\n /** Light mode (default: false) */\n lightMode?: boolean;\n}\n\nexport function renderStarsBackground(\n ctx: CanvasRenderingContext2D,\n width: number,\n height: number,\n time: number,\n mousePos: { x: number; y: number } = { x: 0.5, y: 0.5 },\n options: StarsBackgroundOptions = {},\n): void {\n const {\n fontSize = 14,\n chars = ' . · * + ° ★',\n accentColor = undefined as string | undefined,\n color,\n speed = 1,\n count = 180,\n lightMode = false,\n } = options;\n const resolvedAccent = accentColor ?? (lightMode ? '#6b8700' : '#d4ff00');\n\n ctx.clearRect(0, 0, width, height);\n ctx.textBaseline = 'middle';\n ctx.textAlign = 'center';\n\n const cx = width * (0.2 + mousePos.x * 0.6);\n const cy = height * (0.2 + mousePos.y * 0.6);\n const maxR = Math.sqrt(width * width + height * height) * 0.65;\n\n let br = 255, bg = 255, bb = 255;\n if (lightMode) { br = 55; bg = 55; bb = 55; }\n if (color) { const p = parseColor(color); if (p) { br = p.r; bg = p.g; bb = p.b; } }\n\n let acR = 212, acG = 255, acB = 0;\n const ap = parseColor(resolvedAccent);\n if (ap) { acR = ap.r; acG = ap.g; acB = ap.b; }\n\n const charArr = chars.replace(/ /g,'').split('');\n if (charArr.length === 0) return;\n\n for (let i = 0; i < count; i++) {\n const angle = hash2(i * 17, 3) * Math.PI * 2;\n const baseSpd = 0.15 + hash2(i * 31, 7) * 0.85;\n const phase = hash2(i * 13, 11);\n\n const r = ((time * baseSpd * speed * 0.22 + phase) % 1.0);\n\n const x = cx + Math.cos(angle) * r * maxR;\n const y = cy + Math.sin(angle) * r * maxR;\n\n if (x < -20 || x > width + 20 || y < -20 || y > height + 20) continue;\n\n const sz = Math.max(6, fontSize * (0.4 + r * 0.9));\n ctx.font = `${sz}px monospace`;\n\n const charIdx = Math.min(charArr.length - 1, Math.floor(r * charArr.length));\n const ch = charArr[charIdx];\n const isAccent = r > 0.72;\n const alpha = lightMode ? r * 0.85 : r * 0.20;\n\n ctx.fillStyle = isAccent\n ? `rgba(${acR},${acG},${acB},${Math.min(lightMode ? 0.92 : 0.32, alpha * 2.2)})`\n : `rgba(${br},${bg},${bb},${alpha})`;\n\n ctx.fillText(ch, x, y);\n }\n\n ctx.textAlign = 'left';\n}\n","/**\n * renderPulseBackground — concentric ASCII ring pulses emanating from the cursor.\n */\nimport { parseColor } from './_shared';\n\nexport interface PulseBackgroundOptions {\n fontSize?: number;\n /** Characters to tile (default: '. · ○ ◎ ●') */\n chars?: string;\n /** Ring peak colour (default: '#00ffcc') */\n accentColor?: string;\n /** Custom base colour */\n color?: string;\n /** Number of simultaneous rings (default: 5) */\n rings?: number;\n /** Animation speed (default: 1) */\n speed?: number;\n /** Ring edge sharpness 1–10 (default: 4) */\n sharpness?: number;\n /** Light mode (default: false) */\n lightMode?: boolean;\n}\n\nexport function renderPulseBackground(\n ctx: CanvasRenderingContext2D,\n width: number,\n height: number,\n time: number,\n mousePos: { x: number; y: number } = { x: 0.5, y: 0.5 },\n options: PulseBackgroundOptions = {},\n): void {\n const {\n fontSize = 14,\n chars = '. · ○ ◎ ●',\n accentColor = undefined as string | undefined,\n color,\n rings = 5,\n speed = 1,\n sharpness = 4,\n lightMode = false,\n } = options;\n const resolvedAccent = accentColor ?? (lightMode ? '#007a5e' : '#00ffcc');\n\n ctx.clearRect(0, 0, width, height);\n ctx.textBaseline = 'middle';\n ctx.textAlign = 'center';\n\n const cx = width * mousePos.x;\n const cy = height * mousePos.y;\n const maxDist = Math.sqrt(cx * cx + cy * cy) * 1.6 + Math.sqrt(width * width + height * height) * 0.2;\n\n let br = 255, bg = 255, bb = 255;\n if (lightMode) { br = 55; bg = 55; bb = 55; }\n if (color) { const p = parseColor(color); if (p) { br = p.r; bg = p.g; bb = p.b; } }\n\n let acR = 0, acG = 255, acB = 204;\n const ap = parseColor(resolvedAccent);\n if (ap) { acR = ap.r; acG = ap.g; acB = ap.b; }\n\n const charArr = chars.replace(/ /g,'').split('');\n if (charArr.length === 0) return;\n\n const cols = Math.ceil(width / fontSize);\n const rows = Math.ceil(height / fontSize);\n\n for (let row = 0; row < rows; row++) {\n for (let col = 0; col < cols; col++) {\n const px = col * fontSize + fontSize * 0.5;\n const py = row * fontSize + fontSize * 0.5;\n const dx = px - cx;\n const dy = py - cy;\n const dist = Math.sqrt(dx * dx + dy * dy);\n const norm = dist / maxDist; // 0..1+\n\n let totalIntensity = 0;\n for (let r = 0; r < rings; r++) {\n const phase = r / rings;\n const t = ((time * speed * 0.38 + phase) % 1.0);\n const ringDist = Math.abs(norm - t);\n const ringNorm = Math.max(0, 1 - ringDist * maxDist / (fontSize * (12 - sharpness)));\n totalIntensity += Math.cos(ringNorm * Math.PI * 0.5) * ringNorm;\n }\n totalIntensity = Math.min(1, totalIntensity);\n\n if (totalIntensity < 0.02) continue;\n\n const isAccent = totalIntensity > 0.6;\n ctx.font = `${fontSize}px monospace`;\n const charIdx = Math.floor(totalIntensity * (charArr.length - 1));\n const ch = charArr[Math.min(charIdx, charArr.length - 1)];\n const alpha = lightMode ? totalIntensity * 0.88 : totalIntensity * 0.22;\n\n ctx.fillStyle = isAccent\n ? `rgba(${acR},${acG},${acB},${Math.min(lightMode ? 0.95 : 0.4, totalIntensity * 0.55)})`\n : `rgba(${br},${bg},${bb},${alpha})`;\n\n ctx.fillText(ch, px, py);\n }\n }\n\n ctx.textAlign = 'left';\n}\n","/**\n * renderNoiseBackground — slow-drifting organic fractal noise field.\n * No directional pattern — pure ambient texture. Mouse warps the field.\n */\nimport { parseColor, vnoise } from './_shared';\n\nexport interface NoiseBackgroundOptions {\n /** Font size in CSS pixels (default: 14). */\n fontSize?: number;\n /** Character ramp dark → bright (default: ' .·:;=+*#%@░▒▓'). */\n chars?: string;\n /** Accent colour on intensity peaks (default: '#d4ff00'). */\n accentColor?: string;\n /** Custom base character colour (any CSS colour string). */\n color?: string;\n /** Number of noise octaves for FBM detail (default: 4, max: 6). */\n octaves?: number;\n /** Drift / scroll speed (default: 1). */\n speed?: number;\n /** Noise scale — lower = larger blobs (default: 1). */\n scale?: number;\n /** Accent threshold 0-1 (default: 0.78). */\n accentThreshold?: number;\n /** Mouse warp radius 0-1 (default: 0.3). */\n mouseWarp?: number;\n /** Light mode (default: false). */\n lightMode?: boolean;\n}\n\nexport function renderNoiseBackground(\n ctx: CanvasRenderingContext2D,\n width: number,\n height: number,\n time: number,\n mousePos: { x: number; y: number } = { x: 0.5, y: 0.5 },\n options: NoiseBackgroundOptions = {},\n): void {\n const {\n fontSize = 14,\n chars = ' .·:;=+*#%@░▒▓',\n accentColor = undefined as string | undefined,\n color,\n octaves = 4,\n speed = 1,\n scale = 1,\n accentThreshold = 0.78,\n mouseWarp = 0.3,\n lightMode = false,\n } = options;\n const resolvedAccent = accentColor ?? (lightMode ? '#6b8700' : '#d4ff00');\n\n const charW = fontSize * 0.62;\n const lineH = fontSize * 1.4;\n const cols = Math.ceil(width / charW);\n const rows = Math.ceil(height / lineH);\n\n ctx.clearRect(0, 0, width, height);\n ctx.font = `${fontSize}px monospace`;\n ctx.textBaseline = 'top';\n\n let br = 255, bgc = 255, bb = 255;\n if (lightMode) { br = 55; bgc = 55; bb = 55; }\n if (color) { const p = parseColor(color); if (p) { br = p.r; bgc = p.g; bb = p.b; } }\n let acR = 212, acG = 255, acB = 0;\n const ap = parseColor(resolvedAccent); if (ap) { acR = ap.r; acG = ap.g; acB = ap.b; }\n\n const noiseScale = 0.035 * scale;\n const t = time * speed;\n const oct = Math.min(6, Math.max(1, octaves));\n\n // FBM with configurable octaves\n const fbmN = (x: number, y: number): number => {\n let v = 0, amp = 0.5, freq = 1, norm = 0;\n for (let o = 0; o < oct; o++) {\n v += vnoise(x * freq, y * freq) * amp;\n norm += amp;\n amp *= 0.5;\n freq *= 2.1;\n }\n return v / norm; // -1..1\n };\n\n for (let row = 0; row < rows; row++) {\n for (let col = 0; col < cols; col++) {\n const nx = col * noiseScale + t * 0.06;\n const ny = row * noiseScale * 1.3 - t * 0.04;\n\n // Mouse warp: displace sample coords near cursor\n const dx = col / cols - mousePos.x;\n const dy = row / rows - mousePos.y;\n const dist = Math.sqrt(dx * dx + dy * dy);\n const warp = mouseWarp > 0 ? Math.max(0, 1 - dist / mouseWarp) * 0.12 : 0;\n const wx = nx + warp * Math.sin(t * 1.3 + dy * 8);\n const wy = ny + warp * Math.cos(t * 0.9 + dx * 8);\n\n const raw = fbmN(wx, wy); // -1..1\n const norm2 = raw * 0.5 + 0.5; // 0..1\n\n if (norm2 < 0.12) continue;\n\n const charIdx = Math.floor(norm2 * (chars.length - 1));\n const ch = chars[charIdx];\n if (ch === ' ') continue;\n\n const isAccent = norm2 > accentThreshold;\n const alpha = lightMode ? norm2 * 0.82 : norm2 * 0.13;\n\n ctx.fillStyle = isAccent\n ? `rgba(${acR},${acG},${acB},${lightMode ? 0.92 : 0.28})`\n : `rgba(${br},${bgc},${bb},${alpha})`;\n\n ctx.fillText(ch, col * charW, row * lineH);\n }\n }\n}\n","/**\n * renderGridBackground — CRT-style horizontal scan-line sweep.\n * Bright scan bands travel downward continuously; cursor creates a local glitch zone.\n */\nimport { parseColor, hash2 } from './_shared';\n\nexport interface GridBackgroundOptions {\n /** Font size in CSS pixels (default: 12). */\n fontSize?: number;\n /** Character set (default: '·-=+|/'). */\n chars?: string;\n /** Accent / scan-band colour (default: '#d4ff00'). */\n accentColor?: string;\n /** Custom base character colour (any CSS colour string). */\n color?: string;\n /** Number of scan bands visible at once (default: 3). */\n bands?: number;\n /** Band travel speed (default: 1). */\n speed?: number;\n /** Band width as fraction of canvas height (default: 0.12). */\n bandWidth?: number;\n /** Enable cursor disruption glitch zone (default: true). */\n glitch?: boolean;\n /** Light mode (default: false). */\n lightMode?: boolean;\n}\n\nexport function renderGridBackground(\n ctx: CanvasRenderingContext2D,\n width: number,\n height: number,\n time: number,\n mousePos: { x: number; y: number } = { x: 0.5, y: 0.5 },\n options: GridBackgroundOptions = {},\n): void {\n const {\n fontSize = 12,\n chars = '·-=+|/',\n accentColor = undefined as string | undefined,\n color,\n bands = 3,\n speed = 1,\n bandWidth = 0.12,\n glitch = true,\n lightMode = false,\n } = options;\n const resolvedAccent = accentColor ?? (lightMode ? '#6b8700' : '#d4ff00');\n\n const charW = fontSize * 0.62;\n const lineH = fontSize * 1.4;\n const cols = Math.ceil(width / charW);\n const rows = Math.ceil(height / lineH);\n\n ctx.clearRect(0, 0, width, height);\n ctx.font = `${fontSize}px monospace`;\n ctx.textBaseline = 'top';\n\n let br = 255, bgv = 255, bb = 255;\n if (lightMode) { br = 55; bgv = 55; bb = 55; }\n if (color) { const p = parseColor(color); if (p) { br = p.r; bgv = p.g; bb = p.b; } }\n let acR = 212, acG = 255, acB = 0;\n const ap = parseColor(resolvedAccent); if (ap) { acR = ap.r; acG = ap.g; acB = ap.b; }\n\n const t = time * speed;\n\n for (let row = 0; row < rows; row++) {\n for (let col = 0; col < cols; col++) {\n const ny = row / rows;\n\n // Scan-band phase: bands cycle 0→1 over time\n const scanPhase = ((ny * bands - t * 0.5) % 1.0 + 1.0) % 1.0;\n // Intensity spike at scanPhase ≈ 0 (leading edge)\n const bandIntensity = Math.max(0, 1 - scanPhase / bandWidth);\n\n // Base grid texture via hash\n const gridSeed = hash2(col * 3, row * 7);\n const gridBase = (gridSeed * 0.5 + 0.5) * 0.35;\n\n // Cursor glitch zone\n let glitchBump = 0;\n if (glitch) {\n const dx = col / cols - mousePos.x;\n const dy = ny - mousePos.y;\n const d = Math.sqrt(dx * dx + dy * dy);\n if (d < 0.18) {\n const g = hash2(col * 11 + Math.floor(t * 12), row * 5);\n glitchBump = Math.max(0, 1 - d / 0.18) * (g > 0.5 ? g - 0.3 : 0);\n }\n }\n\n const intensity = Math.min(1, gridBase + bandIntensity * 0.8 + glitchBump * 0.6);\n if (intensity < 0.04) continue;\n\n const charIdx = Math.floor(intensity * (chars.length - 1));\n const ch = chars[charIdx];\n\n const isAccent = bandIntensity > 0.55;\n const alpha = lightMode ? intensity * 0.82 : intensity * 0.12;\n\n ctx.fillStyle = isAccent\n ? `rgba(${acR},${acG},${acB},${lightMode ? 0.92 : 0.28})`\n : `rgba(${br},${bgv},${bb},${alpha})`;\n\n ctx.fillText(ch, col * charW, row * lineH);\n }\n }\n}\n","/**\n * renderAuroraBackground — premium slow-drifting light bands.\n * Multiple sine layers create smooth organic interference patterns —\n * like silk, aurora borealis, or light through water.\n */\nimport { parseColor, hash2 } from './_shared';\n\nexport interface AuroraBackgroundOptions {\n /** Character grid density. Default 14. */\n fontSize?: number;\n /** Character ramp from sparse to dense. */\n chars?: string;\n /** Base character color. Default theme-aware white/black. */\n color?: string;\n /** Accent color for intensity peaks. Default '#d4ff00'. */\n accentColor?: string;\n /** Animation speed multiplier. Default 1. */\n speed?: number;\n /** Number of wave layers stacked. More = richer interference. Default 5. */\n layers?: number;\n /** Wave spread/softness — higher = broader, more diffuse bands. Default 1.2. */\n softness?: number;\n /** Mouse distortion radius (0–1). Elegant ripple that follows the cursor. Default 0.2. */\n mouseRipple?: number;\n /** Force light mode (dark chars on light bg). Default false. */\n lightMode?: boolean;\n}\n\nexport function renderAuroraBackground(\n ctx: CanvasRenderingContext2D,\n width: number,\n height: number,\n time: number,\n mousePos: { x: number; y: number } = { x: 0.5, y: 0.5 },\n options: AuroraBackgroundOptions = {},\n): void {\n const {\n fontSize = 14,\n chars = ' ·∙•:;+=≡≣#@',\n color,\n accentColor = undefined as string | undefined,\n speed = 1,\n layers = 5,\n softness = 1.2,\n mouseRipple = 0.2,\n lightMode = false,\n } = options;\n const resolvedAccent = accentColor ?? (lightMode ? '#6b8700' : '#d4ff00');\n\n const charW = fontSize * 0.62;\n const lineH = fontSize * 1.4;\n const cols = Math.ceil(width / charW);\n const rows = Math.ceil(height / lineH);\n\n ctx.clearRect(0, 0, width, height);\n ctx.font = `${fontSize}px monospace`;\n ctx.textBaseline = 'top';\n\n let cr = 255, cg = 255, cb = 255;\n if (lightMode) { cr = 55; cg = 55; cb = 55; }\n if (color) { const p = parseColor(color); if (p) { cr = p.r; cg = p.g; cb = p.b; } }\n let acR = 212, acG = 255, acB = 0;\n const ap = parseColor(resolvedAccent); if (ap) { acR = ap.r; acG = ap.g; acB = ap.b; }\n\n const t = time * speed;\n\n // Pre-bake layer parameters — each layer has unique freq, direction, phase offset\n const layerParams: Array<{ fx: number; fy: number; phase: number; dt: number; amp: number }> = [];\n for (let l = 0; l < layers; l++) {\n const seed = hash2(l * 17, l * 31 + 7);\n const seed2 = hash2(l * 23 + 5, l * 11);\n layerParams.push({\n fx: 0.8 + seed * 2.2,\n fy: 1.2 + seed2 * 1.8,\n phase: seed * Math.PI * 4,\n dt: (0.3 + hash2(l * 7, l * 13 + 3) * 0.5) * (l % 2 === 0 ? 1 : -1),\n amp: 0.55 + hash2(l * 29, l * 3) * 0.45,\n });\n }\n\n for (let row = 0; row < rows; row++) {\n const ny = row / rows;\n\n for (let col = 0; col < cols; col++) {\n const nx = col / cols;\n\n // Mouse distortion: gaussian lens warp\n const mdx = nx - mousePos.x;\n const mdy = ny - mousePos.y;\n const md = Math.sqrt(mdx * mdx + mdy * mdy);\n const warp = mouseRipple * Math.exp(-md * md / 0.06);\n const wx = nx + mdx * warp;\n const wy = ny + mdy * warp;\n\n // Sum wave layers\n let sum = 0;\n let totalAmp = 0;\n for (let l = 0; l < layers; l++) {\n const { fx, fy, phase, dt, amp } = layerParams[l];\n const wave = Math.sin(wx * fx * Math.PI * 2 + t * dt + phase)\n * Math.cos(wy * fy * Math.PI * 2 + t * dt * 0.7 + phase * 1.3);\n sum += wave * amp;\n totalAmp += amp;\n }\n\n // Normalise to 0→1 with soft sigmoid\n const rawVal = sum / totalAmp;\n const curved = 0.5 + 0.5 * Math.tanh(rawVal * softness * 2.2);\n\n if (curved < 0.12) continue;\n\n const normalized = (curved - 0.12) / 0.88;\n const charIdx = Math.min(chars.length - 1, Math.floor(normalized * chars.length));\n const ch = chars[charIdx];\n\n const isAccent = curved > 0.82;\n const alpha = lightMode ? curved * 0.82 : curved * 0.14;\n\n ctx.fillStyle = isAccent\n ? `rgba(${acR},${acG},${acB},${lightMode ? 0.92 : 0.32})`\n : `rgba(${cr},${cg},${cb},${alpha})`;\n\n ctx.fillText(ch, col * charW, row * lineH);\n }\n }\n}\n","/**\n * renderSilkBackground — smooth directional flow-field ribbons.\n * Each cell reads its angle from a slow-drifting vector field.\n * No mouse interaction by design — pure ambient texture.\n */\nimport { parseColor, hash2 } from './_shared';\n\nexport interface SilkBackgroundOptions {\n /** Character grid density. Default 13. */\n fontSize?: number;\n /** Base character color. Default theme-aware white/black. */\n color?: string;\n /** Accent color for intensity peaks. Default '#d4ff00'. */\n accentColor?: string;\n /** Animation speed multiplier. Default 0.4 (intentionally slow). */\n speed?: number;\n /** Number of flow-field layers. More = richer ribbons. Default 4. */\n layers?: number;\n /** Flow turbulence (0–2). Higher = more folded, tangled ribbons. Default 0.8. */\n turbulence?: number;\n /** Force light mode. Default false. */\n lightMode?: boolean;\n}\n\nexport function renderSilkBackground(\n ctx: CanvasRenderingContext2D,\n width: number,\n height: number,\n time: number,\n options: SilkBackgroundOptions = {},\n): void {\n const {\n fontSize = 13,\n color,\n accentColor = undefined as string | undefined,\n speed = 0.4,\n layers = 4,\n turbulence = 0.8,\n lightMode = false,\n } = options;\n const resolvedAccent = accentColor ?? (lightMode ? '#6b8700' : '#d4ff00');\n\n const charW = fontSize * 0.62;\n const lineH = fontSize * 1.4;\n const cols = Math.ceil(width / charW);\n const rows = Math.ceil(height / lineH);\n\n ctx.clearRect(0, 0, width, height);\n ctx.font = `${fontSize}px monospace`;\n ctx.textBaseline = 'top';\n\n let cr = 255, cg = 255, cb = 255;\n if (lightMode) { cr = 55; cg = 55; cb = 55; }\n if (color) { const p = parseColor(color); if (p) { cr = p.r; cg = p.g; cb = p.b; } }\n let acR = 212, acG = 255, acB = 0;\n const ap = parseColor(resolvedAccent); if (ap) { acR = ap.r; acG = ap.g; acB = ap.b; }\n\n const t = time * speed;\n\n // Direction chars: flow-angle-mapped for the ribbon illusion\n const dirChars = ['─', '─', '╌', '·', '╌', '─', '─', '╌', '·'];\n\n for (let row = 0; row < rows; row++) {\n const ny = row / rows;\n for (let col = 0; col < cols; col++) {\n const nx = col / cols;\n\n // Stack multiple sine-based flow layers\n let angleSum = 0;\n let intensitySum = 0;\n for (let l = 0; l < layers; l++) {\n const ls = hash2(l * 13, l * 7 + 3);\n const ls2 = hash2(l * 29, l * 11 + 1);\n const fx = 1.1 + ls * 2.4;\n const fy = 0.9 + ls2 * 2.0;\n const ph = ls * Math.PI * 6;\n const dr = (0.2 + hash2(l * 41, l * 17) * 0.5) * (l % 2 === 0 ? 1 : -1.3);\n\n const u = Math.sin(nx * fx * Math.PI * 2 + t * dr + ph);\n const v = Math.cos(ny * fy * Math.PI * 2 + t * dr * 0.6 + ph * 1.7);\n\n const cross = Math.sin(nx * fy * Math.PI * turbulence + ny * fx * Math.PI * turbulence + t * dr * 0.4);\n\n angleSum += Math.atan2(v + cross * 0.3, u);\n intensitySum += (u * v + 1) * 0.5;\n }\n\n const angle = angleSum / layers;\n const intensity = Math.min(1, intensitySum / layers);\n\n if (intensity < 0.1) continue;\n\n const angleNorm = (angle + Math.PI) / (Math.PI * 2);\n const charIdx = Math.floor(angleNorm * dirChars.length) % dirChars.length;\n const ch = dirChars[charIdx];\n\n const isAccent = intensity > 0.80;\n const alpha = lightMode ? intensity * 0.80 : intensity * 0.13;\n\n ctx.fillStyle = isAccent\n ? `rgba(${acR},${acG},${acB},${lightMode ? 0.90 : 0.26})`\n : `rgba(${cr},${cg},${cb},${alpha})`;\n\n ctx.fillText(ch, col * charW, row * lineH);\n }\n }\n}\n","/**\n * renderVoidBackground — gravitational singularity follows the cursor.\n * Characters are pulled inward and spiral around the attractor.\n */\nimport { parseColor, hash2 } from './_shared';\n\nexport interface VoidBackgroundOptions {\n /** Character grid density. Default 13. */\n fontSize?: number;\n /** Character ramp. Default space-to-dense. */\n chars?: string;\n /** Base character color. Default theme-aware. */\n color?: string;\n /** Accent color for the inner singularity ring. Default '#d4ff00'. */\n accentColor?: string;\n /** Animation speed multiplier. Default 1. */\n speed?: number;\n /** Gravity well radius (fraction of canvas width). Default 0.38. */\n radius?: number;\n /** Spiral tightness — higher = more rotation per unit distance. Default 3. */\n swirl?: number;\n /** Force light mode. Default false. */\n lightMode?: boolean;\n}\n\nexport function renderVoidBackground(\n ctx: CanvasRenderingContext2D,\n width: number,\n height: number,\n time: number,\n mousePos: { x: number; y: number } = { x: 0.5, y: 0.5 },\n options: VoidBackgroundOptions = {},\n): void {\n const {\n fontSize = 13,\n chars = ' ·:;=+*#%@',\n color,\n accentColor = undefined as string | undefined,\n speed = 1,\n radius = 0.38,\n swirl = 3,\n lightMode = false,\n } = options;\n const resolvedAccent = accentColor ?? (lightMode ? '#6b8700' : '#d4ff00');\n\n const charW = fontSize * 0.62;\n const lineH = fontSize * 1.4;\n const cols = Math.ceil(width / charW);\n const rows = Math.ceil(height / lineH);\n const aspect = width / height;\n\n ctx.clearRect(0, 0, width, height);\n ctx.font = `${fontSize}px monospace`;\n ctx.textBaseline = 'top';\n\n let cr = 255, cg = 255, cb = 255;\n if (lightMode) { cr = 55; cg = 55; cb = 55; }\n if (color) { const p = parseColor(color); if (p) { cr = p.r; cg = p.g; cb = p.b; } }\n let acR = 212, acG = 255, acB = 0;\n const ap = parseColor(resolvedAccent); if (ap) { acR = ap.r; acG = ap.g; acB = ap.b; }\n\n const t = time * speed;\n\n for (let row = 0; row < rows; row++) {\n const ny = row / rows;\n for (let col = 0; col < cols; col++) {\n const nx = col / cols;\n\n const dx = (nx - mousePos.x) * aspect;\n const dy = ny - mousePos.y;\n const dist = Math.sqrt(dx * dx + dy * dy);\n const r = dist / radius;\n\n // Outside radius: very faint scattered field\n if (r > 1) {\n const outerNoise = hash2(col * 3, row * 7) * Math.max(0, 1 - (r - 1) * 3);\n if (outerNoise < 0.62) continue;\n const alpha = outerNoise * (lightMode ? 0.28 : 0.04);\n ctx.fillStyle = `rgba(${cr},${cg},${cb},${alpha})`;\n ctx.fillText(chars[1], col * charW, row * lineH);\n continue;\n }\n\n // Spiral displacement: angle rotates faster near center\n const baseAngle = Math.atan2(dy, dx * aspect);\n const swirlAmt = (1 - r) * swirl;\n const angle = baseAngle + swirlAmt + t * 0.4;\n\n // Intensity: rises sharply toward center, with animated pulse ring\n const pulseRing = Math.max(0, 1 - Math.abs(r - (0.15 + 0.12 * Math.sin(t * 1.1))) / 0.07);\n const gravity = Math.pow(1 - r, 2.2);\n const intensity = Math.min(1, gravity + pulseRing * 0.6);\n\n if (intensity < 0.06) continue;\n\n void angle; // angle influences char variety at mid-range (kept for future use)\n const densityI = Math.floor(intensity * (chars.length - 1));\n const charIdx = Math.min(chars.length - 1, densityI);\n const ch = chars[charIdx];\n\n const isAccent = pulseRing > 0.35 || r < 0.08;\n const alpha = lightMode ? intensity * 0.85 : intensity * 0.18;\n\n ctx.fillStyle = isAccent\n ? `rgba(${acR},${acG},${acB},${lightMode ? 0.95 : 0.38})`\n : `rgba(${cr},${cg},${cb},${alpha})`;\n\n ctx.fillText(ch, col * charW, row * lineH);\n }\n }\n}\n","/**\n * renderMorphBackground — per-cell multi-frequency oscillation.\n * Each cell uses a unique rhythm. Pure ambient texture. No mouse interaction.\n */\nimport { parseColor, hash2 } from './_shared';\n\nexport interface MorphBackgroundOptions {\n /** Character grid density. Default 14. */\n fontSize?: number;\n /** Character ramp. Default clean gradient. */\n chars?: string;\n /** Base character color. Default theme-aware. */\n color?: string;\n /** Accent color for intensity peaks. Default '#d4ff00'. */\n accentColor?: string;\n /** Animation speed multiplier. Default 0.5 (intentionally slow). */\n speed?: number;\n /** How many frequency harmonics per cell. More = richer shimmer. Default 3. */\n harmonics?: number;\n /** Force light mode. Default false. */\n lightMode?: boolean;\n}\n\nexport function renderMorphBackground(\n ctx: CanvasRenderingContext2D,\n width: number,\n height: number,\n time: number,\n options: MorphBackgroundOptions = {},\n): void {\n const {\n fontSize = 14,\n chars = ' ·∙•:-=+*#',\n color,\n accentColor = undefined as string | undefined,\n speed = 0.5,\n harmonics = 3,\n lightMode = false,\n } = options;\n const resolvedAccent = accentColor ?? (lightMode ? '#6b8700' : '#d4ff00');\n\n const charW = fontSize * 0.62;\n const lineH = fontSize * 1.4;\n const cols = Math.ceil(width / charW);\n const rows = Math.ceil(height / lineH);\n\n ctx.clearRect(0, 0, width, height);\n ctx.font = `${fontSize}px monospace`;\n ctx.textBaseline = 'top';\n\n let cr = 255, cg = 255, cb = 255;\n if (lightMode) { cr = 55; cg = 55; cb = 55; }\n if (color) { const p = parseColor(color); if (p) { cr = p.r; cg = p.g; cb = p.b; } }\n let acR = 212, acG = 255, acB = 0;\n const ap = parseColor(resolvedAccent); if (ap) { acR = ap.r; acG = ap.g; acB = ap.b; }\n\n const t = time * speed;\n\n // Max possible sum: sum(1/(h+1)) for h=0..harmonics-1\n const maxV = Array.from({ length: harmonics }, (_, h) => 1 / (h + 1)).reduce((a, b) => a + b, 0);\n\n for (let row = 0; row < rows; row++) {\n for (let col = 0; col < cols; col++) {\n // Each cell gets unique frequency seeds derived from its position\n let v = 0;\n for (let h = 0; h < harmonics; h++) {\n const fBase = hash2(col * (h + 3) + 7, row * (h + 5) + 11);\n const fineF = 0.18 + fBase * 1.4;\n const phase = hash2(col * (h + 7), row * (h + 9) + 3) * Math.PI * 2;\n const weight = 1 / (h + 1);\n v += Math.sin(t * fineF + phase) * weight;\n }\n\n const norm = (v / maxV + 1) * 0.5; // 0→1\n\n if (norm < 0.28) continue;\n\n const remapped = (norm - 0.28) / 0.72;\n const charIdx = Math.min(chars.length - 1, Math.floor(remapped * chars.length));\n const ch = chars[charIdx];\n\n const isAccent = norm > 0.88;\n const alpha = lightMode ? remapped * 0.82 : remapped * 0.13;\n\n ctx.fillStyle = isAccent\n ? `rgba(${acR},${acG},${acB},${lightMode ? 0.92 : 0.28})`\n : `rgba(${cr},${cg},${cb},${alpha})`;\n\n ctx.fillText(ch, col * charW, row * lineH);\n }\n }\n}\n","/**\n * renderFireBackground — upward-drifting fire simulation using a cellular\n * automata heat-propagation approach rendered as ASCII chars.\n */\nimport { parseColor } from './_shared';\n\nexport interface FireBackgroundOptions {\n /** Font size in CSS pixels (default: 13) */\n fontSize?: number;\n /** Characters mapped from cool→hot (default: ' .,:;i+xX#&@') */\n chars?: string;\n /** Base flame colour (default: '#ff4500') */\n color?: string;\n /** Secondary hot-tip colour (default: '#ffe066') */\n hotColor?: string;\n /** Flame intensity 0–1 (default: 0.85) */\n intensity?: number;\n /** Horizontal wind force -1..1 (default: 0) */\n wind?: number;\n /** Global speed multiplier (default: 1) */\n speed?: number;\n /** Light mode: invert text colours (default: false) */\n lightMode?: boolean;\n}\n\nexport function renderFireBackground(\n ctx: CanvasRenderingContext2D,\n width: number,\n height: number,\n time: number,\n options: FireBackgroundOptions = {},\n): void {\n const {\n fontSize = 13,\n chars = ' .,:;i+xX#&@',\n color = '#ff4500',\n hotColor = '#ffe066',\n intensity = 0.85,\n wind = 0,\n speed = 1,\n lightMode = false,\n } = options;\n\n const charW = fontSize * 0.62;\n const lineH = fontSize * 1.4;\n const cols = Math.ceil(width / charW);\n const rows = Math.ceil(height / lineH);\n const len = cols * rows;\n\n // Persistent heat buffer stored on the canvas element to survive redraws.\n const key = '__fire_heat__';\n const canvasAny = ctx.canvas as unknown as Record<string, Float32Array>;\n let heat: Float32Array = canvasAny[key] as Float32Array;\n if (!heat || heat.length !== len) {\n heat = new Float32Array(len);\n canvasAny[key] = heat;\n }\n\n const dt = 0.016 * speed;\n const coolingRate = 0.18 * dt;\n const windShift = wind * speed * 0.8;\n\n // Seed the bottom 2 rows with hot cells every frame.\n const baseRow = rows - 1;\n const t = time * speed;\n for (let c = 0; c < cols; c++) {\n const flicker = Math.sin(c * 0.31 + t * 4.1) * 0.5 + 0.5;\n const flicker2 = Math.sin(c * 0.73 - t * 2.7) * 0.5 + 0.5;\n const seed = (flicker * 0.6 + flicker2 * 0.4) * intensity;\n heat[baseRow * cols + c] = Math.min(1, seed + Math.random() * 0.15 * intensity);\n if (baseRow > 0) heat[(baseRow - 1) * cols + c] = Math.min(1, seed * 0.85 + Math.random() * 0.1 * intensity);\n }\n\n // Propagate heat upward.\n const newHeat = new Float32Array(len);\n for (let r = 0; r < rows - 2; r++) {\n for (let c = 0; c < cols; c++) {\n const below = heat[(r + 1) * cols + c];\n const below2 = heat[(r + 2) * cols + Math.max(0, Math.min(cols - 1, c + Math.round(windShift)))];\n const left = heat[(r + 1) * cols + Math.max(0, c - 1)];\n const right = heat[(r + 1) * cols + Math.min(cols - 1, c + 1)];\n const avg = (below * 0.4 + below2 * 0.25 + left * 0.175 + right * 0.175);\n newHeat[r * cols + c] = Math.max(0, avg - coolingRate - Math.random() * 0.02 * speed);\n }\n }\n // Copy bottom seeded rows unchanged.\n for (let c = 0; c < cols; c++) {\n newHeat[(rows - 1) * cols + c] = heat[(rows - 1) * cols + c];\n if (rows > 1) newHeat[(rows - 2) * cols + c] = heat[(rows - 2) * cols + c];\n }\n canvasAny[key] = newHeat;\n\n // Parse colours.\n const cp = parseColor(color) ?? { r: 255, g: 69, b: 0 };\n const hp = parseColor(hotColor) ?? { r: 255, g: 224, b: 102 };\n\n ctx.clearRect(0, 0, width, height);\n ctx.font = `${fontSize}px \"JetBrains Mono\", monospace`;\n ctx.textBaseline = 'top';\n\n for (let r = 0; r < rows; r++) {\n for (let c = 0; c < cols; c++) {\n const v = newHeat[r * cols + c];\n if (v < 0.03) continue;\n\n const charIdx = Math.min(chars.length - 1, Math.floor(v * chars.length));\n const ch = chars[charIdx];\n if (ch === ' ') continue;\n\n // Interpolate colour from base to hot tip.\n const blend = Math.min(1, v * 1.2);\n const r2 = (cp.r + (hp.r - cp.r) * blend) | 0;\n const g2 = (cp.g + (hp.g - cp.g) * blend) | 0;\n const b2 = (cp.b + (hp.b - cp.b) * blend) | 0;\n\n const alpha = lightMode ? (1 - v * 0.3) : Math.min(1, v + 0.15);\n ctx.globalAlpha = alpha;\n ctx.fillStyle = `rgb(${r2},${g2},${b2})`;\n ctx.fillText(ch, c * charW, r * lineH);\n }\n }\n ctx.globalAlpha = 1;\n}\n","/**\n * renderDnaBackground — animated double-helix DNA strands scrolling vertically\n * with base-pair characters between them.\n */\nimport { parseColor, hash2 } from './_shared';\n\nexport interface DnaBackgroundOptions {\n /** Font size in CSS pixels (default: 13) */\n fontSize?: number;\n /** Characters for strand nodes (default: 'ATCG') */\n baseChars?: string;\n /** Characters for the connectors between strands (default: '-=≡') */\n bridgeChars?: string;\n /** Primary strand colour (default: '#00e5ff') */\n color?: string;\n /** Secondary strand colour (default: '#ff4081') */\n color2?: string;\n /** Bridge / connector colour (default: '#88ffcc') */\n bridgeColor?: string;\n /** Speed multiplier (default: 1) */\n speed?: number;\n /** Number of helix columns (default: auto, ~1 per 80px) */\n helixCount?: number;\n /** Light mode (default: false) */\n lightMode?: boolean;\n}\n\nexport function renderDnaBackground(\n ctx: CanvasRenderingContext2D,\n width: number,\n height: number,\n time: number,\n options: DnaBackgroundOptions = {},\n): void {\n const {\n fontSize = 13,\n baseChars = 'ATCG',\n bridgeChars = '-=≡',\n color = '#00e5ff',\n color2 = '#ff4081',\n bridgeColor = '#88ffcc',\n speed = 1,\n helixCount,\n lightMode = false,\n } = options;\n\n const charW = fontSize * 0.62;\n const lineH = fontSize * 1.4;\n const cols = Math.ceil(width / charW);\n const rows = Math.ceil(height / lineH);\n\n const numHelix = helixCount ?? Math.max(1, Math.floor(width / 80));\n const sectionW = cols / numHelix;\n\n const cp = parseColor(color) ?? { r: 0, g: 229, b: 255 };\n const cp2 = parseColor(color2) ?? { r: 255, g: 64, b: 129 };\n const bp = parseColor(bridgeColor) ?? { r: 136, g: 255, b: 204 };\n\n const defaultColor = lightMode ? 'rgb(55,55,55)' : 'rgb(255,255,255)';\n void defaultColor; // used below\n\n ctx.clearRect(0, 0, width, height);\n ctx.font = `${fontSize}px \"JetBrains Mono\", monospace`;\n ctx.textBaseline = 'top';\n\n const t = time * speed;\n const amplitude = (sectionW * 0.35);\n\n for (let h = 0; h < numHelix; h++) {\n const centerCol = sectionW * (h + 0.5);\n\n for (let r = 0; r < rows; r++) {\n const phase = (r / rows) * Math.PI * 6 - t * 1.8;\n const strand1ColF = centerCol + Math.sin(phase) * amplitude;\n const strand2ColF = centerCol + Math.sin(phase + Math.PI) * amplitude;\n const strand1Col = Math.round(strand1ColF);\n const strand2Col = Math.round(strand2ColF);\n\n if (strand1Col < 0 || strand1Col >= cols) continue;\n const baseSeed1 = hash2(h * 31 + r * 7, 3);\n const ch1 = baseChars[Math.floor(baseSeed1 * baseChars.length)];\n\n // Depth cue: alpha based on sine value (-1..1)\n const depth1 = (Math.sin(phase) + 1) * 0.5;\n const depth2 = (Math.sin(phase + Math.PI) + 1) * 0.5;\n\n ctx.globalAlpha = 0.35 + depth1 * 0.65;\n ctx.fillStyle = `rgb(${cp.r},${cp.g},${cp.b})`;\n ctx.fillText(ch1, strand1Col * charW, r * lineH);\n\n if (strand2Col >= 0 && strand2Col < cols) {\n const baseSeed2 = hash2(h * 53 + r * 11, 7);\n const ch2 = baseChars[Math.floor(baseSeed2 * baseChars.length)];\n ctx.globalAlpha = 0.35 + depth2 * 0.65;\n ctx.fillStyle = `rgb(${cp2.r},${cp2.g},${cp2.b})`;\n ctx.fillText(ch2, strand2Col * charW, r * lineH);\n }\n\n // Draw bridge every ~3 rows when strands are roughly horizontal.\n const bridgeInterval = 3;\n if (r % bridgeInterval === 0) {\n const minC = Math.min(strand1Col, strand2Col);\n const maxC = Math.max(strand1Col, strand2Col);\n const bridgeLen = maxC - minC;\n if (bridgeLen > 1) {\n const bSeed = hash2(r * 17 + h * 43, 5);\n const bCh = bridgeChars[Math.floor(bSeed * bridgeChars.length)];\n const midBridgeAlpha = (depth1 + depth2) * 0.25 + 0.2;\n ctx.globalAlpha = midBridgeAlpha;\n ctx.fillStyle = `rgb(${bp.r},${bp.g},${bp.b})`;\n for (let bc = minC + 1; bc < maxC; bc++) {\n ctx.fillText(bCh, bc * charW, r * lineH);\n }\n }\n }\n }\n }\n\n ctx.globalAlpha = 1;\n}\n","/**\n * renderTerrainBackground — scrolling ASCII side-scroll heightmap landscape\n * generated from layered Perlin-style noise.\n */\nimport { parseColor, fbm, hash2 } from './_shared';\n\nexport interface TerrainBackgroundOptions {\n /** Font size in CSS pixels (default: 13) */\n fontSize?: number;\n /** Characters for terrain density (default: ' .,:;+*#@') */\n chars?: string;\n /** Foreground ground colour (default: '#4caf50') */\n color?: string;\n /** Sky / star colour (default: '#1a237e') */\n skyColor?: string;\n /** Peak / snow-cap colour (default: '#e0e0e0') */\n peakColor?: string;\n /** Horizontal scroll speed (default: 1) */\n speed?: number;\n /** Terrain roughness 0.1–1 (default: 0.55) */\n roughness?: number;\n /** Mountain height fraction 0–1 (default: 0.55) */\n heightScale?: number;\n /** Show faint background stars (default: true) */\n stars?: boolean;\n /** Light mode (default: false) */\n lightMode?: boolean;\n}\n\nexport function renderTerrainBackground(\n ctx: CanvasRenderingContext2D,\n width: number,\n height: number,\n time: number,\n options: TerrainBackgroundOptions = {},\n): void {\n const {\n fontSize = 13,\n chars = ' .,:;+*#@',\n color = '#4caf50',\n skyColor = '#1a237e',\n peakColor = '#e0e0e0',\n speed = 1,\n roughness = 0.55,\n heightScale = 0.55,\n stars = true,\n lightMode = false,\n } = options;\n\n const charW = fontSize * 0.62;\n const lineH = fontSize * 1.4;\n const cols = Math.ceil(width / charW);\n const rows = Math.ceil(height / lineH);\n\n const cp = parseColor(color) ?? { r: 76, g: 175, b: 80 };\n const sky = parseColor(skyColor) ?? { r: 26, g: 35, b: 126 };\n const peak = parseColor(peakColor) ?? { r: 224, g: 224, b: 224 };\n void lightMode;\n\n ctx.clearRect(0, 0, width, height);\n ctx.font = `${fontSize}px \"JetBrains Mono\", monospace`;\n ctx.textBaseline = 'top';\n\n const scroll = time * speed * 0.4;\n\n // Pre-compute terrain height per column.\n const terrainRow: number[] = new Array(cols);\n for (let c = 0; c < cols; c++) {\n const nx = (c / cols + scroll) * roughness * 3;\n const h = (fbm(nx, 0.5) * 0.5 + 0.5) * heightScale;\n terrainRow[c] = Math.floor(h * rows);\n }\n\n for (let r = 0; r < rows; r++) {\n for (let c = 0; c < cols; c++) {\n const terrainStart = rows - 1 - terrainRow[c];\n const isGround = r >= terrainStart;\n const isNearPeak = r === terrainStart;\n\n if (!isGround) {\n // Sky region: occasional stars.\n if (stars) {\n const starSeed = hash2(c * 7 + Math.floor(scroll * 0.3), r * 13);\n if (starSeed > 0.97) {\n const twinkle = Math.sin(time * 2 + starSeed * 100) * 0.3 + 0.7;\n ctx.globalAlpha = twinkle * 0.5;\n ctx.fillStyle = `rgb(${sky.r + 60},${sky.g + 60},${sky.b + 80})`;\n ctx.fillText('·', c * charW, r * lineH);\n }\n }\n continue;\n }\n\n // Ground: depth based on distance from surface.\n const depth = (r - terrainStart) / Math.max(1, terrainRow[c]);\n const charIdx = Math.min(chars.length - 1, Math.floor(depth * chars.length));\n const ch = chars[charIdx];\n if (ch === ' ' && !isNearPeak) continue;\n\n const blendPeak = isNearPeak ? 1 : Math.max(0, 1 - depth * 4);\n const r2 = ((cp.r + (peak.r - cp.r) * blendPeak) | 0);\n const g2 = ((cp.g + (peak.g - cp.g) * blendPeak) | 0);\n const b2 = ((cp.b + (peak.b - cp.b) * blendPeak) | 0);\n\n ctx.globalAlpha = 0.5 + depth * 0.5;\n ctx.fillStyle = `rgb(${r2},${g2},${b2})`;\n ctx.fillText(isNearPeak ? chars[chars.length - 1] : ch, c * charW, r * lineH);\n }\n }\n\n ctx.globalAlpha = 1;\n}\n","/**\n * renderCircuitBackground — procedural PCB trace growth with signal pulses\n * traveling along horizontal and vertical edges.\n */\nimport { parseColor, hash2 } from './_shared';\n\nexport interface CircuitBackgroundOptions {\n /** Font size in CSS pixels (default: 13) */\n fontSize?: number;\n /** Trace characters (default: '─│┌┐└┘├┤┬┴┼') */\n chars?: string;\n /** Trace colour (default: '#00ff88') */\n color?: string;\n /** Signal pulse colour (default: '#ffffff') */\n pulseColor?: string;\n /** Fraction of cells that have a trace (default: 0.38) */\n density?: number;\n /** Signal pulse speed (default: 1) */\n speed?: number;\n /** Light mode (default: false) */\n lightMode?: boolean;\n}\n\n// Direction flags (bit-field per cell)\nconst EAST = 1;\nconst WEST = 2;\nconst NORTH = 4;\nconst SOUTH = 8;\n\nconst DIR_CHARS: Record<number, string> = {\n [EAST | WEST]: '─',\n [NORTH | SOUTH]: '│',\n [EAST | SOUTH]: '┌',\n [WEST | SOUTH]: '┐',\n [EAST | NORTH]: '└',\n [WEST | NORTH]: '┘',\n [EAST | WEST | SOUTH]: '┬',\n [EAST | WEST | NORTH]: '┴',\n [NORTH | SOUTH | EAST]: '├',\n [NORTH | SOUTH | WEST]: '┤',\n [EAST | WEST | NORTH | SOUTH]: '┼',\n [EAST]: '╶',\n [WEST]: '╴',\n [NORTH]: '╵',\n [SOUTH]: '╷',\n};\n\nexport function renderCircuitBackground(\n ctx: CanvasRenderingContext2D,\n width: number,\n height: number,\n time: number,\n options: CircuitBackgroundOptions = {},\n): void {\n const {\n fontSize = 13,\n pulseColor = '#ffffff',\n color = '#00ff88',\n density = 0.38,\n speed = 1,\n lightMode = false,\n } = options;\n\n const charW = fontSize * 0.62;\n const lineH = fontSize * 1.4;\n const cols = Math.ceil(width / charW);\n const rows = Math.ceil(height / lineH);\n\n const cp = parseColor(color) ?? { r: 0, g: 255, b: 136 };\n const pp = parseColor(pulseColor) ?? { r: 255, g: 255, b: 255 };\n void lightMode;\n\n // Build a stable grid from hash functions (no per-frame allocation).\n // Each cell stores a bitmask of connections.\n const getConnections = (c: number, r: number): number => {\n if (hash2(c * 17 + 1, r * 7 + 2) > density) return 0;\n let mask = 0;\n if (c + 1 < cols && hash2(c * 17 + 1, r * 7 + 2) > 0.15) mask |= EAST;\n if (c - 1 >= 0 && hash2((c-1)*17+1, r*7+2) > 0.15) mask |= WEST;\n if (r + 1 < rows && hash2(c * 17 + 1, (r+1)*7+2) > 0.15) mask |= SOUTH;\n if (r - 1 >= 0 && hash2(c*17+1,(r-1)*7+2) > 0.15) mask |= NORTH;\n return mask;\n };\n\n ctx.clearRect(0, 0, width, height);\n ctx.font = `${fontSize}px \"JetBrains Mono\", monospace`;\n ctx.textBaseline = 'top';\n\n const t = time * speed;\n\n for (let r = 0; r < rows; r++) {\n for (let c = 0; c < cols; c++) {\n const mask = getConnections(c, r);\n if (mask === 0) continue;\n\n const ch = DIR_CHARS[mask] ?? '·';\n\n // Pulse wave along horizontal traces.\n const pulsePosH = ((t * 8 + hash2(c, r * 23) * 40) % cols);\n const pulsePosV = ((t * 6 + hash2(r * 17, c * 11) * 40) % rows);\n const nearH = (mask & EAST || mask & WEST) && Math.abs(c - pulsePosH) < 1.5;\n const nearV = (mask & NORTH || mask & SOUTH) && Math.abs(r - pulsePosV) < 1.5;\n const isPulse = nearH || nearV;\n\n const baseAlpha = 0.25 + hash2(c * 3, r * 5) * 0.35;\n\n if (isPulse) {\n ctx.globalAlpha = 0.95;\n ctx.fillStyle = `rgb(${pp.r},${pp.g},${pp.b})`;\n } else {\n ctx.globalAlpha = baseAlpha;\n ctx.fillStyle = `rgb(${cp.r},${cp.g},${cp.b})`;\n }\n\n ctx.fillText(ch, c * charW, r * lineH);\n }\n }\n\n ctx.globalAlpha = 1;\n}\n","/**\n * ASCII Background — public entry point for the backgrounds sub-system.\n *\n * Exports:\n * - All 10 render functions\n * - All 10 option interfaces\n * - `AsciiBackgroundOptions` — combined union type + mount options\n * - `asciiBackground()` — the drop-in mount helper\n * - `mountWaveBackground` / `MountWaveOptions` — deprecated aliases\n */\n\nexport type { WaveBackgroundOptions } from './wave';\nexport { renderWaveBackground } from './wave';\n\nexport type { RainBackgroundOptions } from './rain';\nexport { renderRainBackground } from './rain';\n\nexport type { StarsBackgroundOptions } from './stars';\nexport { renderStarsBackground } from './stars';\n\nexport type { PulseBackgroundOptions } from './pulse';\nexport { renderPulseBackground } from './pulse';\n\nexport type { NoiseBackgroundOptions } from './noise';\nexport { renderNoiseBackground } from './noise';\n\nexport type { GridBackgroundOptions } from './grid';\nexport { renderGridBackground } from './grid';\n\nexport type { AuroraBackgroundOptions } from './aurora';\nexport { renderAuroraBackground } from './aurora';\n\nexport type { SilkBackgroundOptions } from './silk';\nexport { renderSilkBackground } from './silk';\n\nexport type { VoidBackgroundOptions } from './void';\nexport { renderVoidBackground } from './void';\n\nexport type { MorphBackgroundOptions } from './morph';\nexport { renderMorphBackground } from './morph';\n\nexport type { FireBackgroundOptions } from './fire';\nexport { renderFireBackground } from './fire';\n\nexport type { DnaBackgroundOptions } from './dna';\nexport { renderDnaBackground } from './dna';\n\nexport type { TerrainBackgroundOptions } from './terrain';\nexport { renderTerrainBackground } from './terrain';\n\nexport type { CircuitBackgroundOptions } from './circuit';\nexport { renderCircuitBackground } from './circuit';\n\nimport { renderWaveBackground } from './wave';\nimport type { WaveBackgroundOptions } from './wave';\nimport { renderRainBackground } from './rain';\nimport type { RainBackgroundOptions } from './rain';\nimport { renderStarsBackground } from './stars';\nimport type { StarsBackgroundOptions } from './stars';\nimport { renderPulseBackground } from './pulse';\nimport type { PulseBackgroundOptions } from './pulse';\nimport { renderNoiseBackground } from './noise';\nimport type { NoiseBackgroundOptions } from './noise';\nimport { renderGridBackground } from './grid';\nimport type { GridBackgroundOptions } from './grid';\nimport { renderAuroraBackground } from './aurora';\nimport type { AuroraBackgroundOptions } from './aurora';\nimport { renderSilkBackground } from './silk';\nimport type { SilkBackgroundOptions } from './silk';\nimport { renderVoidBackground } from './void';\nimport type { VoidBackgroundOptions } from './void';\nimport { renderMorphBackground } from './morph';\nimport type { MorphBackgroundOptions } from './morph';\nimport { renderFireBackground } from './fire';\nimport type { FireBackgroundOptions } from './fire';\nimport { renderDnaBackground } from './dna';\nimport type { DnaBackgroundOptions } from './dna';\nimport { renderTerrainBackground } from './terrain';\nimport type { TerrainBackgroundOptions } from './terrain';\nimport { renderCircuitBackground } from './circuit';\nimport type { CircuitBackgroundOptions } from './circuit';\n\n// Inline _parseColor for the inject helper (avoids circular dep through _shared re-export)\nfunction _parseColor(c: string): { r: number; g: number; b: number } | null {\n const hex = c.match(/^#([0-9a-f]{3,8})$/i)?.[1];\n if (hex) {\n const h = hex.length <= 4\n ? hex.split('').map(x => parseInt(x + x, 16))\n : [parseInt(hex.slice(0,2),16), parseInt(hex.slice(2,4),16), parseInt(hex.slice(4,6),16)];\n return { r: h[0], g: h[1], b: h[2] };\n }\n const rgb = c.match(/rgba?\\(\\s*(\\d+)[,\\s]+(\\d+)[,\\s]+(\\d+)/i);\n if (rgb) return { r: +rgb[1], g: +rgb[2], b: +rgb[3] };\n return null;\n}\n\n/**\n * Combined options for `asciiBackground()`. Extends all 10 background option\n * interfaces so every background's options can be passed through one object.\n */\nexport interface AsciiBackgroundOptions extends\n WaveBackgroundOptions,\n RainBackgroundOptions,\n StarsBackgroundOptions,\n PulseBackgroundOptions,\n NoiseBackgroundOptions,\n GridBackgroundOptions,\n AuroraBackgroundOptions,\n SilkBackgroundOptions,\n VoidBackgroundOptions,\n MorphBackgroundOptions,\n FireBackgroundOptions,\n DnaBackgroundOptions,\n TerrainBackgroundOptions,\n CircuitBackgroundOptions\n{\n /**\n * Which background to render (default: 'wave').\n * - 'wave' — interactive ASCII field with vortex, sparkles, breathe\n * - 'rain' — digital column rain (Matrix-style falling characters)\n * - 'stars' — 3D star-warp / hyperspace chars fly toward the viewer\n * - 'pulse' — concentric ASCII ripples radiating from the mouse\n * - 'noise' — slow-drifting organic fractal noise field\n * - 'grid' — CRT-style horizontal scan bands with cursor glitch zone\n * - 'aurora' — premium slow-drifting light bands\n * - 'silk' — smooth directional flow-field ribbons\n * - 'void' — gravitational singularity follows the cursor\n * - 'morph' — per-cell multi-frequency shimmer\n * - 'fire' — upward cellular-automata flame simulation\n * - 'dna' — double-helix strand scrolling with base-pair chars\n * - 'terrain' — scrolling ASCII side-scroll heightmap landscape\n * - 'circuit' — procedural PCB traces with traveling signal pulses\n */\n type?: 'wave' | 'rain' | 'stars' | 'pulse' | 'noise' | 'grid' | 'aurora' | 'silk' | 'void' | 'morph' | 'fire' | 'dna' | 'terrain' | 'circuit';\n /** CSS opacity applied to the canvas element (default: 0.2) */\n opacity?: number;\n /** Extra CSS class names added to the injected canvas */\n className?: string;\n /** z-index of the canvas (default: 0) */\n zIndex?: number;\n /**\n * Colour scheme handling (default: 'auto').\n * - 'auto' — follows system prefers-color-scheme and updates live\n * - 'dark' — always render bright chars on dark background\n * - 'light' — always render dark chars on light background\n */\n colorScheme?: 'auto' | 'light' | 'dark';\n /**\n * Custom character colour. Accepts any CSS colour string: hex, rgb(), hsl().\n * Overrides the default white/black for ASCII chars.\n * @example '#6b8700'\n */\n color?: string;\n}\n\n/**\n * Drop-in helper that mounts an interactive ASCII background onto any element.\n * Injects a canvas, wires DPR resize, mouse tracking, and the RAF loop.\n * Auto-detects light/dark mode and stays in sync if the system theme changes.\n *\n * Returns a `destroy()` function to clean everything up.\n *\n * @example\n * ```ts\n * // 1 line:\n * const { destroy } = asciiBackground('#hero', { opacity: 0.2 });\n *\n * // React — return destroy as cleanup:\n * useEffect(() => asciiBackground(ref.current).destroy, []);\n * ```\n */\nexport function asciiBackground(\n target: string | HTMLElement | null,\n options: AsciiBackgroundOptions = {},\n): { destroy: () => void } {\n const {\n type = 'wave',\n opacity = 0.2,\n className,\n zIndex = 0,\n colorScheme = 'auto',\n color,\n ...renderOpts\n } = options;\n\n const container = typeof target === 'string'\n ? (document.querySelector(target) as HTMLElement | null)\n : target;\n\n if (!container) {\n console.warn('[asciify] asciiBackground: target not found', target);\n return { destroy: () => {} };\n }\n\n const prevPosition = container.style.position;\n if (getComputedStyle(container).position === 'static') {\n container.style.position = 'relative';\n }\n\n const canvas = document.createElement('canvas');\n canvas.style.cssText = [\n 'position:absolute', 'inset:0', 'width:100%', 'height:100%',\n `opacity:${opacity}`, 'pointer-events:none', `z-index:${zIndex}`,\n ].join(';');\n if (className) canvas.className = className;\n container.prepend(canvas);\n\n const ctx = canvas.getContext('2d')!;\n const dpr = window.devicePixelRatio || 1;\n const mouse = { x: 0.5, y: 0.5 };\n const smoothMouse = { x: 0.5, y: 0.5 };\n\n // ── Color scheme ──\n const mq = window.matchMedia('(prefers-color-scheme: light)');\n const isLight = (): boolean => {\n if (colorScheme === 'light') return true;\n if (colorScheme === 'dark') return false;\n return mq.matches;\n };\n\n const parsedColor = color ? _parseColor(color) : null;\n\n type AnyRenderOpts =\n | WaveBackgroundOptions | RainBackgroundOptions | StarsBackgroundOptions\n | PulseBackgroundOptions | NoiseBackgroundOptions | GridBackgroundOptions\n | AuroraBackgroundOptions | SilkBackgroundOptions | VoidBackgroundOptions\n | MorphBackgroundOptions | FireBackgroundOptions | DnaBackgroundOptions\n | TerrainBackgroundOptions | CircuitBackgroundOptions;\n\n const buildWaveOpts = (): WaveBackgroundOptions => ({\n ...renderOpts,\n lightMode: renderOpts.lightMode !== undefined ? renderOpts.lightMode : isLight(),\n baseColor: parsedColor\n ? `rgba(${parsedColor.r},${parsedColor.g},${parsedColor.b},{a})`\n : (renderOpts as WaveBackgroundOptions).baseColor,\n });\n const buildRainOpts = (): RainBackgroundOptions => ({\n ...renderOpts,\n lightMode: renderOpts.lightMode !== undefined ? renderOpts.lightMode : isLight(),\n color: color ?? (renderOpts as RainBackgroundOptions).color,\n });\n const buildStarsOpts = (): StarsBackgroundOptions => ({\n ...renderOpts,\n lightMode: renderOpts.lightMode !== undefined ? renderOpts.lightMode : isLight(),\n color: color ?? (renderOpts as StarsBackgroundOptions).color,\n });\n const buildPulseOpts = (): PulseBackgroundOptions => ({\n ...renderOpts,\n lightMode: renderOpts.lightMode !== undefined ? renderOpts.lightMode : isLight(),\n color: color ?? (renderOpts as PulseBackgroundOptions).color,\n });\n const buildNoiseOpts = (): NoiseBackgroundOptions => ({\n ...renderOpts,\n lightMode: renderOpts.lightMode !== undefined ? renderOpts.lightMode : isLight(),\n color: color ?? (renderOpts as NoiseBackgroundOptions).color,\n });\n const buildGridOpts = (): GridBackgroundOptions => ({\n ...renderOpts,\n lightMode: renderOpts.lightMode !== undefined ? renderOpts.lightMode : isLight(),\n color: color ?? (renderOpts as GridBackgroundOptions).color,\n });\n const buildAuroraOpts = (): AuroraBackgroundOptions => ({\n ...renderOpts,\n lightMode: renderOpts.lightMode !== undefined ? renderOpts.lightMode : isLight(),\n color: color ?? (renderOpts as AuroraBackgroundOptions).color,\n });\n const buildSilkOpts = (): SilkBackgroundOptions => ({\n ...renderOpts,\n lightMode: renderOpts.lightMode !== undefined ? renderOpts.lightMode : isLight(),\n color: color ?? (renderOpts as SilkBackgroundOptions).color,\n });\n const buildVoidOpts = (): VoidBackgroundOptions => ({\n ...renderOpts,\n lightMode: renderOpts.lightMode !== undefined ? renderOpts.lightMode : isLight(),\n color: color ?? (renderOpts as VoidBackgroundOptions).color,\n });\n const buildMorphOpts = (): MorphBackgroundOptions => ({\n ...renderOpts,\n lightMode: renderOpts.lightMode !== undefined ? renderOpts.lightMode : isLight(),\n color: color ?? (renderOpts as MorphBackgroundOptions).color,\n });\n const buildFireOpts = (): FireBackgroundOptions => ({\n ...renderOpts,\n color: color ?? (renderOpts as FireBackgroundOptions).color,\n });\n const buildDnaOpts = (): DnaBackgroundOptions => ({\n ...renderOpts,\n color: color ?? (renderOpts as DnaBackgroundOptions).color,\n });\n const buildTerrainOpts = (): TerrainBackgroundOptions => ({\n ...renderOpts,\n color: color ?? (renderOpts as TerrainBackgroundOptions).color,\n lightMode: renderOpts.lightMode !== undefined ? renderOpts.lightMode : isLight(),\n });\n const buildCircuitOpts = (): CircuitBackgroundOptions => ({\n ...renderOpts,\n color: color ?? (renderOpts as CircuitBackgroundOptions).color,\n lightMode: renderOpts.lightMode !== undefined ? renderOpts.lightMode : isLight(),\n });\n\n const optsRef = { current: buildWaveOpts() as AnyRenderOpts };\n const rebuildOpts = () => {\n if (type === 'rain') optsRef.current = buildRainOpts();\n else if (type === 'stars') optsRef.current = buildStarsOpts();\n else if (type === 'pulse') optsRef.current = buildPulseOpts();\n else if (type === 'noise') optsRef.current = buildNoiseOpts();\n else if (type === 'grid') optsRef.current = buildGridOpts();\n else if (type === 'aurora') optsRef.current = buildAuroraOpts();\n else if (type === 'silk') optsRef.current = buildSilkOpts();\n else if (type === 'void') optsRef.current = buildVoidOpts();\n else if (type === 'morph') optsRef.current = buildMorphOpts();\n else if (type === 'fire') optsRef.current = buildFireOpts();\n else if (type === 'dna') optsRef.current = buildDnaOpts();\n else if (type === 'terrain') optsRef.current = buildTerrainOpts();\n else if (type === 'circuit') optsRef.current = buildCircuitOpts();\n else optsRef.current = buildWaveOpts();\n };\n rebuildOpts();\n\n const onSchemeChange = () => { rebuildOpts(); };\n if (colorScheme === 'auto') mq.addEventListener('change', onSchemeChange);\n\n const resize = () => {\n const r = container.getBoundingClientRect();\n canvas.width = r.width * dpr;\n canvas.height = r.height * dpr;\n ctx.setTransform(dpr, 0, 0, dpr, 0, 0);\n };\n resize();\n\n const onMouseMove = (e: MouseEvent) => {\n const r = container.getBoundingClientRect();\n mouse.x = (e.clientX - r.left) / r.width;\n mouse.y = (e.clientY - r.top) / r.height;\n };\n const ro = new ResizeObserver(resize);\n ro.observe(container);\n window.addEventListener('mousemove', onMouseMove);\n\n let time = 0;\n let raf = 0;\n const tick = () => {\n smoothMouse.x += (mouse.x - smoothMouse.x) * 0.07;\n smoothMouse.y += (mouse.y - smoothMouse.y) * 0.07;\n const r = container.getBoundingClientRect();\n\n if (type === 'rain') {\n renderRainBackground(ctx, r.width, r.height, time, optsRef.current as RainBackgroundOptions);\n } else if (type === 'stars') {\n renderStarsBackground(ctx, r.width, r.height, time, smoothMouse, optsRef.current as StarsBackgroundOptions);\n } else if (type === 'pulse') {\n renderPulseBackground(ctx, r.width, r.height, time, smoothMouse, optsRef.current as PulseBackgroundOptions);\n } else if (type === 'noise') {\n renderNoiseBackground(ctx, r.width, r.height, time, smoothMouse, optsRef.current as NoiseBackgroundOptions);\n } else if (type === 'grid') {\n renderGridBackground(ctx, r.width, r.height, time, smoothMouse, optsRef.current as GridBackgroundOptions);\n } else if (type === 'aurora') {\n renderAuroraBackground(ctx, r.width, r.height, time, smoothMouse, optsRef.current as AuroraBackgroundOptions);\n } else if (type === 'silk') {\n renderSilkBackground(ctx, r.width, r.height, time, optsRef.current as SilkBackgroundOptions);\n } else if (type === 'void') {\n renderVoidBackground(ctx, r.width, r.height, time, smoothMouse, optsRef.current as VoidBackgroundOptions);\n } else if (type === 'morph') {\n renderMorphBackground(ctx, r.width, r.height, time, optsRef.current as MorphBackgroundOptions);\n } else if (type === 'fire') {\n renderFireBackground(ctx, r.width, r.height, time, optsRef.current as FireBackgroundOptions);\n } else if (type === 'dna') {\n renderDnaBackground(ctx, r.width, r.height, time, optsRef.current as DnaBackgroundOptions);\n } else if (type === 'terrain') {\n renderTerrainBackground(ctx, r.width, r.height, time, optsRef.current as TerrainBackgroundOptions);\n } else if (type === 'circuit') {\n renderCircuitBackground(ctx, r.width, r.height, time, optsRef.current as CircuitBackgroundOptions);\n } else {\n renderWaveBackground(ctx, r.width, r.height, time, smoothMouse, optsRef.current as WaveBackgroundOptions);\n }\n\n time += 0.016;\n raf = requestAnimationFrame(tick);\n };\n raf = requestAnimationFrame(tick);\n\n return {\n destroy: () => {\n cancelAnimationFrame(raf);\n ro.disconnect();\n if (colorScheme === 'auto') mq.removeEventListener('change', onSchemeChange);\n window.removeEventListener('mousemove', onMouseMove);\n canvas.remove();\n container.style.position = prevPosition;\n },\n };\n}\n\n/** @deprecated Use `asciiBackground` instead. */\nexport const mountWaveBackground = asciiBackground;\n\n/** @deprecated Use `AsciiBackgroundOptions` instead. */\nexport type MountWaveOptions = AsciiBackgroundOptions;\n","/**\n * asciiText — pure string output (no canvas required).\n * Converts an image/video/canvas element to a plain-text ASCII string\n * suitable for server-side rendering, clipboard export, or terminal output.\n */\nimport type { AsciiOptions } from '../types';\nimport { DEFAULT_OPTIONS } from '../types';\nimport { imageToAsciiFrame } from './renderer';\n\n/**\n * Convert any image/video/canvas source to a plain multi-line string of ASCII.\n *\n * @example\n * ```ts\n * const text = asciiText(imgEl, { fontSize: 8, colorMode: 'grayscale' });\n * console.log(text);\n * ```\n *\n * @example SSR (Node/JSDOM)\n * ```ts\n * const { createCanvas, loadImage } = require('@napi-rs/canvas');\n * const img = await loadImage('./photo.jpg');\n * const canvas = createCanvas(img.width, img.height);\n * const ctx = canvas.getContext('2d');\n * ctx.drawImage(img, 0, 0);\n * const text = asciiText(canvas as unknown as HTMLCanvasElement, { fontSize: 10 });\n * ```\n */\nexport function asciiText(\n source: HTMLImageElement | HTMLVideoElement | HTMLCanvasElement,\n options: Partial<AsciiOptions> = {},\n targetWidth?: number,\n targetHeight?: number,\n): string {\n const opts: AsciiOptions = { ...DEFAULT_OPTIONS, ...options };\n const { frame, cols } = imageToAsciiFrame(source, opts, targetWidth, targetHeight);\n if (!frame.length || cols === 0) return '';\n\n const lines: string[] = [];\n for (const row of frame) {\n lines.push(row.map(cell => cell.char).join(''));\n }\n return lines.join('\\n');\n}\n\n/**\n * Convert any source to an ASCII string with ANSI 256-colour escape codes.\n * Works in any terminal that supports ANSI colours.\n *\n * @example\n * ```ts\n * process.stdout.write(asciiTextAnsi(imgEl, { fontSize: 8 }));\n * ```\n */\nexport function asciiTextAnsi(\n source: HTMLImageElement | HTMLVideoElement | HTMLCanvasElement,\n options: Partial<AsciiOptions> = {},\n targetWidth?: number,\n targetHeight?: number,\n): string {\n const opts: AsciiOptions = { ...DEFAULT_OPTIONS, ...options };\n const { frame, cols } = imageToAsciiFrame(source, opts, targetWidth, targetHeight);\n if (!frame.length || cols === 0) return '';\n\n const RESET = '\\x1b[0m';\n const lines: string[] = [];\n\n for (const row of frame) {\n let line = '';\n for (const cell of row) {\n if (cell.char === ' ' || cell.a < 10) {\n line += ' ';\n } else {\n // Truecolor ANSI: \\x1b[38;2;R;G;Bm\n line += `\\x1b[38;2;${cell.r};${cell.g};${cell.b}m${cell.char}${RESET}`;\n }\n }\n lines.push(line);\n }\n return lines.join('\\n');\n}\n","/**\n * record() — capture a rolling frame buffer from a running ASCII canvas\n * and export it as a downloadable animated GIF or WebP data URL.\n *\n * Usage:\n * ```ts\n * const recorder = createRecorder(canvasEl, { fps: 15, maxFrames: 120 });\n * recorder.start();\n * // ... after a few seconds ...\n * const dataUrl = await recorder.stop(); // 'data:image/gif;base64,...'\n * ```\n */\n\nexport interface RecorderOptions {\n /** Target capture frame rate (default: 15) */\n fps?: number;\n /** Maximum number of frames to buffer (default: 120 → 8 s at 15 fps) */\n maxFrames?: number;\n /**\n * Output format.\n * - 'gif' — animated GIF via gif.js worker (requires gif.worker.js in public/)\n * - 'webp' — animated WebP via MediaRecorder API (Chrome/Edge only)\n * - 'png-sequence' — returns a JSON array of PNG data URLs (universal)\n * Default: 'gif'\n */\n format?: 'gif' | 'webp' | 'png-sequence';\n /** GIF quality 1 (best) – 30 (smallest) — only used for format:'gif' (default: 10) */\n quality?: number;\n /**\n * Scale factor applied to the canvas before capture (default: 1).\n * Use 0.5 to halve dimensions and reduce file size.\n */\n scale?: number;\n}\n\nexport interface Recorder {\n /** Start capturing frames from the canvas. */\n start(): void;\n /**\n * Stop capturing and encode.\n * Resolves with a data URL (gif/webp) or JSON string (png-sequence).\n */\n stop(): Promise<string>;\n /** True while recording. */\n readonly isRecording: boolean;\n /** Number of frames captured so far. */\n readonly frameCount: number;\n}\n\n/**\n * Create a Recorder bound to a canvas element.\n */\nexport function createRecorder(\n canvas: HTMLCanvasElement,\n options: RecorderOptions = {},\n): Recorder {\n const {\n fps = 15,\n maxFrames = 120,\n format = 'gif',\n quality = 10,\n scale = 1,\n } = options;\n\n const interval = 1000 / fps;\n let recording = false;\n let timerId = -1;\n const blobs: string[] = []; // base64 PNG data URLs\n\n const captureFrame = () => {\n if (!recording || blobs.length >= maxFrames) return;\n let src: HTMLCanvasElement = canvas;\n if (scale !== 1) {\n const off = document.createElement('canvas');\n off.width = Math.round(canvas.width * scale);\n off.height = Math.round(canvas.height * scale);\n const offCtx = off.getContext('2d')!;\n offCtx.drawImage(canvas, 0, 0, off.width, off.height);\n src = off;\n }\n blobs.push(src.toDataURL('image/png'));\n };\n\n const encodeGif = async (frames: string[]): Promise<string> => {\n // gif.js must be loaded as a script in the page.\n // We use a dynamic import polyfill approach for the worker.\n return new Promise((resolve, reject) => {\n // @ts-ignore — GIF is a global injected by gif.js\n if (typeof GIF === 'undefined') {\n reject(new Error('[asciify recorder] gif.js not found. Add <script src=\"/gif.worker.js\"> to your page.'));\n return;\n }\n // @ts-ignore\n const gif = new GIF({\n workers: 2,\n quality,\n workerScript: '/gif.worker.js',\n });\n\n let loaded = 0;\n const total = frames.length;\n frames.forEach((dataUrl) => {\n const img = new Image();\n img.onload = () => {\n gif.addFrame(img, { delay: interval, copy: true });\n loaded++;\n if (loaded === total) gif.render();\n };\n img.src = dataUrl;\n });\n\n gif.on('finished', (blob: Blob) => {\n const reader = new FileReader();\n reader.onload = () => resolve(reader.result as string);\n reader.readAsDataURL(blob);\n });\n gif.on('error', reject);\n });\n };\n\n const encodeWebP = async (frames: string[], _fps: number): Promise<string> => {\n // Encode via canvas + MediaRecorder if available.\n if (typeof MediaRecorder === 'undefined') {\n throw new Error('[asciify recorder] MediaRecorder not available in this browser.');\n }\n const off = document.createElement('canvas');\n if (frames.length === 0) return '';\n const probe = new Image();\n await new Promise<void>((res) => { probe.onload = () => res(); probe.src = frames[0]; });\n off.width = probe.naturalWidth;\n off.height = probe.naturalHeight;\n const offCtx = off.getContext('2d')!;\n\n const stream = off.captureStream(_fps);\n const recorder = new MediaRecorder(stream, { mimeType: 'video/webm;codecs=vp9' });\n const chunks: BlobPart[] = [];\n recorder.ondataavailable = (e) => chunks.push(e.data);\n\n return new Promise((resolve, reject) => {\n recorder.onstop = () => {\n const blob = new Blob(chunks, { type: 'video/webm' });\n const reader = new FileReader();\n reader.onload = () => resolve(reader.result as string);\n reader.readAsDataURL(blob);\n };\n recorder.onerror = reject;\n recorder.start();\n\n let idx = 0;\n const drawNext = () => {\n if (idx >= frames.length) { recorder.stop(); return; }\n const img = new Image();\n img.onload = () => {\n offCtx.drawImage(img, 0, 0);\n idx++;\n setTimeout(drawNext, interval);\n };\n img.src = frames[idx];\n };\n drawNext();\n });\n };\n\n return {\n get isRecording() { return recording; },\n get frameCount() { return blobs.length; },\n\n start() {\n if (recording) return;\n blobs.length = 0;\n recording = true;\n timerId = window.setInterval(captureFrame, interval);\n },\n\n async stop(): Promise<string> {\n if (!recording) return '';\n recording = false;\n clearInterval(timerId);\n\n const frames = blobs.slice();\n\n if (format === 'png-sequence') {\n return JSON.stringify(frames);\n }\n if (format === 'webp') {\n return encodeWebP(frames, fps);\n }\n // default: gif\n return encodeGif(frames);\n },\n };\n}\n\n/**\n * Convenience: record for a fixed duration and auto-download.\n *\n * @example\n * ```ts\n * await recordAndDownload(canvasEl, 3000, { fps: 15, format: 'gif' });\n * ```\n */\nexport async function recordAndDownload(\n canvas: HTMLCanvasElement,\n durationMs: number,\n options: RecorderOptions & { filename?: string } = {},\n): Promise<void> {\n const { filename = 'asciify-recording', ...recOpts } = options;\n const recorder = createRecorder(canvas, recOpts);\n recorder.start();\n await new Promise<void>((res) => setTimeout(res, durationMs));\n const dataUrl = await recorder.stop();\n\n const ext = options.format === 'webp' ? 'webm'\n : options.format === 'png-sequence' ? 'json'\n : 'gif';\n const a = document.createElement('a');\n a.href = dataUrl;\n a.download = `${filename}.${ext}`;\n a.click();\n}\n","// ─── Asciify WebGL Renderer ───────────────────────────────────────\n// GPU-accelerated drop-in replacement for renderFrameToCanvas.\n// All cells rendered in ONE instanced draw call per frame.\n// Animation + hover effects computed entirely in GLSL shaders.\n// No glyph atlas — uses solid rect/dots per cell (matches Canvas2D fillRect fast path).\n// Falls back gracefully to null if WebGL2 is unavailable.\n\nimport type { AsciiFrame, AsciiOptions } from './types';\n\n// ─── Types ────────────────────────────────────────────────────────\n\nexport interface WebGLRenderer {\n render(\n frame: AsciiFrame,\n options: AsciiOptions,\n displayW: number,\n displayH: number,\n time: number,\n hoverPos?: { x: number; y: number; intensity?: number } | null\n ): void;\n /** Call when options or the source frame has changed to invalidate cell data cache. */\n notifyDirty(): void;\n destroy(): void;\n}\n\n// ─── Vertex Shader ────────────────────────────────────────────────\n// One instance = one cell. Position, animation, hover, color all computed on GPU.\n// Cell data arrives as a single RGBA8 texture:\n// .rgb = cell color (normalized 0-1)\n// .a = char weight (0=space/invisible … 1=densest char, fully opaque)\n\nconst VERT_SRC = /* glsl */`#version 300 es\nprecision highp float;\nprecision highp int;\n\n// Unit quad corners: (-0.5,-0.5) to (0.5,0.5) - TRIANGLE_STRIP, 4 verts\nin vec2 a_corner;\n\n// Layout\nuniform vec2 u_canvasSize;\nuniform vec2 u_gridSize;\nuniform vec2 u_cellSize;\n\n// Animation\nuniform float u_time;\nuniform float u_animSpeed;\nuniform int u_animStyle;\n\n// Color\nuniform int u_colorMode;\nuniform vec3 u_accentColor;\nuniform int u_invert;\n\n// Hover\nuniform float u_hoverStrength;\nuniform float u_hoverIntensity;\nuniform vec2 u_hoverPos;\nuniform float u_hoverRadius;\nuniform int u_hoverEffect;\nuniform vec3 u_hoverColor;\n\n// Render mode: 0=rect 1=dots\nuniform int u_renderMode;\nuniform float u_dotSizeRatio;\n\n// Cell data: RGBA8 texture (cols x rows)\n// rgb = cell colour, a = source alpha\nuniform sampler2D u_cellTex;\n\nout vec4 v_color;\nout float v_alpha;\nout vec2 v_localUv;\n\n#define PI 3.141592653589793\n\nfloat ss(float t) { return t * t * (3.0 - 2.0 * t); }\n\nfloat getAnim(float nx, float ny, float cx, float cy, float t) {\n if (u_animStyle == 0) return 1.0;\n if (u_animStyle == 1) { // wave\n return 0.3 + 0.7 * (sin(nx * PI * 4.0 + t * 3.0) * 0.3 + 0.5\n + sin(ny * PI * 3.0 + t * 2.0) * 0.2);\n }\n if (u_animStyle == 2) { // pulse\n float d = length(vec2(nx - 0.5, ny - 0.5)) * 1.41421;\n return 0.2 + 0.8 * (sin(d * PI * 6.0 - t * 4.0) * 0.5 + 0.5);\n }\n if (u_animStyle == 3) { // rain\n float drop = sin(ny * PI * 8.0 - t * 5.0 + cx * 0.3) * 0.5 + 0.5;\n return 0.1 + 0.9 * drop * (sin(nx * PI * 2.0 + t) * 0.3 + 0.7);\n }\n if (u_animStyle == 4) { // breathe\n return clamp(sin(t * 2.0) * 0.3 + 0.7 + sin((cx + cy) * 0.1 + t) * 0.1, 0.1, 1.0);\n }\n if (u_animStyle == 5) { // sparkle\n float sp = fract(sin(cx * 127.1 + cy * 311.7 + floor(t * 8.0) * 43758.5453) * 43758.5453);\n return sp > 0.7 ? 1.0 : 0.15 + sp * 0.4;\n }\n if (u_animStyle == 6) { // glitch\n float band = floor(cy / max(1.0, u_gridSize.y * 0.05));\n float gv = fract(sin(band * 43.23 + floor(t * 6.0) * 17.89) * 43758.5453);\n if (gv > 0.85) { float fl = sin(t * 30.0 + band) * 0.5 + 0.5; return fl < 0.3 ? 0.0 : fl; }\n return 1.0;\n }\n if (u_animStyle == 7) { // spiral\n float angle = atan(ny - 0.5, nx - 0.5);\n float dist = length(vec2(nx - 0.5, ny - 0.5)) * 1.41421;\n return 0.15 + 0.85 * (sin(angle * 3.0 + dist * PI * 8.0 - t * 3.0) * 0.5 + 0.5);\n }\n if (u_animStyle == 8) { // typewriter\n float reveal = fract(t * 0.5) * u_gridSize.x * u_gridSize.y * 1.3;\n float dist = cy * u_gridSize.x + cx - reveal;\n if (dist > 0.0) return 0.0;\n return clamp(1.0 + dist / (u_gridSize.x * u_gridSize.y * 0.15), 0.0, 1.0);\n }\n if (u_animStyle == 9) { // scatter\n float d = length(vec2(nx - 0.5, ny - 0.5)) * 1.41421;\n float phase = sin(t * 1.5) * 0.5 + 0.5;\n if (d > phase) return max(0.0, 1.0 - (d - phase) * 3.0);\n return 0.7 + 0.3 * sin(d * 10.0 - t * 2.0);\n }\n return 1.0;\n}\n\nvec3 applyColorMode(vec3 rgb) {\n float lum = dot(rgb, vec3(0.299, 0.587, 0.114));\n if (u_colorMode == 0) return vec3(lum);\n if (u_colorMode == 2) return vec3(0.0, lum, 0.0);\n if (u_colorMode == 3) return lum * u_accentColor;\n return rgb;\n}\n\nvoid main() {\n int cols = int(u_gridSize.x);\n int rows = int(u_gridSize.y);\n int cx = gl_InstanceID % cols;\n int cy = gl_InstanceID / cols;\n\n float fnx = (float(cx) + 0.5) / float(cols);\n float fny = (float(cy) + 0.5) / float(rows);\n\n // Sample cell data\n vec4 cell = texture(u_cellTex, vec2(fnx, fny));\n // cell.rgb = colour, cell.a = source alpha (0=transparent, 1=opaque)\n\n // Invisible cells (fully transparent source pixel)\n if (cell.a < 0.004) {\n gl_Position = vec4(2.0, 2.0, 0.0, 1.0); v_alpha = 0.0; return;\n }\n\n // Char weight: 0=dark/space .. 1=dense/bright (luminance, matches luminanceToChar ordering)\n float charW = dot(cell.rgb, vec3(0.299, 0.587, 0.114));\n\n float cellW = u_cellSize.x;\n float cellH = u_cellSize.y;\n\n // Animation\n float t = u_time * u_animSpeed;\n float am = getAnim(fnx, fny, float(cx), float(cy), t);\n if (am < 0.04) {\n gl_Position = vec4(2.0, 2.0, 0.0, 1.0); v_alpha = 0.0; return;\n }\n\n // Hover\n float hoverScale = 1.0;\n vec2 hoverOff = vec2(0.0);\n float hoverGlow = 0.0;\n float hoverBlend = 0.0;\n\n if (u_hoverStrength > 0.0 && u_hoverIntensity > 0.005) {\n vec2 d = vec2(fnx - u_hoverPos.x, fny - u_hoverPos.y);\n float r = 0.08 + u_hoverRadius * 0.35 + u_hoverStrength * 0.04;\n float dist = length(d);\n if (dist < r) {\n float tv = 1.0 - dist / r;\n float e = ss(tv) * u_hoverIntensity;\n if (u_hoverEffect == 0) { // spotlight\n hoverScale = 1.0 + e * u_hoverStrength * 1.8;\n float ang = atan(d.y, d.x);\n hoverOff = vec2(cos(ang), sin(ang)) * e * e * u_hoverStrength * 0.6 * vec2(cellW, cellH);\n hoverGlow = e * u_hoverStrength * 0.4;\n hoverBlend = e * e * u_hoverStrength * 0.25;\n } else if (u_hoverEffect == 1) { // magnify\n hoverScale = 1.0 + e * u_hoverStrength * 2.5;\n hoverGlow = e * u_hoverStrength * 0.15;\n } else if (u_hoverEffect == 2) { // repel\n hoverScale = 1.0 + e * u_hoverStrength * 0.3;\n float ang = atan(d.y, d.x);\n hoverOff = vec2(cos(ang), sin(ang)) * e * e * u_hoverStrength * 1.2 * vec2(cellW, cellH);\n } else if (u_hoverEffect == 3) { // glow\n hoverGlow = e * u_hoverStrength * 0.8;\n hoverBlend = e * u_hoverStrength * 0.4;\n } else { // colorShift\n hoverScale = 1.0 + e * u_hoverStrength * 0.4;\n hoverGlow = e * u_hoverStrength * 0.2;\n hoverBlend = e * u_hoverStrength * 0.7;\n }\n }\n }\n\n // Final colour\n vec3 rgb = (u_invert == 1) ? (1.0 - cell.rgb) : cell.rgb;\n vec3 baseColor = applyColorMode(rgb);\n v_color = vec4(mix(baseColor, u_hoverColor, hoverBlend), 1.0);\n\n // Quad size & alpha\n vec2 quadSize;\n float finalAlpha;\n\n if (u_renderMode == 1) { // dots: radius driven by char weight (bright=big dot)\n float maxR = min(cellW, cellH) * 0.5 * u_dotSizeRatio;\n float radius = maxR * charW * am * hoverScale;\n if (radius < 0.3) { gl_Position = vec4(2.0, 2.0, 0.0, 1.0); v_alpha = 0.0; return; }\n quadSize = vec2(radius * 2.0);\n finalAlpha = min(1.0, cell.a * am * (1.0 + hoverGlow));\n } else { // rect: size proportional to luminance — dark=tiny, bright=full (ASCII density look)\n if (charW < 0.01) { gl_Position = vec4(2.0, 2.0, 0.0, 1.0); v_alpha = 0.0; return; }\n quadSize = vec2(cellW * charW * hoverScale, cellH * charW * hoverScale);\n finalAlpha = min(1.0, am * (1.0 + hoverGlow));\n }\n\n v_alpha = finalAlpha;\n v_localUv = a_corner;\n\n // NDC position (Y flipped: WebGL bottom-up, canvas top-down)\n float px = float(cx) * cellW + cellW * 0.5 + hoverOff.x;\n float py = float(cy) * cellH + cellH * 0.5 + hoverOff.y;\n vec2 pos = vec2(px, py) + a_corner * quadSize;\n vec2 ndc = pos / u_canvasSize * 2.0 - 1.0;\n ndc.y = -ndc.y;\n gl_Position = vec4(ndc, 0.0, 1.0);\n}\n`;\n\n// ─── Fragment Shader ──────────────────────────────────────────────\n\nconst FRAG_SRC = /* glsl */`#version 300 es\nprecision mediump float;\nprecision highp int;\n\nin vec4 v_color;\nin float v_alpha;\nin vec2 v_localUv;\n\nuniform int u_renderMode;\n\nout vec4 outColor;\n\nvoid main() {\n if (v_alpha < 0.01) discard;\n if (u_renderMode == 1) {\n // Dots: circle SDF clip\n if (length(v_localUv) > 0.5) discard;\n }\n outColor = vec4(v_color.rgb, v_alpha);\n}\n`;\n\n// ─── WebGL Helpers ────────────────────────────────────────────────\n\nfunction compileShader(gl: WebGL2RenderingContext, type: number, src: string): WebGLShader {\n const sh = gl.createShader(type)!;\n gl.shaderSource(sh, src);\n gl.compileShader(sh);\n if (!gl.getShaderParameter(sh, gl.COMPILE_STATUS)) {\n const info = gl.getShaderInfoLog(sh) ?? 'unknown';\n gl.deleteShader(sh);\n throw new Error(`Shader compile error: ${info}`);\n }\n return sh;\n}\n\nfunction linkProgram(gl: WebGL2RenderingContext, vert: WebGLShader, frag: WebGLShader): WebGLProgram {\n const prog = gl.createProgram()!;\n gl.attachShader(prog, vert);\n gl.attachShader(prog, frag);\n gl.linkProgram(prog);\n if (!gl.getProgramParameter(prog, gl.LINK_STATUS)) {\n const info = gl.getProgramInfoLog(prog) ?? 'unknown';\n gl.deleteProgram(prog);\n throw new Error(`Program link error: ${info}`);\n }\n return prog;\n}\n\nfunction makeTexture(gl: WebGL2RenderingContext, filter: number = gl.NEAREST): WebGLTexture {\n const t = gl.createTexture()!;\n gl.bindTexture(gl.TEXTURE_2D, t);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, filter);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, filter);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n return t;\n}\n\n// ─── Animation / color / hover index maps ────────────────────────\nconst ANIM_STYLES = ['none','wave','pulse','rain','breathe','sparkle','glitch','spiral','typewriter','scatter','waveField','ripple','melt','orbit','cellular'] as const;\nconst HOVER_EFFECTS = ['spotlight','magnify','repel','glow','colorShift','attract','shatter','trail'] as const;\nconst COLOR_MODES = ['grayscale','fullcolor','matrix','accent'] as const;\n\n// ─── Main Factory ─────────────────────────────────────────────────\n\n/**\n * Try to create a WebGL2 renderer for the given canvas.\n * Returns null if WebGL2 is unavailable (caller can then use Canvas2D).\n * On setup failure after context is claimed, returns a stub that clears to dark.\n */\nexport function tryCreateWebGLRenderer(canvas: HTMLCanvasElement): WebGLRenderer | null {\n const glOrNull = canvas.getContext('webgl2', {\n alpha: true,\n antialias: false,\n premultipliedAlpha: false,\n preserveDrawingBuffer: false,\n }) as WebGL2RenderingContext | null;\n\n if (!glOrNull) return null;\n const gl: WebGL2RenderingContext = glOrNull; // non-null, stable in closures\n\n try {\n // ─── Compile shaders ─────────────────────────────────────────\n const vert = compileShader(gl, gl.VERTEX_SHADER, VERT_SRC);\n const frag = compileShader(gl, gl.FRAGMENT_SHADER, FRAG_SRC);\n const prog = linkProgram(gl, vert, frag);\n gl.deleteShader(vert);\n gl.deleteShader(frag);\n\n // ─── VAO: unit quad (TRIANGLE_STRIP, 4 vertices) ─────────────\n const vao = gl.createVertexArray()!;\n gl.bindVertexArray(vao);\n\n const corners = new Float32Array([-0.5,-0.5, 0.5,-0.5, -0.5,0.5, 0.5,0.5]);\n const vbo = gl.createBuffer()!;\n gl.bindBuffer(gl.ARRAY_BUFFER, vbo);\n gl.bufferData(gl.ARRAY_BUFFER, corners, gl.STATIC_DRAW);\n\n const aCorner = gl.getAttribLocation(prog, 'a_corner');\n gl.enableVertexAttribArray(aCorner);\n gl.vertexAttribPointer(aCorner, 2, gl.FLOAT, false, 0, 0);\n\n gl.bindVertexArray(null);\n\n // ─── Single cell data texture (RGBA8: rgb=colour, a=charWeight 0-255) ─\n const cellTex = makeTexture(gl);\n\n // ─── Cached uniform locations ─────────────────────────────────\n const g = (n: string) => gl.getUniformLocation(prog, n)!;\n const u = {\n canvasSize: g('u_canvasSize'),\n gridSize: g('u_gridSize'),\n cellSize: g('u_cellSize'),\n time: g('u_time'),\n animSpeed: g('u_animSpeed'),\n animStyle: g('u_animStyle'),\n colorMode: g('u_colorMode'),\n accentColor: g('u_accentColor'),\n invert: g('u_invert'),\n hoverStrength: g('u_hoverStrength'),\n hoverIntensity:g('u_hoverIntensity'),\n hoverPos: g('u_hoverPos'),\n hoverRadius: g('u_hoverRadius'),\n hoverEffect: g('u_hoverEffect'),\n hoverColor: g('u_hoverColor'),\n renderMode: g('u_renderMode'),\n dotSizeRatio: g('u_dotSizeRatio'),\n cellTexU: g('u_cellTex'),\n };\n\n // ─── State ────────────────────────────────────────────────────\n let lastCols = 0;\n let lastRows = 0;\n let cellBuf = new Uint8Array(0); // rgba: rgb=colour, a=sourceAlpha\n let cellDataDirty = true;\n\n gl.enable(gl.BLEND);\n gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);\n\n // ─── Render ───────────────────────────────────────────────────\n function render(\n frame: AsciiFrame,\n options: AsciiOptions,\n displayW: number,\n displayH: number,\n time: number,\n hoverPos?: { x: number; y: number; intensity?: number } | null\n ): void {\n const rows = frame.length;\n if (rows === 0) return;\n const cols = frame[0].length;\n if (cols === 0) return;\n\n gl.viewport(0, 0, gl.canvas.width, gl.canvas.height);\n\n // Clear to dark or transparent based on source alpha\n let hasTransparency = false;\n const sy = Math.max(1, rows >> 2), sx = Math.max(1, cols >> 2);\n outer: for (let iy = 0; iy < rows; iy += sy)\n for (let ix = 0; ix < cols; ix += sx)\n if (frame[iy][ix].a < 200) { hasTransparency = true; break outer; }\n gl.clearColor(hasTransparency ? 0 : 0.0392,\n hasTransparency ? 0 : 0.0392,\n hasTransparency ? 0 : 0.0392,\n hasTransparency ? 0 : 1.0);\n gl.clear(gl.COLOR_BUFFER_BIT);\n\n // Re-allocate cell buffer when grid changes\n if (cols !== lastCols || rows !== lastRows) {\n cellBuf = new Uint8Array(cols * rows * 4);\n lastCols = cols;\n lastRows = rows;\n cellDataDirty = true;\n }\n\n // Upload cell data (rgb = colour, a = char weight 0-255)\n if (cellDataDirty) {\n for (let y = 0; y < rows; y++) {\n const row = frame[y];\n for (let x = 0; x < cols; x++) {\n const cell = row[x];\n const i = (y * cols + x) * 4;\n cellBuf[i] = cell.r;\n cellBuf[i + 1] = cell.g;\n cellBuf[i + 2] = cell.b;\n // alpha channel = source alpha (used for transparency masking in shader)\n cellBuf[i + 3] = cell.a;\n }\n }\n gl.activeTexture(gl.TEXTURE0);\n gl.bindTexture(gl.TEXTURE_2D, cellTex);\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, cols, rows, 0,\n gl.RGBA, gl.UNSIGNED_BYTE, cellBuf);\n cellDataDirty = false;\n }\n\n gl.activeTexture(gl.TEXTURE0);\n gl.bindTexture(gl.TEXTURE_2D, cellTex);\n\n gl.useProgram(prog);\n gl.bindVertexArray(vao);\n\n const cellW = displayW / cols;\n const cellH = displayH / rows;\n\n gl.uniform2f(u.canvasSize, displayW, displayH);\n gl.uniform2f(u.gridSize, cols, rows);\n gl.uniform2f(u.cellSize, cellW, cellH);\n gl.uniform1f(u.time, time);\n gl.uniform1f(u.animSpeed, options.animationSpeed);\n gl.uniform1i(u.animStyle, ANIM_STYLES.indexOf(options.animationStyle));\n gl.uniform1i(u.colorMode, COLOR_MODES.indexOf(options.colorMode));\n\n const acHex = (options.accentColor || '#ffffff').replace('#', '');\n gl.uniform3f(u.accentColor,\n parseInt(acHex.slice(0, 2), 16) / 255,\n parseInt(acHex.slice(2, 4), 16) / 255,\n parseInt(acHex.slice(4, 6), 16) / 255);\n gl.uniform1i(u.invert, options.invert ? 1 : 0);\n\n const totalCells = rows * cols;\n const animActive = options.animationStyle !== 'none';\n const suppressHover = animActive && totalCells > 5_000;\n const hoverActive = !suppressHover && !!hoverPos && options.hoverStrength > 0;\n const radiusScale = totalCells > 30_000 ? 0.25\n : totalCells > 15_000 ? 0.4\n : totalCells > 5_000 ? 0.6 : 1;\n\n gl.uniform1f(u.hoverStrength, hoverActive ? options.hoverStrength : 0);\n gl.uniform1f(u.hoverIntensity, hoverActive ? (hoverPos?.intensity ?? 0) : 0);\n gl.uniform2f(u.hoverPos, hoverPos?.x ?? 0.5, hoverPos?.y ?? 0.5);\n gl.uniform1f(u.hoverRadius, options.hoverRadius * radiusScale);\n gl.uniform1i(u.hoverEffect, HOVER_EFFECTS.indexOf(options.hoverEffect));\n const hc = options.hoverColor || '#ffffff';\n gl.uniform3f(u.hoverColor,\n parseInt(hc.slice(1, 3), 16) / 255,\n parseInt(hc.slice(3, 5), 16) / 255,\n parseInt(hc.slice(5, 7), 16) / 255);\n\n gl.uniform1i(u.renderMode, options.renderMode === 'dots' ? 1 : 0);\n gl.uniform1f(u.dotSizeRatio, options.dotSizeRatio);\n gl.uniform1i(u.cellTexU, 0);\n\n gl.drawArraysInstanced(gl.TRIANGLE_STRIP, 0, 4, cols * rows);\n gl.bindVertexArray(null);\n }\n\n return {\n render,\n notifyDirty() { cellDataDirty = true; },\n destroy() {\n gl.deleteProgram(prog);\n gl.deleteVertexArray(vao);\n gl.deleteBuffer(vbo);\n gl.deleteTexture(cellTex);\n },\n };\n\n } catch (err) {\n console.error('[asciify] WebGL renderer setup FAILED (returning stub):', err);\n const stub: WebGLRenderer = {\n render() {\n try { gl.clearColor(0.039, 0.039, 0.039, 1); gl.clear(gl.COLOR_BUFFER_BIT); } catch { /* */ }\n },\n notifyDirty() {},\n destroy() {},\n };\n return stub;\n }\n}\n"]}
|