asciify-engine 1.0.4 → 1.0.5

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/types.ts","../src/ascii-engine.ts","../src/webgl-engine.ts"],"names":["parseGIF","decompressFrames","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';\nexport type ArtStyle = 'classic' | 'particles' | 'letters' | 'claudeCode' | 'art' | 'terminal' | 'box' | 'lines';\nexport type HoverEffect = 'spotlight' | 'magnify' | 'repel' | 'glow' | 'colorShift';\nexport type HoverPreset = 'none' | 'subtle' | 'flashlight' | 'magnifier' | 'forceField' | 'neon' | 'fire' | 'ice';\nexport type SourceType = 'image' | 'video' | 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} 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};\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};\n","// ─── Asciify Engine ───────────────────────────────────────────────\n// Framework-agnostic. Pure TypeScript.\n// Converts image/video/GIF pixel data to ASCII character grids.\n// Supports: ASCII text mode, Dots mode, Animation effects, Transparency.\n\nimport type { AsciiOptions, AsciiCell, AsciiFrame, AnimationStyle, ArtStyle } from './types';\nimport { DEFAULT_OPTIONS, ART_STYLE_PRESETS } from './types';\nimport { parseGIF, decompressFrames } from 'gifuct-js';\n\n/**\n * Create an offscreen canvas for pixel sampling.\n */\nfunction 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/**\n * Apply brightness and contrast adjustments to a luminance value.\n */\nfunction 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\n/**\n * Map a luminance value (0-255) to a character from the charset.\n */\nfunction luminanceToChar(lum: number, charset: string, invert: boolean): string {\n const normalized = invert ? 1 - lum / 255 : lum / 255;\n const index = Math.floor(normalized * (charset.length - 1));\n return charset[Math.max(0, Math.min(charset.length - 1, index))];\n}\n\n/**\n * Map a cell position to a character from custom text, tiled across the image.\n * Only shows characters where brightness is above a threshold; otherwise space.\n * This makes the custom text readable as a repeating pattern across the image.\n */\nfunction 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 // Below threshold → space (dark/empty areas stay blank)\n if (normalized < 0.12) return ' ';\n // Tile the full text across positions so it reads naturally left-to-right\n const pos = y * cols + x;\n return text[pos % text.length];\n}\n\n/**\n * Simple ordered-dither noise based on Bayer 4x4 matrix.\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];\n\n// ─── Pre-computed Color LUTs ───\n// Avoid per-cell string allocation for grayscale and matrix modes.\nconst _GRAY_LUT: string[] = new Array(256);\nconst _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// ─── Cached Hover Glow Sprite ───\n// Avoids createRadialGradient() every frame.\nlet _glowCache: { canvas: HTMLCanvasElement; size: number; r: number; g: number; b: number } | null = null;\n\n// @ts-ignore: reserved for future hover-glow feature\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nfunction _getGlowSprite(radius: number, r: number, g: number, b: number): HTMLCanvasElement {\n const size = Math.ceil(radius / 4) * 4; // quantize to reduce cache misses\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\nfunction 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/**\n * Resolve a cell's fill color as a string — uses LUT for grayscale/matrix.\n * colorMode is passed directly to avoid per-cell object property lookup.\n */\nfunction 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\n/**\n * Resolve a cell's fill color as numeric [r, g, b] — avoids string allocation.\n * Uses the shared _colorRGB array to avoid per-call allocation.\n * colorMode passed directly to avoid per-cell object property lookup.\n */\nconst _colorRGB = [0, 0, 0];\nfunction 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/**\n * Get animation multiplier for a cell based on animation style.\n * Returns a value between 0 and 1 that modulates the cell's visibility/size.\n */\nfunction 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 // Random-looking sparkle using pseudo-random hash\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 // Horizontal glitch bands that shift randomly\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 // This band glitches — offset or blank\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 // Reveals characters left-to-right, top-to-bottom in a looping sweep\n const totalCells = cols * rows;\n const cellIndex = y * cols + x;\n const progress = ((t * 0.5) % 1); // 0-1 sweep\n const revealPoint = progress * totalCells * 1.3; // overshoot for full coverage\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 // Particles scatter outward from center then reform\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; // 0-1 oscillation\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 default:\n return 1;\n }\n}\n\n/**\n * Convert an image element or canvas to a single ASCII frame.\n * Now reads alpha channel for transparency support.\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]; // Alpha channel\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 * Uses gifuct-js to parse and decompress GIF frames, then composites\n * them onto a canvas (handling disposal methods) to produce full frames.\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\n // Use the full GIF logical screen size for compositing\n const logicalW = gif.lsd?.width || gifW;\n const logicalH = gif.lsd?.height || gifH;\n\n // Compositing canvas (full GIF size)\n const compCanvas = document.createElement('canvas');\n compCanvas.width = logicalW;\n compCanvas.height = logicalH;\n const compCtx = compCanvas.getContext('2d')!;\n\n // Previous frame canvas for restore-to-previous disposal\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 // Calculate average delay to determine FPS\n let totalDelay = 0;\n for (const f of rawFrames) {\n totalDelay += (f.delay || 100);\n }\n const avgDelay = totalDelay / rawFrames.length;\n const fps = Math.round(Math.min(30, Math.max(5, 1000 / avgDelay)));\n\n // Limit frames to avoid memory issues (cap at ~300 frames)\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 // Save state before drawing (for disposal type 3 = restore to previous)\n if (disposalType === 3) {\n prevCtx.clearRect(0, 0, logicalW, logicalH);\n prevCtx.drawImage(compCanvas, 0, 0);\n }\n\n // Create ImageData for this frame's patch\n const frameImageData = new ImageData(patch, 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 // Draw patch onto compositing canvas at the correct position\n compCtx.drawImage(tempCanvas, dims.left || 0, dims.top || 0);\n\n // Now sample the composited canvas\n const result = imageToAsciiFrame(compCanvas, options, targetWidth, targetHeight);\n frames.push(result.frame);\n cols = result.cols;\n rows = result.rows;\n\n // Handle disposal\n if (disposalType === 2) {\n // Dispose to background (clear the patch area)\n compCtx.clearRect(dims.left || 0, dims.top || 0, dims.width, dims.height);\n } else if (disposalType === 3) {\n // Restore to previous\n compCtx.clearRect(0, 0, logicalW, logicalH);\n compCtx.drawImage(prevCanvas, 0, 0);\n }\n // disposalType 0 or 1 = leave as is (do nothing)\n\n onProgress?.((i + 1) / maxFrames);\n }\n\n return { frames, cols, rows, fps };\n}\n\n/**\n * Smoothstep easing for premium falloff curves.\n */\nfunction smoothstep(t: number): number {\n return t * t * (3 - 2 * t);\n}\n\n/**\n * Compute premium hover effects for a cell — writes results into\n * the reusable _hoverResult object to avoid per-cell allocation.\n * Uses the HoverEffect mode to vary the behaviour.\n */\nconst _hoverResult = { scale: 1, offsetX: 0, offsetY: 0, glow: 0, colorBlend: 0, proximity: 0 };\n\nfunction 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: import('./types').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 // Dynamic radius — radiusFactor (0-1) maps to visual influence area\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 }\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/**\n * Render an ASCII frame to a canvas context.\n * Supports both ASCII text mode and Dots mode.\n * Always renders every cell at full quality.\n *\n * Performance strategy:\n * - fillRect fast path for sub-6px text (30x faster than fillText)\n * - Auto-scaling hover radius: at high cell counts, the hover area\n * is proportionally smaller so fewer cells compute hover effects\n * - Hover bounding box early-exit skips cells outside the hover zone\n *\n * @param time - elapsed time in seconds for animation effects\n * @param hoverPos - optional smoothed mouse position {x, y, intensity} for hover effect\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 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 // Quick transparency check — sparse sample\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 // When animation is active at high cell counts, disable hover to keep FPS up.\n // Animation already re-renders every cell every frame (expensive trig per cell);\n // adding hover on top doubles the math for cells in the hover zone.\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 // Parse hover color once\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 // Pre-parse accent color once\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 // Auto-scale hover radius based on cell count for consistent performance.\n // At high cell counts the user's radius slider value is scaled down so the\n // hover zone stays a reasonable size (fewer cells to compute effects for).\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 // Pre-compute hover bounding box in grid coords for early-exit\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 // Cache options lookups outside the inner loop\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 // Track last canvas state to skip redundant calls\n let lastFillStyle = '';\n let lastAlpha = -1;\n\n if (options.renderMode === 'dots') {\n // ─── Dots Render Mode ───\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 // ─── Hover Effect ───\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 // Compute fill color\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 // ─── ASCII Text Render Mode ───\n const charAspect = 0.55;\n const fontSize = Math.min(cellW / charAspect, cellH) * 0.9;\n\n // Below 6px, characters are illegible — use fast fillRect with weight modulation\n // This turns 30K slow fillText calls into fast fillRect calls (30x speedup)\n const useFastRect = fontSize < 6;\n\n if (!useFastRect) {\n ctx.font = `${fontSize}px \"JetBrains Mono\", monospace`;\n ctx.textAlign = 'center';\n ctx.textBaseline = 'middle';\n }\n\n // Pre-build character weight map for fillRect mode\n // Maps each charset char to its visual density (0.1 – 1.0)\n let charWeights: Record<string, number> | null = null;\n if (useFastRect) {\n charWeights = {};\n const cs = options.charset;\n const csLen = cs.length;\n for (let i = 0; i < csLen; i++) {\n charWeights[cs[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 // ─── Hover Effect ───\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 // ─── Fast fillRect path (sub-6px text) ───\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 // ─── Standard fillText path ───\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/**\n * Serialize a frame's cell data compactly for embed use.\n * Returns: [{r,g,b,a,c},...] per row — c = char code for ascii, omitted for dots\n */\nfunction serializeFrame(frame: AsciiFrame, includeChars: boolean): unknown[][] {\n return frame.map(row => row.map(cell => {\n const obj: Record<string, number> = { r: cell.r, g: cell.g, b: cell.b, a: cell.a };\n if (includeChars) obj.c = cell.char.charCodeAt(0);\n else obj.l = Math.round(0.299 * cell.r + 0.587 * cell.g + 0.114 * cell.b);\n return obj;\n }));\n}\n\n/**\n * Build the animation multiplier function as an inlined JS string\n * matching the engine's getAnimationMultiplier.\n */\nfunction buildAnimFnJS(style: AnimationStyle, speed: number): string {\n if (style === 'none') return 'function(){return 1}';\n return `function(x,y,cols,rows,t){\n var s=${speed},T=t*s;\n ${style === 'wave' ? `var w=Math.sin(x/cols*Math.PI*4+T*3)*.5+.5,w2=Math.sin(y/rows*Math.PI*3+T*2)*.5+.5;return .3+.7*(w*.6+w2*.4);` : ''}${style === 'pulse' ? `var cx=cols/2,cy=rows/2,d=Math.sqrt((x-cx)*(x-cx)+(y-cy)*(y-cy)),m=Math.sqrt(cx*cx+cy*cy);return .2+.8*(Math.sin(d/m*Math.PI*6-T*4)*.5+.5);` : ''}${style === 'rain' ? `return .1+.9*(Math.sin(y/rows*Math.PI*8-T*5+x*.3)*.5+.5)*(Math.sin(x/cols*Math.PI*2+T)*.3+.7);` : ''}${style === 'breathe' ? `return Math.max(.1,Math.min(1,Math.sin(T*2)*.3+.7+Math.sin((x+y)*.1+T)*.1));` : ''}${style === 'sparkle' ? `var h=Math.sin(x*127.1+y*311.7+Math.floor(T*8)*43758.5453)*43758.5453;var sp=h-Math.floor(h);return sp>.7?1:.15+sp*.4;` : ''}${style === 'glitch' ? `var b=Math.floor(y/(rows*.05)),gh=Math.sin(b*43.23+Math.floor(T*6)*17.89)*43758.5453,gv=gh-Math.floor(gh);if(gv>.85){var fl=Math.sin(T*30+b)*.5+.5;return fl<.3?0:fl}return 1;` : ''}${style === 'spiral' ? `var cx=cols/2,cy=rows/2,dx=x-cx,dy=y-cy,a=Math.atan2(dy,dx),d=Math.sqrt(dx*dx+dy*dy),m=Math.sqrt(cx*cx+cy*cy);return .15+.85*(Math.sin(a*3+d/m*Math.PI*8-T*3)*.5+.5);` : ''}${style === 'typewriter' ? `var tc=cols*rows,ci=y*cols+x,p=(T*.5)%1,rp=p*tc*1.3,dd=ci-rp;if(dd>0)return 0;return Math.min(1,Math.max(0,1+dd/(tc*.15)));` : ''}${style === 'scatter' ? `var cx=cols/2,cy=rows/2,dx=x-cx,dy=y-cy,sd=Math.sqrt(dx*dx+dy*dy)/Math.sqrt(cx*cx+cy*cy),ph=Math.sin(T*1.5)*.5+.5;if(sd>ph)return Math.max(0,1-(sd-ph)*3);return .7+.3*Math.sin(sd*10-T*2);` : ''}\n}`;\n}\n\n/**\n * Build inline JS for resolving cell color based on color mode.\n */\nfunction buildColorFnJS(options: AsciiOptions): string {\n switch (options.colorMode) {\n case 'fullcolor':\n return `function(c){return 'rgb('+c.r+','+c.g+','+c.b+')'}`;\n case 'matrix':\n return `function(c){var b=Math.floor(.299*c.r+.587*c.g+.114*c.b);return 'rgb(0,'+b+',0)'}`;\n case 'accent': {\n const hex = options.accentColor.replace('#', '');\n const ar = parseInt(hex.substring(0, 2), 16);\n const ag = parseInt(hex.substring(2, 4), 16);\n const ab = parseInt(hex.substring(4, 6), 16);\n return `function(c){var b=(.299*c.r+.587*c.g+.114*c.b)/255;return 'rgb('+Math.floor(${ar}*b)+','+Math.floor(${ag}*b)+','+Math.floor(${ab}*b)+')'}`;\n }\n default:\n return `function(c){var g=Math.floor(.299*c.r+.587*c.g+.114*c.b);return 'rgb('+g+','+g+','+g+')'}`;\n }\n}\n\n// ─── Simple one-call API ──────────────────────────────────────────\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 * const img = document.querySelector('img');\n * const canvas = document.querySelector('canvas');\n * await asciify(img, canvas);\n *\n * @example with options\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 // Resolve string → HTMLImageElement\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 *\n * @example with style\n * const stop = await asciifyGif('animation.gif', canvas, { style: 'letters' });\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 video = document.querySelector('video');\n * const stop = await asciifyVideo(video, canvas);\n * // later: stop();\n *\n * @example with style\n * const stop = await asciifyVideo(video, canvas, { fontSize: 8, style: 'art' });\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/**\n * Generate a self-contained HTML embed snippet for an ASCII image.\n * Features: canvas rendering, animation loop, hover effects.\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\n const isDots = options.renderMode === 'dots';\n const data = serializeFrame(frame, !isDots);\n const hasAnim = options.animationStyle !== 'none';\n const hasHover = options.hoverStrength > 0;\n const charset = isDots ? '' : options.charset;\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 // Check for transparency in frame data\n const hasTransparency = frame.some(row => row.some(cell => cell.a < 200));\n\n return `<!-- Asciify Embed -->\n<canvas id=\"ar-embed\" width=\"${width}\" height=\"${height}\" style=\"${hasTransparency ? '' : 'background:#0a0a0a;'}display:block;\"></canvas>\n<script>\n(function(){\n var D=${JSON.stringify(data)};\n var R=${rows},C=${cols},W=${width},H=${height};\n var cW=W/C,cH=H/R;\n var isDots=${isDots};\n var invert=${options.invert};\n var dotR=${options.dotSizeRatio};\n var hStr=${options.hoverStrength},hRad=${options.hoverRadius};\n var hcR=${hcR},hcG=${hcG},hcB=${hcB};\n var hEff='${options.hoverEffect}';\n var charset=${JSON.stringify(charset)};\n var hasTr=${hasTransparency};\n var cv=document.getElementById('ar-embed'),ctx=cv.getContext('2d');\n var mx=-1,my=-1,mIn=0;\n var getColor=${buildColorFnJS(options)};\n var getAnim=${buildAnimFnJS(options.animationStyle, options.animationSpeed)};\n ${hasHover ? `\n cv.addEventListener('mousemove',function(e){var r=cv.getBoundingClientRect();mx=(e.clientX-r.left)/r.width;my=(e.clientY-r.top)/r.height});\n cv.addEventListener('mouseleave',function(){mx=-1;my=-1});\n function ss(t){return t*t*(3-2*t)}\n ` : ''}\n var smX=.5,smY=.5;\n function draw(t){\n var time=t/1000;\n ctx.clearRect(0,0,W,H);\n if(!hasTr){ctx.fillStyle='#0a0a0a';ctx.fillRect(0,0,W,H)};\n ${hasHover ? `\n if(mx>=0){smX+=(mx-smX)*.1;smY+=(my-smY)*.1;mIn+=(1-mIn)*.12}\n else{mIn*=.96;if(mIn<.003)mIn=0}\n ` : ''}\n for(var y=0;y<R;y++)for(var x=0;x<C;x++){\n var p=D[y][x];if(p.a<10)continue;\n var am=getAnim(x,y,C,R,time);if(am<.05)continue;\n var sc=1,ox=0,oy=0,gl=0,cb=0;\n ${hasHover ? `\n if(mIn>.003&&hStr>0){\n var nx=x/C,ny=y/R,dx=nx-smX,dy=ny-smY,dd=Math.sqrt(dx*dx+dy*dy);\n var rad=(.08+hRad*.35)+hStr*.04;\n if(dd<rad){\n var tt=1-dd/rad,e=ss(tt)*mIn,ang=Math.atan2(dy,dx);\n if(hEff==='spotlight'){sc=1+e*hStr*1.8;var pf=e*e*hStr*.6;ox=Math.cos(ang)*pf*cW;oy=Math.sin(ang)*pf*cH;gl=e*hStr*.4;cb=e*e*hStr*.25}\n else if(hEff==='magnify'){sc=1+e*hStr*2.5;gl=e*hStr*.15}\n else if(hEff==='repel'){sc=1+e*hStr*.3;var pf=e*e*hStr*1.2;ox=Math.cos(ang)*pf*cW;oy=Math.sin(ang)*pf*cH}\n else if(hEff==='glow'){gl=e*hStr*.8;cb=e*hStr*.4}\n else if(hEff==='colorShift'){sc=1+e*hStr*.4;gl=e*hStr*.2;cb=e*hStr*.7}\n }\n }\n ` : ''}\n var px=x*cW+cW/2+ox,py=y*cH+cH/2+oy;\n var col=getColor(p);\n if(cb>0){var m=col.match(/rgb\\\\((\\\\d+),(\\\\d+),(\\\\d+)\\\\)/);if(m){var rr=+m[1],gg=+m[2],bb=+m[3];col='rgb('+Math.min(255,Math.round(rr+(hcR-rr)*cb))+','+Math.min(255,Math.round(gg+(hcG-gg)*cb))+','+Math.min(255,Math.round(bb+(hcB-bb)*cb))+')'}}\n if(isDots){\n var lum=p.l/255;var int=invert?1-lum:lum;if(int<.02)continue;\n var rad=Math.min(cW,cH)*.5*dotR*int*am*sc;if(rad<.3)continue;\n ctx.globalAlpha=Math.min(1,(p.a/255)*am*(1+gl));\n ctx.fillStyle=col;ctx.beginPath();ctx.arc(px,py,rad,0,Math.PI*2);ctx.fill()\n }else{\n var lum=(.299*p.r+.587*p.g+.114*p.b)/255;if(invert)lum=1-lum;\n var ci=Math.floor(lum*(charset.length-1));\n var ch=charset[Math.max(0,Math.min(charset.length-1,ci))];\n if(ch===' ')continue;\n ctx.globalAlpha=Math.min(1,(p.a/255)*am*(1+gl));\n ctx.fillStyle=col;\n var fs=Math.min(cW/.55,cH)*.9*sc;\n ctx.font=fs+'px \"JetBrains Mono\",monospace';ctx.textAlign='center';ctx.textBaseline='middle';\n ctx.fillText(ch,px,py)\n }\n }\n ctx.globalAlpha=1;\n ${(hasAnim || hasHover) ? 'requestAnimationFrame(draw)' : ''};\n }\n ${(hasAnim || hasHover) ? 'requestAnimationFrame(draw)' : 'draw(0)'};\n})();\n</script>\n<!-- /Asciify Embed -->`;\n}\n\n/**\n * Generate animated embed code for multi-frame (video) ASCII art.\n * Canvas-based with frame cycling, animation effects, and hover.\n */\nexport function generateAnimatedEmbedCode(\n frames: AsciiFrame[],\n options: AsciiOptions,\n fps: number,\n width: number,\n height: number\n): string {\n const rows = frames[0].length;\n const cols = frames[0][0].length;\n const isDots = options.renderMode === 'dots';\n\n // Serialize all frames compactly\n const allData = frames.map(f => serializeFrame(f, !isDots));\n const hasHover = options.hoverStrength > 0;\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 const charset = isDots ? '' : options.charset;\n\n // Check for transparency in frame data\n const hasTransparency = frames.some(f => f.some(row => row.some(cell => cell.a < 200)));\n\n return `<!-- Asciify Animated Embed -->\n<canvas id=\"ar-anim\" width=\"${width}\" height=\"${height}\" style=\"${hasTransparency ? '' : 'background:#0a0a0a;'}display:block;\"></canvas>\n<script>\n(function(){\n var F=${JSON.stringify(allData)};\n var R=${rows},C=${cols},W=${width},H=${height},FPS=${fps};\n var cW=W/C,cH=H/R;\n var isDots=${isDots};\n var invert=${options.invert};\n var dotR=${options.dotSizeRatio};\n var hStr=${options.hoverStrength},hRad=${options.hoverRadius};\n var hcR=${hcR},hcG=${hcG},hcB=${hcB};\n var hEff='${options.hoverEffect}';\n var charset=${JSON.stringify(charset)};\n var hasTr=${hasTransparency};\n var cv=document.getElementById('ar-anim'),ctx=cv.getContext('2d');\n var mx=-1,my=-1,mIn=0,smX=.5,smY=.5;\n var fi=0,lastT=0;\n var getColor=${buildColorFnJS(options)};\n ${hasHover ? `\n cv.addEventListener('mousemove',function(e){var r=cv.getBoundingClientRect();mx=(e.clientX-r.left)/r.width;my=(e.clientY-r.top)/r.height});\n cv.addEventListener('mouseleave',function(){mx=-1;my=-1});\n function ss(t){return t*t*(3-2*t)}\n ` : ''}\n function draw(t){\n var time=t/1000;\n if(t-lastT>=1000/FPS){fi=(fi+1)%F.length;lastT=t}\n var D=F[fi];\n ctx.clearRect(0,0,W,H);if(!hasTr){ctx.fillStyle='#0a0a0a';ctx.fillRect(0,0,W,H)};\n ${hasHover ? `\n if(mx>=0){smX+=(mx-smX)*.1;smY+=(my-smY)*.1;mIn+=(1-mIn)*.12}\n else{mIn*=.96;if(mIn<.003)mIn=0}\n ` : ''}\n for(var y=0;y<R;y++)for(var x=0;x<C;x++){\n var p=D[y][x];if(p.a<10)continue;\n var sc=1,ox=0,oy=0,gl=0,cb=0;\n ${hasHover ? `\n if(mIn>.003&&hStr>0){\n var nx=x/C,ny=y/R,dx=nx-smX,dy=ny-smY,dd=Math.sqrt(dx*dx+dy*dy);\n var rad=(.08+hRad*.35)+hStr*.04;\n if(dd<rad){\n var tt=1-dd/rad,e=ss(tt)*mIn,ang=Math.atan2(dy,dx);\n if(hEff==='spotlight'){sc=1+e*hStr*1.8;var pf=e*e*hStr*.6;ox=Math.cos(ang)*pf*cW;oy=Math.sin(ang)*pf*cH;gl=e*hStr*.4;cb=e*e*hStr*.25}\n else if(hEff==='magnify'){sc=1+e*hStr*2.5;gl=e*hStr*.15}\n else if(hEff==='repel'){sc=1+e*hStr*.3;var pf=e*e*hStr*1.2;ox=Math.cos(ang)*pf*cW;oy=Math.sin(ang)*pf*cH}\n else if(hEff==='glow'){gl=e*hStr*.8;cb=e*hStr*.4}\n else if(hEff==='colorShift'){sc=1+e*hStr*.4;gl=e*hStr*.2;cb=e*hStr*.7}\n }\n }\n ` : ''}\n var px=x*cW+cW/2+ox,py=y*cH+cH/2+oy;\n var col=getColor(p);\n if(cb>0){var m=col.match(/rgb\\\\((\\\\d+),(\\\\d+),(\\\\d+)\\\\)/);if(m){var rr=+m[1],gg=+m[2],bb=+m[3];col='rgb('+Math.min(255,Math.round(rr+(hcR-rr)*cb))+','+Math.min(255,Math.round(gg+(hcG-gg)*cb))+','+Math.min(255,Math.round(bb+(hcB-bb)*cb))+')'}}\n if(isDots){\n var lum=p.l/255;var int=invert?1-lum:lum;if(int<.02)continue;\n var rad=Math.min(cW,cH)*.5*dotR*int*sc;if(rad<.3)continue;\n ctx.globalAlpha=Math.min(1,(p.a/255)*(1+gl));\n ctx.fillStyle=col;ctx.beginPath();ctx.arc(px,py,rad,0,Math.PI*2);ctx.fill()\n }else{\n var lum=(.299*p.r+.587*p.g+.114*p.b)/255;if(invert)lum=1-lum;\n var ci=Math.floor(lum*(charset.length-1));\n var ch=charset[Math.max(0,Math.min(charset.length-1,ci))];\n if(ch===' ')continue;\n ctx.globalAlpha=Math.min(1,(p.a/255)*(1+gl));\n ctx.fillStyle=col;\n var fs=Math.min(cW/.55,cH)*.9*sc;\n ctx.font=fs+'px \"JetBrains Mono\",monospace';ctx.textAlign='center';ctx.textBaseline='middle';\n ctx.fillText(ch,px,py)\n }\n }\n ctx.globalAlpha=1;\n requestAnimationFrame(draw);\n }\n requestAnimationFrame(draw);\n})();\n</script>\n<!-- /Asciify Animated Embed -->`;\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'] as const;\nconst HOVER_EFFECTS = ['spotlight','magnify','repel','glow','colorShift'] 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/ascii-engine.ts","../src/webgl-engine.ts"],"names":["parseGIF","decompressFrames","render"],"mappings":";;;;;AAiDO,IAAM,QAAA,GAAW;AAAA,EACtB,QAAA,EAAU,YAAA;AAAA,EACV,MAAA,EAAQ,2BAAA;AAAA,EACR,OAAA,EAAS,MAAA;AAAA,EACT,KAAA,EAAO,0EAAA;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;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;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;AAEjG;AC7JA,SAAS,qBAAA,CAAsB,OAAe,MAAA,EAG5C;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;AAKA,SAAS,eAAA,CAAgB,GAAA,EAAa,UAAA,EAAoB,QAAA,EAA0B;AAClF,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;AAKA,SAAS,eAAA,CAAgB,GAAA,EAAa,OAAA,EAAiB,MAAA,EAAyB;AAC9E,EAAA,MAAM,UAAA,GAAa,MAAA,GAAS,CAAA,GAAI,GAAA,GAAM,MAAM,GAAA,GAAM,GAAA;AAClD,EAAA,MAAM,QAAQ,IAAA,CAAK,KAAA,CAAM,UAAA,IAAc,OAAA,CAAQ,SAAS,CAAA,CAAE,CAAA;AAC1D,EAAA,OAAO,OAAA,CAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,OAAA,CAAQ,MAAA,GAAS,CAAA,EAAG,KAAK,CAAC,CAAC,CAAA;AACjE;AAOA,SAAS,iBACP,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;AAElD,EAAA,IAAI,UAAA,GAAa,MAAM,OAAO,GAAA;AAE9B,EAAA,MAAM,GAAA,GAAM,IAAI,IAAA,GAAO,CAAA;AACvB,EAAA,OAAO,IAAA,CAAK,GAAA,GAAM,IAAA,CAAK,MAAM,CAAA;AAC/B;AAKA,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;AAIA,IAAM,SAAA,GAAsB,IAAI,KAAA,CAAM,GAAG,CAAA;AACzC,IAAM,UAAA,GAAuB,IAAI,KAAA,CAAM,GAAG,CAAA;AAC1C,KAAA,IAAS,EAAA,GAAK,CAAA,EAAG,EAAA,GAAK,GAAA,EAAK,EAAA,EAAA,EAAM;AAC/B,EAAA,SAAA,CAAU,EAAE,CAAA,GAAI,CAAA,IAAA,EAAO,EAAE,CAAA,CAAA,EAAI,EAAE,IAAI,EAAE,CAAA,CAAA,CAAA;AACrC,EAAA,UAAA,CAAW,EAAE,CAAA,GAAI,CAAA,MAAA,EAAS,EAAE,CAAA,GAAA,CAAA;AAC9B;AA4BA,SAAS,WAAA,CAAY,GAAA,EAAa,CAAA,EAAW,CAAA,EAAW,QAAA,EAA0B;AAChF,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;AAMA,SAAS,eAAA,CACP,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,UAAA,CAAY,KAAA,GAAQ,IAAA,CAAK,CAAA,GAAI,KAAA,GAAQ,KAAK,CAAA,GAAI,KAAA,GAAQ,IAAA,CAAK,CAAA,GAAK,CAAC,CAAA;AAAA,IAC1E,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,SAAA,CAAW,KAAA,GAAQ,IAAA,CAAK,CAAA,GAAI,KAAA,GAAQ,KAAK,CAAA,GAAI,KAAA,GAAQ,IAAA,CAAK,CAAA,GAAK,CAAC,CAAA;AAAA;AAE7E;AAOA,IAAM,SAAA,GAAY,CAAC,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA;AAC1B,SAAS,eAAA,CACP,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;AAMA,SAAS,uBACP,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,MAAM,IAAA,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,GAAO,IAAA;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;AAEd,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;AAEb,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;AAEpB,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;AAEjB,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,MAAM,OAAO,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA,GAAI,IAAA,IAAQ,aAAa,IAAA,CAAK,CAAA;AACvD,MAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAI,CAAA;AAAA,IACzB;AAAA,IACA,KAAK,SAAA,EAAW;AAEd,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;AACE,MAAA,OAAO,CAAA;AAAA;AAEb;AAMO,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;AAOA,eAAsB,gBAAA,CACpB,MAAA,EACA,OAAA,EACA,WAAA,EACA,cACA,UAAA,EAC4E;AAC5E,EAAA,MAAM,GAAA,GAAMA,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;AAG/B,EAAA,MAAM,QAAA,GAAW,GAAA,CAAI,GAAA,EAAK,KAAA,IAAS,IAAA;AACnC,EAAA,MAAM,QAAA,GAAW,GAAA,CAAI,GAAA,EAAK,MAAA,IAAU,IAAA;AAGpC,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;AAG1C,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;AAGX,EAAA,IAAI,UAAA,GAAa,CAAA;AACjB,EAAA,KAAA,MAAW,KAAK,SAAA,EAAW;AACzB,IAAA,UAAA,IAAe,EAAE,KAAA,IAAS,GAAA;AAAA,EAC5B;AACA,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;AAGjE,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;AAGtC,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;AAGA,IAAA,MAAM,iBAAiB,IAAI,SAAA,CAAU,OAAO,IAAA,CAAK,KAAA,EAAO,KAAK,MAAM,CAAA;AACnE,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;AAGzC,IAAA,OAAA,CAAQ,UAAU,UAAA,EAAY,IAAA,CAAK,QAAQ,CAAA,EAAG,IAAA,CAAK,OAAO,CAAC,CAAA;AAG3D,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;AAGd,IAAA,IAAI,iBAAiB,CAAA,EAAG;AAEtB,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;AAE7B,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;AAGA,IAAA,UAAA,GAAA,CAAc,CAAA,GAAI,KAAK,SAAS,CAAA;AAAA,EAClC;AAEA,EAAA,OAAO,EAAE,MAAA,EAAQ,IAAA,EAAM,IAAA,EAAM,GAAA,EAAI;AACnC;AAKA,SAAS,WAAW,CAAA,EAAmB;AACrC,EAAA,OAAO,CAAA,GAAI,CAAA,IAAK,CAAA,GAAI,CAAA,GAAI,CAAA,CAAA;AAC1B;AAOA,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;AAE9F,SAAS,kBAAA,CACP,EAAA,EACA,EAAA,EACA,MAAA,EACA,MAAA,EACA,cAAA,EACA,QAAA,EACA,KAAA,EACA,KAAA,EACA,MAAA,GAAwC,WAAA,EACxC,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;AAG9B,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;AAGJ,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;AAgBO,SAAS,mBAAA,CACd,KACA,KAAA,EACA,OAAA,EACA,aACA,YAAA,EACA,IAAA,GAAe,GACf,QAAA,EACA;AACA,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;AAG7C,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;AAI9C,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;AAGnG,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;AAG5C,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;AAKnD,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;AAGnD,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;AAGA,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;AAGpB,EAAA,IAAI,aAAA,GAAgB,EAAA;AACpB,EAAA,IAAI,SAAA,GAAY,EAAA;AAEhB,EAAA,IAAI,OAAA,CAAQ,eAAe,MAAA,EAAQ;AAEjC,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;AAGvE,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;AAGrC,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;AAEL,IAAA,MAAM,UAAA,GAAa,IAAA;AACnB,IAAA,MAAM,WAAW,IAAA,CAAK,GAAA,CAAI,KAAA,GAAQ,UAAA,EAAY,KAAK,CAAA,GAAI,GAAA;AAIvD,IAAA,MAAM,cAAc,QAAA,GAAW,CAAA;AAE/B,IAAA,IAAI,CAAC,WAAA,EAAa;AAChB,MAAA,GAAA,CAAI,IAAA,GAAO,GAAG,QAAQ,CAAA,8BAAA,CAAA;AACtB,MAAA,GAAA,CAAI,SAAA,GAAY,QAAA;AAChB,MAAA,GAAA,CAAI,YAAA,GAAe,QAAA;AAAA,IACrB;AAIA,IAAA,IAAI,WAAA,GAA6C,IAAA;AACjD,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,WAAA,GAAc,EAAC;AACf,MAAA,MAAM,KAAK,OAAA,CAAQ,OAAA;AACnB,MAAA,MAAM,QAAQ,EAAA,CAAG,MAAA;AACjB,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,EAAO,CAAA,EAAA,EAAK;AAC9B,QAAA,WAAA,CAAY,EAAA,CAAG,CAAC,CAAC,CAAA,GAAI,KAAK,GAAA,CAAI,GAAA,EAAA,CAAM,CAAA,GAAI,GAAA,IAAO,KAAK,CAAA;AAAA,MACtD;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;AAGpB,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;AAEf,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;AAEL,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;AAMA,SAAS,cAAA,CAAe,OAAmB,YAAA,EAAoC;AAC7E,EAAA,OAAO,KAAA,CAAM,GAAA,CAAI,CAAA,GAAA,KAAO,GAAA,CAAI,IAAI,CAAA,IAAA,KAAQ;AACtC,IAAA,MAAM,GAAA,GAA8B,EAAE,CAAA,EAAG,IAAA,CAAK,CAAA,EAAG,CAAA,EAAG,IAAA,CAAK,CAAA,EAAG,CAAA,EAAG,IAAA,CAAK,CAAA,EAAG,CAAA,EAAG,KAAK,CAAA,EAAE;AACjF,IAAA,IAAI,cAAc,GAAA,CAAI,CAAA,GAAI,IAAA,CAAK,IAAA,CAAK,WAAW,CAAC,CAAA;AAAA,SAC3C,GAAA,CAAI,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,KAAA,GAAQ,IAAA,CAAK,CAAA,GAAI,KAAA,GAAQ,IAAA,CAAK,CAAA,GAAI,KAAA,GAAQ,IAAA,CAAK,CAAC,CAAA;AACxE,IAAA,OAAO,GAAA;AAAA,EACT,CAAC,CAAC,CAAA;AACJ;AAMA,SAAS,aAAA,CAAc,OAAuB,KAAA,EAAuB;AACnE,EAAA,IAAI,KAAA,KAAU,QAAQ,OAAO,sBAAA;AAC7B,EAAA,OAAO,CAAA;AAAA,QAAA,EACC,KAAK,CAAA;AAAA,EAAA,EACX,UAAU,MAAA,GAAS,CAAA,6GAAA,CAAA,GAAkH,EAAE,CAAA,EAAG,KAAA,KAAU,UAAU,CAAA,2IAAA,CAAA,GAAgJ,EAAE,GAAG,KAAA,KAAU,MAAA,GAAS,mGAAmG,EAAE,CAAA,EAAG,UAAU,SAAA,GAAY,CAAA,4EAAA,CAAA,GAAiF,EAAE,CAAA,EAAG,KAAA,KAAU,YAAY,CAAA,sHAAA,CAAA,GAA2H,EAAE,GAAG,KAAA,KAAU,QAAA,GAAW,mLAAmL,EAAE,CAAA,EAAG,UAAU,QAAA,GAAW,CAAA,qKAAA,CAAA,GAA0K,EAAE,CAAA,EAAG,KAAA,KAAU,eAAe,CAAA,2HAAA,CAAA,GAAgI,EAAE,GAAG,KAAA,KAAU,SAAA,GAAY,gMAAgM,EAAE;AAAA,CAAA,CAAA;AAE37C;AAKA,SAAS,eAAe,OAAA,EAA+B;AACrD,EAAA,QAAQ,QAAQ,SAAA;AAAW,IACzB,KAAK,WAAA;AACH,MAAA,OAAO,CAAA,kDAAA,CAAA;AAAA,IACT,KAAK,QAAA;AACH,MAAA,OAAO,CAAA,iFAAA,CAAA;AAAA,IACT,KAAK,QAAA,EAAU;AACb,MAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,WAAA,CAAY,OAAA,CAAQ,KAAK,EAAE,CAAA;AAC/C,MAAA,MAAM,KAAK,QAAA,CAAS,GAAA,CAAI,UAAU,CAAA,EAAG,CAAC,GAAG,EAAE,CAAA;AAC3C,MAAA,MAAM,KAAK,QAAA,CAAS,GAAA,CAAI,UAAU,CAAA,EAAG,CAAC,GAAG,EAAE,CAAA;AAC3C,MAAA,MAAM,KAAK,QAAA,CAAS,GAAA,CAAI,UAAU,CAAA,EAAG,CAAC,GAAG,EAAE,CAAA;AAC3C,MAAA,OAAO,CAAA,4EAAA,EAA+E,EAAE,CAAA,mBAAA,EAAsB,EAAE,sBAAsB,EAAE,CAAA,QAAA,CAAA;AAAA,IAC1I;AAAA,IACA;AACE,MAAA,OAAO,CAAA,yFAAA,CAAA;AAAA;AAEb;AAwBA,eAAsB,OAAA,CACpB,MAAA,EACA,MAAA,EACA,EAAE,QAAA,GAAW,EAAA,EAAI,KAAA,GAAQ,SAAA,EAAW,OAAA,GAAU,EAAC,EAAE,GAA0B,EAAC,EAC7D;AAEf,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;AAaA,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;AAcA,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;AAMO,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;AAEtB,EAAA,MAAM,MAAA,GAAS,QAAQ,UAAA,KAAe,MAAA;AACtC,EAAA,MAAM,IAAA,GAAO,cAAA,CAAe,KAAA,EAAO,CAAC,MAAM,CAAA;AAC1C,EAAA,MAAM,OAAA,GAAU,QAAQ,cAAA,KAAmB,MAAA;AAC3C,EAAA,MAAM,QAAA,GAAW,QAAQ,aAAA,GAAgB,CAAA;AACzC,EAAA,MAAM,OAAA,GAAU,MAAA,GAAS,EAAA,GAAK,OAAA,CAAQ,OAAA;AAEtC,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;AAG5C,EAAA,MAAM,eAAA,GAAkB,KAAA,CAAM,IAAA,CAAK,CAAA,GAAA,KAAO,GAAA,CAAI,KAAK,CAAA,IAAA,KAAQ,IAAA,CAAK,CAAA,GAAI,GAAG,CAAC,CAAA;AAExE,EAAA,OAAO,CAAA;AAAA,6BAAA,EACsB,KAAK,CAAA,UAAA,EAAa,MAAM,CAAA,SAAA,EAAY,eAAA,GAAkB,KAAK,qBAAqB,CAAA;AAAA;AAAA;AAAA,QAAA,EAGrG,IAAA,CAAK,SAAA,CAAU,IAAI,CAAC,CAAA;AAAA,QAAA,EACpB,IAAI,CAAA,GAAA,EAAM,IAAI,CAAA,GAAA,EAAM,KAAK,MAAM,MAAM,CAAA;AAAA;AAAA,aAAA,EAEhC,MAAM,CAAA;AAAA,aAAA,EACN,QAAQ,MAAM,CAAA;AAAA,WAAA,EAChB,QAAQ,YAAY,CAAA;AAAA,WAAA,EACpB,OAAA,CAAQ,aAAa,CAAA,MAAA,EAAS,OAAA,CAAQ,WAAW,CAAA;AAAA,UAAA,EAClD,GAAG,CAAA,KAAA,EAAQ,GAAG,CAAA,KAAA,EAAQ,GAAG,CAAA;AAAA,YAAA,EACvB,QAAQ,WAAW,CAAA;AAAA,cAAA,EACjB,IAAA,CAAK,SAAA,CAAU,OAAO,CAAC,CAAA;AAAA,YAAA,EACzB,eAAe,CAAA;AAAA;AAAA;AAAA,eAAA,EAGZ,cAAA,CAAe,OAAO,CAAC,CAAA;AAAA,cAAA,EACxB,aAAA,CAAc,OAAA,CAAQ,cAAA,EAAgB,OAAA,CAAQ,cAAc,CAAC,CAAA;AAAA,EAAA,EACzE,QAAA,GAAW;AAAA;AAAA;AAAA;AAAA,EAAA,CAAA,GAIT,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,EAMF,QAAA,GAAW;AAAA;AAAA;AAAA,IAAA,CAAA,GAGT,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA,MAAA,EAKF,QAAA,GAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAAA,CAAA,GAaT,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,EAsBL,OAAA,IAAW,QAAA,GAAY,6BAAA,GAAgC,EAAE,CAAA;AAAA;AAAA,EAAA,EAE3D,OAAA,IAAW,QAAA,GAAY,6BAAA,GAAgC,SAAS,CAAA;AAAA;AAAA;AAAA,uBAAA,CAAA;AAIrE;AAMO,SAAS,yBAAA,CACd,MAAA,EACA,OAAA,EACA,GAAA,EACA,OACA,MAAA,EACQ;AACR,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,MAAA,GAAS,QAAQ,UAAA,KAAe,MAAA;AAGtC,EAAA,MAAM,OAAA,GAAU,OAAO,GAAA,CAAI,CAAA,CAAA,KAAK,eAAe,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AAC1D,EAAA,MAAM,QAAA,GAAW,QAAQ,aAAA,GAAgB,CAAA;AAEzC,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;AAC5C,EAAA,MAAM,OAAA,GAAU,MAAA,GAAS,EAAA,GAAK,OAAA,CAAQ,OAAA;AAGtC,EAAA,MAAM,eAAA,GAAkB,MAAA,CAAO,IAAA,CAAK,CAAA,CAAA,KAAK,EAAE,IAAA,CAAK,CAAA,GAAA,KAAO,GAAA,CAAI,IAAA,CAAK,CAAA,IAAA,KAAQ,IAAA,CAAK,CAAA,GAAI,GAAG,CAAC,CAAC,CAAA;AAEtF,EAAA,OAAO,CAAA;AAAA,4BAAA,EACqB,KAAK,CAAA,UAAA,EAAa,MAAM,CAAA,SAAA,EAAY,eAAA,GAAkB,KAAK,qBAAqB,CAAA;AAAA;AAAA;AAAA,QAAA,EAGpG,IAAA,CAAK,SAAA,CAAU,OAAO,CAAC,CAAA;AAAA,QAAA,EACvB,IAAI,MAAM,IAAI,CAAA,GAAA,EAAM,KAAK,CAAA,GAAA,EAAM,MAAM,QAAQ,GAAG,CAAA;AAAA;AAAA,aAAA,EAE3C,MAAM,CAAA;AAAA,aAAA,EACN,QAAQ,MAAM,CAAA;AAAA,WAAA,EAChB,QAAQ,YAAY,CAAA;AAAA,WAAA,EACpB,OAAA,CAAQ,aAAa,CAAA,MAAA,EAAS,OAAA,CAAQ,WAAW,CAAA;AAAA,UAAA,EAClD,GAAG,CAAA,KAAA,EAAQ,GAAG,CAAA,KAAA,EAAQ,GAAG,CAAA;AAAA,YAAA,EACvB,QAAQ,WAAW,CAAA;AAAA,cAAA,EACjB,IAAA,CAAK,SAAA,CAAU,OAAO,CAAC,CAAA;AAAA,YAAA,EACzB,eAAe,CAAA;AAAA;AAAA;AAAA;AAAA,eAAA,EAIZ,cAAA,CAAe,OAAO,CAAC,CAAA;AAAA,EAAA,EACpC,QAAA,GAAW;AAAA;AAAA;AAAA;AAAA,EAAA,CAAA,GAIT,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,EAMF,QAAA,GAAW;AAAA;AAAA;AAAA,IAAA,CAAA,GAGT,EAAE;AAAA;AAAA;AAAA;AAAA,MAAA,EAIF,QAAA,GAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAAA,CAAA,GAaT,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,gCAAA,CAAA;AA4BZ;;;AC3sCA,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,WAAA,GAAgB,CAAC,MAAA,EAAO,MAAA,EAAO,OAAA,EAAQ,MAAA,EAAO,SAAA,EAAU,SAAA,EAAU,QAAA,EAAS,QAAA,EAAS,YAAA,EAAa,SAAS,CAAA;AAChH,IAAM,gBAAgB,CAAC,WAAA,EAAY,SAAA,EAAU,OAAA,EAAQ,QAAO,YAAY,CAAA;AACxE,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';\nexport type ArtStyle = 'classic' | 'particles' | 'letters' | 'claudeCode' | 'art' | 'terminal' | 'box' | 'lines';\nexport type HoverEffect = 'spotlight' | 'magnify' | 'repel' | 'glow' | 'colorShift';\nexport type HoverPreset = 'none' | 'subtle' | 'flashlight' | 'magnifier' | 'forceField' | 'neon' | 'fire' | 'ice';\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} 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};\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};\n","// ─── Asciify Engine ───────────────────────────────────────────────\n// Framework-agnostic. Pure TypeScript.\n// Converts image/video/GIF pixel data to ASCII character grids.\n// Supports: ASCII text mode, Dots mode, Animation effects, Transparency.\n\nimport type { AsciiOptions, AsciiCell, AsciiFrame, AnimationStyle, ArtStyle } from './types';\nimport { DEFAULT_OPTIONS, ART_STYLE_PRESETS } from './types';\nimport { parseGIF, decompressFrames } from 'gifuct-js';\n\n/**\n * Create an offscreen canvas for pixel sampling.\n */\nfunction 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/**\n * Apply brightness and contrast adjustments to a luminance value.\n */\nfunction 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\n/**\n * Map a luminance value (0-255) to a character from the charset.\n */\nfunction luminanceToChar(lum: number, charset: string, invert: boolean): string {\n const normalized = invert ? 1 - lum / 255 : lum / 255;\n const index = Math.floor(normalized * (charset.length - 1));\n return charset[Math.max(0, Math.min(charset.length - 1, index))];\n}\n\n/**\n * Map a cell position to a character from custom text, tiled across the image.\n * Only shows characters where brightness is above a threshold; otherwise space.\n * This makes the custom text readable as a repeating pattern across the image.\n */\nfunction 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 // Below threshold → space (dark/empty areas stay blank)\n if (normalized < 0.12) return ' ';\n // Tile the full text across positions so it reads naturally left-to-right\n const pos = y * cols + x;\n return text[pos % text.length];\n}\n\n/**\n * Simple ordered-dither noise based on Bayer 4x4 matrix.\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];\n\n// ─── Pre-computed Color LUTs ───\n// Avoid per-cell string allocation for grayscale and matrix modes.\nconst _GRAY_LUT: string[] = new Array(256);\nconst _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// ─── Cached Hover Glow Sprite ───\n// Avoids createRadialGradient() every frame.\nlet _glowCache: { canvas: HTMLCanvasElement; size: number; r: number; g: number; b: number } | null = null;\n\n// @ts-ignore: reserved for future hover-glow feature\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nfunction _getGlowSprite(radius: number, r: number, g: number, b: number): HTMLCanvasElement {\n const size = Math.ceil(radius / 4) * 4; // quantize to reduce cache misses\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\nfunction 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/**\n * Resolve a cell's fill color as a string — uses LUT for grayscale/matrix.\n * colorMode is passed directly to avoid per-cell object property lookup.\n */\nfunction 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\n/**\n * Resolve a cell's fill color as numeric [r, g, b] — avoids string allocation.\n * Uses the shared _colorRGB array to avoid per-call allocation.\n * colorMode passed directly to avoid per-cell object property lookup.\n */\nconst _colorRGB = [0, 0, 0];\nfunction 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/**\n * Get animation multiplier for a cell based on animation style.\n * Returns a value between 0 and 1 that modulates the cell's visibility/size.\n */\nfunction 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 // Random-looking sparkle using pseudo-random hash\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 // Horizontal glitch bands that shift randomly\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 // This band glitches — offset or blank\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 // Reveals characters left-to-right, top-to-bottom in a looping sweep\n const totalCells = cols * rows;\n const cellIndex = y * cols + x;\n const progress = ((t * 0.5) % 1); // 0-1 sweep\n const revealPoint = progress * totalCells * 1.3; // overshoot for full coverage\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 // Particles scatter outward from center then reform\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; // 0-1 oscillation\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 default:\n return 1;\n }\n}\n\n/**\n * Convert an image element or canvas to a single ASCII frame.\n * Now reads alpha channel for transparency support.\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]; // Alpha channel\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 * Uses gifuct-js to parse and decompress GIF frames, then composites\n * them onto a canvas (handling disposal methods) to produce full frames.\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\n // Use the full GIF logical screen size for compositing\n const logicalW = gif.lsd?.width || gifW;\n const logicalH = gif.lsd?.height || gifH;\n\n // Compositing canvas (full GIF size)\n const compCanvas = document.createElement('canvas');\n compCanvas.width = logicalW;\n compCanvas.height = logicalH;\n const compCtx = compCanvas.getContext('2d')!;\n\n // Previous frame canvas for restore-to-previous disposal\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 // Calculate average delay to determine FPS\n let totalDelay = 0;\n for (const f of rawFrames) {\n totalDelay += (f.delay || 100);\n }\n const avgDelay = totalDelay / rawFrames.length;\n const fps = Math.round(Math.min(30, Math.max(5, 1000 / avgDelay)));\n\n // Limit frames to avoid memory issues (cap at ~300 frames)\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 // Save state before drawing (for disposal type 3 = restore to previous)\n if (disposalType === 3) {\n prevCtx.clearRect(0, 0, logicalW, logicalH);\n prevCtx.drawImage(compCanvas, 0, 0);\n }\n\n // Create ImageData for this frame's patch\n const frameImageData = new ImageData(patch, 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 // Draw patch onto compositing canvas at the correct position\n compCtx.drawImage(tempCanvas, dims.left || 0, dims.top || 0);\n\n // Now sample the composited canvas\n const result = imageToAsciiFrame(compCanvas, options, targetWidth, targetHeight);\n frames.push(result.frame);\n cols = result.cols;\n rows = result.rows;\n\n // Handle disposal\n if (disposalType === 2) {\n // Dispose to background (clear the patch area)\n compCtx.clearRect(dims.left || 0, dims.top || 0, dims.width, dims.height);\n } else if (disposalType === 3) {\n // Restore to previous\n compCtx.clearRect(0, 0, logicalW, logicalH);\n compCtx.drawImage(prevCanvas, 0, 0);\n }\n // disposalType 0 or 1 = leave as is (do nothing)\n\n onProgress?.((i + 1) / maxFrames);\n }\n\n return { frames, cols, rows, fps };\n}\n\n/**\n * Smoothstep easing for premium falloff curves.\n */\nfunction smoothstep(t: number): number {\n return t * t * (3 - 2 * t);\n}\n\n/**\n * Compute premium hover effects for a cell — writes results into\n * the reusable _hoverResult object to avoid per-cell allocation.\n * Uses the HoverEffect mode to vary the behaviour.\n */\nconst _hoverResult = { scale: 1, offsetX: 0, offsetY: 0, glow: 0, colorBlend: 0, proximity: 0 };\n\nfunction 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: import('./types').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 // Dynamic radius — radiusFactor (0-1) maps to visual influence area\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 }\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/**\n * Render an ASCII frame to a canvas context.\n * Supports both ASCII text mode and Dots mode.\n * Always renders every cell at full quality.\n *\n * Performance strategy:\n * - fillRect fast path for sub-6px text (30x faster than fillText)\n * - Auto-scaling hover radius: at high cell counts, the hover area\n * is proportionally smaller so fewer cells compute hover effects\n * - Hover bounding box early-exit skips cells outside the hover zone\n *\n * @param time - elapsed time in seconds for animation effects\n * @param hoverPos - optional smoothed mouse position {x, y, intensity} for hover effect\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 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 // Quick transparency check — sparse sample\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 // When animation is active at high cell counts, disable hover to keep FPS up.\n // Animation already re-renders every cell every frame (expensive trig per cell);\n // adding hover on top doubles the math for cells in the hover zone.\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 // Parse hover color once\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 // Pre-parse accent color once\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 // Auto-scale hover radius based on cell count for consistent performance.\n // At high cell counts the user's radius slider value is scaled down so the\n // hover zone stays a reasonable size (fewer cells to compute effects for).\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 // Pre-compute hover bounding box in grid coords for early-exit\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 // Cache options lookups outside the inner loop\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 // Track last canvas state to skip redundant calls\n let lastFillStyle = '';\n let lastAlpha = -1;\n\n if (options.renderMode === 'dots') {\n // ─── Dots Render Mode ───\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 // ─── Hover Effect ───\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 // Compute fill color\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 // ─── ASCII Text Render Mode ───\n const charAspect = 0.55;\n const fontSize = Math.min(cellW / charAspect, cellH) * 0.9;\n\n // Below 6px, characters are illegible — use fast fillRect with weight modulation\n // This turns 30K slow fillText calls into fast fillRect calls (30x speedup)\n const useFastRect = fontSize < 6;\n\n if (!useFastRect) {\n ctx.font = `${fontSize}px \"JetBrains Mono\", monospace`;\n ctx.textAlign = 'center';\n ctx.textBaseline = 'middle';\n }\n\n // Pre-build character weight map for fillRect mode\n // Maps each charset char to its visual density (0.1 – 1.0)\n let charWeights: Record<string, number> | null = null;\n if (useFastRect) {\n charWeights = {};\n const cs = options.charset;\n const csLen = cs.length;\n for (let i = 0; i < csLen; i++) {\n charWeights[cs[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 // ─── Hover Effect ───\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 // ─── Fast fillRect path (sub-6px text) ───\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 // ─── Standard fillText path ───\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/**\n * Serialize a frame's cell data compactly for embed use.\n * Returns: [{r,g,b,a,c},...] per row — c = char code for ascii, omitted for dots\n */\nfunction serializeFrame(frame: AsciiFrame, includeChars: boolean): unknown[][] {\n return frame.map(row => row.map(cell => {\n const obj: Record<string, number> = { r: cell.r, g: cell.g, b: cell.b, a: cell.a };\n if (includeChars) obj.c = cell.char.charCodeAt(0);\n else obj.l = Math.round(0.299 * cell.r + 0.587 * cell.g + 0.114 * cell.b);\n return obj;\n }));\n}\n\n/**\n * Build the animation multiplier function as an inlined JS string\n * matching the engine's getAnimationMultiplier.\n */\nfunction buildAnimFnJS(style: AnimationStyle, speed: number): string {\n if (style === 'none') return 'function(){return 1}';\n return `function(x,y,cols,rows,t){\n var s=${speed},T=t*s;\n ${style === 'wave' ? `var w=Math.sin(x/cols*Math.PI*4+T*3)*.5+.5,w2=Math.sin(y/rows*Math.PI*3+T*2)*.5+.5;return .3+.7*(w*.6+w2*.4);` : ''}${style === 'pulse' ? `var cx=cols/2,cy=rows/2,d=Math.sqrt((x-cx)*(x-cx)+(y-cy)*(y-cy)),m=Math.sqrt(cx*cx+cy*cy);return .2+.8*(Math.sin(d/m*Math.PI*6-T*4)*.5+.5);` : ''}${style === 'rain' ? `return .1+.9*(Math.sin(y/rows*Math.PI*8-T*5+x*.3)*.5+.5)*(Math.sin(x/cols*Math.PI*2+T)*.3+.7);` : ''}${style === 'breathe' ? `return Math.max(.1,Math.min(1,Math.sin(T*2)*.3+.7+Math.sin((x+y)*.1+T)*.1));` : ''}${style === 'sparkle' ? `var h=Math.sin(x*127.1+y*311.7+Math.floor(T*8)*43758.5453)*43758.5453;var sp=h-Math.floor(h);return sp>.7?1:.15+sp*.4;` : ''}${style === 'glitch' ? `var b=Math.floor(y/(rows*.05)),gh=Math.sin(b*43.23+Math.floor(T*6)*17.89)*43758.5453,gv=gh-Math.floor(gh);if(gv>.85){var fl=Math.sin(T*30+b)*.5+.5;return fl<.3?0:fl}return 1;` : ''}${style === 'spiral' ? `var cx=cols/2,cy=rows/2,dx=x-cx,dy=y-cy,a=Math.atan2(dy,dx),d=Math.sqrt(dx*dx+dy*dy),m=Math.sqrt(cx*cx+cy*cy);return .15+.85*(Math.sin(a*3+d/m*Math.PI*8-T*3)*.5+.5);` : ''}${style === 'typewriter' ? `var tc=cols*rows,ci=y*cols+x,p=(T*.5)%1,rp=p*tc*1.3,dd=ci-rp;if(dd>0)return 0;return Math.min(1,Math.max(0,1+dd/(tc*.15)));` : ''}${style === 'scatter' ? `var cx=cols/2,cy=rows/2,dx=x-cx,dy=y-cy,sd=Math.sqrt(dx*dx+dy*dy)/Math.sqrt(cx*cx+cy*cy),ph=Math.sin(T*1.5)*.5+.5;if(sd>ph)return Math.max(0,1-(sd-ph)*3);return .7+.3*Math.sin(sd*10-T*2);` : ''}\n}`;\n}\n\n/**\n * Build inline JS for resolving cell color based on color mode.\n */\nfunction buildColorFnJS(options: AsciiOptions): string {\n switch (options.colorMode) {\n case 'fullcolor':\n return `function(c){return 'rgb('+c.r+','+c.g+','+c.b+')'}`;\n case 'matrix':\n return `function(c){var b=Math.floor(.299*c.r+.587*c.g+.114*c.b);return 'rgb(0,'+b+',0)'}`;\n case 'accent': {\n const hex = options.accentColor.replace('#', '');\n const ar = parseInt(hex.substring(0, 2), 16);\n const ag = parseInt(hex.substring(2, 4), 16);\n const ab = parseInt(hex.substring(4, 6), 16);\n return `function(c){var b=(.299*c.r+.587*c.g+.114*c.b)/255;return 'rgb('+Math.floor(${ar}*b)+','+Math.floor(${ag}*b)+','+Math.floor(${ab}*b)+')'}`;\n }\n default:\n return `function(c){var g=Math.floor(.299*c.r+.587*c.g+.114*c.b);return 'rgb('+g+','+g+','+g+')'}`;\n }\n}\n\n// ─── Simple one-call API ──────────────────────────────────────────\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 * const img = document.querySelector('img');\n * const canvas = document.querySelector('canvas');\n * await asciify(img, canvas);\n *\n * @example with options\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 // Resolve string → HTMLImageElement\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 *\n * @example with style\n * const stop = await asciifyGif('animation.gif', canvas, { style: 'letters' });\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 video = document.querySelector('video');\n * const stop = await asciifyVideo(video, canvas);\n * // later: stop();\n *\n * @example with style\n * const stop = await asciifyVideo(video, canvas, { fontSize: 8, style: 'art' });\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/**\n * Generate a self-contained HTML embed snippet for an ASCII image.\n * Features: canvas rendering, animation loop, hover effects.\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\n const isDots = options.renderMode === 'dots';\n const data = serializeFrame(frame, !isDots);\n const hasAnim = options.animationStyle !== 'none';\n const hasHover = options.hoverStrength > 0;\n const charset = isDots ? '' : options.charset;\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 // Check for transparency in frame data\n const hasTransparency = frame.some(row => row.some(cell => cell.a < 200));\n\n return `<!-- Asciify Embed -->\n<canvas id=\"ar-embed\" width=\"${width}\" height=\"${height}\" style=\"${hasTransparency ? '' : 'background:#0a0a0a;'}display:block;\"></canvas>\n<script>\n(function(){\n var D=${JSON.stringify(data)};\n var R=${rows},C=${cols},W=${width},H=${height};\n var cW=W/C,cH=H/R;\n var isDots=${isDots};\n var invert=${options.invert};\n var dotR=${options.dotSizeRatio};\n var hStr=${options.hoverStrength},hRad=${options.hoverRadius};\n var hcR=${hcR},hcG=${hcG},hcB=${hcB};\n var hEff='${options.hoverEffect}';\n var charset=${JSON.stringify(charset)};\n var hasTr=${hasTransparency};\n var cv=document.getElementById('ar-embed'),ctx=cv.getContext('2d');\n var mx=-1,my=-1,mIn=0;\n var getColor=${buildColorFnJS(options)};\n var getAnim=${buildAnimFnJS(options.animationStyle, options.animationSpeed)};\n ${hasHover ? `\n cv.addEventListener('mousemove',function(e){var r=cv.getBoundingClientRect();mx=(e.clientX-r.left)/r.width;my=(e.clientY-r.top)/r.height});\n cv.addEventListener('mouseleave',function(){mx=-1;my=-1});\n function ss(t){return t*t*(3-2*t)}\n ` : ''}\n var smX=.5,smY=.5;\n function draw(t){\n var time=t/1000;\n ctx.clearRect(0,0,W,H);\n if(!hasTr){ctx.fillStyle='#0a0a0a';ctx.fillRect(0,0,W,H)};\n ${hasHover ? `\n if(mx>=0){smX+=(mx-smX)*.1;smY+=(my-smY)*.1;mIn+=(1-mIn)*.12}\n else{mIn*=.96;if(mIn<.003)mIn=0}\n ` : ''}\n for(var y=0;y<R;y++)for(var x=0;x<C;x++){\n var p=D[y][x];if(p.a<10)continue;\n var am=getAnim(x,y,C,R,time);if(am<.05)continue;\n var sc=1,ox=0,oy=0,gl=0,cb=0;\n ${hasHover ? `\n if(mIn>.003&&hStr>0){\n var nx=x/C,ny=y/R,dx=nx-smX,dy=ny-smY,dd=Math.sqrt(dx*dx+dy*dy);\n var rad=(.08+hRad*.35)+hStr*.04;\n if(dd<rad){\n var tt=1-dd/rad,e=ss(tt)*mIn,ang=Math.atan2(dy,dx);\n if(hEff==='spotlight'){sc=1+e*hStr*1.8;var pf=e*e*hStr*.6;ox=Math.cos(ang)*pf*cW;oy=Math.sin(ang)*pf*cH;gl=e*hStr*.4;cb=e*e*hStr*.25}\n else if(hEff==='magnify'){sc=1+e*hStr*2.5;gl=e*hStr*.15}\n else if(hEff==='repel'){sc=1+e*hStr*.3;var pf=e*e*hStr*1.2;ox=Math.cos(ang)*pf*cW;oy=Math.sin(ang)*pf*cH}\n else if(hEff==='glow'){gl=e*hStr*.8;cb=e*hStr*.4}\n else if(hEff==='colorShift'){sc=1+e*hStr*.4;gl=e*hStr*.2;cb=e*hStr*.7}\n }\n }\n ` : ''}\n var px=x*cW+cW/2+ox,py=y*cH+cH/2+oy;\n var col=getColor(p);\n if(cb>0){var m=col.match(/rgb\\\\((\\\\d+),(\\\\d+),(\\\\d+)\\\\)/);if(m){var rr=+m[1],gg=+m[2],bb=+m[3];col='rgb('+Math.min(255,Math.round(rr+(hcR-rr)*cb))+','+Math.min(255,Math.round(gg+(hcG-gg)*cb))+','+Math.min(255,Math.round(bb+(hcB-bb)*cb))+')'}}\n if(isDots){\n var lum=p.l/255;var int=invert?1-lum:lum;if(int<.02)continue;\n var rad=Math.min(cW,cH)*.5*dotR*int*am*sc;if(rad<.3)continue;\n ctx.globalAlpha=Math.min(1,(p.a/255)*am*(1+gl));\n ctx.fillStyle=col;ctx.beginPath();ctx.arc(px,py,rad,0,Math.PI*2);ctx.fill()\n }else{\n var lum=(.299*p.r+.587*p.g+.114*p.b)/255;if(invert)lum=1-lum;\n var ci=Math.floor(lum*(charset.length-1));\n var ch=charset[Math.max(0,Math.min(charset.length-1,ci))];\n if(ch===' ')continue;\n ctx.globalAlpha=Math.min(1,(p.a/255)*am*(1+gl));\n ctx.fillStyle=col;\n var fs=Math.min(cW/.55,cH)*.9*sc;\n ctx.font=fs+'px \"JetBrains Mono\",monospace';ctx.textAlign='center';ctx.textBaseline='middle';\n ctx.fillText(ch,px,py)\n }\n }\n ctx.globalAlpha=1;\n ${(hasAnim || hasHover) ? 'requestAnimationFrame(draw)' : ''};\n }\n ${(hasAnim || hasHover) ? 'requestAnimationFrame(draw)' : 'draw(0)'};\n})();\n</script>\n<!-- /Asciify Embed -->`;\n}\n\n/**\n * Generate animated embed code for multi-frame (video) ASCII art.\n * Canvas-based with frame cycling, animation effects, and hover.\n */\nexport function generateAnimatedEmbedCode(\n frames: AsciiFrame[],\n options: AsciiOptions,\n fps: number,\n width: number,\n height: number\n): string {\n const rows = frames[0].length;\n const cols = frames[0][0].length;\n const isDots = options.renderMode === 'dots';\n\n // Serialize all frames compactly\n const allData = frames.map(f => serializeFrame(f, !isDots));\n const hasHover = options.hoverStrength > 0;\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 const charset = isDots ? '' : options.charset;\n\n // Check for transparency in frame data\n const hasTransparency = frames.some(f => f.some(row => row.some(cell => cell.a < 200)));\n\n return `<!-- Asciify Animated Embed -->\n<canvas id=\"ar-anim\" width=\"${width}\" height=\"${height}\" style=\"${hasTransparency ? '' : 'background:#0a0a0a;'}display:block;\"></canvas>\n<script>\n(function(){\n var F=${JSON.stringify(allData)};\n var R=${rows},C=${cols},W=${width},H=${height},FPS=${fps};\n var cW=W/C,cH=H/R;\n var isDots=${isDots};\n var invert=${options.invert};\n var dotR=${options.dotSizeRatio};\n var hStr=${options.hoverStrength},hRad=${options.hoverRadius};\n var hcR=${hcR},hcG=${hcG},hcB=${hcB};\n var hEff='${options.hoverEffect}';\n var charset=${JSON.stringify(charset)};\n var hasTr=${hasTransparency};\n var cv=document.getElementById('ar-anim'),ctx=cv.getContext('2d');\n var mx=-1,my=-1,mIn=0,smX=.5,smY=.5;\n var fi=0,lastT=0;\n var getColor=${buildColorFnJS(options)};\n ${hasHover ? `\n cv.addEventListener('mousemove',function(e){var r=cv.getBoundingClientRect();mx=(e.clientX-r.left)/r.width;my=(e.clientY-r.top)/r.height});\n cv.addEventListener('mouseleave',function(){mx=-1;my=-1});\n function ss(t){return t*t*(3-2*t)}\n ` : ''}\n function draw(t){\n var time=t/1000;\n if(t-lastT>=1000/FPS){fi=(fi+1)%F.length;lastT=t}\n var D=F[fi];\n ctx.clearRect(0,0,W,H);if(!hasTr){ctx.fillStyle='#0a0a0a';ctx.fillRect(0,0,W,H)};\n ${hasHover ? `\n if(mx>=0){smX+=(mx-smX)*.1;smY+=(my-smY)*.1;mIn+=(1-mIn)*.12}\n else{mIn*=.96;if(mIn<.003)mIn=0}\n ` : ''}\n for(var y=0;y<R;y++)for(var x=0;x<C;x++){\n var p=D[y][x];if(p.a<10)continue;\n var sc=1,ox=0,oy=0,gl=0,cb=0;\n ${hasHover ? `\n if(mIn>.003&&hStr>0){\n var nx=x/C,ny=y/R,dx=nx-smX,dy=ny-smY,dd=Math.sqrt(dx*dx+dy*dy);\n var rad=(.08+hRad*.35)+hStr*.04;\n if(dd<rad){\n var tt=1-dd/rad,e=ss(tt)*mIn,ang=Math.atan2(dy,dx);\n if(hEff==='spotlight'){sc=1+e*hStr*1.8;var pf=e*e*hStr*.6;ox=Math.cos(ang)*pf*cW;oy=Math.sin(ang)*pf*cH;gl=e*hStr*.4;cb=e*e*hStr*.25}\n else if(hEff==='magnify'){sc=1+e*hStr*2.5;gl=e*hStr*.15}\n else if(hEff==='repel'){sc=1+e*hStr*.3;var pf=e*e*hStr*1.2;ox=Math.cos(ang)*pf*cW;oy=Math.sin(ang)*pf*cH}\n else if(hEff==='glow'){gl=e*hStr*.8;cb=e*hStr*.4}\n else if(hEff==='colorShift'){sc=1+e*hStr*.4;gl=e*hStr*.2;cb=e*hStr*.7}\n }\n }\n ` : ''}\n var px=x*cW+cW/2+ox,py=y*cH+cH/2+oy;\n var col=getColor(p);\n if(cb>0){var m=col.match(/rgb\\\\((\\\\d+),(\\\\d+),(\\\\d+)\\\\)/);if(m){var rr=+m[1],gg=+m[2],bb=+m[3];col='rgb('+Math.min(255,Math.round(rr+(hcR-rr)*cb))+','+Math.min(255,Math.round(gg+(hcG-gg)*cb))+','+Math.min(255,Math.round(bb+(hcB-bb)*cb))+')'}}\n if(isDots){\n var lum=p.l/255;var int=invert?1-lum:lum;if(int<.02)continue;\n var rad=Math.min(cW,cH)*.5*dotR*int*sc;if(rad<.3)continue;\n ctx.globalAlpha=Math.min(1,(p.a/255)*(1+gl));\n ctx.fillStyle=col;ctx.beginPath();ctx.arc(px,py,rad,0,Math.PI*2);ctx.fill()\n }else{\n var lum=(.299*p.r+.587*p.g+.114*p.b)/255;if(invert)lum=1-lum;\n var ci=Math.floor(lum*(charset.length-1));\n var ch=charset[Math.max(0,Math.min(charset.length-1,ci))];\n if(ch===' ')continue;\n ctx.globalAlpha=Math.min(1,(p.a/255)*(1+gl));\n ctx.fillStyle=col;\n var fs=Math.min(cW/.55,cH)*.9*sc;\n ctx.font=fs+'px \"JetBrains Mono\",monospace';ctx.textAlign='center';ctx.textBaseline='middle';\n ctx.fillText(ch,px,py)\n }\n }\n ctx.globalAlpha=1;\n requestAnimationFrame(draw);\n }\n requestAnimationFrame(draw);\n})();\n</script>\n<!-- /Asciify Animated Embed -->`;\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'] as const;\nconst HOVER_EFFECTS = ['spotlight','magnify','repel','glow','colorShift'] 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"]}