@clypra/engine 1.0.0 → 1.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +386 -0
- package/dist/index.cjs +2 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +12 -1
- package/dist/index.d.ts +12 -1
- package/dist/index.js +1 -0
- package/package.json +1 -1
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/engine/textLayout.ts","../src/engine/perCharFill.ts","../src/engine/procedural/utils.ts","../src/engine/procedural/InkBrushEngine.ts","../src/renderer.ts","../src/presets.ts","../src/fontLoader.ts","../src/engine/schema.ts","../src/engine/timelineDefaults.ts","../src/engine/migrate.ts","../src/engine/animation.ts","../src/compositor/index.ts","../src/engine/mask.ts","../src/engine/evaluate.ts","../src/engine/recipes.ts","../src/engine/lottieEditor.ts","../src/engine/lottieParser.ts","../src/engine/lottieInjector.ts","../src/engine/lottieTextAnimations.ts","../src/engine/lottieTextStyle.ts","../src/engine/lottieTemplatePresets.ts","../src/engine/lottieExport.ts","../src/engine/export.ts","../src/engine/lottieGoogleFonts.ts","../src/engine/animatableParams.ts","../src/engine/blend.ts","../src/engine/history.ts","../src/engine/timelineMutations.ts"],"sourcesContent":["/**\n * @clypra/engine — Canvas 2D text effects, Lottie tooling, and animation engine.\n * @version 1.0.0\n */\nexport * from \"./types.js\";\nexport * from \"./renderer.js\";\nexport * from \"./presets.js\";\nexport * from \"./fontLoader.js\";\nexport * from \"./engine/schema.js\";\nexport * from \"./engine/migrate.js\";\nexport * from \"./engine/evaluate.js\";\nexport * from \"./engine/animation.js\";\nexport * from \"./engine/textLayout.js\";\nexport * from \"./engine/recipes.js\";\nexport * from \"./engine/perCharFill.js\";\nexport * from \"./engine/lottieEditor.js\";\nexport * from \"./engine/lottieParser.js\";\nexport * from \"./engine/lottieInjector.js\";\nexport * from \"./engine/lottieTextAnimations.js\";\nexport * from \"./engine/lottieTextStyle.js\";\nexport * from \"./engine/lottieTemplatePresets.js\";\nexport * from \"./engine/lottieExport.js\";\nexport * from \"./engine/export.js\";\nexport * from \"./engine/lottieGoogleFonts.js\";\nexport * from \"./engine/animatableParams.js\";\nexport * from \"./engine/blend.js\";\nexport * from \"./engine/history.js\";\nexport * from \"./engine/mask.js\";\nexport * from \"./engine/timelineDefaults.js\";\nexport * from \"./engine/timelineMutations.js\";\nexport * from \"./compositor/index.js\";\n","import type { TextEffectConfig } from \"../types\";\n\nexport interface TextLayoutBounds {\n xMin: number;\n yMin: number;\n xMax: number;\n yMax: number;\n maxLineWidth: number;\n textBlockHeight: number;\n}\n\nexport interface TextLayoutResult {\n lines: string[];\n fontSize: number;\n startX: number;\n startY: number;\n align: CanvasTextAlign;\n lineWidths: number[];\n bounds: TextLayoutBounds;\n safeRect: { x: number; y: number; width: number; height: number };\n}\n\nexport interface CompositionPreset {\n id: string;\n label: string;\n width: number;\n height: number;\n description?: string;\n}\n\nexport const COMPOSITION_PRESETS: CompositionPreset[] = [\n { id: \"banner\", label: \"Banner\", width: 800, height: 200, description: \"Lower third / title bar\" },\n { id: \"youtube\", label: \"16:9\", width: 1280, height: 720, description: \"HD thumbnail\" },\n { id: \"square\", label: \"1:1\", width: 1080, height: 1080, description: \"Social square\" },\n { id: \"story\", label: \"9:16\", width: 1080, height: 1920, description: \"Vertical story\" },\n { id: \"wide\", label: \"2:1\", width: 1200, height: 600, description: \"Wide hero\" },\n { id: \"poster\", label: \"3:4\", width: 900, height: 1200, description: \"Poster\" },\n];\n\nfunction measureLine(\n ctx: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D,\n line: string,\n letterSpacing: number\n): number {\n const prev = (ctx as CanvasRenderingContext2D & { letterSpacing?: string }).letterSpacing;\n if (letterSpacing !== 0) {\n (ctx as CanvasRenderingContext2D & { letterSpacing?: string }).letterSpacing = `${letterSpacing}px`;\n }\n const w = ctx.measureText(line || \" \").width;\n (ctx as CanvasRenderingContext2D & { letterSpacing?: string }).letterSpacing = prev ?? \"0px\";\n return w;\n}\n\nfunction getSafeRect(cfg: TextEffectConfig): { x: number; y: number; width: number; height: number } {\n const w = cfg.canvasWidth || 800;\n const h = cfg.canvasHeight || 200;\n const marginX = cfg.panelEnabled ? (cfg.panelPaddingX ?? 40) + 16 : Math.min(48, w * 0.06);\n const marginY = cfg.panelEnabled ? (cfg.panelPaddingY ?? 20) + 16 : Math.min(40, h * 0.1);\n return {\n x: marginX,\n y: marginY,\n width: Math.max(40, w - marginX * 2),\n height: Math.max(24, h - marginY * 2),\n };\n}\n\n/** Soft-wrap paragraphs to fit safe width */\nexport function wrapTextToWidth(\n ctx: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D,\n text: string,\n maxWidth: number,\n letterSpacing: number\n): string[] {\n const paragraphs = text.split(\"\\n\");\n const lines: string[] = [];\n\n for (const para of paragraphs) {\n if (!para.trim()) {\n lines.push(\"\");\n continue;\n }\n const words = para.split(/\\s+/).filter(Boolean);\n let current = \"\";\n for (const word of words) {\n const candidate = current ? `${current} ${word}` : word;\n if (measureLine(ctx, candidate, letterSpacing) <= maxWidth) {\n current = candidate;\n } else {\n if (current) lines.push(current);\n if (measureLine(ctx, word, letterSpacing) > maxWidth) {\n let chunk = \"\";\n for (const ch of word) {\n const tryChunk = chunk + ch;\n if (measureLine(ctx, tryChunk, letterSpacing) <= maxWidth) chunk = tryChunk;\n else {\n if (chunk) lines.push(chunk);\n chunk = ch;\n }\n }\n current = chunk;\n } else {\n current = word;\n }\n }\n }\n if (current) lines.push(current);\n }\n\n return lines.length > 0 ? lines : [\"\"];\n}\n\nfunction layoutWithFontSize(\n ctx: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D,\n cfg: TextEffectConfig,\n fontSize: number,\n lines: string[]\n): TextLayoutResult {\n const cWidth = cfg.canvasWidth || 800;\n const cHeight = cfg.canvasHeight || 200;\n const safe = getSafeRect(cfg);\n const lineHeight = cfg.lineHeight ?? 1.2;\n const letterSpacing = cfg.letterSpacing ?? 0;\n\n const fontStr = `${cfg.fontStyle} ${cfg.fontWeight} ${fontSize}px \"${cfg.fontFamily}\"`;\n ctx.font = fontStr;\n\n const lineWidths = lines.map((line) => measureLine(ctx, line, letterSpacing));\n const maxLineWidth = Math.max(...lineWidths, 1);\n const textBlockHeight = fontSize + (lines.length - 1) * fontSize * lineHeight;\n\n let align: CanvasTextAlign = \"center\";\n let startX = cWidth / 2;\n\n if (cfg.textPosX === \"left\") {\n align = \"left\";\n startX = safe.x;\n } else if (cfg.textPosX === \"right\") {\n align = \"right\";\n startX = safe.x + safe.width;\n } else {\n startX = safe.x + safe.width / 2;\n }\n\n let startY = safe.y + (safe.height - textBlockHeight) / 2 + fontSize * 0.82;\n if (cfg.textPosY === \"top\") {\n startY = safe.y + fontSize * 0.82;\n } else if (cfg.textPosY === \"bottom\") {\n startY = safe.y + safe.height - textBlockHeight + fontSize * 0.82;\n }\n\n let xMin = startX;\n if (align === \"center\") xMin = startX - maxLineWidth / 2;\n else if (align === \"right\") xMin = startX - maxLineWidth;\n\n const yMin = startY - fontSize * 0.85;\n const yMax = startY + (lines.length - 1) * fontSize * lineHeight + fontSize * 0.25;\n\n return {\n lines,\n fontSize,\n startX,\n startY,\n align,\n lineWidths,\n bounds: {\n xMin,\n yMin,\n xMax: xMin + maxLineWidth,\n yMax,\n maxLineWidth,\n textBlockHeight,\n },\n safeRect: safe,\n };\n}\n\nexport function measureTextFits(\n ctx: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D,\n cfg: TextEffectConfig,\n fontSize: number,\n lines: string[]\n): boolean {\n const safe = getSafeRect(cfg);\n const lineHeight = cfg.lineHeight ?? 1.2;\n const layout = layoutWithFontSize(ctx, cfg, fontSize, lines);\n return (\n layout.bounds.maxLineWidth <= safe.width + 1 &&\n layout.bounds.textBlockHeight <= safe.height + 1\n );\n}\n\nexport function computeAutoFitFontSize(\n ctx: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D,\n cfg: TextEffectConfig,\n wrappedLines: string[]\n): number {\n const max = Math.min(cfg.fontSize || 80, 200);\n let lo = 12;\n let hi = max;\n let best = 12;\n\n while (lo <= hi) {\n const mid = Math.floor((lo + hi) / 2);\n if (measureTextFits(ctx, cfg, mid, wrappedLines)) {\n best = mid;\n lo = mid + 1;\n } else {\n hi = mid - 1;\n }\n }\n return best;\n}\n\n/**\n * Layout text for a composition: safe margins, optional wrap + auto-fit.\n */\nexport function computeTextLayout(\n ctx: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D,\n cfg: TextEffectConfig,\n options?: { wrap?: boolean; autoFit?: boolean }\n): TextLayoutResult {\n const safe = getSafeRect(cfg);\n const wrap = options?.wrap ?? true;\n const autoFit = options?.autoFit ?? !!(cfg as TextEffectConfig & { autoFitText?: boolean }).autoFitText;\n\n let lines = cfg.text.split(\"\\n\");\n if (wrap) {\n lines = wrapTextToWidth(ctx, cfg.text, safe.width, cfg.letterSpacing ?? 0);\n }\n\n let fontSize = cfg.fontSize;\n if (autoFit) {\n fontSize = computeAutoFitFontSize(ctx, cfg, lines);\n }\n\n return layoutWithFontSize(ctx, cfg, fontSize, lines);\n}\n\n/** Preview zoom: fit composition inside viewport */\nexport function computeFitZoom(\n viewportWidth: number,\n viewportHeight: number,\n compositionWidth: number,\n compositionHeight: number,\n padding = 48\n): number {\n if (viewportWidth <= 0 || viewportHeight <= 0) return 100;\n const availW = viewportWidth - padding;\n const availH = viewportHeight - padding;\n const scale = Math.min(availW / compositionWidth, availH / compositionHeight);\n return Math.max(25, Math.min(200, Math.floor(scale * 100)));\n}\n","import type { TextEffectConfig } from \"../types\";\n\n/** Visible glyph count (newlines excluded). */\nexport function countTextGlyphs(text: string): number {\n let n = 0;\n for (let i = 0; i < text.length; i++) {\n if (text[i] !== \"\\n\") n++;\n }\n return n;\n}\n\nexport function resizeCharFillColors(\n text: string,\n colors: string[] | undefined,\n fallback: string\n): string[] {\n const n = countTextGlyphs(text);\n const next = colors ? [...colors] : [];\n while (next.length < n) next.push(fallback);\n return next.slice(0, n);\n}\n\nexport function setCharFillColor(\n colors: string[],\n glyphIndex: number,\n color: string\n): string[] {\n const next = [...colors];\n if (glyphIndex >= 0 && glyphIndex < next.length) next[glyphIndex] = color;\n return next;\n}\n\nexport function applyFillColorToAll(colors: string[], color: string): string[] {\n return colors.map(() => color);\n}\n\n/** Simple hue sweep for quick previews */\nexport function rainbowCharFillColors(text: string): string[] {\n const n = countTextGlyphs(text);\n return Array.from({ length: n }, (_, i) => {\n const hue = (i / Math.max(1, n - 1)) * 300;\n return `hsl(${hue}, 85%, 58%)`;\n });\n}\n\nexport interface DrawPerCharTextOptions {\n lines: string[];\n startX: number;\n startY: number;\n lineAdvance: number;\n align: CanvasTextAlign;\n letterSpacing: number;\n charFillColors: string[];\n defaultColor: string;\n mode: \"fill\" | \"stroke\";\n offsetX?: number;\n offsetY?: number;\n}\n\nfunction measureLineWidth(\n ctx: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D,\n line: string,\n letterSpacing: number\n): number {\n if (!line) return 0;\n let w = 0;\n for (let i = 0; i < line.length; i++) {\n w += ctx.measureText(line[i]).width;\n if (i < line.length - 1) w += letterSpacing;\n }\n return w;\n}\n\n/**\n * Draw text one glyph at a time with per-index fill/stroke colors.\n * Letter spacing is applied manually (canvas letterSpacing reset to 0).\n */\nexport function drawPerCharText(\n ctx: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D,\n opts: DrawPerCharTextOptions\n): void {\n const {\n lines,\n startX,\n startY,\n lineAdvance,\n align,\n letterSpacing,\n charFillColors,\n defaultColor,\n mode,\n offsetX = 0,\n offsetY = 0,\n } = opts;\n\n ctx.save();\n const prevSpacing = (ctx as CanvasRenderingContext2D & { letterSpacing?: string }).letterSpacing;\n (ctx as CanvasRenderingContext2D & { letterSpacing?: string }).letterSpacing = \"0px\";\n ctx.textBaseline = \"alphabetic\";\n\n let glyphIndex = 0;\n\n lines.forEach((line, lineIndex) => {\n const py = startY + lineIndex * lineAdvance;\n const lineWidth = measureLineWidth(ctx, line, letterSpacing);\n let x = startX;\n if (align === \"center\") x = startX - lineWidth / 2;\n else if (align === \"right\") x = startX - lineWidth;\n\n for (let i = 0; i < line.length; i++) {\n const ch = line[i];\n const color = charFillColors[glyphIndex] ?? defaultColor;\n if (mode === \"fill\") ctx.fillStyle = color;\n else ctx.strokeStyle = color;\n\n const drawX = x + offsetX;\n const drawY = py + offsetY;\n if (mode === \"fill\") ctx.fillText(ch, drawX, drawY);\n else ctx.strokeText(ch, drawX, drawY);\n\n x += ctx.measureText(ch).width + letterSpacing;\n glyphIndex++;\n }\n });\n\n (ctx as CanvasRenderingContext2D & { letterSpacing?: string }).letterSpacing = prevSpacing ?? \"0px\";\n ctx.restore();\n}\n\nexport function shouldUsePerCharFill(cfg: TextEffectConfig): boolean {\n return (\n !!cfg.perCharFillEnabled &&\n cfg.fillType === \"solid\" &&\n !cfg.customRenderer &&\n (cfg.charFillColors?.length ?? 0) > 0\n );\n}\n","import { TextEffectConfig } from \"../../types\";\n\nexport type Canvas2DContext = CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D;\ntype NodeCanvasFactory = (width: number, height: number) => HTMLCanvasElement;\n\nexport function createCanvas(w: number, h: number): HTMLCanvasElement | OffscreenCanvas {\n if (typeof document !== \"undefined\") {\n const canvas = document.createElement(\"canvas\");\n canvas.width = w;\n canvas.height = h;\n return canvas;\n }\n if (typeof OffscreenCanvas !== \"undefined\") {\n return new OffscreenCanvas(w, h);\n }\n const runtimeCanvasFactory = (globalThis as typeof globalThis & { __clypraCreateCanvas?: NodeCanvasFactory }).__clypraCreateCanvas;\n if (runtimeCanvasFactory) {\n return runtimeCanvasFactory(w, h);\n }\n try {\n // Keep the native canvas package out of Vite/esbuild browser prebundles.\n const nodeRequire = (0, eval)(\"require\") as (id: string) => unknown;\n const nodeCanvas = nodeRequire(\"@napi-rs/canvas\") as {\n createCanvas: (width: number, height: number) => HTMLCanvasElement;\n };\n return nodeCanvas.createCanvas(w, h);\n } catch {\n throw new Error(\"No canvas implementation found in this environment.\");\n }\n}\n\nexport function getCanvas2DContext(canvas: HTMLCanvasElement | OffscreenCanvas): Canvas2DContext | null {\n return canvas.getContext(\"2d\") as Canvas2DContext | null;\n}\n\nexport function seededRandom(seed: number): () => number {\n let s = seed;\n return function () {\n s = (s * 16807) % 2147483647;\n return (s - 1) / 2147483646;\n };\n}\n\nexport function textSeed(text: string): number {\n return (text.split(\"\").reduce((acc, c) => acc + c.charCodeAt(0), 0) * 9301) % 49297;\n}\n\nexport function hexToRgb(hex: string): { r: number; g: number; b: number } {\n const shorthandRegex = /^#?([a-f\\d])([a-f\\d])([a-f\\d])$/i;\n const fullHex = hex.replace(shorthandRegex, (m, r, g, b) => r + r + g + g + b + b);\n const result = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(fullHex);\n return result\n ? {\n r: parseInt(result[1], 16),\n g: parseInt(result[2], 16),\n b: parseInt(result[3], 16),\n }\n : { r: 255, g: 255, b: 255 };\n}\n\nexport function mixHexColor(colorA: string, colorB: string, ratio: number): string {\n const rgbA = hexToRgb(colorA);\n const rgbB = hexToRgb(colorB);\n const r = Math.round(rgbA.r + (rgbB.r - rgbA.r) * ratio);\n const g = Math.round(rgbA.g + (rgbB.g - rgbA.g) * ratio);\n const b = Math.round(rgbA.b + (rgbB.b - rgbA.b) * ratio);\n const toHex = (c: number) => {\n const s = Math.max(0, Math.min(255, c)).toString(16);\n return s.length === 1 ? \"0\" + s : s;\n };\n return `#${toHex(r)}${toHex(g)}${toHex(b)}`;\n}\n\nexport function hexToRgba(hex: string, alpha: number): string {\n const rgb = hexToRgb(hex);\n return `rgba(${rgb.r}, ${rgb.g}, ${rgb.b}, ${alpha})`;\n}\n","import { TextEffectConfig } from \"../../types\";\nimport { createCanvas, getCanvas2DContext, seededRandom, textSeed, hexToRgb } from \"./utils\";\n\nexport class InkBrushEngine {\n private cfg: Required<TextEffectConfig>;\n private bristleLines: Array<{ y: number; x0: number; x1: number; opacity: number; lineWidth: number }> = [];\n private grainDots: Array<{ x: number; y: number; opacity: number }> = [];\n private drips: Array<{\n x: number;\n startY: number;\n length: number;\n startWidth: number;\n endWidth: number;\n startOpacity: number;\n hasBlob: boolean;\n blobRadius: number;\n }> = [];\n\n constructor(config: Partial<TextEffectConfig>) {\n const defaults: Required<TextEffectConfig> = {\n text: \"INK\",\n effectName: \"InkBrush\",\n fontFamily: \"Bebas Neue\",\n fontWeight: 900,\n fontStyle: \"italic\",\n fontSize: 96,\n letterSpacing: 2,\n lineHeight: 1.1,\n wrapText: true,\n autoFitText: false,\n perCharFillEnabled: false,\n charFillColors: [],\n fillType: \"solid\",\n fillColor: \"#FFFFFF\",\n fillGradientAngle: 90,\n fillGradientStops: [],\n patternType: \"chalk\",\n strokeEnabled: false,\n strokeColor: \"#000000\",\n strokeWidth: 0,\n strokePosition: \"outside\",\n strokeOpacity: 100,\n strokeLineJoin: \"round\",\n strokeBlur: 0,\n strokeType: \"single\",\n strokeColorSecondary: \"#FFFFFF\",\n strokeWidthSecondary: 4,\n strokeFadeRange: 0,\n glowLayers: [],\n shadowEnabled: false,\n shadowColor: \"#000000\",\n shadowBlur: 10,\n shadowOffsetX: 5,\n shadowOffsetY: 5,\n shadowOpacity: 80,\n shadowType: \"drop\",\n bevelEnabled: false,\n bevelDepth: 5,\n bevelHighlight: \"#FFFFFF\",\n bevelShadow: \"#000000\",\n bevelDirection: \"bottom-right\",\n bevelCoreColor: \"#000000\",\n bevelEdgeColor: \"#2A2A38\",\n bevelEdgeWidth: 0,\n bevelBlur: 0,\n bevelBlurColor: \"#000000\",\n bevelPerspectiveEnabled: false,\n bevelVanishingPointX: 40,\n bevelVanishingPointY: 80,\n bevelFocalLength: 400,\n stackEnabled: false,\n stackCount: 3,\n stackOffsetX: 10,\n stackOffsetY: -10,\n stackOpacityDecay: 20,\n stackColor1: \"#FF7C00\",\n stackColor2: \"#00FFDD\",\n stackColor3: \"#FF00AA\",\n stackColor4: \"#AA00FF\",\n panelEnabled: false,\n panelColor: \"#1E1E26\",\n panelOpacity: 80,\n panelRadius: 12,\n panelPaddingX: 40,\n panelPaddingY: 20,\n panelStrokeEnabled: false,\n panelStrokeColor: \"#2A2A38\",\n panelStrokeWidth: 2,\n canvasWidth: 800,\n canvasHeight: 200,\n textPosX: \"center\",\n textPosY: \"middle\",\n inkColor: \"#FFFFFF\",\n bristleDensity: 0.8,\n bristleSkipRate: 0.2,\n dripRate: 0.3,\n dripMaxLength: 40,\n grainDensity: 0.15,\n skewX: -0.2,\n customRenderer: \"InkBrushEngine\",\n };\n\n this.cfg = {\n ...defaults,\n ...config,\n } as Required<TextEffectConfig>;\n\n this.precomputeData();\n }\n\n private precomputeData() {\n const { text, fontFamily, fontWeight, fontStyle, fontSize, letterSpacing, lineHeight, canvasWidth, canvasHeight, textPosX, textPosY, bristleDensity, bristleSkipRate, dripRate, dripMaxLength, grainDensity, skewX } = this.cfg;\n\n const width = canvasWidth;\n const height = canvasHeight;\n\n const rand = seededRandom(textSeed(text));\n\n let canvas = createCanvas(width, height);\n\n canvas.width = width;\n canvas.height = height;\n const ctx = getCanvas2DContext(canvas);\n if (!ctx) return;\n\n const lines = text.split(\"\\n\");\n const numLines = lines.length;\n const textBlockHeight = fontSize + (numLines - 1) * fontSize * lineHeight;\n\n let startX = width / 2;\n let align: CanvasTextAlign = \"center\";\n if (textPosX === \"left\") {\n startX = 50;\n align = \"left\";\n } else if (textPosX === \"right\") {\n startX = width - 50;\n align = \"right\";\n }\n ctx.textAlign = align;\n ctx.textBaseline = \"alphabetic\";\n\n const fontStr = `${fontStyle} ${fontWeight} ${fontSize}px \"${fontFamily}\"`;\n ctx.font = fontStr;\n\n if (letterSpacing !== 0) {\n (ctx as any).letterSpacing = `${letterSpacing}px`;\n }\n\n let startY = (height - textBlockHeight) / 2 + fontSize * 0.8;\n if (textPosY === \"top\") {\n startY = 40 + fontSize * 0.8;\n } else if (textPosY === \"bottom\") {\n startY = height - 40 - textBlockHeight + fontSize * 0.8;\n }\n\n ctx.save();\n if (skewX !== 0) {\n ctx.transform(1, 0, skewX, 1, 0, 0);\n }\n\n ctx.fillStyle = \"#FFFFFF\";\n lines.forEach((line, index) => {\n const py = startY + index * fontSize * lineHeight;\n ctx.fillText(line, startX, py);\n });\n ctx.restore();\n\n const imgData = ctx.getImageData(0, 0, width, height);\n const pixels = imgData.data;\n\n let minY = height;\n let maxY = 0;\n for (let y = 0; y < height; y++) {\n for (let x = 0; x < width; x++) {\n const idx = (y * width + x) * 4;\n if (pixels[idx + 3] > 128) {\n if (y < minY) minY = y;\n if (y > maxY) maxY = y;\n }\n }\n }\n\n if (minY >= maxY) return;\n\n // Generate bristle lines\n const step = Math.max(1, Math.min(3, 1 / bristleDensity));\n for (let y = minY; y <= maxY; y += step) {\n const segments: Array<{ xStart: number; xEnd: number }> = [];\n let inSegment = false;\n let xStart = 0;\n const targetY = Math.floor(y);\n\n for (let x = 0; x < width; x++) {\n const idx = (targetY * width + x) * 4;\n const isInside = pixels[idx + 3] > 128;\n if (isInside && !inSegment) {\n inSegment = true;\n xStart = x;\n } else if (!isInside && inSegment) {\n inSegment = false;\n segments.push({ xStart, xEnd: x - 1 });\n }\n }\n if (inSegment) {\n segments.push({ xStart, xEnd: width - 1 });\n }\n\n for (const seg of segments) {\n if (rand() < bristleSkipRate) continue;\n\n const segW = seg.xEnd - seg.xStart;\n const startLimit = seg.xStart + rand() * Math.min(15, segW * 0.2);\n const endLimit = seg.xEnd - rand() * Math.min(15, segW * 0.2);\n\n if (startLimit >= endLimit) continue;\n\n const opacity = 0.4 + rand() * 0.6;\n const lw = 0.5 + rand() * 1.5;\n\n const hasGap = rand() < 0.1;\n if (hasGap) {\n const gapPct = 0.3 + rand() * 0.4;\n const gapLen = 5 + rand() * 15;\n const midX = startLimit + (endLimit - startLimit) * gapPct;\n\n const p1Start = startLimit;\n const p1End = Math.max(startLimit, midX - gapLen / 2);\n const p2Start = Math.min(endLimit, midX + gapLen / 2);\n const p2End = endLimit;\n\n if (p1End > p1Start) {\n this.bristleLines.push({ y: targetY, x0: p1Start, x1: p1End, opacity, lineWidth: lw });\n }\n if (p2End > p2Start) {\n this.bristleLines.push({ y: targetY, x0: p2Start, x1: p2End, opacity, lineWidth: lw });\n }\n } else {\n this.bristleLines.push({ y: targetY, x0: startLimit, x1: endLimit, opacity, lineWidth: lw });\n }\n }\n }\n\n // Generate grain dots\n for (let y = minY; y <= maxY; y++) {\n for (let x = 0; x < width; x++) {\n const idx = (y * width + x) * 4;\n if (pixels[idx + 3] > 128) {\n if (rand() < grainDensity) {\n this.grainDots.push({\n x,\n y,\n opacity: 0.2 + rand() * 0.3,\n });\n }\n }\n }\n }\n\n // Identify bottom edge pixels for drip column mapping\n const bottomRowForCol = new Array(width).fill(-1);\n for (let x = 0; x < width; x++) {\n for (let y = height - 1; y >= 0; y--) {\n const idx = (y * width + x) * 4;\n if (pixels[idx + 3] > 128) {\n bottomRowForCol[x] = y;\n break;\n }\n }\n }\n\n // Generate drips\n for (let x = 0; x < width; x++) {\n const sY = bottomRowForCol[x];\n if (sY === -1) continue;\n\n if (rand() < dripRate) {\n const length = 8 + rand() * (dripMaxLength - 8);\n const startWidth = 1 + rand() * 1;\n const endWidth = rand() < 0.5 ? startWidth : 0.5;\n const startOpacity = 0.6 + rand() * 0.3;\n const hasBlob = rand() < 0.6;\n const blobRadius = 1.5 + rand() * 1.5;\n\n this.drips.push({\n x,\n startY: sY,\n length,\n startWidth,\n endWidth,\n startOpacity,\n hasBlob,\n blobRadius,\n });\n }\n }\n }\n\n advanceSteps(steps: number) {\n // No-op\n }\n\n drawFrame(ctx: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D) {\n const { text, fontFamily, fontWeight, fontStyle, fontSize, letterSpacing, lineHeight, canvasWidth, canvasHeight, textPosX, textPosY, skewX, inkColor } = this.cfg;\n\n const width = canvasWidth;\n const height = canvasHeight;\n\n ctx.clearRect(0, 0, width, height);\n ctx.imageSmoothingEnabled = true;\n\n const lines = text.split(\"\\n\");\n const numLines = lines.length;\n const textBlockHeight = fontSize + (numLines - 1) * fontSize * lineHeight;\n\n let startX = width / 2;\n let align: CanvasTextAlign = \"center\";\n if (textPosX === \"left\") {\n startX = 50;\n align = \"left\";\n } else if (textPosX === \"right\") {\n startX = width - 50;\n align = \"right\";\n }\n ctx.textAlign = align;\n ctx.textBaseline = \"alphabetic\";\n\n const fontStr = `${fontStyle} ${fontWeight} ${fontSize}px \"${fontFamily}\"`;\n ctx.font = fontStr;\n\n if (letterSpacing !== 0) {\n (ctx as any).letterSpacing = `${letterSpacing}px`;\n }\n\n let startY = (height - textBlockHeight) / 2 + fontSize * 0.8;\n if (textPosY === \"top\") {\n startY = 40 + fontSize * 0.8;\n } else if (textPosY === \"bottom\") {\n startY = height - 40 - textBlockHeight + fontSize * 0.8;\n }\n\n ctx.save();\n if (skewX !== 0) {\n ctx.transform(1, 0, skewX, 1, 0, 0);\n }\n\n // Phase A Text clip mask draw\n ctx.fillStyle = inkColor;\n lines.forEach((line, index) => {\n const py = startY + index * fontSize * lineHeight;\n ctx.fillText(line, startX, py);\n });\n ctx.restore();\n\n ctx.save();\n\n // Phase B Brush fill horizontal strokes clipped under source-in\n ctx.globalCompositeOperation = \"source-in\";\n\n ctx.strokeStyle = inkColor;\n this.bristleLines.forEach((line) => {\n ctx.globalAlpha = line.opacity;\n ctx.lineWidth = line.lineWidth;\n ctx.beginPath();\n ctx.moveTo(line.x0, line.y);\n ctx.lineTo(line.x1, line.y);\n ctx.stroke();\n });\n\n // Noise paper grain pass\n ctx.fillStyle = inkColor;\n this.grainDots.forEach((dot) => {\n ctx.globalAlpha = dot.opacity;\n ctx.fillRect(dot.x, dot.y, 1, 1);\n });\n\n ctx.restore(); // Restores normal source-over composting and unskewed state\n\n const inkRgb = hexToRgb(inkColor);\n\n // Phase C Paint drips\n ctx.save();\n this.drips.forEach((drip) => {\n const grad = ctx.createLinearGradient(drip.x, drip.startY, drip.x, drip.startY + drip.length);\n grad.addColorStop(0, `rgba(${inkRgb.r}, ${inkRgb.g}, ${inkRgb.b}, ${drip.startOpacity})`);\n grad.addColorStop(1, `rgba(${inkRgb.r}, ${inkRgb.g}, ${inkRgb.b}, 0)`);\n\n ctx.strokeStyle = grad;\n ctx.lineWidth = drip.startWidth;\n\n ctx.beginPath();\n ctx.moveTo(drip.x, drip.startY);\n ctx.lineTo(drip.x, drip.startY + drip.length);\n ctx.stroke();\n\n if (drip.hasBlob) {\n ctx.fillStyle = `rgba(${inkRgb.r}, ${inkRgb.g}, ${inkRgb.b}, ${drip.startOpacity * 0.5})`;\n ctx.beginPath();\n ctx.arc(drip.x, drip.startY + drip.length, drip.blobRadius, 0, Math.PI * 2);\n ctx.fill();\n }\n });\n ctx.restore();\n }\n}\n","import { TextEffectConfig, GradientStop, GlowLayer } from \"./types\";\nimport { computeTextLayout } from \"./engine/textLayout\";\nimport { drawPerCharText, shouldUsePerCharFill } from \"./engine/perCharFill\";\nimport { InkBrushEngine } from \"./engine/procedural/InkBrushEngine\";\n\ntype Canvas2DContext = CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D;\ntype NodeCanvasFactory = (width: number, height: number) => HTMLCanvasElement;\n\nfunction createCanvas(w: number, h: number): HTMLCanvasElement | OffscreenCanvas {\n if (typeof document !== \"undefined\") {\n const canvas = document.createElement(\"canvas\");\n canvas.width = w;\n canvas.height = h;\n return canvas;\n }\n if (typeof OffscreenCanvas !== \"undefined\") {\n return new OffscreenCanvas(w, h);\n }\n const runtimeCanvasFactory = (globalThis as typeof globalThis & { __clypraCreateCanvas?: NodeCanvasFactory }).__clypraCreateCanvas;\n if (runtimeCanvasFactory) {\n return runtimeCanvasFactory(w, h);\n }\n try {\n // Keep the native canvas package out of Vite/esbuild browser prebundles.\n const nodeRequire = (0, eval)(\"require\") as (id: string) => unknown;\n const nodeCanvas = nodeRequire(\"@napi-rs/canvas\") as {\n createCanvas: (width: number, height: number) => HTMLCanvasElement;\n };\n return nodeCanvas.createCanvas(w, h);\n } catch {\n throw new Error(\"No canvas implementation found in this environment.\");\n }\n}\n\nfunction getCanvas2DContext(canvas: HTMLCanvasElement | OffscreenCanvas): Canvas2DContext | null {\n return canvas.getContext(\"2d\") as Canvas2DContext | null;\n}\n\nfunction seededRandom(seed: number): () => number {\n let s = seed;\n return function () {\n s = (s * 16807) % 2147483647;\n return (s - 1) / 2147483646;\n };\n}\n\nfunction textSeed(text: string): number {\n return (text.split(\"\").reduce((acc, c) => acc + c.charCodeAt(0), 0) * 9301) % 49297;\n}\n\nfunction hexToRgb(hex: string): { r: number; g: number; b: number } {\n const shorthandRegex = /^#?([a-f\\d])([a-f\\d])([a-f\\d])$/i;\n const fullHex = hex.replace(shorthandRegex, (m, r, g, b) => r + r + g + g + b + b);\n const result = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(fullHex);\n return result\n ? {\n r: parseInt(result[1], 16),\n g: parseInt(result[2], 16),\n b: parseInt(result[3], 16),\n }\n : { r: 255, g: 255, b: 255 };\n}\n\nfunction mixHexColor(colorA: string, colorB: string, ratio: number): string {\n const rgbA = hexToRgb(colorA);\n const rgbB = hexToRgb(colorB);\n const r = Math.round(rgbA.r + (rgbB.r - rgbA.r) * ratio);\n const g = Math.round(rgbA.g + (rgbB.g - rgbA.g) * ratio);\n const b = Math.round(rgbA.b + (rgbB.b - rgbA.b) * ratio);\n const toHex = (c: number) => {\n const s = Math.max(0, Math.min(255, c)).toString(16);\n return s.length === 1 ? \"0\" + s : s;\n };\n return `#${toHex(r)}${toHex(g)}${toHex(b)}`;\n}\n\nexport function renderTextEffectCore(ctx: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D, cfg: TextEffectConfig): void {\n if (cfg.customRenderer === \"InkBrushEngine\") {\n const engine = new InkBrushEngine(cfg);\n engine.drawFrame(ctx);\n return;\n }\n\n const { text, fontFamily, fontWeight, fontStyle, fontSize, letterSpacing, lineHeight, fillType, fillColor, fillGradientAngle, fillGradientStops, patternType, strokeEnabled, strokeColor, strokeWidth, strokePosition, strokeOpacity, strokeLineJoin, strokeBlur, strokeType, strokeColorSecondary, strokeWidthSecondary, strokeFadeRange, glowLayers, shadowEnabled, shadowColor, shadowBlur, shadowOffsetX, shadowOffsetY, shadowOpacity, shadowType, bevelEnabled, bevelDepth, bevelHighlight, bevelShadow, bevelDirection, bevelCoreColor, bevelEdgeColor, bevelEdgeWidth, bevelBlur, bevelBlurColor, bevelPerspectiveEnabled, bevelVanishingPointX, bevelVanishingPointY, bevelFocalLength, stackEnabled, stackCount, stackOffsetX, stackOffsetY, stackOpacityDecay, stackColor1, stackColor2, stackColor3, stackColor4, panelEnabled, panelColor, panelOpacity, panelRadius, panelPaddingX, panelPaddingY, panelStrokeEnabled, panelStrokeColor, panelStrokeWidth, canvasWidth, canvasHeight, textPosX, textPosY } = cfg;\n\n // 1. Initial configuration\n ctx.imageSmoothingEnabled = true;\n\n ctx.lineJoin = strokeLineJoin;\n\n const cWidth = canvasWidth || 800;\n const cHeight = canvasHeight || 200;\n\n const layout = computeTextLayout(ctx, cfg, {\n wrap: cfg.wrapText !== false,\n autoFit: !!cfg.autoFitText,\n });\n\n const lines = layout.lines;\n const numLines = lines.length;\n const effectiveFontSize = layout.fontSize;\n const lineAdvance = effectiveFontSize * lineHeight;\n const textBlockHeight = layout.bounds.textBlockHeight;\n let startX = layout.startX;\n let startY = layout.startY;\n const align = layout.align;\n const maxLineWidth = layout.bounds.maxLineWidth;\n const lineWidths = layout.lineWidths;\n\n const fontStr = `${fontStyle} ${fontWeight} ${effectiveFontSize}px \"${fontFamily}\"`;\n ctx.font = fontStr;\n ctx.textAlign = align;\n if (letterSpacing !== 0) {\n (ctx as any).letterSpacing = `${letterSpacing}px`;\n }\n\n let xMin = layout.bounds.xMin;\n let xMax = layout.bounds.xMax;\n let yMin = layout.bounds.yMin;\n let yMax = layout.bounds.yMax;\n\n // Calculate 3D extrusion offsets and shift coordinate system to center the entire block\n let shiftX_half = 0;\n let shiftY_half = 0;\n\n if (bevelEnabled && bevelDepth > 0) {\n if (bevelPerspectiveEnabled) {\n const vpx = cWidth / 2 + ((bevelVanishingPointX !== undefined ? bevelVanishingPointX : 40) / 100) * (cWidth / 2);\n const vpy = cHeight / 2 + ((bevelVanishingPointY !== undefined ? bevelVanishingPointY : 80) / 100) * (cHeight / 2);\n const fl = Math.max(100, bevelFocalLength !== undefined ? bevelFocalLength : 400);\n const scale = fl / (fl + bevelDepth);\n const shiftX_back = (vpx - startX) * (1 - scale);\n const shiftY_back = (vpy - startY) * (1 - scale);\n shiftX_half = shiftX_back / 2;\n shiftY_half = shiftY_back / 2;\n } else {\n let dx = 0;\n let dy = 0;\n if (bevelDirection === \"bottom-right\") {\n dx = bevelDepth;\n dy = bevelDepth;\n } else if (bevelDirection === \"bottom\") {\n dy = bevelDepth;\n } else if (bevelDirection === \"right\") {\n dx = bevelDepth;\n }\n shiftX_half = dx / 2;\n shiftY_half = dy / 2;\n }\n\n // Shift starting coordinates so the complete 3D box is centered visually\n startX -= shiftX_half;\n startY -= shiftY_half;\n xMin -= shiftX_half;\n xMax -= shiftX_half;\n yMin -= shiftY_half;\n yMax -= shiftY_half;\n }\n\n // Now calculate the exact joint bounding box bounds for the panel (around shifted values)\n let total_xMin = xMin;\n let total_xMax = xMax;\n let total_yMin = yMin;\n let total_yMax = yMax;\n\n if (bevelEnabled && bevelDepth > 0) {\n if (bevelPerspectiveEnabled) {\n const vpx = cWidth / 2 + ((bevelVanishingPointX !== undefined ? bevelVanishingPointX : 40) / 100) * (cWidth / 2);\n const vpy = cHeight / 2 + ((bevelVanishingPointY !== undefined ? bevelVanishingPointY : 80) / 100) * (cHeight / 2);\n const fl = Math.max(100, bevelFocalLength !== undefined ? bevelFocalLength : 400);\n const scale = fl / (fl + bevelDepth);\n\n const x_new_left = vpx + (xMin - vpx) * scale;\n const x_new_right = vpx + (xMax - vpx) * scale;\n const y_new_top = vpy + (yMin - vpy) * scale;\n const y_new_bottom = vpy + (yMax - vpy) * scale;\n\n total_xMin = Math.min(xMin, x_new_left, x_new_right);\n total_xMax = Math.max(xMax, x_new_left, x_new_right);\n total_yMin = Math.min(yMin, y_new_top, y_new_bottom);\n total_yMax = Math.max(yMax, y_new_top, y_new_bottom);\n } else {\n let dx = 0;\n let dy = 0;\n if (bevelDirection === \"bottom-right\") {\n dx = bevelDepth;\n dy = bevelDepth;\n } else if (bevelDirection === \"bottom\") {\n dy = bevelDepth;\n } else if (bevelDirection === \"right\") {\n dx = bevelDepth;\n }\n\n total_xMin = Math.min(xMin, xMin + dx);\n total_xMax = Math.max(xMax, xMax + dx);\n total_yMin = Math.min(yMin, yMin + dy);\n total_yMax = Math.max(yMax, yMax + dy);\n }\n }\n\n // Helper to apply letter spacing to individual lines during render\n const usePerCharFill = shouldUsePerCharFill(cfg);\n const perCharColors = cfg.charFillColors ?? [];\n\n const renderLines = (mode: \"fill\" | \"stroke\", overrideStyle?: string | CanvasGradient | CanvasPattern, offsetX = 0, offsetY = 0, options?: { perCharFill?: boolean }) => {\n if (options?.perCharFill && usePerCharFill && mode === \"fill\" && !overrideStyle) {\n drawPerCharText(ctx, {\n lines,\n startX,\n startY,\n lineAdvance,\n align,\n letterSpacing,\n charFillColors: perCharColors,\n defaultColor: fillColor,\n mode: \"fill\",\n offsetX,\n offsetY,\n });\n return;\n }\n\n const savedLetterSpacing = (ctx as any).letterSpacing || \"normal\";\n if (letterSpacing !== 0) {\n (ctx as any).letterSpacing = `${letterSpacing}px`;\n }\n\n if (overrideStyle) {\n if (mode === \"fill\") {\n ctx.fillStyle = overrideStyle;\n } else {\n ctx.strokeStyle = overrideStyle;\n }\n }\n\n lines.forEach((line, index) => {\n const py = startY + index * lineAdvance;\n if (mode === \"fill\") {\n ctx.fillText(line, startX + offsetX, py + offsetY);\n } else {\n ctx.strokeText(line, startX + offsetX, py + offsetY);\n }\n });\n\n (ctx as any).letterSpacing = savedLetterSpacing;\n };\n\n // Helper using offscreen shadow projection trick\n const renderWithShadowTrick = (mode: \"fill\" | \"stroke\", sColor: string, sBlur: number, sOffsetX: number, sOffsetY: number, opacity: number, overrideStyle = \"#000\", spread = 0) => {\n ctx.save();\n ctx.globalAlpha = opacity / 100;\n\n const shiftX = 10000; // Shift offscreen\n ctx.shadowColor = sColor;\n ctx.shadowBlur = sBlur;\n ctx.shadowOffsetX = shiftX + sOffsetX;\n ctx.shadowOffsetY = sOffsetY;\n\n // Draw text shifted, shadow gets projected back perfectly\n const savedLetterSpacing = (ctx as any).letterSpacing || \"normal\";\n if (letterSpacing !== 0) {\n (ctx as any).letterSpacing = `${letterSpacing}px`;\n }\n\n const prevStyle = mode === \"fill\" ? ctx.fillStyle : ctx.strokeStyle;\n if (mode === \"fill\") {\n ctx.fillStyle = overrideStyle;\n } else {\n ctx.strokeStyle = overrideStyle;\n }\n\n const prevStrokeStyle = ctx.strokeStyle;\n const prevLineWidth = ctx.lineWidth;\n if (spread > 0) {\n ctx.strokeStyle = overrideStyle;\n ctx.lineWidth = spread * 2;\n ctx.lineJoin = strokeLineJoin;\n }\n\n lines.forEach((line, index) => {\n const py = startY + index * lineAdvance;\n if (mode === \"fill\") {\n if (spread > 0) {\n ctx.strokeText(line, startX - shiftX, py);\n }\n ctx.fillText(line, startX - shiftX, py);\n } else {\n ctx.strokeText(line, startX - shiftX, py);\n }\n });\n\n (ctx as any).letterSpacing = savedLetterSpacing;\n if (mode === \"fill\") {\n ctx.fillStyle = prevStyle;\n } else {\n ctx.strokeStyle = prevStyle;\n }\n if (spread > 0) {\n ctx.strokeStyle = prevStrokeStyle;\n ctx.lineWidth = prevLineWidth;\n }\n\n ctx.restore();\n };\n\n // ──────────────────────────────────────────────────────────────────\n // 1. Background Panel\n // ──────────────────────────────────────────────────────────────────\n if (panelEnabled) {\n ctx.save();\n ctx.globalAlpha = panelOpacity / 100;\n ctx.fillStyle = panelColor;\n\n const px = total_xMin - panelPaddingX;\n const py = total_yMin - panelPaddingY;\n const pw = total_xMax - total_xMin + 2 * panelPaddingX;\n const ph = total_yMax - total_yMin + 2 * panelPaddingY;\n\n const cx = px + pw / 2;\n const cy = py + ph / 2;\n\n const isComicBurst = cfg.effectName.toLowerCase().includes(\"comic\") || (cfg as any).panelStyle === \"burst\";\n\n ctx.beginPath();\n if (isComicBurst) {\n // Render a hand-drawn comic book styled jagged explosion\n const numPoints = 36;\n const rx = pw * 0.56;\n const ry = ph * 0.68;\n\n for (let i = 0; i < numPoints; i++) {\n const angle = (i / numPoints) * Math.PI * 2;\n // Organic-looking jagged comic spikes\n const wave1 = Math.sin(angle * 8) * 0.12;\n const wave3 = Math.cos(angle * 14) * 0.05;\n const isSpikePeak = i % 2 === 0;\n const depthFactor = isSpikePeak ? 1.12 + wave1 + wave3 : 0.76 - wave3;\n\n const sx = cx + Math.cos(angle) * rx * depthFactor;\n const sy = cy + Math.sin(angle) * ry * depthFactor;\n if (i === 0) {\n ctx.moveTo(sx, sy);\n } else {\n ctx.lineTo(sx, sy);\n }\n }\n } else {\n ctx.roundRect(px, py, pw, ph, panelRadius);\n }\n ctx.closePath();\n ctx.fill();\n\n if (panelStrokeEnabled) {\n ctx.strokeStyle = panelStrokeColor;\n ctx.lineWidth = panelStrokeWidth;\n const prevLineJoin = ctx.lineJoin;\n if (isComicBurst) {\n ctx.lineJoin = \"miter\";\n }\n ctx.stroke();\n ctx.lineJoin = prevLineJoin;\n }\n ctx.restore();\n }\n\n // ──────────────────────────────────────────────────────────────────\n // 2. Glow Layers (Type: Outer)\n // ──────────────────────────────────────────────────────────────────\n glowLayers.forEach((layer) => {\n if (layer.enabled && layer.type === \"outer\" && layer.opacity > 0) {\n const renderCount = Math.max(1, Math.min(20, layer.strength ?? 1));\n for (let i = 0; i < renderCount; i++) {\n renderWithShadowTrick(\"fill\", layer.color, layer.blur, 0, 0, layer.opacity, \"#000\", layer.spread ?? 0);\n }\n }\n });\n\n // ──────────────────────────────────────────────────────────────────\n // 3. Drop Shadow (Before fill, type \"drop\")\n // ──────────────────────────────────────────────────────────────────\n if (shadowEnabled && shadowType === \"drop\" && shadowOpacity > 0) {\n if (bevelEnabled && bevelDepth > 0) {\n if (bevelPerspectiveEnabled) {\n const vpx = cWidth / 2 + ((bevelVanishingPointX !== undefined ? bevelVanishingPointX : 40) / 100) * (cWidth / 2);\n const vpy = cHeight / 2 + ((bevelVanishingPointY !== undefined ? bevelVanishingPointY : 80) / 100) * (cHeight / 2);\n const fl = Math.max(100, bevelFocalLength !== undefined ? bevelFocalLength : 400);\n const scale = fl / (fl + bevelDepth);\n\n ctx.save();\n ctx.translate(vpx, vpy);\n ctx.scale(scale, scale);\n ctx.translate(-vpx, -vpy);\n\n renderWithShadowTrick(\"fill\", shadowColor, shadowBlur, shadowOffsetX, shadowOffsetY, shadowOpacity);\n ctx.restore();\n } else {\n let dx = 0;\n let dy = 0;\n if (bevelDirection === \"bottom-right\") {\n dx = bevelDepth;\n dy = bevelDepth;\n } else if (bevelDirection === \"bottom\") {\n dy = bevelDepth;\n } else if (bevelDirection === \"right\") {\n dx = bevelDepth;\n }\n\n renderWithShadowTrick(\"fill\", shadowColor, shadowBlur, shadowOffsetX + dx, shadowOffsetY + dy, shadowOpacity);\n }\n } else {\n renderWithShadowTrick(\"fill\", shadowColor, shadowBlur, shadowOffsetX, shadowOffsetY, shadowOpacity);\n }\n }\n\n // ──────────────────────────────────────────────────────────────────\n // 4. Glitch Corrupt Preset custom RGB Split & Scanlines\n // We explicitly handle this aesthetic if enabled\n // ──────────────────────────────────────────────────────────────────\n const isGlitch = cfg.effectName.toLowerCase().includes(\"glitch\") || cfg.text === \"SYSTEM ERR\";\n if (isGlitch) {\n ctx.save();\n // Cyan split offset\n ctx.globalAlpha = 0.8;\n renderLines(\"fill\", \"#00FFFF\", -4, -2);\n // Magenta split offset\n renderLines(\"fill\", \"#FF00FF\", 4, 2);\n ctx.restore();\n }\n\n // ──────────────────────────────────────────────────────────────────\n // 5. Bevel Stacked Copies (3D Bevel) — Gradient-shaded depth faces\n // ──────────────────────────────────────────────────────────────────\n if (bevelEnabled && bevelDepth > 0) {\n // ── Shared helpers ─────────────────────────────────────────────\n const shadowRgb = hexToRgb(bevelShadow || \"#1A0A00\");\n const coreRgb = hexToRgb(bevelCoreColor || bevelShadow || \"#3A1A00\");\n const highlightRgb = hexToRgb(bevelHighlight || \"#FFFFFF\");\n\n /**\n * Interpolate across a 3-stop gradient:\n * t=0 → bevelShadow (deepest back slab)\n * t=0.5 → bevelCoreColor (mid-depth)\n * t=1 → bevelHighlight (closest to front face)\n * Uses ease-in-out curve for more realistic falloff.\n */\n const shadeForDepth = (t: number): string => {\n // ease-in-out\n const eased = t < 0.5 ? 2 * t * t : -1 + (4 - 2 * t) * t;\n if (eased <= 0.5) {\n const u = eased * 2;\n const r = Math.round(shadowRgb.r + (coreRgb.r - shadowRgb.r) * u);\n const g = Math.round(shadowRgb.g + (coreRgb.g - shadowRgb.g) * u);\n const b = Math.round(shadowRgb.b + (coreRgb.b - shadowRgb.b) * u);\n return `rgb(${r},${g},${b})`;\n } else {\n const u = (eased - 0.5) * 2;\n const r = Math.round(coreRgb.r + (highlightRgb.r - coreRgb.r) * u);\n const g = Math.round(coreRgb.g + (highlightRgb.g - coreRgb.g) * u);\n const b = Math.round(coreRgb.b + (highlightRgb.b - coreRgb.b) * u);\n return `rgb(${r},${g},${b})`;\n }\n };\n\n if (bevelPerspectiveEnabled) {\n const vpx = cWidth / 2 + ((bevelVanishingPointX !== undefined ? bevelVanishingPointX : 40) / 100) * (cWidth / 2);\n const vpy = cHeight / 2 + ((bevelVanishingPointY !== undefined ? bevelVanishingPointY : 80) / 100) * (cHeight / 2);\n const fl = Math.max(100, bevelFocalLength !== undefined ? bevelFocalLength : 400);\n\n // 5a. Ambient occlusion / depth glow blur underneath\n if (bevelBlur && bevelBlur > 0) {\n ctx.save();\n ctx.filter = `blur(${bevelBlur}px)`;\n const blurColor = bevelBlurColor || bevelShadow || \"#000000\";\n for (let i = bevelDepth; i > 0; i -= Math.max(1, Math.floor(bevelDepth / 4))) {\n const scale = fl / (fl + i);\n ctx.save();\n ctx.translate(vpx, vpy);\n ctx.scale(scale, scale);\n ctx.translate(-vpx, -vpy);\n renderLines(\"fill\", blurColor);\n ctx.restore();\n }\n ctx.restore();\n }\n\n // 5b. Gradient-shaded extrusion slabs (back to front)\n ctx.save();\n for (let i = bevelDepth; i > 0; i--) {\n // t=0 at deepest slab, t→1 approaching front face\n const t = 1 - (i - 1) / Math.max(1, bevelDepth - 1);\n // Ambient occlusion: deep slabs are darkened further\n const aoFactor = 0.35 + 0.65 * (1 - (i - 1) / Math.max(1, bevelDepth));\n const baseColor = shadeForDepth(t);\n\n // Apply AO darkening by blending base color toward black\n const bRgb = hexToRgb(baseColor.startsWith(\"#\") ? baseColor : \"#000000\");\n const baseRgbParsed = (() => {\n const m = baseColor.match(/rgb\\((\\d+),(\\d+),(\\d+)\\)/);\n return m ? { r: +m[1], g: +m[2], b: +m[3] } : bRgb;\n })();\n const aoColor = `rgb(${Math.round(baseRgbParsed.r * aoFactor)},${Math.round(baseRgbParsed.g * aoFactor)},${Math.round(baseRgbParsed.b * aoFactor)})`;\n\n const scale = fl / (fl + i);\n ctx.save();\n ctx.translate(vpx, vpy);\n ctx.scale(scale, scale);\n ctx.translate(-vpx, -vpy);\n renderLines(\"fill\", aoColor);\n\n if (bevelEdgeWidth && bevelEdgeWidth > 0) {\n ctx.save();\n ctx.strokeStyle = bevelEdgeColor || \"#000000\";\n ctx.lineWidth = bevelEdgeWidth;\n ctx.lineJoin = strokeLineJoin || \"round\";\n renderLines(\"stroke\");\n ctx.restore();\n }\n ctx.restore();\n }\n ctx.restore();\n\n // 5c. Specular highlight stroke on front-face top edge\n if (bevelEdgeWidth && bevelEdgeWidth > 0) {\n ctx.save();\n ctx.globalAlpha = 0.6;\n ctx.strokeStyle = bevelHighlight;\n ctx.lineWidth = Math.max(0.5, (bevelEdgeWidth || 1) * 0.5);\n ctx.lineJoin = strokeLineJoin || \"round\";\n renderLines(\"stroke\");\n ctx.restore();\n }\n } else {\n // ── Flat-direction extrusion (bottom-right / bottom / right) ──\n\n const getDirOffset = (i: number): { dx: number; dy: number } => {\n if (bevelDirection === \"bottom-right\") return { dx: i, dy: i };\n if (bevelDirection === \"bottom\") return { dx: 0, dy: i };\n if (bevelDirection === \"right\") return { dx: i, dy: 0 };\n return { dx: i, dy: i };\n };\n\n // 5a. Ambient occlusion blur\n if (bevelBlur && bevelBlur > 0) {\n ctx.save();\n ctx.filter = `blur(${bevelBlur}px)`;\n const blurColor = bevelBlurColor || bevelShadow || \"#000000\";\n for (let i = bevelDepth; i > 0; i -= Math.max(1, Math.floor(bevelDepth / 4))) {\n const { dx, dy } = getDirOffset(i);\n renderLines(\"fill\", blurColor, dx, dy);\n }\n ctx.restore();\n }\n\n // 5b. Gradient-shaded extrusion slabs\n ctx.save();\n for (let i = bevelDepth; i > 0; i--) {\n const { dx, dy } = getDirOffset(i);\n\n // t=0 at deepest, t=1 at front\n const t = 1 - (i - 1) / Math.max(1, bevelDepth - 1);\n\n // AO darkening: corners/edges of deep slabs get extra shadow\n // For bottom-right, the diagonal slabs are darkest; side-facing\n // surfaces should be darker than the front face.\n const depthRatio = (i - 1) / Math.max(1, bevelDepth - 1); // 0=front, 1=back\n const aoFactor = 0.25 + 0.75 * (1 - depthRatio * 0.8);\n\n const baseColor = shadeForDepth(t);\n const baseRgbParsed = (() => {\n const m = baseColor.match(/rgb\\((\\d+),(\\d+),(\\d+)\\)/);\n return m ? { r: +m[1], g: +m[2], b: +m[3] } : shadowRgb;\n })();\n const shadedColor = `rgb(${Math.round(baseRgbParsed.r * aoFactor)},${Math.round(baseRgbParsed.g * aoFactor)},${Math.round(baseRgbParsed.b * aoFactor)})`;\n\n renderLines(\"fill\", shadedColor, dx, dy);\n\n if (bevelEdgeWidth && bevelEdgeWidth > 0) {\n ctx.save();\n // Edge gets progressively darker toward back\n ctx.globalAlpha = 0.4 + 0.6 * (1 - depthRatio);\n ctx.strokeStyle = bevelEdgeColor || \"#000000\";\n ctx.lineWidth = bevelEdgeWidth;\n ctx.lineJoin = strokeLineJoin || \"round\";\n renderLines(\"stroke\", undefined, dx, dy);\n ctx.restore();\n }\n }\n ctx.restore();\n\n // 5c. Specular rim highlight on front-face edge (top-left catch light)\n ctx.save();\n ctx.globalAlpha = 0.5;\n ctx.strokeStyle = bevelHighlight;\n ctx.lineWidth = Math.max(0.5, bevelEdgeWidth || 1.5);\n ctx.lineJoin = \"round\";\n renderLines(\"stroke\", bevelHighlight, 0, 0);\n ctx.restore();\n }\n }\n\n // ──────────────────────────────────────────────────────────────────\n // 6. Stroke (Under Fill if position inside/outside)\n // ──────────────────────────────────────────────────────────────────\n const applyStroke = () => {\n ctx.save();\n\n const sType = strokeType || \"single\";\n const sBlur = strokeBlur || 0;\n const sColorSecondary = strokeColorSecondary || \"#FFFFFF\";\n const sWidthSecondary = strokeWidthSecondary !== undefined ? strokeWidthSecondary : 4;\n const sFadeRange = strokeFadeRange || 0;\n\n // Line join alignment\n ctx.lineJoin = strokeLineJoin || \"round\";\n\n // 1. Resolve Stroke Style (Color or Gradient/Fade)\n let customStrokeStyle: string | CanvasGradient = strokeColor;\n if (sFadeRange > 0) {\n // Build beautiful vertical fade gradient\n const grad = ctx.createLinearGradient(0, yMin, 0, yMax);\n const rgb = hexToRgb(strokeColor);\n // Base stroke color at peak opacity, fading to 0\n grad.addColorStop(0, `rgba(${rgb.r}, ${rgb.g}, ${rgb.b}, ${strokeOpacity / 100})`);\n const fadeLimit = Math.min(1.0, sFadeRange / 100);\n grad.addColorStop(fadeLimit, `rgba(${rgb.r}, ${rgb.g}, ${rgb.b}, 0)`);\n grad.addColorStop(1.0, `rgba(${rgb.r}, ${rgb.g}, ${rgb.b}, 0)`);\n customStrokeStyle = grad;\n }\n\n const drawStrokeLayer = (color: string | CanvasGradient, width: number, blurAmount: number, opacity: number, position: string) => {\n ctx.save();\n ctx.globalAlpha = opacity / 100;\n ctx.strokeStyle = color;\n\n // Handle filter blur natively if supported\n if (blurAmount > 0) {\n ctx.filter = `blur(${blurAmount}px)`;\n }\n\n if (position === \"outside\") {\n ctx.lineWidth = width * 2;\n renderLines(\"stroke\");\n } else if (position === \"center\") {\n ctx.lineWidth = width;\n renderLines(\"stroke\");\n } else if (position === \"inside\") {\n // Inside clipping using source-atop\n ctx.globalCompositeOperation = \"source-atop\";\n ctx.lineWidth = width * 2;\n renderLines(\"stroke\");\n }\n ctx.restore();\n };\n\n // 2. Multi-layer stroke rendering according to type\n if (sType === \"double\") {\n // Outer border (secondary): drawn wider underneath\n const outerWidth = strokeWidth + sWidthSecondary;\n drawStrokeLayer(sColorSecondary, outerWidth, sBlur, strokeOpacity, strokePosition);\n\n // Inner border (primary): drawn sharper on top\n drawStrokeLayer(\n customStrokeStyle,\n strokeWidth,\n 0, // inner remains crisp\n strokeOpacity,\n strokePosition,\n );\n } else if (sType === \"neon\") {\n // Glowing outline style\n // Neon Backing Glow\n drawStrokeLayer(\n strokeColor,\n strokeWidth * 1.8,\n sBlur || 8, // fallback blur to look gorgeous\n strokeOpacity * 0.7,\n strokePosition,\n );\n // Core Neon White center\n drawStrokeLayer(\"#FFFFFF\", strokeWidth * 0.5, 0, 95, strokePosition);\n } else {\n // Normal Single Stroke with customizable blur\n drawStrokeLayer(customStrokeStyle, strokeWidth, sBlur, strokeOpacity, strokePosition);\n }\n\n ctx.restore();\n };\n\n // ──────────────────────────────────────────────────────────────────\n // 6.5. Text Multi-Stack Layers\n // ──────────────────────────────────────────────────────────────────\n if (stackEnabled && (stackCount ?? 0) >= 1) {\n const cnt = stackCount ?? 3;\n const offX = stackOffsetX ?? 10;\n const offY = stackOffsetY ?? -10;\n const decay = (stackOpacityDecay ?? 20) / 100;\n const stackColors = [stackColor1 || \"#FF7C00\", stackColor2 || \"#00FFDD\", stackColor3 || \"#FF00AA\", stackColor4 || \"#AA00FF\"];\n\n for (let s = cnt; s >= 1; s--) {\n ctx.save();\n const dx = s * offX;\n const dy = s * offY;\n\n const layerOpacity = Math.max(0.01, 1 - s * decay);\n ctx.globalAlpha = layerOpacity;\n\n const layerColor = stackColors[(s - 1) % stackColors.length] || \"#FFFFFF\";\n\n if (strokeEnabled && strokeWidth > 0 && strokePosition !== \"inside\") {\n ctx.save();\n ctx.strokeStyle = layerColor;\n ctx.lineWidth = strokeWidth;\n ctx.lineJoin = strokeLineJoin;\n ctx.globalAlpha = (strokeOpacity / 100) * layerOpacity;\n renderLines(\"stroke\", layerColor, dx, dy);\n ctx.restore();\n }\n\n renderLines(\"fill\", layerColor, dx, dy);\n ctx.restore();\n }\n }\n\n if (strokeEnabled && strokeWidth > 0 && strokePosition !== \"inside\") {\n applyStroke();\n }\n\n // ──────────────────────────────────────────────────────────────────\n // 7. Text Fill\n // ──────────────────────────────────────────────────────────────────\n ctx.save();\n let textFill: string | CanvasGradient | CanvasPattern = fillColor;\n\n if (fillType === \"linear\" && fillGradientStops.length >= 2) {\n const angleRad = (fillGradientAngle * Math.PI) / 180;\n const cx = (xMin + xMax) / 2;\n const cy = (yMin + yMax) / 2;\n const r = Math.max(xMax - xMin, yMax - yMin) / 2;\n\n const x0 = cx - Math.cos(angleRad) * r;\n const y0 = cy - Math.sin(angleRad) * r;\n const x1 = cx + Math.cos(angleRad) * r;\n const y1 = cy + Math.sin(angleRad) * r;\n\n const grad = ctx.createLinearGradient(x0, y0, x1, y1);\n fillGradientStops.forEach((stop) => {\n grad.addColorStop(stop.offset / 100, stop.color);\n });\n textFill = grad;\n } else if (fillType === \"radial\" && fillGradientStops.length >= 2) {\n const cx = (xMin + xMax) / 2;\n const cy = (yMin + yMax) / 2;\n const r = Math.max(xMax - xMin, yMax - yMin) / 1.5;\n\n const grad = ctx.createRadialGradient(cx, cy, 2, cx, cy, r);\n fillGradientStops.forEach((stop) => {\n grad.addColorStop(stop.offset / 100, stop.color);\n });\n textFill = grad;\n } else if (fillType === \"pattern\") {\n const pType = patternType || \"chalk\";\n const patColor = fillColor || \"#ffffff\";\n\n const patCanvas = createCanvas(128, 128);\n // Pick ideal canvas dimension per pattern style\n if (pType === \"carbon\") {\n patCanvas.width = 8;\n patCanvas.height = 8;\n } else if (pType === \"stripes\") {\n patCanvas.width = 16;\n patCanvas.height = 16;\n } else if (pType === \"halftone\") {\n patCanvas.width = 24;\n patCanvas.height = 24;\n } else if (pType === \"noise\") {\n patCanvas.width = 96;\n patCanvas.height = 96;\n } else if (pType === \"film\" || pType === \"brushed\" || pType === \"paper\") {\n patCanvas.width = 128;\n patCanvas.height = 128;\n } else if (pType === \"marble\") {\n patCanvas.width = 256;\n patCanvas.height = 256;\n } else {\n patCanvas.width = 120;\n patCanvas.height = 120;\n }\n\n const patCtx = getCanvas2DContext(patCanvas)!;\n\n // Fast stable linear congruential seeded random helper (prevents render flickering)\n const seedRandom = (initSeed: number) => {\n let currentSeed = initSeed;\n return () => {\n currentSeed = (currentSeed * 1664525 + 1013904223) % 4294967296;\n return currentSeed / 4294967296;\n };\n };\n const rand = seedRandom(42); // stable fixed seed\n\n if (pType === \"chalk\") {\n patCtx.fillStyle = \"rgba(0,0,0,0)\";\n patCtx.fillRect(0, 0, 120, 120);\n\n // 1. Base organic granular/stipple tooth layer\n patCtx.fillStyle = patColor;\n for (let i = 0; i < 3500; i++) {\n const px = Math.floor(rand() * 120);\n const py = Math.floor(rand() * 120);\n patCtx.globalAlpha = 0.08 + rand() * 0.18;\n patCtx.fillRect(px, py, 1.2, 1.2);\n }\n\n // 2. Beautiful hand-scribbled cross-hatch strokes in 4 orientations\n patCtx.strokeStyle = patColor;\n for (let s = 0; s < 4; s++) {\n const angle = (s * Math.PI) / 4 + (rand() - 0.5) * 0.15;\n patCtx.lineWidth = 0.5 + rand() * 0.9;\n\n for (let i = 0; i < 40; i++) {\n patCtx.globalAlpha = 0.05 + rand() * 0.16;\n patCtx.beginPath();\n\n const startX = rand() * 120;\n const startY = rand() * 120;\n const len = 15 + rand() * 30;\n\n patCtx.moveTo(startX, startY);\n patCtx.lineTo(startX + Math.cos(angle) * len, startY + Math.sin(angle) * len);\n patCtx.stroke();\n }\n }\n\n // 3. Round chalk dust/sponge overlays\n for (let i = 0; i < 220; i++) {\n const cx = rand() * 120;\n const cy = rand() * 120;\n const r = 1 + rand() * 3;\n patCtx.globalAlpha = 0.03 + rand() * 0.08;\n patCtx.fillStyle = patColor;\n patCtx.beginPath();\n patCtx.arc(cx, cy, r, 0, Math.PI * 2);\n patCtx.fill();\n }\n } else if (pType === \"noise\") {\n patCtx.fillStyle = \"rgba(0,0,0,0)\";\n patCtx.fillRect(0, 0, 96, 96);\n\n patCtx.fillStyle = patColor;\n // Fine micro grainy texture\n for (let i = 0; i < 4500; i++) {\n const px = Math.floor(rand() * 96);\n const py = Math.floor(rand() * 96);\n patCtx.globalAlpha = 0.12 + rand() * 0.38;\n patCtx.fillRect(px, py, rand() > 0.85 ? 1.5 : 1, rand() > 0.85 ? 1.5 : 1);\n }\n\n // Speckled paper pulp bits\n for (let i = 0; i < 150; i++) {\n const px = Math.floor(rand() * 96);\n const py = Math.floor(rand() * 96);\n const size = 1.6 + rand() * 1.5;\n patCtx.globalAlpha = 0.05 + rand() * 0.12;\n patCtx.fillRect(px, py, size, size);\n }\n } else if (pType === \"grunge\") {\n patCtx.fillStyle = \"rgba(0,0,0,0)\";\n patCtx.fillRect(0, 0, 128, 128);\n\n // 1. Organic distress paint eroded splotches\n patCtx.fillStyle = patColor;\n for (let i = 0; i < 60; i++) {\n const cx = rand() * 128;\n const cy = rand() * 128;\n const r = 3 + rand() * 18;\n patCtx.globalAlpha = 0.06 + rand() * 0.15;\n patCtx.beginPath();\n patCtx.arc(cx, cy, r, 0, Math.PI * 2);\n patCtx.fill();\n }\n\n // 2. Weathered cracks/scratch lines\n patCtx.strokeStyle = patColor;\n for (let i = 0; i < 22; i++) {\n const sx = rand() * 128;\n const sy = rand() * 128;\n const angle = (rand() * Math.PI) / 3 - Math.PI / 6;\n const len = 12 + rand() * 25;\n patCtx.lineWidth = 0.5 + rand() * 1.5;\n patCtx.globalAlpha = 0.15 + rand() * 0.25;\n\n patCtx.beginPath();\n patCtx.moveTo(sx, sy);\n patCtx.lineTo(sx + Math.cos(angle) * len, sy + Math.sin(angle) * len);\n patCtx.stroke();\n }\n\n // 3. Erosion speckles\n for (let i = 0; i < 1800; i++) {\n const px = Math.floor(rand() * 128);\n const py = Math.floor(rand() * 128);\n patCtx.globalAlpha = 0.08 + rand() * 0.22;\n patCtx.fillRect(px, py, 1.2, 1.2);\n }\n } else if (pType === \"carbon\") {\n patCtx.fillStyle = \"rgba(0,0,0,0.15)\";\n patCtx.fillRect(0, 0, 8, 8);\n\n patCtx.fillStyle = patColor;\n patCtx.globalAlpha = 0.65;\n patCtx.fillRect(0, 0, 4, 4);\n patCtx.fillRect(4, 4, 4, 4);\n\n // Weave highlights\n patCtx.fillStyle = \"#FFFFFF\";\n patCtx.globalAlpha = 0.22;\n patCtx.fillRect(0, 0, 4, 1);\n patCtx.fillRect(4, 4, 4, 1);\n\n // Weave shadows\n patCtx.fillStyle = \"#000000\";\n patCtx.globalAlpha = 0.35;\n patCtx.fillRect(0, 3, 4, 1);\n patCtx.fillRect(4, 7, 4, 1);\n } else if (pType === \"stripes\") {\n patCtx.fillStyle = \"rgba(0,0,0,0)\";\n patCtx.fillRect(0, 0, 16, 16);\n\n patCtx.strokeStyle = patColor;\n patCtx.lineWidth = 3.5;\n patCtx.globalAlpha = 0.65;\n\n patCtx.beginPath();\n // Infinite tileable slanted lines at 45deg\n patCtx.moveTo(-4, 12);\n patCtx.lineTo(12, -4);\n\n patCtx.moveTo(0, 16);\n patCtx.lineTo(16, 0);\n\n patCtx.moveTo(4, 20);\n patCtx.lineTo(20, 4);\n patCtx.stroke();\n } else if (pType === \"film\") {\n // Authentic cinematic weathered analog negative film texture\n patCtx.fillStyle = patColor;\n patCtx.globalAlpha = 0.94;\n patCtx.fillRect(0, 0, 128, 128);\n\n // 1. Silver-halide micro emulsion grain (salt & pepper stippling)\n for (let i = 0; i < 4800; i++) {\n const px = Math.floor(rand() * 128);\n const py = Math.floor(rand() * 128);\n const isDark = rand() > 0.45;\n patCtx.fillStyle = isDark ? \"#000000\" : \"#FFFFFF\";\n patCtx.globalAlpha = isDark ? 0.13 + rand() * 0.22 : 0.15 + rand() * 0.28;\n patCtx.fillRect(px, py, rand() > 0.9 ? 1.5 : 1, rand() > 0.9 ? 1.5 : 1);\n }\n\n // 2. High frequency hairline scratches (vertical lines from movie reels)\n patCtx.strokeStyle = \"rgba(255, 255, 255, 0.48)\";\n for (let i = 0; i < 10; i++) {\n const sx = rand() * 128;\n const sy = rand() * 128;\n const len = 12 + rand() * 45;\n const angle = -Math.PI / 2 + (rand() - 0.5) * 0.18; // mostly vertical vertical motion blur\n patCtx.lineWidth = 0.35 + rand() * 0.55;\n patCtx.globalAlpha = 0.22 + rand() * 0.38;\n\n patCtx.beginPath();\n patCtx.moveTo(sx, sy);\n patCtx.lineTo(sx + Math.cos(angle) * len, sy + Math.sin(angle) * len);\n patCtx.stroke();\n }\n\n // Add a few dark vertical emulsion scratches too\n patCtx.strokeStyle = \"rgba(0, 0, 0, 0.32)\";\n for (let i = 0; i < 5; i++) {\n const sx = rand() * 128;\n const sy = rand() * 128;\n const len = 15 + rand() * 50;\n const angle = -Math.PI / 2 + (rand() - 0.5) * 0.12;\n patCtx.lineWidth = 0.3 + rand() * 0.5;\n patCtx.globalAlpha = 0.18 + rand() * 0.25;\n\n patCtx.beginPath();\n patCtx.moveTo(sx, sy);\n patCtx.lineTo(sx + Math.cos(angle) * len, sy + Math.sin(angle) * len);\n patCtx.stroke();\n }\n\n // 3. Squiggly hair fibers & dust lint paths\n patCtx.strokeStyle = \"rgba(0, 0, 0, 0.48)\";\n for (let i = 0; i < 4; i++) {\n const sx = rand() * 128;\n const sy = rand() * 128;\n patCtx.lineWidth = 0.55 + rand() * 0.65;\n patCtx.globalAlpha = 0.35 + rand() * 0.3;\n\n patCtx.beginPath();\n patCtx.moveTo(sx, sy);\n // Curved organic fuzzy lint path\n patCtx.quadraticCurveTo(sx + (rand() - 0.5) * 16, sy + (rand() - 0.5) * 16, sx + (rand() - 0.5) * 28, sy + (rand() - 0.5) * 28);\n patCtx.stroke();\n }\n\n // 4. White light leaks/reflective silver specks\n patCtx.fillStyle = \"#FFFFFF\";\n for (let i = 0; i < 30; i++) {\n const cx = rand() * 128;\n const cy = rand() * 128;\n const r = 0.75 + rand() * 2.4;\n patCtx.globalAlpha = 0.25 + rand() * 0.5;\n patCtx.beginPath();\n patCtx.arc(cx, cy, r, 0, Math.PI * 2);\n patCtx.fill();\n }\n\n // 5. Dark soot/ash/fungus dots\n patCtx.fillStyle = \"#000000\";\n for (let i = 0; i < 20; i++) {\n const cx = rand() * 128;\n const cy = rand() * 128;\n const r = 0.65 + rand() * 2.0;\n patCtx.globalAlpha = 0.2 + rand() * 0.4;\n patCtx.beginPath();\n patCtx.arc(cx, cy, r, 0, Math.PI * 2);\n patCtx.fill();\n }\n } else if (pType === \"brushed\") {\n // High fidelity directional brushed metal finish\n patCtx.fillStyle = patColor;\n patCtx.fillRect(0, 0, 128, 128);\n\n // Horizontal hairline scratches & light/dark strips\n for (let i = 0; i < 350; i++) {\n const y = rand() * 128;\n const x = rand() * 128;\n const len = 30 + rand() * 80;\n const thickness = 0.5 + rand() * 1.5;\n const isLight = rand() > 0.45;\n\n patCtx.strokeStyle = isLight ? \"#FFFFFF\" : \"#000000\";\n patCtx.globalAlpha = isLight ? 0.04 + rand() * 0.12 : 0.03 + rand() * 0.08;\n patCtx.lineWidth = thickness;\n\n patCtx.beginPath();\n patCtx.moveTo(x, y);\n patCtx.lineTo(x + len, y); // horizontal brush\n patCtx.stroke();\n\n // Wrap-around for seamless tiling repeat\n if (x + len > 128) {\n patCtx.beginPath();\n patCtx.moveTo(x - 128, y);\n patCtx.lineTo(x + len - 128, y);\n patCtx.stroke();\n }\n }\n\n // Add subtle larger vertical grain/shading bands to break flat monotony\n for (let i = 0; i < 8; i++) {\n const x = rand() * 128;\n const w = 10 + rand() * 30;\n const isLight = rand() > 0.5;\n const grad = patCtx.createLinearGradient(x, 0, x + w, 0);\n const baseColor = isLight ? \"255,255,255\" : \"0,0,0\";\n const alpha = 0.01 + rand() * 0.04;\n grad.addColorStop(0, `rgba(${baseColor}, 0)`);\n grad.addColorStop(0.5, `rgba(${baseColor}, ${alpha})`);\n grad.addColorStop(1, `rgba(${baseColor}, 0)`);\n\n patCtx.fillStyle = grad;\n patCtx.globalAlpha = 1;\n patCtx.fillRect(x, 0, w, 128);\n\n // Wrap-around vertically/horizontally\n if (x + w > 128) {\n patCtx.fillRect(x - 128, 0, w, 128);\n }\n }\n } else if (pType === \"marble\") {\n // High luxury swirling stone veins\n patCtx.fillStyle = patColor;\n patCtx.fillRect(0, 0, 256, 256);\n\n // Soft broad marble smoke cloud layer\n for (let i = 0; i < 8; i++) {\n const cx = rand() * 256;\n const cy = rand() * 256;\n const r = 40 + rand() * 70;\n const grad = patCtx.createRadialGradient(cx, cy, 0, cx, cy, r);\n const isLight = rand() > 0.45;\n const alpha = 0.06 + rand() * 0.12;\n const cStr = isLight ? \"255,255,255\" : \"0,0,0\";\n grad.addColorStop(0, `rgba(${cStr}, ${alpha})`);\n grad.addColorStop(0.5, `rgba(${cStr}, ${alpha * 0.4})`);\n grad.addColorStop(1, `rgba(${cStr}, 0)`);\n\n patCtx.fillStyle = grad;\n patCtx.globalAlpha = 1;\n patCtx.beginPath();\n patCtx.arc(cx, cy, r, 0, Math.PI * 2);\n patCtx.fill();\n }\n\n // Procedural organic fracture veins\n const drawMarbleVein = (color: string, width: number, opac: number) => {\n patCtx.strokeStyle = color;\n patCtx.lineWidth = width;\n patCtx.globalAlpha = opac;\n\n // We start on one side, randomly walk to another\n let px = rand() * 256;\n let py = 0;\n patCtx.beginPath();\n patCtx.moveTo(px, py);\n\n const steps = 18;\n for (let s = 1; s <= steps; s++) {\n const progress = s / steps;\n const targetY = progress * 256;\n // Add fractal noise shift to X\n const frequency = 4;\n const amp = 35;\n const noise = Math.sin(progress * Math.PI * frequency + rand() * 2) * amp;\n const targetX = (px + (rand() - 0.5) * 50 + noise + 256) % 256;\n\n patCtx.lineTo(targetX, targetY);\n }\n patCtx.stroke();\n };\n\n // Draw primary deep veins\n for (let i = 0; i < 4; i++) {\n drawMarbleVein(\"#000000\", 1.2 + rand() * 1.5, 0.15 + rand() * 0.15);\n }\n // Draw secondary golden/light accent veins\n for (let i = 0; i < 3; i++) {\n const isGold = rand() > 0.4;\n const vColor = isGold ? \"#EAB308\" : \"#FFFFFF\"; // Gold or bright white\n drawMarbleVein(vColor, 0.7 + rand() * 0.8, 0.2 + rand() * 0.2);\n }\n // Draw micro thin hairline fractures\n for (let i = 0; i < 5; i++) {\n drawMarbleVein(\"#000000\", 0.4, 0.08 + rand() * 0.06);\n }\n } else if (pType === \"halftone\") {\n // Pop-art comic screen dot halftone print\n patCtx.fillStyle = \"rgba(0,0,0,0)\";\n patCtx.fillRect(0, 0, 24, 24);\n\n // Draw a dark halftone shadow dot\n const dotColor = fillColor || \"#ffffff\";\n\n // Halftone dots grid (offset pattern)\n patCtx.fillStyle = \"#000000\";\n patCtx.globalAlpha = 0.35;\n // Background dark shadow offset dot\n patCtx.beginPath();\n patCtx.arc(12, 12, 5.5, 0, Math.PI * 2);\n patCtx.arc(0, 0, 3.5, 0, Math.PI * 2);\n patCtx.arc(24, 0, 3.5, 0, Math.PI * 2);\n patCtx.arc(0, 24, 3.5, 0, Math.PI * 2);\n patCtx.arc(24, 24, 3.5, 0, Math.PI * 2);\n patCtx.fill();\n\n // Main foreground overlay dots\n patCtx.fillStyle = dotColor;\n patCtx.globalAlpha = 0.95;\n patCtx.beginPath();\n patCtx.arc(11, 11, 5.0, 0, Math.PI * 2);\n patCtx.arc(0, 0, 3.0, 0, Math.PI * 2);\n patCtx.arc(24, 0, 3.0, 0, Math.PI * 2);\n patCtx.arc(0, 24, 3.0, 0, Math.PI * 2);\n patCtx.arc(24, 24, 3.0, 0, Math.PI * 2);\n patCtx.fill();\n\n // Pop-art miniature helper offset microdots\n patCtx.fillStyle = dotColor === \"#FFFFFF\" || dotColor === \"#ffffff\" ? \"#7C6FFF\" : \"#FFFFFF\";\n patCtx.globalAlpha = 0.55;\n patCtx.beginPath();\n patCtx.arc(12, 0, 1.5, 0, Math.PI * 2);\n patCtx.arc(12, 24, 1.5, 0, Math.PI * 2);\n patCtx.arc(0, 12, 1.5, 0, Math.PI * 2);\n patCtx.arc(24, 12, 1.5, 0, Math.PI * 2);\n patCtx.fill();\n } else if (pType === \"paper\") {\n // High luxury organic crumpled Japanese handmade washi / craft paper\n patCtx.fillStyle = patColor;\n patCtx.fillRect(0, 0, 128, 128);\n\n // 1. Organic handmade pulp fiber threads\n for (let i = 0; i < 350; i++) {\n const fx = rand() * 128;\n const fy = rand() * 128;\n const flen = 3 + rand() * 12;\n const fangle = rand() * Math.PI * 2;\n const isDark = rand() > 0.4;\n\n patCtx.strokeStyle = isDark ? \"#000000\" : \"#FFFFFF\";\n patCtx.globalAlpha = isDark ? 0.03 + rand() * 0.08 : 0.05 + rand() * 0.12;\n patCtx.lineWidth = 0.4 + rand() * 0.7;\n\n patCtx.beginPath();\n patCtx.moveTo(fx, fy);\n // Slightly wavy pulp threads\n patCtx.quadraticCurveTo(fx + Math.cos(fangle) * flen * 0.5 + (rand() - 0.5) * 4, fy + Math.sin(fangle) * flen * 0.5 + (rand() - 0.5) * 4, fx + Math.cos(fangle) * flen, fy + Math.sin(fangle) * flen);\n patCtx.stroke();\n }\n\n // 2. Fine paper mill grain tooth/pores\n for (let i = 0; i < 5000; i++) {\n const gx = Math.floor(rand() * 128);\n const gy = Math.floor(rand() * 128);\n const isDark = rand() > 0.5;\n patCtx.fillStyle = isDark ? \"#000000\" : \"#FFFFFF\";\n patCtx.globalAlpha = isDark ? 0.04 : 0.06;\n patCtx.fillRect(gx, gy, 1, 1);\n }\n\n // 3. Realistic 3D folded origami crease facets (gradient shading plates to represent folded planes)\n const points: [number, number][] = [];\n for (let i = 0; i < 6; i++) {\n points.push([rand() * 128, rand() * 128]);\n }\n // Add corners\n points.push([0, 0], [128, 0], [128, 128], [0, 128]);\n\n // Connect into triangular shadow faces\n for (let i = 0; i < 15; i++) {\n const p1 = points[Math.floor(rand() * points.length)];\n const p2 = points[Math.floor(rand() * points.length)];\n const p3 = points[Math.floor(rand() * points.length)];\n\n if (p1 !== p2 && p2 !== p3) {\n const grad = patCtx.createLinearGradient(p1[0], p1[1], p2[0], p2[1]);\n const alpha = 0.01 + rand() * 0.06;\n const isDark = rand() > 0.5;\n const cStr = isDark ? \"0,0,0\" : \"255,255,255\";\n grad.addColorStop(0, `rgba(${cStr}, ${alpha})`);\n grad.addColorStop(1, `rgba(${cStr}, 0)`);\n\n patCtx.fillStyle = grad;\n patCtx.globalAlpha = 1;\n patCtx.beginPath();\n patCtx.moveTo(p1[0], p1[1]);\n patCtx.lineTo(p2[0], p2[1]);\n patCtx.lineTo(p3[0], p3[1]);\n patCtx.closePath();\n patCtx.fill();\n }\n }\n\n // 4. Sharp crumpled ridge/valley crease lines (dark side and light side)\n for (let i = 0; i < 12; i++) {\n const sx = rand() * 128;\n const sy = rand() * 128;\n const ex = rand() * 128;\n const ey = rand() * 128;\n const dx = ex - sx;\n const dy = ey - sy;\n const len = Math.sqrt(dx * dx + dy * dy);\n if (len === 0) continue;\n\n const nx = -dy / len; // normal vector\n const ny = dx / len;\n\n // Outer shadow line\n patCtx.strokeStyle = \"#000000\";\n patCtx.lineWidth = 0.5 + rand() * 1.2;\n patCtx.globalAlpha = 0.05 + rand() * 0.12;\n patCtx.beginPath();\n patCtx.moveTo(sx + nx * 0.8, sy + ny * 0.8);\n patCtx.lineTo(ex + nx * 0.8, ey + ny * 0.8);\n patCtx.stroke();\n\n // Core sharp shadow ridge\n patCtx.strokeStyle = \"#000000\";\n patCtx.lineWidth = 0.3 + rand() * 0.4;\n patCtx.globalAlpha = 0.08 + rand() * 0.15;\n patCtx.beginPath();\n patCtx.moveTo(sx, sy);\n patCtx.lineTo(ex, ey);\n patCtx.stroke();\n\n // Highlights on flipped opposite side\n patCtx.strokeStyle = \"#FFFFFF\";\n patCtx.lineWidth = 0.6 + rand() * 1.5;\n patCtx.globalAlpha = 0.08 + rand() * 0.22;\n patCtx.beginPath();\n patCtx.moveTo(sx - nx * 0.8, sy - ny * 0.8);\n patCtx.lineTo(ex - nx * 0.8, ey - ny * 0.8);\n patCtx.stroke();\n }\n }\n\n const pat = ctx.createPattern(patCanvas, \"repeat\");\n if (pat) {\n textFill = pat;\n }\n }\n\n // Seedable random helper to prevent rendering flicker\n const createSeededRand = (seed: number) => {\n let val = seed;\n return () => {\n val = (val * 9301 + 49297) % 233280;\n return val / 233280;\n };\n };\n\n const isInkStyle = cfg.effectName.toLowerCase().includes(\"ink\") || cfg.fontFamily.toLowerCase().includes(\"brush\") || cfg.effectName.toLowerCase().includes(\"grunge\") || cfg.effectName.toLowerCase().includes(\"scratch\") || cfg.fontFamily === \"Permanent Marker\";\n\n if (isInkStyle) {\n // 1. Create offscreen canvas for the ink layer to yield a perfect text shape scanning\n const tCanvas = createCanvas(cWidth, cHeight);\n tCanvas.width = cWidth;\n tCanvas.height = cHeight;\n const tCtx = getCanvas2DContext(tCanvas);\n\n if (tCtx) {\n tCtx.font = fontStr;\n tCtx.textAlign = align;\n tCtx.textBaseline = \"alphabetic\";\n\n const rand = createSeededRand(text.length * 171 + fontSize * 11 + (fillColor ? fillColor.length : 1));\n\n // Render base clean text in solid white\n tCtx.fillStyle = \"#FFFFFF\";\n const originalLSpacing = (tCtx as any).letterSpacing || \"normal\";\n if (letterSpacing !== 0) {\n (tCtx as any).letterSpacing = `${letterSpacing}px`;\n }\n\n lines.forEach((line, index) => {\n const py = startY + index * lineAdvance;\n tCtx.fillText(line, startX, py);\n });\n\n // 2. Scan bounding region of the text\n const mxMin = Math.max(0, Math.floor(xMin - 20));\n const mxMax = Math.min(cWidth - 1, Math.ceil(xMax + 20));\n const myMin = Math.max(0, Math.floor(yMin - 20));\n const myMax = Math.min(cHeight - 1, Math.ceil(yMax + 20));\n\n const scanW = mxMax - mxMin;\n const scanH = myMax - myMin;\n\n if (scanW > 0 && scanH > 0) {\n const imgData = tCtx.getImageData(mxMin, myMin, scanW, scanH);\n const data = imgData.data;\n\n const isFilled = (coordX: number, coordY: number) => {\n if (coordX < 0 || coordX >= scanW || coordY < 0 || coordY >= scanH) return false;\n const idx = (coordY * scanW + coordX) * 4;\n return data[idx + 3] > 70;\n };\n\n const topEdges: { x: number; y: number }[] = [];\n const bottomEdges: { x: number; y: number }[] = [];\n const boundaryEdges: { x: number; y: number }[] = [];\n const insidePixels: { x: number; y: number }[] = [];\n\n for (let y = 1; y < scanH - 1; y += 1) {\n for (let x = 1; x < scanW - 1; x += 1) {\n if (isFilled(x, y)) {\n const emptyLeft = !isFilled(x - 1, y);\n const emptyRight = !isFilled(x + 1, y);\n const emptyTop = !isFilled(x, y - 1);\n const emptyBottom = !isFilled(x, y + 1);\n\n if (emptyTop) {\n topEdges.push({ x: mxMin + x, y: myMin + y });\n } else if (emptyBottom) {\n bottomEdges.push({ x: mxMin + x, y: myMin + y });\n } else if (emptyLeft || emptyRight) {\n boundaryEdges.push({ x: mxMin + x, y: myMin + y });\n } else {\n if (rand() < 0.15) {\n insidePixels.push({ x: mxMin + x, y: myMin + y });\n }\n }\n }\n }\n }\n\n tCtx.strokeStyle = \"#FFFFFF\";\n tCtx.fillStyle = \"#FFFFFF\";\n\n // A. Draw bold tapered bristles at Top Edges starting from lifted brush bristles\n const topSampleRate = 5;\n for (let i = 0; i < topEdges.length; i += topSampleRate) {\n const pt = topEdges[i];\n const h = fontSize * (0.06 + rand() * 0.16); // nice medium lengths\n const w = 1.8 + rand() * 2.5; // tapered width\n const slantOffset = h * 0.22; // italic diagonal alignment\n\n tCtx.beginPath();\n tCtx.moveTo(pt.x - w / 2, pt.y);\n tCtx.lineTo(pt.x + w / 2, pt.y);\n tCtx.lineTo(pt.x + slantOffset, pt.y - h);\n tCtx.closePath();\n tCtx.fill();\n }\n\n // B. Draw bold tapered bristles at Bottom Edges\n const bottomSampleRate = 5;\n for (let i = 0; i < bottomEdges.length; i += bottomSampleRate) {\n const pt = bottomEdges[i];\n const h = fontSize * (0.07 + rand() * 0.2);\n const w = 1.8 + rand() * 2.5;\n const slantOffset = -h * 0.22;\n\n tCtx.beginPath();\n tCtx.moveTo(pt.x - w / 2, pt.y);\n tCtx.lineTo(pt.x + w / 2, pt.y);\n tCtx.lineTo(pt.x + slantOffset, pt.y + h);\n tCtx.closePath();\n tCtx.fill();\n }\n\n // C. Draw micro jitter & rough edges on left/right boundary sides (rely on paper grain tooth)\n const boundarySampleRate = 3;\n for (let i = 0; i < boundaryEdges.length; i += boundarySampleRate) {\n const pt = boundaryEdges[i];\n const r = 0.5 + rand() * 1.5;\n tCtx.beginPath();\n tCtx.arc(pt.x + (rand() - 0.5) * 1.2, pt.y + (rand() - 0.5) * 1.2, r, 0, Math.PI * 2);\n tCtx.fill();\n }\n\n // D. Scatter fine sparse ink spray splatters\n const splatterCount = Math.floor(fontSize * 0.5);\n for (let s = 0; s < splatterCount; s++) {\n const pt = boundaryEdges[Math.floor(rand() * boundaryEdges.length)] || topEdges[Math.floor(rand() * topEdges.length)];\n if (pt) {\n const dist = 3 + rand() * (fontSize * 0.24);\n const angle = rand() * Math.PI * 2;\n const sx = pt.x + Math.cos(angle) * dist;\n const sy = pt.y + Math.sin(angle) * dist;\n\n const size = 0.4 + rand() * 1.6;\n tCtx.globalAlpha = 0.25 + rand() * 0.65;\n\n tCtx.beginPath();\n tCtx.arc(sx, sy, size, 0, Math.PI * 2);\n tCtx.fill();\n tCtx.globalAlpha = 1.0;\n }\n }\n\n // E. Slice very subtle, low-density inner dry brush stripper lines (grunge scratches)\n tCtx.save();\n tCtx.globalCompositeOperation = \"destination-out\";\n const scratchCount = Math.floor(fontSize * 0.42);\n for (let i = 0; i < scratchCount; i++) {\n const pt = insidePixels[Math.floor(rand() * insidePixels.length)];\n if (pt) {\n const len = fontSize * (0.06 + rand() * 0.14);\n const angle = -Math.PI / 4.2 + (rand() - 0.5) * 0.1;\n tCtx.lineWidth = 0.5 + rand() * 0.8;\n tCtx.globalAlpha = 0.2 + rand() * 0.4;\n\n tCtx.beginPath();\n tCtx.moveTo(pt.x - Math.cos(angle) * (len / 2), pt.y - Math.sin(angle) * (len / 2));\n tCtx.lineTo(pt.x + Math.cos(angle) * (len / 2), pt.y + Math.sin(angle) * (len / 2));\n tCtx.stroke();\n }\n }\n tCtx.restore();\n }\n\n (tCtx as any).letterSpacing = originalLSpacing;\n\n // Finalize canvas layers: Tint offscreen result to user textFill color & blend on screen\n ctx.save();\n const tintCanvas = createCanvas(cWidth, cHeight);\n tintCanvas.width = cWidth;\n tintCanvas.height = cHeight;\n const tintCtx = getCanvas2DContext(tintCanvas);\n if (tintCtx) {\n tintCtx.drawImage(tCanvas, 0, 0);\n tintCtx.globalCompositeOperation = \"source-in\";\n tintCtx.fillStyle = textFill;\n tintCtx.fillRect(0, 0, cWidth, cHeight);\n ctx.drawImage(tintCanvas, 0, 0);\n }\n ctx.restore();\n }\n } else {\n ctx.save();\n if (fillType !== \"none\") {\n if (usePerCharFill && fillType === \"solid\") {\n renderLines(\"fill\", undefined, 0, 0, { perCharFill: true });\n } else {\n renderLines(\"fill\", textFill);\n }\n }\n ctx.restore();\n }\n\n // Inside stroke\n if (strokeEnabled && strokeWidth > 0 && strokePosition === \"inside\") {\n applyStroke();\n }\n\n // ──────────────────────────────────────────────────────────────────\n // 8. Inner Glow & Inner Shadow\n // ──────────────────────────────────────────────────────────────────\n // Render Inner Glow Layers\n glowLayers.forEach((layer) => {\n if (layer.enabled && layer.type === \"inner\" && layer.opacity > 0) {\n ctx.save();\n ctx.globalCompositeOperation = \"source-atop\";\n const renderCount = Math.max(1, Math.min(20, layer.strength ?? 1));\n for (let i = 0; i < renderCount; i++) {\n renderWithShadowTrick(\"fill\", layer.color, layer.blur, 0, 0, layer.opacity, \"transparent\", layer.spread ?? 0);\n }\n ctx.restore();\n }\n });\n\n // Render Inner Shadow\n if (shadowEnabled && shadowType === \"inner\" && shadowOpacity > 0) {\n ctx.save();\n ctx.globalCompositeOperation = \"source-atop\";\n\n // Inverse mask inner shadow\n renderWithShadowTrick(\"fill\", shadowColor, shadowBlur, shadowOffsetX, shadowOffsetY, shadowOpacity, \"transparent\");\n ctx.restore();\n }\n\n // ──────────────────────────────────────────────────────────────────\n // 9. Glitch Overlay Scanner Lines\n // ──────────────────────────────────────────────────────────────────\n if (isGlitch) {\n ctx.save();\n ctx.globalCompositeOperation = \"source-atop\";\n ctx.strokeStyle = \"rgba(0,0,0,0.18)\";\n ctx.lineWidth = 1.5;\n for (let ly = yMin; ly < yMax; ly += 4) {\n ctx.beginPath();\n ctx.moveTo(xMin - 50, ly);\n ctx.lineTo(xMax + 50, ly);\n ctx.stroke();\n }\n ctx.restore();\n }\n}\n\nexport class TextEffectRenderer {\n public static draw(ctx: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D, cfg: TextEffectConfig, _time = 0): void {\n renderTextEffectCore(ctx, cfg);\n }\n}\n","import { TextEffectConfig, Preset } from \"./types\";\n\n/** Style recipes (layer graphs): see `builtInRecipes` in src/engine/recipes.ts */\n\nexport const defaultConfig: TextEffectConfig = {\n text: \"CLYPRA STUDIO\",\n effectName: \"My Effect\",\n fontFamily: \"Poppins\",\n fontWeight: 700,\n fontStyle: \"normal\",\n fontSize: 80,\n letterSpacing: 4,\n lineHeight: 1.2,\n fillType: \"solid\",\n fillColor: \"#FFFFFF\",\n fillGradientAngle: 90,\n fillGradientStops: [\n { color: \"#FFFFFF\", offset: 0 },\n { color: \"#E0E0E0\", offset: 100 },\n ],\n strokeEnabled: false,\n strokeColor: \"#7C6FFF\",\n strokeWidth: 4,\n strokePosition: \"outside\",\n strokeOpacity: 100,\n strokeLineJoin: \"round\",\n glowLayers: [\n { enabled: false, color: \"#7C6FFF\", blur: 20, opacity: 80, type: \"outer\" },\n { enabled: false, color: \"#FF007C\", blur: 40, opacity: 60, type: \"outer\" },\n { enabled: false, color: \"#00F0FF\", blur: 60, opacity: 40, type: \"outer\" },\n ],\n shadowEnabled: false,\n shadowColor: \"#000000\",\n shadowBlur: 10,\n shadowOffsetX: 5,\n shadowOffsetY: 5,\n shadowOpacity: 80,\n shadowType: \"drop\",\n bevelEnabled: false,\n bevelDepth: 5,\n bevelHighlight: \"#FFFFFF\",\n bevelShadow: \"#000000\",\n bevelDirection: \"bottom-right\",\n bevelCoreColor: \"#000000\",\n bevelEdgeColor: \"#2A2A38\",\n bevelEdgeWidth: 0,\n bevelBlur: 0,\n bevelBlurColor: \"#000000\",\n bevelPerspectiveEnabled: false,\n bevelVanishingPointX: 40,\n bevelVanishingPointY: 80,\n bevelFocalLength: 400,\n stackEnabled: false,\n stackCount: 3,\n stackOffsetX: 10,\n stackOffsetY: -10,\n stackOpacityDecay: 20,\n stackColor1: \"#FF7C00\",\n stackColor2: \"#00FFDD\",\n stackColor3: \"#FF00AA\",\n stackColor4: \"#AA00FF\",\n panelEnabled: false,\n panelColor: \"#1E1E26\",\n panelOpacity: 80,\n panelRadius: 12,\n panelPaddingX: 40,\n panelPaddingY: 20,\n panelStrokeEnabled: false,\n panelStrokeColor: \"#2A2A38\",\n panelStrokeWidth: 2,\n canvasWidth: 800,\n canvasHeight: 200,\n textPosX: \"center\",\n textPosY: \"middle\",\n wrapText: true,\n autoFitText: false,\n\n // Ink Brush custom properties\n inkColor: \"#FFFFFF\",\n bristleDensity: 0.8,\n bristleSkipRate: 0.2,\n dripRate: 0.3,\n dripMaxLength: 40,\n grainDensity: 0.15,\n skewX: -0.2,\n};\n\nexport const builtInPresets: Preset[] = [\n {\n id: \"premium-sticker\",\n name: \"STICKER\",\n category: \"Classic\",\n config: {\n ...defaultConfig,\n text: \"TEXT\",\n effectName: \"StickerEffect\",\n fontFamily: \"Arial Rounded MT Bold\",\n fontWeight: 900,\n fontStyle: \"normal\",\n fontSize: 88,\n letterSpacing: 2,\n lineHeight: 1.2,\n fillType: \"linear\",\n fillGradientAngle: 90,\n fillGradientStops: [\n { color: \"#FFCE00\", offset: 0 },\n { color: \"#E05300\", offset: 100 },\n ],\n strokeEnabled: true,\n strokeColor: \"#FFFFFF\",\n strokeWidth: 15,\n strokePosition: \"outside\",\n strokeType: \"single\",\n strokeLineJoin: \"round\",\n strokeOpacity: 100,\n bevelEnabled: true,\n bevelDepth: 8,\n bevelDirection: \"bottom-right\",\n bevelHighlight: \"#FFCE00\",\n bevelCoreColor: \"#4E1901\",\n bevelShadow: \"#1D0A00\",\n shadowEnabled: true,\n shadowColor: \"#000000\",\n shadowBlur: 14,\n shadowOffsetX: 6,\n shadowOffsetY: 8,\n shadowOpacity: 65,\n shadowType: \"drop\",\n },\n },\n\n {\n id: \"premium-holo\",\n name: \"HOLOGRAPHIC\",\n category: \"Classic\",\n config: {\n ...defaultConfig,\n text: \"TEXT\",\n effectName: \"HolographicEffect\",\n fontFamily: \"Impact\",\n fontWeight: 900,\n fontStyle: \"normal\",\n fontSize: 100,\n letterSpacing: 2,\n lineHeight: 1.2,\n fillType: \"linear\",\n fillGradientAngle: 125,\n fillGradientStops: [\n { color: \"#6FE3FF\", offset: 0 },\n { color: \"#D196FF\", offset: 25 },\n { color: \"#FF9CEE\", offset: 50 },\n { color: \"#FFE49E\", offset: 75 },\n { color: \"#D4FFF1\", offset: 100 },\n ],\n strokeEnabled: true,\n strokeColor: \"#FFFFFF\",\n strokeWidth: 2,\n strokePosition: \"outside\",\n strokeType: \"single\",\n strokeOpacity: 100,\n glowLayers: [{ enabled: true, color: \"#D196FF\", blur: 15, opacity: 50, type: \"outer\" }],\n bevelEnabled: true,\n bevelDepth: 4,\n bevelDirection: \"bottom-right\",\n bevelHighlight: \"#FFFFFF\",\n bevelCoreColor: \"#2A3540\",\n bevelShadow: \"#0E151D\",\n shadowEnabled: true,\n shadowColor: \"#000000\",\n shadowBlur: 20,\n shadowOffsetX: 6,\n shadowOffsetY: 10,\n shadowOpacity: 90,\n shadowType: \"drop\",\n },\n },\n\n {\n id: \"classic-ink\",\n name: \"Classic Ink\",\n category: \"Classic\",\n config: {\n ...defaultConfig,\n text: \"Classic Ink\",\n effectName: \"ClassicInk\",\n fontFamily: \"Playfair Display\",\n fontWeight: 700,\n fontStyle: \"normal\",\n fontSize: 85,\n letterSpacing: 1,\n lineHeight: 1.2,\n fillType: \"linear\",\n fillGradientAngle: 90,\n fillGradientStops: [\n { color: \"#FDFBF7\", offset: 0 },\n { color: \"#EAE5D9\", offset: 100 },\n ],\n strokeEnabled: true,\n strokeColor: \"#1E1E26\",\n strokeWidth: 2,\n strokePosition: \"outside\",\n strokeOpacity: 100,\n strokeLineJoin: \"round\",\n shadowEnabled: true,\n shadowColor: \"#3D2B1F\",\n shadowBlur: 14,\n shadowOffsetX: 6,\n shadowOffsetY: 6,\n shadowOpacity: 90,\n shadowType: \"drop\",\n },\n },\n\n {\n id: \"neon-crimson\",\n name: \"Neon Crimson\",\n category: \"Neon\",\n config: {\n ...defaultConfig,\n text: \"NEON\",\n effectName: \"NeonCrimson\",\n fontFamily: \"Bebas Neue\",\n fontWeight: 700,\n fontStyle: \"normal\",\n fontSize: 100,\n letterSpacing: 6,\n lineHeight: 1.2,\n fillType: \"none\",\n strokeEnabled: true,\n strokeColor: \"#FFFFFF\",\n strokeWidth: 3,\n strokePosition: \"center\",\n strokeOpacity: 100,\n strokeLineJoin: \"round\",\n glowLayers: [\n { enabled: true, color: \"#FF003C\", blur: 12, opacity: 100, type: \"outer\" },\n { enabled: true, color: \"#FF003C\", blur: 35, opacity: 80, type: \"outer\" },\n { enabled: true, color: \"#FF003C\", blur: 80, opacity: 60, type: \"outer\" },\n ],\n shadowEnabled: false,\n },\n },\n\n {\n id: \"cyberpunk-yellow\",\n name: \"Cyberpunk Yellow\",\n category: \"Neon\",\n config: {\n ...defaultConfig,\n text: \"CYBER\",\n effectName: \"CyberpunkYellow\",\n fontFamily: \"Anton\",\n fontWeight: 900,\n fontStyle: \"normal\",\n fontSize: 90,\n letterSpacing: 2,\n lineHeight: 1.2,\n fillType: \"solid\",\n fillColor: \"#FFE600\",\n strokeEnabled: true,\n strokeColor: \"#000000\",\n strokeWidth: 6,\n strokePosition: \"outside\",\n strokeOpacity: 100,\n strokeLineJoin: \"round\",\n shadowEnabled: true,\n shadowColor: \"#FFE600\",\n shadowBlur: 15,\n shadowOffsetX: 4,\n shadowOffsetY: 4,\n shadowOpacity: 95,\n shadowType: \"drop\",\n },\n },\n\n {\n id: \"retro-comic\",\n name: \"Retro Comic\",\n category: \"Experimental\",\n config: {\n ...defaultConfig,\n text: \"BOOM!\",\n effectName: \"RetroComic\",\n fontFamily: \"Arial Black\",\n fontWeight: 900,\n fontStyle: \"normal\",\n fontSize: 85,\n letterSpacing: 3,\n lineHeight: 1.1,\n fillType: \"solid\",\n fillColor: \"#000000\",\n strokeEnabled: true,\n strokeColor: \"#FFFFFF\",\n strokeWidth: 6,\n strokePosition: \"outside\",\n strokeOpacity: 100,\n strokeLineJoin: \"round\",\n glowLayers: [\n { enabled: true, color: \"#000000\", blur: 0, opacity: 100, type: \"outer\", strength: 1, spread: 3 },\n { enabled: false, color: \"#FF007C\", blur: 40, opacity: 60, type: \"outer\" },\n { enabled: false, color: \"#00F0FF\", blur: 60, opacity: 40, type: \"outer\" },\n ],\n // panelEnabled: true,\n // panelColor: \"#FFE100\",\n // panelOpacity: 100,\n // panelRadius: 10,\n // panelPaddingX: 55,\n // panelPaddingY: 35,\n // panelStrokeEnabled: true,\n // panelStrokeColor: \"#000000\",\n // panelStrokeWidth: 4,\n shadowEnabled: true,\n shadowColor: \"#000000\",\n shadowBlur: 0,\n shadowOffsetX: 8,\n shadowOffsetY: 8,\n shadowOpacity: 100,\n shadowType: \"drop\",\n },\n },\n];\n","/**\n * Font Loader for Lottie-web\n *\n * This module ensures that font variant names (like \"Poppins-Italic\") work correctly\n * with lottie-web by dynamically creating @font-face rules that map variant names\n * to the actual loaded fonts with proper styling.\n */\n\nexport interface FontVariant {\n variantName: string; // e.g., \"Poppins-Italic\"\n baseFontFamily: string; // e.g., \"Poppins\"\n weight: number; // 400, 700, etc.\n style: \"normal\" | \"italic\";\n}\n\nconst FONT_VARIANTS: FontVariant[] = [\n // Poppins variants\n { variantName: \"Poppins-Regular\", baseFontFamily: \"Poppins\", weight: 400, style: \"normal\" },\n { variantName: \"Poppins-Bold\", baseFontFamily: \"Poppins\", weight: 700, style: \"normal\" },\n { variantName: \"Poppins-Italic\", baseFontFamily: \"Poppins\", weight: 400, style: \"italic\" },\n { variantName: \"Poppins-BoldItalic\", baseFontFamily: \"Poppins\", weight: 700, style: \"italic\" },\n\n // Montserrat variants\n { variantName: \"Montserrat-Regular\", baseFontFamily: \"Montserrat\", weight: 400, style: \"normal\" },\n { variantName: \"Montserrat-Bold\", baseFontFamily: \"Montserrat\", weight: 700, style: \"normal\" },\n { variantName: \"Montserrat-ExtraBold\", baseFontFamily: \"Montserrat\", weight: 800, style: \"normal\" },\n { variantName: \"Montserrat-Black\", baseFontFamily: \"Montserrat\", weight: 900, style: \"normal\" },\n { variantName: \"Montserrat-Italic\", baseFontFamily: \"Montserrat\", weight: 400, style: \"italic\" },\n { variantName: \"Montserrat-BoldItalic\", baseFontFamily: \"Montserrat\", weight: 700, style: \"italic\" },\n { variantName: \"Montserrat-ExtraBoldItalic\", baseFontFamily: \"Montserrat\", weight: 800, style: \"italic\" },\n { variantName: \"Montserrat-BlackItalic\", baseFontFamily: \"Montserrat\", weight: 900, style: \"italic\" },\n\n // Arial variants (System Fonts)\n { variantName: \"Arial\", baseFontFamily: \"Arial\", weight: 400, style: \"normal\" },\n { variantName: \"Arial-Bold\", baseFontFamily: \"Arial\", weight: 700, style: \"normal\" },\n { variantName: \"Arial-Italic\", baseFontFamily: \"Arial\", weight: 400, style: \"italic\" },\n { variantName: \"Arial-BoldItalic\", baseFontFamily: \"Arial\", weight: 700, style: \"italic\" },\n];\n\n/**\n * Injects @font-face rules dynamically to create font variant aliases\n * This ensures lottie-web can find fonts by their variant names\n */\nexport function injectFontVariantRules(): void {\n // Check if already injected\n if (document.getElementById(\"lottie-font-variants\")) {\n return;\n }\n\n const style = document.createElement(\"style\");\n style.id = \"lottie-font-variants\";\n\n let css = \"/* Dynamically injected font variants for lottie-web */\\n\";\n\n FONT_VARIANTS.forEach((variant) => {\n css += `\n@font-face {\n font-family: \"${variant.variantName}\";\n src: local(\"${variant.baseFontFamily}\");\n font-weight: ${variant.weight};\n font-style: ${variant.style};\n font-display: swap;\n}\n`;\n });\n\n style.textContent = css;\n document.head.appendChild(style);\n\n console.log(\"✅ Font variant rules injected for lottie-web\");\n}\n\n/**\n * Waits for base fonts to load, then injects variant rules\n */\nexport async function initializeFontSystem(): Promise<void> {\n try {\n // Dynamically insert invisible font preloader spans to force browser download\n const preloaderId = \"font-system-preloader\";\n if (!document.getElementById(preloaderId) && document.body) {\n const preloader = document.createElement(\"div\");\n preloader.id = preloaderId;\n preloader.style.position = \"absolute\";\n preloader.style.opacity = \"0\";\n preloader.style.pointerEvents = \"none\";\n preloader.style.zIndex = \"-9999\";\n\n const preloadItems = [\n { family: \"Poppins\", weight: 400, style: \"normal\" },\n { family: \"Poppins\", weight: 700, style: \"normal\" },\n { family: \"Poppins\", weight: 400, style: \"italic\" },\n { family: \"Poppins\", weight: 700, style: \"italic\" },\n { family: \"Montserrat\", weight: 400, style: \"normal\" },\n { family: \"Montserrat\", weight: 700, style: \"normal\" },\n { family: \"Montserrat\", weight: 800, style: \"normal\" },\n { family: \"Montserrat\", weight: 900, style: \"normal\" },\n { family: \"Montserrat\", weight: 400, style: \"italic\" },\n { family: \"Montserrat\", weight: 700, style: \"italic\" },\n { family: \"Montserrat\", weight: 800, style: \"italic\" },\n { family: \"Montserrat\", weight: 900, style: \"italic\" },\n ];\n\n preloadItems.forEach((item) => {\n const span = document.createElement(\"span\");\n span.style.fontFamily = `'${item.family}'`;\n span.style.fontWeight = String(item.weight);\n span.style.fontStyle = item.style;\n span.innerText = \"preload\";\n preloader.appendChild(span);\n });\n\n document.body.appendChild(preloader);\n }\n\n // Wait for Poppins to load from Google Fonts\n await document.fonts.load(\"400 16px Poppins\");\n await document.fonts.load(\"700 16px Poppins\");\n await document.fonts.load(\"italic 400 16px Poppins\");\n await document.fonts.load(\"italic 700 16px Poppins\");\n\n // Wait for Montserrat to load from Google Fonts\n await document.fonts.load(\"400 16px Montserrat\");\n await document.fonts.load(\"700 16px Montserrat\");\n await document.fonts.load(\"800 16px Montserrat\");\n await document.fonts.load(\"900 16px Montserrat\");\n await document.fonts.load(\"italic 400 16px Montserrat\");\n await document.fonts.load(\"italic 700 16px Montserrat\");\n await document.fonts.load(\"italic 800 16px Montserrat\");\n await document.fonts.load(\"italic 900 16px Montserrat\");\n\n // Inject variant rules\n injectFontVariantRules();\n\n console.log(\"✅ Font system initialized (Poppins + Montserrat)\");\n } catch (error) {\n console.warn(\"⚠️ Font loading warning:\", error);\n // Still inject rules even if loading fails\n injectFontVariantRules();\n }\n}\n\n/**\n * Checks if a font variant is available for rendering\n */\nexport function checkFontVariant(variantName: string): boolean {\n // Try to measure text with the font\n const canvas = document.createElement(\"canvas\");\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) return false;\n\n ctx.font = `16px \"${variantName}\"`;\n const metrics = ctx.measureText(\"Test\");\n\n // If width is 0, font probably didn't load\n return metrics.width > 0;\n}\n","import type { TextEffectConfig, GlowLayer, GradientStop } from \"../types\";\n\nexport const SCENE_VERSION = 1 as const;\n\nexport type EffectLayerType = \"panel\" | \"glow\" | \"shadow\" | \"extrusion\" | \"duplicateStack\" | \"stroke\" | \"fill\" | \"mask\" | \"filter\" | \"customEngine\";\n\nexport type LayerTarget = \"text\" | \"panel\" | \"scene\" | \"previous\";\n\nexport type CustomEngineId = \"ink\";\n\nexport const CUSTOM_ENGINE_IDS: CustomEngineId[] = [\"ink\"];\n\nexport const LEGACY_RENDERER_MAP: Record<string, CustomEngineId> = {\n InkBrushEngine: \"ink\",\n};\n\nexport const ENGINE_ID_TO_LEGACY: Record<CustomEngineId, string> = {\n ink: \"InkBrushEngine\",\n};\n\nexport interface SceneCanvas {\n width: number;\n height: number;\n background: string;\n}\n\nexport interface SceneText {\n content: string;\n fontFamily: string;\n fontWeight: number;\n fontStyle: \"normal\" | \"italic\";\n fontSize: number;\n letterSpacing: number;\n lineHeight: number;\n textPosX: \"left\" | \"center\" | \"right\";\n textPosY: \"top\" | \"middle\" | \"bottom\";\n wrapText?: boolean;\n autoFitText?: boolean;\n perCharFillEnabled?: boolean;\n charFillColors?: string[];\n}\n\nexport interface EffectLayer {\n id: string;\n type: EffectLayerType;\n name: string;\n enabled: boolean;\n opacity: number;\n blendMode: GlobalCompositeOperation;\n target: LayerTarget;\n params: Record<string, unknown>;\n}\n\nexport interface CompositorSettings {\n blur: number;\n bloom: number;\n bloomThreshold?: number;\n}\n\nexport interface Keyframe {\n time: number;\n value: number;\n easing?: \"linear\" | \"easeIn\" | \"easeOut\" | \"easeInOut\";\n}\n\nexport interface AnimTrack {\n layerId: string;\n paramPath: string;\n keyframes: Keyframe[];\n}\n\nexport interface Timeline {\n duration: number;\n fps: number;\n loop: boolean;\n tracks: AnimTrack[];\n}\n\nexport interface SceneDocument {\n version: typeof SCENE_VERSION;\n effectName: string;\n canvas: SceneCanvas;\n text: SceneText;\n effectLayers: EffectLayer[];\n customEngineId: CustomEngineId | null;\n engineParams?: Record<string, unknown>;\n compositor: CompositorSettings;\n timeline: Timeline;\n /** Legacy flat config cache for gradual UI migration */\n legacyConfig?: TextEffectConfig;\n /** Deep Research extension snippet (not executed until sandboxed) */\n extensionCode?: string | null;\n}\n\nexport interface StyleRecipe {\n id: string;\n name: string;\n category?: string;\n layers: EffectLayer[];\n exposed: string[];\n tags: string[];\n customEngineId?: CustomEngineId | null;\n scene?: SceneDocument;\n}\n\nexport function createEmptyScene(overrides?: Partial<SceneDocument>): SceneDocument {\n return {\n version: SCENE_VERSION,\n effectName: \"My Effect\",\n canvas: { width: 800, height: 200, background: \"transparent\" },\n text: {\n content: \"CLYPRA\",\n fontFamily: \"Poppins\",\n fontWeight: 700,\n fontStyle: \"normal\",\n fontSize: 80,\n letterSpacing: 4,\n lineHeight: 1.2,\n textPosX: \"center\",\n textPosY: \"middle\",\n },\n effectLayers: [],\n customEngineId: null,\n compositor: { blur: 0, bloom: 0, bloomThreshold: 0.6 },\n timeline: { duration: 2, fps: 30, loop: true, tracks: [] },\n ...overrides,\n };\n}\n\nexport function newLayerId(): string {\n return `layer-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 7)}`;\n}\n","import type { SceneDocument } from \"./schema\";\nimport { newLayerId } from \"./schema\";\n\n/** Attach MVP demo animation tracks (shadow drift + optional mask reveal) */\nexport function ensureDefaultTimeline(doc: SceneDocument): SceneDocument {\n if (doc.timeline.tracks.length > 0) return doc;\n\n const shadowLayer = doc.effectLayers.find((l) => l.type === \"shadow\");\n const maskLayer = doc.effectLayers.find((l) => l.type === \"mask\");\n\n const tracks: SceneDocument[\"timeline\"][\"tracks\"] = [];\n\n if (shadowLayer) {\n tracks.push({\n layerId: shadowLayer.id,\n paramPath: \"shadowOffsetY\",\n keyframes: [\n { time: 0, value: (shadowLayer.params.shadowOffsetY as number) ?? 5, easing: \"easeInOut\" },\n {\n time: doc.timeline.duration / 2,\n value: ((shadowLayer.params.shadowOffsetY as number) ?? 5) + 8,\n easing: \"easeInOut\",\n },\n {\n time: doc.timeline.duration,\n value: (shadowLayer.params.shadowOffsetY as number) ?? 5,\n easing: \"easeInOut\",\n },\n ],\n });\n }\n\n if (maskLayer) {\n tracks.push({\n layerId: maskLayer.id,\n paramPath: \"revealProgress\",\n keyframes: [\n { time: 0, value: 0, easing: \"easeOut\" },\n { time: doc.timeline.duration * 0.85, value: 1, easing: \"easeOut\" },\n ],\n });\n maskLayer.enabled = false;\n }\n\n return {\n ...doc,\n effectLayers: doc.effectLayers.map((l) => ({ ...l })),\n timeline: { ...doc.timeline, tracks },\n };\n}\n\nexport function cloneSceneWithNewIds(doc: SceneDocument): SceneDocument {\n const idMap = new Map<string, string>();\n const effectLayers = doc.effectLayers.map((l) => {\n const id = newLayerId();\n idMap.set(l.id, id);\n return { ...l, id, params: { ...l.params } };\n });\n const tracks = doc.timeline.tracks.map((t) => ({\n ...t,\n layerId: idMap.get(t.layerId) ?? t.layerId,\n keyframes: t.keyframes.map((k) => ({ ...k })),\n }));\n return { ...doc, effectLayers, timeline: { ...doc.timeline, tracks } };\n}\n","import type { TextEffectConfig, GlowLayer } from \"../types\";\nimport { defaultConfig } from \"../presets\";\nimport { type SceneDocument, type EffectLayer, type CustomEngineId, newLayerId, LEGACY_RENDERER_MAP, ENGINE_ID_TO_LEGACY } from \"./schema\";\nimport { ensureDefaultTimeline } from \"./timelineDefaults\";\n\nfunction layer(type: EffectLayer[\"type\"], name: string, params: Record<string, unknown>, extra?: Partial<EffectLayer>): EffectLayer {\n return {\n id: newLayerId(),\n type,\n name,\n enabled: true,\n opacity: 1,\n blendMode: \"source-over\",\n target: type === \"panel\" ? \"scene\" : \"text\",\n params,\n ...extra,\n };\n}\n\nexport function resolveCustomEngineId(cfg: TextEffectConfig): CustomEngineId | null {\n if (!cfg.customRenderer) return null;\n return LEGACY_RENDERER_MAP[cfg.customRenderer] ?? null;\n}\n\n/** Lossless migration from flat TextEffectConfig to SceneDocument */\nexport function textEffectConfigToScene(cfg: TextEffectConfig): SceneDocument {\n const engineId = resolveCustomEngineId(cfg);\n const layers: EffectLayer[] = [];\n\n if (engineId) {\n layers.push(\n layer(\n \"customEngine\",\n \"Custom Engine\",\n { engineId },\n {\n enabled: true,\n target: \"scene\",\n },\n ),\n );\n layers.push(\n layer(\n \"customEngine\",\n \"Engine Params\",\n { ...collectEngineParams(cfg, engineId) },\n {\n enabled: true,\n target: \"text\",\n },\n ),\n );\n }\n\n layers.push(\n layer(\n \"panel\",\n \"Background Panel\",\n {\n panelEnabled: cfg.panelEnabled,\n panelColor: cfg.panelColor,\n panelOpacity: cfg.panelOpacity,\n panelRadius: cfg.panelRadius,\n panelPaddingX: cfg.panelPaddingX,\n panelPaddingY: cfg.panelPaddingY,\n panelStrokeEnabled: cfg.panelStrokeEnabled,\n panelStrokeColor: cfg.panelStrokeColor,\n panelStrokeWidth: cfg.panelStrokeWidth,\n },\n { enabled: cfg.panelEnabled },\n ),\n );\n\n (cfg.glowLayers || []).forEach((g: GlowLayer, i: number) => {\n layers.push(layer(\"glow\", `Glow ${i + 1}`, { ...g }, { enabled: g.enabled, opacity: (g.opacity ?? 100) / 100 }));\n });\n\n layers.push(\n layer(\n \"shadow\",\n \"Shadow\",\n {\n shadowEnabled: cfg.shadowEnabled,\n shadowColor: cfg.shadowColor,\n shadowBlur: cfg.shadowBlur,\n shadowOffsetX: cfg.shadowOffsetX,\n shadowOffsetY: cfg.shadowOffsetY,\n shadowOpacity: cfg.shadowOpacity,\n shadowType: cfg.shadowType,\n },\n { enabled: cfg.shadowEnabled },\n ),\n );\n\n layers.push(\n layer(\n \"extrusion\",\n \"Bevel / Extrusion\",\n {\n bevelEnabled: cfg.bevelEnabled,\n bevelDepth: cfg.bevelDepth,\n bevelHighlight: cfg.bevelHighlight,\n bevelShadow: cfg.bevelShadow,\n bevelDirection: cfg.bevelDirection,\n bevelCoreColor: cfg.bevelCoreColor,\n bevelEdgeColor: cfg.bevelEdgeColor,\n bevelEdgeWidth: cfg.bevelEdgeWidth,\n bevelBlur: cfg.bevelBlur,\n bevelBlurColor: cfg.bevelBlurColor,\n bevelPerspectiveEnabled: cfg.bevelPerspectiveEnabled,\n bevelVanishingPointX: cfg.bevelVanishingPointX,\n bevelVanishingPointY: cfg.bevelVanishingPointY,\n bevelFocalLength: cfg.bevelFocalLength,\n },\n { enabled: cfg.bevelEnabled },\n ),\n );\n\n layers.push(\n layer(\n \"duplicateStack\",\n \"Stack Extrusion\",\n {\n stackEnabled: cfg.stackEnabled,\n stackCount: cfg.stackCount,\n stackOffsetX: cfg.stackOffsetX,\n stackOffsetY: cfg.stackOffsetY,\n stackOpacityDecay: cfg.stackOpacityDecay,\n stackColor1: cfg.stackColor1,\n stackColor2: cfg.stackColor2,\n stackColor3: cfg.stackColor3,\n stackColor4: cfg.stackColor4,\n },\n { enabled: !!cfg.stackEnabled },\n ),\n );\n\n layers.push(\n layer(\n \"stroke\",\n \"Stroke\",\n {\n strokeEnabled: cfg.strokeEnabled,\n strokeColor: cfg.strokeColor,\n strokeWidth: cfg.strokeWidth,\n strokePosition: cfg.strokePosition,\n strokeOpacity: cfg.strokeOpacity,\n strokeLineJoin: cfg.strokeLineJoin,\n strokeBlur: cfg.strokeBlur,\n strokeType: cfg.strokeType,\n strokeColorSecondary: cfg.strokeColorSecondary,\n strokeWidthSecondary: cfg.strokeWidthSecondary,\n strokeFadeRange: cfg.strokeFadeRange,\n },\n { enabled: cfg.strokeEnabled },\n ),\n );\n\n layers.push(\n layer(\n \"fill\",\n \"Fill\",\n {\n fillType: cfg.fillType,\n fillColor: cfg.fillColor,\n fillGradientAngle: cfg.fillGradientAngle,\n fillGradientStops: cfg.fillGradientStops,\n patternType: cfg.patternType,\n perCharFillEnabled: cfg.perCharFillEnabled,\n charFillColors: cfg.charFillColors,\n },\n { enabled: cfg.fillType !== \"none\" },\n ),\n );\n\n layers.push(layer(\"mask\", \"Text Alpha Mask\", { maskType: \"alphaText\", revealProgress: 1 }, { enabled: false }));\n\n layers.push(layer(\"filter\", \"Compositor FX\", { blur: 0, bloom: 0 }, { enabled: false, target: \"previous\" }));\n\n const doc: SceneDocument = {\n version: 1,\n effectName: cfg.effectName,\n canvas: {\n width: cfg.canvasWidth,\n height: cfg.canvasHeight,\n background: \"transparent\",\n },\n text: {\n content: cfg.text,\n fontFamily: cfg.fontFamily,\n fontWeight: cfg.fontWeight,\n fontStyle: cfg.fontStyle,\n fontSize: cfg.fontSize,\n letterSpacing: cfg.letterSpacing,\n lineHeight: cfg.lineHeight,\n textPosX: cfg.textPosX,\n textPosY: cfg.textPosY,\n wrapText: cfg.wrapText !== false,\n autoFitText: !!cfg.autoFitText,\n perCharFillEnabled: cfg.perCharFillEnabled,\n charFillColors: cfg.charFillColors,\n },\n effectLayers: layers,\n customEngineId: engineId,\n engineParams: engineId ? collectEngineParams(cfg, engineId) : undefined,\n compositor: { blur: 0, bloom: 0, bloomThreshold: 0.6 },\n timeline: { duration: 2, fps: 30, loop: true, tracks: [] },\n legacyConfig: { ...cfg },\n };\n\n return ensureDefaultTimeline(doc);\n}\n\nfunction collectEngineParams(cfg: TextEffectConfig, id: CustomEngineId): Record<string, unknown> {\n switch (id) {\n case \"ink\":\n return {\n inkColor: cfg.inkColor,\n bristleDensity: cfg.bristleDensity,\n bristleSkipRate: cfg.bristleSkipRate,\n dripRate: cfg.dripRate,\n dripMaxLength: cfg.dripMaxLength,\n grainDensity: cfg.grainDensity,\n skewX: cfg.skewX,\n };\n default:\n return {};\n }\n}\n\nfunction getLayerParams<T extends Record<string, unknown>>(doc: SceneDocument, type: EffectLayer[\"type\"], index = 0): T | undefined {\n const found = doc.effectLayers.filter((l) => l.type === type);\n return found[index]?.params as T | undefined;\n}\n\n/** Flatten SceneDocument back to TextEffectConfig for legacy controls and renderer */\nexport function sceneToConfig(doc: SceneDocument): TextEffectConfig {\n const base: TextEffectConfig = doc.legacyConfig\n ? { ...doc.legacyConfig }\n : {\n ...createDefaultFromScene(doc),\n };\n\n base.effectName = doc.effectName;\n base.text = doc.text.content;\n base.fontFamily = doc.text.fontFamily;\n base.fontWeight = doc.text.fontWeight;\n base.fontStyle = doc.text.fontStyle;\n base.fontSize = doc.text.fontSize;\n base.letterSpacing = doc.text.letterSpacing;\n base.lineHeight = doc.text.lineHeight;\n base.textPosX = doc.text.textPosX;\n base.textPosY = doc.text.textPosY;\n base.wrapText = doc.text.wrapText !== false;\n base.autoFitText = !!doc.text.autoFitText;\n base.canvasWidth = doc.canvas.width;\n base.canvasHeight = doc.canvas.height;\n\n const panel = getLayerParams<Record<string, unknown>>(doc, \"panel\");\n if (panel) {\n Object.assign(base, {\n panelEnabled: panel.panelEnabled,\n panelColor: panel.panelColor,\n panelOpacity: panel.panelOpacity,\n panelRadius: panel.panelRadius,\n panelPaddingX: panel.panelPaddingX,\n panelPaddingY: panel.panelPaddingY,\n panelStrokeEnabled: panel.panelStrokeEnabled,\n panelStrokeColor: panel.panelStrokeColor,\n panelStrokeWidth: panel.panelStrokeWidth,\n });\n }\n\n const glows = doc.effectLayers.filter((l) => l.type === \"glow\");\n base.glowLayers = glows.map((l) => {\n const p = l.params as unknown as GlowLayer;\n return {\n enabled: l.enabled && (p.enabled ?? true),\n color: p.color ?? \"#7C6FFF\",\n blur: p.blur ?? 20,\n opacity: Math.round((p.opacity ?? 80) * (l.opacity ?? 1)),\n type: p.type ?? \"outer\",\n strength: p.strength,\n spread: p.spread,\n };\n });\n while (base.glowLayers.length < 3) {\n base.glowLayers.push({\n enabled: false,\n color: \"#7C6FFF\",\n blur: 20,\n opacity: 80,\n type: \"outer\",\n });\n }\n\n const shadow = getLayerParams<Record<string, unknown>>(doc, \"shadow\");\n if (shadow) Object.assign(base, shadow);\n\n const extrusion = getLayerParams<Record<string, unknown>>(doc, \"extrusion\");\n if (extrusion) Object.assign(base, extrusion);\n\n const stack = getLayerParams<Record<string, unknown>>(doc, \"duplicateStack\");\n if (stack) Object.assign(base, stack);\n\n const stroke = getLayerParams<Record<string, unknown>>(doc, \"stroke\");\n if (stroke) Object.assign(base, stroke);\n\n const fill = getLayerParams<Record<string, unknown>>(doc, \"fill\");\n if (fill) Object.assign(base, fill);\n\n base.perCharFillEnabled = doc.text.perCharFillEnabled ?? (fill?.perCharFillEnabled as boolean);\n base.charFillColors = doc.text.charFillColors ?? (fill?.charFillColors as string[] | undefined);\n\n if (doc.customEngineId) {\n base.customRenderer = ENGINE_ID_TO_LEGACY[doc.customEngineId];\n Object.assign(base, doc.engineParams || {});\n } else {\n base.customRenderer = undefined;\n }\n\n base.glowLayers = base.glowLayers.slice(0, 6);\n\n const filterLayers = doc.effectLayers.filter((l) => l.type === \"filter\" && l.enabled);\n const filter = filterLayers[filterLayers.length - 1]?.params as { blur?: number; bloom?: number };\n const compositor = {\n blur: filter?.blur ?? doc.compositor.blur ?? 0,\n bloom: filter?.bloom ?? doc.compositor.bloom ?? 0,\n bloomThreshold: doc.compositor.bloomThreshold ?? 0.6,\n };\n\n return base;\n}\n\nexport function syncCompositorFromScene(doc: SceneDocument): CompositorFromScene {\n const filterLayers = doc.effectLayers.filter((l) => l.type === \"filter\" && l.enabled);\n const filter = filterLayers[filterLayers.length - 1]?.params as { blur?: number; bloom?: number };\n return {\n blur: filter?.blur ?? doc.compositor.blur ?? 0,\n bloom: filter?.bloom ?? doc.compositor.bloom ?? 0,\n bloomThreshold: doc.compositor.bloomThreshold ?? 0.6,\n };\n}\n\nexport interface CompositorFromScene {\n blur: number;\n bloom: number;\n bloomThreshold: number;\n}\n\nfunction createDefaultFromScene(doc: SceneDocument): TextEffectConfig {\n const cfg = { ...defaultConfig };\n cfg.text = doc.text.content;\n return cfg;\n}\n\n/** Apply engine params from scene onto config without require() */\nexport function mergeSceneIntoConfig(doc: SceneDocument, base: TextEffectConfig): TextEffectConfig {\n const out = sceneToConfig({ ...doc, legacyConfig: base });\n return out;\n}\n","import type { SceneDocument, Keyframe } from \"./schema\";\n\nexport function ease(t: number, kind: Keyframe[\"easing\"] = \"linear\"): number {\n switch (kind) {\n case \"easeIn\":\n return t * t;\n case \"easeOut\":\n return t * (2 - t);\n case \"easeInOut\":\n return t < 0.5 ? 2 * t * t : -1 + (4 - 2 * t) * t;\n default:\n return t;\n }\n}\n\nfunction interpolateKeyframes(keyframes: Keyframe[], time: number): number {\n if (keyframes.length === 0) return 0;\n const sorted = [...keyframes].sort((a, b) => a.time - b.time);\n if (time <= sorted[0].time) return sorted[0].value;\n if (time >= sorted[sorted.length - 1].time) return sorted[sorted.length - 1].value;\n\n for (let i = 0; i < sorted.length - 1; i++) {\n const a = sorted[i];\n const b = sorted[i + 1];\n if (time >= a.time && time <= b.time) {\n const span = b.time - a.time || 1;\n const localT = (time - a.time) / span;\n const eased = ease(localT, b.easing ?? \"linear\");\n return a.value + (b.value - a.value) * eased;\n }\n }\n return sorted[sorted.length - 1].value;\n}\n\n/** Resolve animated scalar at time (seconds) */\nexport function resolveAnimatedScalar(doc: SceneDocument, layerId: string, paramPath: string, baseValue: number, time: number): number {\n const track = doc.timeline.tracks.find((t) => t.layerId === layerId && t.paramPath === paramPath);\n if (!track || track.keyframes.length === 0) return baseValue;\n return interpolateKeyframes(track.keyframes, time);\n}\n\n/** Apply timeline to scene (returns shallow clone with updated layer params) */\nexport function applyTimelineAtTime(doc: SceneDocument, time: number): SceneDocument {\n const looped = doc.timeline.loop && doc.timeline.duration > 0 ? time % doc.timeline.duration : Math.min(time, doc.timeline.duration);\n\n const layers = doc.effectLayers.map((layer) => {\n let opacity = layer.opacity;\n const params = { ...layer.params };\n for (const track of doc.timeline.tracks) {\n if (track.layerId !== layer.id) continue;\n if (track.paramPath === \"layerOpacity\") {\n opacity = resolveAnimatedScalar(doc, layer.id, track.paramPath, opacity, looped);\n continue;\n }\n const parts = track.paramPath.split(\".\");\n let target: Record<string, unknown> = params;\n for (let i = 0; i < parts.length - 1; i++) {\n const key = parts[i];\n if (typeof target[key] !== \"object\" || target[key] === null) {\n target[key] = {};\n }\n target = target[key] as Record<string, unknown>;\n }\n const leaf = parts[parts.length - 1];\n const current = typeof target[leaf] === \"number\" ? (target[leaf] as number) : 0;\n target[leaf] = resolveAnimatedScalar(doc, layer.id, track.paramPath, current, looped);\n }\n return { ...layer, opacity, params };\n });\n\n return { ...doc, effectLayers: layers };\n}\n\nexport function createDefaultRevealTrack(layerId: string): SceneDocument[\"timeline\"][\"tracks\"][0] {\n return {\n layerId,\n paramPath: \"revealProgress\",\n keyframes: [\n { time: 0, value: 0, easing: \"easeOut\" },\n { time: 1, value: 1, easing: \"easeOut\" },\n ],\n };\n}\n\nexport function createPulseOpacityTrack(layerId: string): SceneDocument[\"timeline\"][\"tracks\"][0] {\n return {\n layerId,\n paramPath: \"layerOpacity\",\n keyframes: [\n { time: 0, value: 0.6, easing: \"easeInOut\" },\n { time: 1, value: 1, easing: \"easeInOut\" },\n { time: 2, value: 0.6, easing: \"easeInOut\" },\n ],\n };\n}\n","import type { CompositorSettings } from \"../engine/schema\";\n\nconst VERTEX_SRC = `#version 300 es\nin vec2 a_pos;\nin vec2 a_uv;\nout vec2 v_uv;\nvoid main() {\n v_uv = a_uv;\n gl_Position = vec4(a_pos, 0.0, 1.0);\n}\n`;\n\nconst FRAGMENT_SRC = `#version 300 es\nprecision highp float;\nin vec2 v_uv;\nuniform sampler2D u_tex;\nuniform vec2 u_texel;\nuniform float u_blur;\nuniform float u_bloom;\nuniform float u_bloomThreshold;\nout vec4 outColor;\n\nvoid main() {\n vec4 c = texture(u_tex, v_uv);\n if (u_blur < 0.5 && u_bloom < 0.01) {\n outColor = c;\n return;\n }\n vec4 sum = c;\n float w = 0.0;\n if (u_blur >= 0.5) {\n sum = vec4(0.0);\n w = 0.0;\n for (int x = -2; x <= 2; x++) {\n for (int y = -2; y <= 2; y++) {\n vec2 off = vec2(float(x), float(y)) * u_texel * u_blur;\n vec4 s = texture(u_tex, v_uv + off);\n float weight = 1.0 / (1.0 + float(x*x + y*y));\n sum += s * weight;\n w += weight;\n }\n }\n sum /= w;\n }\n vec3 bloom = vec3(0.0);\n if (u_bloom > 0.01) {\n float lum = dot(sum.rgb, vec3(0.299, 0.587, 0.114));\n if (lum > u_bloomThreshold) {\n bloom = sum.rgb * u_bloom * (lum - u_bloomThreshold);\n }\n }\n outColor = vec4(clamp(sum.rgb + bloom, 0.0, 1.0), c.a);\n}\n`;\n\nexport class WebGLCompositor {\n private gl: WebGL2RenderingContext | null = null;\n private program: WebGLProgram | null = null;\n private vao: WebGLVertexArrayObject | null = null;\n private texture: WebGLTexture | null = null;\n public readonly isSupported: boolean;\n\n constructor() {\n if (typeof document === \"undefined\") {\n this.isSupported = false;\n return;\n }\n const canvas = document.createElement(\"canvas\");\n canvas.width = 2;\n canvas.height = 2;\n const gl = canvas.getContext(\"webgl2\", { premultipliedAlpha: true, alpha: true });\n if (!gl) {\n this.isSupported = false;\n return;\n }\n this.gl = gl;\n this.isSupported = this.initProgram(gl);\n }\n\n private initProgram(gl: WebGL2RenderingContext): boolean {\n const vs = this.compileShader(gl, gl.VERTEX_SHADER, VERTEX_SRC);\n const fs = this.compileShader(gl, gl.FRAGMENT_SHADER, FRAGMENT_SRC);\n if (!vs || !fs) return false;\n\n const program = gl.createProgram();\n if (!program) return false;\n gl.attachShader(program, vs);\n gl.attachShader(program, fs);\n gl.linkProgram(program);\n if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {\n console.warn(\"Compositor program link failed\", gl.getProgramInfoLog(program));\n return false;\n }\n this.program = program;\n\n const positions = new Float32Array([-1, -1, 0, 1, 1, -1, 1, 1, -1, 1, 0, 0, 1, 1, 1, 0]);\n const vao = gl.createVertexArray();\n const vbo = gl.createBuffer();\n gl.bindVertexArray(vao);\n gl.bindBuffer(gl.ARRAY_BUFFER, vbo);\n gl.bufferData(gl.ARRAY_BUFFER, positions, gl.STATIC_DRAW);\n const locPos = gl.getAttribLocation(program, \"a_pos\");\n const locUv = gl.getAttribLocation(program, \"a_uv\");\n gl.enableVertexAttribArray(locPos);\n gl.vertexAttribPointer(locPos, 2, gl.FLOAT, false, 16, 0);\n gl.enableVertexAttribArray(locUv);\n gl.vertexAttribPointer(locUv, 2, gl.FLOAT, false, 16, 8);\n gl.bindVertexArray(null);\n this.vao = vao;\n\n this.texture = gl.createTexture();\n return true;\n }\n\n private compileShader(gl: WebGL2RenderingContext, type: number, source: string): WebGLShader | null {\n const shader = gl.createShader(type);\n if (!shader) return null;\n gl.shaderSource(shader, source);\n gl.compileShader(shader);\n if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {\n console.warn(gl.getShaderInfoLog(shader));\n return null;\n }\n return shader;\n }\n\n renderToContext(targetCtx: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D, source: HTMLCanvasElement | OffscreenCanvas, settings: CompositorSettings): void {\n const gl = this.gl;\n const program = this.program;\n if (!gl || !program || !this.isSupported) {\n targetCtx.clearRect(0, 0, source.width, source.height);\n targetCtx.drawImage(source as CanvasImageSource, 0, 0);\n return;\n }\n\n const w = source.width;\n const h = source.height;\n\n const canvas = gl.canvas as HTMLCanvasElement;\n if (canvas.width !== w || canvas.height !== h) {\n canvas.width = w;\n canvas.height = h;\n }\n\n gl.viewport(0, 0, w, h);\n gl.clearColor(0, 0, 0, 0);\n gl.clear(gl.COLOR_BUFFER_BIT);\n\n gl.useProgram(program);\n gl.activeTexture(gl.TEXTURE0);\n gl.bindTexture(gl.TEXTURE_2D, this.texture);\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 gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\n gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true);\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, source as TexImageSource);\n\n gl.uniform1i(gl.getUniformLocation(program, \"u_tex\"), 0);\n gl.uniform2f(gl.getUniformLocation(program, \"u_texel\"), 1 / w, 1 / h);\n gl.uniform1f(gl.getUniformLocation(program, \"u_blur\"), settings.blur ?? 0);\n gl.uniform1f(gl.getUniformLocation(program, \"u_bloom\"), settings.bloom ?? 0);\n gl.uniform1f(gl.getUniformLocation(program, \"u_bloomThreshold\"), settings.bloomThreshold ?? 0.6);\n\n gl.bindVertexArray(this.vao);\n gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);\n gl.bindVertexArray(null);\n\n targetCtx.clearRect(0, 0, w, h);\n targetCtx.drawImage(canvas, 0, 0);\n }\n\n dispose(): void {\n const gl = this.gl;\n if (!gl) return;\n if (this.texture) gl.deleteTexture(this.texture);\n if (this.program) gl.deleteProgram(this.program);\n if (this.vao) gl.deleteVertexArray(this.vao);\n this.gl = null;\n }\n}\n","import type { SceneDocument } from \"./schema\";\n\n/** Apply rectangular wipe reveal (MVP mask) on composed canvas */\nexport function applyMaskReveal(\n ctx: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D,\n doc: SceneDocument,\n width: number,\n height: number\n): void {\n const maskLayer = doc.effectLayers.find((l) => l.type === \"mask\" && l.enabled);\n if (!maskLayer) return;\n\n const maskType = (maskLayer.params.maskType as string) || \"alphaText\";\n const progress = Math.max(0, Math.min(1, (maskLayer.params.revealProgress as number) ?? 1));\n if (progress >= 1) return;\n\n ctx.save();\n ctx.globalCompositeOperation = \"destination-in\";\n\n if (maskType === \"rectReveal\") {\n const w = width * progress;\n ctx.fillStyle = \"#ffffff\";\n ctx.fillRect(0, 0, w, height);\n } else {\n // alphaText: horizontal reveal as MVP stand-in until glyph masks exist\n const w = width * progress;\n const grad = ctx.createLinearGradient(0, 0, width, 0);\n grad.addColorStop(0, \"rgba(255,255,255,1)\");\n grad.addColorStop(Math.max(0, progress - 0.02), \"rgba(255,255,255,1)\");\n grad.addColorStop(Math.min(1, progress + 0.02), \"rgba(255,255,255,0)\");\n grad.addColorStop(1, \"rgba(255,255,255,0)\");\n ctx.fillStyle = grad;\n ctx.fillRect(0, 0, width, height);\n }\n\n ctx.restore();\n}\n","import type { TextEffectConfig } from \"../types\";\nimport { renderTextEffectCore } from \"../renderer\";\nimport { sceneToConfig, textEffectConfigToScene } from \"./migrate\";\nimport { applyTimelineAtTime } from \"./animation\";\nimport type { SceneDocument } from \"./schema\";\nimport { WebGLCompositor } from \"../compositor\";\nimport { applyMaskReveal } from \"./mask\";\n\nexport interface EvaluateOptions {\n compositor?: WebGLCompositor | null;\n skipPostFx?: boolean;\n}\n\nlet sharedCompositor: WebGLCompositor | null = null;\n\nfunction getCompositor(): WebGLCompositor | null {\n if (typeof document === \"undefined\") return null;\n if (!sharedCompositor) {\n sharedCompositor = new WebGLCompositor();\n }\n return sharedCompositor;\n}\n\n/**\n * Single source of truth for rendering a scene at time t.\n */\nexport function evaluateScene(doc: SceneDocument, time: number, ctx: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D, options: EvaluateOptions = {}): void {\n const animated = applyTimelineAtTime(doc, time);\n const cfg = sceneToConfig(animated);\n\n const w = cfg.canvasWidth || 800;\n const h = cfg.canvasHeight || 200;\n\n const filterLayers = animated.effectLayers.filter((l) => l.type === \"filter\" && l.enabled);\n const lastFilter = filterLayers[filterLayers.length - 1]?.params as { blur?: number; bloom?: number };\n const comp = {\n blur: lastFilter?.blur ?? animated.compositor.blur ?? 0,\n bloom: lastFilter?.bloom ?? animated.compositor.bloom ?? 0,\n bloomThreshold: animated.compositor.bloomThreshold ?? 0.6,\n };\n\n const usePostFx = !options.skipPostFx && (comp.blur > 0 || comp.bloom > 0);\n\n const finishFrame = () => applyMaskReveal(ctx, animated, w, h);\n\n if (!usePostFx) {\n ctx.clearRect(0, 0, w, h);\n renderTextEffectCore(ctx, cfg);\n finishFrame();\n return;\n }\n\n const off = typeof OffscreenCanvas !== \"undefined\" ? new OffscreenCanvas(w, h) : null;\n\n if (off) {\n const offCtx = off.getContext(\"2d\");\n if (!offCtx) {\n renderTextEffectCore(ctx, cfg);\n finishFrame();\n return;\n }\n renderTextEffectCore(offCtx, cfg);\n applyMaskReveal(offCtx, animated, w, h);\n const compositor = options.compositor ?? getCompositor();\n if (compositor?.isSupported) {\n compositor.renderToContext(ctx, off, comp);\n return;\n }\n ctx.clearRect(0, 0, w, h);\n ctx.drawImage(off as unknown as CanvasImageSource, 0, 0);\n return;\n }\n\n // Fallback: draw to temp canvas in DOM\n if (typeof document !== \"undefined\") {\n const temp = document.createElement(\"canvas\");\n temp.width = w;\n temp.height = h;\n const tctx = temp.getContext(\"2d\");\n if (tctx) {\n renderTextEffectCore(tctx, cfg);\n applyMaskReveal(tctx, animated, w, h);\n const compositor = options.compositor ?? getCompositor();\n if (compositor?.isSupported) {\n compositor.renderToContext(ctx, temp, comp);\n return;\n }\n ctx.clearRect(0, 0, w, h);\n ctx.drawImage(temp, 0, 0);\n return;\n }\n }\n\n renderTextEffectCore(ctx, cfg);\n finishFrame();\n}\n\nexport function evaluateConfig(cfg: TextEffectConfig, time: number, ctx: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D, options?: EvaluateOptions): void {\n evaluateScene(textEffectConfigToScene(cfg), time, ctx, options);\n}\n\nexport function advanceSceneTime(doc: SceneDocument, steps: number): number {\n const dt = 1 / (doc.timeline.fps || 30);\n const next = (doc as SceneDocument & { _time?: number })._time ?? 0;\n const duration = doc.timeline.duration || 2;\n let t = next + steps * dt;\n if (doc.timeline.loop) {\n t = duration > 0 ? t % duration : t;\n } else {\n t = Math.min(t, duration);\n }\n (doc as SceneDocument & { _time?: number })._time = t;\n return t;\n}\n\nexport function getSceneTime(doc: SceneDocument): number {\n return (doc as SceneDocument & { _time?: number })._time ?? 0;\n}\n\nexport function setSceneTime(doc: SceneDocument, time: number): void {\n (doc as SceneDocument & { _time?: number })._time = time;\n}\n\nexport function resetSceneTime(doc: SceneDocument): void {\n (doc as SceneDocument & { _time?: number })._time = 0;\n}\n","import type { Preset } from \"../types\";\nimport { builtInPresets } from \"../presets\";\nimport type { SceneDocument, StyleRecipe } from \"./schema\";\nimport { textEffectConfigToScene } from \"./migrate\";\n\nconst sceneCache = new Map<string, SceneDocument>();\n\nexport function getPresetScene(preset: Preset): SceneDocument {\n if (sceneCache.has(preset.id)) {\n return structuredClone(sceneCache.get(preset.id)!);\n }\n const scene = textEffectConfigToScene(preset.config);\n sceneCache.set(preset.id, scene);\n return structuredClone(scene);\n}\n\nexport function presetToRecipe(preset: Preset): StyleRecipe {\n const scene = getPresetScene(preset);\n return {\n id: preset.id,\n name: preset.name,\n category: preset.category,\n layers: structuredClone(scene.effectLayers),\n exposed: [\n \"fill.fillColor\",\n \"stroke.strokeWidth\",\n \"shadow.shadowBlur\",\n \"glow.0.opacity\",\n ],\n tags: [preset.category || \"Classic\", preset.id],\n customEngineId: scene.customEngineId,\n scene,\n };\n}\n\nexport const builtInRecipes: StyleRecipe[] = builtInPresets.map(presetToRecipe);\n\nexport function applyRecipeToScene(\n base: SceneDocument,\n recipe: StyleRecipe\n): SceneDocument {\n return {\n ...base,\n effectName: recipe.name,\n effectLayers: structuredClone(recipe.layers),\n customEngineId: recipe.customEngineId ?? null,\n engineParams: recipe.scene?.engineParams,\n compositor: recipe.scene?.compositor ?? base.compositor,\n timeline: recipe.scene?.timeline ?? base.timeline,\n };\n}\n\nexport function clearRecipeCache(): void {\n sceneCache.clear();\n}\n","/**\n * Programmatic Lottie Animation Builder and Mutation Engine (Bodymovin Schema)\n * Supports creating compositions from scratch, layer insertions, and visual keyframe timeline tracking.\n *\n * Font Handling:\n * Lottie-web uses the 'fName' property to look up fonts in the browser's CSS.\n * Each font variant (Regular, Bold, Italic, BoldItalic) is registered as a separate\n * font-family name (e.g., \"Poppins-Italic\") that maps to the actual font with\n * appropriate font-weight and font-style via @font-face rules in index.css.\n */\n\nexport interface EasingControlPoint {\n x: number[];\n y: number[];\n}\n\nexport interface LottieKeyframe {\n t: number; // Frame number\n s: number[] | number; // Start value at this keyframe\n i?: EasingControlPoint; // Easing in control points\n o?: EasingControlPoint; // Easing out control points\n}\n\nexport type LottiePropertyPath = \"ks.a\" | \"ks.p\" | \"ks.s\" | \"ks.r\" | \"ks.o\";\n\n/**\n * Creates a valid minimum blank slate Lottie composition\n */\nexport function createBlankLottie(w: number, h: number, fps: number, durationFrames: number): any {\n return {\n v: \"5.7.5\",\n fr: fps,\n ip: 0,\n op: durationFrames,\n w,\n h,\n nm: \"Clypra Motion Composition\",\n ddd: 0,\n assets: [],\n layers: [],\n fonts: {\n list: [\n {\n fName: \"Poppins-Bold\",\n fFamily: \"Poppins\",\n fWeight: \"700\",\n fStyle: \"Bold\",\n asName: \"Poppins-Bold\",\n },\n {\n fName: \"Poppins-Regular\",\n fFamily: \"Poppins\",\n fWeight: \"400\",\n fStyle: \"Regular\",\n asName: \"Poppins-Regular\",\n },\n {\n fName: \"Poppins-Italic\",\n fFamily: \"Poppins\",\n fWeight: \"400\",\n fStyle: \"Italic\",\n asName: \"Poppins-Italic\",\n },\n {\n fName: \"Poppins-BoldItalic\",\n fFamily: \"Poppins\",\n fWeight: \"700\",\n fStyle: \"Bold Italic\",\n asName: \"Poppins-BoldItalic\",\n },\n {\n fName: \"Arial\",\n fFamily: \"Arial\",\n fWeight: \"400\",\n fStyle: \"Regular\",\n asName: \"Arial\",\n },\n {\n fName: \"Arial-Bold\",\n fFamily: \"Arial\",\n fWeight: \"700\",\n fStyle: \"Bold\",\n asName: \"Arial-Bold\",\n },\n {\n fName: \"Arial-Italic\",\n fFamily: \"Arial\",\n fWeight: \"400\",\n fStyle: \"Italic\",\n asName: \"Arial-Italic\",\n },\n {\n fName: \"Arial-BoldItalic\",\n fFamily: \"Arial\",\n fWeight: \"700\",\n fStyle: \"Bold Italic\",\n asName: \"Arial-BoldItalic\",\n },\n {\n fName: \"Montserrat-Regular\",\n fFamily: \"Montserrat\",\n fWeight: \"400\",\n fStyle: \"Regular\",\n asName: \"Montserrat-Regular\",\n },\n {\n fName: \"Montserrat-Bold\",\n fFamily: \"Montserrat\",\n fWeight: \"700\",\n fStyle: \"Bold\",\n asName: \"Montserrat-Bold\",\n },\n {\n fName: \"Montserrat-ExtraBold\",\n fFamily: \"Montserrat\",\n fWeight: \"800\",\n fStyle: \"ExtraBold\",\n asName: \"Montserrat-ExtraBold\",\n },\n {\n fName: \"Montserrat-Black\",\n fFamily: \"Montserrat\",\n fWeight: \"900\",\n fStyle: \"Black\",\n asName: \"Montserrat-Black\",\n },\n {\n fName: \"Montserrat-Italic\",\n fFamily: \"Montserrat\",\n fWeight: \"400\",\n fStyle: \"Italic\",\n asName: \"Montserrat-Italic\",\n },\n {\n fName: \"Montserrat-BoldItalic\",\n fFamily: \"Montserrat\",\n fWeight: \"700\",\n fStyle: \"Bold Italic\",\n asName: \"Montserrat-BoldItalic\",\n },\n {\n fName: \"Montserrat-ExtraBoldItalic\",\n fFamily: \"Montserrat\",\n fWeight: \"800\",\n fStyle: \"ExtraBold Italic\",\n asName: \"Montserrat-ExtraBoldItalic\",\n },\n {\n fName: \"Montserrat-BlackItalic\",\n fFamily: \"Montserrat\",\n fWeight: \"900\",\n fStyle: \"Black Italic\",\n asName: \"Montserrat-BlackItalic\",\n },\n ],\n },\n };\n}\n\n/**\n * Re-indexes layer indices (ind) in a Lottie composition to ensure ordering integrity\n */\nexport function reindexLayers(lottieData: any): void {\n if (!lottieData || !Array.isArray(lottieData.layers)) return;\n lottieData.layers.forEach((layer: any, index: number) => {\n // Standard layers index is 1-indexed descending\n layer.ind = lottieData.layers.length - index;\n });\n}\n\n/**\n * Adds a solid background layer (ty === 1) to the composition\n */\nexport function addSolidLayer(lottieData: any, name: string, color: string, w: number, h: number): any {\n const clone = JSON.parse(JSON.stringify(lottieData));\n if (!Array.isArray(clone.layers)) clone.layers = [];\n\n const newLayer = {\n ty: 1,\n nm: name,\n sr: 1,\n st: 0,\n ip: 0,\n op: clone.op,\n ind: clone.layers.length + 1,\n sw: w,\n sh: h,\n sc: color, // Solid color hex\n ks: {\n a: { a: 0, k: [0, 0, 0] },\n p: { a: 0, k: [w / 2, h / 2, 0] },\n s: { a: 0, k: [100, 100, 100] },\n r: { a: 0, k: 0 },\n o: { a: 0, k: 100 },\n },\n };\n\n // Prepend so that solid backgrounds sit at the bottom of the rendering stack\n clone.layers.push(newLayer);\n reindexLayers(clone);\n return clone;\n}\n\n/**\n * Adds a standard vector text layer (ty === 5) to the composition\n */\nexport function addTextLayer(lottieData: any, name: string, text: string): any {\n const clone = JSON.parse(JSON.stringify(lottieData));\n if (!Array.isArray(clone.layers)) clone.layers = [];\n\n const w = clone.w || 1920;\n const h = clone.h || 1080;\n\n const newLayer = {\n ty: 5,\n nm: name,\n sr: 1,\n st: 0,\n ip: 0,\n op: clone.op,\n ind: clone.layers.length + 1,\n ks: {\n a: { a: 0, k: [0, 0, 0] },\n p: { a: 0, k: [w / 2, h / 2, 0] },\n s: { a: 0, k: [100, 100, 100] },\n r: { a: 0, k: 0 },\n o: { a: 0, k: 100 },\n },\n t: {\n d: {\n k: [\n {\n s: {\n s: 64, // Font size\n f: \"Poppins-Bold\", // Font name\n t: text, // Initial Text content\n j: 1, // Center alignment\n tr: 0,\n lh: 80, // Line height\n ls: 0,\n fc: [1, 1, 1], // White [r,g,b] range 0-1\n },\n },\n ],\n },\n p: {},\n a: [],\n m: {\n g: 1,\n a: {\n a: 0,\n k: [0, 0],\n },\n },\n },\n };\n\n // Prepend to render on top\n clone.layers.unshift(newLayer);\n reindexLayers(clone);\n return clone;\n}\n\n/**\n * Adds an empty shape layer (ty === 4) to the composition\n */\nexport function addShapeLayer(lottieData: any, name: string): any {\n const clone = JSON.parse(JSON.stringify(lottieData));\n if (!Array.isArray(clone.layers)) clone.layers = [];\n\n const w = clone.w || 1920;\n const h = clone.h || 1080;\n\n const newLayer = {\n ty: 4,\n nm: name,\n sr: 1,\n st: 0,\n ip: 0,\n op: clone.op,\n ind: clone.layers.length + 1,\n ks: {\n a: { a: 0, k: [0, 0, 0] },\n p: { a: 0, k: [w / 2, h / 2, 0] },\n s: { a: 0, k: [100, 100, 100] },\n r: { a: 0, k: 0 },\n o: { a: 0, k: 100 },\n },\n shapes: [],\n };\n\n clone.layers.unshift(newLayer);\n reindexLayers(clone);\n return clone;\n}\n\n/**\n * Appends a basic vector shape (Rectangle or Ellipse) to a shape layer\n */\nexport function addVectorShape(lottieData: any, layerIndex: number, shapeType: \"rect\" | \"ellipse\", colorHex: string): any {\n const clone = JSON.parse(JSON.stringify(lottieData));\n const layer = clone.layers[layerIndex];\n if (!layer || layer.ty !== 4) return clone;\n\n if (!Array.isArray(layer.shapes)) layer.shapes = [];\n\n // Convert hex color to normalized [r, g, b]\n const cleanHex = colorHex.startsWith(\"#\") ? colorHex.slice(1) : colorHex;\n const r = parseInt(cleanHex.slice(0, 2), 16) / 255 || 0.5;\n const g = parseInt(cleanHex.slice(2, 4), 16) / 255 || 0.4;\n const b = parseInt(cleanHex.slice(4, 6), 16) / 255 || 1.0;\n\n let shapeContent: any;\n\n if (shapeType === \"rect\") {\n shapeContent = {\n ty: \"gr\",\n nm: \"Rectangle Group\",\n it: [\n {\n ty: \"rc\", // Rectangle\n nm: \"Rect Path\",\n p: { a: 0, k: [0, 0] }, // position centered in group\n s: { a: 0, k: [250, 150] }, // size\n r: { a: 0, k: 8 }, // rounded corners\n },\n {\n ty: \"fl\", // Fill shape\n nm: \"Rect Fill\",\n c: { a: 0, k: [r, g, b, 1] }, // color\n o: { a: 0, k: 100 },\n },\n {\n ty: \"tr\", // Group transform\n nm: \"Group Transform\",\n p: { a: 0, k: [0, 0] },\n a: { a: 0, k: [0, 0] },\n s: { a: 0, k: [100, 100] },\n r: { a: 0, k: 0 },\n o: { a: 0, k: 100 },\n },\n ],\n };\n } else {\n shapeContent = {\n ty: \"gr\",\n nm: \"Ellipse Group\",\n it: [\n {\n ty: \"el\", // Ellipse\n nm: \"Ellipse Path\",\n p: { a: 0, k: [0, 0] },\n s: { a: 0, k: [200, 200] },\n },\n {\n ty: \"fl\",\n nm: \"Ellipse Fill\",\n c: { a: 0, k: [r, g, b, 1] },\n o: { a: 0, k: 100 },\n },\n {\n ty: \"tr\",\n nm: \"Group Transform\",\n p: { a: 0, k: [0, 0] },\n a: { a: 0, k: [0, 0] },\n s: { a: 0, k: [100, 100] },\n r: { a: 0, k: 0 },\n o: { a: 0, k: 100 },\n },\n ],\n };\n }\n\n layer.shapes.push(shapeContent);\n return clone;\n}\n\n/**\n * Gets the nested object inside a layer via property path (e.g. 'ks.p')\n */\nfunction getProperty(layer: any, path: LottiePropertyPath): any {\n if (!layer) return null;\n const keys = path.split(\".\");\n let current = layer;\n for (const key of keys) {\n if (!current[key]) return null;\n current = current[key];\n }\n return current;\n}\n\n/**\n * Updates a static property on a Lottie layer\n */\nexport function updateStaticProperty(lottieData: any, layerIndex: number, path: LottiePropertyPath, value: number | number[]): any {\n const clone = JSON.parse(JSON.stringify(lottieData));\n const layer = clone.layers[layerIndex];\n if (!layer) return clone;\n\n const propObj = getProperty(layer, path);\n if (propObj) {\n propObj.a = 0; // Not animated\n\n // Ensure 3D coordinate array bounds\n if (Array.isArray(value) && (path === \"ks.p\" || path === \"ks.s\" || path === \"ks.a\")) {\n propObj.k = [value[0] || 0, value[1] || 0, value[2] || 0];\n } else {\n propObj.k = value;\n }\n }\n\n return clone;\n}\n\n/**\n * Standard easing cubic bezier presets mapping\n */\nconst EASING_CURVES: Record<string, { o: EasingControlPoint; i: EasingControlPoint }> = {\n linear: {\n o: { x: [0], y: [0] },\n i: { x: [1], y: [1] },\n },\n easeIn: {\n o: { x: [0.42], y: [0] },\n i: { x: [1], y: [1] },\n },\n easeOut: {\n o: { x: [0], y: [0] },\n i: { x: [0.58], y: [1] },\n },\n easeInOut: {\n o: { x: [0.42], y: [0] },\n i: { x: [0.58], y: [1] },\n },\n};\n\n/**\n * Converts a static property to an animated keyframed track, inserting a default start keyframe\n */\nexport function enableKeyframing(lottieData: any, layerIndex: number, path: LottiePropertyPath): any {\n const clone = JSON.parse(JSON.stringify(lottieData));\n const layer = clone.layers[layerIndex];\n if (!layer) return clone;\n\n const propObj = getProperty(layer, path);\n if (propObj && propObj.a === 0) {\n const staticValue = propObj.k;\n propObj.a = 1; // Animated!\n\n // Create initial keyframe at frame 0\n propObj.k = [\n {\n t: 0,\n s: staticValue,\n i: EASING_CURVES.easeInOut.i,\n o: EASING_CURVES.easeInOut.o,\n },\n ];\n }\n return clone;\n}\n\n/**\n * Inserts or updates a keyframe in an animated Lottie property track\n */\nexport function addOrUpdateKeyframe(lottieData: any, layerIndex: number, path: LottiePropertyPath, frame: number, value: number | number[], easing: \"linear\" | \"easeIn\" | \"easeOut\" | \"easeInOut\" = \"easeInOut\"): any {\n const clone = JSON.parse(JSON.stringify(lottieData));\n const layer = clone.layers[layerIndex];\n if (!layer) return clone;\n\n const propObj = getProperty(layer, path);\n if (!propObj) return clone;\n\n // Guarantee keyframing is active\n if (propObj.a === 0) {\n // If not animated, convert to keyframed first\n propObj.a = 1;\n propObj.k = [\n {\n t: 0,\n s: propObj.k,\n i: EASING_CURVES[easing].i,\n o: EASING_CURVES[easing].o,\n },\n ];\n }\n\n const keyframes: LottieKeyframe[] = propObj.k;\n\n // Format coordinate values\n let formattedVal = value;\n if (Array.isArray(value) && (path === \"ks.p\" || path === \"ks.s\" || path === \"ks.a\")) {\n formattedVal = [value[0] || 0, value[1] || 0, value[2] || 0];\n }\n\n // Look for existing keyframe at exact frame number\n const matchIndex = keyframes.findIndex((kf) => kf.t === frame);\n const curves = EASING_CURVES[easing];\n\n if (matchIndex !== -1) {\n // Update existing keyframe\n keyframes[matchIndex].s = formattedVal;\n keyframes[matchIndex].i = curves.i;\n keyframes[matchIndex].o = curves.o;\n } else {\n // Insert new keyframe\n keyframes.push({\n t: frame,\n s: formattedVal,\n i: curves.i,\n o: curves.o,\n });\n\n // Keep keyframes sorted by frame time ascending\n keyframes.sort((a, b) => a.t - b.t);\n }\n\n // Bodymovin specification requires the last keyframe in the array to NOT contain easing control points,\n // as it represents the endpoint of the animation.\n keyframes.forEach((kf, idx) => {\n if (idx === keyframes.length - 1) {\n delete kf.i;\n delete kf.o;\n } else {\n kf.i = kf.i || curves.i;\n kf.o = kf.o || curves.o;\n }\n });\n\n return clone;\n}\n\n/**\n * Removes a keyframe from an animated Lottie property track\n */\nexport function deleteKeyframe(lottieData: any, layerIndex: number, path: LottiePropertyPath, frame: number): any {\n const clone = JSON.parse(JSON.stringify(lottieData));\n const layer = clone.layers[layerIndex];\n if (!layer) return clone;\n\n const propObj = getProperty(layer, path);\n if (!propObj || propObj.a === 0) return clone;\n\n let keyframes: LottieKeyframe[] = propObj.k;\n\n // Remove match\n keyframes = keyframes.filter((kf) => kf.t !== frame);\n\n if (keyframes.length === 0) {\n // If no keyframes left, convert back to static at frame 0 values\n propObj.a = 0;\n propObj.k = path === \"ks.p\" || path === \"ks.s\" || path === \"ks.a\" ? [0, 0, 0] : 0;\n } else {\n propObj.k = keyframes;\n\n // Patch last keyframe ending\n keyframes.forEach((kf, idx) => {\n if (idx === keyframes.length - 1) {\n delete kf.i;\n delete kf.o;\n }\n });\n }\n\n return clone;\n}\n\n/**\n * Adds an image asset and corresponding Image Layer (ty === 2) to the composition\n */\nexport function addImageLayer(lottieData: any, name: string, base64Data: string, w: number, h: number): any {\n const clone = JSON.parse(JSON.stringify(lottieData));\n if (!Array.isArray(clone.assets)) clone.assets = [];\n if (!Array.isArray(clone.layers)) clone.layers = [];\n\n const assetId = `img_${Date.now()}`;\n\n // 1. Add image to assets pool\n clone.assets.push({\n id: assetId,\n w,\n h,\n u: \"\",\n p: base64Data, // data:image/png;base64,...\n e: 1,\n });\n\n const compW = clone.w || 1920;\n const compH = clone.h || 1080;\n\n // 2. Add Image Layer pointing to the asset\n const newLayer = {\n ty: 2,\n nm: name,\n refId: assetId,\n sr: 1,\n st: 0,\n ip: 0,\n op: clone.op,\n ind: clone.layers.length + 1,\n ks: {\n a: { a: 0, k: [w / 2, h / 2, 0] },\n p: { a: 0, k: [compW / 2, compH / 2, 0] },\n s: { a: 0, k: [100, 100, 100] },\n r: { a: 0, k: 0 },\n o: { a: 0, k: 100 },\n },\n };\n\n clone.layers.unshift(newLayer);\n reindexLayers(clone);\n return clone;\n}\n\n/**\n * Sets or clears the track matte mask setting of a layer\n * matteType: 0 = None, 1 = Alpha Matte, 2 = Alpha Inverted Matte\n */\nexport function updateTrackMatte(lottieData: any, layerIndex: number, matteType: number): any {\n const clone = JSON.parse(JSON.stringify(lottieData));\n const layer = clone.layers[layerIndex];\n if (!layer) return clone;\n\n if (matteType === 0) {\n delete layer.tt;\n } else {\n layer.tt = matteType;\n }\n\n return clone;\n}\n","/**\n * Lottie JSON Parser\n * Auto-extracts dimensions, length, framerate, and all text layers.\n */\n\nexport interface ParsedTextLayer {\n layerName: string;\n defaultText: string;\n}\n\nexport interface LottieFileInfo {\n width: number;\n height: number;\n fps: number;\n durationFrames: number;\n textLayers: ParsedTextLayer[];\n}\n\n/**\n * Extracts the default text string from a Lottie layer.t.d.k structure\n */\nexport function getDefaultText(layer: any): string {\n if (!layer.t || !layer.t.d) return \"\";\n const d = layer.t.d;\n if (Array.isArray(d.k)) {\n const firstKf = d.k[0];\n if (firstKf && firstKf.s && typeof firstKf.s.t === \"string\") {\n return firstKf.s.t;\n }\n } else if (d.k && d.k.s && typeof d.k.s.t === \"string\") {\n return d.k.s.t;\n }\n return \"\";\n}\n\n/**\n * Recursively scans layers (including nested precompositions) for text layers (ty === 5)\n */\nexport function scanTextLayers(lottieData: any): ParsedTextLayer[] {\n const result: ParsedTextLayer[] = [];\n const visitedLayerNames = new Set<string>();\n\n function traverseLayers(layers: any[]) {\n if (!Array.isArray(layers)) return;\n for (const layer of layers) {\n if (!layer) continue;\n\n // Text layer is ty === 5\n if (layer.ty === 5) {\n const name = layer.nm || \"Unnamed Layer\";\n const defaultText = getDefaultText(layer);\n if (!visitedLayerNames.has(name)) {\n visitedLayerNames.add(name);\n result.push({\n layerName: name,\n defaultText,\n });\n }\n }\n }\n }\n\n // 1. Scan main layers\n if (Array.isArray(lottieData.layers)) {\n traverseLayers(lottieData.layers);\n }\n\n // 2. Scan layers inside assets (pre-compositions)\n if (Array.isArray(lottieData.assets)) {\n for (const asset of lottieData.assets) {\n if (asset && Array.isArray(asset.layers)) {\n traverseLayers(asset.layers);\n }\n }\n }\n\n return result;\n}\n\n/**\n * Parse an uploaded Lottie JSON object to extract metadata and text layers\n */\nexport function parseLottieJson(lottieData: any): LottieFileInfo {\n if (!lottieData || typeof lottieData !== \"object\") {\n throw new Error(\"Invalid Lottie JSON payload.\");\n }\n\n const width = typeof lottieData.w === \"number\" ? lottieData.w : 1920;\n const height = typeof lottieData.h === \"number\" ? lottieData.h : 1080;\n const fps = typeof lottieData.fr === \"number\" ? lottieData.fr : 30;\n\n const ip = typeof lottieData.ip === \"number\" ? lottieData.ip : 0;\n const op = typeof lottieData.op === \"number\" ? lottieData.op : 100;\n const durationFrames = Math.max(1, Math.round(op - ip));\n\n const textLayers = scanTextLayers(lottieData);\n\n return {\n width,\n height,\n fps,\n durationFrames,\n textLayers,\n };\n}\n","/**\n * Lottie Customization & Injections Engine\n * Implements real-time text, color, and full per-layer style mutations.\n */\n\nexport interface TextLayerConfig {\n layerName: string;\n defaultText: string;\n maxCharacters: number;\n role: \"primary\" | \"secondary\" | \"accent\";\n}\n\nexport type TextCustomization = {\n primary: string;\n secondary: string;\n accent: string;\n};\n\n/** Full per-layer text style override — all fields optional */\nexport interface TextStyleOverride {\n text?: string;\n fontName?: string; // Lottie fName e.g. \"Poppins-Bold\"\n fontSize?: number;\n fillColor?: string; // hex\n strokeColor?: string; // hex\n strokeWidth?: number;\n tracking?: number; // Lottie tr\n lineHeight?: number; // Lottie lh (absolute px)\n align?: 0 | 1 | 2 | 3; // 0=left 1=center 2=right 3=justify\n opacity?: number; // 0–100\n scaleX?: number; // 0–200 %\n scaleY?: number;\n posX?: number;\n posY?: number;\n rotation?: number;\n}\n\n// ─── Helpers ─────────────────────────────────────────────────────────────────\n\n/**\n * Convert #RRGGBB to Lottie normalized [r, g, b] (0–1).\n */\nexport function hexToLottieRgb(hex: string): [number, number, number] {\n const clean = (hex.startsWith(\"#\") ? hex.slice(1) : hex).padEnd(6, \"0\");\n if (clean.length !== 6) return [0, 0, 0];\n return [Math.max(0, Math.min(1, parseInt(clean.slice(0, 2), 16) / 255)), Math.max(0, Math.min(1, parseInt(clean.slice(2, 4), 16) / 255)), Math.max(0, Math.min(1, parseInt(clean.slice(4, 6), 16) / 255))];\n}\n\nfunction applyToTextDoc(doc: any, override: TextStyleOverride): void {\n if (!doc) return;\n if (override.text !== undefined) doc.t = override.text.replace(/\\n/g, \"\\r\");\n if (override.fontName !== undefined) doc.f = override.fontName;\n if (override.fontSize !== undefined) doc.s = override.fontSize;\n if (override.tracking !== undefined) doc.tr = override.tracking;\n if (override.lineHeight !== undefined) doc.lh = override.lineHeight;\n if (override.align !== undefined) doc.j = override.align;\n if (override.fillColor !== undefined) doc.fc = hexToLottieRgb(override.fillColor);\n if (override.strokeColor !== undefined && override.strokeWidth !== undefined) {\n doc.sc = hexToLottieRgb(override.strokeColor);\n doc.sw = override.strokeWidth;\n } else if (override.strokeWidth !== undefined) {\n doc.sw = override.strokeWidth;\n }\n}\n\nfunction applyToLayerTransform(layer: any, override: TextStyleOverride): void {\n const ks = layer.ks;\n if (!ks) return;\n if (override.opacity !== undefined && ks.o?.a === 0) ks.o.k = override.opacity;\n if (override.rotation !== undefined && ks.r?.a === 0) ks.r.k = override.rotation;\n if (override.scaleX !== undefined && override.scaleY !== undefined && ks.s?.a === 0) {\n ks.s.k = [override.scaleX, override.scaleY, 100];\n }\n if (override.posX !== undefined && override.posY !== undefined && ks.p?.a === 0) {\n const z = Array.isArray(ks.p.k) ? (ks.p.k[2] ?? 0) : 0;\n ks.p.k = [override.posX, override.posY, z];\n }\n}\n\nfunction mutateTextLayer(layer: any, override: TextStyleOverride): void {\n if (!layer || layer.ty !== 5) return;\n applyToLayerTransform(layer, override);\n const td = layer.t?.d;\n if (!td) return;\n if (Array.isArray(td.k)) {\n td.k.forEach((kf: any) => {\n if (kf?.s) applyToTextDoc(kf.s, override);\n });\n } else if (td.k?.s) {\n applyToTextDoc(td.k.s, override);\n }\n}\n\nfunction traverseAllLayers(lottieData: any, fn: (layer: any) => void): void {\n if (Array.isArray(lottieData.layers)) lottieData.layers.forEach(fn);\n if (Array.isArray(lottieData.assets)) {\n lottieData.assets.forEach((asset: any) => {\n if (Array.isArray(asset.layers)) asset.layers.forEach(fn);\n });\n }\n}\n\n// ─── Public API ───────────────────────────────────────────────────────────────\n\n/**\n * Inject text content into mapped text layers by role.\n */\nexport function injectText(lottieData: any, customization: TextCustomization, textLayers: TextLayerConfig[]): any {\n if (!lottieData) return lottieData;\n const clone = JSON.parse(JSON.stringify(lottieData));\n const configMap = new Map(textLayers.map((l) => [l.layerName, l]));\n\n traverseAllLayers(clone, (layer) => {\n if (layer.ty !== 5) return;\n const config = configMap.get(layer.nm);\n if (!config) return;\n const raw = customization[config.role] ?? config.defaultText;\n const text = raw.slice(0, config.maxCharacters);\n mutateTextLayer(layer, { text });\n });\n\n return clone;\n}\n\n/**\n * Inject a full style override into a specific named text layer.\n */\nexport function injectTextStyle(lottieData: any, layerName: string, override: TextStyleOverride): any {\n if (!lottieData) return lottieData;\n const clone = JSON.parse(JSON.stringify(lottieData));\n\n traverseAllLayers(clone, (layer) => {\n if (layer.ty !== 5 || layer.nm !== layerName) return;\n mutateTextLayer(layer, override);\n });\n\n return clone;\n}\n\n/**\n * Inject style overrides into ALL text layers at once.\n * Useful for applying a global font/color change.\n */\nexport function injectGlobalTextStyle(lottieData: any, override: Omit<TextStyleOverride, \"text\" | \"posX\" | \"posY\">): any {\n if (!lottieData) return lottieData;\n const clone = JSON.parse(JSON.stringify(lottieData));\n\n traverseAllLayers(clone, (layer) => {\n if (layer.ty !== 5) return;\n mutateTextLayer(layer, override);\n });\n\n return clone;\n}\n\n/**\n * Inject fill color into shape layers (ty === \"fl\") within a named layer.\n */\nexport function injectColor(lottieData: any, layerName: string, hexColor: string): any {\n if (!lottieData || !layerName) return lottieData;\n const clone = JSON.parse(JSON.stringify(lottieData));\n const targetRgb = hexToLottieRgb(hexColor);\n\n function traverseShapes(obj: any): void {\n if (!obj || typeof obj !== \"object\") return;\n if (obj.ty === \"fl\" && obj.c) {\n const c = obj.c;\n if (Array.isArray(c.k) && c.k.length >= 3) {\n c.k[0] = targetRgb[0];\n c.k[1] = targetRgb[1];\n c.k[2] = targetRgb[2];\n } else {\n c.k = [...targetRgb];\n }\n }\n for (const key of Object.keys(obj)) {\n const val = obj[key];\n if (Array.isArray(val)) val.forEach(traverseShapes);\n else if (val && typeof val === \"object\") traverseShapes(val);\n }\n }\n\n traverseAllLayers(clone, (layer) => {\n if (layer.nm === layerName) traverseShapes(layer);\n });\n\n return clone;\n}\n\n/**\n * Inject solid layer background color (ty === 1).\n */\nexport function injectSolidColor(lottieData: any, layerName: string, hexColor: string): any {\n if (!lottieData) return lottieData;\n const clone = JSON.parse(JSON.stringify(lottieData));\n\n traverseAllLayers(clone, (layer) => {\n if (layer.ty === 1 && layer.nm === layerName) {\n layer.sc = hexColor;\n }\n });\n\n return clone;\n}\n\n/**\n * Batch inject multiple overrides in one pass — most efficient for live preview.\n */\nexport interface BatchInjection {\n textCustomization?: { customization: TextCustomization; layers: TextLayerConfig[] };\n styleOverrides?: Array<{ layerName: string; override: TextStyleOverride }>;\n colorOverrides?: Array<{ layerName: string; color: string }>;\n solidOverrides?: Array<{ layerName: string; color: string }>;\n hiddenLayers?: Set<number>;\n}\n\nexport function injectBatch(lottieData: any, batch: BatchInjection): any {\n if (!lottieData) return lottieData;\n let clone = JSON.parse(JSON.stringify(lottieData));\n\n // Apply visibility toggles\n if (batch.hiddenLayers && Array.isArray(clone.layers)) {\n clone.layers.forEach((layer: any, idx: number) => {\n layer.hd = batch.hiddenLayers!.has(idx);\n });\n }\n\n // Text content injection\n if (batch.textCustomization) {\n const { customization, layers } = batch.textCustomization;\n const configMap = new Map(layers.map((l) => [l.layerName, l]));\n traverseAllLayers(clone, (layer) => {\n if (layer.ty !== 5) return;\n const config = configMap.get(layer.nm);\n if (!config) return;\n const raw = customization[config.role] ?? config.defaultText;\n mutateTextLayer(layer, { text: raw.slice(0, config.maxCharacters) });\n });\n }\n\n // Per-layer style overrides\n if (batch.styleOverrides) {\n const styleMap = new Map(batch.styleOverrides.map((s) => [s.layerName, s.override]));\n traverseAllLayers(clone, (layer) => {\n if (layer.ty !== 5) return;\n const override = styleMap.get(layer.nm);\n if (override) mutateTextLayer(layer, override);\n });\n }\n\n // Shape color overrides\n if (batch.colorOverrides) {\n for (const { layerName, color } of batch.colorOverrides) {\n clone = injectColor(clone, layerName, color);\n }\n }\n\n // Solid layer color overrides\n if (batch.solidOverrides) {\n for (const { layerName, color } of batch.solidOverrides) {\n clone = injectSolidColor(clone, layerName, color);\n }\n }\n\n return clone;\n}\n","/**\n * Lottie Text Animation Presets — CapCut-grade entrance, exit, and loop animations.\n * Each preset returns a set of Lottie keyframe tracks to bake into a text layer.\n */\n\nexport type AnimationCategory = \"entrance\" | \"exit\" | \"loop\" | \"emphasis\";\n\nexport interface LottieAnimPreset {\n id: string;\n name: string;\n category: AnimationCategory;\n icon: string;\n description: string;\n /** Duration in frames this animation occupies */\n defaultDurationFrames: number;\n /** Build keyframes for a given layer, start frame, total frames, and comp size */\n buildTracks: (opts: AnimBuildOpts) => AnimTrackDef[];\n}\n\nexport interface AnimBuildOpts {\n layerIndex: number;\n startFrame: number;\n endFrame: number;\n totalFrames: number;\n compW: number;\n compH: number;\n /** For exit animations, the frame at which exit begins */\n exitStartFrame?: number;\n}\n\nexport interface AnimKeyframe {\n t: number;\n s: number[] | number;\n i?: { x: number[]; y: number[] };\n o?: { x: number[]; y: number[] };\n}\n\nexport interface AnimTrackDef {\n /** Lottie property path e.g. \"ks.p\", \"ks.s\", \"ks.o\", \"ks.r\" */\n path: string;\n keyframes: AnimKeyframe[];\n}\n\n// ─── Easing helpers ──────────────────────────────────────────────────────────\n\nconst EASE_OUT = { i: { x: [0.58], y: [1] }, o: { x: [0.42], y: [0] } };\nconst EASE_IN = { i: { x: [1], y: [1] }, o: { x: [0.42], y: [0] } };\nconst EASE_IO = { i: { x: [0.58], y: [1] }, o: { x: [0.42], y: [0] } };\nconst SPRING = { i: { x: [0.175], y: [0.885] }, o: { x: [0.32], y: [1.275] } };\nconst LINEAR = { i: { x: [1], y: [1] }, o: { x: [0], y: [0] } };\nconst BOUNCE = { i: { x: [0.215], y: [0.61] }, o: { x: [0.755], y: [0.05] } };\n\nfunction kf(t: number, s: number[] | number, easing = EASE_OUT): AnimKeyframe {\n return { t, s, ...easing };\n}\n\nfunction lastKf(t: number, s: number[] | number): AnimKeyframe {\n return { t, s };\n}\n\n// ─── Entrance Animations ─────────────────────────────────────────────────────\n\nconst fadeIn: LottieAnimPreset = {\n id: \"fade-in\",\n name: \"Fade In\",\n category: \"entrance\",\n icon: \"✨\",\n description: \"Simple opacity fade from 0 to 100\",\n defaultDurationFrames: 20,\n buildTracks: ({ startFrame, endFrame }) => [\n {\n path: \"ks.o\",\n keyframes: [kf(startFrame, 0, EASE_OUT), lastKf(endFrame, 100)],\n },\n ],\n};\n\nconst slideUp: LottieAnimPreset = {\n id: \"slide-up\",\n name: \"Slide Up\",\n category: \"entrance\",\n icon: \"⬆️\",\n description: \"Slides in from below with fade\",\n defaultDurationFrames: 25,\n buildTracks: ({ startFrame, endFrame, compH }) => [\n { path: \"ks.p\", keyframes: [kf(startFrame, [0, compH * 0.15, 0], SPRING), lastKf(endFrame, [0, 0, 0])] },\n { path: \"ks.o\", keyframes: [kf(startFrame, 0, EASE_OUT), lastKf(endFrame, 100)] },\n ],\n};\n\nconst slideDown: LottieAnimPreset = {\n id: \"slide-down\",\n name: \"Slide Down\",\n category: \"entrance\",\n icon: \"⬇️\",\n description: \"Slides in from above with fade\",\n defaultDurationFrames: 25,\n buildTracks: ({ startFrame, endFrame, compH }) => [\n { path: \"ks.p\", keyframes: [kf(startFrame, [0, -compH * 0.15, 0], SPRING), lastKf(endFrame, [0, 0, 0])] },\n { path: \"ks.o\", keyframes: [kf(startFrame, 0, EASE_OUT), lastKf(endFrame, 100)] },\n ],\n};\n\nconst slideLeft: LottieAnimPreset = {\n id: \"slide-left\",\n name: \"Slide Left\",\n category: \"entrance\",\n icon: \"⬅️\",\n description: \"Slides in from the right\",\n defaultDurationFrames: 25,\n buildTracks: ({ startFrame, endFrame, compW }) => [\n { path: \"ks.p\", keyframes: [kf(startFrame, [compW * 0.3, 0, 0], SPRING), lastKf(endFrame, [0, 0, 0])] },\n { path: \"ks.o\", keyframes: [kf(startFrame, 0, EASE_OUT), lastKf(endFrame, 100)] },\n ],\n};\n\nconst slideRight: LottieAnimPreset = {\n id: \"slide-right\",\n name: \"Slide Right\",\n category: \"entrance\",\n icon: \"➡️\",\n description: \"Slides in from the left\",\n defaultDurationFrames: 25,\n buildTracks: ({ startFrame, endFrame, compW }) => [\n { path: \"ks.p\", keyframes: [kf(startFrame, [-compW * 0.3, 0, 0], SPRING), lastKf(endFrame, [0, 0, 0])] },\n { path: \"ks.o\", keyframes: [kf(startFrame, 0, EASE_OUT), lastKf(endFrame, 100)] },\n ],\n};\n\nconst zoomIn: LottieAnimPreset = {\n id: \"zoom-in\",\n name: \"Zoom In\",\n category: \"entrance\",\n icon: \"🔍\",\n description: \"Scales up from 0 with spring overshoot\",\n defaultDurationFrames: 22,\n buildTracks: ({ startFrame, endFrame }) => [\n { path: \"ks.s\", keyframes: [kf(startFrame, [0, 0, 100], SPRING), lastKf(endFrame, [100, 100, 100])] },\n { path: \"ks.o\", keyframes: [kf(startFrame, 0, EASE_OUT), lastKf(endFrame, 100)] },\n ],\n};\n\nconst zoomInBounce: LottieAnimPreset = {\n id: \"zoom-in-bounce\",\n name: \"Zoom Bounce\",\n category: \"entrance\",\n icon: \"💥\",\n description: \"Scales up with elastic overshoot\",\n defaultDurationFrames: 30,\n buildTracks: ({ startFrame, endFrame }) => {\n const mid = Math.round(startFrame + (endFrame - startFrame) * 0.7);\n return [\n { path: \"ks.s\", keyframes: [kf(startFrame, [0, 0, 100], SPRING), kf(mid, [115, 115, 100], BOUNCE), lastKf(endFrame, [100, 100, 100])] },\n { path: \"ks.o\", keyframes: [kf(startFrame, 0, EASE_OUT), lastKf(endFrame, 100)] },\n ];\n },\n};\n\nconst popIn: LottieAnimPreset = {\n id: \"pop-in\",\n name: \"Pop In\",\n category: \"entrance\",\n icon: \"🎯\",\n description: \"Quick scale pop with overshoot\",\n defaultDurationFrames: 18,\n buildTracks: ({ startFrame, endFrame }) => {\n const mid = Math.round(startFrame + (endFrame - startFrame) * 0.6);\n return [\n { path: \"ks.s\", keyframes: [kf(startFrame, [60, 60, 100], SPRING), kf(mid, [110, 110, 100], BOUNCE), lastKf(endFrame, [100, 100, 100])] },\n { path: \"ks.o\", keyframes: [kf(startFrame, 0, EASE_OUT), lastKf(endFrame, 100)] },\n ];\n },\n};\n\nconst flipX: LottieAnimPreset = {\n id: \"flip-x\",\n name: \"Flip X\",\n category: \"entrance\",\n icon: \"🔄\",\n description: \"Horizontal flip reveal\",\n defaultDurationFrames: 25,\n buildTracks: ({ startFrame, endFrame }) => [\n { path: \"ks.s\", keyframes: [kf(startFrame, [0, 100, 100], EASE_OUT), lastKf(endFrame, [100, 100, 100])] },\n { path: \"ks.o\", keyframes: [kf(startFrame, 0, EASE_OUT), lastKf(endFrame, 100)] },\n ],\n};\n\nconst flipY: LottieAnimPreset = {\n id: \"flip-y\",\n name: \"Flip Y\",\n category: \"entrance\",\n icon: \"🔃\",\n description: \"Vertical flip reveal\",\n defaultDurationFrames: 25,\n buildTracks: ({ startFrame, endFrame }) => [\n { path: \"ks.s\", keyframes: [kf(startFrame, [100, 0, 100], EASE_OUT), lastKf(endFrame, [100, 100, 100])] },\n { path: \"ks.o\", keyframes: [kf(startFrame, 0, EASE_OUT), lastKf(endFrame, 100)] },\n ],\n};\n\nconst rotateIn: LottieAnimPreset = {\n id: \"rotate-in\",\n name: \"Rotate In\",\n category: \"entrance\",\n icon: \"🌀\",\n description: \"Spins in from -90 degrees\",\n defaultDurationFrames: 28,\n buildTracks: ({ startFrame, endFrame }) => [\n { path: \"ks.r\", keyframes: [kf(startFrame, -90, SPRING), lastKf(endFrame, 0)] },\n { path: \"ks.s\", keyframes: [kf(startFrame, [60, 60, 100], EASE_OUT), lastKf(endFrame, [100, 100, 100])] },\n { path: \"ks.o\", keyframes: [kf(startFrame, 0, EASE_OUT), lastKf(endFrame, 100)] },\n ],\n};\n\nconst blurIn: LottieAnimPreset = {\n id: \"blur-in\",\n name: \"Blur In\",\n category: \"entrance\",\n icon: \"🌫️\",\n description: \"Fades in from blurred state (opacity only; blur via filter layer)\",\n defaultDurationFrames: 22,\n buildTracks: ({ startFrame, endFrame }) => [\n { path: \"ks.s\", keyframes: [kf(startFrame, [120, 120, 100], EASE_OUT), lastKf(endFrame, [100, 100, 100])] },\n { path: \"ks.o\", keyframes: [kf(startFrame, 0, EASE_OUT), lastKf(endFrame, 100)] },\n ],\n};\n\nconst dropIn: LottieAnimPreset = {\n id: \"drop-in\",\n name: \"Drop In\",\n category: \"entrance\",\n icon: \"🪂\",\n description: \"Drops from above with bounce landing\",\n defaultDurationFrames: 30,\n buildTracks: ({ startFrame, endFrame, compH }) => {\n const land = Math.round(startFrame + (endFrame - startFrame) * 0.75);\n const bounce = Math.round(startFrame + (endFrame - startFrame) * 0.88);\n return [\n { path: \"ks.p\", keyframes: [kf(startFrame, [0, -compH * 0.4, 0], EASE_IN), kf(land, [0, 8, 0], BOUNCE), kf(bounce, [0, -4, 0], EASE_OUT), lastKf(endFrame, [0, 0, 0])] },\n { path: \"ks.o\", keyframes: [kf(startFrame, 100), lastKf(endFrame, 100)] },\n ];\n },\n};\n\nconst typewriter: LottieAnimPreset = {\n id: \"typewriter\",\n name: \"Typewriter\",\n category: \"entrance\",\n icon: \"⌨️\",\n description: \"Classic typewriter reveal via scale-X wipe\",\n defaultDurationFrames: 35,\n buildTracks: ({ startFrame, endFrame }) => [\n { path: \"ks.s\", keyframes: [kf(startFrame, [0, 100, 100], LINEAR), lastKf(endFrame, [100, 100, 100])] },\n { path: \"ks.o\", keyframes: [kf(startFrame, 100), lastKf(endFrame, 100)] },\n ],\n};\n\nconst wipeLeft: LottieAnimPreset = {\n id: \"wipe-left\",\n name: \"Wipe Left\",\n category: \"entrance\",\n icon: \"◀️\",\n description: \"Horizontal wipe reveal from left\",\n defaultDurationFrames: 20,\n buildTracks: ({ startFrame, endFrame }) => [\n { path: \"ks.s\", keyframes: [kf(startFrame, [0, 100, 100], EASE_OUT), lastKf(endFrame, [100, 100, 100])] },\n { path: \"ks.o\", keyframes: [kf(startFrame, 100), lastKf(endFrame, 100)] },\n ],\n};\n\nconst glitchIn: LottieAnimPreset = {\n id: \"glitch-in\",\n name: \"Glitch In\",\n category: \"entrance\",\n icon: \"⚡\",\n description: \"Rapid position glitch then settle\",\n defaultDurationFrames: 20,\n buildTracks: ({ startFrame, endFrame }) => {\n const f1 = startFrame + 2,\n f2 = startFrame + 4,\n f3 = startFrame + 6,\n f4 = startFrame + 9;\n return [\n { path: \"ks.p\", keyframes: [kf(startFrame, [-12, 4, 0], LINEAR), kf(f1, [8, -6, 0], LINEAR), kf(f2, [-5, 3, 0], LINEAR), kf(f3, [4, -2, 0], LINEAR), kf(f4, [0, 0, 0], EASE_OUT), lastKf(endFrame, [0, 0, 0])] },\n { path: \"ks.o\", keyframes: [kf(startFrame, 0, LINEAR), kf(f1, 100, LINEAR), lastKf(endFrame, 100)] },\n ];\n },\n};\n\n// ─── Exit Animations ─────────────────────────────────────────────────────────\n\nconst fadeOut: LottieAnimPreset = {\n id: \"fade-out\",\n name: \"Fade Out\",\n category: \"exit\",\n icon: \"💨\",\n description: \"Simple opacity fade to 0\",\n defaultDurationFrames: 20,\n buildTracks: ({ startFrame, endFrame }) => [\n {\n path: \"ks.o\",\n keyframes: [kf(startFrame, 100, EASE_IN), lastKf(endFrame, 0)],\n },\n ],\n};\n\nconst slideOutUp: LottieAnimPreset = {\n id: \"slide-out-up\",\n name: \"Slide Out Up\",\n category: \"exit\",\n icon: \"🚀\",\n description: \"Slides out upward with fade\",\n defaultDurationFrames: 22,\n buildTracks: ({ startFrame, endFrame, compH }) => [\n { path: \"ks.p\", keyframes: [kf(startFrame, [0, 0, 0], EASE_IN), lastKf(endFrame, [0, -compH * 0.2, 0])] },\n { path: \"ks.o\", keyframes: [kf(startFrame, 100, EASE_IN), lastKf(endFrame, 0)] },\n ],\n};\n\nconst slideOutDown: LottieAnimPreset = {\n id: \"slide-out-down\",\n name: \"Slide Out Down\",\n category: \"exit\",\n icon: \"⬇️\",\n description: \"Slides out downward with fade\",\n defaultDurationFrames: 22,\n buildTracks: ({ startFrame, endFrame, compH }) => [\n { path: \"ks.p\", keyframes: [kf(startFrame, [0, 0, 0], EASE_IN), lastKf(endFrame, [0, compH * 0.2, 0])] },\n { path: \"ks.o\", keyframes: [kf(startFrame, 100, EASE_IN), lastKf(endFrame, 0)] },\n ],\n};\n\nconst zoomOut: LottieAnimPreset = {\n id: \"zoom-out\",\n name: \"Zoom Out\",\n category: \"exit\",\n icon: \"🔎\",\n description: \"Scales down to 0 with fade\",\n defaultDurationFrames: 20,\n buildTracks: ({ startFrame, endFrame }) => [\n { path: \"ks.s\", keyframes: [kf(startFrame, [100, 100, 100], EASE_IN), lastKf(endFrame, [0, 0, 100])] },\n { path: \"ks.o\", keyframes: [kf(startFrame, 100, EASE_IN), lastKf(endFrame, 0)] },\n ],\n};\n\nconst zoomOutBlast: LottieAnimPreset = {\n id: \"zoom-out-blast\",\n name: \"Zoom Blast\",\n category: \"exit\",\n icon: \"💣\",\n description: \"Scales up then disappears\",\n defaultDurationFrames: 18,\n buildTracks: ({ startFrame, endFrame }) => {\n const mid = Math.round(startFrame + (endFrame - startFrame) * 0.5);\n return [\n { path: \"ks.s\", keyframes: [kf(startFrame, [100, 100, 100], EASE_IN), kf(mid, [140, 140, 100], EASE_IN), lastKf(endFrame, [0, 0, 100])] },\n { path: \"ks.o\", keyframes: [kf(startFrame, 100, LINEAR), kf(mid, 80, LINEAR), lastKf(endFrame, 0)] },\n ];\n },\n};\n\nconst glitchOut: LottieAnimPreset = {\n id: \"glitch-out\",\n name: \"Glitch Out\",\n category: \"exit\",\n icon: \"📺\",\n description: \"Glitches then disappears\",\n defaultDurationFrames: 18,\n buildTracks: ({ startFrame, endFrame }) => {\n const f1 = endFrame - 8,\n f2 = endFrame - 5,\n f3 = endFrame - 3;\n return [\n { path: \"ks.p\", keyframes: [kf(startFrame, [0, 0, 0], LINEAR), kf(f1, [10, -4, 0], LINEAR), kf(f2, [-8, 3, 0], LINEAR), kf(f3, [5, -2, 0], LINEAR), lastKf(endFrame, [0, 0, 0])] },\n { path: \"ks.o\", keyframes: [kf(startFrame, 100), kf(f1, 80, LINEAR), kf(f2, 60, LINEAR), lastKf(endFrame, 0)] },\n ];\n },\n};\n\n// ─── Loop Animations ─────────────────────────────────────────────────────────\n\nconst pulse: LottieAnimPreset = {\n id: \"pulse\",\n name: \"Pulse\",\n category: \"loop\",\n icon: \"💓\",\n description: \"Rhythmic scale pulse\",\n defaultDurationFrames: 30,\n buildTracks: ({ startFrame, totalFrames }) => {\n const half = Math.round(totalFrames / 2);\n return [\n {\n path: \"ks.s\",\n keyframes: [kf(startFrame, [100, 100, 100], EASE_IO), kf(startFrame + half, [108, 108, 100], EASE_IO), lastKf(startFrame + totalFrames, [100, 100, 100])],\n },\n ];\n },\n};\n\nconst breathe: LottieAnimPreset = {\n id: \"breathe\",\n name: \"Breathe\",\n category: \"loop\",\n icon: \"🌬️\",\n description: \"Slow gentle scale breathe\",\n defaultDurationFrames: 60,\n buildTracks: ({ startFrame, totalFrames }) => {\n const half = Math.round(totalFrames / 2);\n return [\n { path: \"ks.s\", keyframes: [kf(startFrame, [100, 100, 100], EASE_IO), kf(startFrame + half, [104, 104, 100], EASE_IO), lastKf(startFrame + totalFrames, [100, 100, 100])] },\n { path: \"ks.o\", keyframes: [kf(startFrame, 85, EASE_IO), kf(startFrame + half, 100, EASE_IO), lastKf(startFrame + totalFrames, 85)] },\n ];\n },\n};\n\nconst floatUp: LottieAnimPreset = {\n id: \"float-up\",\n name: \"Float\",\n category: \"loop\",\n icon: \"🎈\",\n description: \"Gentle vertical float\",\n defaultDurationFrames: 60,\n buildTracks: ({ startFrame, totalFrames }) => {\n const half = Math.round(totalFrames / 2);\n return [\n {\n path: \"ks.p\",\n keyframes: [kf(startFrame, [0, 0, 0], EASE_IO), kf(startFrame + half, [0, -8, 0], EASE_IO), lastKf(startFrame + totalFrames, [0, 0, 0])],\n },\n ];\n },\n};\n\nconst shake: LottieAnimPreset = {\n id: \"shake\",\n name: \"Shake\",\n category: \"loop\",\n icon: \"📳\",\n description: \"Rapid horizontal shake\",\n defaultDurationFrames: 20,\n buildTracks: ({ startFrame }) => [\n {\n path: \"ks.p\",\n keyframes: [kf(startFrame, [0, 0, 0], LINEAR), kf(startFrame + 3, [-6, 0, 0], LINEAR), kf(startFrame + 6, [6, 0, 0], LINEAR), kf(startFrame + 9, [-4, 0, 0], LINEAR), kf(startFrame + 12, [4, 0, 0], LINEAR), kf(startFrame + 15, [-2, 0, 0], LINEAR), lastKf(startFrame + 18, [0, 0, 0])],\n },\n ],\n};\n\nconst wobble: LottieAnimPreset = {\n id: \"wobble\",\n name: \"Wobble\",\n category: \"loop\",\n icon: \"🌊\",\n description: \"Rotation wobble\",\n defaultDurationFrames: 30,\n buildTracks: ({ startFrame }) => [\n {\n path: \"ks.r\",\n keyframes: [kf(startFrame, 0, EASE_IO), kf(startFrame + 7, -5, EASE_IO), kf(startFrame + 14, 5, EASE_IO), kf(startFrame + 21, -3, EASE_IO), lastKf(startFrame + 28, 0)],\n },\n ],\n};\n\nconst neonFlicker: LottieAnimPreset = {\n id: \"neon-flicker\",\n name: \"Neon Flicker\",\n category: \"loop\",\n icon: \"💡\",\n description: \"Neon sign flicker via opacity\",\n defaultDurationFrames: 24,\n buildTracks: ({ startFrame }) => [\n {\n path: \"ks.o\",\n keyframes: [kf(startFrame, 100, LINEAR), kf(startFrame + 2, 20, LINEAR), kf(startFrame + 3, 100, LINEAR), kf(startFrame + 5, 60, LINEAR), kf(startFrame + 6, 100, LINEAR), kf(startFrame + 14, 100, LINEAR), kf(startFrame + 15, 30, LINEAR), kf(startFrame + 16, 100, LINEAR), lastKf(startFrame + 23, 100)],\n },\n ],\n};\n\nconst wave: LottieAnimPreset = {\n id: \"wave\",\n name: \"Wave\",\n category: \"loop\",\n icon: \"👋\",\n description: \"Vertical wave motion\",\n defaultDurationFrames: 40,\n buildTracks: ({ startFrame }) => [\n {\n path: \"ks.p\",\n keyframes: [kf(startFrame, [0, 0, 0], EASE_IO), kf(startFrame + 10, [0, -10, 0], EASE_IO), kf(startFrame + 20, [0, 0, 0], EASE_IO), kf(startFrame + 30, [0, 10, 0], EASE_IO), lastKf(startFrame + 40, [0, 0, 0])],\n },\n ],\n};\n\n// ─── Emphasis Animations ─────────────────────────────────────────────────────\n\nconst attention: LottieAnimPreset = {\n id: \"attention\",\n name: \"Attention\",\n category: \"emphasis\",\n icon: \"❗\",\n description: \"Quick scale pop for emphasis\",\n defaultDurationFrames: 15,\n buildTracks: ({ startFrame }) => {\n const mid = startFrame + 7;\n return [\n {\n path: \"ks.s\",\n keyframes: [kf(startFrame, [100, 100, 100], EASE_OUT), kf(mid, [120, 120, 100], BOUNCE), lastKf(startFrame + 14, [100, 100, 100])],\n },\n ];\n },\n};\n\nconst jello: LottieAnimPreset = {\n id: \"jello\",\n name: \"Jello\",\n category: \"emphasis\",\n icon: \"🍮\",\n description: \"Elastic squash and stretch\",\n defaultDurationFrames: 30,\n buildTracks: ({ startFrame }) => [\n {\n path: \"ks.s\",\n keyframes: [kf(startFrame, [100, 100, 100], EASE_IO), kf(startFrame + 5, [120, 80, 100], BOUNCE), kf(startFrame + 10, [85, 115, 100], BOUNCE), kf(startFrame + 15, [110, 92, 100], BOUNCE), kf(startFrame + 20, [96, 104, 100], BOUNCE), lastKf(startFrame + 28, [100, 100, 100])],\n },\n ],\n};\n\nconst swing: LottieAnimPreset = {\n id: \"swing\",\n name: \"Swing\",\n category: \"emphasis\",\n icon: \"🎷\",\n description: \"Pendulum rotation swing\",\n defaultDurationFrames: 30,\n buildTracks: ({ startFrame }) => [\n {\n path: \"ks.r\",\n keyframes: [kf(startFrame, 0, EASE_IO), kf(startFrame + 6, 15, EASE_IO), kf(startFrame + 12, -10, EASE_IO), kf(startFrame + 18, 6, EASE_IO), kf(startFrame + 24, -3, EASE_IO), lastKf(startFrame + 29, 0)],\n },\n ],\n};\n\n// ─── Registry ────────────────────────────────────────────────────────────────\n\nexport const LOTTIE_ANIM_PRESETS: LottieAnimPreset[] = [\n // Entrance\n fadeIn,\n slideUp,\n slideDown,\n slideLeft,\n slideRight,\n zoomIn,\n zoomInBounce,\n popIn,\n flipX,\n flipY,\n rotateIn,\n blurIn,\n dropIn,\n typewriter,\n wipeLeft,\n glitchIn,\n // Exit\n fadeOut,\n slideOutUp,\n slideOutDown,\n zoomOut,\n zoomOutBlast,\n glitchOut,\n // Loop\n pulse,\n breathe,\n floatUp,\n shake,\n wobble,\n neonFlicker,\n wave,\n // Emphasis\n attention,\n jello,\n swing,\n];\n\nexport const ENTRANCE_PRESETS = LOTTIE_ANIM_PRESETS.filter((p) => p.category === \"entrance\");\nexport const EXIT_PRESETS = LOTTIE_ANIM_PRESETS.filter((p) => p.category === \"exit\");\nexport const LOOP_PRESETS = LOTTIE_ANIM_PRESETS.filter((p) => p.category === \"loop\");\nexport const EMPHASIS_PRESETS = LOTTIE_ANIM_PRESETS.filter((p) => p.category === \"emphasis\");\n\nexport function getAnimPreset(id: string): LottieAnimPreset | undefined {\n return LOTTIE_ANIM_PRESETS.find((p) => p.id === id);\n}\n\n/**\n * Bake an animation preset into a Lottie layer's keyframe tracks.\n * Merges with existing keyframes rather than replacing them.\n */\nexport function bakeAnimationIntoLayer(lottieData: any, layerIndex: number, preset: LottieAnimPreset, opts: Omit<AnimBuildOpts, \"layerIndex\">): any {\n const clone = JSON.parse(JSON.stringify(lottieData));\n const layer = clone.layers?.[layerIndex];\n if (!layer) return clone;\n\n const tracks = preset.buildTracks({ ...opts, layerIndex });\n\n for (const track of tracks) {\n const keys = track.path.split(\".\");\n let prop = layer;\n for (const k of keys) {\n if (!prop[k]) prop[k] = {};\n prop = prop[k];\n }\n\n // Convert to animated if static\n if (prop.a === 0 || prop.a === undefined) {\n const staticVal = prop.k ?? (track.path === \"ks.o\" ? 100 : track.path === \"ks.r\" ? 0 : [0, 0, 0]);\n prop.a = 1;\n prop.k = [{ t: 0, s: staticVal }];\n }\n\n // Merge new keyframes\n const existing: AnimKeyframe[] = prop.k || [];\n for (const newKf of track.keyframes) {\n const idx = existing.findIndex((k) => k.t === newKf.t);\n if (idx >= 0) {\n existing[idx] = newKf;\n } else {\n existing.push(newKf);\n }\n }\n existing.sort((a, b) => a.t - b.t);\n\n // Ensure last keyframe has no easing\n existing.forEach((k, i) => {\n if (i === existing.length - 1) {\n delete (k as any).i;\n delete (k as any).o;\n }\n });\n\n prop.k = existing;\n }\n\n return clone;\n}\n\n/**\n * Remove all animation keyframes from a layer property, reverting to static.\n */\nexport function clearAnimationFromLayer(lottieData: any, layerIndex: number, paths: string[] = [\"ks.p\", \"ks.s\", \"ks.r\", \"ks.o\"]): any {\n const clone = JSON.parse(JSON.stringify(lottieData));\n const layer = clone.layers?.[layerIndex];\n if (!layer) return clone;\n\n for (const path of paths) {\n const keys = path.split(\".\");\n let prop = layer;\n for (const k of keys) {\n if (!prop[k]) break;\n if (k === keys[keys.length - 1]) {\n if (prop[k].a === 1 && Array.isArray(prop[k].k)) {\n const lastKf = prop[k].k[prop[k].k.length - 1];\n prop[k] = { a: 0, k: lastKf?.s ?? (path === \"ks.o\" ? 100 : path === \"ks.r\" ? 0 : [0, 0, 0]) };\n }\n } else {\n prop = prop[k];\n }\n }\n }\n\n return clone;\n}\n","/**\n * Lottie Per-Layer Text Style Engine\n * Provides rich text styling (font, fill, gradient, stroke, shadow, glow, tracking)\n * that maps directly to Lottie JSON text document properties.\n */\n\nexport type TextAlign = \"left\" | \"center\" | \"right\" | \"justify\";\nexport type FillType = \"solid\" | \"gradient\";\nexport type GradientDir = \"horizontal\" | \"vertical\" | \"diagonal\" | \"radial\";\n\nexport interface LottieGradientStop {\n color: string; // hex\n position: number; // 0–1\n}\n\nexport interface TextLayerStyle {\n // Typography\n fontName: string; // Lottie fName e.g. \"Poppins-Bold\"\n fontFamily: string; // CSS family e.g. \"Poppins\"\n fontWeight: number; // 100–900\n fontStyle: \"normal\" | \"italic\";\n fontSize: number; // px\n tracking: number; // letter spacing (Lottie tr units = 1/1000 em)\n lineHeight: number; // multiplier\n align: TextAlign;\n\n // Fill\n fillType: FillType;\n fillColor: string; // hex, used when fillType === \"solid\"\n gradientStops: LottieGradientStop[];\n gradientDir: GradientDir;\n\n // Stroke\n strokeEnabled: boolean;\n strokeColor: string;\n strokeWidth: number; // px\n strokeOpacity: number; // 0–100\n\n // Shadow\n shadowEnabled: boolean;\n shadowColor: string;\n shadowBlur: number;\n shadowOffsetX: number;\n shadowOffsetY: number;\n shadowOpacity: number; // 0–100\n\n // Glow (simulated via multiple shadow passes)\n glowEnabled: boolean;\n glowColor: string;\n glowBlur: number;\n glowOpacity: number; // 0–100\n\n // Transform\n posX: number; // offset from layer anchor (px)\n posY: number;\n scaleX: number; // 0–200 (%)\n scaleY: number;\n rotation: number; // degrees\n opacity: number; // 0–100\n}\n\nexport const DEFAULT_TEXT_STYLE: TextLayerStyle = {\n fontName: \"Poppins-Bold\",\n fontFamily: \"Poppins\",\n fontWeight: 700,\n fontStyle: \"normal\",\n fontSize: 72,\n tracking: 0,\n lineHeight: 1.2,\n align: \"center\",\n fillType: \"solid\",\n fillColor: \"#FFFFFF\",\n gradientStops: [\n { color: \"#FFFFFF\", position: 0 },\n { color: \"#AAAAAA\", position: 1 },\n ],\n gradientDir: \"vertical\",\n strokeEnabled: false,\n strokeColor: \"#000000\",\n strokeWidth: 2,\n strokeOpacity: 100,\n shadowEnabled: false,\n shadowColor: \"#000000\",\n shadowBlur: 8,\n shadowOffsetX: 4,\n shadowOffsetY: 4,\n shadowOpacity: 60,\n glowEnabled: false,\n glowColor: \"#7C6FFF\",\n glowBlur: 20,\n glowOpacity: 80,\n posX: 0,\n posY: 0,\n scaleX: 100,\n scaleY: 100,\n rotation: 0,\n opacity: 100,\n};\n\n// ─── Helpers ─────────────────────────────────────────────────────────────────\n\n/** Convert #RRGGBB to Lottie normalized [r, g, b] (0–1) */\nexport function hexToLottieColor(hex: string): [number, number, number] {\n const clean = hex.replace(\"#\", \"\").padEnd(6, \"0\");\n return [parseInt(clean.slice(0, 2), 16) / 255, parseInt(clean.slice(2, 4), 16) / 255, parseInt(clean.slice(4, 6), 16) / 255];\n}\n\n/** Convert Lottie [r,g,b] (0–1) back to #RRGGBB */\nexport function lottieColorToHex(rgb: number[]): string {\n const r = Math.round((rgb[0] ?? 0) * 255)\n .toString(16)\n .padStart(2, \"0\");\n const g = Math.round((rgb[1] ?? 0) * 255)\n .toString(16)\n .padStart(2, \"0\");\n const b = Math.round((rgb[2] ?? 0) * 255)\n .toString(16)\n .padStart(2, \"0\");\n return `#${r}${g}${b}`.toUpperCase();\n}\n\n/** Map CSS font-weight + style to a Lottie fName */\nexport function buildLottieFontName(family: string, weight: number, style: \"normal\" | \"italic\"): string {\n const isItalic = style === \"italic\";\n const isBold = weight >= 700;\n const isExtraBold = weight >= 800;\n const isBlack = weight >= 900;\n\n if (isBlack) return isItalic ? `${family}-BlackItalic` : `${family}-Black`;\n if (isExtraBold) return isItalic ? `${family}-ExtraBoldItalic` : `${family}-ExtraBold`;\n if (isBold) return isItalic ? `${family}-BoldItalic` : `${family}-Bold`;\n return isItalic ? `${family}-Italic` : `${family}-Regular`;\n}\n\n/** Lottie text alignment: 0=left, 1=center, 2=right, 3=justify */\nexport function alignToLottieJ(align: TextAlign): number {\n switch (align) {\n case \"left\":\n return 0;\n case \"center\":\n return 1;\n case \"right\":\n return 2;\n case \"justify\":\n return 3;\n default:\n return 1;\n }\n}\n\nexport function lottieJToAlign(j: number): TextAlign {\n switch (j) {\n case 0:\n return \"left\";\n case 1:\n return \"center\";\n case 2:\n return \"right\";\n case 3:\n return \"justify\";\n default:\n return \"center\";\n }\n}\n\n// ─── Read style from Lottie layer ────────────────────────────────────────────\n\n/**\n * Extract a TextLayerStyle from an existing Lottie text layer (ty === 5).\n * Falls back to defaults for any missing properties.\n */\nexport function readStyleFromLottieLayer(layer: any): TextLayerStyle {\n const style: TextLayerStyle = { ...DEFAULT_TEXT_STYLE };\n if (!layer || layer.ty !== 5) return style;\n\n // Transform\n const ks = layer.ks || {};\n const pos = ks.p?.k;\n if (Array.isArray(pos)) {\n style.posX = pos[0] ?? 0;\n style.posY = pos[1] ?? 0;\n }\n const scale = ks.s?.k;\n if (Array.isArray(scale)) {\n style.scaleX = scale[0] ?? 100;\n style.scaleY = scale[1] ?? 100;\n }\n const rot = ks.r?.k;\n if (typeof rot === \"number\") style.rotation = rot;\n const op = ks.o?.k;\n if (typeof op === \"number\") style.opacity = op;\n\n // Text document\n const td = layer.t?.d;\n if (!td) return style;\n const kf0 = Array.isArray(td.k) ? td.k[0]?.s : td.k?.s;\n if (!kf0) return style;\n\n if (typeof kf0.s === \"number\") style.fontSize = kf0.s;\n if (typeof kf0.f === \"string\") {\n style.fontName = kf0.f;\n // Parse family from fName\n const parts = kf0.f.split(\"-\");\n style.fontFamily = parts[0] ?? \"Poppins\";\n const variant = parts[1]?.toLowerCase() ?? \"\";\n style.fontStyle = variant.includes(\"italic\") ? \"italic\" : \"normal\";\n style.fontWeight = variant.includes(\"black\") ? 900 : variant.includes(\"extrabold\") ? 800 : variant.includes(\"bold\") ? 700 : 400;\n }\n if (typeof kf0.j === \"number\") style.align = lottieJToAlign(kf0.j);\n if (typeof kf0.tr === \"number\") style.tracking = kf0.tr;\n if (typeof kf0.lh === \"number\") style.lineHeight = kf0.lh / (kf0.s || 72);\n\n // Fill color\n if (Array.isArray(kf0.fc) && kf0.fc.length >= 3) {\n style.fillColor = lottieColorToHex(kf0.fc);\n style.fillType = \"solid\";\n }\n\n // Stroke\n if (Array.isArray(kf0.sc) && kf0.sc.length >= 3) {\n style.strokeEnabled = true;\n style.strokeColor = lottieColorToHex(kf0.sc);\n style.strokeWidth = typeof kf0.sw === \"number\" ? kf0.sw : 0;\n style.strokeEnabled = style.strokeWidth > 0;\n }\n\n return style;\n}\n\n// ─── Write style into Lottie layer ───────────────────────────────────────────\n\n/**\n * Apply a TextLayerStyle to a Lottie text layer (ty === 5).\n * Returns a new deep-cloned layer with all style properties applied.\n */\nexport function applyStyleToLottieLayer(layer: any, style: TextLayerStyle): any {\n const clone = JSON.parse(JSON.stringify(layer));\n if (!clone || clone.ty !== 5) return clone;\n\n // ── Transform ──\n const ks = clone.ks || {};\n // Position (additive offset from current anchor)\n if (ks.p) {\n if (ks.p.a === 0) {\n const base = Array.isArray(ks.p.k) ? ks.p.k : [0, 0, 0];\n ks.p.k = [style.posX || base[0], style.posY || base[1], base[2] ?? 0];\n }\n }\n // Scale\n if (ks.s) {\n if (ks.s.a === 0) {\n ks.s.k = [style.scaleX, style.scaleY, 100];\n }\n }\n // Rotation\n if (ks.r) {\n if (ks.r.a === 0) ks.r.k = style.rotation;\n }\n // Opacity\n if (ks.o) {\n if (ks.o.a === 0) ks.o.k = style.opacity;\n }\n clone.ks = ks;\n\n // ── Text Document ──\n const td = clone.t?.d;\n if (!td) return clone;\n\n const applyToDoc = (doc: any) => {\n if (!doc) return;\n doc.s = style.fontSize;\n doc.f = style.fontName || buildLottieFontName(style.fontFamily, style.fontWeight, style.fontStyle);\n doc.j = alignToLottieJ(style.align);\n doc.tr = style.tracking;\n doc.lh = style.fontSize * style.lineHeight;\n\n // Fill color\n doc.fc = hexToLottieColor(style.fillColor);\n\n // Stroke\n if (style.strokeEnabled && style.strokeWidth > 0) {\n doc.sc = hexToLottieColor(style.strokeColor);\n doc.sw = style.strokeWidth;\n doc.of = false; // stroke over fill\n } else {\n doc.sw = 0;\n }\n };\n\n if (Array.isArray(td.k)) {\n td.k.forEach((kf: any) => {\n if (kf?.s) applyToDoc(kf.s);\n });\n } else if (td.k?.s) {\n applyToDoc(td.k.s);\n }\n\n return clone;\n}\n\n/**\n * Apply a TextLayerStyle to a full Lottie composition at a given layer index.\n */\nexport function applyStyleToLottie(lottieData: any, layerIndex: number, style: TextLayerStyle): any {\n const clone = JSON.parse(JSON.stringify(lottieData));\n if (!clone.layers?.[layerIndex]) return clone;\n clone.layers[layerIndex] = applyStyleToLottieLayer(clone.layers[layerIndex], style);\n return clone;\n}\n\n// ─── Font registry ───────────────────────────────────────────────────────────\n\nexport interface LottieFontEntry {\n fName: string;\n fFamily: string;\n fWeight: string;\n fStyle: string;\n asName: string;\n googleFont?: boolean;\n}\n\n/** Ensure a font is registered in the Lottie fonts list */\nexport function ensureFontInLottie(lottieData: any, entry: LottieFontEntry): any {\n const clone = JSON.parse(JSON.stringify(lottieData));\n if (!clone.fonts) clone.fonts = { list: [] };\n if (!Array.isArray(clone.fonts.list)) clone.fonts.list = [];\n const exists = clone.fonts.list.some((f: any) => f.fName === entry.fName);\n if (!exists) clone.fonts.list.push(entry);\n return clone;\n}\n\n/** Full set of supported fonts with all variants */\nexport const SUPPORTED_FONT_FAMILIES: string[] = [\"Poppins\", \"Montserrat\", \"Inter\", \"Roboto\", \"Open Sans\", \"Lato\", \"Raleway\", \"Oswald\", \"Bebas Neue\", \"Anton\", \"Playfair Display\", \"Merriweather\", \"Nunito\", \"Ubuntu\", \"Source Sans Pro\", \"PT Sans\", \"Noto Sans\", \"Exo 2\", \"Barlow\", \"Kanit\", \"Righteous\", \"Pacifico\", \"Lobster\", \"Dancing Script\", \"Satisfy\", \"Permanent Marker\", \"Arial\", \"Georgia\", \"Times New Roman\", \"Courier New\"];\n\nexport const FONT_WEIGHT_OPTIONS = [\n { label: \"Thin\", value: 100 },\n { label: \"Light\", value: 300 },\n { label: \"Regular\", value: 400 },\n { label: \"Medium\", value: 500 },\n { label: \"SemiBold\", value: 600 },\n { label: \"Bold\", value: 700 },\n { label: \"ExtraBold\", value: 800 },\n { label: \"Black\", value: 900 },\n];\n\n/** Build all Lottie font entries for a given family */\nexport function buildFontEntries(family: string): LottieFontEntry[] {\n const variants: Array<{ weight: string; style: string; suffix: string }> = [\n { weight: \"400\", style: \"Regular\", suffix: \"Regular\" },\n { weight: \"700\", style: \"Bold\", suffix: \"Bold\" },\n { weight: \"400\", style: \"Italic\", suffix: \"Italic\" },\n { weight: \"700\", style: \"Bold Italic\", suffix: \"BoldItalic\" },\n { weight: \"800\", style: \"ExtraBold\", suffix: \"ExtraBold\" },\n { weight: \"900\", style: \"Black\", suffix: \"Black\" },\n ];\n return variants.map((v) => ({\n fName: `${family}-${v.suffix}`,\n fFamily: family,\n fWeight: v.weight,\n fStyle: v.style,\n asName: `${family}-${v.suffix}`,\n googleFont: ![\"Arial\", \"Georgia\", \"Times New Roman\", \"Courier New\"].includes(family),\n }));\n}\n","/**\n * Built-in CapCut-style Lottie text template presets.\n * Each preset is a complete Lottie JSON composition ready to use.\n */\n\nimport { createBlankLottie, addTextLayer, addSolidLayer, addShapeLayer, addVectorShape, reindexLayers } from \"./lottieEditor\";\nimport { applyStyleToLottieLayer } from \"./lottieTextStyle\";\nimport { bakeAnimationIntoLayer, getAnimPreset } from \"./lottieTextAnimations\";\n\nexport type TemplatePresetCategory = \"lower-third\" | \"title-card\" | \"callout\" | \"caption\" | \"kinetic\" | \"social\" | \"cinematic\" | \"sports\" | \"minimal\" | \"bold\";\n\nexport interface LottieTemplatePreset {\n id: string;\n name: string;\n category: TemplatePresetCategory;\n description: string;\n tags: string[];\n aspectRatio: \"16:9\" | \"9:16\" | \"1:1\" | \"4:5\";\n /** Build and return the Lottie JSON for this preset */\n build: () => any;\n}\n\n// ─── Helpers ─────────────────────────────────────────────────────────────────\n\nfunction hex2lottie(hex: string): [number, number, number] {\n const c = hex.replace(\"#\", \"\").padEnd(6, \"0\");\n return [parseInt(c.slice(0, 2), 16) / 255, parseInt(c.slice(2, 4), 16) / 255, parseInt(c.slice(4, 6), 16) / 255];\n}\n\nfunction applyTextDoc(\n layer: any,\n opts: {\n text: string;\n font: string;\n size: number;\n color: string;\n align?: number;\n tracking?: number;\n strokeColor?: string;\n strokeWidth?: number;\n },\n): any {\n const clone = JSON.parse(JSON.stringify(layer));\n const applyDoc = (doc: any) => {\n doc.t = opts.text;\n doc.f = opts.font;\n doc.s = opts.size;\n doc.fc = hex2lottie(opts.color);\n doc.j = opts.align ?? 1;\n doc.tr = opts.tracking ?? 0;\n doc.lh = opts.size * 1.2;\n if (opts.strokeColor && opts.strokeWidth) {\n doc.sc = hex2lottie(opts.strokeColor);\n doc.sw = opts.strokeWidth;\n }\n };\n const td = clone.t?.d;\n if (!td) return clone;\n if (Array.isArray(td.k))\n td.k.forEach((kf: any) => {\n if (kf?.s) applyDoc(kf.s);\n });\n else if (td.k?.s) applyDoc(td.k.s);\n return clone;\n}\n\nfunction setLayerPos(layer: any, x: number, y: number): any {\n const clone = JSON.parse(JSON.stringify(layer));\n if (clone.ks?.p?.a === 0) clone.ks.p.k = [x, y, 0];\n return clone;\n}\n\nfunction setLayerOpacity(layer: any, op: number): any {\n const clone = JSON.parse(JSON.stringify(layer));\n if (clone.ks?.o?.a === 0) clone.ks.o.k = op;\n return clone;\n}\n\nfunction addRoundedRect(lottie: any, name: string, cx: number, cy: number, w: number, h: number, r: number, color: string): any {\n let clone = JSON.parse(JSON.stringify(lottie));\n const [cr, cg, cb] = hex2lottie(color);\n const shapeLayer = {\n ty: 4,\n nm: name,\n sr: 1,\n st: 0,\n ip: 0,\n op: clone.op,\n ind: 1,\n ks: {\n a: { a: 0, k: [0, 0, 0] },\n p: { a: 0, k: [cx, cy, 0] },\n s: { a: 0, k: [100, 100, 100] },\n r: { a: 0, k: 0 },\n o: { a: 0, k: 100 },\n },\n shapes: [\n {\n ty: \"gr\",\n nm: \"Rect\",\n it: [\n { ty: \"rc\", nm: \"Path\", p: { a: 0, k: [0, 0] }, s: { a: 0, k: [w, h] }, r: { a: 0, k: r } },\n { ty: \"fl\", nm: \"Fill\", c: { a: 0, k: [cr, cg, cb, 1] }, o: { a: 0, k: 100 } },\n { ty: \"tr\", nm: \"Tr\", p: { a: 0, k: [0, 0] }, a: { a: 0, k: [0, 0] }, s: { a: 0, k: [100, 100] }, r: { a: 0, k: 0 }, o: { a: 0, k: 100 } },\n ],\n },\n ],\n };\n clone.layers.push(shapeLayer);\n reindexLayers(clone);\n return clone;\n}\n\n// ─── Template Builders ───────────────────────────────────────────────────────\n\nfunction buildCleanLowerThird(): any {\n let l = createBlankLottie(1920, 1080, 30, 120);\n l = addRoundedRect(l, \"Bar BG\", 480, 940, 800, 80, 8, \"#1A1A2E\");\n l = addTextLayer(l, \"Name\", \"JOHN DOE\");\n l.layers[0] = applyTextDoc(l.layers[0], { text: \"JOHN DOE\", font: \"Poppins-Bold\", size: 48, color: \"#FFFFFF\", align: 0, tracking: 80 });\n l.layers[0] = setLayerPos(l.layers[0], 480, 940);\n l = addTextLayer(l, \"Title\", \"Creative Director\");\n l.layers[0] = applyTextDoc(l.layers[0], { text: \"Creative Director\", font: \"Poppins-Regular\", size: 28, color: \"#A0A0C0\", align: 0 });\n l.layers[0] = setLayerPos(l.layers[0], 480, 975);\n // Entrance animations\n const nameIdx = l.layers.findIndex((x: any) => x.nm === \"Name\");\n const titleIdx = l.layers.findIndex((x: any) => x.nm === \"Title\");\n const slidePreset = getAnimPreset(\"slide-right\");\n if (slidePreset && nameIdx >= 0) l = bakeAnimationIntoLayer(l, nameIdx, slidePreset, { startFrame: 5, endFrame: 25, totalFrames: 120, compW: 1920, compH: 1080 });\n if (slidePreset && titleIdx >= 0) l = bakeAnimationIntoLayer(l, titleIdx, slidePreset, { startFrame: 12, endFrame: 32, totalFrames: 120, compW: 1920, compH: 1080 });\n reindexLayers(l);\n return l;\n}\n\nfunction buildNeonTitle(): any {\n let l = createBlankLottie(1920, 1080, 30, 150);\n l = addSolidLayer(l, \"BG\", \"#0A0A0F\", 1920, 1080);\n l = addTextLayer(l, \"Main Title\", \"NEON DREAMS\");\n l.layers[0] = applyTextDoc(l.layers[0], { text: \"NEON DREAMS\", font: \"Montserrat-Black\", size: 120, color: \"#FF2D78\", align: 1, tracking: 200, strokeColor: \"#FF2D78\", strokeWidth: 1 });\n l.layers[0] = setLayerPos(l.layers[0], 960, 540);\n l = addTextLayer(l, \"Subtitle\", \"A VISUAL STORY\");\n l.layers[0] = applyTextDoc(l.layers[0], { text: \"A VISUAL STORY\", font: \"Montserrat-Regular\", size: 36, color: \"#7C6FFF\", align: 1, tracking: 400 });\n l.layers[0] = setLayerPos(l.layers[0], 960, 640);\n const mainIdx = l.layers.findIndex((x: any) => x.nm === \"Main Title\");\n const subIdx = l.layers.findIndex((x: any) => x.nm === \"Subtitle\");\n const zoomPreset = getAnimPreset(\"zoom-in-bounce\");\n const fadePreset = getAnimPreset(\"fade-in\");\n if (zoomPreset && mainIdx >= 0) l = bakeAnimationIntoLayer(l, mainIdx, zoomPreset, { startFrame: 5, endFrame: 35, totalFrames: 150, compW: 1920, compH: 1080 });\n if (fadePreset && subIdx >= 0) l = bakeAnimationIntoLayer(l, subIdx, fadePreset, { startFrame: 25, endFrame: 45, totalFrames: 150, compW: 1920, compH: 1080 });\n reindexLayers(l);\n return l;\n}\n\nfunction buildMinimalCaption(): any {\n let l = createBlankLottie(1920, 1080, 30, 90);\n l = addTextLayer(l, \"Caption\", \"This is a caption text\");\n l.layers[0] = applyTextDoc(l.layers[0], { text: \"This is a caption text\", font: \"Inter-Regular\", size: 52, color: \"#FFFFFF\", align: 1 });\n l.layers[0] = setLayerPos(l.layers[0], 960, 900);\n const idx = l.layers.findIndex((x: any) => x.nm === \"Caption\");\n const preset = getAnimPreset(\"slide-up\");\n if (preset && idx >= 0) l = bakeAnimationIntoLayer(l, idx, preset, { startFrame: 0, endFrame: 18, totalFrames: 90, compW: 1920, compH: 1080 });\n reindexLayers(l);\n return l;\n}\n\nfunction buildBoldCallout(): any {\n let l = createBlankLottie(1920, 1080, 30, 120);\n l = addRoundedRect(l, \"Pill BG\", 960, 540, 700, 100, 50, \"#FF5722\");\n l = addTextLayer(l, \"Callout\", \"BREAKING NEWS\");\n l.layers[0] = applyTextDoc(l.layers[0], { text: \"BREAKING NEWS\", font: \"Oswald-Bold\", size: 64, color: \"#FFFFFF\", align: 1, tracking: 150 });\n l.layers[0] = setLayerPos(l.layers[0], 960, 540);\n const idx = l.layers.findIndex((x: any) => x.nm === \"Callout\");\n const preset = getAnimPreset(\"pop-in\");\n if (preset && idx >= 0) l = bakeAnimationIntoLayer(l, idx, preset, { startFrame: 3, endFrame: 21, totalFrames: 120, compW: 1920, compH: 1080 });\n reindexLayers(l);\n return l;\n}\n\nfunction buildCinematicTitle(): any {\n let l = createBlankLottie(1920, 1080, 24, 144);\n l = addSolidLayer(l, \"BG\", \"#000000\", 1920, 1080);\n // Letterbox bars\n l = addRoundedRect(l, \"Bar Top\", 960, 60, 1920, 120, 0, \"#000000\");\n l = addRoundedRect(l, \"Bar Bottom\", 960, 1020, 1920, 120, 0, \"#000000\");\n l = addTextLayer(l, \"Film Title\", \"THE LAST HORIZON\");\n l.layers[0] = applyTextDoc(l.layers[0], { text: \"THE LAST HORIZON\", font: \"Playfair Display-Bold\", size: 96, color: \"#F5E6C8\", align: 1, tracking: 300 });\n l.layers[0] = setLayerPos(l.layers[0], 960, 520);\n l = addTextLayer(l, \"Tagline\", \"Some stories are worth telling\");\n l.layers[0] = applyTextDoc(l.layers[0], { text: \"Some stories are worth telling\", font: \"Playfair Display-Italic\", size: 32, color: \"#C8B89A\", align: 1 });\n l.layers[0] = setLayerPos(l.layers[0], 960, 610);\n const titleIdx = l.layers.findIndex((x: any) => x.nm === \"Film Title\");\n const tagIdx = l.layers.findIndex((x: any) => x.nm === \"Tagline\");\n const fadePreset = getAnimPreset(\"fade-in\");\n if (fadePreset && titleIdx >= 0) l = bakeAnimationIntoLayer(l, titleIdx, fadePreset, { startFrame: 12, endFrame: 48, totalFrames: 144, compW: 1920, compH: 1080 });\n if (fadePreset && tagIdx >= 0) l = bakeAnimationIntoLayer(l, tagIdx, fadePreset, { startFrame: 36, endFrame: 60, totalFrames: 144, compW: 1920, compH: 1080 });\n reindexLayers(l);\n return l;\n}\n\nfunction buildSportsScore(): any {\n let l = createBlankLottie(1920, 1080, 30, 90);\n l = addRoundedRect(l, \"Score BG\", 960, 60, 500, 80, 4, \"#CC0000\");\n l = addTextLayer(l, \"Team A\", \"TEAM A\");\n l.layers[0] = applyTextDoc(l.layers[0], { text: \"TEAM A\", font: \"Oswald-Bold\", size: 40, color: \"#FFFFFF\", align: 2, tracking: 100 });\n l.layers[0] = setLayerPos(l.layers[0], 820, 60);\n l = addTextLayer(l, \"Score\", \"3 - 1\");\n l.layers[0] = applyTextDoc(l.layers[0], { text: \"3 - 1\", font: \"Oswald-Bold\", size: 48, color: \"#FFD700\", align: 1, tracking: 50 });\n l.layers[0] = setLayerPos(l.layers[0], 960, 60);\n l = addTextLayer(l, \"Team B\", \"TEAM B\");\n l.layers[0] = applyTextDoc(l.layers[0], { text: \"TEAM B\", font: \"Oswald-Bold\", size: 40, color: \"#FFFFFF\", align: 0, tracking: 100 });\n l.layers[0] = setLayerPos(l.layers[0], 1100, 60);\n const scoreIdx = l.layers.findIndex((x: any) => x.nm === \"Score\");\n const preset = getAnimPreset(\"zoom-in-bounce\");\n if (preset && scoreIdx >= 0) l = bakeAnimationIntoLayer(l, scoreIdx, preset, { startFrame: 5, endFrame: 25, totalFrames: 90, compW: 1920, compH: 1080 });\n reindexLayers(l);\n return l;\n}\n\nfunction buildSocialQuote(): any {\n let l = createBlankLottie(1080, 1080, 30, 120);\n l = addSolidLayer(l, \"BG\", \"#1A1A2E\", 1080, 1080);\n l = addRoundedRect(l, \"Card\", 540, 540, 900, 700, 24, \"#16213E\");\n l = addTextLayer(l, \"Quote\", '\"Design is not just what it looks like. Design is how it works.\"');\n l.layers[0] = applyTextDoc(l.layers[0], { text: '\"Design is not just what it looks like.\"', font: \"Merriweather-Italic\", size: 52, color: \"#FFFFFF\", align: 1 });\n l.layers[0] = setLayerPos(l.layers[0], 540, 480);\n l = addTextLayer(l, \"Author\", \"— Steve Jobs\");\n l.layers[0] = applyTextDoc(l.layers[0], { text: \"— Steve Jobs\", font: \"Poppins-Regular\", size: 32, color: \"#7C6FFF\", align: 1 });\n l.layers[0] = setLayerPos(l.layers[0], 540, 620);\n const quoteIdx = l.layers.findIndex((x: any) => x.nm === \"Quote\");\n const authorIdx = l.layers.findIndex((x: any) => x.nm === \"Author\");\n const fadePreset = getAnimPreset(\"fade-in\");\n const slidePreset = getAnimPreset(\"slide-up\");\n if (fadePreset && quoteIdx >= 0) l = bakeAnimationIntoLayer(l, quoteIdx, fadePreset, { startFrame: 8, endFrame: 30, totalFrames: 120, compW: 1080, compH: 1080 });\n if (slidePreset && authorIdx >= 0) l = bakeAnimationIntoLayer(l, authorIdx, slidePreset, { startFrame: 25, endFrame: 45, totalFrames: 120, compW: 1080, compH: 1080 });\n reindexLayers(l);\n return l;\n}\n\nfunction buildKineticText(): any {\n let l = createBlankLottie(1920, 1080, 30, 120);\n l = addSolidLayer(l, \"BG\", \"#0D0D0D\", 1920, 1080);\n l = addTextLayer(l, \"Word 1\", \"MAKE\");\n l.layers[0] = applyTextDoc(l.layers[0], { text: \"MAKE\", font: \"Anton-Regular\", size: 180, color: \"#FFFFFF\", align: 1, tracking: 50 });\n l.layers[0] = setLayerPos(l.layers[0], 960, 400);\n l = addTextLayer(l, \"Word 2\", \"IT\");\n l.layers[0] = applyTextDoc(l.layers[0], { text: \"IT\", font: \"Anton-Regular\", size: 180, color: \"#FF2D78\", align: 1, tracking: 50 });\n l.layers[0] = setLayerPos(l.layers[0], 960, 580);\n l = addTextLayer(l, \"Word 3\", \"COUNT\");\n l.layers[0] = applyTextDoc(l.layers[0], { text: \"COUNT\", font: \"Anton-Regular\", size: 180, color: \"#FFFFFF\", align: 1, tracking: 50 });\n l.layers[0] = setLayerPos(l.layers[0], 960, 760);\n const w1 = l.layers.findIndex((x: any) => x.nm === \"Word 1\");\n const w2 = l.layers.findIndex((x: any) => x.nm === \"Word 2\");\n const w3 = l.layers.findIndex((x: any) => x.nm === \"Word 3\");\n const slideL = getAnimPreset(\"slide-left\");\n const slideR = getAnimPreset(\"slide-right\");\n const slideU = getAnimPreset(\"slide-up\");\n if (slideR && w1 >= 0) l = bakeAnimationIntoLayer(l, w1, slideR, { startFrame: 0, endFrame: 20, totalFrames: 120, compW: 1920, compH: 1080 });\n if (slideL && w2 >= 0) l = bakeAnimationIntoLayer(l, w2, slideL, { startFrame: 10, endFrame: 30, totalFrames: 120, compW: 1920, compH: 1080 });\n if (slideU && w3 >= 0) l = bakeAnimationIntoLayer(l, w3, slideU, { startFrame: 20, endFrame: 40, totalFrames: 120, compW: 1920, compH: 1080 });\n reindexLayers(l);\n return l;\n}\n\nfunction buildGlitchTitle(): any {\n let l = createBlankLottie(1920, 1080, 30, 120);\n l = addSolidLayer(l, \"BG\", \"#050505\", 1920, 1080);\n l = addTextLayer(l, \"Glitch Title\", \"SYSTEM ERROR\");\n l.layers[0] = applyTextDoc(l.layers[0], { text: \"SYSTEM ERROR\", font: \"Courier New-Bold\", size: 100, color: \"#00FF41\", align: 1, tracking: 200 });\n l.layers[0] = setLayerPos(l.layers[0], 960, 540);\n l = addTextLayer(l, \"Sub\", \"REBOOT REQUIRED\");\n l.layers[0] = applyTextDoc(l.layers[0], { text: \"REBOOT REQUIRED\", font: \"Courier New-Regular\", size: 36, color: \"#FF0000\", align: 1, tracking: 300 });\n l.layers[0] = setLayerPos(l.layers[0], 960, 640);\n const mainIdx = l.layers.findIndex((x: any) => x.nm === \"Glitch Title\");\n const subIdx = l.layers.findIndex((x: any) => x.nm === \"Sub\");\n const glitchPreset = getAnimPreset(\"glitch-in\");\n const fadePreset = getAnimPreset(\"fade-in\");\n if (glitchPreset && mainIdx >= 0) l = bakeAnimationIntoLayer(l, mainIdx, glitchPreset, { startFrame: 5, endFrame: 25, totalFrames: 120, compW: 1920, compH: 1080 });\n if (fadePreset && subIdx >= 0) l = bakeAnimationIntoLayer(l, subIdx, fadePreset, { startFrame: 20, endFrame: 40, totalFrames: 120, compW: 1920, compH: 1080 });\n reindexLayers(l);\n return l;\n}\n\nfunction buildVerticalStory(): any {\n let l = createBlankLottie(1080, 1920, 30, 90);\n l = addSolidLayer(l, \"BG\", \"#1A0533\", 1080, 1920);\n l = addTextLayer(l, \"Headline\", \"YOUR STORY\");\n l.layers[0] = applyTextDoc(l.layers[0], { text: \"YOUR STORY\", font: \"Raleway-ExtraBold\", size: 96, color: \"#FFFFFF\", align: 1, tracking: 200 });\n l.layers[0] = setLayerPos(l.layers[0], 540, 800);\n l = addTextLayer(l, \"Body\", \"Swipe up to discover more\");\n l.layers[0] = applyTextDoc(l.layers[0], { text: \"Swipe up to discover more\", font: \"Raleway-Regular\", size: 40, color: \"#D4AAFF\", align: 1 });\n l.layers[0] = setLayerPos(l.layers[0], 540, 920);\n const hIdx = l.layers.findIndex((x: any) => x.nm === \"Headline\");\n const bIdx = l.layers.findIndex((x: any) => x.nm === \"Body\");\n const zoomPreset = getAnimPreset(\"zoom-in\");\n const fadePreset = getAnimPreset(\"fade-in\");\n if (zoomPreset && hIdx >= 0) l = bakeAnimationIntoLayer(l, hIdx, zoomPreset, { startFrame: 5, endFrame: 25, totalFrames: 90, compW: 1080, compH: 1920 });\n if (fadePreset && bIdx >= 0) l = bakeAnimationIntoLayer(l, bIdx, fadePreset, { startFrame: 18, endFrame: 35, totalFrames: 90, compW: 1080, compH: 1920 });\n reindexLayers(l);\n return l;\n}\n\nfunction buildMinimalLowerThird(): any {\n let l = createBlankLottie(1920, 1080, 30, 120);\n l = addTextLayer(l, \"Name\", \"JANE SMITH\");\n l.layers[0] = applyTextDoc(l.layers[0], { text: \"JANE SMITH\", font: \"Inter-Bold\", size: 52, color: \"#FFFFFF\", align: 0, tracking: 100 });\n l.layers[0] = setLayerPos(l.layers[0], 120, 920);\n l = addTextLayer(l, \"Role\", \"Senior Product Designer\");\n l.layers[0] = applyTextDoc(l.layers[0], { text: \"Senior Product Designer\", font: \"Inter-Regular\", size: 30, color: \"#AAAAAA\", align: 0 });\n l.layers[0] = setLayerPos(l.layers[0], 120, 960);\n // Accent line shape\n l = addRoundedRect(l, \"Accent Line\", 60, 940, 6, 80, 3, \"#7C6FFF\");\n const nameIdx = l.layers.findIndex((x: any) => x.nm === \"Name\");\n const roleIdx = l.layers.findIndex((x: any) => x.nm === \"Role\");\n const slidePreset = getAnimPreset(\"slide-right\");\n if (slidePreset && nameIdx >= 0) l = bakeAnimationIntoLayer(l, nameIdx, slidePreset, { startFrame: 5, endFrame: 22, totalFrames: 120, compW: 1920, compH: 1080 });\n if (slidePreset && roleIdx >= 0) l = bakeAnimationIntoLayer(l, roleIdx, slidePreset, { startFrame: 12, endFrame: 29, totalFrames: 120, compW: 1920, compH: 1080 });\n reindexLayers(l);\n return l;\n}\n\nfunction buildTypewriterCaption(): any {\n let l = createBlankLottie(1920, 1080, 30, 120);\n l = addTextLayer(l, \"Caption\", \"Every frame tells a story...\");\n l.layers[0] = applyTextDoc(l.layers[0], { text: \"Every frame tells a story...\", font: \"Courier New-Regular\", size: 56, color: \"#FFFFFF\", align: 1 });\n l.layers[0] = setLayerPos(l.layers[0], 960, 880);\n const idx = l.layers.findIndex((x: any) => x.nm === \"Caption\");\n const preset = getAnimPreset(\"typewriter\");\n if (preset && idx >= 0) l = bakeAnimationIntoLayer(l, idx, preset, { startFrame: 5, endFrame: 60, totalFrames: 120, compW: 1920, compH: 1080 });\n reindexLayers(l);\n return l;\n}\n\nfunction buildDropInTitle(): any {\n let l = createBlankLottie(1920, 1080, 30, 120);\n l = addSolidLayer(l, \"BG\", \"#0F1923\", 1920, 1080);\n l = addTextLayer(l, \"Title\", \"IMPACT\");\n l.layers[0] = applyTextDoc(l.layers[0], { text: \"IMPACT\", font: \"Bebas Neue-Regular\", size: 200, color: \"#FFFFFF\", align: 1, tracking: 100 });\n l.layers[0] = setLayerPos(l.layers[0], 960, 540);\n l = addTextLayer(l, \"Sub\", \"MAKE YOUR MARK\");\n l.layers[0] = applyTextDoc(l.layers[0], { text: \"MAKE YOUR MARK\", font: \"Bebas Neue-Regular\", size: 48, color: \"#FF5722\", align: 1, tracking: 400 });\n l.layers[0] = setLayerPos(l.layers[0], 960, 680);\n const titleIdx = l.layers.findIndex((x: any) => x.nm === \"Title\");\n const subIdx = l.layers.findIndex((x: any) => x.nm === \"Sub\");\n const dropPreset = getAnimPreset(\"drop-in\");\n const fadePreset = getAnimPreset(\"fade-in\");\n if (dropPreset && titleIdx >= 0) l = bakeAnimationIntoLayer(l, titleIdx, dropPreset, { startFrame: 5, endFrame: 35, totalFrames: 120, compW: 1920, compH: 1080 });\n if (fadePreset && subIdx >= 0) l = bakeAnimationIntoLayer(l, subIdx, fadePreset, { startFrame: 30, endFrame: 50, totalFrames: 120, compW: 1920, compH: 1080 });\n reindexLayers(l);\n return l;\n}\n\n// ─── Registry ────────────────────────────────────────────────────────────────\n\nexport const LOTTIE_TEMPLATE_PRESETS: LottieTemplatePreset[] = [\n {\n id: \"clean-lower-third\",\n name: \"Clean Lower Third\",\n category: \"lower-third\",\n description: \"Professional name + title lower third with slide-in animation\",\n tags: [\"lower-third\", \"name\", \"title\", \"professional\", \"broadcast\"],\n aspectRatio: \"16:9\",\n build: buildCleanLowerThird,\n },\n {\n id: \"minimal-lower-third\",\n name: \"Minimal Lower Third\",\n category: \"lower-third\",\n description: \"Clean minimal lower third with accent line\",\n tags: [\"lower-third\", \"minimal\", \"clean\", \"modern\"],\n aspectRatio: \"16:9\",\n build: buildMinimalLowerThird,\n },\n {\n id: \"neon-title\",\n name: \"Neon Title\",\n category: \"title-card\",\n description: \"Vibrant neon title card with zoom bounce entrance\",\n tags: [\"neon\", \"title\", \"glow\", \"vibrant\", \"music\"],\n aspectRatio: \"16:9\",\n build: buildNeonTitle,\n },\n {\n id: \"cinematic-title\",\n name: \"Cinematic Title\",\n category: \"cinematic\",\n description: \"Film-style title with letterbox bars and elegant fade\",\n tags: [\"cinematic\", \"film\", \"elegant\", \"fade\", \"movie\"],\n aspectRatio: \"16:9\",\n build: buildCinematicTitle,\n },\n {\n id: \"minimal-caption\",\n name: \"Minimal Caption\",\n category: \"caption\",\n description: \"Simple caption text with slide-up entrance\",\n tags: [\"caption\", \"subtitle\", \"minimal\", \"clean\"],\n aspectRatio: \"16:9\",\n build: buildMinimalCaption,\n },\n {\n id: \"typewriter-caption\",\n name: \"Typewriter Caption\",\n category: \"caption\",\n description: \"Classic typewriter reveal animation\",\n tags: [\"typewriter\", \"caption\", \"retro\", \"reveal\"],\n aspectRatio: \"16:9\",\n build: buildTypewriterCaption,\n },\n {\n id: \"bold-callout\",\n name: \"Bold Callout\",\n category: \"callout\",\n description: \"Attention-grabbing pill callout with pop-in animation\",\n tags: [\"callout\", \"bold\", \"news\", \"alert\", \"pop\"],\n aspectRatio: \"16:9\",\n build: buildBoldCallout,\n },\n {\n id: \"sports-score\",\n name: \"Sports Score\",\n category: \"sports\",\n description: \"Live sports scoreboard overlay\",\n tags: [\"sports\", \"score\", \"broadcast\", \"live\"],\n aspectRatio: \"16:9\",\n build: buildSportsScore,\n },\n {\n id: \"social-quote\",\n name: \"Social Quote\",\n category: \"social\",\n description: \"Elegant quote card for social media\",\n tags: [\"quote\", \"social\", \"instagram\", \"card\", \"elegant\"],\n aspectRatio: \"1:1\",\n build: buildSocialQuote,\n },\n {\n id: \"kinetic-text\",\n name: \"Kinetic Text\",\n category: \"kinetic\",\n description: \"High-energy kinetic typography with staggered slides\",\n tags: [\"kinetic\", \"bold\", \"energy\", \"motion\", \"typography\"],\n aspectRatio: \"16:9\",\n build: buildKineticText,\n },\n {\n id: \"glitch-title\",\n name: \"Glitch Title\",\n category: \"title-card\",\n description: \"Cyberpunk glitch effect title card\",\n tags: [\"glitch\", \"cyberpunk\", \"tech\", \"digital\", \"error\"],\n aspectRatio: \"16:9\",\n build: buildGlitchTitle,\n },\n {\n id: \"vertical-story\",\n name: \"Vertical Story\",\n category: \"social\",\n description: \"9:16 vertical story format with zoom entrance\",\n tags: [\"story\", \"vertical\", \"instagram\", \"tiktok\", \"reels\"],\n aspectRatio: \"9:16\",\n build: buildVerticalStory,\n },\n {\n id: \"drop-in-title\",\n name: \"Drop In Title\",\n category: \"bold\",\n description: \"High-impact title with drop-in bounce animation\",\n tags: [\"bold\", \"impact\", \"drop\", \"bounce\", \"energetic\"],\n aspectRatio: \"16:9\",\n build: buildDropInTitle,\n },\n];\n\nexport function getTemplatePreset(id: string): LottieTemplatePreset | undefined {\n return LOTTIE_TEMPLATE_PRESETS.find((p) => p.id === id);\n}\n\nexport function getTemplatesByCategory(category: TemplatePresetCategory): LottieTemplatePreset[] {\n return LOTTIE_TEMPLATE_PRESETS.filter((p) => p.category === category);\n}\n\nexport const TEMPLATE_CATEGORIES: TemplatePresetCategory[] = [\"lower-third\", \"title-card\", \"callout\", \"caption\", \"kinetic\", \"social\", \"cinematic\", \"sports\", \"minimal\", \"bold\"];\n","/**\n * Lottie Export Engine\n * Supports:\n * - .lottie (dotLottie) — ZIP containing animation.json + manifest.json\n * - .json — raw Lottie JSON\n * - PNG sequence ZIP\n * - Animated GIF (via canvas frame capture)\n */\n\n// ─── dotLottie (.lottie) ─────────────────────────────────────────────────────\n\nexport interface DotLottieManifest {\n version: string;\n generator: string;\n animations: Array<{\n id: string;\n speed?: number;\n themeColor?: string;\n loop?: boolean;\n autoplay?: boolean;\n direction?: 1 | -1;\n }>;\n}\n\n/**\n * Build a .lottie file (ZIP containing animation.json + manifest.json).\n * The .lottie format is the standard used by LottieFiles and dotlottie-player.\n */\nexport async function buildDotLottie(lottieData: object, animationId: string, opts: { loop?: boolean; autoplay?: boolean; speed?: number } = {}): Promise<Blob> {\n const { loop = true, autoplay = true, speed = 1 } = opts;\n\n const manifest: DotLottieManifest = {\n version: \"1\",\n generator: \"Clypra Studio\",\n animations: [{ id: animationId, loop, autoplay, speed }],\n };\n\n const animJson = JSON.stringify(lottieData);\n const manifestJson = JSON.stringify(manifest, null, 2);\n\n // Build minimal ZIP (store, no compression) — same approach as export.ts\n const files: Array<{ name: string; data: Uint8Array }> = [\n { name: `animations/${animationId}.json`, data: new TextEncoder().encode(animJson) },\n { name: \"manifest.json\", data: new TextEncoder().encode(manifestJson) },\n ];\n\n return buildZipBlob(files, \"application/zip\");\n}\n\n/**\n * Download a .lottie file.\n */\nexport function downloadDotLottie(lottieData: object, filename: string, animationId?: string, opts?: { loop?: boolean; autoplay?: boolean; speed?: number }): Promise<void> {\n const id = animationId || filename.replace(/[^a-z0-9-]/gi, \"-\").toLowerCase() || \"animation\";\n return buildDotLottie(lottieData, id, opts).then((blob) => {\n triggerDownload(blob, filename.endsWith(\".lottie\") ? filename : `${filename}.lottie`);\n });\n}\n\n/**\n * Download raw Lottie JSON.\n */\nexport function downloadLottieJson(lottieData: object, filename: string): void {\n const blob = new Blob([JSON.stringify(lottieData, null, 2)], { type: \"application/json\" });\n triggerDownload(blob, filename.endsWith(\".json\") ? filename : `${filename}.json`);\n}\n\n// ─── Animated GIF ─────────────────────────────────────────────────────────────\n\nexport interface GifExportOptions {\n fps?: number;\n duration?: number;\n width?: number;\n height?: number;\n quality?: number; // 1–20, lower = better quality (GIF palette)\n loop?: boolean;\n}\n\nexport interface GifFrame {\n imageData: ImageData;\n delay: number; // centiseconds\n}\n\n/**\n * Capture frames from a Lottie animation rendered via lottie-web into a canvas.\n * Returns raw ImageData frames ready for GIF encoding.\n *\n * NOTE: Requires lottie-web to be loaded and the container to be in the DOM.\n */\nexport async function captureLottieFrames(lottieInstance: any, canvas: HTMLCanvasElement, opts: GifExportOptions = {}): Promise<GifFrame[]> {\n const fps = opts.fps ?? 15;\n const duration = opts.duration ?? lottieInstance.totalFrames / (lottieInstance.frameRate || 30);\n const totalFrames = Math.ceil(duration * fps);\n const delay = Math.round(100 / fps); // centiseconds per frame\n\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) throw new Error(\"Cannot get 2D context from canvas\");\n\n const frames: GifFrame[] = [];\n\n for (let i = 0; i < totalFrames; i++) {\n const lottieFrame = (i / totalFrames) * lottieInstance.totalFrames;\n lottieInstance.goToAndStop(lottieFrame, true);\n\n // Wait for render\n await new Promise<void>((r) => requestAnimationFrame(() => r()));\n\n // Draw SVG to canvas via serialization\n const container = lottieInstance.renderer?.svgElement?.parentElement;\n if (container) {\n const svg = container.querySelector(\"svg\");\n if (svg) {\n const svgStr = new XMLSerializer().serializeToString(svg);\n const img = new Image();\n const blob = new Blob([svgStr], { type: \"image/svg+xml\" });\n const url = URL.createObjectURL(blob);\n await new Promise<void>((resolve, reject) => {\n img.onload = () => {\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n ctx.drawImage(img, 0, 0, canvas.width, canvas.height);\n URL.revokeObjectURL(url);\n resolve();\n };\n img.onerror = reject;\n img.src = url;\n });\n }\n }\n\n frames.push({\n imageData: ctx.getImageData(0, 0, canvas.width, canvas.height),\n delay,\n });\n }\n\n return frames;\n}\n\n/**\n * Encode frames to an animated GIF using a pure-JS GIF encoder.\n * Uses the omggif library approach (inline minimal encoder).\n */\nexport function encodeGif(frames: GifFrame[], width: number, height: number, opts: { loop?: boolean; quality?: number } = {}): Uint8Array {\n const { loop = true, quality = 10 } = opts;\n\n // Minimal GIF89a encoder\n const buf: number[] = [];\n\n const writeStr = (s: string) => {\n for (let i = 0; i < s.length; i++) buf.push(s.charCodeAt(i));\n };\n const writeU16 = (v: number) => {\n buf.push(v & 0xff, (v >> 8) & 0xff);\n };\n const writeByte = (v: number) => buf.push(v & 0xff);\n\n // Header\n writeStr(\"GIF89a\");\n writeU16(width);\n writeU16(height);\n writeByte(0x70); // GCT flag + color resolution + sort flag + GCT size (256 colors)\n writeByte(0); // background color index\n writeByte(0); // pixel aspect ratio\n\n // Global color table (256 grayscale entries as placeholder — real colors come per-frame)\n for (let i = 0; i < 256; i++) {\n buf.push(i, i, i);\n }\n\n // Netscape loop extension\n if (loop) {\n writeStr(\"\\x21\\xff\\x0bNETSCAPE2.0\\x03\\x01\");\n writeU16(0); // loop count 0 = infinite\n writeByte(0);\n }\n\n for (const frame of frames) {\n const { imageData, delay } = frame;\n const pixels = imageData.data;\n\n // Quantize to 256 colors (median cut approximation — simplified octree)\n const palette = quantizeTopalette(pixels, 256);\n const indices = mapPixelsToPalette(pixels, palette);\n\n // Graphic control extension\n buf.push(0x21, 0xf9, 0x04);\n writeByte(0x00); // disposal method\n writeU16(delay);\n writeByte(0); // transparent color index\n writeByte(0);\n\n // Image descriptor\n writeByte(0x2c);\n writeU16(0);\n writeU16(0); // left, top\n writeU16(width);\n writeU16(height);\n writeByte(0x80); // local color table flag, 256 colors\n\n // Local color table\n for (const [r, g, b] of palette) {\n buf.push(r, g, b);\n }\n\n // LZW compressed image data\n const lzwData = lzwEncode(indices, 8);\n writeByte(8); // LZW minimum code size\n for (let i = 0; i < lzwData.length; i += 255) {\n const chunk = lzwData.slice(i, i + 255);\n writeByte(chunk.length);\n for (const b of chunk) buf.push(b);\n }\n writeByte(0); // block terminator\n }\n\n writeByte(0x3b); // GIF trailer\n return new Uint8Array(buf);\n}\n\n// ─── Internal helpers ─────────────────────────────────────────────────────────\n\nfunction triggerDownload(blob: Blob, filename: string): void {\n const url = URL.createObjectURL(blob);\n const a = document.createElement(\"a\");\n a.href = url;\n a.download = filename;\n a.click();\n URL.revokeObjectURL(url);\n}\n\nfunction buildZipBlob(files: Array<{ name: string; data: Uint8Array }>, mimeType = \"application/zip\"): Blob {\n const parts: BlobPart[] = [];\n let offset = 0;\n const central: Uint8Array[] = [];\n\n const crcTable = (() => {\n const t = new Uint32Array(256);\n for (let i = 0; i < 256; i++) {\n let c = i;\n for (let k = 0; k < 8; k++) c = c & 1 ? 0xedb88320 ^ (c >>> 1) : c >>> 1;\n t[i] = c >>> 0;\n }\n return t;\n })();\n\n const crc32 = (data: Uint8Array) => {\n let c = 0xffffffff;\n for (let i = 0; i < data.length; i++) c = crcTable[(c ^ data[i]) & 0xff] ^ (c >>> 8);\n return (c ^ 0xffffffff) >>> 0;\n };\n\n const u16 = (arr: number[], v: number) => arr.push(v & 0xff, (v >>> 8) & 0xff);\n const u32 = (arr: number[], v: number) => arr.push(v & 0xff, (v >>> 8) & 0xff, (v >>> 16) & 0xff, (v >>> 24) & 0xff);\n\n for (const file of files) {\n const nameBytes = new TextEncoder().encode(file.name);\n const crc = crc32(file.data);\n const local: number[] = [];\n u32(local, 0x04034b50);\n u16(local, 20);\n u16(local, 0);\n u16(local, 0);\n u16(local, 0);\n u16(local, 0);\n u32(local, crc);\n u32(local, file.data.length);\n u32(local, file.data.length);\n u16(local, nameBytes.length);\n u16(local, 0);\n local.push(...nameBytes);\n const localHeader = new Uint8Array(local);\n parts.push(localHeader, file.data.buffer.slice(file.data.byteOffset, file.data.byteOffset + file.data.byteLength) as ArrayBuffer);\n\n const ce: number[] = [];\n u32(ce, 0x02014b50);\n u16(ce, 20);\n u16(ce, 20);\n u16(ce, 0);\n u16(ce, 0);\n u16(ce, 0);\n u16(ce, 0);\n u32(ce, crc);\n u32(ce, file.data.length);\n u32(ce, file.data.length);\n u16(ce, nameBytes.length);\n u16(ce, 0);\n u16(ce, 0);\n u16(ce, 0);\n u16(ce, 0);\n u32(ce, 0);\n u32(ce, offset);\n ce.push(...nameBytes);\n central.push(new Uint8Array(ce));\n offset += localHeader.length + file.data.length;\n }\n\n const centralSize = central.reduce((s, c) => s + c.length, 0);\n const centralStart = offset;\n for (const c of central) parts.push(c.buffer.slice(c.byteOffset, c.byteOffset + c.byteLength) as ArrayBuffer);\n\n const end: number[] = [];\n const u16e = (v: number) => end.push(v & 0xff, (v >>> 8) & 0xff);\n const u32e = (v: number) => end.push(v & 0xff, (v >>> 8) & 0xff, (v >>> 16) & 0xff, (v >>> 24) & 0xff);\n u32e(0x06054b50);\n u16e(0);\n u16e(0);\n u16e(files.length);\n u16e(files.length);\n u32e(centralSize);\n u32e(centralStart);\n u16e(0);\n parts.push(new Uint8Array(end).buffer as ArrayBuffer);\n\n return new Blob(parts, { type: mimeType });\n}\n\n/** Simplified median-cut color quantization — returns up to `maxColors` [r,g,b] entries */\nfunction quantizeTopalette(pixels: Uint8ClampedArray, maxColors: number): Array<[number, number, number]> {\n const sample: Array<[number, number, number]> = [];\n for (let i = 0; i < pixels.length; i += 4 * 4) {\n // sample every 4th pixel\n if (pixels[i + 3] > 0) sample.push([pixels[i], pixels[i + 1], pixels[i + 2]]);\n }\n if (sample.length === 0) return Array.from({ length: maxColors }, (_, i) => [i, i, i] as [number, number, number]);\n\n // Simple k-means with k = min(maxColors, unique colors)\n const unique = new Map<string, [number, number, number]>();\n for (const c of sample) {\n const key = `${c[0] >> 2},${c[1] >> 2},${c[2] >> 2}`;\n if (!unique.has(key)) unique.set(key, c);\n if (unique.size >= maxColors) break;\n }\n\n const palette = Array.from(unique.values()).slice(0, maxColors);\n while (palette.length < maxColors) palette.push([0, 0, 0]);\n return palette;\n}\n\n/** Map each pixel to the nearest palette index */\nfunction mapPixelsToPalette(pixels: Uint8ClampedArray, palette: Array<[number, number, number]>): Uint8Array {\n const indices = new Uint8Array(pixels.length / 4);\n for (let i = 0; i < pixels.length; i += 4) {\n const r = pixels[i],\n g = pixels[i + 1],\n b = pixels[i + 2];\n let best = 0,\n bestDist = Infinity;\n for (let j = 0; j < palette.length; j++) {\n const dr = r - palette[j][0],\n dg = g - palette[j][1],\n db = b - palette[j][2];\n const dist = dr * dr + dg * dg + db * db;\n if (dist < bestDist) {\n bestDist = dist;\n best = j;\n }\n }\n indices[i / 4] = best;\n }\n return indices;\n}\n\n/** Minimal LZW encoder for GIF */\nfunction lzwEncode(indices: Uint8Array, minCodeSize: number): number[] {\n const clearCode = 1 << minCodeSize;\n const eofCode = clearCode + 1;\n let codeSize = minCodeSize + 1;\n let nextCode = eofCode + 1;\n\n const table = new Map<string, number>();\n const resetTable = () => {\n table.clear();\n for (let i = 0; i < clearCode; i++) table.set(String.fromCharCode(i), i);\n codeSize = minCodeSize + 1;\n nextCode = eofCode + 1;\n };\n\n const output: number[] = [];\n let bitBuf = 0,\n bitLen = 0;\n\n const emit = (code: number) => {\n bitBuf |= code << bitLen;\n bitLen += codeSize;\n while (bitLen >= 8) {\n output.push(bitBuf & 0xff);\n bitBuf >>= 8;\n bitLen -= 8;\n }\n };\n\n resetTable();\n emit(clearCode);\n\n let prefix = String.fromCharCode(indices[0]);\n for (let i = 1; i < indices.length; i++) {\n const suffix = String.fromCharCode(indices[i]);\n const combined = prefix + suffix;\n if (table.has(combined)) {\n prefix = combined;\n } else {\n emit(table.get(prefix)!);\n if (nextCode < 4096) {\n table.set(combined, nextCode++);\n if (nextCode > 1 << codeSize && codeSize < 12) codeSize++;\n } else {\n emit(clearCode);\n resetTable();\n }\n prefix = suffix;\n }\n }\n emit(table.get(prefix)!);\n emit(eofCode);\n if (bitLen > 0) output.push(bitBuf & 0xff);\n return output;\n}\n","import type { SceneDocument } from \"./schema\";\nimport { evaluateScene } from \"./evaluate\";\n\nexport interface PngSequenceOptions {\n fps?: number;\n duration?: number;\n width?: number;\n height?: number;\n}\n\nexport interface PngSequenceFrame {\n index: number;\n time: number;\n dataUrl: string;\n}\n\n/** Render all frames in-memory (browser) */\nexport function renderPngSequence(doc: SceneDocument, options: PngSequenceOptions = {}): PngSequenceFrame[] {\n const fps = options.fps ?? doc.timeline.fps ?? 30;\n const duration = options.duration ?? doc.timeline.duration ?? 2;\n const width = options.width ?? doc.canvas.width ?? 800;\n const height = options.height ?? doc.canvas.height ?? 200;\n const frameCount = Math.max(1, Math.ceil(duration * fps));\n\n const canvas = document.createElement(\"canvas\");\n canvas.width = width;\n canvas.height = height;\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) return [];\n\n const frames: PngSequenceFrame[] = [];\n for (let i = 0; i < frameCount; i++) {\n const time = i / fps;\n ctx.clearRect(0, 0, width, height);\n evaluateScene(doc, time, ctx);\n frames.push({\n index: i,\n time,\n dataUrl: canvas.toDataURL(\"image/png\"),\n });\n }\n return frames;\n}\n\nfunction dataUrlToUint8Array(dataUrl: string): Uint8Array {\n const base64 = dataUrl.split(\",\")[1] ?? \"\";\n const binary = atob(base64);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) bytes[i] = binary.charCodeAt(i);\n return bytes;\n}\n\n/** Build a minimal ZIP (store only, no compression) for PNG frames */\nexport function buildPngSequenceZip(frames: PngSequenceFrame[]): Blob {\n const files: { name: string; data: Uint8Array }[] = frames.map((f) => ({\n name: `frame-${String(f.index).padStart(4, \"0\")}.png`,\n data: dataUrlToUint8Array(f.dataUrl),\n }));\n\n const parts: BlobPart[] = [];\n let offset = 0;\n const central: Uint8Array[] = [];\n\n const crcTable = (() => {\n const table = new Uint32Array(256);\n for (let i = 0; i < 256; i++) {\n let c = i;\n for (let k = 0; k < 8; k++) c = c & 1 ? 0xedb88320 ^ (c >>> 1) : c >>> 1;\n table[i] = c >>> 0;\n }\n return table;\n })();\n\n const crc32 = (data: Uint8Array) => {\n let c = 0xffffffff;\n for (let i = 0; i < data.length; i++) c = crcTable[(c ^ data[i]) & 0xff] ^ (c >>> 8);\n return (c ^ 0xffffffff) >>> 0;\n };\n\n const pushU16 = (arr: number[], v: number) => {\n arr.push(v & 0xff, (v >>> 8) & 0xff);\n };\n const pushU32 = (arr: number[], v: number) => {\n arr.push(v & 0xff, (v >>> 8) & 0xff, (v >>> 16) & 0xff, (v >>> 24) & 0xff);\n };\n\n for (const file of files) {\n const nameBytes = new TextEncoder().encode(file.name);\n const data = file.data;\n const crc = crc32(data);\n\n const local: number[] = [];\n pushU32(local, 0x04034b50);\n pushU16(local, 20);\n pushU16(local, 0);\n pushU16(local, 0);\n pushU16(local, 0);\n pushU16(local, 0);\n pushU32(local, crc);\n pushU32(local, data.length);\n pushU32(local, data.length);\n pushU16(local, nameBytes.length);\n pushU16(local, 0);\n local.push(...nameBytes);\n\n const localHeader = new Uint8Array(local);\n parts.push(localHeader);\n parts.push(data.buffer.slice(data.byteOffset, data.byteOffset + data.byteLength) as ArrayBuffer);\n\n const centralEntry: number[] = [];\n pushU32(centralEntry, 0x02014b50);\n pushU16(centralEntry, 20);\n pushU16(centralEntry, 20);\n pushU16(centralEntry, 0);\n pushU16(centralEntry, 0);\n pushU16(centralEntry, 0);\n pushU16(centralEntry, 0);\n pushU32(centralEntry, crc);\n pushU32(centralEntry, data.length);\n pushU32(centralEntry, data.length);\n pushU16(centralEntry, nameBytes.length);\n pushU16(centralEntry, 0);\n pushU16(centralEntry, 0);\n pushU16(centralEntry, 0);\n pushU16(centralEntry, 0);\n pushU32(centralEntry, 0);\n pushU32(centralEntry, offset);\n centralEntry.push(...nameBytes);\n central.push(new Uint8Array(centralEntry));\n\n offset += localHeader.length + data.length;\n }\n\n const centralSize = central.reduce((s, c) => s + c.length, 0);\n const centralStart = offset;\n for (const c of central) parts.push(c.buffer.slice(c.byteOffset, c.byteOffset + c.byteLength) as ArrayBuffer);\n\n const end: number[] = [];\n pushU32(end, 0x06054b50);\n pushU16(end, 0);\n pushU16(end, 0);\n pushU16(end, files.length);\n pushU16(end, files.length);\n pushU32(end, centralSize);\n pushU32(end, centralStart);\n pushU16(end, 0);\n parts.push(new Uint8Array(end).buffer as ArrayBuffer);\n\n return new Blob(parts, { type: \"application/zip\" });\n}\n\nexport function downloadPngSequenceZip(doc: SceneDocument, filename: string, options?: PngSequenceOptions): void {\n const frames = renderPngSequence(doc, options);\n if (frames.length === 0) return;\n const zip = buildPngSequenceZip(frames);\n const url = URL.createObjectURL(zip);\n const link = document.createElement(\"a\");\n link.href = url;\n link.download = filename.endsWith(\".zip\") ? filename : `${filename}.zip`;\n link.click();\n URL.revokeObjectURL(url);\n}\n\nexport const WEBM_EXPORT_MAX_FRAMES = 900;\n\nconst WEBM_MIME_CANDIDATES = [\"video/webm;codecs=vp9\", \"video/webm;codecs=vp8\", \"video/webm\"] as const;\n\nexport interface WebMExportOptions extends PngSequenceOptions {\n videoBitsPerSecond?: number;\n /** Pace frame capture so clip duration matches timeline (recommended) */\n realtimePacing?: boolean;\n}\n\nexport function getSupportedWebMMimeType(): string | null {\n if (typeof MediaRecorder === \"undefined\") return null;\n return WEBM_MIME_CANDIDATES.find((t) => MediaRecorder.isTypeSupported(t)) ?? null;\n}\n\nexport function isWebMExportSupported(): boolean {\n return typeof document !== \"undefined\" && typeof MediaRecorder !== \"undefined\" && getSupportedWebMMimeType() !== null;\n}\n\nexport function getWebMFrameCount(doc: SceneDocument, options: WebMExportOptions = {}): number {\n const fps = options.fps ?? doc.timeline.fps ?? 30;\n const duration = options.duration ?? doc.timeline.duration ?? 2;\n return Math.max(1, Math.ceil(duration * fps));\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\ntype CanvasCaptureTrack = MediaStreamTrack & { requestFrame?: () => void };\n\n/**\n * Encode timeline frames to WebM via MediaRecorder + canvas.captureStream(0).\n * Browser-only; transparent backgrounds may flatten to black in the recording.\n */\nexport async function renderSceneWebM(doc: SceneDocument, options: WebMExportOptions = {}): Promise<Blob> {\n if (typeof document === \"undefined\") {\n throw new Error(\"WebM export requires a browser environment.\");\n }\n\n const mimeType = getSupportedWebMMimeType();\n if (!mimeType) {\n throw new Error(\"WebM recording is not supported in this browser.\");\n }\n\n const fps = options.fps ?? doc.timeline.fps ?? 30;\n const duration = options.duration ?? doc.timeline.duration ?? 2;\n const width = options.width ?? doc.canvas.width ?? 800;\n const height = options.height ?? doc.canvas.height ?? 200;\n const frameCount = getWebMFrameCount(doc, options);\n\n if (frameCount > WEBM_EXPORT_MAX_FRAMES) {\n throw new Error(`Too many frames (${frameCount}). Max ${WEBM_EXPORT_MAX_FRAMES}. Lower duration or FPS.`);\n }\n\n const canvas = document.createElement(\"canvas\");\n canvas.width = width;\n canvas.height = height;\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) throw new Error(\"Could not create export canvas.\");\n\n const stream = canvas.captureStream(0);\n const videoTrack = stream.getVideoTracks()[0] as CanvasCaptureTrack;\n\n const recorder = new MediaRecorder(stream, {\n mimeType,\n videoBitsPerSecond: options.videoBitsPerSecond ?? 6_000_000,\n });\n\n const chunks: BlobPart[] = [];\n const frameIntervalMs = 1000 / fps;\n const pace = options.realtimePacing !== false;\n\n const blob = await new Promise<Blob>((resolve, reject) => {\n recorder.ondataavailable = (e) => {\n if (e.data.size > 0) chunks.push(e.data);\n };\n recorder.onerror = () => {\n reject(new Error(\"MediaRecorder failed during WebM export.\"));\n };\n recorder.onstop = () => {\n const baseMime = mimeType.split(\";\")[0] ?? \"video/webm\";\n resolve(new Blob(chunks, { type: baseMime }));\n };\n\n recorder.start();\n\n (async () => {\n try {\n for (let i = 0; i < frameCount; i++) {\n const time = i / fps;\n ctx.clearRect(0, 0, width, height);\n evaluateScene(doc, time, ctx);\n if (typeof videoTrack.requestFrame === \"function\") {\n videoTrack.requestFrame();\n }\n if (pace) await sleep(frameIntervalMs);\n else await new Promise<void>((r) => requestAnimationFrame(() => r()));\n }\n recorder.stop();\n } catch (err) {\n try {\n recorder.stop();\n } catch {\n /* ignore */\n }\n reject(err);\n } finally {\n stream.getTracks().forEach((t) => t.stop());\n }\n })();\n });\n\n return blob;\n}\n\nexport async function downloadSceneWebM(doc: SceneDocument, filename: string, options?: WebMExportOptions): Promise<void> {\n const blob = await renderSceneWebM(doc, options);\n const url = URL.createObjectURL(blob);\n const link = document.createElement(\"a\");\n link.href = url;\n link.download = filename.endsWith(\".webm\") ? filename : `${filename}.webm`;\n link.click();\n URL.revokeObjectURL(url);\n}\n","/**\n * Google Fonts loader for the Lottie Studio.\n * Scans a Lottie composition for all font families used, then injects\n * the appropriate Google Fonts stylesheet + @font-face rules so\n * lottie-web can resolve them by fName.\n */\n\n// ─── Font family → Google Fonts slug mapping ─────────────────────────────────\n\n/** Families that ship with the OS — no Google Fonts needed */\nconst SYSTEM_FONTS = new Set([\"Arial\", \"Arial Black\", \"Comic Sans MS\", \"Courier New\", \"Georgia\", \"Impact\", \"Times New Roman\", \"Trebuchet MS\", \"Verdana\", \"Helvetica\", \"Helvetica Neue\", \"Tahoma\", \"Palatino\"]);\n\n/** Weight names used in Lottie fName → numeric weight */\nconst WEIGHT_MAP: Record<string, number> = {\n Thin: 100,\n ExtraLight: 200,\n Light: 300,\n Regular: 400,\n Medium: 500,\n SemiBold: 600,\n Bold: 700,\n ExtraBold: 800,\n Black: 900,\n};\n\nexport interface LottieFontUsage {\n fName: string; // e.g. \"Poppins-Bold\"\n fFamily: string; // e.g. \"Poppins\"\n fWeight: number; // e.g. 700\n fStyle: \"normal\" | \"italic\";\n}\n\n// ─── Scanner ─────────────────────────────────────────────────────────────────\n\n/**\n * Scan a Lottie JSON object and return all unique font usages.\n */\nexport function scanLottieFonts(lottieData: any): LottieFontUsage[] {\n if (!lottieData?.fonts?.list) return [];\n\n const usages: LottieFontUsage[] = [];\n const seen = new Set<string>();\n\n for (const entry of lottieData.fonts.list) {\n const fName: string = entry.fName || entry.asName || \"\";\n if (!fName || seen.has(fName)) continue;\n seen.add(fName);\n\n const fFamily: string = entry.fFamily || parseFamilyFromName(fName);\n const { weight, italic } = parseVariantFromName(fName);\n\n usages.push({\n fName,\n fFamily,\n fWeight: weight,\n fStyle: italic ? \"italic\" : \"normal\",\n });\n }\n\n return usages;\n}\n\nfunction parseFamilyFromName(fName: string): string {\n // \"Poppins-Bold\" → \"Poppins\", \"Open Sans-Regular\" → \"Open Sans\"\n const dashIdx = fName.lastIndexOf(\"-\");\n return dashIdx > 0 ? fName.slice(0, dashIdx) : fName;\n}\n\nfunction parseVariantFromName(fName: string): { weight: number; italic: boolean } {\n const dashIdx = fName.lastIndexOf(\"-\");\n const variant = dashIdx > 0 ? fName.slice(dashIdx + 1) : \"Regular\";\n const italic = variant.toLowerCase().includes(\"italic\");\n const clean = variant.replace(/italic/i, \"\").trim();\n const weight = WEIGHT_MAP[clean] ?? 400;\n return { weight, italic };\n}\n\n// ─── Loader ──────────────────────────────────────────────────────────────────\n\nconst loadedFamilies = new Set<string>();\n\n/**\n * Inject Google Fonts stylesheets for all non-system fonts found in a Lottie.\n * Also injects @font-face rules that map Lottie fName → CSS font-family.\n * Safe to call multiple times — deduplicates by family.\n */\nexport function loadLottieFonts(lottieData: any): void {\n if (typeof document === \"undefined\") return;\n\n const usages = scanLottieFonts(lottieData);\n const googleFamilies = new Map<string, Set<string>>(); // family → set of \"weight\" or \"weight italic\"\n\n for (const usage of usages) {\n if (SYSTEM_FONTS.has(usage.fFamily)) continue;\n if (!googleFamilies.has(usage.fFamily)) googleFamilies.set(usage.fFamily, new Set());\n const variant = usage.fStyle === \"italic\" ? `${usage.fWeight}italic` : `${usage.fWeight}`;\n googleFamilies.get(usage.fFamily)!.add(variant);\n }\n\n for (const [family, variants] of googleFamilies) {\n if (loadedFamilies.has(family)) continue;\n loadedFamilies.add(family);\n\n // Build Google Fonts v2 URL\n const slug = family.replace(/\\s+/g, \"+\");\n const weights = Array.from(variants)\n .map((v) => v.replace(\"italic\", \"\"))\n .filter(Boolean)\n .join(\";\");\n const url = `https://fonts.googleapis.com/css2?family=${slug}:ital,wght@${buildGoogleFontsAxes(variants)}&display=swap`;\n\n const linkId = `gfont-lottie-${family.replace(/\\s+/g, \"-\").toLowerCase()}`;\n if (!document.getElementById(linkId)) {\n const link = document.createElement(\"link\");\n link.id = linkId;\n link.rel = \"stylesheet\";\n link.href = url;\n document.head.appendChild(link);\n }\n }\n\n // Inject @font-face rules that map Lottie fName to the loaded CSS family\n injectFontFaceRules(usages);\n}\n\nfunction buildGoogleFontsAxes(variants: Set<string>): string {\n // Build \"ital,wght@0,400;0,700;1,400\" style axes\n const axes: string[] = [];\n for (const v of variants) {\n const isItalic = v.includes(\"italic\");\n const weight = v.replace(\"italic\", \"\") || \"400\";\n axes.push(`${isItalic ? 1 : 0},${weight}`);\n }\n return axes.sort().join(\";\");\n}\n\nconst injectedFontFaces = new Set<string>();\n\nfunction injectFontFaceRules(usages: LottieFontUsage[]): void {\n if (typeof document === \"undefined\") return;\n\n const rules: string[] = [];\n\n for (const usage of usages) {\n if (injectedFontFaces.has(usage.fName)) continue;\n injectedFontFaces.add(usage.fName);\n\n // lottie-web looks up fonts by font-family matching fName exactly.\n // We create a @font-face that aliases fName → the actual loaded family.\n rules.push(\n `\n@font-face {\n font-family: \"${usage.fName}\";\n src: local(\"${usage.fFamily}\");\n font-weight: ${usage.fWeight};\n font-style: ${usage.fStyle};\n}\n `.trim(),\n );\n }\n\n if (rules.length === 0) return;\n\n const styleId = \"clypra-lottie-fontfaces\";\n let styleEl = document.getElementById(styleId) as HTMLStyleElement | null;\n if (!styleEl) {\n styleEl = document.createElement(\"style\");\n styleEl.id = styleId;\n document.head.appendChild(styleEl);\n }\n styleEl.textContent += \"\\n\" + rules.join(\"\\n\");\n}\n\n/**\n * Wait for all fonts currently in the document to be loaded.\n * Useful before capturing thumbnails or exporting frames.\n */\nexport async function waitForFontsReady(): Promise<void> {\n if (typeof document === \"undefined\") return;\n if (document.fonts?.ready) {\n await document.fonts.ready;\n } else {\n await new Promise<void>((r) => setTimeout(r, 300));\n }\n}\n\n/**\n * Preload a specific Google Font family with given weights.\n * Useful for the Style Editor font picker.\n */\nexport function preloadGoogleFont(family: string, weights: number[] = [400, 700]): void {\n if (typeof document === \"undefined\") return;\n if (SYSTEM_FONTS.has(family)) return;\n\n const linkId = `gfont-picker-${family.replace(/\\s+/g, \"-\").toLowerCase()}`;\n if (document.getElementById(linkId)) return;\n\n const slug = family.replace(/\\s+/g, \"+\");\n const wStr = weights.join(\";\");\n const url = `https://fonts.googleapis.com/css2?family=${slug}:wght@${wStr}&display=swap`;\n\n const link = document.createElement(\"link\");\n link.id = linkId;\n link.rel = \"stylesheet\";\n link.href = url;\n document.head.appendChild(link);\n}\n\n/**\n * Clear the font loading cache (useful for testing).\n */\nexport function clearFontCache(): void {\n loadedFamilies.clear();\n injectedFontFaces.clear();\n}\n","import type { EffectLayer, EffectLayerType } from \"./schema\";\n\nexport interface AnimatableParamDef {\n path: string;\n label: string;\n min?: number;\n max?: number;\n step?: number;\n unit?: string;\n}\n\nconst LAYER_OPACITY: AnimatableParamDef = {\n path: \"layerOpacity\",\n label: \"Layer opacity\",\n min: 0,\n max: 1,\n step: 0.01,\n};\n\nconst BY_TYPE: Partial<Record<EffectLayerType, AnimatableParamDef[]>> = {\n shadow: [\n { path: \"shadowOffsetX\", label: \"Offset X\", min: -120, max: 120, step: 1 },\n { path: \"shadowOffsetY\", label: \"Offset Y\", min: -120, max: 120, step: 1 },\n { path: \"shadowBlur\", label: \"Blur\", min: 0, max: 80, step: 1 },\n { path: \"shadowOpacity\", label: \"Opacity\", min: 0, max: 100, step: 1, unit: \"%\" },\n ],\n glow: [\n { path: \"blur\", label: \"Blur\", min: 0, max: 120, step: 1 },\n { path: \"opacity\", label: \"Glow opacity\", min: 0, max: 100, step: 1, unit: \"%\" },\n { path: \"spread\", label: \"Spread\", min: 0, max: 100, step: 1 },\n { path: \"strength\", label: \"Strength\", min: 0, max: 100, step: 1 },\n ],\n extrusion: [\n { path: \"bevelDepth\", label: \"Depth\", min: 0, max: 80, step: 1 },\n { path: \"bevelHighlight\", label: \"Highlight\", min: 0, max: 100, step: 1 },\n { path: \"bevelShadow\", label: \"Shadow\", min: 0, max: 100, step: 1 },\n { path: \"bevelBlur\", label: \"Ambient blur\", min: 0, max: 40, step: 1 },\n ],\n duplicateStack: [\n { path: \"stackOffsetX\", label: \"Stack offset X\", min: -40, max: 40, step: 1 },\n { path: \"stackOffsetY\", label: \"Stack offset Y\", min: -40, max: 40, step: 1 },\n { path: \"stackCount\", label: \"Stack count\", min: 1, max: 24, step: 1 },\n ],\n stroke: [\n { path: \"strokeWidth\", label: \"Width\", min: 0, max: 40, step: 0.5 },\n { path: \"strokeOpacity\", label: \"Opacity\", min: 0, max: 100, step: 1, unit: \"%\" },\n { path: \"strokeBlur\", label: \"Blur\", min: 0, max: 30, step: 1 },\n ],\n fill: [{ path: \"fillOpacity\", label: \"Fill opacity\", min: 0, max: 100, step: 1, unit: \"%\" }],\n panel: [\n { path: \"panelOpacity\", label: \"Panel opacity\", min: 0, max: 100, step: 1, unit: \"%\" },\n { path: \"panelPaddingX\", label: \"Padding X\", min: 0, max: 120, step: 1 },\n { path: \"panelPaddingY\", label: \"Padding Y\", min: 0, max: 120, step: 1 },\n ],\n mask: [{ path: \"revealProgress\", label: \"Reveal\", min: 0, max: 1, step: 0.01 }],\n filter: [\n { path: \"blur\", label: \"Blur\", min: 0, max: 20, step: 0.1 },\n { path: \"bloom\", label: \"Bloom\", min: 0, max: 2, step: 0.05 },\n ],\n};\n\nexport function getAnimatableParamsForLayer(layer: EffectLayer): AnimatableParamDef[] {\n const typeParams = BY_TYPE[layer.type] ?? [];\n return [LAYER_OPACITY, ...typeParams];\n}\n\nexport function getAnimatableParamDef(layer: EffectLayer, paramPath: string): AnimatableParamDef | undefined {\n return getAnimatableParamsForLayer(layer).find((p) => p.path === paramPath);\n}\n\nexport function readLayerScalar(layer: EffectLayer, paramPath: string): number {\n if (paramPath === \"layerOpacity\") return layer.opacity;\n const parts = paramPath.split(\".\");\n let target: Record<string, unknown> = layer.params;\n for (let i = 0; i < parts.length - 1; i++) {\n const key = parts[i];\n const next = target[key];\n if (typeof next !== \"object\" || next === null) return 0;\n target = next as Record<string, unknown>;\n }\n const leaf = parts[parts.length - 1];\n const v = target[leaf];\n return typeof v === \"number\" ? v : 0;\n}\n","import type { SceneDocument, EffectLayer } from \"./schema\";\nimport { sceneToConfig, textEffectConfigToScene } from \"./migrate\";\nimport type { TextEffectConfig } from \"../types\";\nimport { newLayerId } from \"./schema\";\n\nfunction mixNum(a: number, b: number, t: number): number {\n return Math.round(a + (b - a) * t);\n}\n\nfunction mixFloat(a: number, b: number, t: number): number {\n return a + (b - a) * t;\n}\n\nfunction mixColor(hexA: string, hexB: string, t: number): string {\n const parse = (h: string) => {\n const x = h.replace(\"#\", \"\");\n const n = parseInt(\n x.length === 3\n ? x\n .split(\"\")\n .map((c) => c + c)\n .join(\"\")\n : x,\n 16,\n );\n return { r: (n >> 16) & 255, g: (n >> 8) & 255, b: n & 255 };\n };\n try {\n const a = parse(hexA);\n const b = parse(hexB);\n const r = Math.round(a.r + (b.r - a.r) * t);\n const g = Math.round(a.g + (b.g - a.g) * t);\n const bl = Math.round(a.b + (b.b - a.b) * t);\n return `#${((1 << 24) + (r << 16) + (g << 8) + bl).toString(16).slice(1).toUpperCase()}`;\n } catch {\n return t > 0.5 ? hexB : hexA;\n }\n}\n\nfunction blendLayerParams(paramsA: Record<string, unknown>, paramsB: Record<string, unknown>, t: number): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n const keys = new Set([...Object.keys(paramsA), ...Object.keys(paramsB)]);\n for (const key of keys) {\n const a = paramsA[key];\n const b = paramsB[key];\n if (typeof a === \"number\" && typeof b === \"number\") {\n out[key] = Number.isInteger(a) && Number.isInteger(b) ? mixNum(a, b, t) : mixFloat(a, b, t);\n } else if (typeof a === \"string\" && typeof b === \"string\" && a.startsWith(\"#\") && b.startsWith(\"#\")) {\n out[key] = mixColor(a, b, t);\n } else if (Array.isArray(a) && Array.isArray(b) && key === \"fillGradientStops\") {\n out[key] = a.map((stopA: { color: string; offset: number }, i: number) => {\n const stopB = (b as typeof a)[i] || stopA;\n return {\n color: mixColor(stopA.color, stopB.color, t),\n offset: mixNum(stopA.offset, stopB.offset, t),\n };\n });\n } else {\n out[key] = t > 0.5 ? b : a;\n }\n }\n return out;\n}\n\nfunction matchLayersByType(a: EffectLayer[], b: EffectLayer[]): Array<[EffectLayer | null, EffectLayer | null]> {\n const pairs: Array<[EffectLayer | null, EffectLayer | null]> = [];\n const types = new Set([...a.map((l) => l.type), ...b.map((l) => l.type)]);\n for (const type of types) {\n const la = a.filter((l) => l.type === type);\n const lb = b.filter((l) => l.type === type);\n const max = Math.max(la.length, lb.length);\n for (let i = 0; i < max; i++) {\n pairs.push([la[i] ?? null, lb[i] ?? null]);\n }\n }\n return pairs;\n}\n\n/** Blend two scenes by layer params (Lab preset blend) */\nexport function blendScenes(sceneA: SceneDocument, sceneB: SceneDocument, ratio: number): SceneDocument {\n const pairs = matchLayersByType(sceneA.effectLayers, sceneB.effectLayers);\n const layers: EffectLayer[] = [];\n\n for (const [la, lb] of pairs) {\n if (!la && lb) {\n layers.push({ ...lb, id: newLayerId(), opacity: lb.opacity * ratio });\n continue;\n }\n if (la && !lb) {\n layers.push({ ...la, id: newLayerId(), opacity: la.opacity * (1 - ratio) });\n continue;\n }\n if (!la || !lb) continue;\n layers.push({\n ...la,\n id: newLayerId(),\n enabled: ratio > 0.5 ? lb.enabled : la.enabled,\n opacity: mixFloat(la.opacity, lb.opacity, ratio),\n params: blendLayerParams(la.params, lb.params, ratio),\n });\n }\n\n return {\n version: 1,\n effectName: ratio > 0.5 ? sceneB.effectName : sceneA.effectName,\n canvas: {\n width: mixNum(sceneA.canvas.width, sceneB.canvas.width, ratio),\n height: mixNum(sceneA.canvas.height, sceneB.canvas.height, ratio),\n background: sceneA.canvas.background,\n },\n text: {\n content: sceneA.text.content,\n fontFamily: ratio > 0.5 ? sceneB.text.fontFamily : sceneA.text.fontFamily,\n fontWeight: ratio > 0.5 ? sceneB.text.fontWeight : sceneA.text.fontWeight,\n fontStyle: ratio > 0.5 ? sceneB.text.fontStyle : sceneA.text.fontStyle,\n fontSize: mixNum(sceneA.text.fontSize, sceneB.text.fontSize, ratio),\n letterSpacing: mixNum(sceneA.text.letterSpacing, sceneB.text.letterSpacing, ratio),\n lineHeight: mixFloat(sceneA.text.lineHeight, sceneB.text.lineHeight, ratio),\n textPosX: ratio > 0.5 ? sceneB.text.textPosX : sceneA.text.textPosX,\n textPosY: ratio > 0.5 ? sceneB.text.textPosY : sceneA.text.textPosY,\n },\n effectLayers: layers,\n customEngineId: ratio > 0.5 ? sceneB.customEngineId : sceneA.customEngineId,\n engineParams: sceneA.engineParams && sceneB.engineParams ? blendLayerParams(sceneA.engineParams as Record<string, unknown>, sceneB.engineParams as Record<string, unknown>, ratio) : ratio > 0.5 ? sceneB.engineParams : sceneA.engineParams,\n compositor: {\n blur: mixFloat(sceneA.compositor.blur, sceneB.compositor.blur, ratio),\n bloom: mixFloat(sceneA.compositor.bloom, sceneB.compositor.bloom, ratio),\n bloomThreshold: mixFloat(sceneA.compositor.bloomThreshold ?? 0.6, sceneB.compositor.bloomThreshold ?? 0.6, ratio),\n },\n timeline: ratio > 0.5 ? sceneB.timeline : sceneA.timeline,\n };\n}\n\nexport function blendConfigs(cfgA: TextEffectConfig, cfgB: TextEffectConfig, ratio: number): TextEffectConfig {\n return sceneToConfig(blendScenes(textEffectConfigToScene(cfgA), textEffectConfigToScene(cfgB), ratio));\n}\n","import type { TextEffectConfig } from \"../types\";\nimport type { SceneDocument } from \"./schema\";\nimport { textEffectConfigToScene, sceneToConfig } from \"./migrate\";\n\nexport function parseHistorySnapshot(raw: string): {\n scene: SceneDocument;\n config: TextEffectConfig;\n} {\n const parsed = JSON.parse(raw) as SceneDocument | TextEffectConfig;\n if (typeof parsed === \"object\" && parsed !== null && \"version\" in parsed && (parsed as SceneDocument).version === 1 && Array.isArray((parsed as SceneDocument).effectLayers)) {\n const scene = parsed as SceneDocument;\n return { scene, config: sceneToConfig(scene) };\n }\n const config = parsed as TextEffectConfig;\n return { scene: textEffectConfigToScene(config), config };\n}\n\nexport function snapshotScene(scene: SceneDocument): string {\n return JSON.stringify(scene);\n}\n","import type { AnimTrack, Keyframe, SceneDocument } from \"./schema\";\nimport { readLayerScalar } from \"./animatableParams\";\n\nexport function trackId(track: AnimTrack): string {\n return `${track.layerId}::${track.paramPath}`;\n}\n\nexport function findTrackIndex(doc: SceneDocument, layerId: string, paramPath: string): number {\n return doc.timeline.tracks.findIndex(\n (t) => t.layerId === layerId && t.paramPath === paramPath\n );\n}\n\nexport function getLayerById(doc: SceneDocument, layerId: string) {\n return doc.effectLayers.find((l) => l.id === layerId);\n}\n\nexport function updateTimeline(\n doc: SceneDocument,\n patch: Partial<SceneDocument[\"timeline\"]>\n): SceneDocument {\n return { ...doc, timeline: { ...doc.timeline, ...patch } };\n}\n\nexport function setTracks(doc: SceneDocument, tracks: AnimTrack[]): SceneDocument {\n return updateTimeline(doc, { tracks });\n}\n\nexport function pruneTracksForLayer(doc: SceneDocument, layerId: string): SceneDocument {\n return setTracks(\n doc,\n doc.timeline.tracks.filter((t) => t.layerId !== layerId)\n );\n}\n\nexport function addTrack(\n doc: SceneDocument,\n layerId: string,\n paramPath: string,\n initialKeyframes?: Keyframe[]\n): SceneDocument {\n if (findTrackIndex(doc, layerId, paramPath) >= 0) return doc;\n const layer = getLayerById(doc, layerId);\n const base = layer ? readLayerScalar(layer, paramPath) : 0;\n const track: AnimTrack = {\n layerId,\n paramPath,\n keyframes: initialKeyframes ?? [{ time: 0, value: base, easing: \"easeInOut\" }],\n };\n return setTracks(doc, [...doc.timeline.tracks, track]);\n}\n\nexport function removeTrack(doc: SceneDocument, trackIndex: number): SceneDocument {\n const tracks = doc.timeline.tracks.filter((_, i) => i !== trackIndex);\n return setTracks(doc, tracks);\n}\n\nexport function updateTrack(\n doc: SceneDocument,\n trackIndex: number,\n updater: (track: AnimTrack) => AnimTrack\n): SceneDocument {\n const tracks = doc.timeline.tracks.map((t, i) => (i === trackIndex ? updater(t) : t));\n return setTracks(doc, tracks);\n}\n\nexport function sortKeyframes(keyframes: Keyframe[]): Keyframe[] {\n return [...keyframes].sort((a, b) => a.time - b.time);\n}\n\nconst KEYFRAME_MERGE_EPS = 0.04;\n\nexport function upsertKeyframe(\n track: AnimTrack,\n time: number,\n value?: number,\n easing?: Keyframe[\"easing\"]\n): AnimTrack {\n const clampedTime = Math.max(0, time);\n const existingIdx = track.keyframes.findIndex(\n (k) => Math.abs(k.time - clampedTime) < KEYFRAME_MERGE_EPS\n );\n if (existingIdx >= 0) {\n const next = [...track.keyframes];\n next[existingIdx] = {\n ...next[existingIdx],\n time: clampedTime,\n value: value ?? next[existingIdx].value,\n easing: easing ?? next[existingIdx].easing,\n };\n return { ...track, keyframes: sortKeyframes(next) };\n }\n const resolvedValue = value ?? (track.keyframes[0]?.value ?? 0);\n return {\n ...track,\n keyframes: sortKeyframes([\n ...track.keyframes,\n { time: clampedTime, value: resolvedValue, easing: easing ?? \"easeInOut\" },\n ]),\n };\n}\n\nexport function addKeyframeAtTime(\n doc: SceneDocument,\n trackIndex: number,\n time: number,\n value?: number\n): SceneDocument {\n return updateTrack(doc, trackIndex, (track) => {\n const layer = getLayerById(doc, track.layerId);\n const resolved =\n value ?? (layer ? readLayerScalar(layer, track.paramPath) : track.keyframes[0]?.value ?? 0);\n return upsertKeyframe(track, time, resolved);\n });\n}\n\nexport function moveKeyframe(\n doc: SceneDocument,\n trackIndex: number,\n keyframeIndex: number,\n time: number,\n duration: number\n): SceneDocument {\n const clamped = Math.max(0, Math.min(duration, time));\n return updateTrack(doc, trackIndex, (track) => {\n const kfs = [...track.keyframes];\n if (keyframeIndex < 0 || keyframeIndex >= kfs.length) return track;\n kfs[keyframeIndex] = { ...kfs[keyframeIndex], time: clamped };\n return { ...track, keyframes: sortKeyframes(kfs) };\n });\n}\n\nexport function updateKeyframe(\n doc: SceneDocument,\n trackIndex: number,\n keyframeIndex: number,\n patch: Partial<Keyframe>\n): SceneDocument {\n return updateTrack(doc, trackIndex, (track) => {\n const kfs = track.keyframes.map((k, i) => (i === keyframeIndex ? { ...k, ...patch } : k));\n return { ...track, keyframes: sortKeyframes(kfs) };\n });\n}\n\nexport function removeKeyframe(\n doc: SceneDocument,\n trackIndex: number,\n keyframeIndex: number\n): SceneDocument {\n return updateTrack(doc, trackIndex, (track) => ({\n ...track,\n keyframes: track.keyframes.filter((_, i) => i !== keyframeIndex),\n }));\n}\n\nexport function duplicateTrackAtPlayhead(\n doc: SceneDocument,\n trackIndex: number,\n previewTime: number\n): SceneDocument {\n const track = doc.timeline.tracks[trackIndex];\n if (!track) return doc;\n const layer = getLayerById(doc, track.layerId);\n const value = layer ? readLayerScalar(layer, track.paramPath) : 0;\n return addKeyframeAtTime(doc, trackIndex, previewTime, value);\n}\n"],"mappings":"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","names":["createCanvas","getCanvas2DContext","hexToRgb","layer","hexToRgb","createCanvas","getCanvas2DContext","startX","startY","layer","layer","kf","layer","layer","kf","layer","lastKf","layer","kf","layer","kf","layer","layer"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/engine/textLayout.ts","../src/engine/perCharFill.ts","../src/engine/procedural/utils.ts","../src/engine/procedural/InkBrushEngine.ts","../src/renderer.ts","../src/presets.ts","../src/fontLoader.ts","../src/engine/schema.ts","../src/engine/timelineDefaults.ts","../src/engine/migrate.ts","../src/engine/animation.ts","../src/compositor/index.ts","../src/engine/mask.ts","../src/engine/evaluate.ts","../src/engine/recipes.ts","../src/engine/lottieEditor.ts","../src/engine/lottieParser.ts","../src/engine/lottieInjector.ts","../src/engine/lottieTextAnimations.ts","../src/engine/lottieTextStyle.ts","../src/engine/lottieTemplatePresets.ts","../src/engine/lottieExport.ts","../src/engine/export.ts","../src/engine/lottieGoogleFonts.ts","../src/engine/animatableParams.ts","../src/engine/blend.ts","../src/engine/history.ts","../src/engine/timelineMutations.ts"],"sourcesContent":["/**\n * @clypra/engine — Canvas 2D text effects, Lottie tooling, and animation engine.\n * @version 1.0.0\n */\nexport * from \"./types.js\";\nexport * from \"./renderer.js\";\nexport * from \"./presets.js\";\nexport * from \"./fontLoader.js\";\nexport * from \"./engine/schema.js\";\nexport * from \"./engine/migrate.js\";\nexport * from \"./engine/evaluate.js\";\nexport * from \"./engine/animation.js\";\nexport * from \"./engine/textLayout.js\";\nexport * from \"./engine/recipes.js\";\nexport * from \"./engine/perCharFill.js\";\nexport * from \"./engine/lottieEditor.js\";\nexport * from \"./engine/lottieParser.js\";\nexport * from \"./engine/lottieInjector.js\";\nexport * from \"./engine/lottieTextAnimations.js\";\nexport * from \"./engine/lottieTextStyle.js\";\nexport * from \"./engine/lottieTemplatePresets.js\";\nexport * from \"./engine/lottieExport.js\";\nexport * from \"./engine/export.js\";\nexport * from \"./engine/lottieGoogleFonts.js\";\nexport * from \"./engine/animatableParams.js\";\nexport * from \"./engine/blend.js\";\nexport * from \"./engine/history.js\";\nexport * from \"./engine/mask.js\";\nexport * from \"./engine/timelineDefaults.js\";\nexport * from \"./engine/timelineMutations.js\";\nexport * from \"./compositor/index.js\";\n// Procedural engines\nexport { InkBrushEngine } from \"./engine/procedural/InkBrushEngine.js\";\n","import type { TextEffectConfig } from \"../types\";\n\nexport interface TextLayoutBounds {\n xMin: number;\n yMin: number;\n xMax: number;\n yMax: number;\n maxLineWidth: number;\n textBlockHeight: number;\n}\n\nexport interface TextLayoutResult {\n lines: string[];\n fontSize: number;\n startX: number;\n startY: number;\n align: CanvasTextAlign;\n lineWidths: number[];\n bounds: TextLayoutBounds;\n safeRect: { x: number; y: number; width: number; height: number };\n}\n\nexport interface CompositionPreset {\n id: string;\n label: string;\n width: number;\n height: number;\n description?: string;\n}\n\nexport const COMPOSITION_PRESETS: CompositionPreset[] = [\n { id: \"banner\", label: \"Banner\", width: 800, height: 200, description: \"Lower third / title bar\" },\n { id: \"youtube\", label: \"16:9\", width: 1280, height: 720, description: \"HD thumbnail\" },\n { id: \"square\", label: \"1:1\", width: 1080, height: 1080, description: \"Social square\" },\n { id: \"story\", label: \"9:16\", width: 1080, height: 1920, description: \"Vertical story\" },\n { id: \"wide\", label: \"2:1\", width: 1200, height: 600, description: \"Wide hero\" },\n { id: \"poster\", label: \"3:4\", width: 900, height: 1200, description: \"Poster\" },\n];\n\nfunction measureLine(\n ctx: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D,\n line: string,\n letterSpacing: number\n): number {\n const prev = (ctx as CanvasRenderingContext2D & { letterSpacing?: string }).letterSpacing;\n if (letterSpacing !== 0) {\n (ctx as CanvasRenderingContext2D & { letterSpacing?: string }).letterSpacing = `${letterSpacing}px`;\n }\n const w = ctx.measureText(line || \" \").width;\n (ctx as CanvasRenderingContext2D & { letterSpacing?: string }).letterSpacing = prev ?? \"0px\";\n return w;\n}\n\nfunction getSafeRect(cfg: TextEffectConfig): { x: number; y: number; width: number; height: number } {\n const w = cfg.canvasWidth || 800;\n const h = cfg.canvasHeight || 200;\n const marginX = cfg.panelEnabled ? (cfg.panelPaddingX ?? 40) + 16 : Math.min(48, w * 0.06);\n const marginY = cfg.panelEnabled ? (cfg.panelPaddingY ?? 20) + 16 : Math.min(40, h * 0.1);\n return {\n x: marginX,\n y: marginY,\n width: Math.max(40, w - marginX * 2),\n height: Math.max(24, h - marginY * 2),\n };\n}\n\n/** Soft-wrap paragraphs to fit safe width */\nexport function wrapTextToWidth(\n ctx: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D,\n text: string,\n maxWidth: number,\n letterSpacing: number\n): string[] {\n const paragraphs = text.split(\"\\n\");\n const lines: string[] = [];\n\n for (const para of paragraphs) {\n if (!para.trim()) {\n lines.push(\"\");\n continue;\n }\n const words = para.split(/\\s+/).filter(Boolean);\n let current = \"\";\n for (const word of words) {\n const candidate = current ? `${current} ${word}` : word;\n if (measureLine(ctx, candidate, letterSpacing) <= maxWidth) {\n current = candidate;\n } else {\n if (current) lines.push(current);\n if (measureLine(ctx, word, letterSpacing) > maxWidth) {\n let chunk = \"\";\n for (const ch of word) {\n const tryChunk = chunk + ch;\n if (measureLine(ctx, tryChunk, letterSpacing) <= maxWidth) chunk = tryChunk;\n else {\n if (chunk) lines.push(chunk);\n chunk = ch;\n }\n }\n current = chunk;\n } else {\n current = word;\n }\n }\n }\n if (current) lines.push(current);\n }\n\n return lines.length > 0 ? lines : [\"\"];\n}\n\nfunction layoutWithFontSize(\n ctx: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D,\n cfg: TextEffectConfig,\n fontSize: number,\n lines: string[]\n): TextLayoutResult {\n const cWidth = cfg.canvasWidth || 800;\n const cHeight = cfg.canvasHeight || 200;\n const safe = getSafeRect(cfg);\n const lineHeight = cfg.lineHeight ?? 1.2;\n const letterSpacing = cfg.letterSpacing ?? 0;\n\n const fontStr = `${cfg.fontStyle} ${cfg.fontWeight} ${fontSize}px \"${cfg.fontFamily}\"`;\n ctx.font = fontStr;\n\n const lineWidths = lines.map((line) => measureLine(ctx, line, letterSpacing));\n const maxLineWidth = Math.max(...lineWidths, 1);\n const textBlockHeight = fontSize + (lines.length - 1) * fontSize * lineHeight;\n\n let align: CanvasTextAlign = \"center\";\n let startX = cWidth / 2;\n\n if (cfg.textPosX === \"left\") {\n align = \"left\";\n startX = safe.x;\n } else if (cfg.textPosX === \"right\") {\n align = \"right\";\n startX = safe.x + safe.width;\n } else {\n startX = safe.x + safe.width / 2;\n }\n\n let startY = safe.y + (safe.height - textBlockHeight) / 2 + fontSize * 0.82;\n if (cfg.textPosY === \"top\") {\n startY = safe.y + fontSize * 0.82;\n } else if (cfg.textPosY === \"bottom\") {\n startY = safe.y + safe.height - textBlockHeight + fontSize * 0.82;\n }\n\n let xMin = startX;\n if (align === \"center\") xMin = startX - maxLineWidth / 2;\n else if (align === \"right\") xMin = startX - maxLineWidth;\n\n const yMin = startY - fontSize * 0.85;\n const yMax = startY + (lines.length - 1) * fontSize * lineHeight + fontSize * 0.25;\n\n return {\n lines,\n fontSize,\n startX,\n startY,\n align,\n lineWidths,\n bounds: {\n xMin,\n yMin,\n xMax: xMin + maxLineWidth,\n yMax,\n maxLineWidth,\n textBlockHeight,\n },\n safeRect: safe,\n };\n}\n\nexport function measureTextFits(\n ctx: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D,\n cfg: TextEffectConfig,\n fontSize: number,\n lines: string[]\n): boolean {\n const safe = getSafeRect(cfg);\n const lineHeight = cfg.lineHeight ?? 1.2;\n const layout = layoutWithFontSize(ctx, cfg, fontSize, lines);\n return (\n layout.bounds.maxLineWidth <= safe.width + 1 &&\n layout.bounds.textBlockHeight <= safe.height + 1\n );\n}\n\nexport function computeAutoFitFontSize(\n ctx: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D,\n cfg: TextEffectConfig,\n wrappedLines: string[]\n): number {\n const max = Math.min(cfg.fontSize || 80, 200);\n let lo = 12;\n let hi = max;\n let best = 12;\n\n while (lo <= hi) {\n const mid = Math.floor((lo + hi) / 2);\n if (measureTextFits(ctx, cfg, mid, wrappedLines)) {\n best = mid;\n lo = mid + 1;\n } else {\n hi = mid - 1;\n }\n }\n return best;\n}\n\n/**\n * Layout text for a composition: safe margins, optional wrap + auto-fit.\n */\nexport function computeTextLayout(\n ctx: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D,\n cfg: TextEffectConfig,\n options?: { wrap?: boolean; autoFit?: boolean }\n): TextLayoutResult {\n const safe = getSafeRect(cfg);\n const wrap = options?.wrap ?? true;\n const autoFit = options?.autoFit ?? !!(cfg as TextEffectConfig & { autoFitText?: boolean }).autoFitText;\n\n let lines = cfg.text.split(\"\\n\");\n if (wrap) {\n lines = wrapTextToWidth(ctx, cfg.text, safe.width, cfg.letterSpacing ?? 0);\n }\n\n let fontSize = cfg.fontSize;\n if (autoFit) {\n fontSize = computeAutoFitFontSize(ctx, cfg, lines);\n }\n\n return layoutWithFontSize(ctx, cfg, fontSize, lines);\n}\n\n/** Preview zoom: fit composition inside viewport */\nexport function computeFitZoom(\n viewportWidth: number,\n viewportHeight: number,\n compositionWidth: number,\n compositionHeight: number,\n padding = 48\n): number {\n if (viewportWidth <= 0 || viewportHeight <= 0) return 100;\n const availW = viewportWidth - padding;\n const availH = viewportHeight - padding;\n const scale = Math.min(availW / compositionWidth, availH / compositionHeight);\n return Math.max(25, Math.min(200, Math.floor(scale * 100)));\n}\n","import type { TextEffectConfig } from \"../types\";\n\n/** Visible glyph count (newlines excluded). */\nexport function countTextGlyphs(text: string): number {\n let n = 0;\n for (let i = 0; i < text.length; i++) {\n if (text[i] !== \"\\n\") n++;\n }\n return n;\n}\n\nexport function resizeCharFillColors(\n text: string,\n colors: string[] | undefined,\n fallback: string\n): string[] {\n const n = countTextGlyphs(text);\n const next = colors ? [...colors] : [];\n while (next.length < n) next.push(fallback);\n return next.slice(0, n);\n}\n\nexport function setCharFillColor(\n colors: string[],\n glyphIndex: number,\n color: string\n): string[] {\n const next = [...colors];\n if (glyphIndex >= 0 && glyphIndex < next.length) next[glyphIndex] = color;\n return next;\n}\n\nexport function applyFillColorToAll(colors: string[], color: string): string[] {\n return colors.map(() => color);\n}\n\n/** Simple hue sweep for quick previews */\nexport function rainbowCharFillColors(text: string): string[] {\n const n = countTextGlyphs(text);\n return Array.from({ length: n }, (_, i) => {\n const hue = (i / Math.max(1, n - 1)) * 300;\n return `hsl(${hue}, 85%, 58%)`;\n });\n}\n\nexport interface DrawPerCharTextOptions {\n lines: string[];\n startX: number;\n startY: number;\n lineAdvance: number;\n align: CanvasTextAlign;\n letterSpacing: number;\n charFillColors: string[];\n defaultColor: string;\n mode: \"fill\" | \"stroke\";\n offsetX?: number;\n offsetY?: number;\n}\n\nfunction measureLineWidth(\n ctx: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D,\n line: string,\n letterSpacing: number\n): number {\n if (!line) return 0;\n let w = 0;\n for (let i = 0; i < line.length; i++) {\n w += ctx.measureText(line[i]).width;\n if (i < line.length - 1) w += letterSpacing;\n }\n return w;\n}\n\n/**\n * Draw text one glyph at a time with per-index fill/stroke colors.\n * Letter spacing is applied manually (canvas letterSpacing reset to 0).\n */\nexport function drawPerCharText(\n ctx: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D,\n opts: DrawPerCharTextOptions\n): void {\n const {\n lines,\n startX,\n startY,\n lineAdvance,\n align,\n letterSpacing,\n charFillColors,\n defaultColor,\n mode,\n offsetX = 0,\n offsetY = 0,\n } = opts;\n\n ctx.save();\n const prevSpacing = (ctx as CanvasRenderingContext2D & { letterSpacing?: string }).letterSpacing;\n (ctx as CanvasRenderingContext2D & { letterSpacing?: string }).letterSpacing = \"0px\";\n ctx.textBaseline = \"alphabetic\";\n\n let glyphIndex = 0;\n\n lines.forEach((line, lineIndex) => {\n const py = startY + lineIndex * lineAdvance;\n const lineWidth = measureLineWidth(ctx, line, letterSpacing);\n let x = startX;\n if (align === \"center\") x = startX - lineWidth / 2;\n else if (align === \"right\") x = startX - lineWidth;\n\n for (let i = 0; i < line.length; i++) {\n const ch = line[i];\n const color = charFillColors[glyphIndex] ?? defaultColor;\n if (mode === \"fill\") ctx.fillStyle = color;\n else ctx.strokeStyle = color;\n\n const drawX = x + offsetX;\n const drawY = py + offsetY;\n if (mode === \"fill\") ctx.fillText(ch, drawX, drawY);\n else ctx.strokeText(ch, drawX, drawY);\n\n x += ctx.measureText(ch).width + letterSpacing;\n glyphIndex++;\n }\n });\n\n (ctx as CanvasRenderingContext2D & { letterSpacing?: string }).letterSpacing = prevSpacing ?? \"0px\";\n ctx.restore();\n}\n\nexport function shouldUsePerCharFill(cfg: TextEffectConfig): boolean {\n return (\n !!cfg.perCharFillEnabled &&\n cfg.fillType === \"solid\" &&\n !cfg.customRenderer &&\n (cfg.charFillColors?.length ?? 0) > 0\n );\n}\n","import { TextEffectConfig } from \"../../types\";\n\nexport type Canvas2DContext = CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D;\ntype NodeCanvasFactory = (width: number, height: number) => HTMLCanvasElement;\n\nexport function createCanvas(w: number, h: number): HTMLCanvasElement | OffscreenCanvas {\n if (typeof document !== \"undefined\") {\n const canvas = document.createElement(\"canvas\");\n canvas.width = w;\n canvas.height = h;\n return canvas;\n }\n if (typeof OffscreenCanvas !== \"undefined\") {\n return new OffscreenCanvas(w, h);\n }\n const runtimeCanvasFactory = (globalThis as typeof globalThis & { __clypraCreateCanvas?: NodeCanvasFactory }).__clypraCreateCanvas;\n if (runtimeCanvasFactory) {\n return runtimeCanvasFactory(w, h);\n }\n try {\n // Keep the native canvas package out of Vite/esbuild browser prebundles.\n const nodeRequire = (0, eval)(\"require\") as (id: string) => unknown;\n const nodeCanvas = nodeRequire(\"@napi-rs/canvas\") as {\n createCanvas: (width: number, height: number) => HTMLCanvasElement;\n };\n return nodeCanvas.createCanvas(w, h);\n } catch {\n throw new Error(\"No canvas implementation found in this environment.\");\n }\n}\n\nexport function getCanvas2DContext(canvas: HTMLCanvasElement | OffscreenCanvas): Canvas2DContext | null {\n return canvas.getContext(\"2d\") as Canvas2DContext | null;\n}\n\nexport function seededRandom(seed: number): () => number {\n let s = seed;\n return function () {\n s = (s * 16807) % 2147483647;\n return (s - 1) / 2147483646;\n };\n}\n\nexport function textSeed(text: string): number {\n return (text.split(\"\").reduce((acc, c) => acc + c.charCodeAt(0), 0) * 9301) % 49297;\n}\n\nexport function hexToRgb(hex: string): { r: number; g: number; b: number } {\n const shorthandRegex = /^#?([a-f\\d])([a-f\\d])([a-f\\d])$/i;\n const fullHex = hex.replace(shorthandRegex, (m, r, g, b) => r + r + g + g + b + b);\n const result = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(fullHex);\n return result\n ? {\n r: parseInt(result[1], 16),\n g: parseInt(result[2], 16),\n b: parseInt(result[3], 16),\n }\n : { r: 255, g: 255, b: 255 };\n}\n\nexport function mixHexColor(colorA: string, colorB: string, ratio: number): string {\n const rgbA = hexToRgb(colorA);\n const rgbB = hexToRgb(colorB);\n const r = Math.round(rgbA.r + (rgbB.r - rgbA.r) * ratio);\n const g = Math.round(rgbA.g + (rgbB.g - rgbA.g) * ratio);\n const b = Math.round(rgbA.b + (rgbB.b - rgbA.b) * ratio);\n const toHex = (c: number) => {\n const s = Math.max(0, Math.min(255, c)).toString(16);\n return s.length === 1 ? \"0\" + s : s;\n };\n return `#${toHex(r)}${toHex(g)}${toHex(b)}`;\n}\n\nexport function hexToRgba(hex: string, alpha: number): string {\n const rgb = hexToRgb(hex);\n return `rgba(${rgb.r}, ${rgb.g}, ${rgb.b}, ${alpha})`;\n}\n","import { TextEffectConfig } from \"../../types\";\nimport { createCanvas, getCanvas2DContext, seededRandom, textSeed, hexToRgb } from \"./utils\";\n\nexport class InkBrushEngine {\n private cfg: Required<TextEffectConfig>;\n private bristleLines: Array<{ y: number; x0: number; x1: number; opacity: number; lineWidth: number }> = [];\n private grainDots: Array<{ x: number; y: number; opacity: number }> = [];\n private drips: Array<{\n x: number;\n startY: number;\n length: number;\n startWidth: number;\n endWidth: number;\n startOpacity: number;\n hasBlob: boolean;\n blobRadius: number;\n }> = [];\n\n constructor(config: Partial<TextEffectConfig>) {\n const defaults: Required<TextEffectConfig> = {\n text: \"INK\",\n effectName: \"InkBrush\",\n fontFamily: \"Bebas Neue\",\n fontWeight: 900,\n fontStyle: \"italic\",\n fontSize: 96,\n letterSpacing: 2,\n lineHeight: 1.1,\n wrapText: true,\n autoFitText: false,\n perCharFillEnabled: false,\n charFillColors: [],\n fillType: \"solid\",\n fillColor: \"#FFFFFF\",\n fillGradientAngle: 90,\n fillGradientStops: [],\n patternType: \"chalk\",\n strokeEnabled: false,\n strokeColor: \"#000000\",\n strokeWidth: 0,\n strokePosition: \"outside\",\n strokeOpacity: 100,\n strokeLineJoin: \"round\",\n strokeBlur: 0,\n strokeType: \"single\",\n strokeColorSecondary: \"#FFFFFF\",\n strokeWidthSecondary: 4,\n strokeFadeRange: 0,\n glowLayers: [],\n shadowEnabled: false,\n shadowColor: \"#000000\",\n shadowBlur: 10,\n shadowOffsetX: 5,\n shadowOffsetY: 5,\n shadowOpacity: 80,\n shadowType: \"drop\",\n bevelEnabled: false,\n bevelDepth: 5,\n bevelHighlight: \"#FFFFFF\",\n bevelShadow: \"#000000\",\n bevelDirection: \"bottom-right\",\n bevelCoreColor: \"#000000\",\n bevelEdgeColor: \"#2A2A38\",\n bevelEdgeWidth: 0,\n bevelBlur: 0,\n bevelBlurColor: \"#000000\",\n bevelPerspectiveEnabled: false,\n bevelVanishingPointX: 40,\n bevelVanishingPointY: 80,\n bevelFocalLength: 400,\n stackEnabled: false,\n stackCount: 3,\n stackOffsetX: 10,\n stackOffsetY: -10,\n stackOpacityDecay: 20,\n stackColor1: \"#FF7C00\",\n stackColor2: \"#00FFDD\",\n stackColor3: \"#FF00AA\",\n stackColor4: \"#AA00FF\",\n panelEnabled: false,\n panelColor: \"#1E1E26\",\n panelOpacity: 80,\n panelRadius: 12,\n panelPaddingX: 40,\n panelPaddingY: 20,\n panelStrokeEnabled: false,\n panelStrokeColor: \"#2A2A38\",\n panelStrokeWidth: 2,\n canvasWidth: 800,\n canvasHeight: 200,\n textPosX: \"center\",\n textPosY: \"middle\",\n inkColor: \"#FFFFFF\",\n bristleDensity: 0.8,\n bristleSkipRate: 0.2,\n dripRate: 0.3,\n dripMaxLength: 40,\n grainDensity: 0.15,\n skewX: -0.2,\n customRenderer: \"InkBrushEngine\",\n };\n\n this.cfg = {\n ...defaults,\n ...config,\n } as Required<TextEffectConfig>;\n\n this.precomputeData();\n }\n\n private precomputeData() {\n const { text, fontFamily, fontWeight, fontStyle, fontSize, letterSpacing, lineHeight, canvasWidth, canvasHeight, textPosX, textPosY, bristleDensity, bristleSkipRate, dripRate, dripMaxLength, grainDensity, skewX } = this.cfg;\n\n const width = canvasWidth;\n const height = canvasHeight;\n\n const rand = seededRandom(textSeed(text));\n\n let canvas = createCanvas(width, height);\n\n canvas.width = width;\n canvas.height = height;\n const ctx = getCanvas2DContext(canvas);\n if (!ctx) return;\n\n const lines = text.split(\"\\n\");\n const numLines = lines.length;\n const textBlockHeight = fontSize + (numLines - 1) * fontSize * lineHeight;\n\n let startX = width / 2;\n let align: CanvasTextAlign = \"center\";\n if (textPosX === \"left\") {\n startX = 50;\n align = \"left\";\n } else if (textPosX === \"right\") {\n startX = width - 50;\n align = \"right\";\n }\n ctx.textAlign = align;\n ctx.textBaseline = \"alphabetic\";\n\n const fontStr = `${fontStyle} ${fontWeight} ${fontSize}px \"${fontFamily}\"`;\n ctx.font = fontStr;\n\n if (letterSpacing !== 0) {\n (ctx as any).letterSpacing = `${letterSpacing}px`;\n }\n\n let startY = (height - textBlockHeight) / 2 + fontSize * 0.8;\n if (textPosY === \"top\") {\n startY = 40 + fontSize * 0.8;\n } else if (textPosY === \"bottom\") {\n startY = height - 40 - textBlockHeight + fontSize * 0.8;\n }\n\n ctx.save();\n if (skewX !== 0) {\n ctx.transform(1, 0, skewX, 1, 0, 0);\n }\n\n ctx.fillStyle = \"#FFFFFF\";\n lines.forEach((line, index) => {\n const py = startY + index * fontSize * lineHeight;\n ctx.fillText(line, startX, py);\n });\n ctx.restore();\n\n const imgData = ctx.getImageData(0, 0, width, height);\n const pixels = imgData.data;\n\n let minY = height;\n let maxY = 0;\n for (let y = 0; y < height; y++) {\n for (let x = 0; x < width; x++) {\n const idx = (y * width + x) * 4;\n if (pixels[idx + 3] > 128) {\n if (y < minY) minY = y;\n if (y > maxY) maxY = y;\n }\n }\n }\n\n if (minY >= maxY) return;\n\n // Generate bristle lines\n const step = Math.max(1, Math.min(3, 1 / bristleDensity));\n for (let y = minY; y <= maxY; y += step) {\n const segments: Array<{ xStart: number; xEnd: number }> = [];\n let inSegment = false;\n let xStart = 0;\n const targetY = Math.floor(y);\n\n for (let x = 0; x < width; x++) {\n const idx = (targetY * width + x) * 4;\n const isInside = pixels[idx + 3] > 128;\n if (isInside && !inSegment) {\n inSegment = true;\n xStart = x;\n } else if (!isInside && inSegment) {\n inSegment = false;\n segments.push({ xStart, xEnd: x - 1 });\n }\n }\n if (inSegment) {\n segments.push({ xStart, xEnd: width - 1 });\n }\n\n for (const seg of segments) {\n if (rand() < bristleSkipRate) continue;\n\n const segW = seg.xEnd - seg.xStart;\n const startLimit = seg.xStart + rand() * Math.min(15, segW * 0.2);\n const endLimit = seg.xEnd - rand() * Math.min(15, segW * 0.2);\n\n if (startLimit >= endLimit) continue;\n\n const opacity = 0.4 + rand() * 0.6;\n const lw = 0.5 + rand() * 1.5;\n\n const hasGap = rand() < 0.1;\n if (hasGap) {\n const gapPct = 0.3 + rand() * 0.4;\n const gapLen = 5 + rand() * 15;\n const midX = startLimit + (endLimit - startLimit) * gapPct;\n\n const p1Start = startLimit;\n const p1End = Math.max(startLimit, midX - gapLen / 2);\n const p2Start = Math.min(endLimit, midX + gapLen / 2);\n const p2End = endLimit;\n\n if (p1End > p1Start) {\n this.bristleLines.push({ y: targetY, x0: p1Start, x1: p1End, opacity, lineWidth: lw });\n }\n if (p2End > p2Start) {\n this.bristleLines.push({ y: targetY, x0: p2Start, x1: p2End, opacity, lineWidth: lw });\n }\n } else {\n this.bristleLines.push({ y: targetY, x0: startLimit, x1: endLimit, opacity, lineWidth: lw });\n }\n }\n }\n\n // Generate grain dots\n for (let y = minY; y <= maxY; y++) {\n for (let x = 0; x < width; x++) {\n const idx = (y * width + x) * 4;\n if (pixels[idx + 3] > 128) {\n if (rand() < grainDensity) {\n this.grainDots.push({\n x,\n y,\n opacity: 0.2 + rand() * 0.3,\n });\n }\n }\n }\n }\n\n // Identify bottom edge pixels for drip column mapping\n const bottomRowForCol = new Array(width).fill(-1);\n for (let x = 0; x < width; x++) {\n for (let y = height - 1; y >= 0; y--) {\n const idx = (y * width + x) * 4;\n if (pixels[idx + 3] > 128) {\n bottomRowForCol[x] = y;\n break;\n }\n }\n }\n\n // Generate drips\n for (let x = 0; x < width; x++) {\n const sY = bottomRowForCol[x];\n if (sY === -1) continue;\n\n if (rand() < dripRate) {\n const length = 8 + rand() * (dripMaxLength - 8);\n const startWidth = 1 + rand() * 1;\n const endWidth = rand() < 0.5 ? startWidth : 0.5;\n const startOpacity = 0.6 + rand() * 0.3;\n const hasBlob = rand() < 0.6;\n const blobRadius = 1.5 + rand() * 1.5;\n\n this.drips.push({\n x,\n startY: sY,\n length,\n startWidth,\n endWidth,\n startOpacity,\n hasBlob,\n blobRadius,\n });\n }\n }\n }\n\n advanceSteps(steps: number) {\n // No-op\n }\n\n drawFrame(ctx: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D) {\n const { text, fontFamily, fontWeight, fontStyle, fontSize, letterSpacing, lineHeight, canvasWidth, canvasHeight, textPosX, textPosY, skewX, inkColor } = this.cfg;\n\n const width = canvasWidth;\n const height = canvasHeight;\n\n ctx.clearRect(0, 0, width, height);\n ctx.imageSmoothingEnabled = true;\n\n const lines = text.split(\"\\n\");\n const numLines = lines.length;\n const textBlockHeight = fontSize + (numLines - 1) * fontSize * lineHeight;\n\n let startX = width / 2;\n let align: CanvasTextAlign = \"center\";\n if (textPosX === \"left\") {\n startX = 50;\n align = \"left\";\n } else if (textPosX === \"right\") {\n startX = width - 50;\n align = \"right\";\n }\n ctx.textAlign = align;\n ctx.textBaseline = \"alphabetic\";\n\n const fontStr = `${fontStyle} ${fontWeight} ${fontSize}px \"${fontFamily}\"`;\n ctx.font = fontStr;\n\n if (letterSpacing !== 0) {\n (ctx as any).letterSpacing = `${letterSpacing}px`;\n }\n\n let startY = (height - textBlockHeight) / 2 + fontSize * 0.8;\n if (textPosY === \"top\") {\n startY = 40 + fontSize * 0.8;\n } else if (textPosY === \"bottom\") {\n startY = height - 40 - textBlockHeight + fontSize * 0.8;\n }\n\n ctx.save();\n if (skewX !== 0) {\n ctx.transform(1, 0, skewX, 1, 0, 0);\n }\n\n // Phase A Text clip mask draw\n ctx.fillStyle = inkColor;\n lines.forEach((line, index) => {\n const py = startY + index * fontSize * lineHeight;\n ctx.fillText(line, startX, py);\n });\n ctx.restore();\n\n ctx.save();\n\n // Phase B Brush fill horizontal strokes clipped under source-in\n ctx.globalCompositeOperation = \"source-in\";\n\n ctx.strokeStyle = inkColor;\n this.bristleLines.forEach((line) => {\n ctx.globalAlpha = line.opacity;\n ctx.lineWidth = line.lineWidth;\n ctx.beginPath();\n ctx.moveTo(line.x0, line.y);\n ctx.lineTo(line.x1, line.y);\n ctx.stroke();\n });\n\n // Noise paper grain pass\n ctx.fillStyle = inkColor;\n this.grainDots.forEach((dot) => {\n ctx.globalAlpha = dot.opacity;\n ctx.fillRect(dot.x, dot.y, 1, 1);\n });\n\n ctx.restore(); // Restores normal source-over composting and unskewed state\n\n const inkRgb = hexToRgb(inkColor);\n\n // Phase C Paint drips\n ctx.save();\n this.drips.forEach((drip) => {\n const grad = ctx.createLinearGradient(drip.x, drip.startY, drip.x, drip.startY + drip.length);\n grad.addColorStop(0, `rgba(${inkRgb.r}, ${inkRgb.g}, ${inkRgb.b}, ${drip.startOpacity})`);\n grad.addColorStop(1, `rgba(${inkRgb.r}, ${inkRgb.g}, ${inkRgb.b}, 0)`);\n\n ctx.strokeStyle = grad;\n ctx.lineWidth = drip.startWidth;\n\n ctx.beginPath();\n ctx.moveTo(drip.x, drip.startY);\n ctx.lineTo(drip.x, drip.startY + drip.length);\n ctx.stroke();\n\n if (drip.hasBlob) {\n ctx.fillStyle = `rgba(${inkRgb.r}, ${inkRgb.g}, ${inkRgb.b}, ${drip.startOpacity * 0.5})`;\n ctx.beginPath();\n ctx.arc(drip.x, drip.startY + drip.length, drip.blobRadius, 0, Math.PI * 2);\n ctx.fill();\n }\n });\n ctx.restore();\n }\n}\n","import { TextEffectConfig, GradientStop, GlowLayer } from \"./types\";\nimport { computeTextLayout } from \"./engine/textLayout\";\nimport { drawPerCharText, shouldUsePerCharFill } from \"./engine/perCharFill\";\nimport { InkBrushEngine } from \"./engine/procedural/InkBrushEngine\";\n\ntype Canvas2DContext = CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D;\ntype NodeCanvasFactory = (width: number, height: number) => HTMLCanvasElement;\n\nfunction createCanvas(w: number, h: number): HTMLCanvasElement | OffscreenCanvas {\n if (typeof document !== \"undefined\") {\n const canvas = document.createElement(\"canvas\");\n canvas.width = w;\n canvas.height = h;\n return canvas;\n }\n if (typeof OffscreenCanvas !== \"undefined\") {\n return new OffscreenCanvas(w, h);\n }\n const runtimeCanvasFactory = (globalThis as typeof globalThis & { __clypraCreateCanvas?: NodeCanvasFactory }).__clypraCreateCanvas;\n if (runtimeCanvasFactory) {\n return runtimeCanvasFactory(w, h);\n }\n try {\n // Keep the native canvas package out of Vite/esbuild browser prebundles.\n const nodeRequire = (0, eval)(\"require\") as (id: string) => unknown;\n const nodeCanvas = nodeRequire(\"@napi-rs/canvas\") as {\n createCanvas: (width: number, height: number) => HTMLCanvasElement;\n };\n return nodeCanvas.createCanvas(w, h);\n } catch {\n throw new Error(\"No canvas implementation found in this environment.\");\n }\n}\n\nfunction getCanvas2DContext(canvas: HTMLCanvasElement | OffscreenCanvas): Canvas2DContext | null {\n return canvas.getContext(\"2d\") as Canvas2DContext | null;\n}\n\nfunction seededRandom(seed: number): () => number {\n let s = seed;\n return function () {\n s = (s * 16807) % 2147483647;\n return (s - 1) / 2147483646;\n };\n}\n\nfunction textSeed(text: string): number {\n return (text.split(\"\").reduce((acc, c) => acc + c.charCodeAt(0), 0) * 9301) % 49297;\n}\n\nfunction hexToRgb(hex: string): { r: number; g: number; b: number } {\n const shorthandRegex = /^#?([a-f\\d])([a-f\\d])([a-f\\d])$/i;\n const fullHex = hex.replace(shorthandRegex, (m, r, g, b) => r + r + g + g + b + b);\n const result = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(fullHex);\n return result\n ? {\n r: parseInt(result[1], 16),\n g: parseInt(result[2], 16),\n b: parseInt(result[3], 16),\n }\n : { r: 255, g: 255, b: 255 };\n}\n\nfunction mixHexColor(colorA: string, colorB: string, ratio: number): string {\n const rgbA = hexToRgb(colorA);\n const rgbB = hexToRgb(colorB);\n const r = Math.round(rgbA.r + (rgbB.r - rgbA.r) * ratio);\n const g = Math.round(rgbA.g + (rgbB.g - rgbA.g) * ratio);\n const b = Math.round(rgbA.b + (rgbB.b - rgbA.b) * ratio);\n const toHex = (c: number) => {\n const s = Math.max(0, Math.min(255, c)).toString(16);\n return s.length === 1 ? \"0\" + s : s;\n };\n return `#${toHex(r)}${toHex(g)}${toHex(b)}`;\n}\n\nexport function renderTextEffectCore(ctx: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D, cfg: TextEffectConfig): void {\n if (cfg.customRenderer === \"InkBrushEngine\") {\n const engine = new InkBrushEngine(cfg);\n engine.drawFrame(ctx);\n return;\n }\n\n const { text, fontFamily, fontWeight, fontStyle, fontSize, letterSpacing, lineHeight, fillType, fillColor, fillGradientAngle, fillGradientStops, patternType, strokeEnabled, strokeColor, strokeWidth, strokePosition, strokeOpacity, strokeLineJoin, strokeBlur, strokeType, strokeColorSecondary, strokeWidthSecondary, strokeFadeRange, glowLayers, shadowEnabled, shadowColor, shadowBlur, shadowOffsetX, shadowOffsetY, shadowOpacity, shadowType, bevelEnabled, bevelDepth, bevelHighlight, bevelShadow, bevelDirection, bevelCoreColor, bevelEdgeColor, bevelEdgeWidth, bevelBlur, bevelBlurColor, bevelPerspectiveEnabled, bevelVanishingPointX, bevelVanishingPointY, bevelFocalLength, stackEnabled, stackCount, stackOffsetX, stackOffsetY, stackOpacityDecay, stackColor1, stackColor2, stackColor3, stackColor4, panelEnabled, panelColor, panelOpacity, panelRadius, panelPaddingX, panelPaddingY, panelStrokeEnabled, panelStrokeColor, panelStrokeWidth, canvasWidth, canvasHeight, textPosX, textPosY } = cfg;\n\n // 1. Initial configuration\n ctx.imageSmoothingEnabled = true;\n\n ctx.lineJoin = strokeLineJoin;\n\n const cWidth = canvasWidth || 800;\n const cHeight = canvasHeight || 200;\n\n const layout = computeTextLayout(ctx, cfg, {\n wrap: cfg.wrapText !== false,\n autoFit: !!cfg.autoFitText,\n });\n\n const lines = layout.lines;\n const numLines = lines.length;\n const effectiveFontSize = layout.fontSize;\n const lineAdvance = effectiveFontSize * lineHeight;\n const textBlockHeight = layout.bounds.textBlockHeight;\n let startX = layout.startX;\n let startY = layout.startY;\n const align = layout.align;\n const maxLineWidth = layout.bounds.maxLineWidth;\n const lineWidths = layout.lineWidths;\n\n const fontStr = `${fontStyle} ${fontWeight} ${effectiveFontSize}px \"${fontFamily}\"`;\n ctx.font = fontStr;\n ctx.textAlign = align;\n if (letterSpacing !== 0) {\n (ctx as any).letterSpacing = `${letterSpacing}px`;\n }\n\n let xMin = layout.bounds.xMin;\n let xMax = layout.bounds.xMax;\n let yMin = layout.bounds.yMin;\n let yMax = layout.bounds.yMax;\n\n // Calculate 3D extrusion offsets and shift coordinate system to center the entire block\n let shiftX_half = 0;\n let shiftY_half = 0;\n\n if (bevelEnabled && bevelDepth > 0) {\n if (bevelPerspectiveEnabled) {\n const vpx = cWidth / 2 + ((bevelVanishingPointX !== undefined ? bevelVanishingPointX : 40) / 100) * (cWidth / 2);\n const vpy = cHeight / 2 + ((bevelVanishingPointY !== undefined ? bevelVanishingPointY : 80) / 100) * (cHeight / 2);\n const fl = Math.max(100, bevelFocalLength !== undefined ? bevelFocalLength : 400);\n const scale = fl / (fl + bevelDepth);\n const shiftX_back = (vpx - startX) * (1 - scale);\n const shiftY_back = (vpy - startY) * (1 - scale);\n shiftX_half = shiftX_back / 2;\n shiftY_half = shiftY_back / 2;\n } else {\n let dx = 0;\n let dy = 0;\n if (bevelDirection === \"bottom-right\") {\n dx = bevelDepth;\n dy = bevelDepth;\n } else if (bevelDirection === \"bottom\") {\n dy = bevelDepth;\n } else if (bevelDirection === \"right\") {\n dx = bevelDepth;\n }\n shiftX_half = dx / 2;\n shiftY_half = dy / 2;\n }\n\n // Shift starting coordinates so the complete 3D box is centered visually\n startX -= shiftX_half;\n startY -= shiftY_half;\n xMin -= shiftX_half;\n xMax -= shiftX_half;\n yMin -= shiftY_half;\n yMax -= shiftY_half;\n }\n\n // Now calculate the exact joint bounding box bounds for the panel (around shifted values)\n let total_xMin = xMin;\n let total_xMax = xMax;\n let total_yMin = yMin;\n let total_yMax = yMax;\n\n if (bevelEnabled && bevelDepth > 0) {\n if (bevelPerspectiveEnabled) {\n const vpx = cWidth / 2 + ((bevelVanishingPointX !== undefined ? bevelVanishingPointX : 40) / 100) * (cWidth / 2);\n const vpy = cHeight / 2 + ((bevelVanishingPointY !== undefined ? bevelVanishingPointY : 80) / 100) * (cHeight / 2);\n const fl = Math.max(100, bevelFocalLength !== undefined ? bevelFocalLength : 400);\n const scale = fl / (fl + bevelDepth);\n\n const x_new_left = vpx + (xMin - vpx) * scale;\n const x_new_right = vpx + (xMax - vpx) * scale;\n const y_new_top = vpy + (yMin - vpy) * scale;\n const y_new_bottom = vpy + (yMax - vpy) * scale;\n\n total_xMin = Math.min(xMin, x_new_left, x_new_right);\n total_xMax = Math.max(xMax, x_new_left, x_new_right);\n total_yMin = Math.min(yMin, y_new_top, y_new_bottom);\n total_yMax = Math.max(yMax, y_new_top, y_new_bottom);\n } else {\n let dx = 0;\n let dy = 0;\n if (bevelDirection === \"bottom-right\") {\n dx = bevelDepth;\n dy = bevelDepth;\n } else if (bevelDirection === \"bottom\") {\n dy = bevelDepth;\n } else if (bevelDirection === \"right\") {\n dx = bevelDepth;\n }\n\n total_xMin = Math.min(xMin, xMin + dx);\n total_xMax = Math.max(xMax, xMax + dx);\n total_yMin = Math.min(yMin, yMin + dy);\n total_yMax = Math.max(yMax, yMax + dy);\n }\n }\n\n // Helper to apply letter spacing to individual lines during render\n const usePerCharFill = shouldUsePerCharFill(cfg);\n const perCharColors = cfg.charFillColors ?? [];\n\n const renderLines = (mode: \"fill\" | \"stroke\", overrideStyle?: string | CanvasGradient | CanvasPattern, offsetX = 0, offsetY = 0, options?: { perCharFill?: boolean }) => {\n if (options?.perCharFill && usePerCharFill && mode === \"fill\" && !overrideStyle) {\n drawPerCharText(ctx, {\n lines,\n startX,\n startY,\n lineAdvance,\n align,\n letterSpacing,\n charFillColors: perCharColors,\n defaultColor: fillColor,\n mode: \"fill\",\n offsetX,\n offsetY,\n });\n return;\n }\n\n const savedLetterSpacing = (ctx as any).letterSpacing || \"normal\";\n if (letterSpacing !== 0) {\n (ctx as any).letterSpacing = `${letterSpacing}px`;\n }\n\n if (overrideStyle) {\n if (mode === \"fill\") {\n ctx.fillStyle = overrideStyle;\n } else {\n ctx.strokeStyle = overrideStyle;\n }\n }\n\n lines.forEach((line, index) => {\n const py = startY + index * lineAdvance;\n if (mode === \"fill\") {\n ctx.fillText(line, startX + offsetX, py + offsetY);\n } else {\n ctx.strokeText(line, startX + offsetX, py + offsetY);\n }\n });\n\n (ctx as any).letterSpacing = savedLetterSpacing;\n };\n\n // Helper using offscreen shadow projection trick\n const renderWithShadowTrick = (mode: \"fill\" | \"stroke\", sColor: string, sBlur: number, sOffsetX: number, sOffsetY: number, opacity: number, overrideStyle = \"#000\", spread = 0) => {\n ctx.save();\n ctx.globalAlpha = opacity / 100;\n\n const shiftX = 10000; // Shift offscreen\n ctx.shadowColor = sColor;\n ctx.shadowBlur = sBlur;\n ctx.shadowOffsetX = shiftX + sOffsetX;\n ctx.shadowOffsetY = sOffsetY;\n\n // Draw text shifted, shadow gets projected back perfectly\n const savedLetterSpacing = (ctx as any).letterSpacing || \"normal\";\n if (letterSpacing !== 0) {\n (ctx as any).letterSpacing = `${letterSpacing}px`;\n }\n\n const prevStyle = mode === \"fill\" ? ctx.fillStyle : ctx.strokeStyle;\n if (mode === \"fill\") {\n ctx.fillStyle = overrideStyle;\n } else {\n ctx.strokeStyle = overrideStyle;\n }\n\n const prevStrokeStyle = ctx.strokeStyle;\n const prevLineWidth = ctx.lineWidth;\n if (spread > 0) {\n ctx.strokeStyle = overrideStyle;\n ctx.lineWidth = spread * 2;\n ctx.lineJoin = strokeLineJoin;\n }\n\n lines.forEach((line, index) => {\n const py = startY + index * lineAdvance;\n if (mode === \"fill\") {\n if (spread > 0) {\n ctx.strokeText(line, startX - shiftX, py);\n }\n ctx.fillText(line, startX - shiftX, py);\n } else {\n ctx.strokeText(line, startX - shiftX, py);\n }\n });\n\n (ctx as any).letterSpacing = savedLetterSpacing;\n if (mode === \"fill\") {\n ctx.fillStyle = prevStyle;\n } else {\n ctx.strokeStyle = prevStyle;\n }\n if (spread > 0) {\n ctx.strokeStyle = prevStrokeStyle;\n ctx.lineWidth = prevLineWidth;\n }\n\n ctx.restore();\n };\n\n // ──────────────────────────────────────────────────────────────────\n // 1. Background Panel\n // ──────────────────────────────────────────────────────────────────\n if (panelEnabled) {\n ctx.save();\n ctx.globalAlpha = panelOpacity / 100;\n ctx.fillStyle = panelColor;\n\n const px = total_xMin - panelPaddingX;\n const py = total_yMin - panelPaddingY;\n const pw = total_xMax - total_xMin + 2 * panelPaddingX;\n const ph = total_yMax - total_yMin + 2 * panelPaddingY;\n\n const cx = px + pw / 2;\n const cy = py + ph / 2;\n\n const isComicBurst = cfg.effectName.toLowerCase().includes(\"comic\") || (cfg as any).panelStyle === \"burst\";\n\n ctx.beginPath();\n if (isComicBurst) {\n // Render a hand-drawn comic book styled jagged explosion\n const numPoints = 36;\n const rx = pw * 0.56;\n const ry = ph * 0.68;\n\n for (let i = 0; i < numPoints; i++) {\n const angle = (i / numPoints) * Math.PI * 2;\n // Organic-looking jagged comic spikes\n const wave1 = Math.sin(angle * 8) * 0.12;\n const wave3 = Math.cos(angle * 14) * 0.05;\n const isSpikePeak = i % 2 === 0;\n const depthFactor = isSpikePeak ? 1.12 + wave1 + wave3 : 0.76 - wave3;\n\n const sx = cx + Math.cos(angle) * rx * depthFactor;\n const sy = cy + Math.sin(angle) * ry * depthFactor;\n if (i === 0) {\n ctx.moveTo(sx, sy);\n } else {\n ctx.lineTo(sx, sy);\n }\n }\n } else {\n ctx.roundRect(px, py, pw, ph, panelRadius);\n }\n ctx.closePath();\n ctx.fill();\n\n if (panelStrokeEnabled) {\n ctx.strokeStyle = panelStrokeColor;\n ctx.lineWidth = panelStrokeWidth;\n const prevLineJoin = ctx.lineJoin;\n if (isComicBurst) {\n ctx.lineJoin = \"miter\";\n }\n ctx.stroke();\n ctx.lineJoin = prevLineJoin;\n }\n ctx.restore();\n }\n\n // ──────────────────────────────────────────────────────────────────\n // 2. Glow Layers (Type: Outer)\n // ──────────────────────────────────────────────────────────────────\n glowLayers.forEach((layer) => {\n if (layer.enabled && layer.type === \"outer\" && layer.opacity > 0) {\n const renderCount = Math.max(1, Math.min(20, layer.strength ?? 1));\n for (let i = 0; i < renderCount; i++) {\n renderWithShadowTrick(\"fill\", layer.color, layer.blur, 0, 0, layer.opacity, \"#000\", layer.spread ?? 0);\n }\n }\n });\n\n // ──────────────────────────────────────────────────────────────────\n // 3. Drop Shadow (Before fill, type \"drop\")\n // ──────────────────────────────────────────────────────────────────\n if (shadowEnabled && shadowType === \"drop\" && shadowOpacity > 0) {\n if (bevelEnabled && bevelDepth > 0) {\n if (bevelPerspectiveEnabled) {\n const vpx = cWidth / 2 + ((bevelVanishingPointX !== undefined ? bevelVanishingPointX : 40) / 100) * (cWidth / 2);\n const vpy = cHeight / 2 + ((bevelVanishingPointY !== undefined ? bevelVanishingPointY : 80) / 100) * (cHeight / 2);\n const fl = Math.max(100, bevelFocalLength !== undefined ? bevelFocalLength : 400);\n const scale = fl / (fl + bevelDepth);\n\n ctx.save();\n ctx.translate(vpx, vpy);\n ctx.scale(scale, scale);\n ctx.translate(-vpx, -vpy);\n\n renderWithShadowTrick(\"fill\", shadowColor, shadowBlur, shadowOffsetX, shadowOffsetY, shadowOpacity);\n ctx.restore();\n } else {\n let dx = 0;\n let dy = 0;\n if (bevelDirection === \"bottom-right\") {\n dx = bevelDepth;\n dy = bevelDepth;\n } else if (bevelDirection === \"bottom\") {\n dy = bevelDepth;\n } else if (bevelDirection === \"right\") {\n dx = bevelDepth;\n }\n\n renderWithShadowTrick(\"fill\", shadowColor, shadowBlur, shadowOffsetX + dx, shadowOffsetY + dy, shadowOpacity);\n }\n } else {\n renderWithShadowTrick(\"fill\", shadowColor, shadowBlur, shadowOffsetX, shadowOffsetY, shadowOpacity);\n }\n }\n\n // ──────────────────────────────────────────────────────────────────\n // 4. Glitch Corrupt Preset custom RGB Split & Scanlines\n // We explicitly handle this aesthetic if enabled\n // ──────────────────────────────────────────────────────────────────\n const isGlitch = cfg.effectName.toLowerCase().includes(\"glitch\") || cfg.text === \"SYSTEM ERR\";\n if (isGlitch) {\n ctx.save();\n // Cyan split offset\n ctx.globalAlpha = 0.8;\n renderLines(\"fill\", \"#00FFFF\", -4, -2);\n // Magenta split offset\n renderLines(\"fill\", \"#FF00FF\", 4, 2);\n ctx.restore();\n }\n\n // ──────────────────────────────────────────────────────────────────\n // 5. Bevel Stacked Copies (3D Bevel) — Gradient-shaded depth faces\n // ──────────────────────────────────────────────────────────────────\n if (bevelEnabled && bevelDepth > 0) {\n // ── Shared helpers ─────────────────────────────────────────────\n const shadowRgb = hexToRgb(bevelShadow || \"#1A0A00\");\n const coreRgb = hexToRgb(bevelCoreColor || bevelShadow || \"#3A1A00\");\n const highlightRgb = hexToRgb(bevelHighlight || \"#FFFFFF\");\n\n /**\n * Interpolate across a 3-stop gradient:\n * t=0 → bevelShadow (deepest back slab)\n * t=0.5 → bevelCoreColor (mid-depth)\n * t=1 → bevelHighlight (closest to front face)\n * Uses ease-in-out curve for more realistic falloff.\n */\n const shadeForDepth = (t: number): string => {\n // ease-in-out\n const eased = t < 0.5 ? 2 * t * t : -1 + (4 - 2 * t) * t;\n if (eased <= 0.5) {\n const u = eased * 2;\n const r = Math.round(shadowRgb.r + (coreRgb.r - shadowRgb.r) * u);\n const g = Math.round(shadowRgb.g + (coreRgb.g - shadowRgb.g) * u);\n const b = Math.round(shadowRgb.b + (coreRgb.b - shadowRgb.b) * u);\n return `rgb(${r},${g},${b})`;\n } else {\n const u = (eased - 0.5) * 2;\n const r = Math.round(coreRgb.r + (highlightRgb.r - coreRgb.r) * u);\n const g = Math.round(coreRgb.g + (highlightRgb.g - coreRgb.g) * u);\n const b = Math.round(coreRgb.b + (highlightRgb.b - coreRgb.b) * u);\n return `rgb(${r},${g},${b})`;\n }\n };\n\n if (bevelPerspectiveEnabled) {\n const vpx = cWidth / 2 + ((bevelVanishingPointX !== undefined ? bevelVanishingPointX : 40) / 100) * (cWidth / 2);\n const vpy = cHeight / 2 + ((bevelVanishingPointY !== undefined ? bevelVanishingPointY : 80) / 100) * (cHeight / 2);\n const fl = Math.max(100, bevelFocalLength !== undefined ? bevelFocalLength : 400);\n\n // 5a. Ambient occlusion / depth glow blur underneath\n if (bevelBlur && bevelBlur > 0) {\n ctx.save();\n ctx.filter = `blur(${bevelBlur}px)`;\n const blurColor = bevelBlurColor || bevelShadow || \"#000000\";\n for (let i = bevelDepth; i > 0; i -= Math.max(1, Math.floor(bevelDepth / 4))) {\n const scale = fl / (fl + i);\n ctx.save();\n ctx.translate(vpx, vpy);\n ctx.scale(scale, scale);\n ctx.translate(-vpx, -vpy);\n renderLines(\"fill\", blurColor);\n ctx.restore();\n }\n ctx.restore();\n }\n\n // 5b. Gradient-shaded extrusion slabs (back to front)\n ctx.save();\n for (let i = bevelDepth; i > 0; i--) {\n // t=0 at deepest slab, t→1 approaching front face\n const t = 1 - (i - 1) / Math.max(1, bevelDepth - 1);\n // Ambient occlusion: deep slabs are darkened further\n const aoFactor = 0.35 + 0.65 * (1 - (i - 1) / Math.max(1, bevelDepth));\n const baseColor = shadeForDepth(t);\n\n // Apply AO darkening by blending base color toward black\n const bRgb = hexToRgb(baseColor.startsWith(\"#\") ? baseColor : \"#000000\");\n const baseRgbParsed = (() => {\n const m = baseColor.match(/rgb\\((\\d+),(\\d+),(\\d+)\\)/);\n return m ? { r: +m[1], g: +m[2], b: +m[3] } : bRgb;\n })();\n const aoColor = `rgb(${Math.round(baseRgbParsed.r * aoFactor)},${Math.round(baseRgbParsed.g * aoFactor)},${Math.round(baseRgbParsed.b * aoFactor)})`;\n\n const scale = fl / (fl + i);\n ctx.save();\n ctx.translate(vpx, vpy);\n ctx.scale(scale, scale);\n ctx.translate(-vpx, -vpy);\n renderLines(\"fill\", aoColor);\n\n if (bevelEdgeWidth && bevelEdgeWidth > 0) {\n ctx.save();\n ctx.strokeStyle = bevelEdgeColor || \"#000000\";\n ctx.lineWidth = bevelEdgeWidth;\n ctx.lineJoin = strokeLineJoin || \"round\";\n renderLines(\"stroke\");\n ctx.restore();\n }\n ctx.restore();\n }\n ctx.restore();\n\n // 5c. Specular highlight stroke on front-face top edge\n if (bevelEdgeWidth && bevelEdgeWidth > 0) {\n ctx.save();\n ctx.globalAlpha = 0.6;\n ctx.strokeStyle = bevelHighlight;\n ctx.lineWidth = Math.max(0.5, (bevelEdgeWidth || 1) * 0.5);\n ctx.lineJoin = strokeLineJoin || \"round\";\n renderLines(\"stroke\");\n ctx.restore();\n }\n } else {\n // ── Flat-direction extrusion (bottom-right / bottom / right) ──\n\n const getDirOffset = (i: number): { dx: number; dy: number } => {\n if (bevelDirection === \"bottom-right\") return { dx: i, dy: i };\n if (bevelDirection === \"bottom\") return { dx: 0, dy: i };\n if (bevelDirection === \"right\") return { dx: i, dy: 0 };\n return { dx: i, dy: i };\n };\n\n // 5a. Ambient occlusion blur\n if (bevelBlur && bevelBlur > 0) {\n ctx.save();\n ctx.filter = `blur(${bevelBlur}px)`;\n const blurColor = bevelBlurColor || bevelShadow || \"#000000\";\n for (let i = bevelDepth; i > 0; i -= Math.max(1, Math.floor(bevelDepth / 4))) {\n const { dx, dy } = getDirOffset(i);\n renderLines(\"fill\", blurColor, dx, dy);\n }\n ctx.restore();\n }\n\n // 5b. Gradient-shaded extrusion slabs\n ctx.save();\n for (let i = bevelDepth; i > 0; i--) {\n const { dx, dy } = getDirOffset(i);\n\n // t=0 at deepest, t=1 at front\n const t = 1 - (i - 1) / Math.max(1, bevelDepth - 1);\n\n // AO darkening: corners/edges of deep slabs get extra shadow\n // For bottom-right, the diagonal slabs are darkest; side-facing\n // surfaces should be darker than the front face.\n const depthRatio = (i - 1) / Math.max(1, bevelDepth - 1); // 0=front, 1=back\n const aoFactor = 0.25 + 0.75 * (1 - depthRatio * 0.8);\n\n const baseColor = shadeForDepth(t);\n const baseRgbParsed = (() => {\n const m = baseColor.match(/rgb\\((\\d+),(\\d+),(\\d+)\\)/);\n return m ? { r: +m[1], g: +m[2], b: +m[3] } : shadowRgb;\n })();\n const shadedColor = `rgb(${Math.round(baseRgbParsed.r * aoFactor)},${Math.round(baseRgbParsed.g * aoFactor)},${Math.round(baseRgbParsed.b * aoFactor)})`;\n\n renderLines(\"fill\", shadedColor, dx, dy);\n\n if (bevelEdgeWidth && bevelEdgeWidth > 0) {\n ctx.save();\n // Edge gets progressively darker toward back\n ctx.globalAlpha = 0.4 + 0.6 * (1 - depthRatio);\n ctx.strokeStyle = bevelEdgeColor || \"#000000\";\n ctx.lineWidth = bevelEdgeWidth;\n ctx.lineJoin = strokeLineJoin || \"round\";\n renderLines(\"stroke\", undefined, dx, dy);\n ctx.restore();\n }\n }\n ctx.restore();\n\n // 5c. Specular rim highlight on front-face edge (top-left catch light)\n ctx.save();\n ctx.globalAlpha = 0.5;\n ctx.strokeStyle = bevelHighlight;\n ctx.lineWidth = Math.max(0.5, bevelEdgeWidth || 1.5);\n ctx.lineJoin = \"round\";\n renderLines(\"stroke\", bevelHighlight, 0, 0);\n ctx.restore();\n }\n }\n\n // ──────────────────────────────────────────────────────────────────\n // 6. Stroke (Under Fill if position inside/outside)\n // ──────────────────────────────────────────────────────────────────\n const applyStroke = () => {\n ctx.save();\n\n const sType = strokeType || \"single\";\n const sBlur = strokeBlur || 0;\n const sColorSecondary = strokeColorSecondary || \"#FFFFFF\";\n const sWidthSecondary = strokeWidthSecondary !== undefined ? strokeWidthSecondary : 4;\n const sFadeRange = strokeFadeRange || 0;\n\n // Line join alignment\n ctx.lineJoin = strokeLineJoin || \"round\";\n\n // 1. Resolve Stroke Style (Color or Gradient/Fade)\n let customStrokeStyle: string | CanvasGradient = strokeColor;\n if (sFadeRange > 0) {\n // Build beautiful vertical fade gradient\n const grad = ctx.createLinearGradient(0, yMin, 0, yMax);\n const rgb = hexToRgb(strokeColor);\n // Base stroke color at peak opacity, fading to 0\n grad.addColorStop(0, `rgba(${rgb.r}, ${rgb.g}, ${rgb.b}, ${strokeOpacity / 100})`);\n const fadeLimit = Math.min(1.0, sFadeRange / 100);\n grad.addColorStop(fadeLimit, `rgba(${rgb.r}, ${rgb.g}, ${rgb.b}, 0)`);\n grad.addColorStop(1.0, `rgba(${rgb.r}, ${rgb.g}, ${rgb.b}, 0)`);\n customStrokeStyle = grad;\n }\n\n const drawStrokeLayer = (color: string | CanvasGradient, width: number, blurAmount: number, opacity: number, position: string) => {\n ctx.save();\n ctx.globalAlpha = opacity / 100;\n ctx.strokeStyle = color;\n\n // Handle filter blur natively if supported\n if (blurAmount > 0) {\n ctx.filter = `blur(${blurAmount}px)`;\n }\n\n if (position === \"outside\") {\n ctx.lineWidth = width * 2;\n renderLines(\"stroke\");\n } else if (position === \"center\") {\n ctx.lineWidth = width;\n renderLines(\"stroke\");\n } else if (position === \"inside\") {\n // Inside clipping using source-atop\n ctx.globalCompositeOperation = \"source-atop\";\n ctx.lineWidth = width * 2;\n renderLines(\"stroke\");\n }\n ctx.restore();\n };\n\n // 2. Multi-layer stroke rendering according to type\n if (sType === \"double\") {\n // Outer border (secondary): drawn wider underneath\n const outerWidth = strokeWidth + sWidthSecondary;\n drawStrokeLayer(sColorSecondary, outerWidth, sBlur, strokeOpacity, strokePosition);\n\n // Inner border (primary): drawn sharper on top\n drawStrokeLayer(\n customStrokeStyle,\n strokeWidth,\n 0, // inner remains crisp\n strokeOpacity,\n strokePosition,\n );\n } else if (sType === \"neon\") {\n // Glowing outline style\n // Neon Backing Glow\n drawStrokeLayer(\n strokeColor,\n strokeWidth * 1.8,\n sBlur || 8, // fallback blur to look gorgeous\n strokeOpacity * 0.7,\n strokePosition,\n );\n // Core Neon White center\n drawStrokeLayer(\"#FFFFFF\", strokeWidth * 0.5, 0, 95, strokePosition);\n } else {\n // Normal Single Stroke with customizable blur\n drawStrokeLayer(customStrokeStyle, strokeWidth, sBlur, strokeOpacity, strokePosition);\n }\n\n ctx.restore();\n };\n\n // ──────────────────────────────────────────────────────────────────\n // 6.5. Text Multi-Stack Layers\n // ──────────────────────────────────────────────────────────────────\n if (stackEnabled && (stackCount ?? 0) >= 1) {\n const cnt = stackCount ?? 3;\n const offX = stackOffsetX ?? 10;\n const offY = stackOffsetY ?? -10;\n const decay = (stackOpacityDecay ?? 20) / 100;\n const stackColors = [stackColor1 || \"#FF7C00\", stackColor2 || \"#00FFDD\", stackColor3 || \"#FF00AA\", stackColor4 || \"#AA00FF\"];\n\n for (let s = cnt; s >= 1; s--) {\n ctx.save();\n const dx = s * offX;\n const dy = s * offY;\n\n const layerOpacity = Math.max(0.01, 1 - s * decay);\n ctx.globalAlpha = layerOpacity;\n\n const layerColor = stackColors[(s - 1) % stackColors.length] || \"#FFFFFF\";\n\n if (strokeEnabled && strokeWidth > 0 && strokePosition !== \"inside\") {\n ctx.save();\n ctx.strokeStyle = layerColor;\n ctx.lineWidth = strokeWidth;\n ctx.lineJoin = strokeLineJoin;\n ctx.globalAlpha = (strokeOpacity / 100) * layerOpacity;\n renderLines(\"stroke\", layerColor, dx, dy);\n ctx.restore();\n }\n\n renderLines(\"fill\", layerColor, dx, dy);\n ctx.restore();\n }\n }\n\n if (strokeEnabled && strokeWidth > 0 && strokePosition !== \"inside\") {\n applyStroke();\n }\n\n // ──────────────────────────────────────────────────────────────────\n // 7. Text Fill\n // ──────────────────────────────────────────────────────────────────\n ctx.save();\n let textFill: string | CanvasGradient | CanvasPattern = fillColor;\n\n if (fillType === \"linear\" && fillGradientStops.length >= 2) {\n const angleRad = (fillGradientAngle * Math.PI) / 180;\n const cx = (xMin + xMax) / 2;\n const cy = (yMin + yMax) / 2;\n const r = Math.max(xMax - xMin, yMax - yMin) / 2;\n\n const x0 = cx - Math.cos(angleRad) * r;\n const y0 = cy - Math.sin(angleRad) * r;\n const x1 = cx + Math.cos(angleRad) * r;\n const y1 = cy + Math.sin(angleRad) * r;\n\n const grad = ctx.createLinearGradient(x0, y0, x1, y1);\n fillGradientStops.forEach((stop) => {\n grad.addColorStop(stop.offset / 100, stop.color);\n });\n textFill = grad;\n } else if (fillType === \"radial\" && fillGradientStops.length >= 2) {\n const cx = (xMin + xMax) / 2;\n const cy = (yMin + yMax) / 2;\n const r = Math.max(xMax - xMin, yMax - yMin) / 1.5;\n\n const grad = ctx.createRadialGradient(cx, cy, 2, cx, cy, r);\n fillGradientStops.forEach((stop) => {\n grad.addColorStop(stop.offset / 100, stop.color);\n });\n textFill = grad;\n } else if (fillType === \"pattern\") {\n const pType = patternType || \"chalk\";\n const patColor = fillColor || \"#ffffff\";\n\n const patCanvas = createCanvas(128, 128);\n // Pick ideal canvas dimension per pattern style\n if (pType === \"carbon\") {\n patCanvas.width = 8;\n patCanvas.height = 8;\n } else if (pType === \"stripes\") {\n patCanvas.width = 16;\n patCanvas.height = 16;\n } else if (pType === \"halftone\") {\n patCanvas.width = 24;\n patCanvas.height = 24;\n } else if (pType === \"noise\") {\n patCanvas.width = 96;\n patCanvas.height = 96;\n } else if (pType === \"film\" || pType === \"brushed\" || pType === \"paper\") {\n patCanvas.width = 128;\n patCanvas.height = 128;\n } else if (pType === \"marble\") {\n patCanvas.width = 256;\n patCanvas.height = 256;\n } else {\n patCanvas.width = 120;\n patCanvas.height = 120;\n }\n\n const patCtx = getCanvas2DContext(patCanvas)!;\n\n // Fast stable linear congruential seeded random helper (prevents render flickering)\n const seedRandom = (initSeed: number) => {\n let currentSeed = initSeed;\n return () => {\n currentSeed = (currentSeed * 1664525 + 1013904223) % 4294967296;\n return currentSeed / 4294967296;\n };\n };\n const rand = seedRandom(42); // stable fixed seed\n\n if (pType === \"chalk\") {\n patCtx.fillStyle = \"rgba(0,0,0,0)\";\n patCtx.fillRect(0, 0, 120, 120);\n\n // 1. Base organic granular/stipple tooth layer\n patCtx.fillStyle = patColor;\n for (let i = 0; i < 3500; i++) {\n const px = Math.floor(rand() * 120);\n const py = Math.floor(rand() * 120);\n patCtx.globalAlpha = 0.08 + rand() * 0.18;\n patCtx.fillRect(px, py, 1.2, 1.2);\n }\n\n // 2. Beautiful hand-scribbled cross-hatch strokes in 4 orientations\n patCtx.strokeStyle = patColor;\n for (let s = 0; s < 4; s++) {\n const angle = (s * Math.PI) / 4 + (rand() - 0.5) * 0.15;\n patCtx.lineWidth = 0.5 + rand() * 0.9;\n\n for (let i = 0; i < 40; i++) {\n patCtx.globalAlpha = 0.05 + rand() * 0.16;\n patCtx.beginPath();\n\n const startX = rand() * 120;\n const startY = rand() * 120;\n const len = 15 + rand() * 30;\n\n patCtx.moveTo(startX, startY);\n patCtx.lineTo(startX + Math.cos(angle) * len, startY + Math.sin(angle) * len);\n patCtx.stroke();\n }\n }\n\n // 3. Round chalk dust/sponge overlays\n for (let i = 0; i < 220; i++) {\n const cx = rand() * 120;\n const cy = rand() * 120;\n const r = 1 + rand() * 3;\n patCtx.globalAlpha = 0.03 + rand() * 0.08;\n patCtx.fillStyle = patColor;\n patCtx.beginPath();\n patCtx.arc(cx, cy, r, 0, Math.PI * 2);\n patCtx.fill();\n }\n } else if (pType === \"noise\") {\n patCtx.fillStyle = \"rgba(0,0,0,0)\";\n patCtx.fillRect(0, 0, 96, 96);\n\n patCtx.fillStyle = patColor;\n // Fine micro grainy texture\n for (let i = 0; i < 4500; i++) {\n const px = Math.floor(rand() * 96);\n const py = Math.floor(rand() * 96);\n patCtx.globalAlpha = 0.12 + rand() * 0.38;\n patCtx.fillRect(px, py, rand() > 0.85 ? 1.5 : 1, rand() > 0.85 ? 1.5 : 1);\n }\n\n // Speckled paper pulp bits\n for (let i = 0; i < 150; i++) {\n const px = Math.floor(rand() * 96);\n const py = Math.floor(rand() * 96);\n const size = 1.6 + rand() * 1.5;\n patCtx.globalAlpha = 0.05 + rand() * 0.12;\n patCtx.fillRect(px, py, size, size);\n }\n } else if (pType === \"grunge\") {\n patCtx.fillStyle = \"rgba(0,0,0,0)\";\n patCtx.fillRect(0, 0, 128, 128);\n\n // 1. Organic distress paint eroded splotches\n patCtx.fillStyle = patColor;\n for (let i = 0; i < 60; i++) {\n const cx = rand() * 128;\n const cy = rand() * 128;\n const r = 3 + rand() * 18;\n patCtx.globalAlpha = 0.06 + rand() * 0.15;\n patCtx.beginPath();\n patCtx.arc(cx, cy, r, 0, Math.PI * 2);\n patCtx.fill();\n }\n\n // 2. Weathered cracks/scratch lines\n patCtx.strokeStyle = patColor;\n for (let i = 0; i < 22; i++) {\n const sx = rand() * 128;\n const sy = rand() * 128;\n const angle = (rand() * Math.PI) / 3 - Math.PI / 6;\n const len = 12 + rand() * 25;\n patCtx.lineWidth = 0.5 + rand() * 1.5;\n patCtx.globalAlpha = 0.15 + rand() * 0.25;\n\n patCtx.beginPath();\n patCtx.moveTo(sx, sy);\n patCtx.lineTo(sx + Math.cos(angle) * len, sy + Math.sin(angle) * len);\n patCtx.stroke();\n }\n\n // 3. Erosion speckles\n for (let i = 0; i < 1800; i++) {\n const px = Math.floor(rand() * 128);\n const py = Math.floor(rand() * 128);\n patCtx.globalAlpha = 0.08 + rand() * 0.22;\n patCtx.fillRect(px, py, 1.2, 1.2);\n }\n } else if (pType === \"carbon\") {\n patCtx.fillStyle = \"rgba(0,0,0,0.15)\";\n patCtx.fillRect(0, 0, 8, 8);\n\n patCtx.fillStyle = patColor;\n patCtx.globalAlpha = 0.65;\n patCtx.fillRect(0, 0, 4, 4);\n patCtx.fillRect(4, 4, 4, 4);\n\n // Weave highlights\n patCtx.fillStyle = \"#FFFFFF\";\n patCtx.globalAlpha = 0.22;\n patCtx.fillRect(0, 0, 4, 1);\n patCtx.fillRect(4, 4, 4, 1);\n\n // Weave shadows\n patCtx.fillStyle = \"#000000\";\n patCtx.globalAlpha = 0.35;\n patCtx.fillRect(0, 3, 4, 1);\n patCtx.fillRect(4, 7, 4, 1);\n } else if (pType === \"stripes\") {\n patCtx.fillStyle = \"rgba(0,0,0,0)\";\n patCtx.fillRect(0, 0, 16, 16);\n\n patCtx.strokeStyle = patColor;\n patCtx.lineWidth = 3.5;\n patCtx.globalAlpha = 0.65;\n\n patCtx.beginPath();\n // Infinite tileable slanted lines at 45deg\n patCtx.moveTo(-4, 12);\n patCtx.lineTo(12, -4);\n\n patCtx.moveTo(0, 16);\n patCtx.lineTo(16, 0);\n\n patCtx.moveTo(4, 20);\n patCtx.lineTo(20, 4);\n patCtx.stroke();\n } else if (pType === \"film\") {\n // Authentic cinematic weathered analog negative film texture\n patCtx.fillStyle = patColor;\n patCtx.globalAlpha = 0.94;\n patCtx.fillRect(0, 0, 128, 128);\n\n // 1. Silver-halide micro emulsion grain (salt & pepper stippling)\n for (let i = 0; i < 4800; i++) {\n const px = Math.floor(rand() * 128);\n const py = Math.floor(rand() * 128);\n const isDark = rand() > 0.45;\n patCtx.fillStyle = isDark ? \"#000000\" : \"#FFFFFF\";\n patCtx.globalAlpha = isDark ? 0.13 + rand() * 0.22 : 0.15 + rand() * 0.28;\n patCtx.fillRect(px, py, rand() > 0.9 ? 1.5 : 1, rand() > 0.9 ? 1.5 : 1);\n }\n\n // 2. High frequency hairline scratches (vertical lines from movie reels)\n patCtx.strokeStyle = \"rgba(255, 255, 255, 0.48)\";\n for (let i = 0; i < 10; i++) {\n const sx = rand() * 128;\n const sy = rand() * 128;\n const len = 12 + rand() * 45;\n const angle = -Math.PI / 2 + (rand() - 0.5) * 0.18; // mostly vertical vertical motion blur\n patCtx.lineWidth = 0.35 + rand() * 0.55;\n patCtx.globalAlpha = 0.22 + rand() * 0.38;\n\n patCtx.beginPath();\n patCtx.moveTo(sx, sy);\n patCtx.lineTo(sx + Math.cos(angle) * len, sy + Math.sin(angle) * len);\n patCtx.stroke();\n }\n\n // Add a few dark vertical emulsion scratches too\n patCtx.strokeStyle = \"rgba(0, 0, 0, 0.32)\";\n for (let i = 0; i < 5; i++) {\n const sx = rand() * 128;\n const sy = rand() * 128;\n const len = 15 + rand() * 50;\n const angle = -Math.PI / 2 + (rand() - 0.5) * 0.12;\n patCtx.lineWidth = 0.3 + rand() * 0.5;\n patCtx.globalAlpha = 0.18 + rand() * 0.25;\n\n patCtx.beginPath();\n patCtx.moveTo(sx, sy);\n patCtx.lineTo(sx + Math.cos(angle) * len, sy + Math.sin(angle) * len);\n patCtx.stroke();\n }\n\n // 3. Squiggly hair fibers & dust lint paths\n patCtx.strokeStyle = \"rgba(0, 0, 0, 0.48)\";\n for (let i = 0; i < 4; i++) {\n const sx = rand() * 128;\n const sy = rand() * 128;\n patCtx.lineWidth = 0.55 + rand() * 0.65;\n patCtx.globalAlpha = 0.35 + rand() * 0.3;\n\n patCtx.beginPath();\n patCtx.moveTo(sx, sy);\n // Curved organic fuzzy lint path\n patCtx.quadraticCurveTo(sx + (rand() - 0.5) * 16, sy + (rand() - 0.5) * 16, sx + (rand() - 0.5) * 28, sy + (rand() - 0.5) * 28);\n patCtx.stroke();\n }\n\n // 4. White light leaks/reflective silver specks\n patCtx.fillStyle = \"#FFFFFF\";\n for (let i = 0; i < 30; i++) {\n const cx = rand() * 128;\n const cy = rand() * 128;\n const r = 0.75 + rand() * 2.4;\n patCtx.globalAlpha = 0.25 + rand() * 0.5;\n patCtx.beginPath();\n patCtx.arc(cx, cy, r, 0, Math.PI * 2);\n patCtx.fill();\n }\n\n // 5. Dark soot/ash/fungus dots\n patCtx.fillStyle = \"#000000\";\n for (let i = 0; i < 20; i++) {\n const cx = rand() * 128;\n const cy = rand() * 128;\n const r = 0.65 + rand() * 2.0;\n patCtx.globalAlpha = 0.2 + rand() * 0.4;\n patCtx.beginPath();\n patCtx.arc(cx, cy, r, 0, Math.PI * 2);\n patCtx.fill();\n }\n } else if (pType === \"brushed\") {\n // High fidelity directional brushed metal finish\n patCtx.fillStyle = patColor;\n patCtx.fillRect(0, 0, 128, 128);\n\n // Horizontal hairline scratches & light/dark strips\n for (let i = 0; i < 350; i++) {\n const y = rand() * 128;\n const x = rand() * 128;\n const len = 30 + rand() * 80;\n const thickness = 0.5 + rand() * 1.5;\n const isLight = rand() > 0.45;\n\n patCtx.strokeStyle = isLight ? \"#FFFFFF\" : \"#000000\";\n patCtx.globalAlpha = isLight ? 0.04 + rand() * 0.12 : 0.03 + rand() * 0.08;\n patCtx.lineWidth = thickness;\n\n patCtx.beginPath();\n patCtx.moveTo(x, y);\n patCtx.lineTo(x + len, y); // horizontal brush\n patCtx.stroke();\n\n // Wrap-around for seamless tiling repeat\n if (x + len > 128) {\n patCtx.beginPath();\n patCtx.moveTo(x - 128, y);\n patCtx.lineTo(x + len - 128, y);\n patCtx.stroke();\n }\n }\n\n // Add subtle larger vertical grain/shading bands to break flat monotony\n for (let i = 0; i < 8; i++) {\n const x = rand() * 128;\n const w = 10 + rand() * 30;\n const isLight = rand() > 0.5;\n const grad = patCtx.createLinearGradient(x, 0, x + w, 0);\n const baseColor = isLight ? \"255,255,255\" : \"0,0,0\";\n const alpha = 0.01 + rand() * 0.04;\n grad.addColorStop(0, `rgba(${baseColor}, 0)`);\n grad.addColorStop(0.5, `rgba(${baseColor}, ${alpha})`);\n grad.addColorStop(1, `rgba(${baseColor}, 0)`);\n\n patCtx.fillStyle = grad;\n patCtx.globalAlpha = 1;\n patCtx.fillRect(x, 0, w, 128);\n\n // Wrap-around vertically/horizontally\n if (x + w > 128) {\n patCtx.fillRect(x - 128, 0, w, 128);\n }\n }\n } else if (pType === \"marble\") {\n // High luxury swirling stone veins\n patCtx.fillStyle = patColor;\n patCtx.fillRect(0, 0, 256, 256);\n\n // Soft broad marble smoke cloud layer\n for (let i = 0; i < 8; i++) {\n const cx = rand() * 256;\n const cy = rand() * 256;\n const r = 40 + rand() * 70;\n const grad = patCtx.createRadialGradient(cx, cy, 0, cx, cy, r);\n const isLight = rand() > 0.45;\n const alpha = 0.06 + rand() * 0.12;\n const cStr = isLight ? \"255,255,255\" : \"0,0,0\";\n grad.addColorStop(0, `rgba(${cStr}, ${alpha})`);\n grad.addColorStop(0.5, `rgba(${cStr}, ${alpha * 0.4})`);\n grad.addColorStop(1, `rgba(${cStr}, 0)`);\n\n patCtx.fillStyle = grad;\n patCtx.globalAlpha = 1;\n patCtx.beginPath();\n patCtx.arc(cx, cy, r, 0, Math.PI * 2);\n patCtx.fill();\n }\n\n // Procedural organic fracture veins\n const drawMarbleVein = (color: string, width: number, opac: number) => {\n patCtx.strokeStyle = color;\n patCtx.lineWidth = width;\n patCtx.globalAlpha = opac;\n\n // We start on one side, randomly walk to another\n let px = rand() * 256;\n let py = 0;\n patCtx.beginPath();\n patCtx.moveTo(px, py);\n\n const steps = 18;\n for (let s = 1; s <= steps; s++) {\n const progress = s / steps;\n const targetY = progress * 256;\n // Add fractal noise shift to X\n const frequency = 4;\n const amp = 35;\n const noise = Math.sin(progress * Math.PI * frequency + rand() * 2) * amp;\n const targetX = (px + (rand() - 0.5) * 50 + noise + 256) % 256;\n\n patCtx.lineTo(targetX, targetY);\n }\n patCtx.stroke();\n };\n\n // Draw primary deep veins\n for (let i = 0; i < 4; i++) {\n drawMarbleVein(\"#000000\", 1.2 + rand() * 1.5, 0.15 + rand() * 0.15);\n }\n // Draw secondary golden/light accent veins\n for (let i = 0; i < 3; i++) {\n const isGold = rand() > 0.4;\n const vColor = isGold ? \"#EAB308\" : \"#FFFFFF\"; // Gold or bright white\n drawMarbleVein(vColor, 0.7 + rand() * 0.8, 0.2 + rand() * 0.2);\n }\n // Draw micro thin hairline fractures\n for (let i = 0; i < 5; i++) {\n drawMarbleVein(\"#000000\", 0.4, 0.08 + rand() * 0.06);\n }\n } else if (pType === \"halftone\") {\n // Pop-art comic screen dot halftone print\n patCtx.fillStyle = \"rgba(0,0,0,0)\";\n patCtx.fillRect(0, 0, 24, 24);\n\n // Draw a dark halftone shadow dot\n const dotColor = fillColor || \"#ffffff\";\n\n // Halftone dots grid (offset pattern)\n patCtx.fillStyle = \"#000000\";\n patCtx.globalAlpha = 0.35;\n // Background dark shadow offset dot\n patCtx.beginPath();\n patCtx.arc(12, 12, 5.5, 0, Math.PI * 2);\n patCtx.arc(0, 0, 3.5, 0, Math.PI * 2);\n patCtx.arc(24, 0, 3.5, 0, Math.PI * 2);\n patCtx.arc(0, 24, 3.5, 0, Math.PI * 2);\n patCtx.arc(24, 24, 3.5, 0, Math.PI * 2);\n patCtx.fill();\n\n // Main foreground overlay dots\n patCtx.fillStyle = dotColor;\n patCtx.globalAlpha = 0.95;\n patCtx.beginPath();\n patCtx.arc(11, 11, 5.0, 0, Math.PI * 2);\n patCtx.arc(0, 0, 3.0, 0, Math.PI * 2);\n patCtx.arc(24, 0, 3.0, 0, Math.PI * 2);\n patCtx.arc(0, 24, 3.0, 0, Math.PI * 2);\n patCtx.arc(24, 24, 3.0, 0, Math.PI * 2);\n patCtx.fill();\n\n // Pop-art miniature helper offset microdots\n patCtx.fillStyle = dotColor === \"#FFFFFF\" || dotColor === \"#ffffff\" ? \"#7C6FFF\" : \"#FFFFFF\";\n patCtx.globalAlpha = 0.55;\n patCtx.beginPath();\n patCtx.arc(12, 0, 1.5, 0, Math.PI * 2);\n patCtx.arc(12, 24, 1.5, 0, Math.PI * 2);\n patCtx.arc(0, 12, 1.5, 0, Math.PI * 2);\n patCtx.arc(24, 12, 1.5, 0, Math.PI * 2);\n patCtx.fill();\n } else if (pType === \"paper\") {\n // High luxury organic crumpled Japanese handmade washi / craft paper\n patCtx.fillStyle = patColor;\n patCtx.fillRect(0, 0, 128, 128);\n\n // 1. Organic handmade pulp fiber threads\n for (let i = 0; i < 350; i++) {\n const fx = rand() * 128;\n const fy = rand() * 128;\n const flen = 3 + rand() * 12;\n const fangle = rand() * Math.PI * 2;\n const isDark = rand() > 0.4;\n\n patCtx.strokeStyle = isDark ? \"#000000\" : \"#FFFFFF\";\n patCtx.globalAlpha = isDark ? 0.03 + rand() * 0.08 : 0.05 + rand() * 0.12;\n patCtx.lineWidth = 0.4 + rand() * 0.7;\n\n patCtx.beginPath();\n patCtx.moveTo(fx, fy);\n // Slightly wavy pulp threads\n patCtx.quadraticCurveTo(fx + Math.cos(fangle) * flen * 0.5 + (rand() - 0.5) * 4, fy + Math.sin(fangle) * flen * 0.5 + (rand() - 0.5) * 4, fx + Math.cos(fangle) * flen, fy + Math.sin(fangle) * flen);\n patCtx.stroke();\n }\n\n // 2. Fine paper mill grain tooth/pores\n for (let i = 0; i < 5000; i++) {\n const gx = Math.floor(rand() * 128);\n const gy = Math.floor(rand() * 128);\n const isDark = rand() > 0.5;\n patCtx.fillStyle = isDark ? \"#000000\" : \"#FFFFFF\";\n patCtx.globalAlpha = isDark ? 0.04 : 0.06;\n patCtx.fillRect(gx, gy, 1, 1);\n }\n\n // 3. Realistic 3D folded origami crease facets (gradient shading plates to represent folded planes)\n const points: [number, number][] = [];\n for (let i = 0; i < 6; i++) {\n points.push([rand() * 128, rand() * 128]);\n }\n // Add corners\n points.push([0, 0], [128, 0], [128, 128], [0, 128]);\n\n // Connect into triangular shadow faces\n for (let i = 0; i < 15; i++) {\n const p1 = points[Math.floor(rand() * points.length)];\n const p2 = points[Math.floor(rand() * points.length)];\n const p3 = points[Math.floor(rand() * points.length)];\n\n if (p1 !== p2 && p2 !== p3) {\n const grad = patCtx.createLinearGradient(p1[0], p1[1], p2[0], p2[1]);\n const alpha = 0.01 + rand() * 0.06;\n const isDark = rand() > 0.5;\n const cStr = isDark ? \"0,0,0\" : \"255,255,255\";\n grad.addColorStop(0, `rgba(${cStr}, ${alpha})`);\n grad.addColorStop(1, `rgba(${cStr}, 0)`);\n\n patCtx.fillStyle = grad;\n patCtx.globalAlpha = 1;\n patCtx.beginPath();\n patCtx.moveTo(p1[0], p1[1]);\n patCtx.lineTo(p2[0], p2[1]);\n patCtx.lineTo(p3[0], p3[1]);\n patCtx.closePath();\n patCtx.fill();\n }\n }\n\n // 4. Sharp crumpled ridge/valley crease lines (dark side and light side)\n for (let i = 0; i < 12; i++) {\n const sx = rand() * 128;\n const sy = rand() * 128;\n const ex = rand() * 128;\n const ey = rand() * 128;\n const dx = ex - sx;\n const dy = ey - sy;\n const len = Math.sqrt(dx * dx + dy * dy);\n if (len === 0) continue;\n\n const nx = -dy / len; // normal vector\n const ny = dx / len;\n\n // Outer shadow line\n patCtx.strokeStyle = \"#000000\";\n patCtx.lineWidth = 0.5 + rand() * 1.2;\n patCtx.globalAlpha = 0.05 + rand() * 0.12;\n patCtx.beginPath();\n patCtx.moveTo(sx + nx * 0.8, sy + ny * 0.8);\n patCtx.lineTo(ex + nx * 0.8, ey + ny * 0.8);\n patCtx.stroke();\n\n // Core sharp shadow ridge\n patCtx.strokeStyle = \"#000000\";\n patCtx.lineWidth = 0.3 + rand() * 0.4;\n patCtx.globalAlpha = 0.08 + rand() * 0.15;\n patCtx.beginPath();\n patCtx.moveTo(sx, sy);\n patCtx.lineTo(ex, ey);\n patCtx.stroke();\n\n // Highlights on flipped opposite side\n patCtx.strokeStyle = \"#FFFFFF\";\n patCtx.lineWidth = 0.6 + rand() * 1.5;\n patCtx.globalAlpha = 0.08 + rand() * 0.22;\n patCtx.beginPath();\n patCtx.moveTo(sx - nx * 0.8, sy - ny * 0.8);\n patCtx.lineTo(ex - nx * 0.8, ey - ny * 0.8);\n patCtx.stroke();\n }\n }\n\n const pat = ctx.createPattern(patCanvas, \"repeat\");\n if (pat) {\n textFill = pat;\n }\n }\n\n // Seedable random helper to prevent rendering flicker\n const createSeededRand = (seed: number) => {\n let val = seed;\n return () => {\n val = (val * 9301 + 49297) % 233280;\n return val / 233280;\n };\n };\n\n const isInkStyle = cfg.effectName.toLowerCase().includes(\"ink\") || cfg.fontFamily.toLowerCase().includes(\"brush\") || cfg.effectName.toLowerCase().includes(\"grunge\") || cfg.effectName.toLowerCase().includes(\"scratch\") || cfg.fontFamily === \"Permanent Marker\";\n\n if (isInkStyle) {\n // 1. Create offscreen canvas for the ink layer to yield a perfect text shape scanning\n const tCanvas = createCanvas(cWidth, cHeight);\n tCanvas.width = cWidth;\n tCanvas.height = cHeight;\n const tCtx = getCanvas2DContext(tCanvas);\n\n if (tCtx) {\n tCtx.font = fontStr;\n tCtx.textAlign = align;\n tCtx.textBaseline = \"alphabetic\";\n\n const rand = createSeededRand(text.length * 171 + fontSize * 11 + (fillColor ? fillColor.length : 1));\n\n // Render base clean text in solid white\n tCtx.fillStyle = \"#FFFFFF\";\n const originalLSpacing = (tCtx as any).letterSpacing || \"normal\";\n if (letterSpacing !== 0) {\n (tCtx as any).letterSpacing = `${letterSpacing}px`;\n }\n\n lines.forEach((line, index) => {\n const py = startY + index * lineAdvance;\n tCtx.fillText(line, startX, py);\n });\n\n // 2. Scan bounding region of the text\n const mxMin = Math.max(0, Math.floor(xMin - 20));\n const mxMax = Math.min(cWidth - 1, Math.ceil(xMax + 20));\n const myMin = Math.max(0, Math.floor(yMin - 20));\n const myMax = Math.min(cHeight - 1, Math.ceil(yMax + 20));\n\n const scanW = mxMax - mxMin;\n const scanH = myMax - myMin;\n\n if (scanW > 0 && scanH > 0) {\n const imgData = tCtx.getImageData(mxMin, myMin, scanW, scanH);\n const data = imgData.data;\n\n const isFilled = (coordX: number, coordY: number) => {\n if (coordX < 0 || coordX >= scanW || coordY < 0 || coordY >= scanH) return false;\n const idx = (coordY * scanW + coordX) * 4;\n return data[idx + 3] > 70;\n };\n\n const topEdges: { x: number; y: number }[] = [];\n const bottomEdges: { x: number; y: number }[] = [];\n const boundaryEdges: { x: number; y: number }[] = [];\n const insidePixels: { x: number; y: number }[] = [];\n\n for (let y = 1; y < scanH - 1; y += 1) {\n for (let x = 1; x < scanW - 1; x += 1) {\n if (isFilled(x, y)) {\n const emptyLeft = !isFilled(x - 1, y);\n const emptyRight = !isFilled(x + 1, y);\n const emptyTop = !isFilled(x, y - 1);\n const emptyBottom = !isFilled(x, y + 1);\n\n if (emptyTop) {\n topEdges.push({ x: mxMin + x, y: myMin + y });\n } else if (emptyBottom) {\n bottomEdges.push({ x: mxMin + x, y: myMin + y });\n } else if (emptyLeft || emptyRight) {\n boundaryEdges.push({ x: mxMin + x, y: myMin + y });\n } else {\n if (rand() < 0.15) {\n insidePixels.push({ x: mxMin + x, y: myMin + y });\n }\n }\n }\n }\n }\n\n tCtx.strokeStyle = \"#FFFFFF\";\n tCtx.fillStyle = \"#FFFFFF\";\n\n // A. Draw bold tapered bristles at Top Edges starting from lifted brush bristles\n const topSampleRate = 5;\n for (let i = 0; i < topEdges.length; i += topSampleRate) {\n const pt = topEdges[i];\n const h = fontSize * (0.06 + rand() * 0.16); // nice medium lengths\n const w = 1.8 + rand() * 2.5; // tapered width\n const slantOffset = h * 0.22; // italic diagonal alignment\n\n tCtx.beginPath();\n tCtx.moveTo(pt.x - w / 2, pt.y);\n tCtx.lineTo(pt.x + w / 2, pt.y);\n tCtx.lineTo(pt.x + slantOffset, pt.y - h);\n tCtx.closePath();\n tCtx.fill();\n }\n\n // B. Draw bold tapered bristles at Bottom Edges\n const bottomSampleRate = 5;\n for (let i = 0; i < bottomEdges.length; i += bottomSampleRate) {\n const pt = bottomEdges[i];\n const h = fontSize * (0.07 + rand() * 0.2);\n const w = 1.8 + rand() * 2.5;\n const slantOffset = -h * 0.22;\n\n tCtx.beginPath();\n tCtx.moveTo(pt.x - w / 2, pt.y);\n tCtx.lineTo(pt.x + w / 2, pt.y);\n tCtx.lineTo(pt.x + slantOffset, pt.y + h);\n tCtx.closePath();\n tCtx.fill();\n }\n\n // C. Draw micro jitter & rough edges on left/right boundary sides (rely on paper grain tooth)\n const boundarySampleRate = 3;\n for (let i = 0; i < boundaryEdges.length; i += boundarySampleRate) {\n const pt = boundaryEdges[i];\n const r = 0.5 + rand() * 1.5;\n tCtx.beginPath();\n tCtx.arc(pt.x + (rand() - 0.5) * 1.2, pt.y + (rand() - 0.5) * 1.2, r, 0, Math.PI * 2);\n tCtx.fill();\n }\n\n // D. Scatter fine sparse ink spray splatters\n const splatterCount = Math.floor(fontSize * 0.5);\n for (let s = 0; s < splatterCount; s++) {\n const pt = boundaryEdges[Math.floor(rand() * boundaryEdges.length)] || topEdges[Math.floor(rand() * topEdges.length)];\n if (pt) {\n const dist = 3 + rand() * (fontSize * 0.24);\n const angle = rand() * Math.PI * 2;\n const sx = pt.x + Math.cos(angle) * dist;\n const sy = pt.y + Math.sin(angle) * dist;\n\n const size = 0.4 + rand() * 1.6;\n tCtx.globalAlpha = 0.25 + rand() * 0.65;\n\n tCtx.beginPath();\n tCtx.arc(sx, sy, size, 0, Math.PI * 2);\n tCtx.fill();\n tCtx.globalAlpha = 1.0;\n }\n }\n\n // E. Slice very subtle, low-density inner dry brush stripper lines (grunge scratches)\n tCtx.save();\n tCtx.globalCompositeOperation = \"destination-out\";\n const scratchCount = Math.floor(fontSize * 0.42);\n for (let i = 0; i < scratchCount; i++) {\n const pt = insidePixels[Math.floor(rand() * insidePixels.length)];\n if (pt) {\n const len = fontSize * (0.06 + rand() * 0.14);\n const angle = -Math.PI / 4.2 + (rand() - 0.5) * 0.1;\n tCtx.lineWidth = 0.5 + rand() * 0.8;\n tCtx.globalAlpha = 0.2 + rand() * 0.4;\n\n tCtx.beginPath();\n tCtx.moveTo(pt.x - Math.cos(angle) * (len / 2), pt.y - Math.sin(angle) * (len / 2));\n tCtx.lineTo(pt.x + Math.cos(angle) * (len / 2), pt.y + Math.sin(angle) * (len / 2));\n tCtx.stroke();\n }\n }\n tCtx.restore();\n }\n\n (tCtx as any).letterSpacing = originalLSpacing;\n\n // Finalize canvas layers: Tint offscreen result to user textFill color & blend on screen\n ctx.save();\n const tintCanvas = createCanvas(cWidth, cHeight);\n tintCanvas.width = cWidth;\n tintCanvas.height = cHeight;\n const tintCtx = getCanvas2DContext(tintCanvas);\n if (tintCtx) {\n tintCtx.drawImage(tCanvas, 0, 0);\n tintCtx.globalCompositeOperation = \"source-in\";\n tintCtx.fillStyle = textFill;\n tintCtx.fillRect(0, 0, cWidth, cHeight);\n ctx.drawImage(tintCanvas, 0, 0);\n }\n ctx.restore();\n }\n } else {\n ctx.save();\n if (fillType !== \"none\") {\n if (usePerCharFill && fillType === \"solid\") {\n renderLines(\"fill\", undefined, 0, 0, { perCharFill: true });\n } else {\n renderLines(\"fill\", textFill);\n }\n }\n ctx.restore();\n }\n\n // Inside stroke\n if (strokeEnabled && strokeWidth > 0 && strokePosition === \"inside\") {\n applyStroke();\n }\n\n // ──────────────────────────────────────────────────────────────────\n // 8. Inner Glow & Inner Shadow\n // ──────────────────────────────────────────────────────────────────\n // Render Inner Glow Layers\n glowLayers.forEach((layer) => {\n if (layer.enabled && layer.type === \"inner\" && layer.opacity > 0) {\n ctx.save();\n ctx.globalCompositeOperation = \"source-atop\";\n const renderCount = Math.max(1, Math.min(20, layer.strength ?? 1));\n for (let i = 0; i < renderCount; i++) {\n renderWithShadowTrick(\"fill\", layer.color, layer.blur, 0, 0, layer.opacity, \"transparent\", layer.spread ?? 0);\n }\n ctx.restore();\n }\n });\n\n // Render Inner Shadow\n if (shadowEnabled && shadowType === \"inner\" && shadowOpacity > 0) {\n ctx.save();\n ctx.globalCompositeOperation = \"source-atop\";\n\n // Inverse mask inner shadow\n renderWithShadowTrick(\"fill\", shadowColor, shadowBlur, shadowOffsetX, shadowOffsetY, shadowOpacity, \"transparent\");\n ctx.restore();\n }\n\n // ──────────────────────────────────────────────────────────────────\n // 9. Glitch Overlay Scanner Lines\n // ──────────────────────────────────────────────────────────────────\n if (isGlitch) {\n ctx.save();\n ctx.globalCompositeOperation = \"source-atop\";\n ctx.strokeStyle = \"rgba(0,0,0,0.18)\";\n ctx.lineWidth = 1.5;\n for (let ly = yMin; ly < yMax; ly += 4) {\n ctx.beginPath();\n ctx.moveTo(xMin - 50, ly);\n ctx.lineTo(xMax + 50, ly);\n ctx.stroke();\n }\n ctx.restore();\n }\n}\n\nexport class TextEffectRenderer {\n public static draw(ctx: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D, cfg: TextEffectConfig, _time = 0): void {\n renderTextEffectCore(ctx, cfg);\n }\n}\n","import { TextEffectConfig, Preset } from \"./types\";\n\n/** Style recipes (layer graphs): see `builtInRecipes` in src/engine/recipes.ts */\n\nexport const defaultConfig: TextEffectConfig = {\n text: \"CLYPRA STUDIO\",\n effectName: \"My Effect\",\n fontFamily: \"Poppins\",\n fontWeight: 700,\n fontStyle: \"normal\",\n fontSize: 80,\n letterSpacing: 4,\n lineHeight: 1.2,\n fillType: \"solid\",\n fillColor: \"#FFFFFF\",\n fillGradientAngle: 90,\n fillGradientStops: [\n { color: \"#FFFFFF\", offset: 0 },\n { color: \"#E0E0E0\", offset: 100 },\n ],\n strokeEnabled: false,\n strokeColor: \"#7C6FFF\",\n strokeWidth: 4,\n strokePosition: \"outside\",\n strokeOpacity: 100,\n strokeLineJoin: \"round\",\n glowLayers: [\n { enabled: false, color: \"#7C6FFF\", blur: 20, opacity: 80, type: \"outer\" },\n { enabled: false, color: \"#FF007C\", blur: 40, opacity: 60, type: \"outer\" },\n { enabled: false, color: \"#00F0FF\", blur: 60, opacity: 40, type: \"outer\" },\n ],\n shadowEnabled: false,\n shadowColor: \"#000000\",\n shadowBlur: 10,\n shadowOffsetX: 5,\n shadowOffsetY: 5,\n shadowOpacity: 80,\n shadowType: \"drop\",\n bevelEnabled: false,\n bevelDepth: 5,\n bevelHighlight: \"#FFFFFF\",\n bevelShadow: \"#000000\",\n bevelDirection: \"bottom-right\",\n bevelCoreColor: \"#000000\",\n bevelEdgeColor: \"#2A2A38\",\n bevelEdgeWidth: 0,\n bevelBlur: 0,\n bevelBlurColor: \"#000000\",\n bevelPerspectiveEnabled: false,\n bevelVanishingPointX: 40,\n bevelVanishingPointY: 80,\n bevelFocalLength: 400,\n stackEnabled: false,\n stackCount: 3,\n stackOffsetX: 10,\n stackOffsetY: -10,\n stackOpacityDecay: 20,\n stackColor1: \"#FF7C00\",\n stackColor2: \"#00FFDD\",\n stackColor3: \"#FF00AA\",\n stackColor4: \"#AA00FF\",\n panelEnabled: false,\n panelColor: \"#1E1E26\",\n panelOpacity: 80,\n panelRadius: 12,\n panelPaddingX: 40,\n panelPaddingY: 20,\n panelStrokeEnabled: false,\n panelStrokeColor: \"#2A2A38\",\n panelStrokeWidth: 2,\n canvasWidth: 800,\n canvasHeight: 200,\n textPosX: \"center\",\n textPosY: \"middle\",\n wrapText: true,\n autoFitText: false,\n\n // Ink Brush custom properties\n inkColor: \"#FFFFFF\",\n bristleDensity: 0.8,\n bristleSkipRate: 0.2,\n dripRate: 0.3,\n dripMaxLength: 40,\n grainDensity: 0.15,\n skewX: -0.2,\n};\n\nexport const builtInPresets: Preset[] = [\n {\n id: \"premium-sticker\",\n name: \"STICKER\",\n category: \"Classic\",\n config: {\n ...defaultConfig,\n text: \"TEXT\",\n effectName: \"StickerEffect\",\n fontFamily: \"Arial Rounded MT Bold\",\n fontWeight: 900,\n fontStyle: \"normal\",\n fontSize: 88,\n letterSpacing: 2,\n lineHeight: 1.2,\n fillType: \"linear\",\n fillGradientAngle: 90,\n fillGradientStops: [\n { color: \"#FFCE00\", offset: 0 },\n { color: \"#E05300\", offset: 100 },\n ],\n strokeEnabled: true,\n strokeColor: \"#FFFFFF\",\n strokeWidth: 15,\n strokePosition: \"outside\",\n strokeType: \"single\",\n strokeLineJoin: \"round\",\n strokeOpacity: 100,\n bevelEnabled: true,\n bevelDepth: 8,\n bevelDirection: \"bottom-right\",\n bevelHighlight: \"#FFCE00\",\n bevelCoreColor: \"#4E1901\",\n bevelShadow: \"#1D0A00\",\n shadowEnabled: true,\n shadowColor: \"#000000\",\n shadowBlur: 14,\n shadowOffsetX: 6,\n shadowOffsetY: 8,\n shadowOpacity: 65,\n shadowType: \"drop\",\n },\n },\n\n {\n id: \"premium-holo\",\n name: \"HOLOGRAPHIC\",\n category: \"Classic\",\n config: {\n ...defaultConfig,\n text: \"TEXT\",\n effectName: \"HolographicEffect\",\n fontFamily: \"Impact\",\n fontWeight: 900,\n fontStyle: \"normal\",\n fontSize: 100,\n letterSpacing: 2,\n lineHeight: 1.2,\n fillType: \"linear\",\n fillGradientAngle: 125,\n fillGradientStops: [\n { color: \"#6FE3FF\", offset: 0 },\n { color: \"#D196FF\", offset: 25 },\n { color: \"#FF9CEE\", offset: 50 },\n { color: \"#FFE49E\", offset: 75 },\n { color: \"#D4FFF1\", offset: 100 },\n ],\n strokeEnabled: true,\n strokeColor: \"#FFFFFF\",\n strokeWidth: 2,\n strokePosition: \"outside\",\n strokeType: \"single\",\n strokeOpacity: 100,\n glowLayers: [{ enabled: true, color: \"#D196FF\", blur: 15, opacity: 50, type: \"outer\" }],\n bevelEnabled: true,\n bevelDepth: 4,\n bevelDirection: \"bottom-right\",\n bevelHighlight: \"#FFFFFF\",\n bevelCoreColor: \"#2A3540\",\n bevelShadow: \"#0E151D\",\n shadowEnabled: true,\n shadowColor: \"#000000\",\n shadowBlur: 20,\n shadowOffsetX: 6,\n shadowOffsetY: 10,\n shadowOpacity: 90,\n shadowType: \"drop\",\n },\n },\n\n {\n id: \"classic-ink\",\n name: \"Classic Ink\",\n category: \"Classic\",\n config: {\n ...defaultConfig,\n text: \"Classic Ink\",\n effectName: \"ClassicInk\",\n fontFamily: \"Playfair Display\",\n fontWeight: 700,\n fontStyle: \"normal\",\n fontSize: 85,\n letterSpacing: 1,\n lineHeight: 1.2,\n fillType: \"linear\",\n fillGradientAngle: 90,\n fillGradientStops: [\n { color: \"#FDFBF7\", offset: 0 },\n { color: \"#EAE5D9\", offset: 100 },\n ],\n strokeEnabled: true,\n strokeColor: \"#1E1E26\",\n strokeWidth: 2,\n strokePosition: \"outside\",\n strokeOpacity: 100,\n strokeLineJoin: \"round\",\n shadowEnabled: true,\n shadowColor: \"#3D2B1F\",\n shadowBlur: 14,\n shadowOffsetX: 6,\n shadowOffsetY: 6,\n shadowOpacity: 90,\n shadowType: \"drop\",\n },\n },\n\n {\n id: \"neon-crimson\",\n name: \"Neon Crimson\",\n category: \"Neon\",\n config: {\n ...defaultConfig,\n text: \"NEON\",\n effectName: \"NeonCrimson\",\n fontFamily: \"Bebas Neue\",\n fontWeight: 700,\n fontStyle: \"normal\",\n fontSize: 100,\n letterSpacing: 6,\n lineHeight: 1.2,\n fillType: \"none\",\n strokeEnabled: true,\n strokeColor: \"#FFFFFF\",\n strokeWidth: 3,\n strokePosition: \"center\",\n strokeOpacity: 100,\n strokeLineJoin: \"round\",\n glowLayers: [\n { enabled: true, color: \"#FF003C\", blur: 12, opacity: 100, type: \"outer\" },\n { enabled: true, color: \"#FF003C\", blur: 35, opacity: 80, type: \"outer\" },\n { enabled: true, color: \"#FF003C\", blur: 80, opacity: 60, type: \"outer\" },\n ],\n shadowEnabled: false,\n },\n },\n\n {\n id: \"cyberpunk-yellow\",\n name: \"Cyberpunk Yellow\",\n category: \"Neon\",\n config: {\n ...defaultConfig,\n text: \"CYBER\",\n effectName: \"CyberpunkYellow\",\n fontFamily: \"Anton\",\n fontWeight: 900,\n fontStyle: \"normal\",\n fontSize: 90,\n letterSpacing: 2,\n lineHeight: 1.2,\n fillType: \"solid\",\n fillColor: \"#FFE600\",\n strokeEnabled: true,\n strokeColor: \"#000000\",\n strokeWidth: 6,\n strokePosition: \"outside\",\n strokeOpacity: 100,\n strokeLineJoin: \"round\",\n shadowEnabled: true,\n shadowColor: \"#FFE600\",\n shadowBlur: 15,\n shadowOffsetX: 4,\n shadowOffsetY: 4,\n shadowOpacity: 95,\n shadowType: \"drop\",\n },\n },\n\n {\n id: \"retro-comic\",\n name: \"Retro Comic\",\n category: \"Experimental\",\n config: {\n ...defaultConfig,\n text: \"BOOM!\",\n effectName: \"RetroComic\",\n fontFamily: \"Arial Black\",\n fontWeight: 900,\n fontStyle: \"normal\",\n fontSize: 85,\n letterSpacing: 3,\n lineHeight: 1.1,\n fillType: \"solid\",\n fillColor: \"#000000\",\n strokeEnabled: true,\n strokeColor: \"#FFFFFF\",\n strokeWidth: 6,\n strokePosition: \"outside\",\n strokeOpacity: 100,\n strokeLineJoin: \"round\",\n glowLayers: [\n { enabled: true, color: \"#000000\", blur: 0, opacity: 100, type: \"outer\", strength: 1, spread: 3 },\n { enabled: false, color: \"#FF007C\", blur: 40, opacity: 60, type: \"outer\" },\n { enabled: false, color: \"#00F0FF\", blur: 60, opacity: 40, type: \"outer\" },\n ],\n // panelEnabled: true,\n // panelColor: \"#FFE100\",\n // panelOpacity: 100,\n // panelRadius: 10,\n // panelPaddingX: 55,\n // panelPaddingY: 35,\n // panelStrokeEnabled: true,\n // panelStrokeColor: \"#000000\",\n // panelStrokeWidth: 4,\n shadowEnabled: true,\n shadowColor: \"#000000\",\n shadowBlur: 0,\n shadowOffsetX: 8,\n shadowOffsetY: 8,\n shadowOpacity: 100,\n shadowType: \"drop\",\n },\n },\n];\n","/**\n * Font Loader for Lottie-web\n *\n * This module ensures that font variant names (like \"Poppins-Italic\") work correctly\n * with lottie-web by dynamically creating @font-face rules that map variant names\n * to the actual loaded fonts with proper styling.\n */\n\nexport interface FontVariant {\n variantName: string; // e.g., \"Poppins-Italic\"\n baseFontFamily: string; // e.g., \"Poppins\"\n weight: number; // 400, 700, etc.\n style: \"normal\" | \"italic\";\n}\n\nconst FONT_VARIANTS: FontVariant[] = [\n // Poppins variants\n { variantName: \"Poppins-Regular\", baseFontFamily: \"Poppins\", weight: 400, style: \"normal\" },\n { variantName: \"Poppins-Bold\", baseFontFamily: \"Poppins\", weight: 700, style: \"normal\" },\n { variantName: \"Poppins-Italic\", baseFontFamily: \"Poppins\", weight: 400, style: \"italic\" },\n { variantName: \"Poppins-BoldItalic\", baseFontFamily: \"Poppins\", weight: 700, style: \"italic\" },\n\n // Montserrat variants\n { variantName: \"Montserrat-Regular\", baseFontFamily: \"Montserrat\", weight: 400, style: \"normal\" },\n { variantName: \"Montserrat-Bold\", baseFontFamily: \"Montserrat\", weight: 700, style: \"normal\" },\n { variantName: \"Montserrat-ExtraBold\", baseFontFamily: \"Montserrat\", weight: 800, style: \"normal\" },\n { variantName: \"Montserrat-Black\", baseFontFamily: \"Montserrat\", weight: 900, style: \"normal\" },\n { variantName: \"Montserrat-Italic\", baseFontFamily: \"Montserrat\", weight: 400, style: \"italic\" },\n { variantName: \"Montserrat-BoldItalic\", baseFontFamily: \"Montserrat\", weight: 700, style: \"italic\" },\n { variantName: \"Montserrat-ExtraBoldItalic\", baseFontFamily: \"Montserrat\", weight: 800, style: \"italic\" },\n { variantName: \"Montserrat-BlackItalic\", baseFontFamily: \"Montserrat\", weight: 900, style: \"italic\" },\n\n // Arial variants (System Fonts)\n { variantName: \"Arial\", baseFontFamily: \"Arial\", weight: 400, style: \"normal\" },\n { variantName: \"Arial-Bold\", baseFontFamily: \"Arial\", weight: 700, style: \"normal\" },\n { variantName: \"Arial-Italic\", baseFontFamily: \"Arial\", weight: 400, style: \"italic\" },\n { variantName: \"Arial-BoldItalic\", baseFontFamily: \"Arial\", weight: 700, style: \"italic\" },\n];\n\n/**\n * Injects @font-face rules dynamically to create font variant aliases\n * This ensures lottie-web can find fonts by their variant names\n */\nexport function injectFontVariantRules(): void {\n // Check if already injected\n if (document.getElementById(\"lottie-font-variants\")) {\n return;\n }\n\n const style = document.createElement(\"style\");\n style.id = \"lottie-font-variants\";\n\n let css = \"/* Dynamically injected font variants for lottie-web */\\n\";\n\n FONT_VARIANTS.forEach((variant) => {\n css += `\n@font-face {\n font-family: \"${variant.variantName}\";\n src: local(\"${variant.baseFontFamily}\");\n font-weight: ${variant.weight};\n font-style: ${variant.style};\n font-display: swap;\n}\n`;\n });\n\n style.textContent = css;\n document.head.appendChild(style);\n\n console.log(\"✅ Font variant rules injected for lottie-web\");\n}\n\n/**\n * Waits for base fonts to load, then injects variant rules\n */\nexport async function initializeFontSystem(): Promise<void> {\n try {\n // Dynamically insert invisible font preloader spans to force browser download\n const preloaderId = \"font-system-preloader\";\n if (!document.getElementById(preloaderId) && document.body) {\n const preloader = document.createElement(\"div\");\n preloader.id = preloaderId;\n preloader.style.position = \"absolute\";\n preloader.style.opacity = \"0\";\n preloader.style.pointerEvents = \"none\";\n preloader.style.zIndex = \"-9999\";\n\n const preloadItems = [\n { family: \"Poppins\", weight: 400, style: \"normal\" },\n { family: \"Poppins\", weight: 700, style: \"normal\" },\n { family: \"Poppins\", weight: 400, style: \"italic\" },\n { family: \"Poppins\", weight: 700, style: \"italic\" },\n { family: \"Montserrat\", weight: 400, style: \"normal\" },\n { family: \"Montserrat\", weight: 700, style: \"normal\" },\n { family: \"Montserrat\", weight: 800, style: \"normal\" },\n { family: \"Montserrat\", weight: 900, style: \"normal\" },\n { family: \"Montserrat\", weight: 400, style: \"italic\" },\n { family: \"Montserrat\", weight: 700, style: \"italic\" },\n { family: \"Montserrat\", weight: 800, style: \"italic\" },\n { family: \"Montserrat\", weight: 900, style: \"italic\" },\n ];\n\n preloadItems.forEach((item) => {\n const span = document.createElement(\"span\");\n span.style.fontFamily = `'${item.family}'`;\n span.style.fontWeight = String(item.weight);\n span.style.fontStyle = item.style;\n span.innerText = \"preload\";\n preloader.appendChild(span);\n });\n\n document.body.appendChild(preloader);\n }\n\n // Wait for Poppins to load from Google Fonts\n await document.fonts.load(\"400 16px Poppins\");\n await document.fonts.load(\"700 16px Poppins\");\n await document.fonts.load(\"italic 400 16px Poppins\");\n await document.fonts.load(\"italic 700 16px Poppins\");\n\n // Wait for Montserrat to load from Google Fonts\n await document.fonts.load(\"400 16px Montserrat\");\n await document.fonts.load(\"700 16px Montserrat\");\n await document.fonts.load(\"800 16px Montserrat\");\n await document.fonts.load(\"900 16px Montserrat\");\n await document.fonts.load(\"italic 400 16px Montserrat\");\n await document.fonts.load(\"italic 700 16px Montserrat\");\n await document.fonts.load(\"italic 800 16px Montserrat\");\n await document.fonts.load(\"italic 900 16px Montserrat\");\n\n // Inject variant rules\n injectFontVariantRules();\n\n console.log(\"✅ Font system initialized (Poppins + Montserrat)\");\n } catch (error) {\n console.warn(\"⚠️ Font loading warning:\", error);\n // Still inject rules even if loading fails\n injectFontVariantRules();\n }\n}\n\n/**\n * Checks if a font variant is available for rendering\n */\nexport function checkFontVariant(variantName: string): boolean {\n // Try to measure text with the font\n const canvas = document.createElement(\"canvas\");\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) return false;\n\n ctx.font = `16px \"${variantName}\"`;\n const metrics = ctx.measureText(\"Test\");\n\n // If width is 0, font probably didn't load\n return metrics.width > 0;\n}\n","import type { TextEffectConfig, GlowLayer, GradientStop } from \"../types\";\n\nexport const SCENE_VERSION = 1 as const;\n\nexport type EffectLayerType = \"panel\" | \"glow\" | \"shadow\" | \"extrusion\" | \"duplicateStack\" | \"stroke\" | \"fill\" | \"mask\" | \"filter\" | \"customEngine\";\n\nexport type LayerTarget = \"text\" | \"panel\" | \"scene\" | \"previous\";\n\nexport type CustomEngineId = \"ink\";\n\nexport const CUSTOM_ENGINE_IDS: CustomEngineId[] = [\"ink\"];\n\nexport const LEGACY_RENDERER_MAP: Record<string, CustomEngineId> = {\n InkBrushEngine: \"ink\",\n};\n\nexport const ENGINE_ID_TO_LEGACY: Record<CustomEngineId, string> = {\n ink: \"InkBrushEngine\",\n};\n\nexport interface SceneCanvas {\n width: number;\n height: number;\n background: string;\n}\n\nexport interface SceneText {\n content: string;\n fontFamily: string;\n fontWeight: number;\n fontStyle: \"normal\" | \"italic\";\n fontSize: number;\n letterSpacing: number;\n lineHeight: number;\n textPosX: \"left\" | \"center\" | \"right\";\n textPosY: \"top\" | \"middle\" | \"bottom\";\n wrapText?: boolean;\n autoFitText?: boolean;\n perCharFillEnabled?: boolean;\n charFillColors?: string[];\n}\n\nexport interface EffectLayer {\n id: string;\n type: EffectLayerType;\n name: string;\n enabled: boolean;\n opacity: number;\n blendMode: GlobalCompositeOperation;\n target: LayerTarget;\n params: Record<string, unknown>;\n}\n\nexport interface CompositorSettings {\n blur: number;\n bloom: number;\n bloomThreshold?: number;\n}\n\nexport interface Keyframe {\n time: number;\n value: number;\n easing?: \"linear\" | \"easeIn\" | \"easeOut\" | \"easeInOut\";\n}\n\nexport interface AnimTrack {\n layerId: string;\n paramPath: string;\n keyframes: Keyframe[];\n}\n\nexport interface Timeline {\n duration: number;\n fps: number;\n loop: boolean;\n tracks: AnimTrack[];\n}\n\nexport interface SceneDocument {\n version: typeof SCENE_VERSION;\n effectName: string;\n canvas: SceneCanvas;\n text: SceneText;\n effectLayers: EffectLayer[];\n customEngineId: CustomEngineId | null;\n engineParams?: Record<string, unknown>;\n compositor: CompositorSettings;\n timeline: Timeline;\n /** Legacy flat config cache for gradual UI migration */\n legacyConfig?: TextEffectConfig;\n /** Deep Research extension snippet (not executed until sandboxed) */\n extensionCode?: string | null;\n}\n\nexport interface StyleRecipe {\n id: string;\n name: string;\n category?: string;\n layers: EffectLayer[];\n exposed: string[];\n tags: string[];\n customEngineId?: CustomEngineId | null;\n scene?: SceneDocument;\n}\n\nexport function createEmptyScene(overrides?: Partial<SceneDocument>): SceneDocument {\n return {\n version: SCENE_VERSION,\n effectName: \"My Effect\",\n canvas: { width: 800, height: 200, background: \"transparent\" },\n text: {\n content: \"CLYPRA\",\n fontFamily: \"Poppins\",\n fontWeight: 700,\n fontStyle: \"normal\",\n fontSize: 80,\n letterSpacing: 4,\n lineHeight: 1.2,\n textPosX: \"center\",\n textPosY: \"middle\",\n },\n effectLayers: [],\n customEngineId: null,\n compositor: { blur: 0, bloom: 0, bloomThreshold: 0.6 },\n timeline: { duration: 2, fps: 30, loop: true, tracks: [] },\n ...overrides,\n };\n}\n\nexport function newLayerId(): string {\n return `layer-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 7)}`;\n}\n","import type { SceneDocument } from \"./schema\";\nimport { newLayerId } from \"./schema\";\n\n/** Attach MVP demo animation tracks (shadow drift + optional mask reveal) */\nexport function ensureDefaultTimeline(doc: SceneDocument): SceneDocument {\n if (doc.timeline.tracks.length > 0) return doc;\n\n const shadowLayer = doc.effectLayers.find((l) => l.type === \"shadow\");\n const maskLayer = doc.effectLayers.find((l) => l.type === \"mask\");\n\n const tracks: SceneDocument[\"timeline\"][\"tracks\"] = [];\n\n if (shadowLayer) {\n tracks.push({\n layerId: shadowLayer.id,\n paramPath: \"shadowOffsetY\",\n keyframes: [\n { time: 0, value: (shadowLayer.params.shadowOffsetY as number) ?? 5, easing: \"easeInOut\" },\n {\n time: doc.timeline.duration / 2,\n value: ((shadowLayer.params.shadowOffsetY as number) ?? 5) + 8,\n easing: \"easeInOut\",\n },\n {\n time: doc.timeline.duration,\n value: (shadowLayer.params.shadowOffsetY as number) ?? 5,\n easing: \"easeInOut\",\n },\n ],\n });\n }\n\n if (maskLayer) {\n tracks.push({\n layerId: maskLayer.id,\n paramPath: \"revealProgress\",\n keyframes: [\n { time: 0, value: 0, easing: \"easeOut\" },\n { time: doc.timeline.duration * 0.85, value: 1, easing: \"easeOut\" },\n ],\n });\n maskLayer.enabled = false;\n }\n\n return {\n ...doc,\n effectLayers: doc.effectLayers.map((l) => ({ ...l })),\n timeline: { ...doc.timeline, tracks },\n };\n}\n\nexport function cloneSceneWithNewIds(doc: SceneDocument): SceneDocument {\n const idMap = new Map<string, string>();\n const effectLayers = doc.effectLayers.map((l) => {\n const id = newLayerId();\n idMap.set(l.id, id);\n return { ...l, id, params: { ...l.params } };\n });\n const tracks = doc.timeline.tracks.map((t) => ({\n ...t,\n layerId: idMap.get(t.layerId) ?? t.layerId,\n keyframes: t.keyframes.map((k) => ({ ...k })),\n }));\n return { ...doc, effectLayers, timeline: { ...doc.timeline, tracks } };\n}\n","import type { TextEffectConfig, GlowLayer } from \"../types\";\nimport { defaultConfig } from \"../presets\";\nimport { type SceneDocument, type EffectLayer, type CustomEngineId, newLayerId, LEGACY_RENDERER_MAP, ENGINE_ID_TO_LEGACY } from \"./schema\";\nimport { ensureDefaultTimeline } from \"./timelineDefaults\";\n\nfunction layer(type: EffectLayer[\"type\"], name: string, params: Record<string, unknown>, extra?: Partial<EffectLayer>): EffectLayer {\n return {\n id: newLayerId(),\n type,\n name,\n enabled: true,\n opacity: 1,\n blendMode: \"source-over\",\n target: type === \"panel\" ? \"scene\" : \"text\",\n params,\n ...extra,\n };\n}\n\nexport function resolveCustomEngineId(cfg: TextEffectConfig): CustomEngineId | null {\n if (!cfg.customRenderer) return null;\n return LEGACY_RENDERER_MAP[cfg.customRenderer] ?? null;\n}\n\n/** Lossless migration from flat TextEffectConfig to SceneDocument */\nexport function textEffectConfigToScene(cfg: TextEffectConfig): SceneDocument {\n const engineId = resolveCustomEngineId(cfg);\n const layers: EffectLayer[] = [];\n\n if (engineId) {\n layers.push(\n layer(\n \"customEngine\",\n \"Custom Engine\",\n { engineId },\n {\n enabled: true,\n target: \"scene\",\n },\n ),\n );\n layers.push(\n layer(\n \"customEngine\",\n \"Engine Params\",\n { ...collectEngineParams(cfg, engineId) },\n {\n enabled: true,\n target: \"text\",\n },\n ),\n );\n }\n\n layers.push(\n layer(\n \"panel\",\n \"Background Panel\",\n {\n panelEnabled: cfg.panelEnabled,\n panelColor: cfg.panelColor,\n panelOpacity: cfg.panelOpacity,\n panelRadius: cfg.panelRadius,\n panelPaddingX: cfg.panelPaddingX,\n panelPaddingY: cfg.panelPaddingY,\n panelStrokeEnabled: cfg.panelStrokeEnabled,\n panelStrokeColor: cfg.panelStrokeColor,\n panelStrokeWidth: cfg.panelStrokeWidth,\n },\n { enabled: cfg.panelEnabled },\n ),\n );\n\n (cfg.glowLayers || []).forEach((g: GlowLayer, i: number) => {\n layers.push(layer(\"glow\", `Glow ${i + 1}`, { ...g }, { enabled: g.enabled, opacity: (g.opacity ?? 100) / 100 }));\n });\n\n layers.push(\n layer(\n \"shadow\",\n \"Shadow\",\n {\n shadowEnabled: cfg.shadowEnabled,\n shadowColor: cfg.shadowColor,\n shadowBlur: cfg.shadowBlur,\n shadowOffsetX: cfg.shadowOffsetX,\n shadowOffsetY: cfg.shadowOffsetY,\n shadowOpacity: cfg.shadowOpacity,\n shadowType: cfg.shadowType,\n },\n { enabled: cfg.shadowEnabled },\n ),\n );\n\n layers.push(\n layer(\n \"extrusion\",\n \"Bevel / Extrusion\",\n {\n bevelEnabled: cfg.bevelEnabled,\n bevelDepth: cfg.bevelDepth,\n bevelHighlight: cfg.bevelHighlight,\n bevelShadow: cfg.bevelShadow,\n bevelDirection: cfg.bevelDirection,\n bevelCoreColor: cfg.bevelCoreColor,\n bevelEdgeColor: cfg.bevelEdgeColor,\n bevelEdgeWidth: cfg.bevelEdgeWidth,\n bevelBlur: cfg.bevelBlur,\n bevelBlurColor: cfg.bevelBlurColor,\n bevelPerspectiveEnabled: cfg.bevelPerspectiveEnabled,\n bevelVanishingPointX: cfg.bevelVanishingPointX,\n bevelVanishingPointY: cfg.bevelVanishingPointY,\n bevelFocalLength: cfg.bevelFocalLength,\n },\n { enabled: cfg.bevelEnabled },\n ),\n );\n\n layers.push(\n layer(\n \"duplicateStack\",\n \"Stack Extrusion\",\n {\n stackEnabled: cfg.stackEnabled,\n stackCount: cfg.stackCount,\n stackOffsetX: cfg.stackOffsetX,\n stackOffsetY: cfg.stackOffsetY,\n stackOpacityDecay: cfg.stackOpacityDecay,\n stackColor1: cfg.stackColor1,\n stackColor2: cfg.stackColor2,\n stackColor3: cfg.stackColor3,\n stackColor4: cfg.stackColor4,\n },\n { enabled: !!cfg.stackEnabled },\n ),\n );\n\n layers.push(\n layer(\n \"stroke\",\n \"Stroke\",\n {\n strokeEnabled: cfg.strokeEnabled,\n strokeColor: cfg.strokeColor,\n strokeWidth: cfg.strokeWidth,\n strokePosition: cfg.strokePosition,\n strokeOpacity: cfg.strokeOpacity,\n strokeLineJoin: cfg.strokeLineJoin,\n strokeBlur: cfg.strokeBlur,\n strokeType: cfg.strokeType,\n strokeColorSecondary: cfg.strokeColorSecondary,\n strokeWidthSecondary: cfg.strokeWidthSecondary,\n strokeFadeRange: cfg.strokeFadeRange,\n },\n { enabled: cfg.strokeEnabled },\n ),\n );\n\n layers.push(\n layer(\n \"fill\",\n \"Fill\",\n {\n fillType: cfg.fillType,\n fillColor: cfg.fillColor,\n fillGradientAngle: cfg.fillGradientAngle,\n fillGradientStops: cfg.fillGradientStops,\n patternType: cfg.patternType,\n perCharFillEnabled: cfg.perCharFillEnabled,\n charFillColors: cfg.charFillColors,\n },\n { enabled: cfg.fillType !== \"none\" },\n ),\n );\n\n layers.push(layer(\"mask\", \"Text Alpha Mask\", { maskType: \"alphaText\", revealProgress: 1 }, { enabled: false }));\n\n layers.push(layer(\"filter\", \"Compositor FX\", { blur: 0, bloom: 0 }, { enabled: false, target: \"previous\" }));\n\n const doc: SceneDocument = {\n version: 1,\n effectName: cfg.effectName,\n canvas: {\n width: cfg.canvasWidth,\n height: cfg.canvasHeight,\n background: \"transparent\",\n },\n text: {\n content: cfg.text,\n fontFamily: cfg.fontFamily,\n fontWeight: cfg.fontWeight,\n fontStyle: cfg.fontStyle,\n fontSize: cfg.fontSize,\n letterSpacing: cfg.letterSpacing,\n lineHeight: cfg.lineHeight,\n textPosX: cfg.textPosX,\n textPosY: cfg.textPosY,\n wrapText: cfg.wrapText !== false,\n autoFitText: !!cfg.autoFitText,\n perCharFillEnabled: cfg.perCharFillEnabled,\n charFillColors: cfg.charFillColors,\n },\n effectLayers: layers,\n customEngineId: engineId,\n engineParams: engineId ? collectEngineParams(cfg, engineId) : undefined,\n compositor: { blur: 0, bloom: 0, bloomThreshold: 0.6 },\n timeline: { duration: 2, fps: 30, loop: true, tracks: [] },\n legacyConfig: { ...cfg },\n };\n\n return ensureDefaultTimeline(doc);\n}\n\nfunction collectEngineParams(cfg: TextEffectConfig, id: CustomEngineId): Record<string, unknown> {\n switch (id) {\n case \"ink\":\n return {\n inkColor: cfg.inkColor,\n bristleDensity: cfg.bristleDensity,\n bristleSkipRate: cfg.bristleSkipRate,\n dripRate: cfg.dripRate,\n dripMaxLength: cfg.dripMaxLength,\n grainDensity: cfg.grainDensity,\n skewX: cfg.skewX,\n };\n default:\n return {};\n }\n}\n\nfunction getLayerParams<T extends Record<string, unknown>>(doc: SceneDocument, type: EffectLayer[\"type\"], index = 0): T | undefined {\n const found = doc.effectLayers.filter((l) => l.type === type);\n return found[index]?.params as T | undefined;\n}\n\n/** Flatten SceneDocument back to TextEffectConfig for legacy controls and renderer */\nexport function sceneToConfig(doc: SceneDocument): TextEffectConfig {\n const base: TextEffectConfig = doc.legacyConfig\n ? { ...doc.legacyConfig }\n : {\n ...createDefaultFromScene(doc),\n };\n\n base.effectName = doc.effectName;\n base.text = doc.text.content;\n base.fontFamily = doc.text.fontFamily;\n base.fontWeight = doc.text.fontWeight;\n base.fontStyle = doc.text.fontStyle;\n base.fontSize = doc.text.fontSize;\n base.letterSpacing = doc.text.letterSpacing;\n base.lineHeight = doc.text.lineHeight;\n base.textPosX = doc.text.textPosX;\n base.textPosY = doc.text.textPosY;\n base.wrapText = doc.text.wrapText !== false;\n base.autoFitText = !!doc.text.autoFitText;\n base.canvasWidth = doc.canvas.width;\n base.canvasHeight = doc.canvas.height;\n\n const panel = getLayerParams<Record<string, unknown>>(doc, \"panel\");\n if (panel) {\n Object.assign(base, {\n panelEnabled: panel.panelEnabled,\n panelColor: panel.panelColor,\n panelOpacity: panel.panelOpacity,\n panelRadius: panel.panelRadius,\n panelPaddingX: panel.panelPaddingX,\n panelPaddingY: panel.panelPaddingY,\n panelStrokeEnabled: panel.panelStrokeEnabled,\n panelStrokeColor: panel.panelStrokeColor,\n panelStrokeWidth: panel.panelStrokeWidth,\n });\n }\n\n const glows = doc.effectLayers.filter((l) => l.type === \"glow\");\n base.glowLayers = glows.map((l) => {\n const p = l.params as unknown as GlowLayer;\n return {\n enabled: l.enabled && (p.enabled ?? true),\n color: p.color ?? \"#7C6FFF\",\n blur: p.blur ?? 20,\n opacity: Math.round((p.opacity ?? 80) * (l.opacity ?? 1)),\n type: p.type ?? \"outer\",\n strength: p.strength,\n spread: p.spread,\n };\n });\n while (base.glowLayers.length < 3) {\n base.glowLayers.push({\n enabled: false,\n color: \"#7C6FFF\",\n blur: 20,\n opacity: 80,\n type: \"outer\",\n });\n }\n\n const shadow = getLayerParams<Record<string, unknown>>(doc, \"shadow\");\n if (shadow) Object.assign(base, shadow);\n\n const extrusion = getLayerParams<Record<string, unknown>>(doc, \"extrusion\");\n if (extrusion) Object.assign(base, extrusion);\n\n const stack = getLayerParams<Record<string, unknown>>(doc, \"duplicateStack\");\n if (stack) Object.assign(base, stack);\n\n const stroke = getLayerParams<Record<string, unknown>>(doc, \"stroke\");\n if (stroke) Object.assign(base, stroke);\n\n const fill = getLayerParams<Record<string, unknown>>(doc, \"fill\");\n if (fill) Object.assign(base, fill);\n\n base.perCharFillEnabled = doc.text.perCharFillEnabled ?? (fill?.perCharFillEnabled as boolean);\n base.charFillColors = doc.text.charFillColors ?? (fill?.charFillColors as string[] | undefined);\n\n if (doc.customEngineId) {\n base.customRenderer = ENGINE_ID_TO_LEGACY[doc.customEngineId];\n Object.assign(base, doc.engineParams || {});\n } else {\n base.customRenderer = undefined;\n }\n\n base.glowLayers = base.glowLayers.slice(0, 6);\n\n const filterLayers = doc.effectLayers.filter((l) => l.type === \"filter\" && l.enabled);\n const filter = filterLayers[filterLayers.length - 1]?.params as { blur?: number; bloom?: number };\n const compositor = {\n blur: filter?.blur ?? doc.compositor.blur ?? 0,\n bloom: filter?.bloom ?? doc.compositor.bloom ?? 0,\n bloomThreshold: doc.compositor.bloomThreshold ?? 0.6,\n };\n\n return base;\n}\n\nexport function syncCompositorFromScene(doc: SceneDocument): CompositorFromScene {\n const filterLayers = doc.effectLayers.filter((l) => l.type === \"filter\" && l.enabled);\n const filter = filterLayers[filterLayers.length - 1]?.params as { blur?: number; bloom?: number };\n return {\n blur: filter?.blur ?? doc.compositor.blur ?? 0,\n bloom: filter?.bloom ?? doc.compositor.bloom ?? 0,\n bloomThreshold: doc.compositor.bloomThreshold ?? 0.6,\n };\n}\n\nexport interface CompositorFromScene {\n blur: number;\n bloom: number;\n bloomThreshold: number;\n}\n\nfunction createDefaultFromScene(doc: SceneDocument): TextEffectConfig {\n const cfg = { ...defaultConfig };\n cfg.text = doc.text.content;\n return cfg;\n}\n\n/** Apply engine params from scene onto config without require() */\nexport function mergeSceneIntoConfig(doc: SceneDocument, base: TextEffectConfig): TextEffectConfig {\n const out = sceneToConfig({ ...doc, legacyConfig: base });\n return out;\n}\n","import type { SceneDocument, Keyframe } from \"./schema\";\n\nexport function ease(t: number, kind: Keyframe[\"easing\"] = \"linear\"): number {\n switch (kind) {\n case \"easeIn\":\n return t * t;\n case \"easeOut\":\n return t * (2 - t);\n case \"easeInOut\":\n return t < 0.5 ? 2 * t * t : -1 + (4 - 2 * t) * t;\n default:\n return t;\n }\n}\n\nfunction interpolateKeyframes(keyframes: Keyframe[], time: number): number {\n if (keyframes.length === 0) return 0;\n const sorted = [...keyframes].sort((a, b) => a.time - b.time);\n if (time <= sorted[0].time) return sorted[0].value;\n if (time >= sorted[sorted.length - 1].time) return sorted[sorted.length - 1].value;\n\n for (let i = 0; i < sorted.length - 1; i++) {\n const a = sorted[i];\n const b = sorted[i + 1];\n if (time >= a.time && time <= b.time) {\n const span = b.time - a.time || 1;\n const localT = (time - a.time) / span;\n const eased = ease(localT, b.easing ?? \"linear\");\n return a.value + (b.value - a.value) * eased;\n }\n }\n return sorted[sorted.length - 1].value;\n}\n\n/** Resolve animated scalar at time (seconds) */\nexport function resolveAnimatedScalar(doc: SceneDocument, layerId: string, paramPath: string, baseValue: number, time: number): number {\n const track = doc.timeline.tracks.find((t) => t.layerId === layerId && t.paramPath === paramPath);\n if (!track || track.keyframes.length === 0) return baseValue;\n return interpolateKeyframes(track.keyframes, time);\n}\n\n/** Apply timeline to scene (returns shallow clone with updated layer params) */\nexport function applyTimelineAtTime(doc: SceneDocument, time: number): SceneDocument {\n const looped = doc.timeline.loop && doc.timeline.duration > 0 ? time % doc.timeline.duration : Math.min(time, doc.timeline.duration);\n\n const layers = doc.effectLayers.map((layer) => {\n let opacity = layer.opacity;\n const params = { ...layer.params };\n for (const track of doc.timeline.tracks) {\n if (track.layerId !== layer.id) continue;\n if (track.paramPath === \"layerOpacity\") {\n opacity = resolveAnimatedScalar(doc, layer.id, track.paramPath, opacity, looped);\n continue;\n }\n const parts = track.paramPath.split(\".\");\n let target: Record<string, unknown> = params;\n for (let i = 0; i < parts.length - 1; i++) {\n const key = parts[i];\n if (typeof target[key] !== \"object\" || target[key] === null) {\n target[key] = {};\n }\n target = target[key] as Record<string, unknown>;\n }\n const leaf = parts[parts.length - 1];\n const current = typeof target[leaf] === \"number\" ? (target[leaf] as number) : 0;\n target[leaf] = resolveAnimatedScalar(doc, layer.id, track.paramPath, current, looped);\n }\n return { ...layer, opacity, params };\n });\n\n return { ...doc, effectLayers: layers };\n}\n\nexport function createDefaultRevealTrack(layerId: string): SceneDocument[\"timeline\"][\"tracks\"][0] {\n return {\n layerId,\n paramPath: \"revealProgress\",\n keyframes: [\n { time: 0, value: 0, easing: \"easeOut\" },\n { time: 1, value: 1, easing: \"easeOut\" },\n ],\n };\n}\n\nexport function createPulseOpacityTrack(layerId: string): SceneDocument[\"timeline\"][\"tracks\"][0] {\n return {\n layerId,\n paramPath: \"layerOpacity\",\n keyframes: [\n { time: 0, value: 0.6, easing: \"easeInOut\" },\n { time: 1, value: 1, easing: \"easeInOut\" },\n { time: 2, value: 0.6, easing: \"easeInOut\" },\n ],\n };\n}\n","import type { CompositorSettings } from \"../engine/schema\";\n\nconst VERTEX_SRC = `#version 300 es\nin vec2 a_pos;\nin vec2 a_uv;\nout vec2 v_uv;\nvoid main() {\n v_uv = a_uv;\n gl_Position = vec4(a_pos, 0.0, 1.0);\n}\n`;\n\nconst FRAGMENT_SRC = `#version 300 es\nprecision highp float;\nin vec2 v_uv;\nuniform sampler2D u_tex;\nuniform vec2 u_texel;\nuniform float u_blur;\nuniform float u_bloom;\nuniform float u_bloomThreshold;\nout vec4 outColor;\n\nvoid main() {\n vec4 c = texture(u_tex, v_uv);\n if (u_blur < 0.5 && u_bloom < 0.01) {\n outColor = c;\n return;\n }\n vec4 sum = c;\n float w = 0.0;\n if (u_blur >= 0.5) {\n sum = vec4(0.0);\n w = 0.0;\n for (int x = -2; x <= 2; x++) {\n for (int y = -2; y <= 2; y++) {\n vec2 off = vec2(float(x), float(y)) * u_texel * u_blur;\n vec4 s = texture(u_tex, v_uv + off);\n float weight = 1.0 / (1.0 + float(x*x + y*y));\n sum += s * weight;\n w += weight;\n }\n }\n sum /= w;\n }\n vec3 bloom = vec3(0.0);\n if (u_bloom > 0.01) {\n float lum = dot(sum.rgb, vec3(0.299, 0.587, 0.114));\n if (lum > u_bloomThreshold) {\n bloom = sum.rgb * u_bloom * (lum - u_bloomThreshold);\n }\n }\n outColor = vec4(clamp(sum.rgb + bloom, 0.0, 1.0), c.a);\n}\n`;\n\nexport class WebGLCompositor {\n private gl: WebGL2RenderingContext | null = null;\n private program: WebGLProgram | null = null;\n private vao: WebGLVertexArrayObject | null = null;\n private texture: WebGLTexture | null = null;\n public readonly isSupported: boolean;\n\n constructor() {\n if (typeof document === \"undefined\") {\n this.isSupported = false;\n return;\n }\n const canvas = document.createElement(\"canvas\");\n canvas.width = 2;\n canvas.height = 2;\n const gl = canvas.getContext(\"webgl2\", { premultipliedAlpha: true, alpha: true });\n if (!gl) {\n this.isSupported = false;\n return;\n }\n this.gl = gl;\n this.isSupported = this.initProgram(gl);\n }\n\n private initProgram(gl: WebGL2RenderingContext): boolean {\n const vs = this.compileShader(gl, gl.VERTEX_SHADER, VERTEX_SRC);\n const fs = this.compileShader(gl, gl.FRAGMENT_SHADER, FRAGMENT_SRC);\n if (!vs || !fs) return false;\n\n const program = gl.createProgram();\n if (!program) return false;\n gl.attachShader(program, vs);\n gl.attachShader(program, fs);\n gl.linkProgram(program);\n if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {\n console.warn(\"Compositor program link failed\", gl.getProgramInfoLog(program));\n return false;\n }\n this.program = program;\n\n const positions = new Float32Array([-1, -1, 0, 1, 1, -1, 1, 1, -1, 1, 0, 0, 1, 1, 1, 0]);\n const vao = gl.createVertexArray();\n const vbo = gl.createBuffer();\n gl.bindVertexArray(vao);\n gl.bindBuffer(gl.ARRAY_BUFFER, vbo);\n gl.bufferData(gl.ARRAY_BUFFER, positions, gl.STATIC_DRAW);\n const locPos = gl.getAttribLocation(program, \"a_pos\");\n const locUv = gl.getAttribLocation(program, \"a_uv\");\n gl.enableVertexAttribArray(locPos);\n gl.vertexAttribPointer(locPos, 2, gl.FLOAT, false, 16, 0);\n gl.enableVertexAttribArray(locUv);\n gl.vertexAttribPointer(locUv, 2, gl.FLOAT, false, 16, 8);\n gl.bindVertexArray(null);\n this.vao = vao;\n\n this.texture = gl.createTexture();\n return true;\n }\n\n private compileShader(gl: WebGL2RenderingContext, type: number, source: string): WebGLShader | null {\n const shader = gl.createShader(type);\n if (!shader) return null;\n gl.shaderSource(shader, source);\n gl.compileShader(shader);\n if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {\n console.warn(gl.getShaderInfoLog(shader));\n return null;\n }\n return shader;\n }\n\n renderToContext(targetCtx: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D, source: HTMLCanvasElement | OffscreenCanvas, settings: CompositorSettings): void {\n const gl = this.gl;\n const program = this.program;\n if (!gl || !program || !this.isSupported) {\n targetCtx.clearRect(0, 0, source.width, source.height);\n targetCtx.drawImage(source as CanvasImageSource, 0, 0);\n return;\n }\n\n const w = source.width;\n const h = source.height;\n\n const canvas = gl.canvas as HTMLCanvasElement;\n if (canvas.width !== w || canvas.height !== h) {\n canvas.width = w;\n canvas.height = h;\n }\n\n gl.viewport(0, 0, w, h);\n gl.clearColor(0, 0, 0, 0);\n gl.clear(gl.COLOR_BUFFER_BIT);\n\n gl.useProgram(program);\n gl.activeTexture(gl.TEXTURE0);\n gl.bindTexture(gl.TEXTURE_2D, this.texture);\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 gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\n gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true);\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, source as TexImageSource);\n\n gl.uniform1i(gl.getUniformLocation(program, \"u_tex\"), 0);\n gl.uniform2f(gl.getUniformLocation(program, \"u_texel\"), 1 / w, 1 / h);\n gl.uniform1f(gl.getUniformLocation(program, \"u_blur\"), settings.blur ?? 0);\n gl.uniform1f(gl.getUniformLocation(program, \"u_bloom\"), settings.bloom ?? 0);\n gl.uniform1f(gl.getUniformLocation(program, \"u_bloomThreshold\"), settings.bloomThreshold ?? 0.6);\n\n gl.bindVertexArray(this.vao);\n gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);\n gl.bindVertexArray(null);\n\n targetCtx.clearRect(0, 0, w, h);\n targetCtx.drawImage(canvas, 0, 0);\n }\n\n dispose(): void {\n const gl = this.gl;\n if (!gl) return;\n if (this.texture) gl.deleteTexture(this.texture);\n if (this.program) gl.deleteProgram(this.program);\n if (this.vao) gl.deleteVertexArray(this.vao);\n this.gl = null;\n }\n}\n","import type { SceneDocument } from \"./schema\";\n\n/** Apply rectangular wipe reveal (MVP mask) on composed canvas */\nexport function applyMaskReveal(\n ctx: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D,\n doc: SceneDocument,\n width: number,\n height: number\n): void {\n const maskLayer = doc.effectLayers.find((l) => l.type === \"mask\" && l.enabled);\n if (!maskLayer) return;\n\n const maskType = (maskLayer.params.maskType as string) || \"alphaText\";\n const progress = Math.max(0, Math.min(1, (maskLayer.params.revealProgress as number) ?? 1));\n if (progress >= 1) return;\n\n ctx.save();\n ctx.globalCompositeOperation = \"destination-in\";\n\n if (maskType === \"rectReveal\") {\n const w = width * progress;\n ctx.fillStyle = \"#ffffff\";\n ctx.fillRect(0, 0, w, height);\n } else {\n // alphaText: horizontal reveal as MVP stand-in until glyph masks exist\n const w = width * progress;\n const grad = ctx.createLinearGradient(0, 0, width, 0);\n grad.addColorStop(0, \"rgba(255,255,255,1)\");\n grad.addColorStop(Math.max(0, progress - 0.02), \"rgba(255,255,255,1)\");\n grad.addColorStop(Math.min(1, progress + 0.02), \"rgba(255,255,255,0)\");\n grad.addColorStop(1, \"rgba(255,255,255,0)\");\n ctx.fillStyle = grad;\n ctx.fillRect(0, 0, width, height);\n }\n\n ctx.restore();\n}\n","import type { TextEffectConfig } from \"../types\";\nimport { renderTextEffectCore } from \"../renderer\";\nimport { sceneToConfig, textEffectConfigToScene } from \"./migrate\";\nimport { applyTimelineAtTime } from \"./animation\";\nimport type { SceneDocument } from \"./schema\";\nimport { WebGLCompositor } from \"../compositor\";\nimport { applyMaskReveal } from \"./mask\";\n\nexport interface EvaluateOptions {\n compositor?: WebGLCompositor | null;\n skipPostFx?: boolean;\n}\n\nlet sharedCompositor: WebGLCompositor | null = null;\n\nfunction getCompositor(): WebGLCompositor | null {\n if (typeof document === \"undefined\") return null;\n if (!sharedCompositor) {\n sharedCompositor = new WebGLCompositor();\n }\n return sharedCompositor;\n}\n\n/**\n * Single source of truth for rendering a scene at time t.\n */\nexport function evaluateScene(doc: SceneDocument, time: number, ctx: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D, options: EvaluateOptions = {}): void {\n const animated = applyTimelineAtTime(doc, time);\n const cfg = sceneToConfig(animated);\n\n const w = cfg.canvasWidth || 800;\n const h = cfg.canvasHeight || 200;\n\n const filterLayers = animated.effectLayers.filter((l) => l.type === \"filter\" && l.enabled);\n const lastFilter = filterLayers[filterLayers.length - 1]?.params as { blur?: number; bloom?: number };\n const comp = {\n blur: lastFilter?.blur ?? animated.compositor.blur ?? 0,\n bloom: lastFilter?.bloom ?? animated.compositor.bloom ?? 0,\n bloomThreshold: animated.compositor.bloomThreshold ?? 0.6,\n };\n\n const usePostFx = !options.skipPostFx && (comp.blur > 0 || comp.bloom > 0);\n\n const finishFrame = () => applyMaskReveal(ctx, animated, w, h);\n\n if (!usePostFx) {\n ctx.clearRect(0, 0, w, h);\n renderTextEffectCore(ctx, cfg);\n finishFrame();\n return;\n }\n\n const off = typeof OffscreenCanvas !== \"undefined\" ? new OffscreenCanvas(w, h) : null;\n\n if (off) {\n const offCtx = off.getContext(\"2d\");\n if (!offCtx) {\n renderTextEffectCore(ctx, cfg);\n finishFrame();\n return;\n }\n renderTextEffectCore(offCtx, cfg);\n applyMaskReveal(offCtx, animated, w, h);\n const compositor = options.compositor ?? getCompositor();\n if (compositor?.isSupported) {\n compositor.renderToContext(ctx, off, comp);\n return;\n }\n ctx.clearRect(0, 0, w, h);\n ctx.drawImage(off as unknown as CanvasImageSource, 0, 0);\n return;\n }\n\n // Fallback: draw to temp canvas in DOM\n if (typeof document !== \"undefined\") {\n const temp = document.createElement(\"canvas\");\n temp.width = w;\n temp.height = h;\n const tctx = temp.getContext(\"2d\");\n if (tctx) {\n renderTextEffectCore(tctx, cfg);\n applyMaskReveal(tctx, animated, w, h);\n const compositor = options.compositor ?? getCompositor();\n if (compositor?.isSupported) {\n compositor.renderToContext(ctx, temp, comp);\n return;\n }\n ctx.clearRect(0, 0, w, h);\n ctx.drawImage(temp, 0, 0);\n return;\n }\n }\n\n renderTextEffectCore(ctx, cfg);\n finishFrame();\n}\n\nexport function evaluateConfig(cfg: TextEffectConfig, time: number, ctx: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D, options?: EvaluateOptions): void {\n evaluateScene(textEffectConfigToScene(cfg), time, ctx, options);\n}\n\nexport function advanceSceneTime(doc: SceneDocument, steps: number): number {\n const dt = 1 / (doc.timeline.fps || 30);\n const next = (doc as SceneDocument & { _time?: number })._time ?? 0;\n const duration = doc.timeline.duration || 2;\n let t = next + steps * dt;\n if (doc.timeline.loop) {\n t = duration > 0 ? t % duration : t;\n } else {\n t = Math.min(t, duration);\n }\n (doc as SceneDocument & { _time?: number })._time = t;\n return t;\n}\n\nexport function getSceneTime(doc: SceneDocument): number {\n return (doc as SceneDocument & { _time?: number })._time ?? 0;\n}\n\nexport function setSceneTime(doc: SceneDocument, time: number): void {\n (doc as SceneDocument & { _time?: number })._time = time;\n}\n\nexport function resetSceneTime(doc: SceneDocument): void {\n (doc as SceneDocument & { _time?: number })._time = 0;\n}\n","import type { Preset } from \"../types\";\nimport { builtInPresets } from \"../presets\";\nimport type { SceneDocument, StyleRecipe } from \"./schema\";\nimport { textEffectConfigToScene } from \"./migrate\";\n\nconst sceneCache = new Map<string, SceneDocument>();\n\nexport function getPresetScene(preset: Preset): SceneDocument {\n if (sceneCache.has(preset.id)) {\n return structuredClone(sceneCache.get(preset.id)!);\n }\n const scene = textEffectConfigToScene(preset.config);\n sceneCache.set(preset.id, scene);\n return structuredClone(scene);\n}\n\nexport function presetToRecipe(preset: Preset): StyleRecipe {\n const scene = getPresetScene(preset);\n return {\n id: preset.id,\n name: preset.name,\n category: preset.category,\n layers: structuredClone(scene.effectLayers),\n exposed: [\n \"fill.fillColor\",\n \"stroke.strokeWidth\",\n \"shadow.shadowBlur\",\n \"glow.0.opacity\",\n ],\n tags: [preset.category || \"Classic\", preset.id],\n customEngineId: scene.customEngineId,\n scene,\n };\n}\n\nexport const builtInRecipes: StyleRecipe[] = builtInPresets.map(presetToRecipe);\n\nexport function applyRecipeToScene(\n base: SceneDocument,\n recipe: StyleRecipe\n): SceneDocument {\n return {\n ...base,\n effectName: recipe.name,\n effectLayers: structuredClone(recipe.layers),\n customEngineId: recipe.customEngineId ?? null,\n engineParams: recipe.scene?.engineParams,\n compositor: recipe.scene?.compositor ?? base.compositor,\n timeline: recipe.scene?.timeline ?? base.timeline,\n };\n}\n\nexport function clearRecipeCache(): void {\n sceneCache.clear();\n}\n","/**\n * Programmatic Lottie Animation Builder and Mutation Engine (Bodymovin Schema)\n * Supports creating compositions from scratch, layer insertions, and visual keyframe timeline tracking.\n *\n * Font Handling:\n * Lottie-web uses the 'fName' property to look up fonts in the browser's CSS.\n * Each font variant (Regular, Bold, Italic, BoldItalic) is registered as a separate\n * font-family name (e.g., \"Poppins-Italic\") that maps to the actual font with\n * appropriate font-weight and font-style via @font-face rules in index.css.\n */\n\nexport interface EasingControlPoint {\n x: number[];\n y: number[];\n}\n\nexport interface LottieKeyframe {\n t: number; // Frame number\n s: number[] | number; // Start value at this keyframe\n i?: EasingControlPoint; // Easing in control points\n o?: EasingControlPoint; // Easing out control points\n}\n\nexport type LottiePropertyPath = \"ks.a\" | \"ks.p\" | \"ks.s\" | \"ks.r\" | \"ks.o\";\n\n/**\n * Creates a valid minimum blank slate Lottie composition\n */\nexport function createBlankLottie(w: number, h: number, fps: number, durationFrames: number): any {\n return {\n v: \"5.7.5\",\n fr: fps,\n ip: 0,\n op: durationFrames,\n w,\n h,\n nm: \"Clypra Motion Composition\",\n ddd: 0,\n assets: [],\n layers: [],\n fonts: {\n list: [\n {\n fName: \"Poppins-Bold\",\n fFamily: \"Poppins\",\n fWeight: \"700\",\n fStyle: \"Bold\",\n asName: \"Poppins-Bold\",\n },\n {\n fName: \"Poppins-Regular\",\n fFamily: \"Poppins\",\n fWeight: \"400\",\n fStyle: \"Regular\",\n asName: \"Poppins-Regular\",\n },\n {\n fName: \"Poppins-Italic\",\n fFamily: \"Poppins\",\n fWeight: \"400\",\n fStyle: \"Italic\",\n asName: \"Poppins-Italic\",\n },\n {\n fName: \"Poppins-BoldItalic\",\n fFamily: \"Poppins\",\n fWeight: \"700\",\n fStyle: \"Bold Italic\",\n asName: \"Poppins-BoldItalic\",\n },\n {\n fName: \"Arial\",\n fFamily: \"Arial\",\n fWeight: \"400\",\n fStyle: \"Regular\",\n asName: \"Arial\",\n },\n {\n fName: \"Arial-Bold\",\n fFamily: \"Arial\",\n fWeight: \"700\",\n fStyle: \"Bold\",\n asName: \"Arial-Bold\",\n },\n {\n fName: \"Arial-Italic\",\n fFamily: \"Arial\",\n fWeight: \"400\",\n fStyle: \"Italic\",\n asName: \"Arial-Italic\",\n },\n {\n fName: \"Arial-BoldItalic\",\n fFamily: \"Arial\",\n fWeight: \"700\",\n fStyle: \"Bold Italic\",\n asName: \"Arial-BoldItalic\",\n },\n {\n fName: \"Montserrat-Regular\",\n fFamily: \"Montserrat\",\n fWeight: \"400\",\n fStyle: \"Regular\",\n asName: \"Montserrat-Regular\",\n },\n {\n fName: \"Montserrat-Bold\",\n fFamily: \"Montserrat\",\n fWeight: \"700\",\n fStyle: \"Bold\",\n asName: \"Montserrat-Bold\",\n },\n {\n fName: \"Montserrat-ExtraBold\",\n fFamily: \"Montserrat\",\n fWeight: \"800\",\n fStyle: \"ExtraBold\",\n asName: \"Montserrat-ExtraBold\",\n },\n {\n fName: \"Montserrat-Black\",\n fFamily: \"Montserrat\",\n fWeight: \"900\",\n fStyle: \"Black\",\n asName: \"Montserrat-Black\",\n },\n {\n fName: \"Montserrat-Italic\",\n fFamily: \"Montserrat\",\n fWeight: \"400\",\n fStyle: \"Italic\",\n asName: \"Montserrat-Italic\",\n },\n {\n fName: \"Montserrat-BoldItalic\",\n fFamily: \"Montserrat\",\n fWeight: \"700\",\n fStyle: \"Bold Italic\",\n asName: \"Montserrat-BoldItalic\",\n },\n {\n fName: \"Montserrat-ExtraBoldItalic\",\n fFamily: \"Montserrat\",\n fWeight: \"800\",\n fStyle: \"ExtraBold Italic\",\n asName: \"Montserrat-ExtraBoldItalic\",\n },\n {\n fName: \"Montserrat-BlackItalic\",\n fFamily: \"Montserrat\",\n fWeight: \"900\",\n fStyle: \"Black Italic\",\n asName: \"Montserrat-BlackItalic\",\n },\n ],\n },\n };\n}\n\n/**\n * Re-indexes layer indices (ind) in a Lottie composition to ensure ordering integrity\n */\nexport function reindexLayers(lottieData: any): void {\n if (!lottieData || !Array.isArray(lottieData.layers)) return;\n lottieData.layers.forEach((layer: any, index: number) => {\n // Standard layers index is 1-indexed descending\n layer.ind = lottieData.layers.length - index;\n });\n}\n\n/**\n * Adds a solid background layer (ty === 1) to the composition\n */\nexport function addSolidLayer(lottieData: any, name: string, color: string, w: number, h: number): any {\n const clone = JSON.parse(JSON.stringify(lottieData));\n if (!Array.isArray(clone.layers)) clone.layers = [];\n\n const newLayer = {\n ty: 1,\n nm: name,\n sr: 1,\n st: 0,\n ip: 0,\n op: clone.op,\n ind: clone.layers.length + 1,\n sw: w,\n sh: h,\n sc: color, // Solid color hex\n ks: {\n a: { a: 0, k: [0, 0, 0] },\n p: { a: 0, k: [w / 2, h / 2, 0] },\n s: { a: 0, k: [100, 100, 100] },\n r: { a: 0, k: 0 },\n o: { a: 0, k: 100 },\n },\n };\n\n // Prepend so that solid backgrounds sit at the bottom of the rendering stack\n clone.layers.push(newLayer);\n reindexLayers(clone);\n return clone;\n}\n\n/**\n * Adds a standard vector text layer (ty === 5) to the composition\n */\nexport function addTextLayer(lottieData: any, name: string, text: string): any {\n const clone = JSON.parse(JSON.stringify(lottieData));\n if (!Array.isArray(clone.layers)) clone.layers = [];\n\n const w = clone.w || 1920;\n const h = clone.h || 1080;\n\n const newLayer = {\n ty: 5,\n nm: name,\n sr: 1,\n st: 0,\n ip: 0,\n op: clone.op,\n ind: clone.layers.length + 1,\n ks: {\n a: { a: 0, k: [0, 0, 0] },\n p: { a: 0, k: [w / 2, h / 2, 0] },\n s: { a: 0, k: [100, 100, 100] },\n r: { a: 0, k: 0 },\n o: { a: 0, k: 100 },\n },\n t: {\n d: {\n k: [\n {\n s: {\n s: 64, // Font size\n f: \"Poppins-Bold\", // Font name\n t: text, // Initial Text content\n j: 1, // Center alignment\n tr: 0,\n lh: 80, // Line height\n ls: 0,\n fc: [1, 1, 1], // White [r,g,b] range 0-1\n },\n },\n ],\n },\n p: {},\n a: [],\n m: {\n g: 1,\n a: {\n a: 0,\n k: [0, 0],\n },\n },\n },\n };\n\n // Prepend to render on top\n clone.layers.unshift(newLayer);\n reindexLayers(clone);\n return clone;\n}\n\n/**\n * Adds an empty shape layer (ty === 4) to the composition\n */\nexport function addShapeLayer(lottieData: any, name: string): any {\n const clone = JSON.parse(JSON.stringify(lottieData));\n if (!Array.isArray(clone.layers)) clone.layers = [];\n\n const w = clone.w || 1920;\n const h = clone.h || 1080;\n\n const newLayer = {\n ty: 4,\n nm: name,\n sr: 1,\n st: 0,\n ip: 0,\n op: clone.op,\n ind: clone.layers.length + 1,\n ks: {\n a: { a: 0, k: [0, 0, 0] },\n p: { a: 0, k: [w / 2, h / 2, 0] },\n s: { a: 0, k: [100, 100, 100] },\n r: { a: 0, k: 0 },\n o: { a: 0, k: 100 },\n },\n shapes: [],\n };\n\n clone.layers.unshift(newLayer);\n reindexLayers(clone);\n return clone;\n}\n\n/**\n * Appends a basic vector shape (Rectangle or Ellipse) to a shape layer\n */\nexport function addVectorShape(lottieData: any, layerIndex: number, shapeType: \"rect\" | \"ellipse\", colorHex: string): any {\n const clone = JSON.parse(JSON.stringify(lottieData));\n const layer = clone.layers[layerIndex];\n if (!layer || layer.ty !== 4) return clone;\n\n if (!Array.isArray(layer.shapes)) layer.shapes = [];\n\n // Convert hex color to normalized [r, g, b]\n const cleanHex = colorHex.startsWith(\"#\") ? colorHex.slice(1) : colorHex;\n const r = parseInt(cleanHex.slice(0, 2), 16) / 255 || 0.5;\n const g = parseInt(cleanHex.slice(2, 4), 16) / 255 || 0.4;\n const b = parseInt(cleanHex.slice(4, 6), 16) / 255 || 1.0;\n\n let shapeContent: any;\n\n if (shapeType === \"rect\") {\n shapeContent = {\n ty: \"gr\",\n nm: \"Rectangle Group\",\n it: [\n {\n ty: \"rc\", // Rectangle\n nm: \"Rect Path\",\n p: { a: 0, k: [0, 0] }, // position centered in group\n s: { a: 0, k: [250, 150] }, // size\n r: { a: 0, k: 8 }, // rounded corners\n },\n {\n ty: \"fl\", // Fill shape\n nm: \"Rect Fill\",\n c: { a: 0, k: [r, g, b, 1] }, // color\n o: { a: 0, k: 100 },\n },\n {\n ty: \"tr\", // Group transform\n nm: \"Group Transform\",\n p: { a: 0, k: [0, 0] },\n a: { a: 0, k: [0, 0] },\n s: { a: 0, k: [100, 100] },\n r: { a: 0, k: 0 },\n o: { a: 0, k: 100 },\n },\n ],\n };\n } else {\n shapeContent = {\n ty: \"gr\",\n nm: \"Ellipse Group\",\n it: [\n {\n ty: \"el\", // Ellipse\n nm: \"Ellipse Path\",\n p: { a: 0, k: [0, 0] },\n s: { a: 0, k: [200, 200] },\n },\n {\n ty: \"fl\",\n nm: \"Ellipse Fill\",\n c: { a: 0, k: [r, g, b, 1] },\n o: { a: 0, k: 100 },\n },\n {\n ty: \"tr\",\n nm: \"Group Transform\",\n p: { a: 0, k: [0, 0] },\n a: { a: 0, k: [0, 0] },\n s: { a: 0, k: [100, 100] },\n r: { a: 0, k: 0 },\n o: { a: 0, k: 100 },\n },\n ],\n };\n }\n\n layer.shapes.push(shapeContent);\n return clone;\n}\n\n/**\n * Gets the nested object inside a layer via property path (e.g. 'ks.p')\n */\nfunction getProperty(layer: any, path: LottiePropertyPath): any {\n if (!layer) return null;\n const keys = path.split(\".\");\n let current = layer;\n for (const key of keys) {\n if (!current[key]) return null;\n current = current[key];\n }\n return current;\n}\n\n/**\n * Updates a static property on a Lottie layer\n */\nexport function updateStaticProperty(lottieData: any, layerIndex: number, path: LottiePropertyPath, value: number | number[]): any {\n const clone = JSON.parse(JSON.stringify(lottieData));\n const layer = clone.layers[layerIndex];\n if (!layer) return clone;\n\n const propObj = getProperty(layer, path);\n if (propObj) {\n propObj.a = 0; // Not animated\n\n // Ensure 3D coordinate array bounds\n if (Array.isArray(value) && (path === \"ks.p\" || path === \"ks.s\" || path === \"ks.a\")) {\n propObj.k = [value[0] || 0, value[1] || 0, value[2] || 0];\n } else {\n propObj.k = value;\n }\n }\n\n return clone;\n}\n\n/**\n * Standard easing cubic bezier presets mapping\n */\nconst EASING_CURVES: Record<string, { o: EasingControlPoint; i: EasingControlPoint }> = {\n linear: {\n o: { x: [0], y: [0] },\n i: { x: [1], y: [1] },\n },\n easeIn: {\n o: { x: [0.42], y: [0] },\n i: { x: [1], y: [1] },\n },\n easeOut: {\n o: { x: [0], y: [0] },\n i: { x: [0.58], y: [1] },\n },\n easeInOut: {\n o: { x: [0.42], y: [0] },\n i: { x: [0.58], y: [1] },\n },\n};\n\n/**\n * Converts a static property to an animated keyframed track, inserting a default start keyframe\n */\nexport function enableKeyframing(lottieData: any, layerIndex: number, path: LottiePropertyPath): any {\n const clone = JSON.parse(JSON.stringify(lottieData));\n const layer = clone.layers[layerIndex];\n if (!layer) return clone;\n\n const propObj = getProperty(layer, path);\n if (propObj && propObj.a === 0) {\n const staticValue = propObj.k;\n propObj.a = 1; // Animated!\n\n // Create initial keyframe at frame 0\n propObj.k = [\n {\n t: 0,\n s: staticValue,\n i: EASING_CURVES.easeInOut.i,\n o: EASING_CURVES.easeInOut.o,\n },\n ];\n }\n return clone;\n}\n\n/**\n * Inserts or updates a keyframe in an animated Lottie property track\n */\nexport function addOrUpdateKeyframe(lottieData: any, layerIndex: number, path: LottiePropertyPath, frame: number, value: number | number[], easing: \"linear\" | \"easeIn\" | \"easeOut\" | \"easeInOut\" = \"easeInOut\"): any {\n const clone = JSON.parse(JSON.stringify(lottieData));\n const layer = clone.layers[layerIndex];\n if (!layer) return clone;\n\n const propObj = getProperty(layer, path);\n if (!propObj) return clone;\n\n // Guarantee keyframing is active\n if (propObj.a === 0) {\n // If not animated, convert to keyframed first\n propObj.a = 1;\n propObj.k = [\n {\n t: 0,\n s: propObj.k,\n i: EASING_CURVES[easing].i,\n o: EASING_CURVES[easing].o,\n },\n ];\n }\n\n const keyframes: LottieKeyframe[] = propObj.k;\n\n // Format coordinate values\n let formattedVal = value;\n if (Array.isArray(value) && (path === \"ks.p\" || path === \"ks.s\" || path === \"ks.a\")) {\n formattedVal = [value[0] || 0, value[1] || 0, value[2] || 0];\n }\n\n // Look for existing keyframe at exact frame number\n const matchIndex = keyframes.findIndex((kf) => kf.t === frame);\n const curves = EASING_CURVES[easing];\n\n if (matchIndex !== -1) {\n // Update existing keyframe\n keyframes[matchIndex].s = formattedVal;\n keyframes[matchIndex].i = curves.i;\n keyframes[matchIndex].o = curves.o;\n } else {\n // Insert new keyframe\n keyframes.push({\n t: frame,\n s: formattedVal,\n i: curves.i,\n o: curves.o,\n });\n\n // Keep keyframes sorted by frame time ascending\n keyframes.sort((a, b) => a.t - b.t);\n }\n\n // Bodymovin specification requires the last keyframe in the array to NOT contain easing control points,\n // as it represents the endpoint of the animation.\n keyframes.forEach((kf, idx) => {\n if (idx === keyframes.length - 1) {\n delete kf.i;\n delete kf.o;\n } else {\n kf.i = kf.i || curves.i;\n kf.o = kf.o || curves.o;\n }\n });\n\n return clone;\n}\n\n/**\n * Removes a keyframe from an animated Lottie property track\n */\nexport function deleteKeyframe(lottieData: any, layerIndex: number, path: LottiePropertyPath, frame: number): any {\n const clone = JSON.parse(JSON.stringify(lottieData));\n const layer = clone.layers[layerIndex];\n if (!layer) return clone;\n\n const propObj = getProperty(layer, path);\n if (!propObj || propObj.a === 0) return clone;\n\n let keyframes: LottieKeyframe[] = propObj.k;\n\n // Remove match\n keyframes = keyframes.filter((kf) => kf.t !== frame);\n\n if (keyframes.length === 0) {\n // If no keyframes left, convert back to static at frame 0 values\n propObj.a = 0;\n propObj.k = path === \"ks.p\" || path === \"ks.s\" || path === \"ks.a\" ? [0, 0, 0] : 0;\n } else {\n propObj.k = keyframes;\n\n // Patch last keyframe ending\n keyframes.forEach((kf, idx) => {\n if (idx === keyframes.length - 1) {\n delete kf.i;\n delete kf.o;\n }\n });\n }\n\n return clone;\n}\n\n/**\n * Adds an image asset and corresponding Image Layer (ty === 2) to the composition\n */\nexport function addImageLayer(lottieData: any, name: string, base64Data: string, w: number, h: number): any {\n const clone = JSON.parse(JSON.stringify(lottieData));\n if (!Array.isArray(clone.assets)) clone.assets = [];\n if (!Array.isArray(clone.layers)) clone.layers = [];\n\n const assetId = `img_${Date.now()}`;\n\n // 1. Add image to assets pool\n clone.assets.push({\n id: assetId,\n w,\n h,\n u: \"\",\n p: base64Data, // data:image/png;base64,...\n e: 1,\n });\n\n const compW = clone.w || 1920;\n const compH = clone.h || 1080;\n\n // 2. Add Image Layer pointing to the asset\n const newLayer = {\n ty: 2,\n nm: name,\n refId: assetId,\n sr: 1,\n st: 0,\n ip: 0,\n op: clone.op,\n ind: clone.layers.length + 1,\n ks: {\n a: { a: 0, k: [w / 2, h / 2, 0] },\n p: { a: 0, k: [compW / 2, compH / 2, 0] },\n s: { a: 0, k: [100, 100, 100] },\n r: { a: 0, k: 0 },\n o: { a: 0, k: 100 },\n },\n };\n\n clone.layers.unshift(newLayer);\n reindexLayers(clone);\n return clone;\n}\n\n/**\n * Sets or clears the track matte mask setting of a layer\n * matteType: 0 = None, 1 = Alpha Matte, 2 = Alpha Inverted Matte\n */\nexport function updateTrackMatte(lottieData: any, layerIndex: number, matteType: number): any {\n const clone = JSON.parse(JSON.stringify(lottieData));\n const layer = clone.layers[layerIndex];\n if (!layer) return clone;\n\n if (matteType === 0) {\n delete layer.tt;\n } else {\n layer.tt = matteType;\n }\n\n return clone;\n}\n","/**\n * Lottie JSON Parser\n * Auto-extracts dimensions, length, framerate, and all text layers.\n */\n\nexport interface ParsedTextLayer {\n layerName: string;\n defaultText: string;\n}\n\nexport interface LottieFileInfo {\n width: number;\n height: number;\n fps: number;\n durationFrames: number;\n textLayers: ParsedTextLayer[];\n}\n\n/**\n * Extracts the default text string from a Lottie layer.t.d.k structure\n */\nexport function getDefaultText(layer: any): string {\n if (!layer.t || !layer.t.d) return \"\";\n const d = layer.t.d;\n if (Array.isArray(d.k)) {\n const firstKf = d.k[0];\n if (firstKf && firstKf.s && typeof firstKf.s.t === \"string\") {\n return firstKf.s.t;\n }\n } else if (d.k && d.k.s && typeof d.k.s.t === \"string\") {\n return d.k.s.t;\n }\n return \"\";\n}\n\n/**\n * Recursively scans layers (including nested precompositions) for text layers (ty === 5)\n */\nexport function scanTextLayers(lottieData: any): ParsedTextLayer[] {\n const result: ParsedTextLayer[] = [];\n const visitedLayerNames = new Set<string>();\n\n function traverseLayers(layers: any[]) {\n if (!Array.isArray(layers)) return;\n for (const layer of layers) {\n if (!layer) continue;\n\n // Text layer is ty === 5\n if (layer.ty === 5) {\n const name = layer.nm || \"Unnamed Layer\";\n const defaultText = getDefaultText(layer);\n if (!visitedLayerNames.has(name)) {\n visitedLayerNames.add(name);\n result.push({\n layerName: name,\n defaultText,\n });\n }\n }\n }\n }\n\n // 1. Scan main layers\n if (Array.isArray(lottieData.layers)) {\n traverseLayers(lottieData.layers);\n }\n\n // 2. Scan layers inside assets (pre-compositions)\n if (Array.isArray(lottieData.assets)) {\n for (const asset of lottieData.assets) {\n if (asset && Array.isArray(asset.layers)) {\n traverseLayers(asset.layers);\n }\n }\n }\n\n return result;\n}\n\n/**\n * Parse an uploaded Lottie JSON object to extract metadata and text layers\n */\nexport function parseLottieJson(lottieData: any): LottieFileInfo {\n if (!lottieData || typeof lottieData !== \"object\") {\n throw new Error(\"Invalid Lottie JSON payload.\");\n }\n\n const width = typeof lottieData.w === \"number\" ? lottieData.w : 1920;\n const height = typeof lottieData.h === \"number\" ? lottieData.h : 1080;\n const fps = typeof lottieData.fr === \"number\" ? lottieData.fr : 30;\n\n const ip = typeof lottieData.ip === \"number\" ? lottieData.ip : 0;\n const op = typeof lottieData.op === \"number\" ? lottieData.op : 100;\n const durationFrames = Math.max(1, Math.round(op - ip));\n\n const textLayers = scanTextLayers(lottieData);\n\n return {\n width,\n height,\n fps,\n durationFrames,\n textLayers,\n };\n}\n","/**\n * Lottie Customization & Injections Engine\n * Implements real-time text, color, and full per-layer style mutations.\n */\n\nexport interface TextLayerConfig {\n layerName: string;\n defaultText: string;\n maxCharacters: number;\n role: \"primary\" | \"secondary\" | \"accent\";\n}\n\nexport type TextCustomization = {\n primary: string;\n secondary: string;\n accent: string;\n};\n\n/** Full per-layer text style override — all fields optional */\nexport interface TextStyleOverride {\n text?: string;\n fontName?: string; // Lottie fName e.g. \"Poppins-Bold\"\n fontSize?: number;\n fillColor?: string; // hex\n strokeColor?: string; // hex\n strokeWidth?: number;\n tracking?: number; // Lottie tr\n lineHeight?: number; // Lottie lh (absolute px)\n align?: 0 | 1 | 2 | 3; // 0=left 1=center 2=right 3=justify\n opacity?: number; // 0–100\n scaleX?: number; // 0–200 %\n scaleY?: number;\n posX?: number;\n posY?: number;\n rotation?: number;\n}\n\n// ─── Helpers ─────────────────────────────────────────────────────────────────\n\n/**\n * Convert #RRGGBB to Lottie normalized [r, g, b] (0–1).\n */\nexport function hexToLottieRgb(hex: string): [number, number, number] {\n const clean = (hex.startsWith(\"#\") ? hex.slice(1) : hex).padEnd(6, \"0\");\n if (clean.length !== 6) return [0, 0, 0];\n return [Math.max(0, Math.min(1, parseInt(clean.slice(0, 2), 16) / 255)), Math.max(0, Math.min(1, parseInt(clean.slice(2, 4), 16) / 255)), Math.max(0, Math.min(1, parseInt(clean.slice(4, 6), 16) / 255))];\n}\n\nfunction applyToTextDoc(doc: any, override: TextStyleOverride): void {\n if (!doc) return;\n if (override.text !== undefined) doc.t = override.text.replace(/\\n/g, \"\\r\");\n if (override.fontName !== undefined) doc.f = override.fontName;\n if (override.fontSize !== undefined) doc.s = override.fontSize;\n if (override.tracking !== undefined) doc.tr = override.tracking;\n if (override.lineHeight !== undefined) doc.lh = override.lineHeight;\n if (override.align !== undefined) doc.j = override.align;\n if (override.fillColor !== undefined) doc.fc = hexToLottieRgb(override.fillColor);\n if (override.strokeColor !== undefined && override.strokeWidth !== undefined) {\n doc.sc = hexToLottieRgb(override.strokeColor);\n doc.sw = override.strokeWidth;\n } else if (override.strokeWidth !== undefined) {\n doc.sw = override.strokeWidth;\n }\n}\n\nfunction applyToLayerTransform(layer: any, override: TextStyleOverride): void {\n const ks = layer.ks;\n if (!ks) return;\n if (override.opacity !== undefined && ks.o?.a === 0) ks.o.k = override.opacity;\n if (override.rotation !== undefined && ks.r?.a === 0) ks.r.k = override.rotation;\n if (override.scaleX !== undefined && override.scaleY !== undefined && ks.s?.a === 0) {\n ks.s.k = [override.scaleX, override.scaleY, 100];\n }\n if (override.posX !== undefined && override.posY !== undefined && ks.p?.a === 0) {\n const z = Array.isArray(ks.p.k) ? (ks.p.k[2] ?? 0) : 0;\n ks.p.k = [override.posX, override.posY, z];\n }\n}\n\nfunction mutateTextLayer(layer: any, override: TextStyleOverride): void {\n if (!layer || layer.ty !== 5) return;\n applyToLayerTransform(layer, override);\n const td = layer.t?.d;\n if (!td) return;\n if (Array.isArray(td.k)) {\n td.k.forEach((kf: any) => {\n if (kf?.s) applyToTextDoc(kf.s, override);\n });\n } else if (td.k?.s) {\n applyToTextDoc(td.k.s, override);\n }\n}\n\nfunction traverseAllLayers(lottieData: any, fn: (layer: any) => void): void {\n if (Array.isArray(lottieData.layers)) lottieData.layers.forEach(fn);\n if (Array.isArray(lottieData.assets)) {\n lottieData.assets.forEach((asset: any) => {\n if (Array.isArray(asset.layers)) asset.layers.forEach(fn);\n });\n }\n}\n\n// ─── Public API ───────────────────────────────────────────────────────────────\n\n/**\n * Inject text content into mapped text layers by role.\n */\nexport function injectText(lottieData: any, customization: TextCustomization, textLayers: TextLayerConfig[]): any {\n if (!lottieData) return lottieData;\n const clone = JSON.parse(JSON.stringify(lottieData));\n const configMap = new Map(textLayers.map((l) => [l.layerName, l]));\n\n traverseAllLayers(clone, (layer) => {\n if (layer.ty !== 5) return;\n const config = configMap.get(layer.nm);\n if (!config) return;\n const raw = customization[config.role] ?? config.defaultText;\n const text = raw.slice(0, config.maxCharacters);\n mutateTextLayer(layer, { text });\n });\n\n return clone;\n}\n\n/**\n * Inject a full style override into a specific named text layer.\n */\nexport function injectTextStyle(lottieData: any, layerName: string, override: TextStyleOverride): any {\n if (!lottieData) return lottieData;\n const clone = JSON.parse(JSON.stringify(lottieData));\n\n traverseAllLayers(clone, (layer) => {\n if (layer.ty !== 5 || layer.nm !== layerName) return;\n mutateTextLayer(layer, override);\n });\n\n return clone;\n}\n\n/**\n * Inject style overrides into ALL text layers at once.\n * Useful for applying a global font/color change.\n */\nexport function injectGlobalTextStyle(lottieData: any, override: Omit<TextStyleOverride, \"text\" | \"posX\" | \"posY\">): any {\n if (!lottieData) return lottieData;\n const clone = JSON.parse(JSON.stringify(lottieData));\n\n traverseAllLayers(clone, (layer) => {\n if (layer.ty !== 5) return;\n mutateTextLayer(layer, override);\n });\n\n return clone;\n}\n\n/**\n * Inject fill color into shape layers (ty === \"fl\") within a named layer.\n */\nexport function injectColor(lottieData: any, layerName: string, hexColor: string): any {\n if (!lottieData || !layerName) return lottieData;\n const clone = JSON.parse(JSON.stringify(lottieData));\n const targetRgb = hexToLottieRgb(hexColor);\n\n function traverseShapes(obj: any): void {\n if (!obj || typeof obj !== \"object\") return;\n if (obj.ty === \"fl\" && obj.c) {\n const c = obj.c;\n if (Array.isArray(c.k) && c.k.length >= 3) {\n c.k[0] = targetRgb[0];\n c.k[1] = targetRgb[1];\n c.k[2] = targetRgb[2];\n } else {\n c.k = [...targetRgb];\n }\n }\n for (const key of Object.keys(obj)) {\n const val = obj[key];\n if (Array.isArray(val)) val.forEach(traverseShapes);\n else if (val && typeof val === \"object\") traverseShapes(val);\n }\n }\n\n traverseAllLayers(clone, (layer) => {\n if (layer.nm === layerName) traverseShapes(layer);\n });\n\n return clone;\n}\n\n/**\n * Inject solid layer background color (ty === 1).\n */\nexport function injectSolidColor(lottieData: any, layerName: string, hexColor: string): any {\n if (!lottieData) return lottieData;\n const clone = JSON.parse(JSON.stringify(lottieData));\n\n traverseAllLayers(clone, (layer) => {\n if (layer.ty === 1 && layer.nm === layerName) {\n layer.sc = hexColor;\n }\n });\n\n return clone;\n}\n\n/**\n * Batch inject multiple overrides in one pass — most efficient for live preview.\n */\nexport interface BatchInjection {\n textCustomization?: { customization: TextCustomization; layers: TextLayerConfig[] };\n styleOverrides?: Array<{ layerName: string; override: TextStyleOverride }>;\n colorOverrides?: Array<{ layerName: string; color: string }>;\n solidOverrides?: Array<{ layerName: string; color: string }>;\n hiddenLayers?: Set<number>;\n}\n\nexport function injectBatch(lottieData: any, batch: BatchInjection): any {\n if (!lottieData) return lottieData;\n let clone = JSON.parse(JSON.stringify(lottieData));\n\n // Apply visibility toggles\n if (batch.hiddenLayers && Array.isArray(clone.layers)) {\n clone.layers.forEach((layer: any, idx: number) => {\n layer.hd = batch.hiddenLayers!.has(idx);\n });\n }\n\n // Text content injection\n if (batch.textCustomization) {\n const { customization, layers } = batch.textCustomization;\n const configMap = new Map(layers.map((l) => [l.layerName, l]));\n traverseAllLayers(clone, (layer) => {\n if (layer.ty !== 5) return;\n const config = configMap.get(layer.nm);\n if (!config) return;\n const raw = customization[config.role] ?? config.defaultText;\n mutateTextLayer(layer, { text: raw.slice(0, config.maxCharacters) });\n });\n }\n\n // Per-layer style overrides\n if (batch.styleOverrides) {\n const styleMap = new Map(batch.styleOverrides.map((s) => [s.layerName, s.override]));\n traverseAllLayers(clone, (layer) => {\n if (layer.ty !== 5) return;\n const override = styleMap.get(layer.nm);\n if (override) mutateTextLayer(layer, override);\n });\n }\n\n // Shape color overrides\n if (batch.colorOverrides) {\n for (const { layerName, color } of batch.colorOverrides) {\n clone = injectColor(clone, layerName, color);\n }\n }\n\n // Solid layer color overrides\n if (batch.solidOverrides) {\n for (const { layerName, color } of batch.solidOverrides) {\n clone = injectSolidColor(clone, layerName, color);\n }\n }\n\n return clone;\n}\n","/**\n * Lottie Text Animation Presets — CapCut-grade entrance, exit, and loop animations.\n * Each preset returns a set of Lottie keyframe tracks to bake into a text layer.\n */\n\nexport type AnimationCategory = \"entrance\" | \"exit\" | \"loop\" | \"emphasis\";\n\nexport interface LottieAnimPreset {\n id: string;\n name: string;\n category: AnimationCategory;\n icon: string;\n description: string;\n /** Duration in frames this animation occupies */\n defaultDurationFrames: number;\n /** Build keyframes for a given layer, start frame, total frames, and comp size */\n buildTracks: (opts: AnimBuildOpts) => AnimTrackDef[];\n}\n\nexport interface AnimBuildOpts {\n layerIndex: number;\n startFrame: number;\n endFrame: number;\n totalFrames: number;\n compW: number;\n compH: number;\n /** For exit animations, the frame at which exit begins */\n exitStartFrame?: number;\n}\n\nexport interface AnimKeyframe {\n t: number;\n s: number[] | number;\n i?: { x: number[]; y: number[] };\n o?: { x: number[]; y: number[] };\n}\n\nexport interface AnimTrackDef {\n /** Lottie property path e.g. \"ks.p\", \"ks.s\", \"ks.o\", \"ks.r\" */\n path: string;\n keyframes: AnimKeyframe[];\n}\n\n// ─── Easing helpers ──────────────────────────────────────────────────────────\n\nconst EASE_OUT = { i: { x: [0.58], y: [1] }, o: { x: [0.42], y: [0] } };\nconst EASE_IN = { i: { x: [1], y: [1] }, o: { x: [0.42], y: [0] } };\nconst EASE_IO = { i: { x: [0.58], y: [1] }, o: { x: [0.42], y: [0] } };\nconst SPRING = { i: { x: [0.175], y: [0.885] }, o: { x: [0.32], y: [1.275] } };\nconst LINEAR = { i: { x: [1], y: [1] }, o: { x: [0], y: [0] } };\nconst BOUNCE = { i: { x: [0.215], y: [0.61] }, o: { x: [0.755], y: [0.05] } };\n\nfunction kf(t: number, s: number[] | number, easing = EASE_OUT): AnimKeyframe {\n return { t, s, ...easing };\n}\n\nfunction lastKf(t: number, s: number[] | number): AnimKeyframe {\n return { t, s };\n}\n\n// ─── Entrance Animations ─────────────────────────────────────────────────────\n\nconst fadeIn: LottieAnimPreset = {\n id: \"fade-in\",\n name: \"Fade In\",\n category: \"entrance\",\n icon: \"✨\",\n description: \"Simple opacity fade from 0 to 100\",\n defaultDurationFrames: 20,\n buildTracks: ({ startFrame, endFrame }) => [\n {\n path: \"ks.o\",\n keyframes: [kf(startFrame, 0, EASE_OUT), lastKf(endFrame, 100)],\n },\n ],\n};\n\nconst slideUp: LottieAnimPreset = {\n id: \"slide-up\",\n name: \"Slide Up\",\n category: \"entrance\",\n icon: \"⬆️\",\n description: \"Slides in from below with fade\",\n defaultDurationFrames: 25,\n buildTracks: ({ startFrame, endFrame, compH }) => [\n { path: \"ks.p\", keyframes: [kf(startFrame, [0, compH * 0.15, 0], SPRING), lastKf(endFrame, [0, 0, 0])] },\n { path: \"ks.o\", keyframes: [kf(startFrame, 0, EASE_OUT), lastKf(endFrame, 100)] },\n ],\n};\n\nconst slideDown: LottieAnimPreset = {\n id: \"slide-down\",\n name: \"Slide Down\",\n category: \"entrance\",\n icon: \"⬇️\",\n description: \"Slides in from above with fade\",\n defaultDurationFrames: 25,\n buildTracks: ({ startFrame, endFrame, compH }) => [\n { path: \"ks.p\", keyframes: [kf(startFrame, [0, -compH * 0.15, 0], SPRING), lastKf(endFrame, [0, 0, 0])] },\n { path: \"ks.o\", keyframes: [kf(startFrame, 0, EASE_OUT), lastKf(endFrame, 100)] },\n ],\n};\n\nconst slideLeft: LottieAnimPreset = {\n id: \"slide-left\",\n name: \"Slide Left\",\n category: \"entrance\",\n icon: \"⬅️\",\n description: \"Slides in from the right\",\n defaultDurationFrames: 25,\n buildTracks: ({ startFrame, endFrame, compW }) => [\n { path: \"ks.p\", keyframes: [kf(startFrame, [compW * 0.3, 0, 0], SPRING), lastKf(endFrame, [0, 0, 0])] },\n { path: \"ks.o\", keyframes: [kf(startFrame, 0, EASE_OUT), lastKf(endFrame, 100)] },\n ],\n};\n\nconst slideRight: LottieAnimPreset = {\n id: \"slide-right\",\n name: \"Slide Right\",\n category: \"entrance\",\n icon: \"➡️\",\n description: \"Slides in from the left\",\n defaultDurationFrames: 25,\n buildTracks: ({ startFrame, endFrame, compW }) => [\n { path: \"ks.p\", keyframes: [kf(startFrame, [-compW * 0.3, 0, 0], SPRING), lastKf(endFrame, [0, 0, 0])] },\n { path: \"ks.o\", keyframes: [kf(startFrame, 0, EASE_OUT), lastKf(endFrame, 100)] },\n ],\n};\n\nconst zoomIn: LottieAnimPreset = {\n id: \"zoom-in\",\n name: \"Zoom In\",\n category: \"entrance\",\n icon: \"🔍\",\n description: \"Scales up from 0 with spring overshoot\",\n defaultDurationFrames: 22,\n buildTracks: ({ startFrame, endFrame }) => [\n { path: \"ks.s\", keyframes: [kf(startFrame, [0, 0, 100], SPRING), lastKf(endFrame, [100, 100, 100])] },\n { path: \"ks.o\", keyframes: [kf(startFrame, 0, EASE_OUT), lastKf(endFrame, 100)] },\n ],\n};\n\nconst zoomInBounce: LottieAnimPreset = {\n id: \"zoom-in-bounce\",\n name: \"Zoom Bounce\",\n category: \"entrance\",\n icon: \"💥\",\n description: \"Scales up with elastic overshoot\",\n defaultDurationFrames: 30,\n buildTracks: ({ startFrame, endFrame }) => {\n const mid = Math.round(startFrame + (endFrame - startFrame) * 0.7);\n return [\n { path: \"ks.s\", keyframes: [kf(startFrame, [0, 0, 100], SPRING), kf(mid, [115, 115, 100], BOUNCE), lastKf(endFrame, [100, 100, 100])] },\n { path: \"ks.o\", keyframes: [kf(startFrame, 0, EASE_OUT), lastKf(endFrame, 100)] },\n ];\n },\n};\n\nconst popIn: LottieAnimPreset = {\n id: \"pop-in\",\n name: \"Pop In\",\n category: \"entrance\",\n icon: \"🎯\",\n description: \"Quick scale pop with overshoot\",\n defaultDurationFrames: 18,\n buildTracks: ({ startFrame, endFrame }) => {\n const mid = Math.round(startFrame + (endFrame - startFrame) * 0.6);\n return [\n { path: \"ks.s\", keyframes: [kf(startFrame, [60, 60, 100], SPRING), kf(mid, [110, 110, 100], BOUNCE), lastKf(endFrame, [100, 100, 100])] },\n { path: \"ks.o\", keyframes: [kf(startFrame, 0, EASE_OUT), lastKf(endFrame, 100)] },\n ];\n },\n};\n\nconst flipX: LottieAnimPreset = {\n id: \"flip-x\",\n name: \"Flip X\",\n category: \"entrance\",\n icon: \"🔄\",\n description: \"Horizontal flip reveal\",\n defaultDurationFrames: 25,\n buildTracks: ({ startFrame, endFrame }) => [\n { path: \"ks.s\", keyframes: [kf(startFrame, [0, 100, 100], EASE_OUT), lastKf(endFrame, [100, 100, 100])] },\n { path: \"ks.o\", keyframes: [kf(startFrame, 0, EASE_OUT), lastKf(endFrame, 100)] },\n ],\n};\n\nconst flipY: LottieAnimPreset = {\n id: \"flip-y\",\n name: \"Flip Y\",\n category: \"entrance\",\n icon: \"🔃\",\n description: \"Vertical flip reveal\",\n defaultDurationFrames: 25,\n buildTracks: ({ startFrame, endFrame }) => [\n { path: \"ks.s\", keyframes: [kf(startFrame, [100, 0, 100], EASE_OUT), lastKf(endFrame, [100, 100, 100])] },\n { path: \"ks.o\", keyframes: [kf(startFrame, 0, EASE_OUT), lastKf(endFrame, 100)] },\n ],\n};\n\nconst rotateIn: LottieAnimPreset = {\n id: \"rotate-in\",\n name: \"Rotate In\",\n category: \"entrance\",\n icon: \"🌀\",\n description: \"Spins in from -90 degrees\",\n defaultDurationFrames: 28,\n buildTracks: ({ startFrame, endFrame }) => [\n { path: \"ks.r\", keyframes: [kf(startFrame, -90, SPRING), lastKf(endFrame, 0)] },\n { path: \"ks.s\", keyframes: [kf(startFrame, [60, 60, 100], EASE_OUT), lastKf(endFrame, [100, 100, 100])] },\n { path: \"ks.o\", keyframes: [kf(startFrame, 0, EASE_OUT), lastKf(endFrame, 100)] },\n ],\n};\n\nconst blurIn: LottieAnimPreset = {\n id: \"blur-in\",\n name: \"Blur In\",\n category: \"entrance\",\n icon: \"🌫️\",\n description: \"Fades in from blurred state (opacity only; blur via filter layer)\",\n defaultDurationFrames: 22,\n buildTracks: ({ startFrame, endFrame }) => [\n { path: \"ks.s\", keyframes: [kf(startFrame, [120, 120, 100], EASE_OUT), lastKf(endFrame, [100, 100, 100])] },\n { path: \"ks.o\", keyframes: [kf(startFrame, 0, EASE_OUT), lastKf(endFrame, 100)] },\n ],\n};\n\nconst dropIn: LottieAnimPreset = {\n id: \"drop-in\",\n name: \"Drop In\",\n category: \"entrance\",\n icon: \"🪂\",\n description: \"Drops from above with bounce landing\",\n defaultDurationFrames: 30,\n buildTracks: ({ startFrame, endFrame, compH }) => {\n const land = Math.round(startFrame + (endFrame - startFrame) * 0.75);\n const bounce = Math.round(startFrame + (endFrame - startFrame) * 0.88);\n return [\n { path: \"ks.p\", keyframes: [kf(startFrame, [0, -compH * 0.4, 0], EASE_IN), kf(land, [0, 8, 0], BOUNCE), kf(bounce, [0, -4, 0], EASE_OUT), lastKf(endFrame, [0, 0, 0])] },\n { path: \"ks.o\", keyframes: [kf(startFrame, 100), lastKf(endFrame, 100)] },\n ];\n },\n};\n\nconst typewriter: LottieAnimPreset = {\n id: \"typewriter\",\n name: \"Typewriter\",\n category: \"entrance\",\n icon: \"⌨️\",\n description: \"Classic typewriter reveal via scale-X wipe\",\n defaultDurationFrames: 35,\n buildTracks: ({ startFrame, endFrame }) => [\n { path: \"ks.s\", keyframes: [kf(startFrame, [0, 100, 100], LINEAR), lastKf(endFrame, [100, 100, 100])] },\n { path: \"ks.o\", keyframes: [kf(startFrame, 100), lastKf(endFrame, 100)] },\n ],\n};\n\nconst wipeLeft: LottieAnimPreset = {\n id: \"wipe-left\",\n name: \"Wipe Left\",\n category: \"entrance\",\n icon: \"◀️\",\n description: \"Horizontal wipe reveal from left\",\n defaultDurationFrames: 20,\n buildTracks: ({ startFrame, endFrame }) => [\n { path: \"ks.s\", keyframes: [kf(startFrame, [0, 100, 100], EASE_OUT), lastKf(endFrame, [100, 100, 100])] },\n { path: \"ks.o\", keyframes: [kf(startFrame, 100), lastKf(endFrame, 100)] },\n ],\n};\n\nconst glitchIn: LottieAnimPreset = {\n id: \"glitch-in\",\n name: \"Glitch In\",\n category: \"entrance\",\n icon: \"⚡\",\n description: \"Rapid position glitch then settle\",\n defaultDurationFrames: 20,\n buildTracks: ({ startFrame, endFrame }) => {\n const f1 = startFrame + 2,\n f2 = startFrame + 4,\n f3 = startFrame + 6,\n f4 = startFrame + 9;\n return [\n { path: \"ks.p\", keyframes: [kf(startFrame, [-12, 4, 0], LINEAR), kf(f1, [8, -6, 0], LINEAR), kf(f2, [-5, 3, 0], LINEAR), kf(f3, [4, -2, 0], LINEAR), kf(f4, [0, 0, 0], EASE_OUT), lastKf(endFrame, [0, 0, 0])] },\n { path: \"ks.o\", keyframes: [kf(startFrame, 0, LINEAR), kf(f1, 100, LINEAR), lastKf(endFrame, 100)] },\n ];\n },\n};\n\n// ─── Exit Animations ─────────────────────────────────────────────────────────\n\nconst fadeOut: LottieAnimPreset = {\n id: \"fade-out\",\n name: \"Fade Out\",\n category: \"exit\",\n icon: \"💨\",\n description: \"Simple opacity fade to 0\",\n defaultDurationFrames: 20,\n buildTracks: ({ startFrame, endFrame }) => [\n {\n path: \"ks.o\",\n keyframes: [kf(startFrame, 100, EASE_IN), lastKf(endFrame, 0)],\n },\n ],\n};\n\nconst slideOutUp: LottieAnimPreset = {\n id: \"slide-out-up\",\n name: \"Slide Out Up\",\n category: \"exit\",\n icon: \"🚀\",\n description: \"Slides out upward with fade\",\n defaultDurationFrames: 22,\n buildTracks: ({ startFrame, endFrame, compH }) => [\n { path: \"ks.p\", keyframes: [kf(startFrame, [0, 0, 0], EASE_IN), lastKf(endFrame, [0, -compH * 0.2, 0])] },\n { path: \"ks.o\", keyframes: [kf(startFrame, 100, EASE_IN), lastKf(endFrame, 0)] },\n ],\n};\n\nconst slideOutDown: LottieAnimPreset = {\n id: \"slide-out-down\",\n name: \"Slide Out Down\",\n category: \"exit\",\n icon: \"⬇️\",\n description: \"Slides out downward with fade\",\n defaultDurationFrames: 22,\n buildTracks: ({ startFrame, endFrame, compH }) => [\n { path: \"ks.p\", keyframes: [kf(startFrame, [0, 0, 0], EASE_IN), lastKf(endFrame, [0, compH * 0.2, 0])] },\n { path: \"ks.o\", keyframes: [kf(startFrame, 100, EASE_IN), lastKf(endFrame, 0)] },\n ],\n};\n\nconst zoomOut: LottieAnimPreset = {\n id: \"zoom-out\",\n name: \"Zoom Out\",\n category: \"exit\",\n icon: \"🔎\",\n description: \"Scales down to 0 with fade\",\n defaultDurationFrames: 20,\n buildTracks: ({ startFrame, endFrame }) => [\n { path: \"ks.s\", keyframes: [kf(startFrame, [100, 100, 100], EASE_IN), lastKf(endFrame, [0, 0, 100])] },\n { path: \"ks.o\", keyframes: [kf(startFrame, 100, EASE_IN), lastKf(endFrame, 0)] },\n ],\n};\n\nconst zoomOutBlast: LottieAnimPreset = {\n id: \"zoom-out-blast\",\n name: \"Zoom Blast\",\n category: \"exit\",\n icon: \"💣\",\n description: \"Scales up then disappears\",\n defaultDurationFrames: 18,\n buildTracks: ({ startFrame, endFrame }) => {\n const mid = Math.round(startFrame + (endFrame - startFrame) * 0.5);\n return [\n { path: \"ks.s\", keyframes: [kf(startFrame, [100, 100, 100], EASE_IN), kf(mid, [140, 140, 100], EASE_IN), lastKf(endFrame, [0, 0, 100])] },\n { path: \"ks.o\", keyframes: [kf(startFrame, 100, LINEAR), kf(mid, 80, LINEAR), lastKf(endFrame, 0)] },\n ];\n },\n};\n\nconst glitchOut: LottieAnimPreset = {\n id: \"glitch-out\",\n name: \"Glitch Out\",\n category: \"exit\",\n icon: \"📺\",\n description: \"Glitches then disappears\",\n defaultDurationFrames: 18,\n buildTracks: ({ startFrame, endFrame }) => {\n const f1 = endFrame - 8,\n f2 = endFrame - 5,\n f3 = endFrame - 3;\n return [\n { path: \"ks.p\", keyframes: [kf(startFrame, [0, 0, 0], LINEAR), kf(f1, [10, -4, 0], LINEAR), kf(f2, [-8, 3, 0], LINEAR), kf(f3, [5, -2, 0], LINEAR), lastKf(endFrame, [0, 0, 0])] },\n { path: \"ks.o\", keyframes: [kf(startFrame, 100), kf(f1, 80, LINEAR), kf(f2, 60, LINEAR), lastKf(endFrame, 0)] },\n ];\n },\n};\n\n// ─── Loop Animations ─────────────────────────────────────────────────────────\n\nconst pulse: LottieAnimPreset = {\n id: \"pulse\",\n name: \"Pulse\",\n category: \"loop\",\n icon: \"💓\",\n description: \"Rhythmic scale pulse\",\n defaultDurationFrames: 30,\n buildTracks: ({ startFrame, totalFrames }) => {\n const half = Math.round(totalFrames / 2);\n return [\n {\n path: \"ks.s\",\n keyframes: [kf(startFrame, [100, 100, 100], EASE_IO), kf(startFrame + half, [108, 108, 100], EASE_IO), lastKf(startFrame + totalFrames, [100, 100, 100])],\n },\n ];\n },\n};\n\nconst breathe: LottieAnimPreset = {\n id: \"breathe\",\n name: \"Breathe\",\n category: \"loop\",\n icon: \"🌬️\",\n description: \"Slow gentle scale breathe\",\n defaultDurationFrames: 60,\n buildTracks: ({ startFrame, totalFrames }) => {\n const half = Math.round(totalFrames / 2);\n return [\n { path: \"ks.s\", keyframes: [kf(startFrame, [100, 100, 100], EASE_IO), kf(startFrame + half, [104, 104, 100], EASE_IO), lastKf(startFrame + totalFrames, [100, 100, 100])] },\n { path: \"ks.o\", keyframes: [kf(startFrame, 85, EASE_IO), kf(startFrame + half, 100, EASE_IO), lastKf(startFrame + totalFrames, 85)] },\n ];\n },\n};\n\nconst floatUp: LottieAnimPreset = {\n id: \"float-up\",\n name: \"Float\",\n category: \"loop\",\n icon: \"🎈\",\n description: \"Gentle vertical float\",\n defaultDurationFrames: 60,\n buildTracks: ({ startFrame, totalFrames }) => {\n const half = Math.round(totalFrames / 2);\n return [\n {\n path: \"ks.p\",\n keyframes: [kf(startFrame, [0, 0, 0], EASE_IO), kf(startFrame + half, [0, -8, 0], EASE_IO), lastKf(startFrame + totalFrames, [0, 0, 0])],\n },\n ];\n },\n};\n\nconst shake: LottieAnimPreset = {\n id: \"shake\",\n name: \"Shake\",\n category: \"loop\",\n icon: \"📳\",\n description: \"Rapid horizontal shake\",\n defaultDurationFrames: 20,\n buildTracks: ({ startFrame }) => [\n {\n path: \"ks.p\",\n keyframes: [kf(startFrame, [0, 0, 0], LINEAR), kf(startFrame + 3, [-6, 0, 0], LINEAR), kf(startFrame + 6, [6, 0, 0], LINEAR), kf(startFrame + 9, [-4, 0, 0], LINEAR), kf(startFrame + 12, [4, 0, 0], LINEAR), kf(startFrame + 15, [-2, 0, 0], LINEAR), lastKf(startFrame + 18, [0, 0, 0])],\n },\n ],\n};\n\nconst wobble: LottieAnimPreset = {\n id: \"wobble\",\n name: \"Wobble\",\n category: \"loop\",\n icon: \"🌊\",\n description: \"Rotation wobble\",\n defaultDurationFrames: 30,\n buildTracks: ({ startFrame }) => [\n {\n path: \"ks.r\",\n keyframes: [kf(startFrame, 0, EASE_IO), kf(startFrame + 7, -5, EASE_IO), kf(startFrame + 14, 5, EASE_IO), kf(startFrame + 21, -3, EASE_IO), lastKf(startFrame + 28, 0)],\n },\n ],\n};\n\nconst neonFlicker: LottieAnimPreset = {\n id: \"neon-flicker\",\n name: \"Neon Flicker\",\n category: \"loop\",\n icon: \"💡\",\n description: \"Neon sign flicker via opacity\",\n defaultDurationFrames: 24,\n buildTracks: ({ startFrame }) => [\n {\n path: \"ks.o\",\n keyframes: [kf(startFrame, 100, LINEAR), kf(startFrame + 2, 20, LINEAR), kf(startFrame + 3, 100, LINEAR), kf(startFrame + 5, 60, LINEAR), kf(startFrame + 6, 100, LINEAR), kf(startFrame + 14, 100, LINEAR), kf(startFrame + 15, 30, LINEAR), kf(startFrame + 16, 100, LINEAR), lastKf(startFrame + 23, 100)],\n },\n ],\n};\n\nconst wave: LottieAnimPreset = {\n id: \"wave\",\n name: \"Wave\",\n category: \"loop\",\n icon: \"👋\",\n description: \"Vertical wave motion\",\n defaultDurationFrames: 40,\n buildTracks: ({ startFrame }) => [\n {\n path: \"ks.p\",\n keyframes: [kf(startFrame, [0, 0, 0], EASE_IO), kf(startFrame + 10, [0, -10, 0], EASE_IO), kf(startFrame + 20, [0, 0, 0], EASE_IO), kf(startFrame + 30, [0, 10, 0], EASE_IO), lastKf(startFrame + 40, [0, 0, 0])],\n },\n ],\n};\n\n// ─── Emphasis Animations ─────────────────────────────────────────────────────\n\nconst attention: LottieAnimPreset = {\n id: \"attention\",\n name: \"Attention\",\n category: \"emphasis\",\n icon: \"❗\",\n description: \"Quick scale pop for emphasis\",\n defaultDurationFrames: 15,\n buildTracks: ({ startFrame }) => {\n const mid = startFrame + 7;\n return [\n {\n path: \"ks.s\",\n keyframes: [kf(startFrame, [100, 100, 100], EASE_OUT), kf(mid, [120, 120, 100], BOUNCE), lastKf(startFrame + 14, [100, 100, 100])],\n },\n ];\n },\n};\n\nconst jello: LottieAnimPreset = {\n id: \"jello\",\n name: \"Jello\",\n category: \"emphasis\",\n icon: \"🍮\",\n description: \"Elastic squash and stretch\",\n defaultDurationFrames: 30,\n buildTracks: ({ startFrame }) => [\n {\n path: \"ks.s\",\n keyframes: [kf(startFrame, [100, 100, 100], EASE_IO), kf(startFrame + 5, [120, 80, 100], BOUNCE), kf(startFrame + 10, [85, 115, 100], BOUNCE), kf(startFrame + 15, [110, 92, 100], BOUNCE), kf(startFrame + 20, [96, 104, 100], BOUNCE), lastKf(startFrame + 28, [100, 100, 100])],\n },\n ],\n};\n\nconst swing: LottieAnimPreset = {\n id: \"swing\",\n name: \"Swing\",\n category: \"emphasis\",\n icon: \"🎷\",\n description: \"Pendulum rotation swing\",\n defaultDurationFrames: 30,\n buildTracks: ({ startFrame }) => [\n {\n path: \"ks.r\",\n keyframes: [kf(startFrame, 0, EASE_IO), kf(startFrame + 6, 15, EASE_IO), kf(startFrame + 12, -10, EASE_IO), kf(startFrame + 18, 6, EASE_IO), kf(startFrame + 24, -3, EASE_IO), lastKf(startFrame + 29, 0)],\n },\n ],\n};\n\n// ─── Registry ────────────────────────────────────────────────────────────────\n\nexport const LOTTIE_ANIM_PRESETS: LottieAnimPreset[] = [\n // Entrance\n fadeIn,\n slideUp,\n slideDown,\n slideLeft,\n slideRight,\n zoomIn,\n zoomInBounce,\n popIn,\n flipX,\n flipY,\n rotateIn,\n blurIn,\n dropIn,\n typewriter,\n wipeLeft,\n glitchIn,\n // Exit\n fadeOut,\n slideOutUp,\n slideOutDown,\n zoomOut,\n zoomOutBlast,\n glitchOut,\n // Loop\n pulse,\n breathe,\n floatUp,\n shake,\n wobble,\n neonFlicker,\n wave,\n // Emphasis\n attention,\n jello,\n swing,\n];\n\nexport const ENTRANCE_PRESETS = LOTTIE_ANIM_PRESETS.filter((p) => p.category === \"entrance\");\nexport const EXIT_PRESETS = LOTTIE_ANIM_PRESETS.filter((p) => p.category === \"exit\");\nexport const LOOP_PRESETS = LOTTIE_ANIM_PRESETS.filter((p) => p.category === \"loop\");\nexport const EMPHASIS_PRESETS = LOTTIE_ANIM_PRESETS.filter((p) => p.category === \"emphasis\");\n\nexport function getAnimPreset(id: string): LottieAnimPreset | undefined {\n return LOTTIE_ANIM_PRESETS.find((p) => p.id === id);\n}\n\n/**\n * Bake an animation preset into a Lottie layer's keyframe tracks.\n * Merges with existing keyframes rather than replacing them.\n */\nexport function bakeAnimationIntoLayer(lottieData: any, layerIndex: number, preset: LottieAnimPreset, opts: Omit<AnimBuildOpts, \"layerIndex\">): any {\n const clone = JSON.parse(JSON.stringify(lottieData));\n const layer = clone.layers?.[layerIndex];\n if (!layer) return clone;\n\n const tracks = preset.buildTracks({ ...opts, layerIndex });\n\n for (const track of tracks) {\n const keys = track.path.split(\".\");\n let prop = layer;\n for (const k of keys) {\n if (!prop[k]) prop[k] = {};\n prop = prop[k];\n }\n\n // Convert to animated if static\n if (prop.a === 0 || prop.a === undefined) {\n const staticVal = prop.k ?? (track.path === \"ks.o\" ? 100 : track.path === \"ks.r\" ? 0 : [0, 0, 0]);\n prop.a = 1;\n prop.k = [{ t: 0, s: staticVal }];\n }\n\n // Merge new keyframes\n const existing: AnimKeyframe[] = prop.k || [];\n for (const newKf of track.keyframes) {\n const idx = existing.findIndex((k) => k.t === newKf.t);\n if (idx >= 0) {\n existing[idx] = newKf;\n } else {\n existing.push(newKf);\n }\n }\n existing.sort((a, b) => a.t - b.t);\n\n // Ensure last keyframe has no easing\n existing.forEach((k, i) => {\n if (i === existing.length - 1) {\n delete (k as any).i;\n delete (k as any).o;\n }\n });\n\n prop.k = existing;\n }\n\n return clone;\n}\n\n/**\n * Remove all animation keyframes from a layer property, reverting to static.\n */\nexport function clearAnimationFromLayer(lottieData: any, layerIndex: number, paths: string[] = [\"ks.p\", \"ks.s\", \"ks.r\", \"ks.o\"]): any {\n const clone = JSON.parse(JSON.stringify(lottieData));\n const layer = clone.layers?.[layerIndex];\n if (!layer) return clone;\n\n for (const path of paths) {\n const keys = path.split(\".\");\n let prop = layer;\n for (const k of keys) {\n if (!prop[k]) break;\n if (k === keys[keys.length - 1]) {\n if (prop[k].a === 1 && Array.isArray(prop[k].k)) {\n const lastKf = prop[k].k[prop[k].k.length - 1];\n prop[k] = { a: 0, k: lastKf?.s ?? (path === \"ks.o\" ? 100 : path === \"ks.r\" ? 0 : [0, 0, 0]) };\n }\n } else {\n prop = prop[k];\n }\n }\n }\n\n return clone;\n}\n","/**\n * Lottie Per-Layer Text Style Engine\n * Provides rich text styling (font, fill, gradient, stroke, shadow, glow, tracking)\n * that maps directly to Lottie JSON text document properties.\n */\n\nexport type TextAlign = \"left\" | \"center\" | \"right\" | \"justify\";\nexport type FillType = \"solid\" | \"gradient\";\nexport type GradientDir = \"horizontal\" | \"vertical\" | \"diagonal\" | \"radial\";\n\nexport interface LottieGradientStop {\n color: string; // hex\n position: number; // 0–1\n}\n\nexport interface TextLayerStyle {\n // Typography\n fontName: string; // Lottie fName e.g. \"Poppins-Bold\"\n fontFamily: string; // CSS family e.g. \"Poppins\"\n fontWeight: number; // 100–900\n fontStyle: \"normal\" | \"italic\";\n fontSize: number; // px\n tracking: number; // letter spacing (Lottie tr units = 1/1000 em)\n lineHeight: number; // multiplier\n align: TextAlign;\n\n // Fill\n fillType: FillType;\n fillColor: string; // hex, used when fillType === \"solid\"\n gradientStops: LottieGradientStop[];\n gradientDir: GradientDir;\n\n // Stroke\n strokeEnabled: boolean;\n strokeColor: string;\n strokeWidth: number; // px\n strokeOpacity: number; // 0–100\n\n // Shadow\n shadowEnabled: boolean;\n shadowColor: string;\n shadowBlur: number;\n shadowOffsetX: number;\n shadowOffsetY: number;\n shadowOpacity: number; // 0–100\n\n // Glow (simulated via multiple shadow passes)\n glowEnabled: boolean;\n glowColor: string;\n glowBlur: number;\n glowOpacity: number; // 0–100\n\n // Transform\n posX: number; // offset from layer anchor (px)\n posY: number;\n scaleX: number; // 0–200 (%)\n scaleY: number;\n rotation: number; // degrees\n opacity: number; // 0–100\n}\n\nexport const DEFAULT_TEXT_STYLE: TextLayerStyle = {\n fontName: \"Poppins-Bold\",\n fontFamily: \"Poppins\",\n fontWeight: 700,\n fontStyle: \"normal\",\n fontSize: 72,\n tracking: 0,\n lineHeight: 1.2,\n align: \"center\",\n fillType: \"solid\",\n fillColor: \"#FFFFFF\",\n gradientStops: [\n { color: \"#FFFFFF\", position: 0 },\n { color: \"#AAAAAA\", position: 1 },\n ],\n gradientDir: \"vertical\",\n strokeEnabled: false,\n strokeColor: \"#000000\",\n strokeWidth: 2,\n strokeOpacity: 100,\n shadowEnabled: false,\n shadowColor: \"#000000\",\n shadowBlur: 8,\n shadowOffsetX: 4,\n shadowOffsetY: 4,\n shadowOpacity: 60,\n glowEnabled: false,\n glowColor: \"#7C6FFF\",\n glowBlur: 20,\n glowOpacity: 80,\n posX: 0,\n posY: 0,\n scaleX: 100,\n scaleY: 100,\n rotation: 0,\n opacity: 100,\n};\n\n// ─── Helpers ─────────────────────────────────────────────────────────────────\n\n/** Convert #RRGGBB to Lottie normalized [r, g, b] (0–1) */\nexport function hexToLottieColor(hex: string): [number, number, number] {\n const clean = hex.replace(\"#\", \"\").padEnd(6, \"0\");\n return [parseInt(clean.slice(0, 2), 16) / 255, parseInt(clean.slice(2, 4), 16) / 255, parseInt(clean.slice(4, 6), 16) / 255];\n}\n\n/** Convert Lottie [r,g,b] (0–1) back to #RRGGBB */\nexport function lottieColorToHex(rgb: number[]): string {\n const r = Math.round((rgb[0] ?? 0) * 255)\n .toString(16)\n .padStart(2, \"0\");\n const g = Math.round((rgb[1] ?? 0) * 255)\n .toString(16)\n .padStart(2, \"0\");\n const b = Math.round((rgb[2] ?? 0) * 255)\n .toString(16)\n .padStart(2, \"0\");\n return `#${r}${g}${b}`.toUpperCase();\n}\n\n/** Map CSS font-weight + style to a Lottie fName */\nexport function buildLottieFontName(family: string, weight: number, style: \"normal\" | \"italic\"): string {\n const isItalic = style === \"italic\";\n const isBold = weight >= 700;\n const isExtraBold = weight >= 800;\n const isBlack = weight >= 900;\n\n if (isBlack) return isItalic ? `${family}-BlackItalic` : `${family}-Black`;\n if (isExtraBold) return isItalic ? `${family}-ExtraBoldItalic` : `${family}-ExtraBold`;\n if (isBold) return isItalic ? `${family}-BoldItalic` : `${family}-Bold`;\n return isItalic ? `${family}-Italic` : `${family}-Regular`;\n}\n\n/** Lottie text alignment: 0=left, 1=center, 2=right, 3=justify */\nexport function alignToLottieJ(align: TextAlign): number {\n switch (align) {\n case \"left\":\n return 0;\n case \"center\":\n return 1;\n case \"right\":\n return 2;\n case \"justify\":\n return 3;\n default:\n return 1;\n }\n}\n\nexport function lottieJToAlign(j: number): TextAlign {\n switch (j) {\n case 0:\n return \"left\";\n case 1:\n return \"center\";\n case 2:\n return \"right\";\n case 3:\n return \"justify\";\n default:\n return \"center\";\n }\n}\n\n// ─── Read style from Lottie layer ────────────────────────────────────────────\n\n/**\n * Extract a TextLayerStyle from an existing Lottie text layer (ty === 5).\n * Falls back to defaults for any missing properties.\n */\nexport function readStyleFromLottieLayer(layer: any): TextLayerStyle {\n const style: TextLayerStyle = { ...DEFAULT_TEXT_STYLE };\n if (!layer || layer.ty !== 5) return style;\n\n // Transform\n const ks = layer.ks || {};\n const pos = ks.p?.k;\n if (Array.isArray(pos)) {\n style.posX = pos[0] ?? 0;\n style.posY = pos[1] ?? 0;\n }\n const scale = ks.s?.k;\n if (Array.isArray(scale)) {\n style.scaleX = scale[0] ?? 100;\n style.scaleY = scale[1] ?? 100;\n }\n const rot = ks.r?.k;\n if (typeof rot === \"number\") style.rotation = rot;\n const op = ks.o?.k;\n if (typeof op === \"number\") style.opacity = op;\n\n // Text document\n const td = layer.t?.d;\n if (!td) return style;\n const kf0 = Array.isArray(td.k) ? td.k[0]?.s : td.k?.s;\n if (!kf0) return style;\n\n if (typeof kf0.s === \"number\") style.fontSize = kf0.s;\n if (typeof kf0.f === \"string\") {\n style.fontName = kf0.f;\n // Parse family from fName\n const parts = kf0.f.split(\"-\");\n style.fontFamily = parts[0] ?? \"Poppins\";\n const variant = parts[1]?.toLowerCase() ?? \"\";\n style.fontStyle = variant.includes(\"italic\") ? \"italic\" : \"normal\";\n style.fontWeight = variant.includes(\"black\") ? 900 : variant.includes(\"extrabold\") ? 800 : variant.includes(\"bold\") ? 700 : 400;\n }\n if (typeof kf0.j === \"number\") style.align = lottieJToAlign(kf0.j);\n if (typeof kf0.tr === \"number\") style.tracking = kf0.tr;\n if (typeof kf0.lh === \"number\") style.lineHeight = kf0.lh / (kf0.s || 72);\n\n // Fill color\n if (Array.isArray(kf0.fc) && kf0.fc.length >= 3) {\n style.fillColor = lottieColorToHex(kf0.fc);\n style.fillType = \"solid\";\n }\n\n // Stroke\n if (Array.isArray(kf0.sc) && kf0.sc.length >= 3) {\n style.strokeEnabled = true;\n style.strokeColor = lottieColorToHex(kf0.sc);\n style.strokeWidth = typeof kf0.sw === \"number\" ? kf0.sw : 0;\n style.strokeEnabled = style.strokeWidth > 0;\n }\n\n return style;\n}\n\n// ─── Write style into Lottie layer ───────────────────────────────────────────\n\n/**\n * Apply a TextLayerStyle to a Lottie text layer (ty === 5).\n * Returns a new deep-cloned layer with all style properties applied.\n */\nexport function applyStyleToLottieLayer(layer: any, style: TextLayerStyle): any {\n const clone = JSON.parse(JSON.stringify(layer));\n if (!clone || clone.ty !== 5) return clone;\n\n // ── Transform ──\n const ks = clone.ks || {};\n // Position (additive offset from current anchor)\n if (ks.p) {\n if (ks.p.a === 0) {\n const base = Array.isArray(ks.p.k) ? ks.p.k : [0, 0, 0];\n ks.p.k = [style.posX || base[0], style.posY || base[1], base[2] ?? 0];\n }\n }\n // Scale\n if (ks.s) {\n if (ks.s.a === 0) {\n ks.s.k = [style.scaleX, style.scaleY, 100];\n }\n }\n // Rotation\n if (ks.r) {\n if (ks.r.a === 0) ks.r.k = style.rotation;\n }\n // Opacity\n if (ks.o) {\n if (ks.o.a === 0) ks.o.k = style.opacity;\n }\n clone.ks = ks;\n\n // ── Text Document ──\n const td = clone.t?.d;\n if (!td) return clone;\n\n const applyToDoc = (doc: any) => {\n if (!doc) return;\n doc.s = style.fontSize;\n doc.f = style.fontName || buildLottieFontName(style.fontFamily, style.fontWeight, style.fontStyle);\n doc.j = alignToLottieJ(style.align);\n doc.tr = style.tracking;\n doc.lh = style.fontSize * style.lineHeight;\n\n // Fill color\n doc.fc = hexToLottieColor(style.fillColor);\n\n // Stroke\n if (style.strokeEnabled && style.strokeWidth > 0) {\n doc.sc = hexToLottieColor(style.strokeColor);\n doc.sw = style.strokeWidth;\n doc.of = false; // stroke over fill\n } else {\n doc.sw = 0;\n }\n };\n\n if (Array.isArray(td.k)) {\n td.k.forEach((kf: any) => {\n if (kf?.s) applyToDoc(kf.s);\n });\n } else if (td.k?.s) {\n applyToDoc(td.k.s);\n }\n\n return clone;\n}\n\n/**\n * Apply a TextLayerStyle to a full Lottie composition at a given layer index.\n */\nexport function applyStyleToLottie(lottieData: any, layerIndex: number, style: TextLayerStyle): any {\n const clone = JSON.parse(JSON.stringify(lottieData));\n if (!clone.layers?.[layerIndex]) return clone;\n clone.layers[layerIndex] = applyStyleToLottieLayer(clone.layers[layerIndex], style);\n return clone;\n}\n\n// ─── Font registry ───────────────────────────────────────────────────────────\n\nexport interface LottieFontEntry {\n fName: string;\n fFamily: string;\n fWeight: string;\n fStyle: string;\n asName: string;\n googleFont?: boolean;\n}\n\n/** Ensure a font is registered in the Lottie fonts list */\nexport function ensureFontInLottie(lottieData: any, entry: LottieFontEntry): any {\n const clone = JSON.parse(JSON.stringify(lottieData));\n if (!clone.fonts) clone.fonts = { list: [] };\n if (!Array.isArray(clone.fonts.list)) clone.fonts.list = [];\n const exists = clone.fonts.list.some((f: any) => f.fName === entry.fName);\n if (!exists) clone.fonts.list.push(entry);\n return clone;\n}\n\n/** Full set of supported fonts with all variants */\nexport const SUPPORTED_FONT_FAMILIES: string[] = [\"Poppins\", \"Montserrat\", \"Inter\", \"Roboto\", \"Open Sans\", \"Lato\", \"Raleway\", \"Oswald\", \"Bebas Neue\", \"Anton\", \"Playfair Display\", \"Merriweather\", \"Nunito\", \"Ubuntu\", \"Source Sans Pro\", \"PT Sans\", \"Noto Sans\", \"Exo 2\", \"Barlow\", \"Kanit\", \"Righteous\", \"Pacifico\", \"Lobster\", \"Dancing Script\", \"Satisfy\", \"Permanent Marker\", \"Arial\", \"Georgia\", \"Times New Roman\", \"Courier New\"];\n\nexport const FONT_WEIGHT_OPTIONS = [\n { label: \"Thin\", value: 100 },\n { label: \"Light\", value: 300 },\n { label: \"Regular\", value: 400 },\n { label: \"Medium\", value: 500 },\n { label: \"SemiBold\", value: 600 },\n { label: \"Bold\", value: 700 },\n { label: \"ExtraBold\", value: 800 },\n { label: \"Black\", value: 900 },\n];\n\n/** Build all Lottie font entries for a given family */\nexport function buildFontEntries(family: string): LottieFontEntry[] {\n const variants: Array<{ weight: string; style: string; suffix: string }> = [\n { weight: \"400\", style: \"Regular\", suffix: \"Regular\" },\n { weight: \"700\", style: \"Bold\", suffix: \"Bold\" },\n { weight: \"400\", style: \"Italic\", suffix: \"Italic\" },\n { weight: \"700\", style: \"Bold Italic\", suffix: \"BoldItalic\" },\n { weight: \"800\", style: \"ExtraBold\", suffix: \"ExtraBold\" },\n { weight: \"900\", style: \"Black\", suffix: \"Black\" },\n ];\n return variants.map((v) => ({\n fName: `${family}-${v.suffix}`,\n fFamily: family,\n fWeight: v.weight,\n fStyle: v.style,\n asName: `${family}-${v.suffix}`,\n googleFont: ![\"Arial\", \"Georgia\", \"Times New Roman\", \"Courier New\"].includes(family),\n }));\n}\n","/**\n * Built-in CapCut-style Lottie text template presets.\n * Each preset is a complete Lottie JSON composition ready to use.\n */\n\nimport { createBlankLottie, addTextLayer, addSolidLayer, addShapeLayer, addVectorShape, reindexLayers } from \"./lottieEditor\";\nimport { applyStyleToLottieLayer } from \"./lottieTextStyle\";\nimport { bakeAnimationIntoLayer, getAnimPreset } from \"./lottieTextAnimations\";\n\nexport type TemplatePresetCategory = \"lower-third\" | \"title-card\" | \"callout\" | \"caption\" | \"kinetic\" | \"social\" | \"cinematic\" | \"sports\" | \"minimal\" | \"bold\";\n\nexport interface LottieTemplatePreset {\n id: string;\n name: string;\n category: TemplatePresetCategory;\n description: string;\n tags: string[];\n aspectRatio: \"16:9\" | \"9:16\" | \"1:1\" | \"4:5\";\n /** Build and return the Lottie JSON for this preset */\n build: () => any;\n}\n\n// ─── Helpers ─────────────────────────────────────────────────────────────────\n\nfunction hex2lottie(hex: string): [number, number, number] {\n const c = hex.replace(\"#\", \"\").padEnd(6, \"0\");\n return [parseInt(c.slice(0, 2), 16) / 255, parseInt(c.slice(2, 4), 16) / 255, parseInt(c.slice(4, 6), 16) / 255];\n}\n\nfunction applyTextDoc(\n layer: any,\n opts: {\n text: string;\n font: string;\n size: number;\n color: string;\n align?: number;\n tracking?: number;\n strokeColor?: string;\n strokeWidth?: number;\n },\n): any {\n const clone = JSON.parse(JSON.stringify(layer));\n const applyDoc = (doc: any) => {\n doc.t = opts.text;\n doc.f = opts.font;\n doc.s = opts.size;\n doc.fc = hex2lottie(opts.color);\n doc.j = opts.align ?? 1;\n doc.tr = opts.tracking ?? 0;\n doc.lh = opts.size * 1.2;\n if (opts.strokeColor && opts.strokeWidth) {\n doc.sc = hex2lottie(opts.strokeColor);\n doc.sw = opts.strokeWidth;\n }\n };\n const td = clone.t?.d;\n if (!td) return clone;\n if (Array.isArray(td.k))\n td.k.forEach((kf: any) => {\n if (kf?.s) applyDoc(kf.s);\n });\n else if (td.k?.s) applyDoc(td.k.s);\n return clone;\n}\n\nfunction setLayerPos(layer: any, x: number, y: number): any {\n const clone = JSON.parse(JSON.stringify(layer));\n if (clone.ks?.p?.a === 0) clone.ks.p.k = [x, y, 0];\n return clone;\n}\n\nfunction setLayerOpacity(layer: any, op: number): any {\n const clone = JSON.parse(JSON.stringify(layer));\n if (clone.ks?.o?.a === 0) clone.ks.o.k = op;\n return clone;\n}\n\nfunction addRoundedRect(lottie: any, name: string, cx: number, cy: number, w: number, h: number, r: number, color: string): any {\n let clone = JSON.parse(JSON.stringify(lottie));\n const [cr, cg, cb] = hex2lottie(color);\n const shapeLayer = {\n ty: 4,\n nm: name,\n sr: 1,\n st: 0,\n ip: 0,\n op: clone.op,\n ind: 1,\n ks: {\n a: { a: 0, k: [0, 0, 0] },\n p: { a: 0, k: [cx, cy, 0] },\n s: { a: 0, k: [100, 100, 100] },\n r: { a: 0, k: 0 },\n o: { a: 0, k: 100 },\n },\n shapes: [\n {\n ty: \"gr\",\n nm: \"Rect\",\n it: [\n { ty: \"rc\", nm: \"Path\", p: { a: 0, k: [0, 0] }, s: { a: 0, k: [w, h] }, r: { a: 0, k: r } },\n { ty: \"fl\", nm: \"Fill\", c: { a: 0, k: [cr, cg, cb, 1] }, o: { a: 0, k: 100 } },\n { ty: \"tr\", nm: \"Tr\", p: { a: 0, k: [0, 0] }, a: { a: 0, k: [0, 0] }, s: { a: 0, k: [100, 100] }, r: { a: 0, k: 0 }, o: { a: 0, k: 100 } },\n ],\n },\n ],\n };\n clone.layers.push(shapeLayer);\n reindexLayers(clone);\n return clone;\n}\n\n// ─── Template Builders ───────────────────────────────────────────────────────\n\nfunction buildCleanLowerThird(): any {\n let l = createBlankLottie(1920, 1080, 30, 120);\n l = addRoundedRect(l, \"Bar BG\", 480, 940, 800, 80, 8, \"#1A1A2E\");\n l = addTextLayer(l, \"Name\", \"JOHN DOE\");\n l.layers[0] = applyTextDoc(l.layers[0], { text: \"JOHN DOE\", font: \"Poppins-Bold\", size: 48, color: \"#FFFFFF\", align: 0, tracking: 80 });\n l.layers[0] = setLayerPos(l.layers[0], 480, 940);\n l = addTextLayer(l, \"Title\", \"Creative Director\");\n l.layers[0] = applyTextDoc(l.layers[0], { text: \"Creative Director\", font: \"Poppins-Regular\", size: 28, color: \"#A0A0C0\", align: 0 });\n l.layers[0] = setLayerPos(l.layers[0], 480, 975);\n // Entrance animations\n const nameIdx = l.layers.findIndex((x: any) => x.nm === \"Name\");\n const titleIdx = l.layers.findIndex((x: any) => x.nm === \"Title\");\n const slidePreset = getAnimPreset(\"slide-right\");\n if (slidePreset && nameIdx >= 0) l = bakeAnimationIntoLayer(l, nameIdx, slidePreset, { startFrame: 5, endFrame: 25, totalFrames: 120, compW: 1920, compH: 1080 });\n if (slidePreset && titleIdx >= 0) l = bakeAnimationIntoLayer(l, titleIdx, slidePreset, { startFrame: 12, endFrame: 32, totalFrames: 120, compW: 1920, compH: 1080 });\n reindexLayers(l);\n return l;\n}\n\nfunction buildNeonTitle(): any {\n let l = createBlankLottie(1920, 1080, 30, 150);\n l = addSolidLayer(l, \"BG\", \"#0A0A0F\", 1920, 1080);\n l = addTextLayer(l, \"Main Title\", \"NEON DREAMS\");\n l.layers[0] = applyTextDoc(l.layers[0], { text: \"NEON DREAMS\", font: \"Montserrat-Black\", size: 120, color: \"#FF2D78\", align: 1, tracking: 200, strokeColor: \"#FF2D78\", strokeWidth: 1 });\n l.layers[0] = setLayerPos(l.layers[0], 960, 540);\n l = addTextLayer(l, \"Subtitle\", \"A VISUAL STORY\");\n l.layers[0] = applyTextDoc(l.layers[0], { text: \"A VISUAL STORY\", font: \"Montserrat-Regular\", size: 36, color: \"#7C6FFF\", align: 1, tracking: 400 });\n l.layers[0] = setLayerPos(l.layers[0], 960, 640);\n const mainIdx = l.layers.findIndex((x: any) => x.nm === \"Main Title\");\n const subIdx = l.layers.findIndex((x: any) => x.nm === \"Subtitle\");\n const zoomPreset = getAnimPreset(\"zoom-in-bounce\");\n const fadePreset = getAnimPreset(\"fade-in\");\n if (zoomPreset && mainIdx >= 0) l = bakeAnimationIntoLayer(l, mainIdx, zoomPreset, { startFrame: 5, endFrame: 35, totalFrames: 150, compW: 1920, compH: 1080 });\n if (fadePreset && subIdx >= 0) l = bakeAnimationIntoLayer(l, subIdx, fadePreset, { startFrame: 25, endFrame: 45, totalFrames: 150, compW: 1920, compH: 1080 });\n reindexLayers(l);\n return l;\n}\n\nfunction buildMinimalCaption(): any {\n let l = createBlankLottie(1920, 1080, 30, 90);\n l = addTextLayer(l, \"Caption\", \"This is a caption text\");\n l.layers[0] = applyTextDoc(l.layers[0], { text: \"This is a caption text\", font: \"Inter-Regular\", size: 52, color: \"#FFFFFF\", align: 1 });\n l.layers[0] = setLayerPos(l.layers[0], 960, 900);\n const idx = l.layers.findIndex((x: any) => x.nm === \"Caption\");\n const preset = getAnimPreset(\"slide-up\");\n if (preset && idx >= 0) l = bakeAnimationIntoLayer(l, idx, preset, { startFrame: 0, endFrame: 18, totalFrames: 90, compW: 1920, compH: 1080 });\n reindexLayers(l);\n return l;\n}\n\nfunction buildBoldCallout(): any {\n let l = createBlankLottie(1920, 1080, 30, 120);\n l = addRoundedRect(l, \"Pill BG\", 960, 540, 700, 100, 50, \"#FF5722\");\n l = addTextLayer(l, \"Callout\", \"BREAKING NEWS\");\n l.layers[0] = applyTextDoc(l.layers[0], { text: \"BREAKING NEWS\", font: \"Oswald-Bold\", size: 64, color: \"#FFFFFF\", align: 1, tracking: 150 });\n l.layers[0] = setLayerPos(l.layers[0], 960, 540);\n const idx = l.layers.findIndex((x: any) => x.nm === \"Callout\");\n const preset = getAnimPreset(\"pop-in\");\n if (preset && idx >= 0) l = bakeAnimationIntoLayer(l, idx, preset, { startFrame: 3, endFrame: 21, totalFrames: 120, compW: 1920, compH: 1080 });\n reindexLayers(l);\n return l;\n}\n\nfunction buildCinematicTitle(): any {\n let l = createBlankLottie(1920, 1080, 24, 144);\n l = addSolidLayer(l, \"BG\", \"#000000\", 1920, 1080);\n // Letterbox bars\n l = addRoundedRect(l, \"Bar Top\", 960, 60, 1920, 120, 0, \"#000000\");\n l = addRoundedRect(l, \"Bar Bottom\", 960, 1020, 1920, 120, 0, \"#000000\");\n l = addTextLayer(l, \"Film Title\", \"THE LAST HORIZON\");\n l.layers[0] = applyTextDoc(l.layers[0], { text: \"THE LAST HORIZON\", font: \"Playfair Display-Bold\", size: 96, color: \"#F5E6C8\", align: 1, tracking: 300 });\n l.layers[0] = setLayerPos(l.layers[0], 960, 520);\n l = addTextLayer(l, \"Tagline\", \"Some stories are worth telling\");\n l.layers[0] = applyTextDoc(l.layers[0], { text: \"Some stories are worth telling\", font: \"Playfair Display-Italic\", size: 32, color: \"#C8B89A\", align: 1 });\n l.layers[0] = setLayerPos(l.layers[0], 960, 610);\n const titleIdx = l.layers.findIndex((x: any) => x.nm === \"Film Title\");\n const tagIdx = l.layers.findIndex((x: any) => x.nm === \"Tagline\");\n const fadePreset = getAnimPreset(\"fade-in\");\n if (fadePreset && titleIdx >= 0) l = bakeAnimationIntoLayer(l, titleIdx, fadePreset, { startFrame: 12, endFrame: 48, totalFrames: 144, compW: 1920, compH: 1080 });\n if (fadePreset && tagIdx >= 0) l = bakeAnimationIntoLayer(l, tagIdx, fadePreset, { startFrame: 36, endFrame: 60, totalFrames: 144, compW: 1920, compH: 1080 });\n reindexLayers(l);\n return l;\n}\n\nfunction buildSportsScore(): any {\n let l = createBlankLottie(1920, 1080, 30, 90);\n l = addRoundedRect(l, \"Score BG\", 960, 60, 500, 80, 4, \"#CC0000\");\n l = addTextLayer(l, \"Team A\", \"TEAM A\");\n l.layers[0] = applyTextDoc(l.layers[0], { text: \"TEAM A\", font: \"Oswald-Bold\", size: 40, color: \"#FFFFFF\", align: 2, tracking: 100 });\n l.layers[0] = setLayerPos(l.layers[0], 820, 60);\n l = addTextLayer(l, \"Score\", \"3 - 1\");\n l.layers[0] = applyTextDoc(l.layers[0], { text: \"3 - 1\", font: \"Oswald-Bold\", size: 48, color: \"#FFD700\", align: 1, tracking: 50 });\n l.layers[0] = setLayerPos(l.layers[0], 960, 60);\n l = addTextLayer(l, \"Team B\", \"TEAM B\");\n l.layers[0] = applyTextDoc(l.layers[0], { text: \"TEAM B\", font: \"Oswald-Bold\", size: 40, color: \"#FFFFFF\", align: 0, tracking: 100 });\n l.layers[0] = setLayerPos(l.layers[0], 1100, 60);\n const scoreIdx = l.layers.findIndex((x: any) => x.nm === \"Score\");\n const preset = getAnimPreset(\"zoom-in-bounce\");\n if (preset && scoreIdx >= 0) l = bakeAnimationIntoLayer(l, scoreIdx, preset, { startFrame: 5, endFrame: 25, totalFrames: 90, compW: 1920, compH: 1080 });\n reindexLayers(l);\n return l;\n}\n\nfunction buildSocialQuote(): any {\n let l = createBlankLottie(1080, 1080, 30, 120);\n l = addSolidLayer(l, \"BG\", \"#1A1A2E\", 1080, 1080);\n l = addRoundedRect(l, \"Card\", 540, 540, 900, 700, 24, \"#16213E\");\n l = addTextLayer(l, \"Quote\", '\"Design is not just what it looks like. Design is how it works.\"');\n l.layers[0] = applyTextDoc(l.layers[0], { text: '\"Design is not just what it looks like.\"', font: \"Merriweather-Italic\", size: 52, color: \"#FFFFFF\", align: 1 });\n l.layers[0] = setLayerPos(l.layers[0], 540, 480);\n l = addTextLayer(l, \"Author\", \"— Steve Jobs\");\n l.layers[0] = applyTextDoc(l.layers[0], { text: \"— Steve Jobs\", font: \"Poppins-Regular\", size: 32, color: \"#7C6FFF\", align: 1 });\n l.layers[0] = setLayerPos(l.layers[0], 540, 620);\n const quoteIdx = l.layers.findIndex((x: any) => x.nm === \"Quote\");\n const authorIdx = l.layers.findIndex((x: any) => x.nm === \"Author\");\n const fadePreset = getAnimPreset(\"fade-in\");\n const slidePreset = getAnimPreset(\"slide-up\");\n if (fadePreset && quoteIdx >= 0) l = bakeAnimationIntoLayer(l, quoteIdx, fadePreset, { startFrame: 8, endFrame: 30, totalFrames: 120, compW: 1080, compH: 1080 });\n if (slidePreset && authorIdx >= 0) l = bakeAnimationIntoLayer(l, authorIdx, slidePreset, { startFrame: 25, endFrame: 45, totalFrames: 120, compW: 1080, compH: 1080 });\n reindexLayers(l);\n return l;\n}\n\nfunction buildKineticText(): any {\n let l = createBlankLottie(1920, 1080, 30, 120);\n l = addSolidLayer(l, \"BG\", \"#0D0D0D\", 1920, 1080);\n l = addTextLayer(l, \"Word 1\", \"MAKE\");\n l.layers[0] = applyTextDoc(l.layers[0], { text: \"MAKE\", font: \"Anton-Regular\", size: 180, color: \"#FFFFFF\", align: 1, tracking: 50 });\n l.layers[0] = setLayerPos(l.layers[0], 960, 400);\n l = addTextLayer(l, \"Word 2\", \"IT\");\n l.layers[0] = applyTextDoc(l.layers[0], { text: \"IT\", font: \"Anton-Regular\", size: 180, color: \"#FF2D78\", align: 1, tracking: 50 });\n l.layers[0] = setLayerPos(l.layers[0], 960, 580);\n l = addTextLayer(l, \"Word 3\", \"COUNT\");\n l.layers[0] = applyTextDoc(l.layers[0], { text: \"COUNT\", font: \"Anton-Regular\", size: 180, color: \"#FFFFFF\", align: 1, tracking: 50 });\n l.layers[0] = setLayerPos(l.layers[0], 960, 760);\n const w1 = l.layers.findIndex((x: any) => x.nm === \"Word 1\");\n const w2 = l.layers.findIndex((x: any) => x.nm === \"Word 2\");\n const w3 = l.layers.findIndex((x: any) => x.nm === \"Word 3\");\n const slideL = getAnimPreset(\"slide-left\");\n const slideR = getAnimPreset(\"slide-right\");\n const slideU = getAnimPreset(\"slide-up\");\n if (slideR && w1 >= 0) l = bakeAnimationIntoLayer(l, w1, slideR, { startFrame: 0, endFrame: 20, totalFrames: 120, compW: 1920, compH: 1080 });\n if (slideL && w2 >= 0) l = bakeAnimationIntoLayer(l, w2, slideL, { startFrame: 10, endFrame: 30, totalFrames: 120, compW: 1920, compH: 1080 });\n if (slideU && w3 >= 0) l = bakeAnimationIntoLayer(l, w3, slideU, { startFrame: 20, endFrame: 40, totalFrames: 120, compW: 1920, compH: 1080 });\n reindexLayers(l);\n return l;\n}\n\nfunction buildGlitchTitle(): any {\n let l = createBlankLottie(1920, 1080, 30, 120);\n l = addSolidLayer(l, \"BG\", \"#050505\", 1920, 1080);\n l = addTextLayer(l, \"Glitch Title\", \"SYSTEM ERROR\");\n l.layers[0] = applyTextDoc(l.layers[0], { text: \"SYSTEM ERROR\", font: \"Courier New-Bold\", size: 100, color: \"#00FF41\", align: 1, tracking: 200 });\n l.layers[0] = setLayerPos(l.layers[0], 960, 540);\n l = addTextLayer(l, \"Sub\", \"REBOOT REQUIRED\");\n l.layers[0] = applyTextDoc(l.layers[0], { text: \"REBOOT REQUIRED\", font: \"Courier New-Regular\", size: 36, color: \"#FF0000\", align: 1, tracking: 300 });\n l.layers[0] = setLayerPos(l.layers[0], 960, 640);\n const mainIdx = l.layers.findIndex((x: any) => x.nm === \"Glitch Title\");\n const subIdx = l.layers.findIndex((x: any) => x.nm === \"Sub\");\n const glitchPreset = getAnimPreset(\"glitch-in\");\n const fadePreset = getAnimPreset(\"fade-in\");\n if (glitchPreset && mainIdx >= 0) l = bakeAnimationIntoLayer(l, mainIdx, glitchPreset, { startFrame: 5, endFrame: 25, totalFrames: 120, compW: 1920, compH: 1080 });\n if (fadePreset && subIdx >= 0) l = bakeAnimationIntoLayer(l, subIdx, fadePreset, { startFrame: 20, endFrame: 40, totalFrames: 120, compW: 1920, compH: 1080 });\n reindexLayers(l);\n return l;\n}\n\nfunction buildVerticalStory(): any {\n let l = createBlankLottie(1080, 1920, 30, 90);\n l = addSolidLayer(l, \"BG\", \"#1A0533\", 1080, 1920);\n l = addTextLayer(l, \"Headline\", \"YOUR STORY\");\n l.layers[0] = applyTextDoc(l.layers[0], { text: \"YOUR STORY\", font: \"Raleway-ExtraBold\", size: 96, color: \"#FFFFFF\", align: 1, tracking: 200 });\n l.layers[0] = setLayerPos(l.layers[0], 540, 800);\n l = addTextLayer(l, \"Body\", \"Swipe up to discover more\");\n l.layers[0] = applyTextDoc(l.layers[0], { text: \"Swipe up to discover more\", font: \"Raleway-Regular\", size: 40, color: \"#D4AAFF\", align: 1 });\n l.layers[0] = setLayerPos(l.layers[0], 540, 920);\n const hIdx = l.layers.findIndex((x: any) => x.nm === \"Headline\");\n const bIdx = l.layers.findIndex((x: any) => x.nm === \"Body\");\n const zoomPreset = getAnimPreset(\"zoom-in\");\n const fadePreset = getAnimPreset(\"fade-in\");\n if (zoomPreset && hIdx >= 0) l = bakeAnimationIntoLayer(l, hIdx, zoomPreset, { startFrame: 5, endFrame: 25, totalFrames: 90, compW: 1080, compH: 1920 });\n if (fadePreset && bIdx >= 0) l = bakeAnimationIntoLayer(l, bIdx, fadePreset, { startFrame: 18, endFrame: 35, totalFrames: 90, compW: 1080, compH: 1920 });\n reindexLayers(l);\n return l;\n}\n\nfunction buildMinimalLowerThird(): any {\n let l = createBlankLottie(1920, 1080, 30, 120);\n l = addTextLayer(l, \"Name\", \"JANE SMITH\");\n l.layers[0] = applyTextDoc(l.layers[0], { text: \"JANE SMITH\", font: \"Inter-Bold\", size: 52, color: \"#FFFFFF\", align: 0, tracking: 100 });\n l.layers[0] = setLayerPos(l.layers[0], 120, 920);\n l = addTextLayer(l, \"Role\", \"Senior Product Designer\");\n l.layers[0] = applyTextDoc(l.layers[0], { text: \"Senior Product Designer\", font: \"Inter-Regular\", size: 30, color: \"#AAAAAA\", align: 0 });\n l.layers[0] = setLayerPos(l.layers[0], 120, 960);\n // Accent line shape\n l = addRoundedRect(l, \"Accent Line\", 60, 940, 6, 80, 3, \"#7C6FFF\");\n const nameIdx = l.layers.findIndex((x: any) => x.nm === \"Name\");\n const roleIdx = l.layers.findIndex((x: any) => x.nm === \"Role\");\n const slidePreset = getAnimPreset(\"slide-right\");\n if (slidePreset && nameIdx >= 0) l = bakeAnimationIntoLayer(l, nameIdx, slidePreset, { startFrame: 5, endFrame: 22, totalFrames: 120, compW: 1920, compH: 1080 });\n if (slidePreset && roleIdx >= 0) l = bakeAnimationIntoLayer(l, roleIdx, slidePreset, { startFrame: 12, endFrame: 29, totalFrames: 120, compW: 1920, compH: 1080 });\n reindexLayers(l);\n return l;\n}\n\nfunction buildTypewriterCaption(): any {\n let l = createBlankLottie(1920, 1080, 30, 120);\n l = addTextLayer(l, \"Caption\", \"Every frame tells a story...\");\n l.layers[0] = applyTextDoc(l.layers[0], { text: \"Every frame tells a story...\", font: \"Courier New-Regular\", size: 56, color: \"#FFFFFF\", align: 1 });\n l.layers[0] = setLayerPos(l.layers[0], 960, 880);\n const idx = l.layers.findIndex((x: any) => x.nm === \"Caption\");\n const preset = getAnimPreset(\"typewriter\");\n if (preset && idx >= 0) l = bakeAnimationIntoLayer(l, idx, preset, { startFrame: 5, endFrame: 60, totalFrames: 120, compW: 1920, compH: 1080 });\n reindexLayers(l);\n return l;\n}\n\nfunction buildDropInTitle(): any {\n let l = createBlankLottie(1920, 1080, 30, 120);\n l = addSolidLayer(l, \"BG\", \"#0F1923\", 1920, 1080);\n l = addTextLayer(l, \"Title\", \"IMPACT\");\n l.layers[0] = applyTextDoc(l.layers[0], { text: \"IMPACT\", font: \"Bebas Neue-Regular\", size: 200, color: \"#FFFFFF\", align: 1, tracking: 100 });\n l.layers[0] = setLayerPos(l.layers[0], 960, 540);\n l = addTextLayer(l, \"Sub\", \"MAKE YOUR MARK\");\n l.layers[0] = applyTextDoc(l.layers[0], { text: \"MAKE YOUR MARK\", font: \"Bebas Neue-Regular\", size: 48, color: \"#FF5722\", align: 1, tracking: 400 });\n l.layers[0] = setLayerPos(l.layers[0], 960, 680);\n const titleIdx = l.layers.findIndex((x: any) => x.nm === \"Title\");\n const subIdx = l.layers.findIndex((x: any) => x.nm === \"Sub\");\n const dropPreset = getAnimPreset(\"drop-in\");\n const fadePreset = getAnimPreset(\"fade-in\");\n if (dropPreset && titleIdx >= 0) l = bakeAnimationIntoLayer(l, titleIdx, dropPreset, { startFrame: 5, endFrame: 35, totalFrames: 120, compW: 1920, compH: 1080 });\n if (fadePreset && subIdx >= 0) l = bakeAnimationIntoLayer(l, subIdx, fadePreset, { startFrame: 30, endFrame: 50, totalFrames: 120, compW: 1920, compH: 1080 });\n reindexLayers(l);\n return l;\n}\n\n// ─── Registry ────────────────────────────────────────────────────────────────\n\nexport const LOTTIE_TEMPLATE_PRESETS: LottieTemplatePreset[] = [\n {\n id: \"clean-lower-third\",\n name: \"Clean Lower Third\",\n category: \"lower-third\",\n description: \"Professional name + title lower third with slide-in animation\",\n tags: [\"lower-third\", \"name\", \"title\", \"professional\", \"broadcast\"],\n aspectRatio: \"16:9\",\n build: buildCleanLowerThird,\n },\n {\n id: \"minimal-lower-third\",\n name: \"Minimal Lower Third\",\n category: \"lower-third\",\n description: \"Clean minimal lower third with accent line\",\n tags: [\"lower-third\", \"minimal\", \"clean\", \"modern\"],\n aspectRatio: \"16:9\",\n build: buildMinimalLowerThird,\n },\n {\n id: \"neon-title\",\n name: \"Neon Title\",\n category: \"title-card\",\n description: \"Vibrant neon title card with zoom bounce entrance\",\n tags: [\"neon\", \"title\", \"glow\", \"vibrant\", \"music\"],\n aspectRatio: \"16:9\",\n build: buildNeonTitle,\n },\n {\n id: \"cinematic-title\",\n name: \"Cinematic Title\",\n category: \"cinematic\",\n description: \"Film-style title with letterbox bars and elegant fade\",\n tags: [\"cinematic\", \"film\", \"elegant\", \"fade\", \"movie\"],\n aspectRatio: \"16:9\",\n build: buildCinematicTitle,\n },\n {\n id: \"minimal-caption\",\n name: \"Minimal Caption\",\n category: \"caption\",\n description: \"Simple caption text with slide-up entrance\",\n tags: [\"caption\", \"subtitle\", \"minimal\", \"clean\"],\n aspectRatio: \"16:9\",\n build: buildMinimalCaption,\n },\n {\n id: \"typewriter-caption\",\n name: \"Typewriter Caption\",\n category: \"caption\",\n description: \"Classic typewriter reveal animation\",\n tags: [\"typewriter\", \"caption\", \"retro\", \"reveal\"],\n aspectRatio: \"16:9\",\n build: buildTypewriterCaption,\n },\n {\n id: \"bold-callout\",\n name: \"Bold Callout\",\n category: \"callout\",\n description: \"Attention-grabbing pill callout with pop-in animation\",\n tags: [\"callout\", \"bold\", \"news\", \"alert\", \"pop\"],\n aspectRatio: \"16:9\",\n build: buildBoldCallout,\n },\n {\n id: \"sports-score\",\n name: \"Sports Score\",\n category: \"sports\",\n description: \"Live sports scoreboard overlay\",\n tags: [\"sports\", \"score\", \"broadcast\", \"live\"],\n aspectRatio: \"16:9\",\n build: buildSportsScore,\n },\n {\n id: \"social-quote\",\n name: \"Social Quote\",\n category: \"social\",\n description: \"Elegant quote card for social media\",\n tags: [\"quote\", \"social\", \"instagram\", \"card\", \"elegant\"],\n aspectRatio: \"1:1\",\n build: buildSocialQuote,\n },\n {\n id: \"kinetic-text\",\n name: \"Kinetic Text\",\n category: \"kinetic\",\n description: \"High-energy kinetic typography with staggered slides\",\n tags: [\"kinetic\", \"bold\", \"energy\", \"motion\", \"typography\"],\n aspectRatio: \"16:9\",\n build: buildKineticText,\n },\n {\n id: \"glitch-title\",\n name: \"Glitch Title\",\n category: \"title-card\",\n description: \"Cyberpunk glitch effect title card\",\n tags: [\"glitch\", \"cyberpunk\", \"tech\", \"digital\", \"error\"],\n aspectRatio: \"16:9\",\n build: buildGlitchTitle,\n },\n {\n id: \"vertical-story\",\n name: \"Vertical Story\",\n category: \"social\",\n description: \"9:16 vertical story format with zoom entrance\",\n tags: [\"story\", \"vertical\", \"instagram\", \"tiktok\", \"reels\"],\n aspectRatio: \"9:16\",\n build: buildVerticalStory,\n },\n {\n id: \"drop-in-title\",\n name: \"Drop In Title\",\n category: \"bold\",\n description: \"High-impact title with drop-in bounce animation\",\n tags: [\"bold\", \"impact\", \"drop\", \"bounce\", \"energetic\"],\n aspectRatio: \"16:9\",\n build: buildDropInTitle,\n },\n];\n\nexport function getTemplatePreset(id: string): LottieTemplatePreset | undefined {\n return LOTTIE_TEMPLATE_PRESETS.find((p) => p.id === id);\n}\n\nexport function getTemplatesByCategory(category: TemplatePresetCategory): LottieTemplatePreset[] {\n return LOTTIE_TEMPLATE_PRESETS.filter((p) => p.category === category);\n}\n\nexport const TEMPLATE_CATEGORIES: TemplatePresetCategory[] = [\"lower-third\", \"title-card\", \"callout\", \"caption\", \"kinetic\", \"social\", \"cinematic\", \"sports\", \"minimal\", \"bold\"];\n","/**\n * Lottie Export Engine\n * Supports:\n * - .lottie (dotLottie) — ZIP containing animation.json + manifest.json\n * - .json — raw Lottie JSON\n * - PNG sequence ZIP\n * - Animated GIF (via canvas frame capture)\n */\n\n// ─── dotLottie (.lottie) ─────────────────────────────────────────────────────\n\nexport interface DotLottieManifest {\n version: string;\n generator: string;\n animations: Array<{\n id: string;\n speed?: number;\n themeColor?: string;\n loop?: boolean;\n autoplay?: boolean;\n direction?: 1 | -1;\n }>;\n}\n\n/**\n * Build a .lottie file (ZIP containing animation.json + manifest.json).\n * The .lottie format is the standard used by LottieFiles and dotlottie-player.\n */\nexport async function buildDotLottie(lottieData: object, animationId: string, opts: { loop?: boolean; autoplay?: boolean; speed?: number } = {}): Promise<Blob> {\n const { loop = true, autoplay = true, speed = 1 } = opts;\n\n const manifest: DotLottieManifest = {\n version: \"1\",\n generator: \"Clypra Studio\",\n animations: [{ id: animationId, loop, autoplay, speed }],\n };\n\n const animJson = JSON.stringify(lottieData);\n const manifestJson = JSON.stringify(manifest, null, 2);\n\n // Build minimal ZIP (store, no compression) — same approach as export.ts\n const files: Array<{ name: string; data: Uint8Array }> = [\n { name: `animations/${animationId}.json`, data: new TextEncoder().encode(animJson) },\n { name: \"manifest.json\", data: new TextEncoder().encode(manifestJson) },\n ];\n\n return buildZipBlob(files, \"application/zip\");\n}\n\n/**\n * Download a .lottie file.\n */\nexport function downloadDotLottie(lottieData: object, filename: string, animationId?: string, opts?: { loop?: boolean; autoplay?: boolean; speed?: number }): Promise<void> {\n const id = animationId || filename.replace(/[^a-z0-9-]/gi, \"-\").toLowerCase() || \"animation\";\n return buildDotLottie(lottieData, id, opts).then((blob) => {\n triggerDownload(blob, filename.endsWith(\".lottie\") ? filename : `${filename}.lottie`);\n });\n}\n\n/**\n * Download raw Lottie JSON.\n */\nexport function downloadLottieJson(lottieData: object, filename: string): void {\n const blob = new Blob([JSON.stringify(lottieData, null, 2)], { type: \"application/json\" });\n triggerDownload(blob, filename.endsWith(\".json\") ? filename : `${filename}.json`);\n}\n\n// ─── Animated GIF ─────────────────────────────────────────────────────────────\n\nexport interface GifExportOptions {\n fps?: number;\n duration?: number;\n width?: number;\n height?: number;\n quality?: number; // 1–20, lower = better quality (GIF palette)\n loop?: boolean;\n}\n\nexport interface GifFrame {\n imageData: ImageData;\n delay: number; // centiseconds\n}\n\n/**\n * Capture frames from a Lottie animation rendered via lottie-web into a canvas.\n * Returns raw ImageData frames ready for GIF encoding.\n *\n * NOTE: Requires lottie-web to be loaded and the container to be in the DOM.\n */\nexport async function captureLottieFrames(lottieInstance: any, canvas: HTMLCanvasElement, opts: GifExportOptions = {}): Promise<GifFrame[]> {\n const fps = opts.fps ?? 15;\n const duration = opts.duration ?? lottieInstance.totalFrames / (lottieInstance.frameRate || 30);\n const totalFrames = Math.ceil(duration * fps);\n const delay = Math.round(100 / fps); // centiseconds per frame\n\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) throw new Error(\"Cannot get 2D context from canvas\");\n\n const frames: GifFrame[] = [];\n\n for (let i = 0; i < totalFrames; i++) {\n const lottieFrame = (i / totalFrames) * lottieInstance.totalFrames;\n lottieInstance.goToAndStop(lottieFrame, true);\n\n // Wait for render\n await new Promise<void>((r) => requestAnimationFrame(() => r()));\n\n // Draw SVG to canvas via serialization\n const container = lottieInstance.renderer?.svgElement?.parentElement;\n if (container) {\n const svg = container.querySelector(\"svg\");\n if (svg) {\n const svgStr = new XMLSerializer().serializeToString(svg);\n const img = new Image();\n const blob = new Blob([svgStr], { type: \"image/svg+xml\" });\n const url = URL.createObjectURL(blob);\n await new Promise<void>((resolve, reject) => {\n img.onload = () => {\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n ctx.drawImage(img, 0, 0, canvas.width, canvas.height);\n URL.revokeObjectURL(url);\n resolve();\n };\n img.onerror = reject;\n img.src = url;\n });\n }\n }\n\n frames.push({\n imageData: ctx.getImageData(0, 0, canvas.width, canvas.height),\n delay,\n });\n }\n\n return frames;\n}\n\n/**\n * Encode frames to an animated GIF using a pure-JS GIF encoder.\n * Uses the omggif library approach (inline minimal encoder).\n */\nexport function encodeGif(frames: GifFrame[], width: number, height: number, opts: { loop?: boolean; quality?: number } = {}): Uint8Array {\n const { loop = true, quality = 10 } = opts;\n\n // Minimal GIF89a encoder\n const buf: number[] = [];\n\n const writeStr = (s: string) => {\n for (let i = 0; i < s.length; i++) buf.push(s.charCodeAt(i));\n };\n const writeU16 = (v: number) => {\n buf.push(v & 0xff, (v >> 8) & 0xff);\n };\n const writeByte = (v: number) => buf.push(v & 0xff);\n\n // Header\n writeStr(\"GIF89a\");\n writeU16(width);\n writeU16(height);\n writeByte(0x70); // GCT flag + color resolution + sort flag + GCT size (256 colors)\n writeByte(0); // background color index\n writeByte(0); // pixel aspect ratio\n\n // Global color table (256 grayscale entries as placeholder — real colors come per-frame)\n for (let i = 0; i < 256; i++) {\n buf.push(i, i, i);\n }\n\n // Netscape loop extension\n if (loop) {\n writeStr(\"\\x21\\xff\\x0bNETSCAPE2.0\\x03\\x01\");\n writeU16(0); // loop count 0 = infinite\n writeByte(0);\n }\n\n for (const frame of frames) {\n const { imageData, delay } = frame;\n const pixels = imageData.data;\n\n // Quantize to 256 colors (median cut approximation — simplified octree)\n const palette = quantizeTopalette(pixels, 256);\n const indices = mapPixelsToPalette(pixels, palette);\n\n // Graphic control extension\n buf.push(0x21, 0xf9, 0x04);\n writeByte(0x00); // disposal method\n writeU16(delay);\n writeByte(0); // transparent color index\n writeByte(0);\n\n // Image descriptor\n writeByte(0x2c);\n writeU16(0);\n writeU16(0); // left, top\n writeU16(width);\n writeU16(height);\n writeByte(0x80); // local color table flag, 256 colors\n\n // Local color table\n for (const [r, g, b] of palette) {\n buf.push(r, g, b);\n }\n\n // LZW compressed image data\n const lzwData = lzwEncode(indices, 8);\n writeByte(8); // LZW minimum code size\n for (let i = 0; i < lzwData.length; i += 255) {\n const chunk = lzwData.slice(i, i + 255);\n writeByte(chunk.length);\n for (const b of chunk) buf.push(b);\n }\n writeByte(0); // block terminator\n }\n\n writeByte(0x3b); // GIF trailer\n return new Uint8Array(buf);\n}\n\n// ─── Internal helpers ─────────────────────────────────────────────────────────\n\nfunction triggerDownload(blob: Blob, filename: string): void {\n const url = URL.createObjectURL(blob);\n const a = document.createElement(\"a\");\n a.href = url;\n a.download = filename;\n a.click();\n URL.revokeObjectURL(url);\n}\n\nfunction buildZipBlob(files: Array<{ name: string; data: Uint8Array }>, mimeType = \"application/zip\"): Blob {\n const parts: BlobPart[] = [];\n let offset = 0;\n const central: Uint8Array[] = [];\n\n const crcTable = (() => {\n const t = new Uint32Array(256);\n for (let i = 0; i < 256; i++) {\n let c = i;\n for (let k = 0; k < 8; k++) c = c & 1 ? 0xedb88320 ^ (c >>> 1) : c >>> 1;\n t[i] = c >>> 0;\n }\n return t;\n })();\n\n const crc32 = (data: Uint8Array) => {\n let c = 0xffffffff;\n for (let i = 0; i < data.length; i++) c = crcTable[(c ^ data[i]) & 0xff] ^ (c >>> 8);\n return (c ^ 0xffffffff) >>> 0;\n };\n\n const u16 = (arr: number[], v: number) => arr.push(v & 0xff, (v >>> 8) & 0xff);\n const u32 = (arr: number[], v: number) => arr.push(v & 0xff, (v >>> 8) & 0xff, (v >>> 16) & 0xff, (v >>> 24) & 0xff);\n\n for (const file of files) {\n const nameBytes = new TextEncoder().encode(file.name);\n const crc = crc32(file.data);\n const local: number[] = [];\n u32(local, 0x04034b50);\n u16(local, 20);\n u16(local, 0);\n u16(local, 0);\n u16(local, 0);\n u16(local, 0);\n u32(local, crc);\n u32(local, file.data.length);\n u32(local, file.data.length);\n u16(local, nameBytes.length);\n u16(local, 0);\n local.push(...nameBytes);\n const localHeader = new Uint8Array(local);\n parts.push(localHeader, file.data.buffer.slice(file.data.byteOffset, file.data.byteOffset + file.data.byteLength) as ArrayBuffer);\n\n const ce: number[] = [];\n u32(ce, 0x02014b50);\n u16(ce, 20);\n u16(ce, 20);\n u16(ce, 0);\n u16(ce, 0);\n u16(ce, 0);\n u16(ce, 0);\n u32(ce, crc);\n u32(ce, file.data.length);\n u32(ce, file.data.length);\n u16(ce, nameBytes.length);\n u16(ce, 0);\n u16(ce, 0);\n u16(ce, 0);\n u16(ce, 0);\n u32(ce, 0);\n u32(ce, offset);\n ce.push(...nameBytes);\n central.push(new Uint8Array(ce));\n offset += localHeader.length + file.data.length;\n }\n\n const centralSize = central.reduce((s, c) => s + c.length, 0);\n const centralStart = offset;\n for (const c of central) parts.push(c.buffer.slice(c.byteOffset, c.byteOffset + c.byteLength) as ArrayBuffer);\n\n const end: number[] = [];\n const u16e = (v: number) => end.push(v & 0xff, (v >>> 8) & 0xff);\n const u32e = (v: number) => end.push(v & 0xff, (v >>> 8) & 0xff, (v >>> 16) & 0xff, (v >>> 24) & 0xff);\n u32e(0x06054b50);\n u16e(0);\n u16e(0);\n u16e(files.length);\n u16e(files.length);\n u32e(centralSize);\n u32e(centralStart);\n u16e(0);\n parts.push(new Uint8Array(end).buffer as ArrayBuffer);\n\n return new Blob(parts, { type: mimeType });\n}\n\n/** Simplified median-cut color quantization — returns up to `maxColors` [r,g,b] entries */\nfunction quantizeTopalette(pixels: Uint8ClampedArray, maxColors: number): Array<[number, number, number]> {\n const sample: Array<[number, number, number]> = [];\n for (let i = 0; i < pixels.length; i += 4 * 4) {\n // sample every 4th pixel\n if (pixels[i + 3] > 0) sample.push([pixels[i], pixels[i + 1], pixels[i + 2]]);\n }\n if (sample.length === 0) return Array.from({ length: maxColors }, (_, i) => [i, i, i] as [number, number, number]);\n\n // Simple k-means with k = min(maxColors, unique colors)\n const unique = new Map<string, [number, number, number]>();\n for (const c of sample) {\n const key = `${c[0] >> 2},${c[1] >> 2},${c[2] >> 2}`;\n if (!unique.has(key)) unique.set(key, c);\n if (unique.size >= maxColors) break;\n }\n\n const palette = Array.from(unique.values()).slice(0, maxColors);\n while (palette.length < maxColors) palette.push([0, 0, 0]);\n return palette;\n}\n\n/** Map each pixel to the nearest palette index */\nfunction mapPixelsToPalette(pixels: Uint8ClampedArray, palette: Array<[number, number, number]>): Uint8Array {\n const indices = new Uint8Array(pixels.length / 4);\n for (let i = 0; i < pixels.length; i += 4) {\n const r = pixels[i],\n g = pixels[i + 1],\n b = pixels[i + 2];\n let best = 0,\n bestDist = Infinity;\n for (let j = 0; j < palette.length; j++) {\n const dr = r - palette[j][0],\n dg = g - palette[j][1],\n db = b - palette[j][2];\n const dist = dr * dr + dg * dg + db * db;\n if (dist < bestDist) {\n bestDist = dist;\n best = j;\n }\n }\n indices[i / 4] = best;\n }\n return indices;\n}\n\n/** Minimal LZW encoder for GIF */\nfunction lzwEncode(indices: Uint8Array, minCodeSize: number): number[] {\n const clearCode = 1 << minCodeSize;\n const eofCode = clearCode + 1;\n let codeSize = minCodeSize + 1;\n let nextCode = eofCode + 1;\n\n const table = new Map<string, number>();\n const resetTable = () => {\n table.clear();\n for (let i = 0; i < clearCode; i++) table.set(String.fromCharCode(i), i);\n codeSize = minCodeSize + 1;\n nextCode = eofCode + 1;\n };\n\n const output: number[] = [];\n let bitBuf = 0,\n bitLen = 0;\n\n const emit = (code: number) => {\n bitBuf |= code << bitLen;\n bitLen += codeSize;\n while (bitLen >= 8) {\n output.push(bitBuf & 0xff);\n bitBuf >>= 8;\n bitLen -= 8;\n }\n };\n\n resetTable();\n emit(clearCode);\n\n let prefix = String.fromCharCode(indices[0]);\n for (let i = 1; i < indices.length; i++) {\n const suffix = String.fromCharCode(indices[i]);\n const combined = prefix + suffix;\n if (table.has(combined)) {\n prefix = combined;\n } else {\n emit(table.get(prefix)!);\n if (nextCode < 4096) {\n table.set(combined, nextCode++);\n if (nextCode > 1 << codeSize && codeSize < 12) codeSize++;\n } else {\n emit(clearCode);\n resetTable();\n }\n prefix = suffix;\n }\n }\n emit(table.get(prefix)!);\n emit(eofCode);\n if (bitLen > 0) output.push(bitBuf & 0xff);\n return output;\n}\n","import type { SceneDocument } from \"./schema\";\nimport { evaluateScene } from \"./evaluate\";\n\nexport interface PngSequenceOptions {\n fps?: number;\n duration?: number;\n width?: number;\n height?: number;\n}\n\nexport interface PngSequenceFrame {\n index: number;\n time: number;\n dataUrl: string;\n}\n\n/** Render all frames in-memory (browser) */\nexport function renderPngSequence(doc: SceneDocument, options: PngSequenceOptions = {}): PngSequenceFrame[] {\n const fps = options.fps ?? doc.timeline.fps ?? 30;\n const duration = options.duration ?? doc.timeline.duration ?? 2;\n const width = options.width ?? doc.canvas.width ?? 800;\n const height = options.height ?? doc.canvas.height ?? 200;\n const frameCount = Math.max(1, Math.ceil(duration * fps));\n\n const canvas = document.createElement(\"canvas\");\n canvas.width = width;\n canvas.height = height;\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) return [];\n\n const frames: PngSequenceFrame[] = [];\n for (let i = 0; i < frameCount; i++) {\n const time = i / fps;\n ctx.clearRect(0, 0, width, height);\n evaluateScene(doc, time, ctx);\n frames.push({\n index: i,\n time,\n dataUrl: canvas.toDataURL(\"image/png\"),\n });\n }\n return frames;\n}\n\nfunction dataUrlToUint8Array(dataUrl: string): Uint8Array {\n const base64 = dataUrl.split(\",\")[1] ?? \"\";\n const binary = atob(base64);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) bytes[i] = binary.charCodeAt(i);\n return bytes;\n}\n\n/** Build a minimal ZIP (store only, no compression) for PNG frames */\nexport function buildPngSequenceZip(frames: PngSequenceFrame[]): Blob {\n const files: { name: string; data: Uint8Array }[] = frames.map((f) => ({\n name: `frame-${String(f.index).padStart(4, \"0\")}.png`,\n data: dataUrlToUint8Array(f.dataUrl),\n }));\n\n const parts: BlobPart[] = [];\n let offset = 0;\n const central: Uint8Array[] = [];\n\n const crcTable = (() => {\n const table = new Uint32Array(256);\n for (let i = 0; i < 256; i++) {\n let c = i;\n for (let k = 0; k < 8; k++) c = c & 1 ? 0xedb88320 ^ (c >>> 1) : c >>> 1;\n table[i] = c >>> 0;\n }\n return table;\n })();\n\n const crc32 = (data: Uint8Array) => {\n let c = 0xffffffff;\n for (let i = 0; i < data.length; i++) c = crcTable[(c ^ data[i]) & 0xff] ^ (c >>> 8);\n return (c ^ 0xffffffff) >>> 0;\n };\n\n const pushU16 = (arr: number[], v: number) => {\n arr.push(v & 0xff, (v >>> 8) & 0xff);\n };\n const pushU32 = (arr: number[], v: number) => {\n arr.push(v & 0xff, (v >>> 8) & 0xff, (v >>> 16) & 0xff, (v >>> 24) & 0xff);\n };\n\n for (const file of files) {\n const nameBytes = new TextEncoder().encode(file.name);\n const data = file.data;\n const crc = crc32(data);\n\n const local: number[] = [];\n pushU32(local, 0x04034b50);\n pushU16(local, 20);\n pushU16(local, 0);\n pushU16(local, 0);\n pushU16(local, 0);\n pushU16(local, 0);\n pushU32(local, crc);\n pushU32(local, data.length);\n pushU32(local, data.length);\n pushU16(local, nameBytes.length);\n pushU16(local, 0);\n local.push(...nameBytes);\n\n const localHeader = new Uint8Array(local);\n parts.push(localHeader);\n parts.push(data.buffer.slice(data.byteOffset, data.byteOffset + data.byteLength) as ArrayBuffer);\n\n const centralEntry: number[] = [];\n pushU32(centralEntry, 0x02014b50);\n pushU16(centralEntry, 20);\n pushU16(centralEntry, 20);\n pushU16(centralEntry, 0);\n pushU16(centralEntry, 0);\n pushU16(centralEntry, 0);\n pushU16(centralEntry, 0);\n pushU32(centralEntry, crc);\n pushU32(centralEntry, data.length);\n pushU32(centralEntry, data.length);\n pushU16(centralEntry, nameBytes.length);\n pushU16(centralEntry, 0);\n pushU16(centralEntry, 0);\n pushU16(centralEntry, 0);\n pushU16(centralEntry, 0);\n pushU32(centralEntry, 0);\n pushU32(centralEntry, offset);\n centralEntry.push(...nameBytes);\n central.push(new Uint8Array(centralEntry));\n\n offset += localHeader.length + data.length;\n }\n\n const centralSize = central.reduce((s, c) => s + c.length, 0);\n const centralStart = offset;\n for (const c of central) parts.push(c.buffer.slice(c.byteOffset, c.byteOffset + c.byteLength) as ArrayBuffer);\n\n const end: number[] = [];\n pushU32(end, 0x06054b50);\n pushU16(end, 0);\n pushU16(end, 0);\n pushU16(end, files.length);\n pushU16(end, files.length);\n pushU32(end, centralSize);\n pushU32(end, centralStart);\n pushU16(end, 0);\n parts.push(new Uint8Array(end).buffer as ArrayBuffer);\n\n return new Blob(parts, { type: \"application/zip\" });\n}\n\nexport function downloadPngSequenceZip(doc: SceneDocument, filename: string, options?: PngSequenceOptions): void {\n const frames = renderPngSequence(doc, options);\n if (frames.length === 0) return;\n const zip = buildPngSequenceZip(frames);\n const url = URL.createObjectURL(zip);\n const link = document.createElement(\"a\");\n link.href = url;\n link.download = filename.endsWith(\".zip\") ? filename : `${filename}.zip`;\n link.click();\n URL.revokeObjectURL(url);\n}\n\nexport const WEBM_EXPORT_MAX_FRAMES = 900;\n\nconst WEBM_MIME_CANDIDATES = [\"video/webm;codecs=vp9\", \"video/webm;codecs=vp8\", \"video/webm\"] as const;\n\nexport interface WebMExportOptions extends PngSequenceOptions {\n videoBitsPerSecond?: number;\n /** Pace frame capture so clip duration matches timeline (recommended) */\n realtimePacing?: boolean;\n}\n\nexport function getSupportedWebMMimeType(): string | null {\n if (typeof MediaRecorder === \"undefined\") return null;\n return WEBM_MIME_CANDIDATES.find((t) => MediaRecorder.isTypeSupported(t)) ?? null;\n}\n\nexport function isWebMExportSupported(): boolean {\n return typeof document !== \"undefined\" && typeof MediaRecorder !== \"undefined\" && getSupportedWebMMimeType() !== null;\n}\n\nexport function getWebMFrameCount(doc: SceneDocument, options: WebMExportOptions = {}): number {\n const fps = options.fps ?? doc.timeline.fps ?? 30;\n const duration = options.duration ?? doc.timeline.duration ?? 2;\n return Math.max(1, Math.ceil(duration * fps));\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\ntype CanvasCaptureTrack = MediaStreamTrack & { requestFrame?: () => void };\n\n/**\n * Encode timeline frames to WebM via MediaRecorder + canvas.captureStream(0).\n * Browser-only; transparent backgrounds may flatten to black in the recording.\n */\nexport async function renderSceneWebM(doc: SceneDocument, options: WebMExportOptions = {}): Promise<Blob> {\n if (typeof document === \"undefined\") {\n throw new Error(\"WebM export requires a browser environment.\");\n }\n\n const mimeType = getSupportedWebMMimeType();\n if (!mimeType) {\n throw new Error(\"WebM recording is not supported in this browser.\");\n }\n\n const fps = options.fps ?? doc.timeline.fps ?? 30;\n const duration = options.duration ?? doc.timeline.duration ?? 2;\n const width = options.width ?? doc.canvas.width ?? 800;\n const height = options.height ?? doc.canvas.height ?? 200;\n const frameCount = getWebMFrameCount(doc, options);\n\n if (frameCount > WEBM_EXPORT_MAX_FRAMES) {\n throw new Error(`Too many frames (${frameCount}). Max ${WEBM_EXPORT_MAX_FRAMES}. Lower duration or FPS.`);\n }\n\n const canvas = document.createElement(\"canvas\");\n canvas.width = width;\n canvas.height = height;\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) throw new Error(\"Could not create export canvas.\");\n\n const stream = canvas.captureStream(0);\n const videoTrack = stream.getVideoTracks()[0] as CanvasCaptureTrack;\n\n const recorder = new MediaRecorder(stream, {\n mimeType,\n videoBitsPerSecond: options.videoBitsPerSecond ?? 6_000_000,\n });\n\n const chunks: BlobPart[] = [];\n const frameIntervalMs = 1000 / fps;\n const pace = options.realtimePacing !== false;\n\n const blob = await new Promise<Blob>((resolve, reject) => {\n recorder.ondataavailable = (e) => {\n if (e.data.size > 0) chunks.push(e.data);\n };\n recorder.onerror = () => {\n reject(new Error(\"MediaRecorder failed during WebM export.\"));\n };\n recorder.onstop = () => {\n const baseMime = mimeType.split(\";\")[0] ?? \"video/webm\";\n resolve(new Blob(chunks, { type: baseMime }));\n };\n\n recorder.start();\n\n (async () => {\n try {\n for (let i = 0; i < frameCount; i++) {\n const time = i / fps;\n ctx.clearRect(0, 0, width, height);\n evaluateScene(doc, time, ctx);\n if (typeof videoTrack.requestFrame === \"function\") {\n videoTrack.requestFrame();\n }\n if (pace) await sleep(frameIntervalMs);\n else await new Promise<void>((r) => requestAnimationFrame(() => r()));\n }\n recorder.stop();\n } catch (err) {\n try {\n recorder.stop();\n } catch {\n /* ignore */\n }\n reject(err);\n } finally {\n stream.getTracks().forEach((t) => t.stop());\n }\n })();\n });\n\n return blob;\n}\n\nexport async function downloadSceneWebM(doc: SceneDocument, filename: string, options?: WebMExportOptions): Promise<void> {\n const blob = await renderSceneWebM(doc, options);\n const url = URL.createObjectURL(blob);\n const link = document.createElement(\"a\");\n link.href = url;\n link.download = filename.endsWith(\".webm\") ? filename : `${filename}.webm`;\n link.click();\n URL.revokeObjectURL(url);\n}\n","/**\n * Google Fonts loader for the Lottie Studio.\n * Scans a Lottie composition for all font families used, then injects\n * the appropriate Google Fonts stylesheet + @font-face rules so\n * lottie-web can resolve them by fName.\n */\n\n// ─── Font family → Google Fonts slug mapping ─────────────────────────────────\n\n/** Families that ship with the OS — no Google Fonts needed */\nconst SYSTEM_FONTS = new Set([\"Arial\", \"Arial Black\", \"Comic Sans MS\", \"Courier New\", \"Georgia\", \"Impact\", \"Times New Roman\", \"Trebuchet MS\", \"Verdana\", \"Helvetica\", \"Helvetica Neue\", \"Tahoma\", \"Palatino\"]);\n\n/** Weight names used in Lottie fName → numeric weight */\nconst WEIGHT_MAP: Record<string, number> = {\n Thin: 100,\n ExtraLight: 200,\n Light: 300,\n Regular: 400,\n Medium: 500,\n SemiBold: 600,\n Bold: 700,\n ExtraBold: 800,\n Black: 900,\n};\n\nexport interface LottieFontUsage {\n fName: string; // e.g. \"Poppins-Bold\"\n fFamily: string; // e.g. \"Poppins\"\n fWeight: number; // e.g. 700\n fStyle: \"normal\" | \"italic\";\n}\n\n// ─── Scanner ─────────────────────────────────────────────────────────────────\n\n/**\n * Scan a Lottie JSON object and return all unique font usages.\n */\nexport function scanLottieFonts(lottieData: any): LottieFontUsage[] {\n if (!lottieData?.fonts?.list) return [];\n\n const usages: LottieFontUsage[] = [];\n const seen = new Set<string>();\n\n for (const entry of lottieData.fonts.list) {\n const fName: string = entry.fName || entry.asName || \"\";\n if (!fName || seen.has(fName)) continue;\n seen.add(fName);\n\n const fFamily: string = entry.fFamily || parseFamilyFromName(fName);\n const { weight, italic } = parseVariantFromName(fName);\n\n usages.push({\n fName,\n fFamily,\n fWeight: weight,\n fStyle: italic ? \"italic\" : \"normal\",\n });\n }\n\n return usages;\n}\n\nfunction parseFamilyFromName(fName: string): string {\n // \"Poppins-Bold\" → \"Poppins\", \"Open Sans-Regular\" → \"Open Sans\"\n const dashIdx = fName.lastIndexOf(\"-\");\n return dashIdx > 0 ? fName.slice(0, dashIdx) : fName;\n}\n\nfunction parseVariantFromName(fName: string): { weight: number; italic: boolean } {\n const dashIdx = fName.lastIndexOf(\"-\");\n const variant = dashIdx > 0 ? fName.slice(dashIdx + 1) : \"Regular\";\n const italic = variant.toLowerCase().includes(\"italic\");\n const clean = variant.replace(/italic/i, \"\").trim();\n const weight = WEIGHT_MAP[clean] ?? 400;\n return { weight, italic };\n}\n\n// ─── Loader ──────────────────────────────────────────────────────────────────\n\nconst loadedFamilies = new Set<string>();\n\n/**\n * Inject Google Fonts stylesheets for all non-system fonts found in a Lottie.\n * Also injects @font-face rules that map Lottie fName → CSS font-family.\n * Safe to call multiple times — deduplicates by family.\n */\nexport function loadLottieFonts(lottieData: any): void {\n if (typeof document === \"undefined\") return;\n\n const usages = scanLottieFonts(lottieData);\n const googleFamilies = new Map<string, Set<string>>(); // family → set of \"weight\" or \"weight italic\"\n\n for (const usage of usages) {\n if (SYSTEM_FONTS.has(usage.fFamily)) continue;\n if (!googleFamilies.has(usage.fFamily)) googleFamilies.set(usage.fFamily, new Set());\n const variant = usage.fStyle === \"italic\" ? `${usage.fWeight}italic` : `${usage.fWeight}`;\n googleFamilies.get(usage.fFamily)!.add(variant);\n }\n\n for (const [family, variants] of googleFamilies) {\n if (loadedFamilies.has(family)) continue;\n loadedFamilies.add(family);\n\n // Build Google Fonts v2 URL\n const slug = family.replace(/\\s+/g, \"+\");\n const weights = Array.from(variants)\n .map((v) => v.replace(\"italic\", \"\"))\n .filter(Boolean)\n .join(\";\");\n const url = `https://fonts.googleapis.com/css2?family=${slug}:ital,wght@${buildGoogleFontsAxes(variants)}&display=swap`;\n\n const linkId = `gfont-lottie-${family.replace(/\\s+/g, \"-\").toLowerCase()}`;\n if (!document.getElementById(linkId)) {\n const link = document.createElement(\"link\");\n link.id = linkId;\n link.rel = \"stylesheet\";\n link.href = url;\n document.head.appendChild(link);\n }\n }\n\n // Inject @font-face rules that map Lottie fName to the loaded CSS family\n injectFontFaceRules(usages);\n}\n\nfunction buildGoogleFontsAxes(variants: Set<string>): string {\n // Build \"ital,wght@0,400;0,700;1,400\" style axes\n const axes: string[] = [];\n for (const v of variants) {\n const isItalic = v.includes(\"italic\");\n const weight = v.replace(\"italic\", \"\") || \"400\";\n axes.push(`${isItalic ? 1 : 0},${weight}`);\n }\n return axes.sort().join(\";\");\n}\n\nconst injectedFontFaces = new Set<string>();\n\nfunction injectFontFaceRules(usages: LottieFontUsage[]): void {\n if (typeof document === \"undefined\") return;\n\n const rules: string[] = [];\n\n for (const usage of usages) {\n if (injectedFontFaces.has(usage.fName)) continue;\n injectedFontFaces.add(usage.fName);\n\n // lottie-web looks up fonts by font-family matching fName exactly.\n // We create a @font-face that aliases fName → the actual loaded family.\n rules.push(\n `\n@font-face {\n font-family: \"${usage.fName}\";\n src: local(\"${usage.fFamily}\");\n font-weight: ${usage.fWeight};\n font-style: ${usage.fStyle};\n}\n `.trim(),\n );\n }\n\n if (rules.length === 0) return;\n\n const styleId = \"clypra-lottie-fontfaces\";\n let styleEl = document.getElementById(styleId) as HTMLStyleElement | null;\n if (!styleEl) {\n styleEl = document.createElement(\"style\");\n styleEl.id = styleId;\n document.head.appendChild(styleEl);\n }\n styleEl.textContent += \"\\n\" + rules.join(\"\\n\");\n}\n\n/**\n * Wait for all fonts currently in the document to be loaded.\n * Useful before capturing thumbnails or exporting frames.\n */\nexport async function waitForFontsReady(): Promise<void> {\n if (typeof document === \"undefined\") return;\n if (document.fonts?.ready) {\n await document.fonts.ready;\n } else {\n await new Promise<void>((r) => setTimeout(r, 300));\n }\n}\n\n/**\n * Preload a specific Google Font family with given weights.\n * Useful for the Style Editor font picker.\n */\nexport function preloadGoogleFont(family: string, weights: number[] = [400, 700]): void {\n if (typeof document === \"undefined\") return;\n if (SYSTEM_FONTS.has(family)) return;\n\n const linkId = `gfont-picker-${family.replace(/\\s+/g, \"-\").toLowerCase()}`;\n if (document.getElementById(linkId)) return;\n\n const slug = family.replace(/\\s+/g, \"+\");\n const wStr = weights.join(\";\");\n const url = `https://fonts.googleapis.com/css2?family=${slug}:wght@${wStr}&display=swap`;\n\n const link = document.createElement(\"link\");\n link.id = linkId;\n link.rel = \"stylesheet\";\n link.href = url;\n document.head.appendChild(link);\n}\n\n/**\n * Clear the font loading cache (useful for testing).\n */\nexport function clearFontCache(): void {\n loadedFamilies.clear();\n injectedFontFaces.clear();\n}\n","import type { EffectLayer, EffectLayerType } from \"./schema\";\n\nexport interface AnimatableParamDef {\n path: string;\n label: string;\n min?: number;\n max?: number;\n step?: number;\n unit?: string;\n}\n\nconst LAYER_OPACITY: AnimatableParamDef = {\n path: \"layerOpacity\",\n label: \"Layer opacity\",\n min: 0,\n max: 1,\n step: 0.01,\n};\n\nconst BY_TYPE: Partial<Record<EffectLayerType, AnimatableParamDef[]>> = {\n shadow: [\n { path: \"shadowOffsetX\", label: \"Offset X\", min: -120, max: 120, step: 1 },\n { path: \"shadowOffsetY\", label: \"Offset Y\", min: -120, max: 120, step: 1 },\n { path: \"shadowBlur\", label: \"Blur\", min: 0, max: 80, step: 1 },\n { path: \"shadowOpacity\", label: \"Opacity\", min: 0, max: 100, step: 1, unit: \"%\" },\n ],\n glow: [\n { path: \"blur\", label: \"Blur\", min: 0, max: 120, step: 1 },\n { path: \"opacity\", label: \"Glow opacity\", min: 0, max: 100, step: 1, unit: \"%\" },\n { path: \"spread\", label: \"Spread\", min: 0, max: 100, step: 1 },\n { path: \"strength\", label: \"Strength\", min: 0, max: 100, step: 1 },\n ],\n extrusion: [\n { path: \"bevelDepth\", label: \"Depth\", min: 0, max: 80, step: 1 },\n { path: \"bevelHighlight\", label: \"Highlight\", min: 0, max: 100, step: 1 },\n { path: \"bevelShadow\", label: \"Shadow\", min: 0, max: 100, step: 1 },\n { path: \"bevelBlur\", label: \"Ambient blur\", min: 0, max: 40, step: 1 },\n ],\n duplicateStack: [\n { path: \"stackOffsetX\", label: \"Stack offset X\", min: -40, max: 40, step: 1 },\n { path: \"stackOffsetY\", label: \"Stack offset Y\", min: -40, max: 40, step: 1 },\n { path: \"stackCount\", label: \"Stack count\", min: 1, max: 24, step: 1 },\n ],\n stroke: [\n { path: \"strokeWidth\", label: \"Width\", min: 0, max: 40, step: 0.5 },\n { path: \"strokeOpacity\", label: \"Opacity\", min: 0, max: 100, step: 1, unit: \"%\" },\n { path: \"strokeBlur\", label: \"Blur\", min: 0, max: 30, step: 1 },\n ],\n fill: [{ path: \"fillOpacity\", label: \"Fill opacity\", min: 0, max: 100, step: 1, unit: \"%\" }],\n panel: [\n { path: \"panelOpacity\", label: \"Panel opacity\", min: 0, max: 100, step: 1, unit: \"%\" },\n { path: \"panelPaddingX\", label: \"Padding X\", min: 0, max: 120, step: 1 },\n { path: \"panelPaddingY\", label: \"Padding Y\", min: 0, max: 120, step: 1 },\n ],\n mask: [{ path: \"revealProgress\", label: \"Reveal\", min: 0, max: 1, step: 0.01 }],\n filter: [\n { path: \"blur\", label: \"Blur\", min: 0, max: 20, step: 0.1 },\n { path: \"bloom\", label: \"Bloom\", min: 0, max: 2, step: 0.05 },\n ],\n};\n\nexport function getAnimatableParamsForLayer(layer: EffectLayer): AnimatableParamDef[] {\n const typeParams = BY_TYPE[layer.type] ?? [];\n return [LAYER_OPACITY, ...typeParams];\n}\n\nexport function getAnimatableParamDef(layer: EffectLayer, paramPath: string): AnimatableParamDef | undefined {\n return getAnimatableParamsForLayer(layer).find((p) => p.path === paramPath);\n}\n\nexport function readLayerScalar(layer: EffectLayer, paramPath: string): number {\n if (paramPath === \"layerOpacity\") return layer.opacity;\n const parts = paramPath.split(\".\");\n let target: Record<string, unknown> = layer.params;\n for (let i = 0; i < parts.length - 1; i++) {\n const key = parts[i];\n const next = target[key];\n if (typeof next !== \"object\" || next === null) return 0;\n target = next as Record<string, unknown>;\n }\n const leaf = parts[parts.length - 1];\n const v = target[leaf];\n return typeof v === \"number\" ? v : 0;\n}\n","import type { SceneDocument, EffectLayer } from \"./schema\";\nimport { sceneToConfig, textEffectConfigToScene } from \"./migrate\";\nimport type { TextEffectConfig } from \"../types\";\nimport { newLayerId } from \"./schema\";\n\nfunction mixNum(a: number, b: number, t: number): number {\n return Math.round(a + (b - a) * t);\n}\n\nfunction mixFloat(a: number, b: number, t: number): number {\n return a + (b - a) * t;\n}\n\nfunction mixColor(hexA: string, hexB: string, t: number): string {\n const parse = (h: string) => {\n const x = h.replace(\"#\", \"\");\n const n = parseInt(\n x.length === 3\n ? x\n .split(\"\")\n .map((c) => c + c)\n .join(\"\")\n : x,\n 16,\n );\n return { r: (n >> 16) & 255, g: (n >> 8) & 255, b: n & 255 };\n };\n try {\n const a = parse(hexA);\n const b = parse(hexB);\n const r = Math.round(a.r + (b.r - a.r) * t);\n const g = Math.round(a.g + (b.g - a.g) * t);\n const bl = Math.round(a.b + (b.b - a.b) * t);\n return `#${((1 << 24) + (r << 16) + (g << 8) + bl).toString(16).slice(1).toUpperCase()}`;\n } catch {\n return t > 0.5 ? hexB : hexA;\n }\n}\n\nfunction blendLayerParams(paramsA: Record<string, unknown>, paramsB: Record<string, unknown>, t: number): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n const keys = new Set([...Object.keys(paramsA), ...Object.keys(paramsB)]);\n for (const key of keys) {\n const a = paramsA[key];\n const b = paramsB[key];\n if (typeof a === \"number\" && typeof b === \"number\") {\n out[key] = Number.isInteger(a) && Number.isInteger(b) ? mixNum(a, b, t) : mixFloat(a, b, t);\n } else if (typeof a === \"string\" && typeof b === \"string\" && a.startsWith(\"#\") && b.startsWith(\"#\")) {\n out[key] = mixColor(a, b, t);\n } else if (Array.isArray(a) && Array.isArray(b) && key === \"fillGradientStops\") {\n out[key] = a.map((stopA: { color: string; offset: number }, i: number) => {\n const stopB = (b as typeof a)[i] || stopA;\n return {\n color: mixColor(stopA.color, stopB.color, t),\n offset: mixNum(stopA.offset, stopB.offset, t),\n };\n });\n } else {\n out[key] = t > 0.5 ? b : a;\n }\n }\n return out;\n}\n\nfunction matchLayersByType(a: EffectLayer[], b: EffectLayer[]): Array<[EffectLayer | null, EffectLayer | null]> {\n const pairs: Array<[EffectLayer | null, EffectLayer | null]> = [];\n const types = new Set([...a.map((l) => l.type), ...b.map((l) => l.type)]);\n for (const type of types) {\n const la = a.filter((l) => l.type === type);\n const lb = b.filter((l) => l.type === type);\n const max = Math.max(la.length, lb.length);\n for (let i = 0; i < max; i++) {\n pairs.push([la[i] ?? null, lb[i] ?? null]);\n }\n }\n return pairs;\n}\n\n/** Blend two scenes by layer params (Lab preset blend) */\nexport function blendScenes(sceneA: SceneDocument, sceneB: SceneDocument, ratio: number): SceneDocument {\n const pairs = matchLayersByType(sceneA.effectLayers, sceneB.effectLayers);\n const layers: EffectLayer[] = [];\n\n for (const [la, lb] of pairs) {\n if (!la && lb) {\n layers.push({ ...lb, id: newLayerId(), opacity: lb.opacity * ratio });\n continue;\n }\n if (la && !lb) {\n layers.push({ ...la, id: newLayerId(), opacity: la.opacity * (1 - ratio) });\n continue;\n }\n if (!la || !lb) continue;\n layers.push({\n ...la,\n id: newLayerId(),\n enabled: ratio > 0.5 ? lb.enabled : la.enabled,\n opacity: mixFloat(la.opacity, lb.opacity, ratio),\n params: blendLayerParams(la.params, lb.params, ratio),\n });\n }\n\n return {\n version: 1,\n effectName: ratio > 0.5 ? sceneB.effectName : sceneA.effectName,\n canvas: {\n width: mixNum(sceneA.canvas.width, sceneB.canvas.width, ratio),\n height: mixNum(sceneA.canvas.height, sceneB.canvas.height, ratio),\n background: sceneA.canvas.background,\n },\n text: {\n content: sceneA.text.content,\n fontFamily: ratio > 0.5 ? sceneB.text.fontFamily : sceneA.text.fontFamily,\n fontWeight: ratio > 0.5 ? sceneB.text.fontWeight : sceneA.text.fontWeight,\n fontStyle: ratio > 0.5 ? sceneB.text.fontStyle : sceneA.text.fontStyle,\n fontSize: mixNum(sceneA.text.fontSize, sceneB.text.fontSize, ratio),\n letterSpacing: mixNum(sceneA.text.letterSpacing, sceneB.text.letterSpacing, ratio),\n lineHeight: mixFloat(sceneA.text.lineHeight, sceneB.text.lineHeight, ratio),\n textPosX: ratio > 0.5 ? sceneB.text.textPosX : sceneA.text.textPosX,\n textPosY: ratio > 0.5 ? sceneB.text.textPosY : sceneA.text.textPosY,\n },\n effectLayers: layers,\n customEngineId: ratio > 0.5 ? sceneB.customEngineId : sceneA.customEngineId,\n engineParams: sceneA.engineParams && sceneB.engineParams ? blendLayerParams(sceneA.engineParams as Record<string, unknown>, sceneB.engineParams as Record<string, unknown>, ratio) : ratio > 0.5 ? sceneB.engineParams : sceneA.engineParams,\n compositor: {\n blur: mixFloat(sceneA.compositor.blur, sceneB.compositor.blur, ratio),\n bloom: mixFloat(sceneA.compositor.bloom, sceneB.compositor.bloom, ratio),\n bloomThreshold: mixFloat(sceneA.compositor.bloomThreshold ?? 0.6, sceneB.compositor.bloomThreshold ?? 0.6, ratio),\n },\n timeline: ratio > 0.5 ? sceneB.timeline : sceneA.timeline,\n };\n}\n\nexport function blendConfigs(cfgA: TextEffectConfig, cfgB: TextEffectConfig, ratio: number): TextEffectConfig {\n return sceneToConfig(blendScenes(textEffectConfigToScene(cfgA), textEffectConfigToScene(cfgB), ratio));\n}\n","import type { TextEffectConfig } from \"../types\";\nimport type { SceneDocument } from \"./schema\";\nimport { textEffectConfigToScene, sceneToConfig } from \"./migrate\";\n\nexport function parseHistorySnapshot(raw: string): {\n scene: SceneDocument;\n config: TextEffectConfig;\n} {\n const parsed = JSON.parse(raw) as SceneDocument | TextEffectConfig;\n if (typeof parsed === \"object\" && parsed !== null && \"version\" in parsed && (parsed as SceneDocument).version === 1 && Array.isArray((parsed as SceneDocument).effectLayers)) {\n const scene = parsed as SceneDocument;\n return { scene, config: sceneToConfig(scene) };\n }\n const config = parsed as TextEffectConfig;\n return { scene: textEffectConfigToScene(config), config };\n}\n\nexport function snapshotScene(scene: SceneDocument): string {\n return JSON.stringify(scene);\n}\n","import type { AnimTrack, Keyframe, SceneDocument } from \"./schema\";\nimport { readLayerScalar } from \"./animatableParams\";\n\nexport function trackId(track: AnimTrack): string {\n return `${track.layerId}::${track.paramPath}`;\n}\n\nexport function findTrackIndex(doc: SceneDocument, layerId: string, paramPath: string): number {\n return doc.timeline.tracks.findIndex(\n (t) => t.layerId === layerId && t.paramPath === paramPath\n );\n}\n\nexport function getLayerById(doc: SceneDocument, layerId: string) {\n return doc.effectLayers.find((l) => l.id === layerId);\n}\n\nexport function updateTimeline(\n doc: SceneDocument,\n patch: Partial<SceneDocument[\"timeline\"]>\n): SceneDocument {\n return { ...doc, timeline: { ...doc.timeline, ...patch } };\n}\n\nexport function setTracks(doc: SceneDocument, tracks: AnimTrack[]): SceneDocument {\n return updateTimeline(doc, { tracks });\n}\n\nexport function pruneTracksForLayer(doc: SceneDocument, layerId: string): SceneDocument {\n return setTracks(\n doc,\n doc.timeline.tracks.filter((t) => t.layerId !== layerId)\n );\n}\n\nexport function addTrack(\n doc: SceneDocument,\n layerId: string,\n paramPath: string,\n initialKeyframes?: Keyframe[]\n): SceneDocument {\n if (findTrackIndex(doc, layerId, paramPath) >= 0) return doc;\n const layer = getLayerById(doc, layerId);\n const base = layer ? readLayerScalar(layer, paramPath) : 0;\n const track: AnimTrack = {\n layerId,\n paramPath,\n keyframes: initialKeyframes ?? [{ time: 0, value: base, easing: \"easeInOut\" }],\n };\n return setTracks(doc, [...doc.timeline.tracks, track]);\n}\n\nexport function removeTrack(doc: SceneDocument, trackIndex: number): SceneDocument {\n const tracks = doc.timeline.tracks.filter((_, i) => i !== trackIndex);\n return setTracks(doc, tracks);\n}\n\nexport function updateTrack(\n doc: SceneDocument,\n trackIndex: number,\n updater: (track: AnimTrack) => AnimTrack\n): SceneDocument {\n const tracks = doc.timeline.tracks.map((t, i) => (i === trackIndex ? updater(t) : t));\n return setTracks(doc, tracks);\n}\n\nexport function sortKeyframes(keyframes: Keyframe[]): Keyframe[] {\n return [...keyframes].sort((a, b) => a.time - b.time);\n}\n\nconst KEYFRAME_MERGE_EPS = 0.04;\n\nexport function upsertKeyframe(\n track: AnimTrack,\n time: number,\n value?: number,\n easing?: Keyframe[\"easing\"]\n): AnimTrack {\n const clampedTime = Math.max(0, time);\n const existingIdx = track.keyframes.findIndex(\n (k) => Math.abs(k.time - clampedTime) < KEYFRAME_MERGE_EPS\n );\n if (existingIdx >= 0) {\n const next = [...track.keyframes];\n next[existingIdx] = {\n ...next[existingIdx],\n time: clampedTime,\n value: value ?? next[existingIdx].value,\n easing: easing ?? next[existingIdx].easing,\n };\n return { ...track, keyframes: sortKeyframes(next) };\n }\n const resolvedValue = value ?? (track.keyframes[0]?.value ?? 0);\n return {\n ...track,\n keyframes: sortKeyframes([\n ...track.keyframes,\n { time: clampedTime, value: resolvedValue, easing: easing ?? \"easeInOut\" },\n ]),\n };\n}\n\nexport function addKeyframeAtTime(\n doc: SceneDocument,\n trackIndex: number,\n time: number,\n value?: number\n): SceneDocument {\n return updateTrack(doc, trackIndex, (track) => {\n const layer = getLayerById(doc, track.layerId);\n const resolved =\n value ?? (layer ? readLayerScalar(layer, track.paramPath) : track.keyframes[0]?.value ?? 0);\n return upsertKeyframe(track, time, resolved);\n });\n}\n\nexport function moveKeyframe(\n doc: SceneDocument,\n trackIndex: number,\n keyframeIndex: number,\n time: number,\n duration: number\n): SceneDocument {\n const clamped = Math.max(0, Math.min(duration, time));\n return updateTrack(doc, trackIndex, (track) => {\n const kfs = [...track.keyframes];\n if (keyframeIndex < 0 || keyframeIndex >= kfs.length) return track;\n kfs[keyframeIndex] = { ...kfs[keyframeIndex], time: clamped };\n return { ...track, keyframes: sortKeyframes(kfs) };\n });\n}\n\nexport function updateKeyframe(\n doc: SceneDocument,\n trackIndex: number,\n keyframeIndex: number,\n patch: Partial<Keyframe>\n): SceneDocument {\n return updateTrack(doc, trackIndex, (track) => {\n const kfs = track.keyframes.map((k, i) => (i === keyframeIndex ? { ...k, ...patch } : k));\n return { ...track, keyframes: sortKeyframes(kfs) };\n });\n}\n\nexport function removeKeyframe(\n doc: SceneDocument,\n trackIndex: number,\n keyframeIndex: number\n): SceneDocument {\n return updateTrack(doc, trackIndex, (track) => ({\n ...track,\n keyframes: track.keyframes.filter((_, i) => i !== keyframeIndex),\n }));\n}\n\nexport function duplicateTrackAtPlayhead(\n doc: SceneDocument,\n trackIndex: number,\n previewTime: number\n): SceneDocument {\n const track = doc.timeline.tracks[trackIndex];\n if (!track) return doc;\n const layer = getLayerById(doc, track.layerId);\n const value = layer ? readLayerScalar(layer, track.paramPath) : 0;\n return addKeyframeAtTime(doc, trackIndex, previewTime, value);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AC8BO,IAAM,sBAA2C;AAAA,EACtD,EAAE,IAAI,UAAU,OAAO,UAAU,OAAO,KAAK,QAAQ,KAAK,aAAa,0BAA0B;AAAA,EACjG,EAAE,IAAI,WAAW,OAAO,QAAQ,OAAO,MAAM,QAAQ,KAAK,aAAa,eAAe;AAAA,EACtF,EAAE,IAAI,UAAU,OAAO,OAAO,OAAO,MAAM,QAAQ,MAAM,aAAa,gBAAgB;AAAA,EACtF,EAAE,IAAI,SAAS,OAAO,QAAQ,OAAO,MAAM,QAAQ,MAAM,aAAa,iBAAiB;AAAA,EACvF,EAAE,IAAI,QAAQ,OAAO,OAAO,OAAO,MAAM,QAAQ,KAAK,aAAa,YAAY;AAAA,EAC/E,EAAE,IAAI,UAAU,OAAO,OAAO,OAAO,KAAK,QAAQ,MAAM,aAAa,SAAS;AAChF;AAEA,SAAS,YACP,KACA,MACA,eACQ;AACR,QAAM,OAAQ,IAA8D;AAC5E,MAAI,kBAAkB,GAAG;AACvB,IAAC,IAA8D,gBAAgB,GAAG,aAAa;AAAA,EACjG;AACA,QAAM,IAAI,IAAI,YAAY,QAAQ,GAAG,EAAE;AACvC,EAAC,IAA8D,gBAAgB,QAAQ;AACvF,SAAO;AACT;AAEA,SAAS,YAAY,KAAgF;AACnG,QAAM,IAAI,IAAI,eAAe;AAC7B,QAAM,IAAI,IAAI,gBAAgB;AAC9B,QAAM,UAAU,IAAI,gBAAgB,IAAI,iBAAiB,MAAM,KAAK,KAAK,IAAI,IAAI,IAAI,IAAI;AACzF,QAAM,UAAU,IAAI,gBAAgB,IAAI,iBAAiB,MAAM,KAAK,KAAK,IAAI,IAAI,IAAI,GAAG;AACxF,SAAO;AAAA,IACL,GAAG;AAAA,IACH,GAAG;AAAA,IACH,OAAO,KAAK,IAAI,IAAI,IAAI,UAAU,CAAC;AAAA,IACnC,QAAQ,KAAK,IAAI,IAAI,IAAI,UAAU,CAAC;AAAA,EACtC;AACF;AAGO,SAAS,gBACd,KACA,MACA,UACA,eACU;AACV,QAAM,aAAa,KAAK,MAAM,IAAI;AAClC,QAAM,QAAkB,CAAC;AAEzB,aAAW,QAAQ,YAAY;AAC7B,QAAI,CAAC,KAAK,KAAK,GAAG;AAChB,YAAM,KAAK,EAAE;AACb;AAAA,IACF;AACA,UAAM,QAAQ,KAAK,MAAM,KAAK,EAAE,OAAO,OAAO;AAC9C,QAAI,UAAU;AACd,eAAW,QAAQ,OAAO;AACxB,YAAM,YAAY,UAAU,GAAG,OAAO,IAAI,IAAI,KAAK;AACnD,UAAI,YAAY,KAAK,WAAW,aAAa,KAAK,UAAU;AAC1D,kBAAU;AAAA,MACZ,OAAO;AACL,YAAI,QAAS,OAAM,KAAK,OAAO;AAC/B,YAAI,YAAY,KAAK,MAAM,aAAa,IAAI,UAAU;AACpD,cAAI,QAAQ;AACZ,qBAAW,MAAM,MAAM;AACrB,kBAAM,WAAW,QAAQ;AACzB,gBAAI,YAAY,KAAK,UAAU,aAAa,KAAK,SAAU,SAAQ;AAAA,iBAC9D;AACH,kBAAI,MAAO,OAAM,KAAK,KAAK;AAC3B,sBAAQ;AAAA,YACV;AAAA,UACF;AACA,oBAAU;AAAA,QACZ,OAAO;AACL,oBAAU;AAAA,QACZ;AAAA,MACF;AAAA,IACF;AACA,QAAI,QAAS,OAAM,KAAK,OAAO;AAAA,EACjC;AAEA,SAAO,MAAM,SAAS,IAAI,QAAQ,CAAC,EAAE;AACvC;AAEA,SAAS,mBACP,KACA,KACA,UACA,OACkB;AAClB,QAAM,SAAS,IAAI,eAAe;AAClC,QAAM,UAAU,IAAI,gBAAgB;AACpC,QAAM,OAAO,YAAY,GAAG;AAC5B,QAAM,aAAa,IAAI,cAAc;AACrC,QAAM,gBAAgB,IAAI,iBAAiB;AAE3C,QAAM,UAAU,GAAG,IAAI,SAAS,IAAI,IAAI,UAAU,IAAI,QAAQ,OAAO,IAAI,UAAU;AACnF,MAAI,OAAO;AAEX,QAAM,aAAa,MAAM,IAAI,CAAC,SAAS,YAAY,KAAK,MAAM,aAAa,CAAC;AAC5E,QAAM,eAAe,KAAK,IAAI,GAAG,YAAY,CAAC;AAC9C,QAAM,kBAAkB,YAAY,MAAM,SAAS,KAAK,WAAW;AAEnE,MAAI,QAAyB;AAC7B,MAAI,SAAS,SAAS;AAEtB,MAAI,IAAI,aAAa,QAAQ;AAC3B,YAAQ;AACR,aAAS,KAAK;AAAA,EAChB,WAAW,IAAI,aAAa,SAAS;AACnC,YAAQ;AACR,aAAS,KAAK,IAAI,KAAK;AAAA,EACzB,OAAO;AACL,aAAS,KAAK,IAAI,KAAK,QAAQ;AAAA,EACjC;AAEA,MAAI,SAAS,KAAK,KAAK,KAAK,SAAS,mBAAmB,IAAI,WAAW;AACvE,MAAI,IAAI,aAAa,OAAO;AAC1B,aAAS,KAAK,IAAI,WAAW;AAAA,EAC/B,WAAW,IAAI,aAAa,UAAU;AACpC,aAAS,KAAK,IAAI,KAAK,SAAS,kBAAkB,WAAW;AAAA,EAC/D;AAEA,MAAI,OAAO;AACX,MAAI,UAAU,SAAU,QAAO,SAAS,eAAe;AAAA,WAC9C,UAAU,QAAS,QAAO,SAAS;AAE5C,QAAM,OAAO,SAAS,WAAW;AACjC,QAAM,OAAO,UAAU,MAAM,SAAS,KAAK,WAAW,aAAa,WAAW;AAE9E,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,QAAQ;AAAA,MACN;AAAA,MACA;AAAA,MACA,MAAM,OAAO;AAAA,MACb;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,UAAU;AAAA,EACZ;AACF;AAEO,SAAS,gBACd,KACA,KACA,UACA,OACS;AACT,QAAM,OAAO,YAAY,GAAG;AAC5B,QAAM,aAAa,IAAI,cAAc;AACrC,QAAM,SAAS,mBAAmB,KAAK,KAAK,UAAU,KAAK;AAC3D,SACE,OAAO,OAAO,gBAAgB,KAAK,QAAQ,KAC3C,OAAO,OAAO,mBAAmB,KAAK,SAAS;AAEnD;AAEO,SAAS,uBACd,KACA,KACA,cACQ;AACR,QAAM,MAAM,KAAK,IAAI,IAAI,YAAY,IAAI,GAAG;AAC5C,MAAI,KAAK;AACT,MAAI,KAAK;AACT,MAAI,OAAO;AAEX,SAAO,MAAM,IAAI;AACf,UAAM,MAAM,KAAK,OAAO,KAAK,MAAM,CAAC;AACpC,QAAI,gBAAgB,KAAK,KAAK,KAAK,YAAY,GAAG;AAChD,aAAO;AACP,WAAK,MAAM;AAAA,IACb,OAAO;AACL,WAAK,MAAM;AAAA,IACb;AAAA,EACF;AACA,SAAO;AACT;AAKO,SAAS,kBACd,KACA,KACA,SACkB;AAClB,QAAM,OAAO,YAAY,GAAG;AAC5B,QAAM,OAAO,SAAS,QAAQ;AAC9B,QAAM,UAAU,SAAS,WAAW,CAAC,CAAE,IAAqD;AAE5F,MAAI,QAAQ,IAAI,KAAK,MAAM,IAAI;AAC/B,MAAI,MAAM;AACR,YAAQ,gBAAgB,KAAK,IAAI,MAAM,KAAK,OAAO,IAAI,iBAAiB,CAAC;AAAA,EAC3E;AAEA,MAAI,WAAW,IAAI;AACnB,MAAI,SAAS;AACX,eAAW,uBAAuB,KAAK,KAAK,KAAK;AAAA,EACnD;AAEA,SAAO,mBAAmB,KAAK,KAAK,UAAU,KAAK;AACrD;AAGO,SAAS,eACd,eACA,gBACA,kBACA,mBACA,UAAU,IACF;AACR,MAAI,iBAAiB,KAAK,kBAAkB,EAAG,QAAO;AACtD,QAAM,SAAS,gBAAgB;AAC/B,QAAM,SAAS,iBAAiB;AAChC,QAAM,QAAQ,KAAK,IAAI,SAAS,kBAAkB,SAAS,iBAAiB;AAC5E,SAAO,KAAK,IAAI,IAAI,KAAK,IAAI,KAAK,KAAK,MAAM,QAAQ,GAAG,CAAC,CAAC;AAC5D;;;ACxPO,SAAS,gBAAgB,MAAsB;AACpD,MAAI,IAAI;AACR,WAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACpC,QAAI,KAAK,CAAC,MAAM,KAAM;AAAA,EACxB;AACA,SAAO;AACT;AAEO,SAAS,qBACd,MACA,QACA,UACU;AACV,QAAM,IAAI,gBAAgB,IAAI;AAC9B,QAAM,OAAO,SAAS,CAAC,GAAG,MAAM,IAAI,CAAC;AACrC,SAAO,KAAK,SAAS,EAAG,MAAK,KAAK,QAAQ;AAC1C,SAAO,KAAK,MAAM,GAAG,CAAC;AACxB;AAEO,SAAS,iBACd,QACA,YACA,OACU;AACV,QAAM,OAAO,CAAC,GAAG,MAAM;AACvB,MAAI,cAAc,KAAK,aAAa,KAAK,OAAQ,MAAK,UAAU,IAAI;AACpE,SAAO;AACT;AAEO,SAAS,oBAAoB,QAAkB,OAAyB;AAC7E,SAAO,OAAO,IAAI,MAAM,KAAK;AAC/B;AAGO,SAAS,sBAAsB,MAAwB;AAC5D,QAAM,IAAI,gBAAgB,IAAI;AAC9B,SAAO,MAAM,KAAK,EAAE,QAAQ,EAAE,GAAG,CAAC,GAAG,MAAM;AACzC,UAAM,MAAO,IAAI,KAAK,IAAI,GAAG,IAAI,CAAC,IAAK;AACvC,WAAO,OAAO,GAAG;AAAA,EACnB,CAAC;AACH;AAgBA,SAAS,iBACP,KACA,MACA,eACQ;AACR,MAAI,CAAC,KAAM,QAAO;AAClB,MAAI,IAAI;AACR,WAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACpC,SAAK,IAAI,YAAY,KAAK,CAAC,CAAC,EAAE;AAC9B,QAAI,IAAI,KAAK,SAAS,EAAG,MAAK;AAAA,EAChC;AACA,SAAO;AACT;AAMO,SAAS,gBACd,KACA,MACM;AACN,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,UAAU;AAAA,IACV,UAAU;AAAA,EACZ,IAAI;AAEJ,MAAI,KAAK;AACT,QAAM,cAAe,IAA8D;AACnF,EAAC,IAA8D,gBAAgB;AAC/E,MAAI,eAAe;AAEnB,MAAI,aAAa;AAEjB,QAAM,QAAQ,CAAC,MAAM,cAAc;AACjC,UAAM,KAAK,SAAS,YAAY;AAChC,UAAM,YAAY,iBAAiB,KAAK,MAAM,aAAa;AAC3D,QAAI,IAAI;AACR,QAAI,UAAU,SAAU,KAAI,SAAS,YAAY;AAAA,aACxC,UAAU,QAAS,KAAI,SAAS;AAEzC,aAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACpC,YAAM,KAAK,KAAK,CAAC;AACjB,YAAM,QAAQ,eAAe,UAAU,KAAK;AAC5C,UAAI,SAAS,OAAQ,KAAI,YAAY;AAAA,UAChC,KAAI,cAAc;AAEvB,YAAM,QAAQ,IAAI;AAClB,YAAM,QAAQ,KAAK;AACnB,UAAI,SAAS,OAAQ,KAAI,SAAS,IAAI,OAAO,KAAK;AAAA,UAC7C,KAAI,WAAW,IAAI,OAAO,KAAK;AAEpC,WAAK,IAAI,YAAY,EAAE,EAAE,QAAQ;AACjC;AAAA,IACF;AAAA,EACF,CAAC;AAED,EAAC,IAA8D,gBAAgB,eAAe;AAC9F,MAAI,QAAQ;AACd;AAEO,SAAS,qBAAqB,KAAgC;AACnE,SACE,CAAC,CAAC,IAAI,sBACN,IAAI,aAAa,WACjB,CAAC,IAAI,mBACJ,IAAI,gBAAgB,UAAU,KAAK;AAExC;;;ACnIO,SAAS,aAAa,GAAW,GAAgD;AACtF,MAAI,OAAO,aAAa,aAAa;AACnC,UAAM,SAAS,SAAS,cAAc,QAAQ;AAC9C,WAAO,QAAQ;AACf,WAAO,SAAS;AAChB,WAAO;AAAA,EACT;AACA,MAAI,OAAO,oBAAoB,aAAa;AAC1C,WAAO,IAAI,gBAAgB,GAAG,CAAC;AAAA,EACjC;AACA,QAAM,uBAAwB,WAAgF;AAC9G,MAAI,sBAAsB;AACxB,WAAO,qBAAqB,GAAG,CAAC;AAAA,EAClC;AACA,MAAI;AAEF,UAAM,eAAe,GAAG,MAAM,SAAS;AACvC,UAAM,aAAa,YAAY,iBAAiB;AAGhD,WAAO,WAAW,aAAa,GAAG,CAAC;AAAA,EACrC,QAAQ;AACN,UAAM,IAAI,MAAM,qDAAqD;AAAA,EACvE;AACF;AAEO,SAAS,mBAAmB,QAAqE;AACtG,SAAO,OAAO,WAAW,IAAI;AAC/B;AAEO,SAAS,aAAa,MAA4B;AACvD,MAAI,IAAI;AACR,SAAO,WAAY;AACjB,QAAK,IAAI,QAAS;AAClB,YAAQ,IAAI,KAAK;AAAA,EACnB;AACF;AAEO,SAAS,SAAS,MAAsB;AAC7C,SAAQ,KAAK,MAAM,EAAE,EAAE,OAAO,CAAC,KAAK,MAAM,MAAM,EAAE,WAAW,CAAC,GAAG,CAAC,IAAI,OAAQ;AAChF;AAEO,SAAS,SAAS,KAAkD;AACzE,QAAM,iBAAiB;AACvB,QAAM,UAAU,IAAI,QAAQ,gBAAgB,CAAC,GAAG,GAAG,GAAG,MAAM,IAAI,IAAI,IAAI,IAAI,IAAI,CAAC;AACjF,QAAM,SAAS,4CAA4C,KAAK,OAAO;AACvE,SAAO,SACH;AAAA,IACE,GAAG,SAAS,OAAO,CAAC,GAAG,EAAE;AAAA,IACzB,GAAG,SAAS,OAAO,CAAC,GAAG,EAAE;AAAA,IACzB,GAAG,SAAS,OAAO,CAAC,GAAG,EAAE;AAAA,EAC3B,IACA,EAAE,GAAG,KAAK,GAAG,KAAK,GAAG,IAAI;AAC/B;;;ACvDO,IAAM,iBAAN,MAAqB;AAAA,EAClB;AAAA,EACA,eAAiG,CAAC;AAAA,EAClG,YAA8D,CAAC;AAAA,EAC/D,QASH,CAAC;AAAA,EAEN,YAAY,QAAmC;AAC7C,UAAM,WAAuC;AAAA,MAC3C,MAAM;AAAA,MACN,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,WAAW;AAAA,MACX,UAAU;AAAA,MACV,eAAe;AAAA,MACf,YAAY;AAAA,MACZ,UAAU;AAAA,MACV,aAAa;AAAA,MACb,oBAAoB;AAAA,MACpB,gBAAgB,CAAC;AAAA,MACjB,UAAU;AAAA,MACV,WAAW;AAAA,MACX,mBAAmB;AAAA,MACnB,mBAAmB,CAAC;AAAA,MACpB,aAAa;AAAA,MACb,eAAe;AAAA,MACf,aAAa;AAAA,MACb,aAAa;AAAA,MACb,gBAAgB;AAAA,MAChB,eAAe;AAAA,MACf,gBAAgB;AAAA,MAChB,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,sBAAsB;AAAA,MACtB,sBAAsB;AAAA,MACtB,iBAAiB;AAAA,MACjB,YAAY,CAAC;AAAA,MACb,eAAe;AAAA,MACf,aAAa;AAAA,MACb,YAAY;AAAA,MACZ,eAAe;AAAA,MACf,eAAe;AAAA,MACf,eAAe;AAAA,MACf,YAAY;AAAA,MACZ,cAAc;AAAA,MACd,YAAY;AAAA,MACZ,gBAAgB;AAAA,MAChB,aAAa;AAAA,MACb,gBAAgB;AAAA,MAChB,gBAAgB;AAAA,MAChB,gBAAgB;AAAA,MAChB,gBAAgB;AAAA,MAChB,WAAW;AAAA,MACX,gBAAgB;AAAA,MAChB,yBAAyB;AAAA,MACzB,sBAAsB;AAAA,MACtB,sBAAsB;AAAA,MACtB,kBAAkB;AAAA,MAClB,cAAc;AAAA,MACd,YAAY;AAAA,MACZ,cAAc;AAAA,MACd,cAAc;AAAA,MACd,mBAAmB;AAAA,MACnB,aAAa;AAAA,MACb,aAAa;AAAA,MACb,aAAa;AAAA,MACb,aAAa;AAAA,MACb,cAAc;AAAA,MACd,YAAY;AAAA,MACZ,cAAc;AAAA,MACd,aAAa;AAAA,MACb,eAAe;AAAA,MACf,eAAe;AAAA,MACf,oBAAoB;AAAA,MACpB,kBAAkB;AAAA,MAClB,kBAAkB;AAAA,MAClB,aAAa;AAAA,MACb,cAAc;AAAA,MACd,UAAU;AAAA,MACV,UAAU;AAAA,MACV,UAAU;AAAA,MACV,gBAAgB;AAAA,MAChB,iBAAiB;AAAA,MACjB,UAAU;AAAA,MACV,eAAe;AAAA,MACf,cAAc;AAAA,MACd,OAAO;AAAA,MACP,gBAAgB;AAAA,IAClB;AAEA,SAAK,MAAM;AAAA,MACT,GAAG;AAAA,MACH,GAAG;AAAA,IACL;AAEA,SAAK,eAAe;AAAA,EACtB;AAAA,EAEQ,iBAAiB;AACvB,UAAM,EAAE,MAAM,YAAY,YAAY,WAAW,UAAU,eAAe,YAAY,aAAa,cAAc,UAAU,UAAU,gBAAgB,iBAAiB,UAAU,eAAe,cAAc,MAAM,IAAI,KAAK;AAE5N,UAAM,QAAQ;AACd,UAAM,SAAS;AAEf,UAAM,OAAO,aAAa,SAAS,IAAI,CAAC;AAExC,QAAI,SAAS,aAAa,OAAO,MAAM;AAEvC,WAAO,QAAQ;AACf,WAAO,SAAS;AAChB,UAAM,MAAM,mBAAmB,MAAM;AACrC,QAAI,CAAC,IAAK;AAEV,UAAM,QAAQ,KAAK,MAAM,IAAI;AAC7B,UAAM,WAAW,MAAM;AACvB,UAAM,kBAAkB,YAAY,WAAW,KAAK,WAAW;AAE/D,QAAI,SAAS,QAAQ;AACrB,QAAI,QAAyB;AAC7B,QAAI,aAAa,QAAQ;AACvB,eAAS;AACT,cAAQ;AAAA,IACV,WAAW,aAAa,SAAS;AAC/B,eAAS,QAAQ;AACjB,cAAQ;AAAA,IACV;AACA,QAAI,YAAY;AAChB,QAAI,eAAe;AAEnB,UAAM,UAAU,GAAG,SAAS,IAAI,UAAU,IAAI,QAAQ,OAAO,UAAU;AACvE,QAAI,OAAO;AAEX,QAAI,kBAAkB,GAAG;AACvB,MAAC,IAAY,gBAAgB,GAAG,aAAa;AAAA,IAC/C;AAEA,QAAI,UAAU,SAAS,mBAAmB,IAAI,WAAW;AACzD,QAAI,aAAa,OAAO;AACtB,eAAS,KAAK,WAAW;AAAA,IAC3B,WAAW,aAAa,UAAU;AAChC,eAAS,SAAS,KAAK,kBAAkB,WAAW;AAAA,IACtD;AAEA,QAAI,KAAK;AACT,QAAI,UAAU,GAAG;AACf,UAAI,UAAU,GAAG,GAAG,OAAO,GAAG,GAAG,CAAC;AAAA,IACpC;AAEA,QAAI,YAAY;AAChB,UAAM,QAAQ,CAAC,MAAM,UAAU;AAC7B,YAAM,KAAK,SAAS,QAAQ,WAAW;AACvC,UAAI,SAAS,MAAM,QAAQ,EAAE;AAAA,IAC/B,CAAC;AACD,QAAI,QAAQ;AAEZ,UAAM,UAAU,IAAI,aAAa,GAAG,GAAG,OAAO,MAAM;AACpD,UAAM,SAAS,QAAQ;AAEvB,QAAI,OAAO;AACX,QAAI,OAAO;AACX,aAAS,IAAI,GAAG,IAAI,QAAQ,KAAK;AAC/B,eAAS,IAAI,GAAG,IAAI,OAAO,KAAK;AAC9B,cAAM,OAAO,IAAI,QAAQ,KAAK;AAC9B,YAAI,OAAO,MAAM,CAAC,IAAI,KAAK;AACzB,cAAI,IAAI,KAAM,QAAO;AACrB,cAAI,IAAI,KAAM,QAAO;AAAA,QACvB;AAAA,MACF;AAAA,IACF;AAEA,QAAI,QAAQ,KAAM;AAGlB,UAAM,OAAO,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,IAAI,cAAc,CAAC;AACxD,aAAS,IAAI,MAAM,KAAK,MAAM,KAAK,MAAM;AACvC,YAAM,WAAoD,CAAC;AAC3D,UAAI,YAAY;AAChB,UAAI,SAAS;AACb,YAAM,UAAU,KAAK,MAAM,CAAC;AAE5B,eAAS,IAAI,GAAG,IAAI,OAAO,KAAK;AAC9B,cAAM,OAAO,UAAU,QAAQ,KAAK;AACpC,cAAM,WAAW,OAAO,MAAM,CAAC,IAAI;AACnC,YAAI,YAAY,CAAC,WAAW;AAC1B,sBAAY;AACZ,mBAAS;AAAA,QACX,WAAW,CAAC,YAAY,WAAW;AACjC,sBAAY;AACZ,mBAAS,KAAK,EAAE,QAAQ,MAAM,IAAI,EAAE,CAAC;AAAA,QACvC;AAAA,MACF;AACA,UAAI,WAAW;AACb,iBAAS,KAAK,EAAE,QAAQ,MAAM,QAAQ,EAAE,CAAC;AAAA,MAC3C;AAEA,iBAAW,OAAO,UAAU;AAC1B,YAAI,KAAK,IAAI,gBAAiB;AAE9B,cAAM,OAAO,IAAI,OAAO,IAAI;AAC5B,cAAM,aAAa,IAAI,SAAS,KAAK,IAAI,KAAK,IAAI,IAAI,OAAO,GAAG;AAChE,cAAM,WAAW,IAAI,OAAO,KAAK,IAAI,KAAK,IAAI,IAAI,OAAO,GAAG;AAE5D,YAAI,cAAc,SAAU;AAE5B,cAAM,UAAU,MAAM,KAAK,IAAI;AAC/B,cAAM,KAAK,MAAM,KAAK,IAAI;AAE1B,cAAM,SAAS,KAAK,IAAI;AACxB,YAAI,QAAQ;AACV,gBAAM,SAAS,MAAM,KAAK,IAAI;AAC9B,gBAAM,SAAS,IAAI,KAAK,IAAI;AAC5B,gBAAM,OAAO,cAAc,WAAW,cAAc;AAEpD,gBAAM,UAAU;AAChB,gBAAM,QAAQ,KAAK,IAAI,YAAY,OAAO,SAAS,CAAC;AACpD,gBAAM,UAAU,KAAK,IAAI,UAAU,OAAO,SAAS,CAAC;AACpD,gBAAM,QAAQ;AAEd,cAAI,QAAQ,SAAS;AACnB,iBAAK,aAAa,KAAK,EAAE,GAAG,SAAS,IAAI,SAAS,IAAI,OAAO,SAAS,WAAW,GAAG,CAAC;AAAA,UACvF;AACA,cAAI,QAAQ,SAAS;AACnB,iBAAK,aAAa,KAAK,EAAE,GAAG,SAAS,IAAI,SAAS,IAAI,OAAO,SAAS,WAAW,GAAG,CAAC;AAAA,UACvF;AAAA,QACF,OAAO;AACL,eAAK,aAAa,KAAK,EAAE,GAAG,SAAS,IAAI,YAAY,IAAI,UAAU,SAAS,WAAW,GAAG,CAAC;AAAA,QAC7F;AAAA,MACF;AAAA,IACF;AAGA,aAAS,IAAI,MAAM,KAAK,MAAM,KAAK;AACjC,eAAS,IAAI,GAAG,IAAI,OAAO,KAAK;AAC9B,cAAM,OAAO,IAAI,QAAQ,KAAK;AAC9B,YAAI,OAAO,MAAM,CAAC,IAAI,KAAK;AACzB,cAAI,KAAK,IAAI,cAAc;AACzB,iBAAK,UAAU,KAAK;AAAA,cAClB;AAAA,cACA;AAAA,cACA,SAAS,MAAM,KAAK,IAAI;AAAA,YAC1B,CAAC;AAAA,UACH;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAGA,UAAM,kBAAkB,IAAI,MAAM,KAAK,EAAE,KAAK,EAAE;AAChD,aAAS,IAAI,GAAG,IAAI,OAAO,KAAK;AAC9B,eAAS,IAAI,SAAS,GAAG,KAAK,GAAG,KAAK;AACpC,cAAM,OAAO,IAAI,QAAQ,KAAK;AAC9B,YAAI,OAAO,MAAM,CAAC,IAAI,KAAK;AACzB,0BAAgB,CAAC,IAAI;AACrB;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAGA,aAAS,IAAI,GAAG,IAAI,OAAO,KAAK;AAC9B,YAAM,KAAK,gBAAgB,CAAC;AAC5B,UAAI,OAAO,GAAI;AAEf,UAAI,KAAK,IAAI,UAAU;AACrB,cAAM,SAAS,IAAI,KAAK,KAAK,gBAAgB;AAC7C,cAAM,aAAa,IAAI,KAAK,IAAI;AAChC,cAAM,WAAW,KAAK,IAAI,MAAM,aAAa;AAC7C,cAAM,eAAe,MAAM,KAAK,IAAI;AACpC,cAAM,UAAU,KAAK,IAAI;AACzB,cAAM,aAAa,MAAM,KAAK,IAAI;AAElC,aAAK,MAAM,KAAK;AAAA,UACd;AAAA,UACA,QAAQ;AAAA,UACR;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAAA,EAEA,aAAa,OAAe;AAAA,EAE5B;AAAA,EAEA,UAAU,KAAmE;AAC3E,UAAM,EAAE,MAAM,YAAY,YAAY,WAAW,UAAU,eAAe,YAAY,aAAa,cAAc,UAAU,UAAU,OAAO,SAAS,IAAI,KAAK;AAE9J,UAAM,QAAQ;AACd,UAAM,SAAS;AAEf,QAAI,UAAU,GAAG,GAAG,OAAO,MAAM;AACjC,QAAI,wBAAwB;AAE5B,UAAM,QAAQ,KAAK,MAAM,IAAI;AAC7B,UAAM,WAAW,MAAM;AACvB,UAAM,kBAAkB,YAAY,WAAW,KAAK,WAAW;AAE/D,QAAI,SAAS,QAAQ;AACrB,QAAI,QAAyB;AAC7B,QAAI,aAAa,QAAQ;AACvB,eAAS;AACT,cAAQ;AAAA,IACV,WAAW,aAAa,SAAS;AAC/B,eAAS,QAAQ;AACjB,cAAQ;AAAA,IACV;AACA,QAAI,YAAY;AAChB,QAAI,eAAe;AAEnB,UAAM,UAAU,GAAG,SAAS,IAAI,UAAU,IAAI,QAAQ,OAAO,UAAU;AACvE,QAAI,OAAO;AAEX,QAAI,kBAAkB,GAAG;AACvB,MAAC,IAAY,gBAAgB,GAAG,aAAa;AAAA,IAC/C;AAEA,QAAI,UAAU,SAAS,mBAAmB,IAAI,WAAW;AACzD,QAAI,aAAa,OAAO;AACtB,eAAS,KAAK,WAAW;AAAA,IAC3B,WAAW,aAAa,UAAU;AAChC,eAAS,SAAS,KAAK,kBAAkB,WAAW;AAAA,IACtD;AAEA,QAAI,KAAK;AACT,QAAI,UAAU,GAAG;AACf,UAAI,UAAU,GAAG,GAAG,OAAO,GAAG,GAAG,CAAC;AAAA,IACpC;AAGA,QAAI,YAAY;AAChB,UAAM,QAAQ,CAAC,MAAM,UAAU;AAC7B,YAAM,KAAK,SAAS,QAAQ,WAAW;AACvC,UAAI,SAAS,MAAM,QAAQ,EAAE;AAAA,IAC/B,CAAC;AACD,QAAI,QAAQ;AAEZ,QAAI,KAAK;AAGT,QAAI,2BAA2B;AAE/B,QAAI,cAAc;AAClB,SAAK,aAAa,QAAQ,CAAC,SAAS;AAClC,UAAI,cAAc,KAAK;AACvB,UAAI,YAAY,KAAK;AACrB,UAAI,UAAU;AACd,UAAI,OAAO,KAAK,IAAI,KAAK,CAAC;AAC1B,UAAI,OAAO,KAAK,IAAI,KAAK,CAAC;AAC1B,UAAI,OAAO;AAAA,IACb,CAAC;AAGD,QAAI,YAAY;AAChB,SAAK,UAAU,QAAQ,CAAC,QAAQ;AAC9B,UAAI,cAAc,IAAI;AACtB,UAAI,SAAS,IAAI,GAAG,IAAI,GAAG,GAAG,CAAC;AAAA,IACjC,CAAC;AAED,QAAI,QAAQ;AAEZ,UAAM,SAAS,SAAS,QAAQ;AAGhC,QAAI,KAAK;AACT,SAAK,MAAM,QAAQ,CAAC,SAAS;AAC3B,YAAM,OAAO,IAAI,qBAAqB,KAAK,GAAG,KAAK,QAAQ,KAAK,GAAG,KAAK,SAAS,KAAK,MAAM;AAC5F,WAAK,aAAa,GAAG,QAAQ,OAAO,CAAC,KAAK,OAAO,CAAC,KAAK,OAAO,CAAC,KAAK,KAAK,YAAY,GAAG;AACxF,WAAK,aAAa,GAAG,QAAQ,OAAO,CAAC,KAAK,OAAO,CAAC,KAAK,OAAO,CAAC,MAAM;AAErE,UAAI,cAAc;AAClB,UAAI,YAAY,KAAK;AAErB,UAAI,UAAU;AACd,UAAI,OAAO,KAAK,GAAG,KAAK,MAAM;AAC9B,UAAI,OAAO,KAAK,GAAG,KAAK,SAAS,KAAK,MAAM;AAC5C,UAAI,OAAO;AAEX,UAAI,KAAK,SAAS;AAChB,YAAI,YAAY,QAAQ,OAAO,CAAC,KAAK,OAAO,CAAC,KAAK,OAAO,CAAC,KAAK,KAAK,eAAe,GAAG;AACtF,YAAI,UAAU;AACd,YAAI,IAAI,KAAK,GAAG,KAAK,SAAS,KAAK,QAAQ,KAAK,YAAY,GAAG,KAAK,KAAK,CAAC;AAC1E,YAAI,KAAK;AAAA,MACX;AAAA,IACF,CAAC;AACD,QAAI,QAAQ;AAAA,EACd;AACF;;;AC3YA,SAASA,cAAa,GAAW,GAAgD;AAC/E,MAAI,OAAO,aAAa,aAAa;AACnC,UAAM,SAAS,SAAS,cAAc,QAAQ;AAC9C,WAAO,QAAQ;AACf,WAAO,SAAS;AAChB,WAAO;AAAA,EACT;AACA,MAAI,OAAO,oBAAoB,aAAa;AAC1C,WAAO,IAAI,gBAAgB,GAAG,CAAC;AAAA,EACjC;AACA,QAAM,uBAAwB,WAAgF;AAC9G,MAAI,sBAAsB;AACxB,WAAO,qBAAqB,GAAG,CAAC;AAAA,EAClC;AACA,MAAI;AAEF,UAAM,eAAe,GAAG,MAAM,SAAS;AACvC,UAAM,aAAa,YAAY,iBAAiB;AAGhD,WAAO,WAAW,aAAa,GAAG,CAAC;AAAA,EACrC,QAAQ;AACN,UAAM,IAAI,MAAM,qDAAqD;AAAA,EACvE;AACF;AAEA,SAASC,oBAAmB,QAAqE;AAC/F,SAAO,OAAO,WAAW,IAAI;AAC/B;AAcA,SAASC,UAAS,KAAkD;AAClE,QAAM,iBAAiB;AACvB,QAAM,UAAU,IAAI,QAAQ,gBAAgB,CAAC,GAAG,GAAG,GAAG,MAAM,IAAI,IAAI,IAAI,IAAI,IAAI,CAAC;AACjF,QAAM,SAAS,4CAA4C,KAAK,OAAO;AACvE,SAAO,SACH;AAAA,IACE,GAAG,SAAS,OAAO,CAAC,GAAG,EAAE;AAAA,IACzB,GAAG,SAAS,OAAO,CAAC,GAAG,EAAE;AAAA,IACzB,GAAG,SAAS,OAAO,CAAC,GAAG,EAAE;AAAA,EAC3B,IACA,EAAE,GAAG,KAAK,GAAG,KAAK,GAAG,IAAI;AAC/B;AAeO,SAAS,qBAAqB,KAAmE,KAA6B;AACnI,MAAI,IAAI,mBAAmB,kBAAkB;AAC3C,UAAM,SAAS,IAAI,eAAe,GAAG;AACrC,WAAO,UAAU,GAAG;AACpB;AAAA,EACF;AAEA,QAAM,EAAE,MAAM,YAAY,YAAY,WAAW,UAAU,eAAe,YAAY,UAAU,WAAW,mBAAmB,mBAAmB,aAAa,eAAe,aAAa,aAAa,gBAAgB,eAAe,gBAAgB,YAAY,YAAY,sBAAsB,sBAAsB,iBAAiB,YAAY,eAAe,aAAa,YAAY,eAAe,eAAe,eAAe,YAAY,cAAc,YAAY,gBAAgB,aAAa,gBAAgB,gBAAgB,gBAAgB,gBAAgB,WAAW,gBAAgB,yBAAyB,sBAAsB,sBAAsB,kBAAkB,cAAc,YAAY,cAAc,cAAc,mBAAmB,aAAa,aAAa,aAAa,aAAa,cAAc,YAAY,cAAc,aAAa,eAAe,eAAe,oBAAoB,kBAAkB,kBAAkB,aAAa,cAAc,UAAU,SAAS,IAAI;AAG39B,MAAI,wBAAwB;AAE5B,MAAI,WAAW;AAEf,QAAM,SAAS,eAAe;AAC9B,QAAM,UAAU,gBAAgB;AAEhC,QAAM,SAAS,kBAAkB,KAAK,KAAK;AAAA,IACzC,MAAM,IAAI,aAAa;AAAA,IACvB,SAAS,CAAC,CAAC,IAAI;AAAA,EACjB,CAAC;AAED,QAAM,QAAQ,OAAO;AACrB,QAAM,WAAW,MAAM;AACvB,QAAM,oBAAoB,OAAO;AACjC,QAAM,cAAc,oBAAoB;AACxC,QAAM,kBAAkB,OAAO,OAAO;AACtC,MAAI,SAAS,OAAO;AACpB,MAAI,SAAS,OAAO;AACpB,QAAM,QAAQ,OAAO;AACrB,QAAM,eAAe,OAAO,OAAO;AACnC,QAAM,aAAa,OAAO;AAE1B,QAAM,UAAU,GAAG,SAAS,IAAI,UAAU,IAAI,iBAAiB,OAAO,UAAU;AAChF,MAAI,OAAO;AACX,MAAI,YAAY;AAChB,MAAI,kBAAkB,GAAG;AACvB,IAAC,IAAY,gBAAgB,GAAG,aAAa;AAAA,EAC/C;AAEA,MAAI,OAAO,OAAO,OAAO;AACzB,MAAI,OAAO,OAAO,OAAO;AACzB,MAAI,OAAO,OAAO,OAAO;AACzB,MAAI,OAAO,OAAO,OAAO;AAGzB,MAAI,cAAc;AAClB,MAAI,cAAc;AAElB,MAAI,gBAAgB,aAAa,GAAG;AAClC,QAAI,yBAAyB;AAC3B,YAAM,MAAM,SAAS,KAAM,yBAAyB,SAAY,uBAAuB,MAAM,OAAQ,SAAS;AAC9G,YAAM,MAAM,UAAU,KAAM,yBAAyB,SAAY,uBAAuB,MAAM,OAAQ,UAAU;AAChH,YAAM,KAAK,KAAK,IAAI,KAAK,qBAAqB,SAAY,mBAAmB,GAAG;AAChF,YAAM,QAAQ,MAAM,KAAK;AACzB,YAAM,eAAe,MAAM,WAAW,IAAI;AAC1C,YAAM,eAAe,MAAM,WAAW,IAAI;AAC1C,oBAAc,cAAc;AAC5B,oBAAc,cAAc;AAAA,IAC9B,OAAO;AACL,UAAI,KAAK;AACT,UAAI,KAAK;AACT,UAAI,mBAAmB,gBAAgB;AACrC,aAAK;AACL,aAAK;AAAA,MACP,WAAW,mBAAmB,UAAU;AACtC,aAAK;AAAA,MACP,WAAW,mBAAmB,SAAS;AACrC,aAAK;AAAA,MACP;AACA,oBAAc,KAAK;AACnB,oBAAc,KAAK;AAAA,IACrB;AAGA,cAAU;AACV,cAAU;AACV,YAAQ;AACR,YAAQ;AACR,YAAQ;AACR,YAAQ;AAAA,EACV;AAGA,MAAI,aAAa;AACjB,MAAI,aAAa;AACjB,MAAI,aAAa;AACjB,MAAI,aAAa;AAEjB,MAAI,gBAAgB,aAAa,GAAG;AAClC,QAAI,yBAAyB;AAC3B,YAAM,MAAM,SAAS,KAAM,yBAAyB,SAAY,uBAAuB,MAAM,OAAQ,SAAS;AAC9G,YAAM,MAAM,UAAU,KAAM,yBAAyB,SAAY,uBAAuB,MAAM,OAAQ,UAAU;AAChH,YAAM,KAAK,KAAK,IAAI,KAAK,qBAAqB,SAAY,mBAAmB,GAAG;AAChF,YAAM,QAAQ,MAAM,KAAK;AAEzB,YAAM,aAAa,OAAO,OAAO,OAAO;AACxC,YAAM,cAAc,OAAO,OAAO,OAAO;AACzC,YAAM,YAAY,OAAO,OAAO,OAAO;AACvC,YAAM,eAAe,OAAO,OAAO,OAAO;AAE1C,mBAAa,KAAK,IAAI,MAAM,YAAY,WAAW;AACnD,mBAAa,KAAK,IAAI,MAAM,YAAY,WAAW;AACnD,mBAAa,KAAK,IAAI,MAAM,WAAW,YAAY;AACnD,mBAAa,KAAK,IAAI,MAAM,WAAW,YAAY;AAAA,IACrD,OAAO;AACL,UAAI,KAAK;AACT,UAAI,KAAK;AACT,UAAI,mBAAmB,gBAAgB;AACrC,aAAK;AACL,aAAK;AAAA,MACP,WAAW,mBAAmB,UAAU;AACtC,aAAK;AAAA,MACP,WAAW,mBAAmB,SAAS;AACrC,aAAK;AAAA,MACP;AAEA,mBAAa,KAAK,IAAI,MAAM,OAAO,EAAE;AACrC,mBAAa,KAAK,IAAI,MAAM,OAAO,EAAE;AACrC,mBAAa,KAAK,IAAI,MAAM,OAAO,EAAE;AACrC,mBAAa,KAAK,IAAI,MAAM,OAAO,EAAE;AAAA,IACvC;AAAA,EACF;AAGA,QAAM,iBAAiB,qBAAqB,GAAG;AAC/C,QAAM,gBAAgB,IAAI,kBAAkB,CAAC;AAE7C,QAAM,cAAc,CAAC,MAAyB,eAAyD,UAAU,GAAG,UAAU,GAAG,YAAwC;AACvK,QAAI,SAAS,eAAe,kBAAkB,SAAS,UAAU,CAAC,eAAe;AAC/E,sBAAgB,KAAK;AAAA,QACnB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,gBAAgB;AAAA,QAChB,cAAc;AAAA,QACd,MAAM;AAAA,QACN;AAAA,QACA;AAAA,MACF,CAAC;AACD;AAAA,IACF;AAEA,UAAM,qBAAsB,IAAY,iBAAiB;AACzD,QAAI,kBAAkB,GAAG;AACvB,MAAC,IAAY,gBAAgB,GAAG,aAAa;AAAA,IAC/C;AAEA,QAAI,eAAe;AACjB,UAAI,SAAS,QAAQ;AACnB,YAAI,YAAY;AAAA,MAClB,OAAO;AACL,YAAI,cAAc;AAAA,MACpB;AAAA,IACF;AAEA,UAAM,QAAQ,CAAC,MAAM,UAAU;AAC7B,YAAM,KAAK,SAAS,QAAQ;AAC5B,UAAI,SAAS,QAAQ;AACnB,YAAI,SAAS,MAAM,SAAS,SAAS,KAAK,OAAO;AAAA,MACnD,OAAO;AACL,YAAI,WAAW,MAAM,SAAS,SAAS,KAAK,OAAO;AAAA,MACrD;AAAA,IACF,CAAC;AAED,IAAC,IAAY,gBAAgB;AAAA,EAC/B;AAGA,QAAM,wBAAwB,CAAC,MAAyB,QAAgB,OAAe,UAAkB,UAAkB,SAAiB,gBAAgB,QAAQ,SAAS,MAAM;AACjL,QAAI,KAAK;AACT,QAAI,cAAc,UAAU;AAE5B,UAAM,SAAS;AACf,QAAI,cAAc;AAClB,QAAI,aAAa;AACjB,QAAI,gBAAgB,SAAS;AAC7B,QAAI,gBAAgB;AAGpB,UAAM,qBAAsB,IAAY,iBAAiB;AACzD,QAAI,kBAAkB,GAAG;AACvB,MAAC,IAAY,gBAAgB,GAAG,aAAa;AAAA,IAC/C;AAEA,UAAM,YAAY,SAAS,SAAS,IAAI,YAAY,IAAI;AACxD,QAAI,SAAS,QAAQ;AACnB,UAAI,YAAY;AAAA,IAClB,OAAO;AACL,UAAI,cAAc;AAAA,IACpB;AAEA,UAAM,kBAAkB,IAAI;AAC5B,UAAM,gBAAgB,IAAI;AAC1B,QAAI,SAAS,GAAG;AACd,UAAI,cAAc;AAClB,UAAI,YAAY,SAAS;AACzB,UAAI,WAAW;AAAA,IACjB;AAEA,UAAM,QAAQ,CAAC,MAAM,UAAU;AAC7B,YAAM,KAAK,SAAS,QAAQ;AAC5B,UAAI,SAAS,QAAQ;AACnB,YAAI,SAAS,GAAG;AACd,cAAI,WAAW,MAAM,SAAS,QAAQ,EAAE;AAAA,QAC1C;AACA,YAAI,SAAS,MAAM,SAAS,QAAQ,EAAE;AAAA,MACxC,OAAO;AACL,YAAI,WAAW,MAAM,SAAS,QAAQ,EAAE;AAAA,MAC1C;AAAA,IACF,CAAC;AAED,IAAC,IAAY,gBAAgB;AAC7B,QAAI,SAAS,QAAQ;AACnB,UAAI,YAAY;AAAA,IAClB,OAAO;AACL,UAAI,cAAc;AAAA,IACpB;AACA,QAAI,SAAS,GAAG;AACd,UAAI,cAAc;AAClB,UAAI,YAAY;AAAA,IAClB;AAEA,QAAI,QAAQ;AAAA,EACd;AAKA,MAAI,cAAc;AAChB,QAAI,KAAK;AACT,QAAI,cAAc,eAAe;AACjC,QAAI,YAAY;AAEhB,UAAM,KAAK,aAAa;AACxB,UAAM,KAAK,aAAa;AACxB,UAAM,KAAK,aAAa,aAAa,IAAI;AACzC,UAAM,KAAK,aAAa,aAAa,IAAI;AAEzC,UAAM,KAAK,KAAK,KAAK;AACrB,UAAM,KAAK,KAAK,KAAK;AAErB,UAAM,eAAe,IAAI,WAAW,YAAY,EAAE,SAAS,OAAO,KAAM,IAAY,eAAe;AAEnG,QAAI,UAAU;AACd,QAAI,cAAc;AAEhB,YAAM,YAAY;AAClB,YAAM,KAAK,KAAK;AAChB,YAAM,KAAK,KAAK;AAEhB,eAAS,IAAI,GAAG,IAAI,WAAW,KAAK;AAClC,cAAM,QAAS,IAAI,YAAa,KAAK,KAAK;AAE1C,cAAM,QAAQ,KAAK,IAAI,QAAQ,CAAC,IAAI;AACpC,cAAM,QAAQ,KAAK,IAAI,QAAQ,EAAE,IAAI;AACrC,cAAM,cAAc,IAAI,MAAM;AAC9B,cAAM,cAAc,cAAc,OAAO,QAAQ,QAAQ,OAAO;AAEhE,cAAM,KAAK,KAAK,KAAK,IAAI,KAAK,IAAI,KAAK;AACvC,cAAM,KAAK,KAAK,KAAK,IAAI,KAAK,IAAI,KAAK;AACvC,YAAI,MAAM,GAAG;AACX,cAAI,OAAO,IAAI,EAAE;AAAA,QACnB,OAAO;AACL,cAAI,OAAO,IAAI,EAAE;AAAA,QACnB;AAAA,MACF;AAAA,IACF,OAAO;AACL,UAAI,UAAU,IAAI,IAAI,IAAI,IAAI,WAAW;AAAA,IAC3C;AACA,QAAI,UAAU;AACd,QAAI,KAAK;AAET,QAAI,oBAAoB;AACtB,UAAI,cAAc;AAClB,UAAI,YAAY;AAChB,YAAM,eAAe,IAAI;AACzB,UAAI,cAAc;AAChB,YAAI,WAAW;AAAA,MACjB;AACA,UAAI,OAAO;AACX,UAAI,WAAW;AAAA,IACjB;AACA,QAAI,QAAQ;AAAA,EACd;AAKA,aAAW,QAAQ,CAACC,WAAU;AAC5B,QAAIA,OAAM,WAAWA,OAAM,SAAS,WAAWA,OAAM,UAAU,GAAG;AAChE,YAAM,cAAc,KAAK,IAAI,GAAG,KAAK,IAAI,IAAIA,OAAM,YAAY,CAAC,CAAC;AACjE,eAAS,IAAI,GAAG,IAAI,aAAa,KAAK;AACpC,8BAAsB,QAAQA,OAAM,OAAOA,OAAM,MAAM,GAAG,GAAGA,OAAM,SAAS,QAAQA,OAAM,UAAU,CAAC;AAAA,MACvG;AAAA,IACF;AAAA,EACF,CAAC;AAKD,MAAI,iBAAiB,eAAe,UAAU,gBAAgB,GAAG;AAC/D,QAAI,gBAAgB,aAAa,GAAG;AAClC,UAAI,yBAAyB;AAC3B,cAAM,MAAM,SAAS,KAAM,yBAAyB,SAAY,uBAAuB,MAAM,OAAQ,SAAS;AAC9G,cAAM,MAAM,UAAU,KAAM,yBAAyB,SAAY,uBAAuB,MAAM,OAAQ,UAAU;AAChH,cAAM,KAAK,KAAK,IAAI,KAAK,qBAAqB,SAAY,mBAAmB,GAAG;AAChF,cAAM,QAAQ,MAAM,KAAK;AAEzB,YAAI,KAAK;AACT,YAAI,UAAU,KAAK,GAAG;AACtB,YAAI,MAAM,OAAO,KAAK;AACtB,YAAI,UAAU,CAAC,KAAK,CAAC,GAAG;AAExB,8BAAsB,QAAQ,aAAa,YAAY,eAAe,eAAe,aAAa;AAClG,YAAI,QAAQ;AAAA,MACd,OAAO;AACL,YAAI,KAAK;AACT,YAAI,KAAK;AACT,YAAI,mBAAmB,gBAAgB;AACrC,eAAK;AACL,eAAK;AAAA,QACP,WAAW,mBAAmB,UAAU;AACtC,eAAK;AAAA,QACP,WAAW,mBAAmB,SAAS;AACrC,eAAK;AAAA,QACP;AAEA,8BAAsB,QAAQ,aAAa,YAAY,gBAAgB,IAAI,gBAAgB,IAAI,aAAa;AAAA,MAC9G;AAAA,IACF,OAAO;AACL,4BAAsB,QAAQ,aAAa,YAAY,eAAe,eAAe,aAAa;AAAA,IACpG;AAAA,EACF;AAMA,QAAM,WAAW,IAAI,WAAW,YAAY,EAAE,SAAS,QAAQ,KAAK,IAAI,SAAS;AACjF,MAAI,UAAU;AACZ,QAAI,KAAK;AAET,QAAI,cAAc;AAClB,gBAAY,QAAQ,WAAW,IAAI,EAAE;AAErC,gBAAY,QAAQ,WAAW,GAAG,CAAC;AACnC,QAAI,QAAQ;AAAA,EACd;AAKA,MAAI,gBAAgB,aAAa,GAAG;AAElC,UAAM,YAAYC,UAAS,eAAe,SAAS;AACnD,UAAM,UAAUA,UAAS,kBAAkB,eAAe,SAAS;AACnE,UAAM,eAAeA,UAAS,kBAAkB,SAAS;AASzD,UAAM,gBAAgB,CAAC,MAAsB;AAE3C,YAAM,QAAQ,IAAI,MAAM,IAAI,IAAI,IAAI,MAAM,IAAI,IAAI,KAAK;AACvD,UAAI,SAAS,KAAK;AAChB,cAAM,IAAI,QAAQ;AAClB,cAAM,IAAI,KAAK,MAAM,UAAU,KAAK,QAAQ,IAAI,UAAU,KAAK,CAAC;AAChE,cAAM,IAAI,KAAK,MAAM,UAAU,KAAK,QAAQ,IAAI,UAAU,KAAK,CAAC;AAChE,cAAM,IAAI,KAAK,MAAM,UAAU,KAAK,QAAQ,IAAI,UAAU,KAAK,CAAC;AAChE,eAAO,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;AAAA,MAC3B,OAAO;AACL,cAAM,KAAK,QAAQ,OAAO;AAC1B,cAAM,IAAI,KAAK,MAAM,QAAQ,KAAK,aAAa,IAAI,QAAQ,KAAK,CAAC;AACjE,cAAM,IAAI,KAAK,MAAM,QAAQ,KAAK,aAAa,IAAI,QAAQ,KAAK,CAAC;AACjE,cAAM,IAAI,KAAK,MAAM,QAAQ,KAAK,aAAa,IAAI,QAAQ,KAAK,CAAC;AACjE,eAAO,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;AAAA,MAC3B;AAAA,IACF;AAEA,QAAI,yBAAyB;AAC3B,YAAM,MAAM,SAAS,KAAM,yBAAyB,SAAY,uBAAuB,MAAM,OAAQ,SAAS;AAC9G,YAAM,MAAM,UAAU,KAAM,yBAAyB,SAAY,uBAAuB,MAAM,OAAQ,UAAU;AAChH,YAAM,KAAK,KAAK,IAAI,KAAK,qBAAqB,SAAY,mBAAmB,GAAG;AAGhF,UAAI,aAAa,YAAY,GAAG;AAC9B,YAAI,KAAK;AACT,YAAI,SAAS,QAAQ,SAAS;AAC9B,cAAM,YAAY,kBAAkB,eAAe;AACnD,iBAAS,IAAI,YAAY,IAAI,GAAG,KAAK,KAAK,IAAI,GAAG,KAAK,MAAM,aAAa,CAAC,CAAC,GAAG;AAC5E,gBAAM,QAAQ,MAAM,KAAK;AACzB,cAAI,KAAK;AACT,cAAI,UAAU,KAAK,GAAG;AACtB,cAAI,MAAM,OAAO,KAAK;AACtB,cAAI,UAAU,CAAC,KAAK,CAAC,GAAG;AACxB,sBAAY,QAAQ,SAAS;AAC7B,cAAI,QAAQ;AAAA,QACd;AACA,YAAI,QAAQ;AAAA,MACd;AAGA,UAAI,KAAK;AACT,eAAS,IAAI,YAAY,IAAI,GAAG,KAAK;AAEnC,cAAM,IAAI,KAAK,IAAI,KAAK,KAAK,IAAI,GAAG,aAAa,CAAC;AAElD,cAAM,WAAW,OAAO,QAAQ,KAAK,IAAI,KAAK,KAAK,IAAI,GAAG,UAAU;AACpE,cAAM,YAAY,cAAc,CAAC;AAGjC,cAAM,OAAOA,UAAS,UAAU,WAAW,GAAG,IAAI,YAAY,SAAS;AACvE,cAAM,iBAAiB,MAAM;AAC3B,gBAAM,IAAI,UAAU,MAAM,0BAA0B;AACpD,iBAAO,IAAI,EAAE,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,EAAE,CAAC,EAAE,IAAI;AAAA,QAChD,GAAG;AACH,cAAM,UAAU,OAAO,KAAK,MAAM,cAAc,IAAI,QAAQ,CAAC,IAAI,KAAK,MAAM,cAAc,IAAI,QAAQ,CAAC,IAAI,KAAK,MAAM,cAAc,IAAI,QAAQ,CAAC;AAEjJ,cAAM,QAAQ,MAAM,KAAK;AACzB,YAAI,KAAK;AACT,YAAI,UAAU,KAAK,GAAG;AACtB,YAAI,MAAM,OAAO,KAAK;AACtB,YAAI,UAAU,CAAC,KAAK,CAAC,GAAG;AACxB,oBAAY,QAAQ,OAAO;AAE3B,YAAI,kBAAkB,iBAAiB,GAAG;AACxC,cAAI,KAAK;AACT,cAAI,cAAc,kBAAkB;AACpC,cAAI,YAAY;AAChB,cAAI,WAAW,kBAAkB;AACjC,sBAAY,QAAQ;AACpB,cAAI,QAAQ;AAAA,QACd;AACA,YAAI,QAAQ;AAAA,MACd;AACA,UAAI,QAAQ;AAGZ,UAAI,kBAAkB,iBAAiB,GAAG;AACxC,YAAI,KAAK;AACT,YAAI,cAAc;AAClB,YAAI,cAAc;AAClB,YAAI,YAAY,KAAK,IAAI,MAAM,kBAAkB,KAAK,GAAG;AACzD,YAAI,WAAW,kBAAkB;AACjC,oBAAY,QAAQ;AACpB,YAAI,QAAQ;AAAA,MACd;AAAA,IACF,OAAO;AAGL,YAAM,eAAe,CAAC,MAA0C;AAC9D,YAAI,mBAAmB,eAAgB,QAAO,EAAE,IAAI,GAAG,IAAI,EAAE;AAC7D,YAAI,mBAAmB,SAAU,QAAO,EAAE,IAAI,GAAG,IAAI,EAAE;AACvD,YAAI,mBAAmB,QAAS,QAAO,EAAE,IAAI,GAAG,IAAI,EAAE;AACtD,eAAO,EAAE,IAAI,GAAG,IAAI,EAAE;AAAA,MACxB;AAGA,UAAI,aAAa,YAAY,GAAG;AAC9B,YAAI,KAAK;AACT,YAAI,SAAS,QAAQ,SAAS;AAC9B,cAAM,YAAY,kBAAkB,eAAe;AACnD,iBAAS,IAAI,YAAY,IAAI,GAAG,KAAK,KAAK,IAAI,GAAG,KAAK,MAAM,aAAa,CAAC,CAAC,GAAG;AAC5E,gBAAM,EAAE,IAAI,GAAG,IAAI,aAAa,CAAC;AACjC,sBAAY,QAAQ,WAAW,IAAI,EAAE;AAAA,QACvC;AACA,YAAI,QAAQ;AAAA,MACd;AAGA,UAAI,KAAK;AACT,eAAS,IAAI,YAAY,IAAI,GAAG,KAAK;AACnC,cAAM,EAAE,IAAI,GAAG,IAAI,aAAa,CAAC;AAGjC,cAAM,IAAI,KAAK,IAAI,KAAK,KAAK,IAAI,GAAG,aAAa,CAAC;AAKlD,cAAM,cAAc,IAAI,KAAK,KAAK,IAAI,GAAG,aAAa,CAAC;AACvD,cAAM,WAAW,OAAO,QAAQ,IAAI,aAAa;AAEjD,cAAM,YAAY,cAAc,CAAC;AACjC,cAAM,iBAAiB,MAAM;AAC3B,gBAAM,IAAI,UAAU,MAAM,0BAA0B;AACpD,iBAAO,IAAI,EAAE,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,EAAE,CAAC,EAAE,IAAI;AAAA,QAChD,GAAG;AACH,cAAM,cAAc,OAAO,KAAK,MAAM,cAAc,IAAI,QAAQ,CAAC,IAAI,KAAK,MAAM,cAAc,IAAI,QAAQ,CAAC,IAAI,KAAK,MAAM,cAAc,IAAI,QAAQ,CAAC;AAErJ,oBAAY,QAAQ,aAAa,IAAI,EAAE;AAEvC,YAAI,kBAAkB,iBAAiB,GAAG;AACxC,cAAI,KAAK;AAET,cAAI,cAAc,MAAM,OAAO,IAAI;AACnC,cAAI,cAAc,kBAAkB;AACpC,cAAI,YAAY;AAChB,cAAI,WAAW,kBAAkB;AACjC,sBAAY,UAAU,QAAW,IAAI,EAAE;AACvC,cAAI,QAAQ;AAAA,QACd;AAAA,MACF;AACA,UAAI,QAAQ;AAGZ,UAAI,KAAK;AACT,UAAI,cAAc;AAClB,UAAI,cAAc;AAClB,UAAI,YAAY,KAAK,IAAI,KAAK,kBAAkB,GAAG;AACnD,UAAI,WAAW;AACf,kBAAY,UAAU,gBAAgB,GAAG,CAAC;AAC1C,UAAI,QAAQ;AAAA,IACd;AAAA,EACF;AAKA,QAAM,cAAc,MAAM;AACxB,QAAI,KAAK;AAET,UAAM,QAAQ,cAAc;AAC5B,UAAM,QAAQ,cAAc;AAC5B,UAAM,kBAAkB,wBAAwB;AAChD,UAAM,kBAAkB,yBAAyB,SAAY,uBAAuB;AACpF,UAAM,aAAa,mBAAmB;AAGtC,QAAI,WAAW,kBAAkB;AAGjC,QAAI,oBAA6C;AACjD,QAAI,aAAa,GAAG;AAElB,YAAM,OAAO,IAAI,qBAAqB,GAAG,MAAM,GAAG,IAAI;AACtD,YAAM,MAAMA,UAAS,WAAW;AAEhC,WAAK,aAAa,GAAG,QAAQ,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,gBAAgB,GAAG,GAAG;AACjF,YAAM,YAAY,KAAK,IAAI,GAAK,aAAa,GAAG;AAChD,WAAK,aAAa,WAAW,QAAQ,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,IAAI,CAAC,MAAM;AACpE,WAAK,aAAa,GAAK,QAAQ,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,IAAI,CAAC,MAAM;AAC9D,0BAAoB;AAAA,IACtB;AAEA,UAAM,kBAAkB,CAAC,OAAgC,OAAe,YAAoB,SAAiB,aAAqB;AAChI,UAAI,KAAK;AACT,UAAI,cAAc,UAAU;AAC5B,UAAI,cAAc;AAGlB,UAAI,aAAa,GAAG;AAClB,YAAI,SAAS,QAAQ,UAAU;AAAA,MACjC;AAEA,UAAI,aAAa,WAAW;AAC1B,YAAI,YAAY,QAAQ;AACxB,oBAAY,QAAQ;AAAA,MACtB,WAAW,aAAa,UAAU;AAChC,YAAI,YAAY;AAChB,oBAAY,QAAQ;AAAA,MACtB,WAAW,aAAa,UAAU;AAEhC,YAAI,2BAA2B;AAC/B,YAAI,YAAY,QAAQ;AACxB,oBAAY,QAAQ;AAAA,MACtB;AACA,UAAI,QAAQ;AAAA,IACd;AAGA,QAAI,UAAU,UAAU;AAEtB,YAAM,aAAa,cAAc;AACjC,sBAAgB,iBAAiB,YAAY,OAAO,eAAe,cAAc;AAGjF;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF,WAAW,UAAU,QAAQ;AAG3B;AAAA,QACE;AAAA,QACA,cAAc;AAAA,QACd,SAAS;AAAA;AAAA,QACT,gBAAgB;AAAA,QAChB;AAAA,MACF;AAEA,sBAAgB,WAAW,cAAc,KAAK,GAAG,IAAI,cAAc;AAAA,IACrE,OAAO;AAEL,sBAAgB,mBAAmB,aAAa,OAAO,eAAe,cAAc;AAAA,IACtF;AAEA,QAAI,QAAQ;AAAA,EACd;AAKA,MAAI,iBAAiB,cAAc,MAAM,GAAG;AAC1C,UAAM,MAAM,cAAc;AAC1B,UAAM,OAAO,gBAAgB;AAC7B,UAAM,OAAO,gBAAgB;AAC7B,UAAM,SAAS,qBAAqB,MAAM;AAC1C,UAAM,cAAc,CAAC,eAAe,WAAW,eAAe,WAAW,eAAe,WAAW,eAAe,SAAS;AAE3H,aAAS,IAAI,KAAK,KAAK,GAAG,KAAK;AAC7B,UAAI,KAAK;AACT,YAAM,KAAK,IAAI;AACf,YAAM,KAAK,IAAI;AAEf,YAAM,eAAe,KAAK,IAAI,MAAM,IAAI,IAAI,KAAK;AACjD,UAAI,cAAc;AAElB,YAAM,aAAa,aAAa,IAAI,KAAK,YAAY,MAAM,KAAK;AAEhE,UAAI,iBAAiB,cAAc,KAAK,mBAAmB,UAAU;AACnE,YAAI,KAAK;AACT,YAAI,cAAc;AAClB,YAAI,YAAY;AAChB,YAAI,WAAW;AACf,YAAI,cAAe,gBAAgB,MAAO;AAC1C,oBAAY,UAAU,YAAY,IAAI,EAAE;AACxC,YAAI,QAAQ;AAAA,MACd;AAEA,kBAAY,QAAQ,YAAY,IAAI,EAAE;AACtC,UAAI,QAAQ;AAAA,IACd;AAAA,EACF;AAEA,MAAI,iBAAiB,cAAc,KAAK,mBAAmB,UAAU;AACnE,gBAAY;AAAA,EACd;AAKA,MAAI,KAAK;AACT,MAAI,WAAoD;AAExD,MAAI,aAAa,YAAY,kBAAkB,UAAU,GAAG;AAC1D,UAAM,WAAY,oBAAoB,KAAK,KAAM;AACjD,UAAM,MAAM,OAAO,QAAQ;AAC3B,UAAM,MAAM,OAAO,QAAQ;AAC3B,UAAM,IAAI,KAAK,IAAI,OAAO,MAAM,OAAO,IAAI,IAAI;AAE/C,UAAM,KAAK,KAAK,KAAK,IAAI,QAAQ,IAAI;AACrC,UAAM,KAAK,KAAK,KAAK,IAAI,QAAQ,IAAI;AACrC,UAAM,KAAK,KAAK,KAAK,IAAI,QAAQ,IAAI;AACrC,UAAM,KAAK,KAAK,KAAK,IAAI,QAAQ,IAAI;AAErC,UAAM,OAAO,IAAI,qBAAqB,IAAI,IAAI,IAAI,EAAE;AACpD,sBAAkB,QAAQ,CAAC,SAAS;AAClC,WAAK,aAAa,KAAK,SAAS,KAAK,KAAK,KAAK;AAAA,IACjD,CAAC;AACD,eAAW;AAAA,EACb,WAAW,aAAa,YAAY,kBAAkB,UAAU,GAAG;AACjE,UAAM,MAAM,OAAO,QAAQ;AAC3B,UAAM,MAAM,OAAO,QAAQ;AAC3B,UAAM,IAAI,KAAK,IAAI,OAAO,MAAM,OAAO,IAAI,IAAI;AAE/C,UAAM,OAAO,IAAI,qBAAqB,IAAI,IAAI,GAAG,IAAI,IAAI,CAAC;AAC1D,sBAAkB,QAAQ,CAAC,SAAS;AAClC,WAAK,aAAa,KAAK,SAAS,KAAK,KAAK,KAAK;AAAA,IACjD,CAAC;AACD,eAAW;AAAA,EACb,WAAW,aAAa,WAAW;AACjC,UAAM,QAAQ,eAAe;AAC7B,UAAM,WAAW,aAAa;AAE9B,UAAM,YAAYC,cAAa,KAAK,GAAG;AAEvC,QAAI,UAAU,UAAU;AACtB,gBAAU,QAAQ;AAClB,gBAAU,SAAS;AAAA,IACrB,WAAW,UAAU,WAAW;AAC9B,gBAAU,QAAQ;AAClB,gBAAU,SAAS;AAAA,IACrB,WAAW,UAAU,YAAY;AAC/B,gBAAU,QAAQ;AAClB,gBAAU,SAAS;AAAA,IACrB,WAAW,UAAU,SAAS;AAC5B,gBAAU,QAAQ;AAClB,gBAAU,SAAS;AAAA,IACrB,WAAW,UAAU,UAAU,UAAU,aAAa,UAAU,SAAS;AACvE,gBAAU,QAAQ;AAClB,gBAAU,SAAS;AAAA,IACrB,WAAW,UAAU,UAAU;AAC7B,gBAAU,QAAQ;AAClB,gBAAU,SAAS;AAAA,IACrB,OAAO;AACL,gBAAU,QAAQ;AAClB,gBAAU,SAAS;AAAA,IACrB;AAEA,UAAM,SAASC,oBAAmB,SAAS;AAG3C,UAAM,aAAa,CAAC,aAAqB;AACvC,UAAI,cAAc;AAClB,aAAO,MAAM;AACX,uBAAe,cAAc,UAAU,cAAc;AACrD,eAAO,cAAc;AAAA,MACvB;AAAA,IACF;AACA,UAAM,OAAO,WAAW,EAAE;AAE1B,QAAI,UAAU,SAAS;AACrB,aAAO,YAAY;AACnB,aAAO,SAAS,GAAG,GAAG,KAAK,GAAG;AAG9B,aAAO,YAAY;AACnB,eAAS,IAAI,GAAG,IAAI,MAAM,KAAK;AAC7B,cAAM,KAAK,KAAK,MAAM,KAAK,IAAI,GAAG;AAClC,cAAM,KAAK,KAAK,MAAM,KAAK,IAAI,GAAG;AAClC,eAAO,cAAc,OAAO,KAAK,IAAI;AACrC,eAAO,SAAS,IAAI,IAAI,KAAK,GAAG;AAAA,MAClC;AAGA,aAAO,cAAc;AACrB,eAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,cAAM,QAAS,IAAI,KAAK,KAAM,KAAK,KAAK,IAAI,OAAO;AACnD,eAAO,YAAY,MAAM,KAAK,IAAI;AAElC,iBAAS,IAAI,GAAG,IAAI,IAAI,KAAK;AAC3B,iBAAO,cAAc,OAAO,KAAK,IAAI;AACrC,iBAAO,UAAU;AAEjB,gBAAMC,UAAS,KAAK,IAAI;AACxB,gBAAMC,UAAS,KAAK,IAAI;AACxB,gBAAM,MAAM,KAAK,KAAK,IAAI;AAE1B,iBAAO,OAAOD,SAAQC,OAAM;AAC5B,iBAAO,OAAOD,UAAS,KAAK,IAAI,KAAK,IAAI,KAAKC,UAAS,KAAK,IAAI,KAAK,IAAI,GAAG;AAC5E,iBAAO,OAAO;AAAA,QAChB;AAAA,MACF;AAGA,eAAS,IAAI,GAAG,IAAI,KAAK,KAAK;AAC5B,cAAM,KAAK,KAAK,IAAI;AACpB,cAAM,KAAK,KAAK,IAAI;AACpB,cAAM,IAAI,IAAI,KAAK,IAAI;AACvB,eAAO,cAAc,OAAO,KAAK,IAAI;AACrC,eAAO,YAAY;AACnB,eAAO,UAAU;AACjB,eAAO,IAAI,IAAI,IAAI,GAAG,GAAG,KAAK,KAAK,CAAC;AACpC,eAAO,KAAK;AAAA,MACd;AAAA,IACF,WAAW,UAAU,SAAS;AAC5B,aAAO,YAAY;AACnB,aAAO,SAAS,GAAG,GAAG,IAAI,EAAE;AAE5B,aAAO,YAAY;AAEnB,eAAS,IAAI,GAAG,IAAI,MAAM,KAAK;AAC7B,cAAM,KAAK,KAAK,MAAM,KAAK,IAAI,EAAE;AACjC,cAAM,KAAK,KAAK,MAAM,KAAK,IAAI,EAAE;AACjC,eAAO,cAAc,OAAO,KAAK,IAAI;AACrC,eAAO,SAAS,IAAI,IAAI,KAAK,IAAI,OAAO,MAAM,GAAG,KAAK,IAAI,OAAO,MAAM,CAAC;AAAA,MAC1E;AAGA,eAAS,IAAI,GAAG,IAAI,KAAK,KAAK;AAC5B,cAAM,KAAK,KAAK,MAAM,KAAK,IAAI,EAAE;AACjC,cAAM,KAAK,KAAK,MAAM,KAAK,IAAI,EAAE;AACjC,cAAM,OAAO,MAAM,KAAK,IAAI;AAC5B,eAAO,cAAc,OAAO,KAAK,IAAI;AACrC,eAAO,SAAS,IAAI,IAAI,MAAM,IAAI;AAAA,MACpC;AAAA,IACF,WAAW,UAAU,UAAU;AAC7B,aAAO,YAAY;AACnB,aAAO,SAAS,GAAG,GAAG,KAAK,GAAG;AAG9B,aAAO,YAAY;AACnB,eAAS,IAAI,GAAG,IAAI,IAAI,KAAK;AAC3B,cAAM,KAAK,KAAK,IAAI;AACpB,cAAM,KAAK,KAAK,IAAI;AACpB,cAAM,IAAI,IAAI,KAAK,IAAI;AACvB,eAAO,cAAc,OAAO,KAAK,IAAI;AACrC,eAAO,UAAU;AACjB,eAAO,IAAI,IAAI,IAAI,GAAG,GAAG,KAAK,KAAK,CAAC;AACpC,eAAO,KAAK;AAAA,MACd;AAGA,aAAO,cAAc;AACrB,eAAS,IAAI,GAAG,IAAI,IAAI,KAAK;AAC3B,cAAM,KAAK,KAAK,IAAI;AACpB,cAAM,KAAK,KAAK,IAAI;AACpB,cAAM,QAAS,KAAK,IAAI,KAAK,KAAM,IAAI,KAAK,KAAK;AACjD,cAAM,MAAM,KAAK,KAAK,IAAI;AAC1B,eAAO,YAAY,MAAM,KAAK,IAAI;AAClC,eAAO,cAAc,OAAO,KAAK,IAAI;AAErC,eAAO,UAAU;AACjB,eAAO,OAAO,IAAI,EAAE;AACpB,eAAO,OAAO,KAAK,KAAK,IAAI,KAAK,IAAI,KAAK,KAAK,KAAK,IAAI,KAAK,IAAI,GAAG;AACpE,eAAO,OAAO;AAAA,MAChB;AAGA,eAAS,IAAI,GAAG,IAAI,MAAM,KAAK;AAC7B,cAAM,KAAK,KAAK,MAAM,KAAK,IAAI,GAAG;AAClC,cAAM,KAAK,KAAK,MAAM,KAAK,IAAI,GAAG;AAClC,eAAO,cAAc,OAAO,KAAK,IAAI;AACrC,eAAO,SAAS,IAAI,IAAI,KAAK,GAAG;AAAA,MAClC;AAAA,IACF,WAAW,UAAU,UAAU;AAC7B,aAAO,YAAY;AACnB,aAAO,SAAS,GAAG,GAAG,GAAG,CAAC;AAE1B,aAAO,YAAY;AACnB,aAAO,cAAc;AACrB,aAAO,SAAS,GAAG,GAAG,GAAG,CAAC;AAC1B,aAAO,SAAS,GAAG,GAAG,GAAG,CAAC;AAG1B,aAAO,YAAY;AACnB,aAAO,cAAc;AACrB,aAAO,SAAS,GAAG,GAAG,GAAG,CAAC;AAC1B,aAAO,SAAS,GAAG,GAAG,GAAG,CAAC;AAG1B,aAAO,YAAY;AACnB,aAAO,cAAc;AACrB,aAAO,SAAS,GAAG,GAAG,GAAG,CAAC;AAC1B,aAAO,SAAS,GAAG,GAAG,GAAG,CAAC;AAAA,IAC5B,WAAW,UAAU,WAAW;AAC9B,aAAO,YAAY;AACnB,aAAO,SAAS,GAAG,GAAG,IAAI,EAAE;AAE5B,aAAO,cAAc;AACrB,aAAO,YAAY;AACnB,aAAO,cAAc;AAErB,aAAO,UAAU;AAEjB,aAAO,OAAO,IAAI,EAAE;AACpB,aAAO,OAAO,IAAI,EAAE;AAEpB,aAAO,OAAO,GAAG,EAAE;AACnB,aAAO,OAAO,IAAI,CAAC;AAEnB,aAAO,OAAO,GAAG,EAAE;AACnB,aAAO,OAAO,IAAI,CAAC;AACnB,aAAO,OAAO;AAAA,IAChB,WAAW,UAAU,QAAQ;AAE3B,aAAO,YAAY;AACnB,aAAO,cAAc;AACrB,aAAO,SAAS,GAAG,GAAG,KAAK,GAAG;AAG9B,eAAS,IAAI,GAAG,IAAI,MAAM,KAAK;AAC7B,cAAM,KAAK,KAAK,MAAM,KAAK,IAAI,GAAG;AAClC,cAAM,KAAK,KAAK,MAAM,KAAK,IAAI,GAAG;AAClC,cAAM,SAAS,KAAK,IAAI;AACxB,eAAO,YAAY,SAAS,YAAY;AACxC,eAAO,cAAc,SAAS,OAAO,KAAK,IAAI,OAAO,OAAO,KAAK,IAAI;AACrE,eAAO,SAAS,IAAI,IAAI,KAAK,IAAI,MAAM,MAAM,GAAG,KAAK,IAAI,MAAM,MAAM,CAAC;AAAA,MACxE;AAGA,aAAO,cAAc;AACrB,eAAS,IAAI,GAAG,IAAI,IAAI,KAAK;AAC3B,cAAM,KAAK,KAAK,IAAI;AACpB,cAAM,KAAK,KAAK,IAAI;AACpB,cAAM,MAAM,KAAK,KAAK,IAAI;AAC1B,cAAM,QAAQ,CAAC,KAAK,KAAK,KAAK,KAAK,IAAI,OAAO;AAC9C,eAAO,YAAY,OAAO,KAAK,IAAI;AACnC,eAAO,cAAc,OAAO,KAAK,IAAI;AAErC,eAAO,UAAU;AACjB,eAAO,OAAO,IAAI,EAAE;AACpB,eAAO,OAAO,KAAK,KAAK,IAAI,KAAK,IAAI,KAAK,KAAK,KAAK,IAAI,KAAK,IAAI,GAAG;AACpE,eAAO,OAAO;AAAA,MAChB;AAGA,aAAO,cAAc;AACrB,eAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,cAAM,KAAK,KAAK,IAAI;AACpB,cAAM,KAAK,KAAK,IAAI;AACpB,cAAM,MAAM,KAAK,KAAK,IAAI;AAC1B,cAAM,QAAQ,CAAC,KAAK,KAAK,KAAK,KAAK,IAAI,OAAO;AAC9C,eAAO,YAAY,MAAM,KAAK,IAAI;AAClC,eAAO,cAAc,OAAO,KAAK,IAAI;AAErC,eAAO,UAAU;AACjB,eAAO,OAAO,IAAI,EAAE;AACpB,eAAO,OAAO,KAAK,KAAK,IAAI,KAAK,IAAI,KAAK,KAAK,KAAK,IAAI,KAAK,IAAI,GAAG;AACpE,eAAO,OAAO;AAAA,MAChB;AAGA,aAAO,cAAc;AACrB,eAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,cAAM,KAAK,KAAK,IAAI;AACpB,cAAM,KAAK,KAAK,IAAI;AACpB,eAAO,YAAY,OAAO,KAAK,IAAI;AACnC,eAAO,cAAc,OAAO,KAAK,IAAI;AAErC,eAAO,UAAU;AACjB,eAAO,OAAO,IAAI,EAAE;AAEpB,eAAO,iBAAiB,MAAM,KAAK,IAAI,OAAO,IAAI,MAAM,KAAK,IAAI,OAAO,IAAI,MAAM,KAAK,IAAI,OAAO,IAAI,MAAM,KAAK,IAAI,OAAO,EAAE;AAC9H,eAAO,OAAO;AAAA,MAChB;AAGA,aAAO,YAAY;AACnB,eAAS,IAAI,GAAG,IAAI,IAAI,KAAK;AAC3B,cAAM,KAAK,KAAK,IAAI;AACpB,cAAM,KAAK,KAAK,IAAI;AACpB,cAAM,IAAI,OAAO,KAAK,IAAI;AAC1B,eAAO,cAAc,OAAO,KAAK,IAAI;AACrC,eAAO,UAAU;AACjB,eAAO,IAAI,IAAI,IAAI,GAAG,GAAG,KAAK,KAAK,CAAC;AACpC,eAAO,KAAK;AAAA,MACd;AAGA,aAAO,YAAY;AACnB,eAAS,IAAI,GAAG,IAAI,IAAI,KAAK;AAC3B,cAAM,KAAK,KAAK,IAAI;AACpB,cAAM,KAAK,KAAK,IAAI;AACpB,cAAM,IAAI,OAAO,KAAK,IAAI;AAC1B,eAAO,cAAc,MAAM,KAAK,IAAI;AACpC,eAAO,UAAU;AACjB,eAAO,IAAI,IAAI,IAAI,GAAG,GAAG,KAAK,KAAK,CAAC;AACpC,eAAO,KAAK;AAAA,MACd;AAAA,IACF,WAAW,UAAU,WAAW;AAE9B,aAAO,YAAY;AACnB,aAAO,SAAS,GAAG,GAAG,KAAK,GAAG;AAG9B,eAAS,IAAI,GAAG,IAAI,KAAK,KAAK;AAC5B,cAAM,IAAI,KAAK,IAAI;AACnB,cAAM,IAAI,KAAK,IAAI;AACnB,cAAM,MAAM,KAAK,KAAK,IAAI;AAC1B,cAAM,YAAY,MAAM,KAAK,IAAI;AACjC,cAAM,UAAU,KAAK,IAAI;AAEzB,eAAO,cAAc,UAAU,YAAY;AAC3C,eAAO,cAAc,UAAU,OAAO,KAAK,IAAI,OAAO,OAAO,KAAK,IAAI;AACtE,eAAO,YAAY;AAEnB,eAAO,UAAU;AACjB,eAAO,OAAO,GAAG,CAAC;AAClB,eAAO,OAAO,IAAI,KAAK,CAAC;AACxB,eAAO,OAAO;AAGd,YAAI,IAAI,MAAM,KAAK;AACjB,iBAAO,UAAU;AACjB,iBAAO,OAAO,IAAI,KAAK,CAAC;AACxB,iBAAO,OAAO,IAAI,MAAM,KAAK,CAAC;AAC9B,iBAAO,OAAO;AAAA,QAChB;AAAA,MACF;AAGA,eAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,cAAM,IAAI,KAAK,IAAI;AACnB,cAAM,IAAI,KAAK,KAAK,IAAI;AACxB,cAAM,UAAU,KAAK,IAAI;AACzB,cAAM,OAAO,OAAO,qBAAqB,GAAG,GAAG,IAAI,GAAG,CAAC;AACvD,cAAM,YAAY,UAAU,gBAAgB;AAC5C,cAAM,QAAQ,OAAO,KAAK,IAAI;AAC9B,aAAK,aAAa,GAAG,QAAQ,SAAS,MAAM;AAC5C,aAAK,aAAa,KAAK,QAAQ,SAAS,KAAK,KAAK,GAAG;AACrD,aAAK,aAAa,GAAG,QAAQ,SAAS,MAAM;AAE5C,eAAO,YAAY;AACnB,eAAO,cAAc;AACrB,eAAO,SAAS,GAAG,GAAG,GAAG,GAAG;AAG5B,YAAI,IAAI,IAAI,KAAK;AACf,iBAAO,SAAS,IAAI,KAAK,GAAG,GAAG,GAAG;AAAA,QACpC;AAAA,MACF;AAAA,IACF,WAAW,UAAU,UAAU;AAE7B,aAAO,YAAY;AACnB,aAAO,SAAS,GAAG,GAAG,KAAK,GAAG;AAG9B,eAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,cAAM,KAAK,KAAK,IAAI;AACpB,cAAM,KAAK,KAAK,IAAI;AACpB,cAAM,IAAI,KAAK,KAAK,IAAI;AACxB,cAAM,OAAO,OAAO,qBAAqB,IAAI,IAAI,GAAG,IAAI,IAAI,CAAC;AAC7D,cAAM,UAAU,KAAK,IAAI;AACzB,cAAM,QAAQ,OAAO,KAAK,IAAI;AAC9B,cAAM,OAAO,UAAU,gBAAgB;AACvC,aAAK,aAAa,GAAG,QAAQ,IAAI,KAAK,KAAK,GAAG;AAC9C,aAAK,aAAa,KAAK,QAAQ,IAAI,KAAK,QAAQ,GAAG,GAAG;AACtD,aAAK,aAAa,GAAG,QAAQ,IAAI,MAAM;AAEvC,eAAO,YAAY;AACnB,eAAO,cAAc;AACrB,eAAO,UAAU;AACjB,eAAO,IAAI,IAAI,IAAI,GAAG,GAAG,KAAK,KAAK,CAAC;AACpC,eAAO,KAAK;AAAA,MACd;AAGA,YAAM,iBAAiB,CAAC,OAAe,OAAe,SAAiB;AACrE,eAAO,cAAc;AACrB,eAAO,YAAY;AACnB,eAAO,cAAc;AAGrB,YAAI,KAAK,KAAK,IAAI;AAClB,YAAI,KAAK;AACT,eAAO,UAAU;AACjB,eAAO,OAAO,IAAI,EAAE;AAEpB,cAAM,QAAQ;AACd,iBAAS,IAAI,GAAG,KAAK,OAAO,KAAK;AAC/B,gBAAM,WAAW,IAAI;AACrB,gBAAM,UAAU,WAAW;AAE3B,gBAAM,YAAY;AAClB,gBAAM,MAAM;AACZ,gBAAM,QAAQ,KAAK,IAAI,WAAW,KAAK,KAAK,YAAY,KAAK,IAAI,CAAC,IAAI;AACtE,gBAAM,WAAW,MAAM,KAAK,IAAI,OAAO,KAAK,QAAQ,OAAO;AAE3D,iBAAO,OAAO,SAAS,OAAO;AAAA,QAChC;AACA,eAAO,OAAO;AAAA,MAChB;AAGA,eAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,uBAAe,WAAW,MAAM,KAAK,IAAI,KAAK,OAAO,KAAK,IAAI,IAAI;AAAA,MACpE;AAEA,eAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,cAAM,SAAS,KAAK,IAAI;AACxB,cAAM,SAAS,SAAS,YAAY;AACpC,uBAAe,QAAQ,MAAM,KAAK,IAAI,KAAK,MAAM,KAAK,IAAI,GAAG;AAAA,MAC/D;AAEA,eAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,uBAAe,WAAW,KAAK,OAAO,KAAK,IAAI,IAAI;AAAA,MACrD;AAAA,IACF,WAAW,UAAU,YAAY;AAE/B,aAAO,YAAY;AACnB,aAAO,SAAS,GAAG,GAAG,IAAI,EAAE;AAG5B,YAAM,WAAW,aAAa;AAG9B,aAAO,YAAY;AACnB,aAAO,cAAc;AAErB,aAAO,UAAU;AACjB,aAAO,IAAI,IAAI,IAAI,KAAK,GAAG,KAAK,KAAK,CAAC;AACtC,aAAO,IAAI,GAAG,GAAG,KAAK,GAAG,KAAK,KAAK,CAAC;AACpC,aAAO,IAAI,IAAI,GAAG,KAAK,GAAG,KAAK,KAAK,CAAC;AACrC,aAAO,IAAI,GAAG,IAAI,KAAK,GAAG,KAAK,KAAK,CAAC;AACrC,aAAO,IAAI,IAAI,IAAI,KAAK,GAAG,KAAK,KAAK,CAAC;AACtC,aAAO,KAAK;AAGZ,aAAO,YAAY;AACnB,aAAO,cAAc;AACrB,aAAO,UAAU;AACjB,aAAO,IAAI,IAAI,IAAI,GAAK,GAAG,KAAK,KAAK,CAAC;AACtC,aAAO,IAAI,GAAG,GAAG,GAAK,GAAG,KAAK,KAAK,CAAC;AACpC,aAAO,IAAI,IAAI,GAAG,GAAK,GAAG,KAAK,KAAK,CAAC;AACrC,aAAO,IAAI,GAAG,IAAI,GAAK,GAAG,KAAK,KAAK,CAAC;AACrC,aAAO,IAAI,IAAI,IAAI,GAAK,GAAG,KAAK,KAAK,CAAC;AACtC,aAAO,KAAK;AAGZ,aAAO,YAAY,aAAa,aAAa,aAAa,YAAY,YAAY;AAClF,aAAO,cAAc;AACrB,aAAO,UAAU;AACjB,aAAO,IAAI,IAAI,GAAG,KAAK,GAAG,KAAK,KAAK,CAAC;AACrC,aAAO,IAAI,IAAI,IAAI,KAAK,GAAG,KAAK,KAAK,CAAC;AACtC,aAAO,IAAI,GAAG,IAAI,KAAK,GAAG,KAAK,KAAK,CAAC;AACrC,aAAO,IAAI,IAAI,IAAI,KAAK,GAAG,KAAK,KAAK,CAAC;AACtC,aAAO,KAAK;AAAA,IACd,WAAW,UAAU,SAAS;AAE5B,aAAO,YAAY;AACnB,aAAO,SAAS,GAAG,GAAG,KAAK,GAAG;AAG9B,eAAS,IAAI,GAAG,IAAI,KAAK,KAAK;AAC5B,cAAM,KAAK,KAAK,IAAI;AACpB,cAAM,KAAK,KAAK,IAAI;AACpB,cAAM,OAAO,IAAI,KAAK,IAAI;AAC1B,cAAM,SAAS,KAAK,IAAI,KAAK,KAAK;AAClC,cAAM,SAAS,KAAK,IAAI;AAExB,eAAO,cAAc,SAAS,YAAY;AAC1C,eAAO,cAAc,SAAS,OAAO,KAAK,IAAI,OAAO,OAAO,KAAK,IAAI;AACrE,eAAO,YAAY,MAAM,KAAK,IAAI;AAElC,eAAO,UAAU;AACjB,eAAO,OAAO,IAAI,EAAE;AAEpB,eAAO,iBAAiB,KAAK,KAAK,IAAI,MAAM,IAAI,OAAO,OAAO,KAAK,IAAI,OAAO,GAAG,KAAK,KAAK,IAAI,MAAM,IAAI,OAAO,OAAO,KAAK,IAAI,OAAO,GAAG,KAAK,KAAK,IAAI,MAAM,IAAI,MAAM,KAAK,KAAK,IAAI,MAAM,IAAI,IAAI;AACpM,eAAO,OAAO;AAAA,MAChB;AAGA,eAAS,IAAI,GAAG,IAAI,KAAM,KAAK;AAC7B,cAAM,KAAK,KAAK,MAAM,KAAK,IAAI,GAAG;AAClC,cAAM,KAAK,KAAK,MAAM,KAAK,IAAI,GAAG;AAClC,cAAM,SAAS,KAAK,IAAI;AACxB,eAAO,YAAY,SAAS,YAAY;AACxC,eAAO,cAAc,SAAS,OAAO;AACrC,eAAO,SAAS,IAAI,IAAI,GAAG,CAAC;AAAA,MAC9B;AAGA,YAAM,SAA6B,CAAC;AACpC,eAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,eAAO,KAAK,CAAC,KAAK,IAAI,KAAK,KAAK,IAAI,GAAG,CAAC;AAAA,MAC1C;AAEA,aAAO,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC;AAGlD,eAAS,IAAI,GAAG,IAAI,IAAI,KAAK;AAC3B,cAAM,KAAK,OAAO,KAAK,MAAM,KAAK,IAAI,OAAO,MAAM,CAAC;AACpD,cAAM,KAAK,OAAO,KAAK,MAAM,KAAK,IAAI,OAAO,MAAM,CAAC;AACpD,cAAM,KAAK,OAAO,KAAK,MAAM,KAAK,IAAI,OAAO,MAAM,CAAC;AAEpD,YAAI,OAAO,MAAM,OAAO,IAAI;AAC1B,gBAAM,OAAO,OAAO,qBAAqB,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC;AACnE,gBAAM,QAAQ,OAAO,KAAK,IAAI;AAC9B,gBAAM,SAAS,KAAK,IAAI;AACxB,gBAAM,OAAO,SAAS,UAAU;AAChC,eAAK,aAAa,GAAG,QAAQ,IAAI,KAAK,KAAK,GAAG;AAC9C,eAAK,aAAa,GAAG,QAAQ,IAAI,MAAM;AAEvC,iBAAO,YAAY;AACnB,iBAAO,cAAc;AACrB,iBAAO,UAAU;AACjB,iBAAO,OAAO,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC;AAC1B,iBAAO,OAAO,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC;AAC1B,iBAAO,OAAO,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC;AAC1B,iBAAO,UAAU;AACjB,iBAAO,KAAK;AAAA,QACd;AAAA,MACF;AAGA,eAAS,IAAI,GAAG,IAAI,IAAI,KAAK;AAC3B,cAAM,KAAK,KAAK,IAAI;AACpB,cAAM,KAAK,KAAK,IAAI;AACpB,cAAM,KAAK,KAAK,IAAI;AACpB,cAAM,KAAK,KAAK,IAAI;AACpB,cAAM,KAAK,KAAK;AAChB,cAAM,KAAK,KAAK;AAChB,cAAM,MAAM,KAAK,KAAK,KAAK,KAAK,KAAK,EAAE;AACvC,YAAI,QAAQ,EAAG;AAEf,cAAM,KAAK,CAAC,KAAK;AACjB,cAAM,KAAK,KAAK;AAGhB,eAAO,cAAc;AACrB,eAAO,YAAY,MAAM,KAAK,IAAI;AAClC,eAAO,cAAc,OAAO,KAAK,IAAI;AACrC,eAAO,UAAU;AACjB,eAAO,OAAO,KAAK,KAAK,KAAK,KAAK,KAAK,GAAG;AAC1C,eAAO,OAAO,KAAK,KAAK,KAAK,KAAK,KAAK,GAAG;AAC1C,eAAO,OAAO;AAGd,eAAO,cAAc;AACrB,eAAO,YAAY,MAAM,KAAK,IAAI;AAClC,eAAO,cAAc,OAAO,KAAK,IAAI;AACrC,eAAO,UAAU;AACjB,eAAO,OAAO,IAAI,EAAE;AACpB,eAAO,OAAO,IAAI,EAAE;AACpB,eAAO,OAAO;AAGd,eAAO,cAAc;AACrB,eAAO,YAAY,MAAM,KAAK,IAAI;AAClC,eAAO,cAAc,OAAO,KAAK,IAAI;AACrC,eAAO,UAAU;AACjB,eAAO,OAAO,KAAK,KAAK,KAAK,KAAK,KAAK,GAAG;AAC1C,eAAO,OAAO,KAAK,KAAK,KAAK,KAAK,KAAK,GAAG;AAC1C,eAAO,OAAO;AAAA,MAChB;AAAA,IACF;AAEA,UAAM,MAAM,IAAI,cAAc,WAAW,QAAQ;AACjD,QAAI,KAAK;AACP,iBAAW;AAAA,IACb;AAAA,EACF;AAGA,QAAM,mBAAmB,CAAC,SAAiB;AACzC,QAAI,MAAM;AACV,WAAO,MAAM;AACX,aAAO,MAAM,OAAO,SAAS;AAC7B,aAAO,MAAM;AAAA,IACf;AAAA,EACF;AAEA,QAAM,aAAa,IAAI,WAAW,YAAY,EAAE,SAAS,KAAK,KAAK,IAAI,WAAW,YAAY,EAAE,SAAS,OAAO,KAAK,IAAI,WAAW,YAAY,EAAE,SAAS,QAAQ,KAAK,IAAI,WAAW,YAAY,EAAE,SAAS,SAAS,KAAK,IAAI,eAAe;AAE/O,MAAI,YAAY;AAEd,UAAM,UAAUH,cAAa,QAAQ,OAAO;AAC5C,YAAQ,QAAQ;AAChB,YAAQ,SAAS;AACjB,UAAM,OAAOC,oBAAmB,OAAO;AAEvC,QAAI,MAAM;AACR,WAAK,OAAO;AACZ,WAAK,YAAY;AACjB,WAAK,eAAe;AAEpB,YAAM,OAAO,iBAAiB,KAAK,SAAS,MAAM,WAAW,MAAM,YAAY,UAAU,SAAS,EAAE;AAGpG,WAAK,YAAY;AACjB,YAAM,mBAAoB,KAAa,iBAAiB;AACxD,UAAI,kBAAkB,GAAG;AACvB,QAAC,KAAa,gBAAgB,GAAG,aAAa;AAAA,MAChD;AAEA,YAAM,QAAQ,CAAC,MAAM,UAAU;AAC7B,cAAM,KAAK,SAAS,QAAQ;AAC5B,aAAK,SAAS,MAAM,QAAQ,EAAE;AAAA,MAChC,CAAC;AAGD,YAAM,QAAQ,KAAK,IAAI,GAAG,KAAK,MAAM,OAAO,EAAE,CAAC;AAC/C,YAAM,QAAQ,KAAK,IAAI,SAAS,GAAG,KAAK,KAAK,OAAO,EAAE,CAAC;AACvD,YAAM,QAAQ,KAAK,IAAI,GAAG,KAAK,MAAM,OAAO,EAAE,CAAC;AAC/C,YAAM,QAAQ,KAAK,IAAI,UAAU,GAAG,KAAK,KAAK,OAAO,EAAE,CAAC;AAExD,YAAM,QAAQ,QAAQ;AACtB,YAAM,QAAQ,QAAQ;AAEtB,UAAI,QAAQ,KAAK,QAAQ,GAAG;AAC1B,cAAM,UAAU,KAAK,aAAa,OAAO,OAAO,OAAO,KAAK;AAC5D,cAAM,OAAO,QAAQ;AAErB,cAAM,WAAW,CAAC,QAAgB,WAAmB;AACnD,cAAI,SAAS,KAAK,UAAU,SAAS,SAAS,KAAK,UAAU,MAAO,QAAO;AAC3E,gBAAM,OAAO,SAAS,QAAQ,UAAU;AACxC,iBAAO,KAAK,MAAM,CAAC,IAAI;AAAA,QACzB;AAEA,cAAM,WAAuC,CAAC;AAC9C,cAAM,cAA0C,CAAC;AACjD,cAAM,gBAA4C,CAAC;AACnD,cAAM,eAA2C,CAAC;AAElD,iBAAS,IAAI,GAAG,IAAI,QAAQ,GAAG,KAAK,GAAG;AACrC,mBAAS,IAAI,GAAG,IAAI,QAAQ,GAAG,KAAK,GAAG;AACrC,gBAAI,SAAS,GAAG,CAAC,GAAG;AAClB,oBAAM,YAAY,CAAC,SAAS,IAAI,GAAG,CAAC;AACpC,oBAAM,aAAa,CAAC,SAAS,IAAI,GAAG,CAAC;AACrC,oBAAM,WAAW,CAAC,SAAS,GAAG,IAAI,CAAC;AACnC,oBAAM,cAAc,CAAC,SAAS,GAAG,IAAI,CAAC;AAEtC,kBAAI,UAAU;AACZ,yBAAS,KAAK,EAAE,GAAG,QAAQ,GAAG,GAAG,QAAQ,EAAE,CAAC;AAAA,cAC9C,WAAW,aAAa;AACtB,4BAAY,KAAK,EAAE,GAAG,QAAQ,GAAG,GAAG,QAAQ,EAAE,CAAC;AAAA,cACjD,WAAW,aAAa,YAAY;AAClC,8BAAc,KAAK,EAAE,GAAG,QAAQ,GAAG,GAAG,QAAQ,EAAE,CAAC;AAAA,cACnD,OAAO;AACL,oBAAI,KAAK,IAAI,MAAM;AACjB,+BAAa,KAAK,EAAE,GAAG,QAAQ,GAAG,GAAG,QAAQ,EAAE,CAAC;AAAA,gBAClD;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAEA,aAAK,cAAc;AACnB,aAAK,YAAY;AAGjB,cAAM,gBAAgB;AACtB,iBAAS,IAAI,GAAG,IAAI,SAAS,QAAQ,KAAK,eAAe;AACvD,gBAAM,KAAK,SAAS,CAAC;AACrB,gBAAM,IAAI,YAAY,OAAO,KAAK,IAAI;AACtC,gBAAM,IAAI,MAAM,KAAK,IAAI;AACzB,gBAAM,cAAc,IAAI;AAExB,eAAK,UAAU;AACf,eAAK,OAAO,GAAG,IAAI,IAAI,GAAG,GAAG,CAAC;AAC9B,eAAK,OAAO,GAAG,IAAI,IAAI,GAAG,GAAG,CAAC;AAC9B,eAAK,OAAO,GAAG,IAAI,aAAa,GAAG,IAAI,CAAC;AACxC,eAAK,UAAU;AACf,eAAK,KAAK;AAAA,QACZ;AAGA,cAAM,mBAAmB;AACzB,iBAAS,IAAI,GAAG,IAAI,YAAY,QAAQ,KAAK,kBAAkB;AAC7D,gBAAM,KAAK,YAAY,CAAC;AACxB,gBAAM,IAAI,YAAY,OAAO,KAAK,IAAI;AACtC,gBAAM,IAAI,MAAM,KAAK,IAAI;AACzB,gBAAM,cAAc,CAAC,IAAI;AAEzB,eAAK,UAAU;AACf,eAAK,OAAO,GAAG,IAAI,IAAI,GAAG,GAAG,CAAC;AAC9B,eAAK,OAAO,GAAG,IAAI,IAAI,GAAG,GAAG,CAAC;AAC9B,eAAK,OAAO,GAAG,IAAI,aAAa,GAAG,IAAI,CAAC;AACxC,eAAK,UAAU;AACf,eAAK,KAAK;AAAA,QACZ;AAGA,cAAM,qBAAqB;AAC3B,iBAAS,IAAI,GAAG,IAAI,cAAc,QAAQ,KAAK,oBAAoB;AACjE,gBAAM,KAAK,cAAc,CAAC;AAC1B,gBAAM,IAAI,MAAM,KAAK,IAAI;AACzB,eAAK,UAAU;AACf,eAAK,IAAI,GAAG,KAAK,KAAK,IAAI,OAAO,KAAK,GAAG,KAAK,KAAK,IAAI,OAAO,KAAK,GAAG,GAAG,KAAK,KAAK,CAAC;AACpF,eAAK,KAAK;AAAA,QACZ;AAGA,cAAM,gBAAgB,KAAK,MAAM,WAAW,GAAG;AAC/C,iBAAS,IAAI,GAAG,IAAI,eAAe,KAAK;AACtC,gBAAM,KAAK,cAAc,KAAK,MAAM,KAAK,IAAI,cAAc,MAAM,CAAC,KAAK,SAAS,KAAK,MAAM,KAAK,IAAI,SAAS,MAAM,CAAC;AACpH,cAAI,IAAI;AACN,kBAAM,OAAO,IAAI,KAAK,KAAK,WAAW;AACtC,kBAAM,QAAQ,KAAK,IAAI,KAAK,KAAK;AACjC,kBAAM,KAAK,GAAG,IAAI,KAAK,IAAI,KAAK,IAAI;AACpC,kBAAM,KAAK,GAAG,IAAI,KAAK,IAAI,KAAK,IAAI;AAEpC,kBAAM,OAAO,MAAM,KAAK,IAAI;AAC5B,iBAAK,cAAc,OAAO,KAAK,IAAI;AAEnC,iBAAK,UAAU;AACf,iBAAK,IAAI,IAAI,IAAI,MAAM,GAAG,KAAK,KAAK,CAAC;AACrC,iBAAK,KAAK;AACV,iBAAK,cAAc;AAAA,UACrB;AAAA,QACF;AAGA,aAAK,KAAK;AACV,aAAK,2BAA2B;AAChC,cAAM,eAAe,KAAK,MAAM,WAAW,IAAI;AAC/C,iBAAS,IAAI,GAAG,IAAI,cAAc,KAAK;AACrC,gBAAM,KAAK,aAAa,KAAK,MAAM,KAAK,IAAI,aAAa,MAAM,CAAC;AAChE,cAAI,IAAI;AACN,kBAAM,MAAM,YAAY,OAAO,KAAK,IAAI;AACxC,kBAAM,QAAQ,CAAC,KAAK,KAAK,OAAO,KAAK,IAAI,OAAO;AAChD,iBAAK,YAAY,MAAM,KAAK,IAAI;AAChC,iBAAK,cAAc,MAAM,KAAK,IAAI;AAElC,iBAAK,UAAU;AACf,iBAAK,OAAO,GAAG,IAAI,KAAK,IAAI,KAAK,KAAK,MAAM,IAAI,GAAG,IAAI,KAAK,IAAI,KAAK,KAAK,MAAM,EAAE;AAClF,iBAAK,OAAO,GAAG,IAAI,KAAK,IAAI,KAAK,KAAK,MAAM,IAAI,GAAG,IAAI,KAAK,IAAI,KAAK,KAAK,MAAM,EAAE;AAClF,iBAAK,OAAO;AAAA,UACd;AAAA,QACF;AACA,aAAK,QAAQ;AAAA,MACf;AAEA,MAAC,KAAa,gBAAgB;AAG9B,UAAI,KAAK;AACT,YAAM,aAAaD,cAAa,QAAQ,OAAO;AAC/C,iBAAW,QAAQ;AACnB,iBAAW,SAAS;AACpB,YAAM,UAAUC,oBAAmB,UAAU;AAC7C,UAAI,SAAS;AACX,gBAAQ,UAAU,SAAS,GAAG,CAAC;AAC/B,gBAAQ,2BAA2B;AACnC,gBAAQ,YAAY;AACpB,gBAAQ,SAAS,GAAG,GAAG,QAAQ,OAAO;AACtC,YAAI,UAAU,YAAY,GAAG,CAAC;AAAA,MAChC;AACA,UAAI,QAAQ;AAAA,IACd;AAAA,EACF,OAAO;AACL,QAAI,KAAK;AACT,QAAI,aAAa,QAAQ;AACvB,UAAI,kBAAkB,aAAa,SAAS;AAC1C,oBAAY,QAAQ,QAAW,GAAG,GAAG,EAAE,aAAa,KAAK,CAAC;AAAA,MAC5D,OAAO;AACL,oBAAY,QAAQ,QAAQ;AAAA,MAC9B;AAAA,IACF;AACA,QAAI,QAAQ;AAAA,EACd;AAGA,MAAI,iBAAiB,cAAc,KAAK,mBAAmB,UAAU;AACnE,gBAAY;AAAA,EACd;AAMA,aAAW,QAAQ,CAACH,WAAU;AAC5B,QAAIA,OAAM,WAAWA,OAAM,SAAS,WAAWA,OAAM,UAAU,GAAG;AAChE,UAAI,KAAK;AACT,UAAI,2BAA2B;AAC/B,YAAM,cAAc,KAAK,IAAI,GAAG,KAAK,IAAI,IAAIA,OAAM,YAAY,CAAC,CAAC;AACjE,eAAS,IAAI,GAAG,IAAI,aAAa,KAAK;AACpC,8BAAsB,QAAQA,OAAM,OAAOA,OAAM,MAAM,GAAG,GAAGA,OAAM,SAAS,eAAeA,OAAM,UAAU,CAAC;AAAA,MAC9G;AACA,UAAI,QAAQ;AAAA,IACd;AAAA,EACF,CAAC;AAGD,MAAI,iBAAiB,eAAe,WAAW,gBAAgB,GAAG;AAChE,QAAI,KAAK;AACT,QAAI,2BAA2B;AAG/B,0BAAsB,QAAQ,aAAa,YAAY,eAAe,eAAe,eAAe,aAAa;AACjH,QAAI,QAAQ;AAAA,EACd;AAKA,MAAI,UAAU;AACZ,QAAI,KAAK;AACT,QAAI,2BAA2B;AAC/B,QAAI,cAAc;AAClB,QAAI,YAAY;AAChB,aAAS,KAAK,MAAM,KAAK,MAAM,MAAM,GAAG;AACtC,UAAI,UAAU;AACd,UAAI,OAAO,OAAO,IAAI,EAAE;AACxB,UAAI,OAAO,OAAO,IAAI,EAAE;AACxB,UAAI,OAAO;AAAA,IACb;AACA,QAAI,QAAQ;AAAA,EACd;AACF;AAEO,IAAM,qBAAN,MAAyB;AAAA,EAC9B,OAAc,KAAK,KAAmE,KAAuB,QAAQ,GAAS;AAC5H,yBAAqB,KAAK,GAAG;AAAA,EAC/B;AACF;;;AC/gDO,IAAM,gBAAkC;AAAA,EAC7C,MAAM;AAAA,EACN,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,UAAU;AAAA,EACV,eAAe;AAAA,EACf,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,WAAW;AAAA,EACX,mBAAmB;AAAA,EACnB,mBAAmB;AAAA,IACjB,EAAE,OAAO,WAAW,QAAQ,EAAE;AAAA,IAC9B,EAAE,OAAO,WAAW,QAAQ,IAAI;AAAA,EAClC;AAAA,EACA,eAAe;AAAA,EACf,aAAa;AAAA,EACb,aAAa;AAAA,EACb,gBAAgB;AAAA,EAChB,eAAe;AAAA,EACf,gBAAgB;AAAA,EAChB,YAAY;AAAA,IACV,EAAE,SAAS,OAAO,OAAO,WAAW,MAAM,IAAI,SAAS,IAAI,MAAM,QAAQ;AAAA,IACzE,EAAE,SAAS,OAAO,OAAO,WAAW,MAAM,IAAI,SAAS,IAAI,MAAM,QAAQ;AAAA,IACzE,EAAE,SAAS,OAAO,OAAO,WAAW,MAAM,IAAI,SAAS,IAAI,MAAM,QAAQ;AAAA,EAC3E;AAAA,EACA,eAAe;AAAA,EACf,aAAa;AAAA,EACb,YAAY;AAAA,EACZ,eAAe;AAAA,EACf,eAAe;AAAA,EACf,eAAe;AAAA,EACf,YAAY;AAAA,EACZ,cAAc;AAAA,EACd,YAAY;AAAA,EACZ,gBAAgB;AAAA,EAChB,aAAa;AAAA,EACb,gBAAgB;AAAA,EAChB,gBAAgB;AAAA,EAChB,gBAAgB;AAAA,EAChB,gBAAgB;AAAA,EAChB,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,yBAAyB;AAAA,EACzB,sBAAsB;AAAA,EACtB,sBAAsB;AAAA,EACtB,kBAAkB;AAAA,EAClB,cAAc;AAAA,EACd,YAAY;AAAA,EACZ,cAAc;AAAA,EACd,cAAc;AAAA,EACd,mBAAmB;AAAA,EACnB,aAAa;AAAA,EACb,aAAa;AAAA,EACb,aAAa;AAAA,EACb,aAAa;AAAA,EACb,cAAc;AAAA,EACd,YAAY;AAAA,EACZ,cAAc;AAAA,EACd,aAAa;AAAA,EACb,eAAe;AAAA,EACf,eAAe;AAAA,EACf,oBAAoB;AAAA,EACpB,kBAAkB;AAAA,EAClB,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,cAAc;AAAA,EACd,UAAU;AAAA,EACV,UAAU;AAAA,EACV,UAAU;AAAA,EACV,aAAa;AAAA;AAAA,EAGb,UAAU;AAAA,EACV,gBAAgB;AAAA,EAChB,iBAAiB;AAAA,EACjB,UAAU;AAAA,EACV,eAAe;AAAA,EACf,cAAc;AAAA,EACd,OAAO;AACT;AAEO,IAAM,iBAA2B;AAAA,EACtC;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,QAAQ;AAAA,MACN,GAAG;AAAA,MACH,MAAM;AAAA,MACN,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,WAAW;AAAA,MACX,UAAU;AAAA,MACV,eAAe;AAAA,MACf,YAAY;AAAA,MACZ,UAAU;AAAA,MACV,mBAAmB;AAAA,MACnB,mBAAmB;AAAA,QACjB,EAAE,OAAO,WAAW,QAAQ,EAAE;AAAA,QAC9B,EAAE,OAAO,WAAW,QAAQ,IAAI;AAAA,MAClC;AAAA,MACA,eAAe;AAAA,MACf,aAAa;AAAA,MACb,aAAa;AAAA,MACb,gBAAgB;AAAA,MAChB,YAAY;AAAA,MACZ,gBAAgB;AAAA,MAChB,eAAe;AAAA,MACf,cAAc;AAAA,MACd,YAAY;AAAA,MACZ,gBAAgB;AAAA,MAChB,gBAAgB;AAAA,MAChB,gBAAgB;AAAA,MAChB,aAAa;AAAA,MACb,eAAe;AAAA,MACf,aAAa;AAAA,MACb,YAAY;AAAA,MACZ,eAAe;AAAA,MACf,eAAe;AAAA,MACf,eAAe;AAAA,MACf,YAAY;AAAA,IACd;AAAA,EACF;AAAA,EAEA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,QAAQ;AAAA,MACN,GAAG;AAAA,MACH,MAAM;AAAA,MACN,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,WAAW;AAAA,MACX,UAAU;AAAA,MACV,eAAe;AAAA,MACf,YAAY;AAAA,MACZ,UAAU;AAAA,MACV,mBAAmB;AAAA,MACnB,mBAAmB;AAAA,QACjB,EAAE,OAAO,WAAW,QAAQ,EAAE;AAAA,QAC9B,EAAE,OAAO,WAAW,QAAQ,GAAG;AAAA,QAC/B,EAAE,OAAO,WAAW,QAAQ,GAAG;AAAA,QAC/B,EAAE,OAAO,WAAW,QAAQ,GAAG;AAAA,QAC/B,EAAE,OAAO,WAAW,QAAQ,IAAI;AAAA,MAClC;AAAA,MACA,eAAe;AAAA,MACf,aAAa;AAAA,MACb,aAAa;AAAA,MACb,gBAAgB;AAAA,MAChB,YAAY;AAAA,MACZ,eAAe;AAAA,MACf,YAAY,CAAC,EAAE,SAAS,MAAM,OAAO,WAAW,MAAM,IAAI,SAAS,IAAI,MAAM,QAAQ,CAAC;AAAA,MACtF,cAAc;AAAA,MACd,YAAY;AAAA,MACZ,gBAAgB;AAAA,MAChB,gBAAgB;AAAA,MAChB,gBAAgB;AAAA,MAChB,aAAa;AAAA,MACb,eAAe;AAAA,MACf,aAAa;AAAA,MACb,YAAY;AAAA,MACZ,eAAe;AAAA,MACf,eAAe;AAAA,MACf,eAAe;AAAA,MACf,YAAY;AAAA,IACd;AAAA,EACF;AAAA,EAEA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,QAAQ;AAAA,MACN,GAAG;AAAA,MACH,MAAM;AAAA,MACN,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,WAAW;AAAA,MACX,UAAU;AAAA,MACV,eAAe;AAAA,MACf,YAAY;AAAA,MACZ,UAAU;AAAA,MACV,mBAAmB;AAAA,MACnB,mBAAmB;AAAA,QACjB,EAAE,OAAO,WAAW,QAAQ,EAAE;AAAA,QAC9B,EAAE,OAAO,WAAW,QAAQ,IAAI;AAAA,MAClC;AAAA,MACA,eAAe;AAAA,MACf,aAAa;AAAA,MACb,aAAa;AAAA,MACb,gBAAgB;AAAA,MAChB,eAAe;AAAA,MACf,gBAAgB;AAAA,MAChB,eAAe;AAAA,MACf,aAAa;AAAA,MACb,YAAY;AAAA,MACZ,eAAe;AAAA,MACf,eAAe;AAAA,MACf,eAAe;AAAA,MACf,YAAY;AAAA,IACd;AAAA,EACF;AAAA,EAEA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,QAAQ;AAAA,MACN,GAAG;AAAA,MACH,MAAM;AAAA,MACN,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,WAAW;AAAA,MACX,UAAU;AAAA,MACV,eAAe;AAAA,MACf,YAAY;AAAA,MACZ,UAAU;AAAA,MACV,eAAe;AAAA,MACf,aAAa;AAAA,MACb,aAAa;AAAA,MACb,gBAAgB;AAAA,MAChB,eAAe;AAAA,MACf,gBAAgB;AAAA,MAChB,YAAY;AAAA,QACV,EAAE,SAAS,MAAM,OAAO,WAAW,MAAM,IAAI,SAAS,KAAK,MAAM,QAAQ;AAAA,QACzE,EAAE,SAAS,MAAM,OAAO,WAAW,MAAM,IAAI,SAAS,IAAI,MAAM,QAAQ;AAAA,QACxE,EAAE,SAAS,MAAM,OAAO,WAAW,MAAM,IAAI,SAAS,IAAI,MAAM,QAAQ;AAAA,MAC1E;AAAA,MACA,eAAe;AAAA,IACjB;AAAA,EACF;AAAA,EAEA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,QAAQ;AAAA,MACN,GAAG;AAAA,MACH,MAAM;AAAA,MACN,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,WAAW;AAAA,MACX,UAAU;AAAA,MACV,eAAe;AAAA,MACf,YAAY;AAAA,MACZ,UAAU;AAAA,MACV,WAAW;AAAA,MACX,eAAe;AAAA,MACf,aAAa;AAAA,MACb,aAAa;AAAA,MACb,gBAAgB;AAAA,MAChB,eAAe;AAAA,MACf,gBAAgB;AAAA,MAChB,eAAe;AAAA,MACf,aAAa;AAAA,MACb,YAAY;AAAA,MACZ,eAAe;AAAA,MACf,eAAe;AAAA,MACf,eAAe;AAAA,MACf,YAAY;AAAA,IACd;AAAA,EACF;AAAA,EAEA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,QAAQ;AAAA,MACN,GAAG;AAAA,MACH,MAAM;AAAA,MACN,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,WAAW;AAAA,MACX,UAAU;AAAA,MACV,eAAe;AAAA,MACf,YAAY;AAAA,MACZ,UAAU;AAAA,MACV,WAAW;AAAA,MACX,eAAe;AAAA,MACf,aAAa;AAAA,MACb,aAAa;AAAA,MACb,gBAAgB;AAAA,MAChB,eAAe;AAAA,MACf,gBAAgB;AAAA,MAChB,YAAY;AAAA,QACV,EAAE,SAAS,MAAM,OAAO,WAAW,MAAM,GAAG,SAAS,KAAK,MAAM,SAAS,UAAU,GAAG,QAAQ,EAAE;AAAA,QAChG,EAAE,SAAS,OAAO,OAAO,WAAW,MAAM,IAAI,SAAS,IAAI,MAAM,QAAQ;AAAA,QACzE,EAAE,SAAS,OAAO,OAAO,WAAW,MAAM,IAAI,SAAS,IAAI,MAAM,QAAQ;AAAA,MAC3E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAUA,eAAe;AAAA,MACf,aAAa;AAAA,MACb,YAAY;AAAA,MACZ,eAAe;AAAA,MACf,eAAe;AAAA,MACf,eAAe;AAAA,MACf,YAAY;AAAA,IACd;AAAA,EACF;AACF;;;ACjTA,IAAM,gBAA+B;AAAA;AAAA,EAEnC,EAAE,aAAa,mBAAmB,gBAAgB,WAAW,QAAQ,KAAK,OAAO,SAAS;AAAA,EAC1F,EAAE,aAAa,gBAAgB,gBAAgB,WAAW,QAAQ,KAAK,OAAO,SAAS;AAAA,EACvF,EAAE,aAAa,kBAAkB,gBAAgB,WAAW,QAAQ,KAAK,OAAO,SAAS;AAAA,EACzF,EAAE,aAAa,sBAAsB,gBAAgB,WAAW,QAAQ,KAAK,OAAO,SAAS;AAAA;AAAA,EAG7F,EAAE,aAAa,sBAAsB,gBAAgB,cAAc,QAAQ,KAAK,OAAO,SAAS;AAAA,EAChG,EAAE,aAAa,mBAAmB,gBAAgB,cAAc,QAAQ,KAAK,OAAO,SAAS;AAAA,EAC7F,EAAE,aAAa,wBAAwB,gBAAgB,cAAc,QAAQ,KAAK,OAAO,SAAS;AAAA,EAClG,EAAE,aAAa,oBAAoB,gBAAgB,cAAc,QAAQ,KAAK,OAAO,SAAS;AAAA,EAC9F,EAAE,aAAa,qBAAqB,gBAAgB,cAAc,QAAQ,KAAK,OAAO,SAAS;AAAA,EAC/F,EAAE,aAAa,yBAAyB,gBAAgB,cAAc,QAAQ,KAAK,OAAO,SAAS;AAAA,EACnG,EAAE,aAAa,8BAA8B,gBAAgB,cAAc,QAAQ,KAAK,OAAO,SAAS;AAAA,EACxG,EAAE,aAAa,0BAA0B,gBAAgB,cAAc,QAAQ,KAAK,OAAO,SAAS;AAAA;AAAA,EAGpG,EAAE,aAAa,SAAS,gBAAgB,SAAS,QAAQ,KAAK,OAAO,SAAS;AAAA,EAC9E,EAAE,aAAa,cAAc,gBAAgB,SAAS,QAAQ,KAAK,OAAO,SAAS;AAAA,EACnF,EAAE,aAAa,gBAAgB,gBAAgB,SAAS,QAAQ,KAAK,OAAO,SAAS;AAAA,EACrF,EAAE,aAAa,oBAAoB,gBAAgB,SAAS,QAAQ,KAAK,OAAO,SAAS;AAC3F;AAMO,SAAS,yBAA+B;AAE7C,MAAI,SAAS,eAAe,sBAAsB,GAAG;AACnD;AAAA,EACF;AAEA,QAAM,QAAQ,SAAS,cAAc,OAAO;AAC5C,QAAM,KAAK;AAEX,MAAI,MAAM;AAEV,gBAAc,QAAQ,CAAC,YAAY;AACjC,WAAO;AAAA;AAAA,kBAEO,QAAQ,WAAW;AAAA,gBACrB,QAAQ,cAAc;AAAA,iBACrB,QAAQ,MAAM;AAAA,gBACf,QAAQ,KAAK;AAAA;AAAA;AAAA;AAAA,EAI3B,CAAC;AAED,QAAM,cAAc;AACpB,WAAS,KAAK,YAAY,KAAK;AAE/B,UAAQ,IAAI,mDAA8C;AAC5D;AAKA,eAAsB,uBAAsC;AAC1D,MAAI;AAEF,UAAM,cAAc;AACpB,QAAI,CAAC,SAAS,eAAe,WAAW,KAAK,SAAS,MAAM;AAC1D,YAAM,YAAY,SAAS,cAAc,KAAK;AAC9C,gBAAU,KAAK;AACf,gBAAU,MAAM,WAAW;AAC3B,gBAAU,MAAM,UAAU;AAC1B,gBAAU,MAAM,gBAAgB;AAChC,gBAAU,MAAM,SAAS;AAEzB,YAAM,eAAe;AAAA,QACnB,EAAE,QAAQ,WAAW,QAAQ,KAAK,OAAO,SAAS;AAAA,QAClD,EAAE,QAAQ,WAAW,QAAQ,KAAK,OAAO,SAAS;AAAA,QAClD,EAAE,QAAQ,WAAW,QAAQ,KAAK,OAAO,SAAS;AAAA,QAClD,EAAE,QAAQ,WAAW,QAAQ,KAAK,OAAO,SAAS;AAAA,QAClD,EAAE,QAAQ,cAAc,QAAQ,KAAK,OAAO,SAAS;AAAA,QACrD,EAAE,QAAQ,cAAc,QAAQ,KAAK,OAAO,SAAS;AAAA,QACrD,EAAE,QAAQ,cAAc,QAAQ,KAAK,OAAO,SAAS;AAAA,QACrD,EAAE,QAAQ,cAAc,QAAQ,KAAK,OAAO,SAAS;AAAA,QACrD,EAAE,QAAQ,cAAc,QAAQ,KAAK,OAAO,SAAS;AAAA,QACrD,EAAE,QAAQ,cAAc,QAAQ,KAAK,OAAO,SAAS;AAAA,QACrD,EAAE,QAAQ,cAAc,QAAQ,KAAK,OAAO,SAAS;AAAA,QACrD,EAAE,QAAQ,cAAc,QAAQ,KAAK,OAAO,SAAS;AAAA,MACvD;AAEA,mBAAa,QAAQ,CAAC,SAAS;AAC7B,cAAM,OAAO,SAAS,cAAc,MAAM;AAC1C,aAAK,MAAM,aAAa,IAAI,KAAK,MAAM;AACvC,aAAK,MAAM,aAAa,OAAO,KAAK,MAAM;AAC1C,aAAK,MAAM,YAAY,KAAK;AAC5B,aAAK,YAAY;AACjB,kBAAU,YAAY,IAAI;AAAA,MAC5B,CAAC;AAED,eAAS,KAAK,YAAY,SAAS;AAAA,IACrC;AAGA,UAAM,SAAS,MAAM,KAAK,kBAAkB;AAC5C,UAAM,SAAS,MAAM,KAAK,kBAAkB;AAC5C,UAAM,SAAS,MAAM,KAAK,yBAAyB;AACnD,UAAM,SAAS,MAAM,KAAK,yBAAyB;AAGnD,UAAM,SAAS,MAAM,KAAK,qBAAqB;AAC/C,UAAM,SAAS,MAAM,KAAK,qBAAqB;AAC/C,UAAM,SAAS,MAAM,KAAK,qBAAqB;AAC/C,UAAM,SAAS,MAAM,KAAK,qBAAqB;AAC/C,UAAM,SAAS,MAAM,KAAK,4BAA4B;AACtD,UAAM,SAAS,MAAM,KAAK,4BAA4B;AACtD,UAAM,SAAS,MAAM,KAAK,4BAA4B;AACtD,UAAM,SAAS,MAAM,KAAK,4BAA4B;AAGtD,2BAAuB;AAEvB,YAAQ,IAAI,uDAAkD;AAAA,EAChE,SAAS,OAAO;AACd,YAAQ,KAAK,uCAA6B,KAAK;AAE/C,2BAAuB;AAAA,EACzB;AACF;AAKO,SAAS,iBAAiB,aAA8B;AAE7D,QAAM,SAAS,SAAS,cAAc,QAAQ;AAC9C,QAAM,MAAM,OAAO,WAAW,IAAI;AAClC,MAAI,CAAC,IAAK,QAAO;AAEjB,MAAI,OAAO,SAAS,WAAW;AAC/B,QAAM,UAAU,IAAI,YAAY,MAAM;AAGtC,SAAO,QAAQ,QAAQ;AACzB;;;ACzJO,IAAM,gBAAgB;AAQtB,IAAM,oBAAsC,CAAC,KAAK;AAElD,IAAM,sBAAsD;AAAA,EACjE,gBAAgB;AAClB;AAEO,IAAM,sBAAsD;AAAA,EACjE,KAAK;AACP;AAuFO,SAAS,iBAAiB,WAAmD;AAClF,SAAO;AAAA,IACL,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,QAAQ,EAAE,OAAO,KAAK,QAAQ,KAAK,YAAY,cAAc;AAAA,IAC7D,MAAM;AAAA,MACJ,SAAS;AAAA,MACT,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,WAAW;AAAA,MACX,UAAU;AAAA,MACV,eAAe;AAAA,MACf,YAAY;AAAA,MACZ,UAAU;AAAA,MACV,UAAU;AAAA,IACZ;AAAA,IACA,cAAc,CAAC;AAAA,IACf,gBAAgB;AAAA,IAChB,YAAY,EAAE,MAAM,GAAG,OAAO,GAAG,gBAAgB,IAAI;AAAA,IACrD,UAAU,EAAE,UAAU,GAAG,KAAK,IAAI,MAAM,MAAM,QAAQ,CAAC,EAAE;AAAA,IACzD,GAAG;AAAA,EACL;AACF;AAEO,SAAS,aAAqB;AACnC,SAAO,SAAS,KAAK,IAAI,EAAE,SAAS,EAAE,CAAC,IAAI,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,GAAG,CAAC,CAAC;AACnF;;;AC/HO,SAAS,sBAAsB,KAAmC;AACvE,MAAI,IAAI,SAAS,OAAO,SAAS,EAAG,QAAO;AAE3C,QAAM,cAAc,IAAI,aAAa,KAAK,CAAC,MAAM,EAAE,SAAS,QAAQ;AACpE,QAAM,YAAY,IAAI,aAAa,KAAK,CAAC,MAAM,EAAE,SAAS,MAAM;AAEhE,QAAM,SAA8C,CAAC;AAErD,MAAI,aAAa;AACf,WAAO,KAAK;AAAA,MACV,SAAS,YAAY;AAAA,MACrB,WAAW;AAAA,MACX,WAAW;AAAA,QACT,EAAE,MAAM,GAAG,OAAQ,YAAY,OAAO,iBAA4B,GAAG,QAAQ,YAAY;AAAA,QACzF;AAAA,UACE,MAAM,IAAI,SAAS,WAAW;AAAA,UAC9B,QAAS,YAAY,OAAO,iBAA4B,KAAK;AAAA,UAC7D,QAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,MAAM,IAAI,SAAS;AAAA,UACnB,OAAQ,YAAY,OAAO,iBAA4B;AAAA,UACvD,QAAQ;AAAA,QACV;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AAEA,MAAI,WAAW;AACb,WAAO,KAAK;AAAA,MACV,SAAS,UAAU;AAAA,MACnB,WAAW;AAAA,MACX,WAAW;AAAA,QACT,EAAE,MAAM,GAAG,OAAO,GAAG,QAAQ,UAAU;AAAA,QACvC,EAAE,MAAM,IAAI,SAAS,WAAW,MAAM,OAAO,GAAG,QAAQ,UAAU;AAAA,MACpE;AAAA,IACF,CAAC;AACD,cAAU,UAAU;AAAA,EACtB;AAEA,SAAO;AAAA,IACL,GAAG;AAAA,IACH,cAAc,IAAI,aAAa,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,EAAE;AAAA,IACpD,UAAU,EAAE,GAAG,IAAI,UAAU,OAAO;AAAA,EACtC;AACF;AAEO,SAAS,qBAAqB,KAAmC;AACtE,QAAM,QAAQ,oBAAI,IAAoB;AACtC,QAAM,eAAe,IAAI,aAAa,IAAI,CAAC,MAAM;AAC/C,UAAM,KAAK,WAAW;AACtB,UAAM,IAAI,EAAE,IAAI,EAAE;AAClB,WAAO,EAAE,GAAG,GAAG,IAAI,QAAQ,EAAE,GAAG,EAAE,OAAO,EAAE;AAAA,EAC7C,CAAC;AACD,QAAM,SAAS,IAAI,SAAS,OAAO,IAAI,CAAC,OAAO;AAAA,IAC7C,GAAG;AAAA,IACH,SAAS,MAAM,IAAI,EAAE,OAAO,KAAK,EAAE;AAAA,IACnC,WAAW,EAAE,UAAU,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,EAAE;AAAA,EAC9C,EAAE;AACF,SAAO,EAAE,GAAG,KAAK,cAAc,UAAU,EAAE,GAAG,IAAI,UAAU,OAAO,EAAE;AACvE;;;AC3DA,SAAS,MAAM,MAA2B,MAAc,QAAiC,OAA2C;AAClI,SAAO;AAAA,IACL,IAAI,WAAW;AAAA,IACf;AAAA,IACA;AAAA,IACA,SAAS;AAAA,IACT,SAAS;AAAA,IACT,WAAW;AAAA,IACX,QAAQ,SAAS,UAAU,UAAU;AAAA,IACrC;AAAA,IACA,GAAG;AAAA,EACL;AACF;AAEO,SAAS,sBAAsB,KAA8C;AAClF,MAAI,CAAC,IAAI,eAAgB,QAAO;AAChC,SAAO,oBAAoB,IAAI,cAAc,KAAK;AACpD;AAGO,SAAS,wBAAwB,KAAsC;AAC5E,QAAM,WAAW,sBAAsB,GAAG;AAC1C,QAAM,SAAwB,CAAC;AAE/B,MAAI,UAAU;AACZ,WAAO;AAAA,MACL;AAAA,QACE;AAAA,QACA;AAAA,QACA,EAAE,SAAS;AAAA,QACX;AAAA,UACE,SAAS;AAAA,UACT,QAAQ;AAAA,QACV;AAAA,MACF;AAAA,IACF;AACA,WAAO;AAAA,MACL;AAAA,QACE;AAAA,QACA;AAAA,QACA,EAAE,GAAG,oBAAoB,KAAK,QAAQ,EAAE;AAAA,QACxC;AAAA,UACE,SAAS;AAAA,UACT,QAAQ;AAAA,QACV;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,QACE,cAAc,IAAI;AAAA,QAClB,YAAY,IAAI;AAAA,QAChB,cAAc,IAAI;AAAA,QAClB,aAAa,IAAI;AAAA,QACjB,eAAe,IAAI;AAAA,QACnB,eAAe,IAAI;AAAA,QACnB,oBAAoB,IAAI;AAAA,QACxB,kBAAkB,IAAI;AAAA,QACtB,kBAAkB,IAAI;AAAA,MACxB;AAAA,MACA,EAAE,SAAS,IAAI,aAAa;AAAA,IAC9B;AAAA,EACF;AAEA,GAAC,IAAI,cAAc,CAAC,GAAG,QAAQ,CAAC,GAAc,MAAc;AAC1D,WAAO,KAAK,MAAM,QAAQ,QAAQ,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,SAAS,EAAE,SAAS,UAAU,EAAE,WAAW,OAAO,IAAI,CAAC,CAAC;AAAA,EACjH,CAAC;AAED,SAAO;AAAA,IACL;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,QACE,eAAe,IAAI;AAAA,QACnB,aAAa,IAAI;AAAA,QACjB,YAAY,IAAI;AAAA,QAChB,eAAe,IAAI;AAAA,QACnB,eAAe,IAAI;AAAA,QACnB,eAAe,IAAI;AAAA,QACnB,YAAY,IAAI;AAAA,MAClB;AAAA,MACA,EAAE,SAAS,IAAI,cAAc;AAAA,IAC/B;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,QACE,cAAc,IAAI;AAAA,QAClB,YAAY,IAAI;AAAA,QAChB,gBAAgB,IAAI;AAAA,QACpB,aAAa,IAAI;AAAA,QACjB,gBAAgB,IAAI;AAAA,QACpB,gBAAgB,IAAI;AAAA,QACpB,gBAAgB,IAAI;AAAA,QACpB,gBAAgB,IAAI;AAAA,QACpB,WAAW,IAAI;AAAA,QACf,gBAAgB,IAAI;AAAA,QACpB,yBAAyB,IAAI;AAAA,QAC7B,sBAAsB,IAAI;AAAA,QAC1B,sBAAsB,IAAI;AAAA,QAC1B,kBAAkB,IAAI;AAAA,MACxB;AAAA,MACA,EAAE,SAAS,IAAI,aAAa;AAAA,IAC9B;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,QACE,cAAc,IAAI;AAAA,QAClB,YAAY,IAAI;AAAA,QAChB,cAAc,IAAI;AAAA,QAClB,cAAc,IAAI;AAAA,QAClB,mBAAmB,IAAI;AAAA,QACvB,aAAa,IAAI;AAAA,QACjB,aAAa,IAAI;AAAA,QACjB,aAAa,IAAI;AAAA,QACjB,aAAa,IAAI;AAAA,MACnB;AAAA,MACA,EAAE,SAAS,CAAC,CAAC,IAAI,aAAa;AAAA,IAChC;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,QACE,eAAe,IAAI;AAAA,QACnB,aAAa,IAAI;AAAA,QACjB,aAAa,IAAI;AAAA,QACjB,gBAAgB,IAAI;AAAA,QACpB,eAAe,IAAI;AAAA,QACnB,gBAAgB,IAAI;AAAA,QACpB,YAAY,IAAI;AAAA,QAChB,YAAY,IAAI;AAAA,QAChB,sBAAsB,IAAI;AAAA,QAC1B,sBAAsB,IAAI;AAAA,QAC1B,iBAAiB,IAAI;AAAA,MACvB;AAAA,MACA,EAAE,SAAS,IAAI,cAAc;AAAA,IAC/B;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,QACE,UAAU,IAAI;AAAA,QACd,WAAW,IAAI;AAAA,QACf,mBAAmB,IAAI;AAAA,QACvB,mBAAmB,IAAI;AAAA,QACvB,aAAa,IAAI;AAAA,QACjB,oBAAoB,IAAI;AAAA,QACxB,gBAAgB,IAAI;AAAA,MACtB;AAAA,MACA,EAAE,SAAS,IAAI,aAAa,OAAO;AAAA,IACrC;AAAA,EACF;AAEA,SAAO,KAAK,MAAM,QAAQ,mBAAmB,EAAE,UAAU,aAAa,gBAAgB,EAAE,GAAG,EAAE,SAAS,MAAM,CAAC,CAAC;AAE9G,SAAO,KAAK,MAAM,UAAU,iBAAiB,EAAE,MAAM,GAAG,OAAO,EAAE,GAAG,EAAE,SAAS,OAAO,QAAQ,WAAW,CAAC,CAAC;AAE3G,QAAM,MAAqB;AAAA,IACzB,SAAS;AAAA,IACT,YAAY,IAAI;AAAA,IAChB,QAAQ;AAAA,MACN,OAAO,IAAI;AAAA,MACX,QAAQ,IAAI;AAAA,MACZ,YAAY;AAAA,IACd;AAAA,IACA,MAAM;AAAA,MACJ,SAAS,IAAI;AAAA,MACb,YAAY,IAAI;AAAA,MAChB,YAAY,IAAI;AAAA,MAChB,WAAW,IAAI;AAAA,MACf,UAAU,IAAI;AAAA,MACd,eAAe,IAAI;AAAA,MACnB,YAAY,IAAI;AAAA,MAChB,UAAU,IAAI;AAAA,MACd,UAAU,IAAI;AAAA,MACd,UAAU,IAAI,aAAa;AAAA,MAC3B,aAAa,CAAC,CAAC,IAAI;AAAA,MACnB,oBAAoB,IAAI;AAAA,MACxB,gBAAgB,IAAI;AAAA,IACtB;AAAA,IACA,cAAc;AAAA,IACd,gBAAgB;AAAA,IAChB,cAAc,WAAW,oBAAoB,KAAK,QAAQ,IAAI;AAAA,IAC9D,YAAY,EAAE,MAAM,GAAG,OAAO,GAAG,gBAAgB,IAAI;AAAA,IACrD,UAAU,EAAE,UAAU,GAAG,KAAK,IAAI,MAAM,MAAM,QAAQ,CAAC,EAAE;AAAA,IACzD,cAAc,EAAE,GAAG,IAAI;AAAA,EACzB;AAEA,SAAO,sBAAsB,GAAG;AAClC;AAEA,SAAS,oBAAoB,KAAuB,IAA6C;AAC/F,UAAQ,IAAI;AAAA,IACV,KAAK;AACH,aAAO;AAAA,QACL,UAAU,IAAI;AAAA,QACd,gBAAgB,IAAI;AAAA,QACpB,iBAAiB,IAAI;AAAA,QACrB,UAAU,IAAI;AAAA,QACd,eAAe,IAAI;AAAA,QACnB,cAAc,IAAI;AAAA,QAClB,OAAO,IAAI;AAAA,MACb;AAAA,IACF;AACE,aAAO,CAAC;AAAA,EACZ;AACF;AAEA,SAAS,eAAkD,KAAoB,MAA2B,QAAQ,GAAkB;AAClI,QAAM,QAAQ,IAAI,aAAa,OAAO,CAAC,MAAM,EAAE,SAAS,IAAI;AAC5D,SAAO,MAAM,KAAK,GAAG;AACvB;AAGO,SAAS,cAAc,KAAsC;AAClE,QAAM,OAAyB,IAAI,eAC/B,EAAE,GAAG,IAAI,aAAa,IACtB;AAAA,IACE,GAAG,uBAAuB,GAAG;AAAA,EAC/B;AAEJ,OAAK,aAAa,IAAI;AACtB,OAAK,OAAO,IAAI,KAAK;AACrB,OAAK,aAAa,IAAI,KAAK;AAC3B,OAAK,aAAa,IAAI,KAAK;AAC3B,OAAK,YAAY,IAAI,KAAK;AAC1B,OAAK,WAAW,IAAI,KAAK;AACzB,OAAK,gBAAgB,IAAI,KAAK;AAC9B,OAAK,aAAa,IAAI,KAAK;AAC3B,OAAK,WAAW,IAAI,KAAK;AACzB,OAAK,WAAW,IAAI,KAAK;AACzB,OAAK,WAAW,IAAI,KAAK,aAAa;AACtC,OAAK,cAAc,CAAC,CAAC,IAAI,KAAK;AAC9B,OAAK,cAAc,IAAI,OAAO;AAC9B,OAAK,eAAe,IAAI,OAAO;AAE/B,QAAM,QAAQ,eAAwC,KAAK,OAAO;AAClE,MAAI,OAAO;AACT,WAAO,OAAO,MAAM;AAAA,MAClB,cAAc,MAAM;AAAA,MACpB,YAAY,MAAM;AAAA,MAClB,cAAc,MAAM;AAAA,MACpB,aAAa,MAAM;AAAA,MACnB,eAAe,MAAM;AAAA,MACrB,eAAe,MAAM;AAAA,MACrB,oBAAoB,MAAM;AAAA,MAC1B,kBAAkB,MAAM;AAAA,MACxB,kBAAkB,MAAM;AAAA,IAC1B,CAAC;AAAA,EACH;AAEA,QAAM,QAAQ,IAAI,aAAa,OAAO,CAAC,MAAM,EAAE,SAAS,MAAM;AAC9D,OAAK,aAAa,MAAM,IAAI,CAAC,MAAM;AACjC,UAAM,IAAI,EAAE;AACZ,WAAO;AAAA,MACL,SAAS,EAAE,YAAY,EAAE,WAAW;AAAA,MACpC,OAAO,EAAE,SAAS;AAAA,MAClB,MAAM,EAAE,QAAQ;AAAA,MAChB,SAAS,KAAK,OAAO,EAAE,WAAW,OAAO,EAAE,WAAW,EAAE;AAAA,MACxD,MAAM,EAAE,QAAQ;AAAA,MAChB,UAAU,EAAE;AAAA,MACZ,QAAQ,EAAE;AAAA,IACZ;AAAA,EACF,CAAC;AACD,SAAO,KAAK,WAAW,SAAS,GAAG;AACjC,SAAK,WAAW,KAAK;AAAA,MACnB,SAAS;AAAA,MACT,OAAO;AAAA,MACP,MAAM;AAAA,MACN,SAAS;AAAA,MACT,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AAEA,QAAM,SAAS,eAAwC,KAAK,QAAQ;AACpE,MAAI,OAAQ,QAAO,OAAO,MAAM,MAAM;AAEtC,QAAM,YAAY,eAAwC,KAAK,WAAW;AAC1E,MAAI,UAAW,QAAO,OAAO,MAAM,SAAS;AAE5C,QAAM,QAAQ,eAAwC,KAAK,gBAAgB;AAC3E,MAAI,MAAO,QAAO,OAAO,MAAM,KAAK;AAEpC,QAAM,SAAS,eAAwC,KAAK,QAAQ;AACpE,MAAI,OAAQ,QAAO,OAAO,MAAM,MAAM;AAEtC,QAAM,OAAO,eAAwC,KAAK,MAAM;AAChE,MAAI,KAAM,QAAO,OAAO,MAAM,IAAI;AAElC,OAAK,qBAAqB,IAAI,KAAK,sBAAuB,MAAM;AAChE,OAAK,iBAAiB,IAAI,KAAK,kBAAmB,MAAM;AAExD,MAAI,IAAI,gBAAgB;AACtB,SAAK,iBAAiB,oBAAoB,IAAI,cAAc;AAC5D,WAAO,OAAO,MAAM,IAAI,gBAAgB,CAAC,CAAC;AAAA,EAC5C,OAAO;AACL,SAAK,iBAAiB;AAAA,EACxB;AAEA,OAAK,aAAa,KAAK,WAAW,MAAM,GAAG,CAAC;AAE5C,QAAM,eAAe,IAAI,aAAa,OAAO,CAAC,MAAM,EAAE,SAAS,YAAY,EAAE,OAAO;AACpF,QAAM,SAAS,aAAa,aAAa,SAAS,CAAC,GAAG;AACtD,QAAM,aAAa;AAAA,IACjB,MAAM,QAAQ,QAAQ,IAAI,WAAW,QAAQ;AAAA,IAC7C,OAAO,QAAQ,SAAS,IAAI,WAAW,SAAS;AAAA,IAChD,gBAAgB,IAAI,WAAW,kBAAkB;AAAA,EACnD;AAEA,SAAO;AACT;AAEO,SAAS,wBAAwB,KAAyC;AAC/E,QAAM,eAAe,IAAI,aAAa,OAAO,CAAC,MAAM,EAAE,SAAS,YAAY,EAAE,OAAO;AACpF,QAAM,SAAS,aAAa,aAAa,SAAS,CAAC,GAAG;AACtD,SAAO;AAAA,IACL,MAAM,QAAQ,QAAQ,IAAI,WAAW,QAAQ;AAAA,IAC7C,OAAO,QAAQ,SAAS,IAAI,WAAW,SAAS;AAAA,IAChD,gBAAgB,IAAI,WAAW,kBAAkB;AAAA,EACnD;AACF;AAQA,SAAS,uBAAuB,KAAsC;AACpE,QAAM,MAAM,EAAE,GAAG,cAAc;AAC/B,MAAI,OAAO,IAAI,KAAK;AACpB,SAAO;AACT;AAGO,SAAS,qBAAqB,KAAoB,MAA0C;AACjG,QAAM,MAAM,cAAc,EAAE,GAAG,KAAK,cAAc,KAAK,CAAC;AACxD,SAAO;AACT;;;ACtWO,SAAS,KAAK,GAAW,OAA2B,UAAkB;AAC3E,UAAQ,MAAM;AAAA,IACZ,KAAK;AACH,aAAO,IAAI;AAAA,IACb,KAAK;AACH,aAAO,KAAK,IAAI;AAAA,IAClB,KAAK;AACH,aAAO,IAAI,MAAM,IAAI,IAAI,IAAI,MAAM,IAAI,IAAI,KAAK;AAAA,IAClD;AACE,aAAO;AAAA,EACX;AACF;AAEA,SAAS,qBAAqB,WAAuB,MAAsB;AACzE,MAAI,UAAU,WAAW,EAAG,QAAO;AACnC,QAAM,SAAS,CAAC,GAAG,SAAS,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,OAAO,EAAE,IAAI;AAC5D,MAAI,QAAQ,OAAO,CAAC,EAAE,KAAM,QAAO,OAAO,CAAC,EAAE;AAC7C,MAAI,QAAQ,OAAO,OAAO,SAAS,CAAC,EAAE,KAAM,QAAO,OAAO,OAAO,SAAS,CAAC,EAAE;AAE7E,WAAS,IAAI,GAAG,IAAI,OAAO,SAAS,GAAG,KAAK;AAC1C,UAAM,IAAI,OAAO,CAAC;AAClB,UAAM,IAAI,OAAO,IAAI,CAAC;AACtB,QAAI,QAAQ,EAAE,QAAQ,QAAQ,EAAE,MAAM;AACpC,YAAM,OAAO,EAAE,OAAO,EAAE,QAAQ;AAChC,YAAM,UAAU,OAAO,EAAE,QAAQ;AACjC,YAAM,QAAQ,KAAK,QAAQ,EAAE,UAAU,QAAQ;AAC/C,aAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS;AAAA,IACzC;AAAA,EACF;AACA,SAAO,OAAO,OAAO,SAAS,CAAC,EAAE;AACnC;AAGO,SAAS,sBAAsB,KAAoB,SAAiB,WAAmB,WAAmB,MAAsB;AACrI,QAAM,QAAQ,IAAI,SAAS,OAAO,KAAK,CAAC,MAAM,EAAE,YAAY,WAAW,EAAE,cAAc,SAAS;AAChG,MAAI,CAAC,SAAS,MAAM,UAAU,WAAW,EAAG,QAAO;AACnD,SAAO,qBAAqB,MAAM,WAAW,IAAI;AACnD;AAGO,SAAS,oBAAoB,KAAoB,MAA6B;AACnF,QAAM,SAAS,IAAI,SAAS,QAAQ,IAAI,SAAS,WAAW,IAAI,OAAO,IAAI,SAAS,WAAW,KAAK,IAAI,MAAM,IAAI,SAAS,QAAQ;AAEnI,QAAM,SAAS,IAAI,aAAa,IAAI,CAACM,WAAU;AAC7C,QAAI,UAAUA,OAAM;AACpB,UAAM,SAAS,EAAE,GAAGA,OAAM,OAAO;AACjC,eAAW,SAAS,IAAI,SAAS,QAAQ;AACvC,UAAI,MAAM,YAAYA,OAAM,GAAI;AAChC,UAAI,MAAM,cAAc,gBAAgB;AACtC,kBAAU,sBAAsB,KAAKA,OAAM,IAAI,MAAM,WAAW,SAAS,MAAM;AAC/E;AAAA,MACF;AACA,YAAM,QAAQ,MAAM,UAAU,MAAM,GAAG;AACvC,UAAI,SAAkC;AACtC,eAAS,IAAI,GAAG,IAAI,MAAM,SAAS,GAAG,KAAK;AACzC,cAAM,MAAM,MAAM,CAAC;AACnB,YAAI,OAAO,OAAO,GAAG,MAAM,YAAY,OAAO,GAAG,MAAM,MAAM;AAC3D,iBAAO,GAAG,IAAI,CAAC;AAAA,QACjB;AACA,iBAAS,OAAO,GAAG;AAAA,MACrB;AACA,YAAM,OAAO,MAAM,MAAM,SAAS,CAAC;AACnC,YAAM,UAAU,OAAO,OAAO,IAAI,MAAM,WAAY,OAAO,IAAI,IAAe;AAC9E,aAAO,IAAI,IAAI,sBAAsB,KAAKA,OAAM,IAAI,MAAM,WAAW,SAAS,MAAM;AAAA,IACtF;AACA,WAAO,EAAE,GAAGA,QAAO,SAAS,OAAO;AAAA,EACrC,CAAC;AAED,SAAO,EAAE,GAAG,KAAK,cAAc,OAAO;AACxC;AAEO,SAAS,yBAAyB,SAAyD;AAChG,SAAO;AAAA,IACL;AAAA,IACA,WAAW;AAAA,IACX,WAAW;AAAA,MACT,EAAE,MAAM,GAAG,OAAO,GAAG,QAAQ,UAAU;AAAA,MACvC,EAAE,MAAM,GAAG,OAAO,GAAG,QAAQ,UAAU;AAAA,IACzC;AAAA,EACF;AACF;AAEO,SAAS,wBAAwB,SAAyD;AAC/F,SAAO;AAAA,IACL;AAAA,IACA,WAAW;AAAA,IACX,WAAW;AAAA,MACT,EAAE,MAAM,GAAG,OAAO,KAAK,QAAQ,YAAY;AAAA,MAC3C,EAAE,MAAM,GAAG,OAAO,GAAG,QAAQ,YAAY;AAAA,MACzC,EAAE,MAAM,GAAG,OAAO,KAAK,QAAQ,YAAY;AAAA,IAC7C;AAAA,EACF;AACF;;;AC5FA,IAAM,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAUnB,IAAM,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;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA2Cd,IAAM,kBAAN,MAAsB;AAAA,EACnB,KAAoC;AAAA,EACpC,UAA+B;AAAA,EAC/B,MAAqC;AAAA,EACrC,UAA+B;AAAA,EACvB;AAAA,EAEhB,cAAc;AACZ,QAAI,OAAO,aAAa,aAAa;AACnC,WAAK,cAAc;AACnB;AAAA,IACF;AACA,UAAM,SAAS,SAAS,cAAc,QAAQ;AAC9C,WAAO,QAAQ;AACf,WAAO,SAAS;AAChB,UAAM,KAAK,OAAO,WAAW,UAAU,EAAE,oBAAoB,MAAM,OAAO,KAAK,CAAC;AAChF,QAAI,CAAC,IAAI;AACP,WAAK,cAAc;AACnB;AAAA,IACF;AACA,SAAK,KAAK;AACV,SAAK,cAAc,KAAK,YAAY,EAAE;AAAA,EACxC;AAAA,EAEQ,YAAY,IAAqC;AACvD,UAAM,KAAK,KAAK,cAAc,IAAI,GAAG,eAAe,UAAU;AAC9D,UAAM,KAAK,KAAK,cAAc,IAAI,GAAG,iBAAiB,YAAY;AAClE,QAAI,CAAC,MAAM,CAAC,GAAI,QAAO;AAEvB,UAAM,UAAU,GAAG,cAAc;AACjC,QAAI,CAAC,QAAS,QAAO;AACrB,OAAG,aAAa,SAAS,EAAE;AAC3B,OAAG,aAAa,SAAS,EAAE;AAC3B,OAAG,YAAY,OAAO;AACtB,QAAI,CAAC,GAAG,oBAAoB,SAAS,GAAG,WAAW,GAAG;AACpD,cAAQ,KAAK,kCAAkC,GAAG,kBAAkB,OAAO,CAAC;AAC5E,aAAO;AAAA,IACT;AACA,SAAK,UAAU;AAEf,UAAM,YAAY,IAAI,aAAa,CAAC,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC;AACvF,UAAM,MAAM,GAAG,kBAAkB;AACjC,UAAM,MAAM,GAAG,aAAa;AAC5B,OAAG,gBAAgB,GAAG;AACtB,OAAG,WAAW,GAAG,cAAc,GAAG;AAClC,OAAG,WAAW,GAAG,cAAc,WAAW,GAAG,WAAW;AACxD,UAAM,SAAS,GAAG,kBAAkB,SAAS,OAAO;AACpD,UAAM,QAAQ,GAAG,kBAAkB,SAAS,MAAM;AAClD,OAAG,wBAAwB,MAAM;AACjC,OAAG,oBAAoB,QAAQ,GAAG,GAAG,OAAO,OAAO,IAAI,CAAC;AACxD,OAAG,wBAAwB,KAAK;AAChC,OAAG,oBAAoB,OAAO,GAAG,GAAG,OAAO,OAAO,IAAI,CAAC;AACvD,OAAG,gBAAgB,IAAI;AACvB,SAAK,MAAM;AAEX,SAAK,UAAU,GAAG,cAAc;AAChC,WAAO;AAAA,EACT;AAAA,EAEQ,cAAc,IAA4B,MAAc,QAAoC;AAClG,UAAM,SAAS,GAAG,aAAa,IAAI;AACnC,QAAI,CAAC,OAAQ,QAAO;AACpB,OAAG,aAAa,QAAQ,MAAM;AAC9B,OAAG,cAAc,MAAM;AACvB,QAAI,CAAC,GAAG,mBAAmB,QAAQ,GAAG,cAAc,GAAG;AACrD,cAAQ,KAAK,GAAG,iBAAiB,MAAM,CAAC;AACxC,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT;AAAA,EAEA,gBAAgB,WAAyE,QAA6C,UAAoC;AACxK,UAAM,KAAK,KAAK;AAChB,UAAM,UAAU,KAAK;AACrB,QAAI,CAAC,MAAM,CAAC,WAAW,CAAC,KAAK,aAAa;AACxC,gBAAU,UAAU,GAAG,GAAG,OAAO,OAAO,OAAO,MAAM;AACrD,gBAAU,UAAU,QAA6B,GAAG,CAAC;AACrD;AAAA,IACF;AAEA,UAAM,IAAI,OAAO;AACjB,UAAM,IAAI,OAAO;AAEjB,UAAM,SAAS,GAAG;AAClB,QAAI,OAAO,UAAU,KAAK,OAAO,WAAW,GAAG;AAC7C,aAAO,QAAQ;AACf,aAAO,SAAS;AAAA,IAClB;AAEA,OAAG,SAAS,GAAG,GAAG,GAAG,CAAC;AACtB,OAAG,WAAW,GAAG,GAAG,GAAG,CAAC;AACxB,OAAG,MAAM,GAAG,gBAAgB;AAE5B,OAAG,WAAW,OAAO;AACrB,OAAG,cAAc,GAAG,QAAQ;AAC5B,OAAG,YAAY,GAAG,YAAY,KAAK,OAAO;AAC1C,OAAG,cAAc,GAAG,YAAY,GAAG,gBAAgB,GAAG,aAAa;AACnE,OAAG,cAAc,GAAG,YAAY,GAAG,gBAAgB,GAAG,aAAa;AACnE,OAAG,cAAc,GAAG,YAAY,GAAG,oBAAoB,GAAG,MAAM;AAChE,OAAG,cAAc,GAAG,YAAY,GAAG,oBAAoB,GAAG,MAAM;AAChE,OAAG,YAAY,GAAG,gCAAgC,IAAI;AACtD,OAAG,WAAW,GAAG,YAAY,GAAG,GAAG,MAAM,GAAG,MAAM,GAAG,eAAe,MAAwB;AAE5F,OAAG,UAAU,GAAG,mBAAmB,SAAS,OAAO,GAAG,CAAC;AACvD,OAAG,UAAU,GAAG,mBAAmB,SAAS,SAAS,GAAG,IAAI,GAAG,IAAI,CAAC;AACpE,OAAG,UAAU,GAAG,mBAAmB,SAAS,QAAQ,GAAG,SAAS,QAAQ,CAAC;AACzE,OAAG,UAAU,GAAG,mBAAmB,SAAS,SAAS,GAAG,SAAS,SAAS,CAAC;AAC3E,OAAG,UAAU,GAAG,mBAAmB,SAAS,kBAAkB,GAAG,SAAS,kBAAkB,GAAG;AAE/F,OAAG,gBAAgB,KAAK,GAAG;AAC3B,OAAG,WAAW,GAAG,gBAAgB,GAAG,CAAC;AACrC,OAAG,gBAAgB,IAAI;AAEvB,cAAU,UAAU,GAAG,GAAG,GAAG,CAAC;AAC9B,cAAU,UAAU,QAAQ,GAAG,CAAC;AAAA,EAClC;AAAA,EAEA,UAAgB;AACd,UAAM,KAAK,KAAK;AAChB,QAAI,CAAC,GAAI;AACT,QAAI,KAAK,QAAS,IAAG,cAAc,KAAK,OAAO;AAC/C,QAAI,KAAK,QAAS,IAAG,cAAc,KAAK,OAAO;AAC/C,QAAI,KAAK,IAAK,IAAG,kBAAkB,KAAK,GAAG;AAC3C,SAAK,KAAK;AAAA,EACZ;AACF;;;ACjLO,SAAS,gBACd,KACA,KACA,OACA,QACM;AACN,QAAM,YAAY,IAAI,aAAa,KAAK,CAAC,MAAM,EAAE,SAAS,UAAU,EAAE,OAAO;AAC7E,MAAI,CAAC,UAAW;AAEhB,QAAM,WAAY,UAAU,OAAO,YAAuB;AAC1D,QAAM,WAAW,KAAK,IAAI,GAAG,KAAK,IAAI,GAAI,UAAU,OAAO,kBAA6B,CAAC,CAAC;AAC1F,MAAI,YAAY,EAAG;AAEnB,MAAI,KAAK;AACT,MAAI,2BAA2B;AAE/B,MAAI,aAAa,cAAc;AAC7B,UAAM,IAAI,QAAQ;AAClB,QAAI,YAAY;AAChB,QAAI,SAAS,GAAG,GAAG,GAAG,MAAM;AAAA,EAC9B,OAAO;AAEL,UAAM,IAAI,QAAQ;AAClB,UAAM,OAAO,IAAI,qBAAqB,GAAG,GAAG,OAAO,CAAC;AACpD,SAAK,aAAa,GAAG,qBAAqB;AAC1C,SAAK,aAAa,KAAK,IAAI,GAAG,WAAW,IAAI,GAAG,qBAAqB;AACrE,SAAK,aAAa,KAAK,IAAI,GAAG,WAAW,IAAI,GAAG,qBAAqB;AACrE,SAAK,aAAa,GAAG,qBAAqB;AAC1C,QAAI,YAAY;AAChB,QAAI,SAAS,GAAG,GAAG,OAAO,MAAM;AAAA,EAClC;AAEA,MAAI,QAAQ;AACd;;;ACvBA,IAAI,mBAA2C;AAE/C,SAAS,gBAAwC;AAC/C,MAAI,OAAO,aAAa,YAAa,QAAO;AAC5C,MAAI,CAAC,kBAAkB;AACrB,uBAAmB,IAAI,gBAAgB;AAAA,EACzC;AACA,SAAO;AACT;AAKO,SAAS,cAAc,KAAoB,MAAc,KAAmE,UAA2B,CAAC,GAAS;AACtK,QAAM,WAAW,oBAAoB,KAAK,IAAI;AAC9C,QAAM,MAAM,cAAc,QAAQ;AAElC,QAAM,IAAI,IAAI,eAAe;AAC7B,QAAM,IAAI,IAAI,gBAAgB;AAE9B,QAAM,eAAe,SAAS,aAAa,OAAO,CAAC,MAAM,EAAE,SAAS,YAAY,EAAE,OAAO;AACzF,QAAM,aAAa,aAAa,aAAa,SAAS,CAAC,GAAG;AAC1D,QAAM,OAAO;AAAA,IACX,MAAM,YAAY,QAAQ,SAAS,WAAW,QAAQ;AAAA,IACtD,OAAO,YAAY,SAAS,SAAS,WAAW,SAAS;AAAA,IACzD,gBAAgB,SAAS,WAAW,kBAAkB;AAAA,EACxD;AAEA,QAAM,YAAY,CAAC,QAAQ,eAAe,KAAK,OAAO,KAAK,KAAK,QAAQ;AAExE,QAAM,cAAc,MAAM,gBAAgB,KAAK,UAAU,GAAG,CAAC;AAE7D,MAAI,CAAC,WAAW;AACd,QAAI,UAAU,GAAG,GAAG,GAAG,CAAC;AACxB,yBAAqB,KAAK,GAAG;AAC7B,gBAAY;AACZ;AAAA,EACF;AAEA,QAAM,MAAM,OAAO,oBAAoB,cAAc,IAAI,gBAAgB,GAAG,CAAC,IAAI;AAEjF,MAAI,KAAK;AACP,UAAM,SAAS,IAAI,WAAW,IAAI;AAClC,QAAI,CAAC,QAAQ;AACX,2BAAqB,KAAK,GAAG;AAC7B,kBAAY;AACZ;AAAA,IACF;AACA,yBAAqB,QAAQ,GAAG;AAChC,oBAAgB,QAAQ,UAAU,GAAG,CAAC;AACtC,UAAM,aAAa,QAAQ,cAAc,cAAc;AACvD,QAAI,YAAY,aAAa;AAC3B,iBAAW,gBAAgB,KAAK,KAAK,IAAI;AACzC;AAAA,IACF;AACA,QAAI,UAAU,GAAG,GAAG,GAAG,CAAC;AACxB,QAAI,UAAU,KAAqC,GAAG,CAAC;AACvD;AAAA,EACF;AAGA,MAAI,OAAO,aAAa,aAAa;AACnC,UAAM,OAAO,SAAS,cAAc,QAAQ;AAC5C,SAAK,QAAQ;AACb,SAAK,SAAS;AACd,UAAM,OAAO,KAAK,WAAW,IAAI;AACjC,QAAI,MAAM;AACR,2BAAqB,MAAM,GAAG;AAC9B,sBAAgB,MAAM,UAAU,GAAG,CAAC;AACpC,YAAM,aAAa,QAAQ,cAAc,cAAc;AACvD,UAAI,YAAY,aAAa;AAC3B,mBAAW,gBAAgB,KAAK,MAAM,IAAI;AAC1C;AAAA,MACF;AACA,UAAI,UAAU,GAAG,GAAG,GAAG,CAAC;AACxB,UAAI,UAAU,MAAM,GAAG,CAAC;AACxB;AAAA,IACF;AAAA,EACF;AAEA,uBAAqB,KAAK,GAAG;AAC7B,cAAY;AACd;AAEO,SAAS,eAAe,KAAuB,MAAc,KAAmE,SAAiC;AACtK,gBAAc,wBAAwB,GAAG,GAAG,MAAM,KAAK,OAAO;AAChE;AAEO,SAAS,iBAAiB,KAAoB,OAAuB;AAC1E,QAAM,KAAK,KAAK,IAAI,SAAS,OAAO;AACpC,QAAM,OAAQ,IAA2C,SAAS;AAClE,QAAM,WAAW,IAAI,SAAS,YAAY;AAC1C,MAAI,IAAI,OAAO,QAAQ;AACvB,MAAI,IAAI,SAAS,MAAM;AACrB,QAAI,WAAW,IAAI,IAAI,WAAW;AAAA,EACpC,OAAO;AACL,QAAI,KAAK,IAAI,GAAG,QAAQ;AAAA,EAC1B;AACA,EAAC,IAA2C,QAAQ;AACpD,SAAO;AACT;AAEO,SAAS,aAAa,KAA4B;AACvD,SAAQ,IAA2C,SAAS;AAC9D;AAEO,SAAS,aAAa,KAAoB,MAAoB;AACnE,EAAC,IAA2C,QAAQ;AACtD;AAEO,SAAS,eAAe,KAA0B;AACvD,EAAC,IAA2C,QAAQ;AACtD;;;ACxHA,IAAM,aAAa,oBAAI,IAA2B;AAE3C,SAAS,eAAe,QAA+B;AAC5D,MAAI,WAAW,IAAI,OAAO,EAAE,GAAG;AAC7B,WAAO,gBAAgB,WAAW,IAAI,OAAO,EAAE,CAAE;AAAA,EACnD;AACA,QAAM,QAAQ,wBAAwB,OAAO,MAAM;AACnD,aAAW,IAAI,OAAO,IAAI,KAAK;AAC/B,SAAO,gBAAgB,KAAK;AAC9B;AAEO,SAAS,eAAe,QAA6B;AAC1D,QAAM,QAAQ,eAAe,MAAM;AACnC,SAAO;AAAA,IACL,IAAI,OAAO;AAAA,IACX,MAAM,OAAO;AAAA,IACb,UAAU,OAAO;AAAA,IACjB,QAAQ,gBAAgB,MAAM,YAAY;AAAA,IAC1C,SAAS;AAAA,MACP;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,MAAM,CAAC,OAAO,YAAY,WAAW,OAAO,EAAE;AAAA,IAC9C,gBAAgB,MAAM;AAAA,IACtB;AAAA,EACF;AACF;AAEO,IAAM,iBAAgC,eAAe,IAAI,cAAc;AAEvE,SAAS,mBACd,MACA,QACe;AACf,SAAO;AAAA,IACL,GAAG;AAAA,IACH,YAAY,OAAO;AAAA,IACnB,cAAc,gBAAgB,OAAO,MAAM;AAAA,IAC3C,gBAAgB,OAAO,kBAAkB;AAAA,IACzC,cAAc,OAAO,OAAO;AAAA,IAC5B,YAAY,OAAO,OAAO,cAAc,KAAK;AAAA,IAC7C,UAAU,OAAO,OAAO,YAAY,KAAK;AAAA,EAC3C;AACF;AAEO,SAAS,mBAAyB;AACvC,aAAW,MAAM;AACnB;;;AC1BO,SAAS,kBAAkB,GAAW,GAAW,KAAa,gBAA6B;AAChG,SAAO;AAAA,IACL,GAAG;AAAA,IACH,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ;AAAA,IACA;AAAA,IACA,IAAI;AAAA,IACJ,KAAK;AAAA,IACL,QAAQ,CAAC;AAAA,IACT,QAAQ,CAAC;AAAA,IACT,OAAO;AAAA,MACL,MAAM;AAAA,QACJ;AAAA,UACE,OAAO;AAAA,UACP,SAAS;AAAA,UACT,SAAS;AAAA,UACT,QAAQ;AAAA,UACR,QAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAO;AAAA,UACP,SAAS;AAAA,UACT,SAAS;AAAA,UACT,QAAQ;AAAA,UACR,QAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAO;AAAA,UACP,SAAS;AAAA,UACT,SAAS;AAAA,UACT,QAAQ;AAAA,UACR,QAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAO;AAAA,UACP,SAAS;AAAA,UACT,SAAS;AAAA,UACT,QAAQ;AAAA,UACR,QAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAO;AAAA,UACP,SAAS;AAAA,UACT,SAAS;AAAA,UACT,QAAQ;AAAA,UACR,QAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAO;AAAA,UACP,SAAS;AAAA,UACT,SAAS;AAAA,UACT,QAAQ;AAAA,UACR,QAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAO;AAAA,UACP,SAAS;AAAA,UACT,SAAS;AAAA,UACT,QAAQ;AAAA,UACR,QAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAO;AAAA,UACP,SAAS;AAAA,UACT,SAAS;AAAA,UACT,QAAQ;AAAA,UACR,QAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAO;AAAA,UACP,SAAS;AAAA,UACT,SAAS;AAAA,UACT,QAAQ;AAAA,UACR,QAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAO;AAAA,UACP,SAAS;AAAA,UACT,SAAS;AAAA,UACT,QAAQ;AAAA,UACR,QAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAO;AAAA,UACP,SAAS;AAAA,UACT,SAAS;AAAA,UACT,QAAQ;AAAA,UACR,QAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAO;AAAA,UACP,SAAS;AAAA,UACT,SAAS;AAAA,UACT,QAAQ;AAAA,UACR,QAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAO;AAAA,UACP,SAAS;AAAA,UACT,SAAS;AAAA,UACT,QAAQ;AAAA,UACR,QAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAO;AAAA,UACP,SAAS;AAAA,UACT,SAAS;AAAA,UACT,QAAQ;AAAA,UACR,QAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAO;AAAA,UACP,SAAS;AAAA,UACT,SAAS;AAAA,UACT,QAAQ;AAAA,UACR,QAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAO;AAAA,UACP,SAAS;AAAA,UACT,SAAS;AAAA,UACT,QAAQ;AAAA,UACR,QAAQ;AAAA,QACV;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAKO,SAAS,cAAc,YAAuB;AACnD,MAAI,CAAC,cAAc,CAAC,MAAM,QAAQ,WAAW,MAAM,EAAG;AACtD,aAAW,OAAO,QAAQ,CAACC,QAAY,UAAkB;AAEvD,IAAAA,OAAM,MAAM,WAAW,OAAO,SAAS;AAAA,EACzC,CAAC;AACH;AAKO,SAAS,cAAc,YAAiB,MAAc,OAAe,GAAW,GAAgB;AACrG,QAAM,QAAQ,KAAK,MAAM,KAAK,UAAU,UAAU,CAAC;AACnD,MAAI,CAAC,MAAM,QAAQ,MAAM,MAAM,EAAG,OAAM,SAAS,CAAC;AAElD,QAAM,WAAW;AAAA,IACf,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI,MAAM;AAAA,IACV,KAAK,MAAM,OAAO,SAAS;AAAA,IAC3B,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA;AAAA,IACJ,IAAI;AAAA,MACF,GAAG,EAAE,GAAG,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,EAAE;AAAA,MACxB,GAAG,EAAE,GAAG,GAAG,GAAG,CAAC,IAAI,GAAG,IAAI,GAAG,CAAC,EAAE;AAAA,MAChC,GAAG,EAAE,GAAG,GAAG,GAAG,CAAC,KAAK,KAAK,GAAG,EAAE;AAAA,MAC9B,GAAG,EAAE,GAAG,GAAG,GAAG,EAAE;AAAA,MAChB,GAAG,EAAE,GAAG,GAAG,GAAG,IAAI;AAAA,IACpB;AAAA,EACF;AAGA,QAAM,OAAO,KAAK,QAAQ;AAC1B,gBAAc,KAAK;AACnB,SAAO;AACT;AAKO,SAAS,aAAa,YAAiB,MAAc,MAAmB;AAC7E,QAAM,QAAQ,KAAK,MAAM,KAAK,UAAU,UAAU,CAAC;AACnD,MAAI,CAAC,MAAM,QAAQ,MAAM,MAAM,EAAG,OAAM,SAAS,CAAC;AAElD,QAAM,IAAI,MAAM,KAAK;AACrB,QAAM,IAAI,MAAM,KAAK;AAErB,QAAM,WAAW;AAAA,IACf,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI,MAAM;AAAA,IACV,KAAK,MAAM,OAAO,SAAS;AAAA,IAC3B,IAAI;AAAA,MACF,GAAG,EAAE,GAAG,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,EAAE;AAAA,MACxB,GAAG,EAAE,GAAG,GAAG,GAAG,CAAC,IAAI,GAAG,IAAI,GAAG,CAAC,EAAE;AAAA,MAChC,GAAG,EAAE,GAAG,GAAG,GAAG,CAAC,KAAK,KAAK,GAAG,EAAE;AAAA,MAC9B,GAAG,EAAE,GAAG,GAAG,GAAG,EAAE;AAAA,MAChB,GAAG,EAAE,GAAG,GAAG,GAAG,IAAI;AAAA,IACpB;AAAA,IACA,GAAG;AAAA,MACD,GAAG;AAAA,QACD,GAAG;AAAA,UACD;AAAA,YACE,GAAG;AAAA,cACD,GAAG;AAAA;AAAA,cACH,GAAG;AAAA;AAAA,cACH,GAAG;AAAA;AAAA,cACH,GAAG;AAAA;AAAA,cACH,IAAI;AAAA,cACJ,IAAI;AAAA;AAAA,cACJ,IAAI;AAAA,cACJ,IAAI,CAAC,GAAG,GAAG,CAAC;AAAA;AAAA,YACd;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,MACA,GAAG,CAAC;AAAA,MACJ,GAAG,CAAC;AAAA,MACJ,GAAG;AAAA,QACD,GAAG;AAAA,QACH,GAAG;AAAA,UACD,GAAG;AAAA,UACH,GAAG,CAAC,GAAG,CAAC;AAAA,QACV;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,QAAM,OAAO,QAAQ,QAAQ;AAC7B,gBAAc,KAAK;AACnB,SAAO;AACT;AAKO,SAAS,cAAc,YAAiB,MAAmB;AAChE,QAAM,QAAQ,KAAK,MAAM,KAAK,UAAU,UAAU,CAAC;AACnD,MAAI,CAAC,MAAM,QAAQ,MAAM,MAAM,EAAG,OAAM,SAAS,CAAC;AAElD,QAAM,IAAI,MAAM,KAAK;AACrB,QAAM,IAAI,MAAM,KAAK;AAErB,QAAM,WAAW;AAAA,IACf,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI,MAAM;AAAA,IACV,KAAK,MAAM,OAAO,SAAS;AAAA,IAC3B,IAAI;AAAA,MACF,GAAG,EAAE,GAAG,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,EAAE;AAAA,MACxB,GAAG,EAAE,GAAG,GAAG,GAAG,CAAC,IAAI,GAAG,IAAI,GAAG,CAAC,EAAE;AAAA,MAChC,GAAG,EAAE,GAAG,GAAG,GAAG,CAAC,KAAK,KAAK,GAAG,EAAE;AAAA,MAC9B,GAAG,EAAE,GAAG,GAAG,GAAG,EAAE;AAAA,MAChB,GAAG,EAAE,GAAG,GAAG,GAAG,IAAI;AAAA,IACpB;AAAA,IACA,QAAQ,CAAC;AAAA,EACX;AAEA,QAAM,OAAO,QAAQ,QAAQ;AAC7B,gBAAc,KAAK;AACnB,SAAO;AACT;AAKO,SAAS,eAAe,YAAiB,YAAoB,WAA+B,UAAuB;AACxH,QAAM,QAAQ,KAAK,MAAM,KAAK,UAAU,UAAU,CAAC;AACnD,QAAMA,SAAQ,MAAM,OAAO,UAAU;AACrC,MAAI,CAACA,UAASA,OAAM,OAAO,EAAG,QAAO;AAErC,MAAI,CAAC,MAAM,QAAQA,OAAM,MAAM,EAAG,CAAAA,OAAM,SAAS,CAAC;AAGlD,QAAM,WAAW,SAAS,WAAW,GAAG,IAAI,SAAS,MAAM,CAAC,IAAI;AAChE,QAAM,IAAI,SAAS,SAAS,MAAM,GAAG,CAAC,GAAG,EAAE,IAAI,OAAO;AACtD,QAAM,IAAI,SAAS,SAAS,MAAM,GAAG,CAAC,GAAG,EAAE,IAAI,OAAO;AACtD,QAAM,IAAI,SAAS,SAAS,MAAM,GAAG,CAAC,GAAG,EAAE,IAAI,OAAO;AAEtD,MAAI;AAEJ,MAAI,cAAc,QAAQ;AACxB,mBAAe;AAAA,MACb,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,QACF;AAAA,UACE,IAAI;AAAA;AAAA,UACJ,IAAI;AAAA,UACJ,GAAG,EAAE,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,EAAE;AAAA;AAAA,UACrB,GAAG,EAAE,GAAG,GAAG,GAAG,CAAC,KAAK,GAAG,EAAE;AAAA;AAAA,UACzB,GAAG,EAAE,GAAG,GAAG,GAAG,EAAE;AAAA;AAAA,QAClB;AAAA,QACA;AAAA,UACE,IAAI;AAAA;AAAA,UACJ,IAAI;AAAA,UACJ,GAAG,EAAE,GAAG,GAAG,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC,EAAE;AAAA;AAAA,UAC3B,GAAG,EAAE,GAAG,GAAG,GAAG,IAAI;AAAA,QACpB;AAAA,QACA;AAAA,UACE,IAAI;AAAA;AAAA,UACJ,IAAI;AAAA,UACJ,GAAG,EAAE,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,EAAE;AAAA,UACrB,GAAG,EAAE,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,EAAE;AAAA,UACrB,GAAG,EAAE,GAAG,GAAG,GAAG,CAAC,KAAK,GAAG,EAAE;AAAA,UACzB,GAAG,EAAE,GAAG,GAAG,GAAG,EAAE;AAAA,UAChB,GAAG,EAAE,GAAG,GAAG,GAAG,IAAI;AAAA,QACpB;AAAA,MACF;AAAA,IACF;AAAA,EACF,OAAO;AACL,mBAAe;AAAA,MACb,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,QACF;AAAA,UACE,IAAI;AAAA;AAAA,UACJ,IAAI;AAAA,UACJ,GAAG,EAAE,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,EAAE;AAAA,UACrB,GAAG,EAAE,GAAG,GAAG,GAAG,CAAC,KAAK,GAAG,EAAE;AAAA,QAC3B;AAAA,QACA;AAAA,UACE,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,GAAG,EAAE,GAAG,GAAG,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC,EAAE;AAAA,UAC3B,GAAG,EAAE,GAAG,GAAG,GAAG,IAAI;AAAA,QACpB;AAAA,QACA;AAAA,UACE,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,GAAG,EAAE,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,EAAE;AAAA,UACrB,GAAG,EAAE,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,EAAE;AAAA,UACrB,GAAG,EAAE,GAAG,GAAG,GAAG,CAAC,KAAK,GAAG,EAAE;AAAA,UACzB,GAAG,EAAE,GAAG,GAAG,GAAG,EAAE;AAAA,UAChB,GAAG,EAAE,GAAG,GAAG,GAAG,IAAI;AAAA,QACpB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,EAAAA,OAAM,OAAO,KAAK,YAAY;AAC9B,SAAO;AACT;AAKA,SAAS,YAAYA,QAAY,MAA+B;AAC9D,MAAI,CAACA,OAAO,QAAO;AACnB,QAAM,OAAO,KAAK,MAAM,GAAG;AAC3B,MAAI,UAAUA;AACd,aAAW,OAAO,MAAM;AACtB,QAAI,CAAC,QAAQ,GAAG,EAAG,QAAO;AAC1B,cAAU,QAAQ,GAAG;AAAA,EACvB;AACA,SAAO;AACT;AAKO,SAAS,qBAAqB,YAAiB,YAAoB,MAA0B,OAA+B;AACjI,QAAM,QAAQ,KAAK,MAAM,KAAK,UAAU,UAAU,CAAC;AACnD,QAAMA,SAAQ,MAAM,OAAO,UAAU;AACrC,MAAI,CAACA,OAAO,QAAO;AAEnB,QAAM,UAAU,YAAYA,QAAO,IAAI;AACvC,MAAI,SAAS;AACX,YAAQ,IAAI;AAGZ,QAAI,MAAM,QAAQ,KAAK,MAAM,SAAS,UAAU,SAAS,UAAU,SAAS,SAAS;AACnF,cAAQ,IAAI,CAAC,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;AAAA,IAC1D,OAAO;AACL,cAAQ,IAAI;AAAA,IACd;AAAA,EACF;AAEA,SAAO;AACT;AAKA,IAAM,gBAAkF;AAAA,EACtF,QAAQ;AAAA,IACN,GAAG,EAAE,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,EAAE;AAAA,IACpB,GAAG,EAAE,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,EAAE;AAAA,EACtB;AAAA,EACA,QAAQ;AAAA,IACN,GAAG,EAAE,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC,EAAE;AAAA,IACvB,GAAG,EAAE,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,EAAE;AAAA,EACtB;AAAA,EACA,SAAS;AAAA,IACP,GAAG,EAAE,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,EAAE;AAAA,IACpB,GAAG,EAAE,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC,EAAE;AAAA,EACzB;AAAA,EACA,WAAW;AAAA,IACT,GAAG,EAAE,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC,EAAE;AAAA,IACvB,GAAG,EAAE,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC,EAAE;AAAA,EACzB;AACF;AAKO,SAAS,iBAAiB,YAAiB,YAAoB,MAA+B;AACnG,QAAM,QAAQ,KAAK,MAAM,KAAK,UAAU,UAAU,CAAC;AACnD,QAAMA,SAAQ,MAAM,OAAO,UAAU;AACrC,MAAI,CAACA,OAAO,QAAO;AAEnB,QAAM,UAAU,YAAYA,QAAO,IAAI;AACvC,MAAI,WAAW,QAAQ,MAAM,GAAG;AAC9B,UAAM,cAAc,QAAQ;AAC5B,YAAQ,IAAI;AAGZ,YAAQ,IAAI;AAAA,MACV;AAAA,QACE,GAAG;AAAA,QACH,GAAG;AAAA,QACH,GAAG,cAAc,UAAU;AAAA,QAC3B,GAAG,cAAc,UAAU;AAAA,MAC7B;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAKO,SAAS,oBAAoB,YAAiB,YAAoB,MAA0B,OAAe,OAA0B,SAAwD,aAAkB;AACpN,QAAM,QAAQ,KAAK,MAAM,KAAK,UAAU,UAAU,CAAC;AACnD,QAAMA,SAAQ,MAAM,OAAO,UAAU;AACrC,MAAI,CAACA,OAAO,QAAO;AAEnB,QAAM,UAAU,YAAYA,QAAO,IAAI;AACvC,MAAI,CAAC,QAAS,QAAO;AAGrB,MAAI,QAAQ,MAAM,GAAG;AAEnB,YAAQ,IAAI;AACZ,YAAQ,IAAI;AAAA,MACV;AAAA,QACE,GAAG;AAAA,QACH,GAAG,QAAQ;AAAA,QACX,GAAG,cAAc,MAAM,EAAE;AAAA,QACzB,GAAG,cAAc,MAAM,EAAE;AAAA,MAC3B;AAAA,IACF;AAAA,EACF;AAEA,QAAM,YAA8B,QAAQ;AAG5C,MAAI,eAAe;AACnB,MAAI,MAAM,QAAQ,KAAK,MAAM,SAAS,UAAU,SAAS,UAAU,SAAS,SAAS;AACnF,mBAAe,CAAC,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;AAAA,EAC7D;AAGA,QAAM,aAAa,UAAU,UAAU,CAACC,QAAOA,IAAG,MAAM,KAAK;AAC7D,QAAM,SAAS,cAAc,MAAM;AAEnC,MAAI,eAAe,IAAI;AAErB,cAAU,UAAU,EAAE,IAAI;AAC1B,cAAU,UAAU,EAAE,IAAI,OAAO;AACjC,cAAU,UAAU,EAAE,IAAI,OAAO;AAAA,EACnC,OAAO;AAEL,cAAU,KAAK;AAAA,MACb,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG,OAAO;AAAA,MACV,GAAG,OAAO;AAAA,IACZ,CAAC;AAGD,cAAU,KAAK,CAAC,GAAG,MAAM,EAAE,IAAI,EAAE,CAAC;AAAA,EACpC;AAIA,YAAU,QAAQ,CAACA,KAAI,QAAQ;AAC7B,QAAI,QAAQ,UAAU,SAAS,GAAG;AAChC,aAAOA,IAAG;AACV,aAAOA,IAAG;AAAA,IACZ,OAAO;AACL,MAAAA,IAAG,IAAIA,IAAG,KAAK,OAAO;AACtB,MAAAA,IAAG,IAAIA,IAAG,KAAK,OAAO;AAAA,IACxB;AAAA,EACF,CAAC;AAED,SAAO;AACT;AAKO,SAAS,eAAe,YAAiB,YAAoB,MAA0B,OAAoB;AAChH,QAAM,QAAQ,KAAK,MAAM,KAAK,UAAU,UAAU,CAAC;AACnD,QAAMD,SAAQ,MAAM,OAAO,UAAU;AACrC,MAAI,CAACA,OAAO,QAAO;AAEnB,QAAM,UAAU,YAAYA,QAAO,IAAI;AACvC,MAAI,CAAC,WAAW,QAAQ,MAAM,EAAG,QAAO;AAExC,MAAI,YAA8B,QAAQ;AAG1C,cAAY,UAAU,OAAO,CAACC,QAAOA,IAAG,MAAM,KAAK;AAEnD,MAAI,UAAU,WAAW,GAAG;AAE1B,YAAQ,IAAI;AACZ,YAAQ,IAAI,SAAS,UAAU,SAAS,UAAU,SAAS,SAAS,CAAC,GAAG,GAAG,CAAC,IAAI;AAAA,EAClF,OAAO;AACL,YAAQ,IAAI;AAGZ,cAAU,QAAQ,CAACA,KAAI,QAAQ;AAC7B,UAAI,QAAQ,UAAU,SAAS,GAAG;AAChC,eAAOA,IAAG;AACV,eAAOA,IAAG;AAAA,MACZ;AAAA,IACF,CAAC;AAAA,EACH;AAEA,SAAO;AACT;AAKO,SAAS,cAAc,YAAiB,MAAc,YAAoB,GAAW,GAAgB;AAC1G,QAAM,QAAQ,KAAK,MAAM,KAAK,UAAU,UAAU,CAAC;AACnD,MAAI,CAAC,MAAM,QAAQ,MAAM,MAAM,EAAG,OAAM,SAAS,CAAC;AAClD,MAAI,CAAC,MAAM,QAAQ,MAAM,MAAM,EAAG,OAAM,SAAS,CAAC;AAElD,QAAM,UAAU,OAAO,KAAK,IAAI,CAAC;AAGjC,QAAM,OAAO,KAAK;AAAA,IAChB,IAAI;AAAA,IACJ;AAAA,IACA;AAAA,IACA,GAAG;AAAA,IACH,GAAG;AAAA;AAAA,IACH,GAAG;AAAA,EACL,CAAC;AAED,QAAM,QAAQ,MAAM,KAAK;AACzB,QAAM,QAAQ,MAAM,KAAK;AAGzB,QAAM,WAAW;AAAA,IACf,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI,MAAM;AAAA,IACV,KAAK,MAAM,OAAO,SAAS;AAAA,IAC3B,IAAI;AAAA,MACF,GAAG,EAAE,GAAG,GAAG,GAAG,CAAC,IAAI,GAAG,IAAI,GAAG,CAAC,EAAE;AAAA,MAChC,GAAG,EAAE,GAAG,GAAG,GAAG,CAAC,QAAQ,GAAG,QAAQ,GAAG,CAAC,EAAE;AAAA,MACxC,GAAG,EAAE,GAAG,GAAG,GAAG,CAAC,KAAK,KAAK,GAAG,EAAE;AAAA,MAC9B,GAAG,EAAE,GAAG,GAAG,GAAG,EAAE;AAAA,MAChB,GAAG,EAAE,GAAG,GAAG,GAAG,IAAI;AAAA,IACpB;AAAA,EACF;AAEA,QAAM,OAAO,QAAQ,QAAQ;AAC7B,gBAAc,KAAK;AACnB,SAAO;AACT;AAMO,SAAS,iBAAiB,YAAiB,YAAoB,WAAwB;AAC5F,QAAM,QAAQ,KAAK,MAAM,KAAK,UAAU,UAAU,CAAC;AACnD,QAAMD,SAAQ,MAAM,OAAO,UAAU;AACrC,MAAI,CAACA,OAAO,QAAO;AAEnB,MAAI,cAAc,GAAG;AACnB,WAAOA,OAAM;AAAA,EACf,OAAO;AACL,IAAAA,OAAM,KAAK;AAAA,EACb;AAEA,SAAO;AACT;;;ACjmBO,SAAS,eAAeE,QAAoB;AACjD,MAAI,CAACA,OAAM,KAAK,CAACA,OAAM,EAAE,EAAG,QAAO;AACnC,QAAM,IAAIA,OAAM,EAAE;AAClB,MAAI,MAAM,QAAQ,EAAE,CAAC,GAAG;AACtB,UAAM,UAAU,EAAE,EAAE,CAAC;AACrB,QAAI,WAAW,QAAQ,KAAK,OAAO,QAAQ,EAAE,MAAM,UAAU;AAC3D,aAAO,QAAQ,EAAE;AAAA,IACnB;AAAA,EACF,WAAW,EAAE,KAAK,EAAE,EAAE,KAAK,OAAO,EAAE,EAAE,EAAE,MAAM,UAAU;AACtD,WAAO,EAAE,EAAE,EAAE;AAAA,EACf;AACA,SAAO;AACT;AAKO,SAAS,eAAe,YAAoC;AACjE,QAAM,SAA4B,CAAC;AACnC,QAAM,oBAAoB,oBAAI,IAAY;AAE1C,WAAS,eAAe,QAAe;AACrC,QAAI,CAAC,MAAM,QAAQ,MAAM,EAAG;AAC5B,eAAWA,UAAS,QAAQ;AAC1B,UAAI,CAACA,OAAO;AAGZ,UAAIA,OAAM,OAAO,GAAG;AAClB,cAAM,OAAOA,OAAM,MAAM;AACzB,cAAM,cAAc,eAAeA,MAAK;AACxC,YAAI,CAAC,kBAAkB,IAAI,IAAI,GAAG;AAChC,4BAAkB,IAAI,IAAI;AAC1B,iBAAO,KAAK;AAAA,YACV,WAAW;AAAA,YACX;AAAA,UACF,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,MAAI,MAAM,QAAQ,WAAW,MAAM,GAAG;AACpC,mBAAe,WAAW,MAAM;AAAA,EAClC;AAGA,MAAI,MAAM,QAAQ,WAAW,MAAM,GAAG;AACpC,eAAW,SAAS,WAAW,QAAQ;AACrC,UAAI,SAAS,MAAM,QAAQ,MAAM,MAAM,GAAG;AACxC,uBAAe,MAAM,MAAM;AAAA,MAC7B;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAKO,SAAS,gBAAgB,YAAiC;AAC/D,MAAI,CAAC,cAAc,OAAO,eAAe,UAAU;AACjD,UAAM,IAAI,MAAM,8BAA8B;AAAA,EAChD;AAEA,QAAM,QAAQ,OAAO,WAAW,MAAM,WAAW,WAAW,IAAI;AAChE,QAAM,SAAS,OAAO,WAAW,MAAM,WAAW,WAAW,IAAI;AACjE,QAAM,MAAM,OAAO,WAAW,OAAO,WAAW,WAAW,KAAK;AAEhE,QAAM,KAAK,OAAO,WAAW,OAAO,WAAW,WAAW,KAAK;AAC/D,QAAM,KAAK,OAAO,WAAW,OAAO,WAAW,WAAW,KAAK;AAC/D,QAAM,iBAAiB,KAAK,IAAI,GAAG,KAAK,MAAM,KAAK,EAAE,CAAC;AAEtD,QAAM,aAAa,eAAe,UAAU;AAE5C,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;AC9DO,SAAS,eAAe,KAAuC;AACpE,QAAM,SAAS,IAAI,WAAW,GAAG,IAAI,IAAI,MAAM,CAAC,IAAI,KAAK,OAAO,GAAG,GAAG;AACtE,MAAI,MAAM,WAAW,EAAG,QAAO,CAAC,GAAG,GAAG,CAAC;AACvC,SAAO,CAAC,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,SAAS,MAAM,MAAM,GAAG,CAAC,GAAG,EAAE,IAAI,GAAG,CAAC,GAAG,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,SAAS,MAAM,MAAM,GAAG,CAAC,GAAG,EAAE,IAAI,GAAG,CAAC,GAAG,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,SAAS,MAAM,MAAM,GAAG,CAAC,GAAG,EAAE,IAAI,GAAG,CAAC,CAAC;AAC3M;AAEA,SAAS,eAAe,KAAU,UAAmC;AACnE,MAAI,CAAC,IAAK;AACV,MAAI,SAAS,SAAS,OAAW,KAAI,IAAI,SAAS,KAAK,QAAQ,OAAO,IAAI;AAC1E,MAAI,SAAS,aAAa,OAAW,KAAI,IAAI,SAAS;AACtD,MAAI,SAAS,aAAa,OAAW,KAAI,IAAI,SAAS;AACtD,MAAI,SAAS,aAAa,OAAW,KAAI,KAAK,SAAS;AACvD,MAAI,SAAS,eAAe,OAAW,KAAI,KAAK,SAAS;AACzD,MAAI,SAAS,UAAU,OAAW,KAAI,IAAI,SAAS;AACnD,MAAI,SAAS,cAAc,OAAW,KAAI,KAAK,eAAe,SAAS,SAAS;AAChF,MAAI,SAAS,gBAAgB,UAAa,SAAS,gBAAgB,QAAW;AAC5E,QAAI,KAAK,eAAe,SAAS,WAAW;AAC5C,QAAI,KAAK,SAAS;AAAA,EACpB,WAAW,SAAS,gBAAgB,QAAW;AAC7C,QAAI,KAAK,SAAS;AAAA,EACpB;AACF;AAEA,SAAS,sBAAsBC,QAAY,UAAmC;AAC5E,QAAM,KAAKA,OAAM;AACjB,MAAI,CAAC,GAAI;AACT,MAAI,SAAS,YAAY,UAAa,GAAG,GAAG,MAAM,EAAG,IAAG,EAAE,IAAI,SAAS;AACvE,MAAI,SAAS,aAAa,UAAa,GAAG,GAAG,MAAM,EAAG,IAAG,EAAE,IAAI,SAAS;AACxE,MAAI,SAAS,WAAW,UAAa,SAAS,WAAW,UAAa,GAAG,GAAG,MAAM,GAAG;AACnF,OAAG,EAAE,IAAI,CAAC,SAAS,QAAQ,SAAS,QAAQ,GAAG;AAAA,EACjD;AACA,MAAI,SAAS,SAAS,UAAa,SAAS,SAAS,UAAa,GAAG,GAAG,MAAM,GAAG;AAC/E,UAAM,IAAI,MAAM,QAAQ,GAAG,EAAE,CAAC,IAAK,GAAG,EAAE,EAAE,CAAC,KAAK,IAAK;AACrD,OAAG,EAAE,IAAI,CAAC,SAAS,MAAM,SAAS,MAAM,CAAC;AAAA,EAC3C;AACF;AAEA,SAAS,gBAAgBA,QAAY,UAAmC;AACtE,MAAI,CAACA,UAASA,OAAM,OAAO,EAAG;AAC9B,wBAAsBA,QAAO,QAAQ;AACrC,QAAM,KAAKA,OAAM,GAAG;AACpB,MAAI,CAAC,GAAI;AACT,MAAI,MAAM,QAAQ,GAAG,CAAC,GAAG;AACvB,OAAG,EAAE,QAAQ,CAACC,QAAY;AACxB,UAAIA,KAAI,EAAG,gBAAeA,IAAG,GAAG,QAAQ;AAAA,IAC1C,CAAC;AAAA,EACH,WAAW,GAAG,GAAG,GAAG;AAClB,mBAAe,GAAG,EAAE,GAAG,QAAQ;AAAA,EACjC;AACF;AAEA,SAAS,kBAAkB,YAAiB,IAAgC;AAC1E,MAAI,MAAM,QAAQ,WAAW,MAAM,EAAG,YAAW,OAAO,QAAQ,EAAE;AAClE,MAAI,MAAM,QAAQ,WAAW,MAAM,GAAG;AACpC,eAAW,OAAO,QAAQ,CAAC,UAAe;AACxC,UAAI,MAAM,QAAQ,MAAM,MAAM,EAAG,OAAM,OAAO,QAAQ,EAAE;AAAA,IAC1D,CAAC;AAAA,EACH;AACF;AAOO,SAAS,WAAW,YAAiB,eAAkC,YAAoC;AAChH,MAAI,CAAC,WAAY,QAAO;AACxB,QAAM,QAAQ,KAAK,MAAM,KAAK,UAAU,UAAU,CAAC;AACnD,QAAM,YAAY,IAAI,IAAI,WAAW,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC;AAEjE,oBAAkB,OAAO,CAACD,WAAU;AAClC,QAAIA,OAAM,OAAO,EAAG;AACpB,UAAM,SAAS,UAAU,IAAIA,OAAM,EAAE;AACrC,QAAI,CAAC,OAAQ;AACb,UAAM,MAAM,cAAc,OAAO,IAAI,KAAK,OAAO;AACjD,UAAM,OAAO,IAAI,MAAM,GAAG,OAAO,aAAa;AAC9C,oBAAgBA,QAAO,EAAE,KAAK,CAAC;AAAA,EACjC,CAAC;AAED,SAAO;AACT;AAKO,SAAS,gBAAgB,YAAiB,WAAmB,UAAkC;AACpG,MAAI,CAAC,WAAY,QAAO;AACxB,QAAM,QAAQ,KAAK,MAAM,KAAK,UAAU,UAAU,CAAC;AAEnD,oBAAkB,OAAO,CAACA,WAAU;AAClC,QAAIA,OAAM,OAAO,KAAKA,OAAM,OAAO,UAAW;AAC9C,oBAAgBA,QAAO,QAAQ;AAAA,EACjC,CAAC;AAED,SAAO;AACT;AAMO,SAAS,sBAAsB,YAAiB,UAAkE;AACvH,MAAI,CAAC,WAAY,QAAO;AACxB,QAAM,QAAQ,KAAK,MAAM,KAAK,UAAU,UAAU,CAAC;AAEnD,oBAAkB,OAAO,CAACA,WAAU;AAClC,QAAIA,OAAM,OAAO,EAAG;AACpB,oBAAgBA,QAAO,QAAQ;AAAA,EACjC,CAAC;AAED,SAAO;AACT;AAKO,SAAS,YAAY,YAAiB,WAAmB,UAAuB;AACrF,MAAI,CAAC,cAAc,CAAC,UAAW,QAAO;AACtC,QAAM,QAAQ,KAAK,MAAM,KAAK,UAAU,UAAU,CAAC;AACnD,QAAM,YAAY,eAAe,QAAQ;AAEzC,WAAS,eAAe,KAAgB;AACtC,QAAI,CAAC,OAAO,OAAO,QAAQ,SAAU;AACrC,QAAI,IAAI,OAAO,QAAQ,IAAI,GAAG;AAC5B,YAAM,IAAI,IAAI;AACd,UAAI,MAAM,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,UAAU,GAAG;AACzC,UAAE,EAAE,CAAC,IAAI,UAAU,CAAC;AACpB,UAAE,EAAE,CAAC,IAAI,UAAU,CAAC;AACpB,UAAE,EAAE,CAAC,IAAI,UAAU,CAAC;AAAA,MACtB,OAAO;AACL,UAAE,IAAI,CAAC,GAAG,SAAS;AAAA,MACrB;AAAA,IACF;AACA,eAAW,OAAO,OAAO,KAAK,GAAG,GAAG;AAClC,YAAM,MAAM,IAAI,GAAG;AACnB,UAAI,MAAM,QAAQ,GAAG,EAAG,KAAI,QAAQ,cAAc;AAAA,eACzC,OAAO,OAAO,QAAQ,SAAU,gBAAe,GAAG;AAAA,IAC7D;AAAA,EACF;AAEA,oBAAkB,OAAO,CAACA,WAAU;AAClC,QAAIA,OAAM,OAAO,UAAW,gBAAeA,MAAK;AAAA,EAClD,CAAC;AAED,SAAO;AACT;AAKO,SAAS,iBAAiB,YAAiB,WAAmB,UAAuB;AAC1F,MAAI,CAAC,WAAY,QAAO;AACxB,QAAM,QAAQ,KAAK,MAAM,KAAK,UAAU,UAAU,CAAC;AAEnD,oBAAkB,OAAO,CAACA,WAAU;AAClC,QAAIA,OAAM,OAAO,KAAKA,OAAM,OAAO,WAAW;AAC5C,MAAAA,OAAM,KAAK;AAAA,IACb;AAAA,EACF,CAAC;AAED,SAAO;AACT;AAaO,SAAS,YAAY,YAAiB,OAA4B;AACvE,MAAI,CAAC,WAAY,QAAO;AACxB,MAAI,QAAQ,KAAK,MAAM,KAAK,UAAU,UAAU,CAAC;AAGjD,MAAI,MAAM,gBAAgB,MAAM,QAAQ,MAAM,MAAM,GAAG;AACrD,UAAM,OAAO,QAAQ,CAACA,QAAY,QAAgB;AAChD,MAAAA,OAAM,KAAK,MAAM,aAAc,IAAI,GAAG;AAAA,IACxC,CAAC;AAAA,EACH;AAGA,MAAI,MAAM,mBAAmB;AAC3B,UAAM,EAAE,eAAe,OAAO,IAAI,MAAM;AACxC,UAAM,YAAY,IAAI,IAAI,OAAO,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC;AAC7D,sBAAkB,OAAO,CAACA,WAAU;AAClC,UAAIA,OAAM,OAAO,EAAG;AACpB,YAAM,SAAS,UAAU,IAAIA,OAAM,EAAE;AACrC,UAAI,CAAC,OAAQ;AACb,YAAM,MAAM,cAAc,OAAO,IAAI,KAAK,OAAO;AACjD,sBAAgBA,QAAO,EAAE,MAAM,IAAI,MAAM,GAAG,OAAO,aAAa,EAAE,CAAC;AAAA,IACrE,CAAC;AAAA,EACH;AAGA,MAAI,MAAM,gBAAgB;AACxB,UAAM,WAAW,IAAI,IAAI,MAAM,eAAe,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC;AACnF,sBAAkB,OAAO,CAACA,WAAU;AAClC,UAAIA,OAAM,OAAO,EAAG;AACpB,YAAM,WAAW,SAAS,IAAIA,OAAM,EAAE;AACtC,UAAI,SAAU,iBAAgBA,QAAO,QAAQ;AAAA,IAC/C,CAAC;AAAA,EACH;AAGA,MAAI,MAAM,gBAAgB;AACxB,eAAW,EAAE,WAAW,MAAM,KAAK,MAAM,gBAAgB;AACvD,cAAQ,YAAY,OAAO,WAAW,KAAK;AAAA,IAC7C;AAAA,EACF;AAGA,MAAI,MAAM,gBAAgB;AACxB,eAAW,EAAE,WAAW,MAAM,KAAK,MAAM,gBAAgB;AACvD,cAAQ,iBAAiB,OAAO,WAAW,KAAK;AAAA,IAClD;AAAA,EACF;AAEA,SAAO;AACT;;;AC5NA,IAAM,WAAW,EAAE,GAAG,EAAE,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC,EAAE,EAAE;AACtE,IAAM,UAAU,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC,EAAE,EAAE;AAClE,IAAM,UAAU,EAAE,GAAG,EAAE,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC,EAAE,EAAE;AACrE,IAAM,SAAS,EAAE,GAAG,EAAE,GAAG,CAAC,KAAK,GAAG,GAAG,CAAC,KAAK,EAAE,GAAG,GAAG,EAAE,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,KAAK,EAAE,EAAE;AAC7E,IAAM,SAAS,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,EAAE,EAAE;AAC9D,IAAM,SAAS,EAAE,GAAG,EAAE,GAAG,CAAC,KAAK,GAAG,GAAG,CAAC,IAAI,EAAE,GAAG,GAAG,EAAE,GAAG,CAAC,KAAK,GAAG,GAAG,CAAC,IAAI,EAAE,EAAE;AAE5E,SAAS,GAAG,GAAW,GAAsB,SAAS,UAAwB;AAC5E,SAAO,EAAE,GAAG,GAAG,GAAG,OAAO;AAC3B;AAEA,SAAS,OAAO,GAAW,GAAoC;AAC7D,SAAO,EAAE,GAAG,EAAE;AAChB;AAIA,IAAM,SAA2B;AAAA,EAC/B,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,UAAU;AAAA,EACV,MAAM;AAAA,EACN,aAAa;AAAA,EACb,uBAAuB;AAAA,EACvB,aAAa,CAAC,EAAE,YAAY,SAAS,MAAM;AAAA,IACzC;AAAA,MACE,MAAM;AAAA,MACN,WAAW,CAAC,GAAG,YAAY,GAAG,QAAQ,GAAG,OAAO,UAAU,GAAG,CAAC;AAAA,IAChE;AAAA,EACF;AACF;AAEA,IAAM,UAA4B;AAAA,EAChC,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,UAAU;AAAA,EACV,MAAM;AAAA,EACN,aAAa;AAAA,EACb,uBAAuB;AAAA,EACvB,aAAa,CAAC,EAAE,YAAY,UAAU,MAAM,MAAM;AAAA,IAChD,EAAE,MAAM,QAAQ,WAAW,CAAC,GAAG,YAAY,CAAC,GAAG,QAAQ,MAAM,CAAC,GAAG,MAAM,GAAG,OAAO,UAAU,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,EAAE;AAAA,IACvG,EAAE,MAAM,QAAQ,WAAW,CAAC,GAAG,YAAY,GAAG,QAAQ,GAAG,OAAO,UAAU,GAAG,CAAC,EAAE;AAAA,EAClF;AACF;AAEA,IAAM,YAA8B;AAAA,EAClC,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,UAAU;AAAA,EACV,MAAM;AAAA,EACN,aAAa;AAAA,EACb,uBAAuB;AAAA,EACvB,aAAa,CAAC,EAAE,YAAY,UAAU,MAAM,MAAM;AAAA,IAChD,EAAE,MAAM,QAAQ,WAAW,CAAC,GAAG,YAAY,CAAC,GAAG,CAAC,QAAQ,MAAM,CAAC,GAAG,MAAM,GAAG,OAAO,UAAU,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,EAAE;AAAA,IACxG,EAAE,MAAM,QAAQ,WAAW,CAAC,GAAG,YAAY,GAAG,QAAQ,GAAG,OAAO,UAAU,GAAG,CAAC,EAAE;AAAA,EAClF;AACF;AAEA,IAAM,YAA8B;AAAA,EAClC,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,UAAU;AAAA,EACV,MAAM;AAAA,EACN,aAAa;AAAA,EACb,uBAAuB;AAAA,EACvB,aAAa,CAAC,EAAE,YAAY,UAAU,MAAM,MAAM;AAAA,IAChD,EAAE,MAAM,QAAQ,WAAW,CAAC,GAAG,YAAY,CAAC,QAAQ,KAAK,GAAG,CAAC,GAAG,MAAM,GAAG,OAAO,UAAU,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,EAAE;AAAA,IACtG,EAAE,MAAM,QAAQ,WAAW,CAAC,GAAG,YAAY,GAAG,QAAQ,GAAG,OAAO,UAAU,GAAG,CAAC,EAAE;AAAA,EAClF;AACF;AAEA,IAAM,aAA+B;AAAA,EACnC,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,UAAU;AAAA,EACV,MAAM;AAAA,EACN,aAAa;AAAA,EACb,uBAAuB;AAAA,EACvB,aAAa,CAAC,EAAE,YAAY,UAAU,MAAM,MAAM;AAAA,IAChD,EAAE,MAAM,QAAQ,WAAW,CAAC,GAAG,YAAY,CAAC,CAAC,QAAQ,KAAK,GAAG,CAAC,GAAG,MAAM,GAAG,OAAO,UAAU,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,EAAE;AAAA,IACvG,EAAE,MAAM,QAAQ,WAAW,CAAC,GAAG,YAAY,GAAG,QAAQ,GAAG,OAAO,UAAU,GAAG,CAAC,EAAE;AAAA,EAClF;AACF;AAEA,IAAM,SAA2B;AAAA,EAC/B,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,UAAU;AAAA,EACV,MAAM;AAAA,EACN,aAAa;AAAA,EACb,uBAAuB;AAAA,EACvB,aAAa,CAAC,EAAE,YAAY,SAAS,MAAM;AAAA,IACzC,EAAE,MAAM,QAAQ,WAAW,CAAC,GAAG,YAAY,CAAC,GAAG,GAAG,GAAG,GAAG,MAAM,GAAG,OAAO,UAAU,CAAC,KAAK,KAAK,GAAG,CAAC,CAAC,EAAE;AAAA,IACpG,EAAE,MAAM,QAAQ,WAAW,CAAC,GAAG,YAAY,GAAG,QAAQ,GAAG,OAAO,UAAU,GAAG,CAAC,EAAE;AAAA,EAClF;AACF;AAEA,IAAM,eAAiC;AAAA,EACrC,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,UAAU;AAAA,EACV,MAAM;AAAA,EACN,aAAa;AAAA,EACb,uBAAuB;AAAA,EACvB,aAAa,CAAC,EAAE,YAAY,SAAS,MAAM;AACzC,UAAM,MAAM,KAAK,MAAM,cAAc,WAAW,cAAc,GAAG;AACjE,WAAO;AAAA,MACL,EAAE,MAAM,QAAQ,WAAW,CAAC,GAAG,YAAY,CAAC,GAAG,GAAG,GAAG,GAAG,MAAM,GAAG,GAAG,KAAK,CAAC,KAAK,KAAK,GAAG,GAAG,MAAM,GAAG,OAAO,UAAU,CAAC,KAAK,KAAK,GAAG,CAAC,CAAC,EAAE;AAAA,MACtI,EAAE,MAAM,QAAQ,WAAW,CAAC,GAAG,YAAY,GAAG,QAAQ,GAAG,OAAO,UAAU,GAAG,CAAC,EAAE;AAAA,IAClF;AAAA,EACF;AACF;AAEA,IAAM,QAA0B;AAAA,EAC9B,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,UAAU;AAAA,EACV,MAAM;AAAA,EACN,aAAa;AAAA,EACb,uBAAuB;AAAA,EACvB,aAAa,CAAC,EAAE,YAAY,SAAS,MAAM;AACzC,UAAM,MAAM,KAAK,MAAM,cAAc,WAAW,cAAc,GAAG;AACjE,WAAO;AAAA,MACL,EAAE,MAAM,QAAQ,WAAW,CAAC,GAAG,YAAY,CAAC,IAAI,IAAI,GAAG,GAAG,MAAM,GAAG,GAAG,KAAK,CAAC,KAAK,KAAK,GAAG,GAAG,MAAM,GAAG,OAAO,UAAU,CAAC,KAAK,KAAK,GAAG,CAAC,CAAC,EAAE;AAAA,MACxI,EAAE,MAAM,QAAQ,WAAW,CAAC,GAAG,YAAY,GAAG,QAAQ,GAAG,OAAO,UAAU,GAAG,CAAC,EAAE;AAAA,IAClF;AAAA,EACF;AACF;AAEA,IAAM,QAA0B;AAAA,EAC9B,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,UAAU;AAAA,EACV,MAAM;AAAA,EACN,aAAa;AAAA,EACb,uBAAuB;AAAA,EACvB,aAAa,CAAC,EAAE,YAAY,SAAS,MAAM;AAAA,IACzC,EAAE,MAAM,QAAQ,WAAW,CAAC,GAAG,YAAY,CAAC,GAAG,KAAK,GAAG,GAAG,QAAQ,GAAG,OAAO,UAAU,CAAC,KAAK,KAAK,GAAG,CAAC,CAAC,EAAE;AAAA,IACxG,EAAE,MAAM,QAAQ,WAAW,CAAC,GAAG,YAAY,GAAG,QAAQ,GAAG,OAAO,UAAU,GAAG,CAAC,EAAE;AAAA,EAClF;AACF;AAEA,IAAM,QAA0B;AAAA,EAC9B,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,UAAU;AAAA,EACV,MAAM;AAAA,EACN,aAAa;AAAA,EACb,uBAAuB;AAAA,EACvB,aAAa,CAAC,EAAE,YAAY,SAAS,MAAM;AAAA,IACzC,EAAE,MAAM,QAAQ,WAAW,CAAC,GAAG,YAAY,CAAC,KAAK,GAAG,GAAG,GAAG,QAAQ,GAAG,OAAO,UAAU,CAAC,KAAK,KAAK,GAAG,CAAC,CAAC,EAAE;AAAA,IACxG,EAAE,MAAM,QAAQ,WAAW,CAAC,GAAG,YAAY,GAAG,QAAQ,GAAG,OAAO,UAAU,GAAG,CAAC,EAAE;AAAA,EAClF;AACF;AAEA,IAAM,WAA6B;AAAA,EACjC,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,UAAU;AAAA,EACV,MAAM;AAAA,EACN,aAAa;AAAA,EACb,uBAAuB;AAAA,EACvB,aAAa,CAAC,EAAE,YAAY,SAAS,MAAM;AAAA,IACzC,EAAE,MAAM,QAAQ,WAAW,CAAC,GAAG,YAAY,KAAK,MAAM,GAAG,OAAO,UAAU,CAAC,CAAC,EAAE;AAAA,IAC9E,EAAE,MAAM,QAAQ,WAAW,CAAC,GAAG,YAAY,CAAC,IAAI,IAAI,GAAG,GAAG,QAAQ,GAAG,OAAO,UAAU,CAAC,KAAK,KAAK,GAAG,CAAC,CAAC,EAAE;AAAA,IACxG,EAAE,MAAM,QAAQ,WAAW,CAAC,GAAG,YAAY,GAAG,QAAQ,GAAG,OAAO,UAAU,GAAG,CAAC,EAAE;AAAA,EAClF;AACF;AAEA,IAAM,SAA2B;AAAA,EAC/B,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,UAAU;AAAA,EACV,MAAM;AAAA,EACN,aAAa;AAAA,EACb,uBAAuB;AAAA,EACvB,aAAa,CAAC,EAAE,YAAY,SAAS,MAAM;AAAA,IACzC,EAAE,MAAM,QAAQ,WAAW,CAAC,GAAG,YAAY,CAAC,KAAK,KAAK,GAAG,GAAG,QAAQ,GAAG,OAAO,UAAU,CAAC,KAAK,KAAK,GAAG,CAAC,CAAC,EAAE;AAAA,IAC1G,EAAE,MAAM,QAAQ,WAAW,CAAC,GAAG,YAAY,GAAG,QAAQ,GAAG,OAAO,UAAU,GAAG,CAAC,EAAE;AAAA,EAClF;AACF;AAEA,IAAM,SAA2B;AAAA,EAC/B,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,UAAU;AAAA,EACV,MAAM;AAAA,EACN,aAAa;AAAA,EACb,uBAAuB;AAAA,EACvB,aAAa,CAAC,EAAE,YAAY,UAAU,MAAM,MAAM;AAChD,UAAM,OAAO,KAAK,MAAM,cAAc,WAAW,cAAc,IAAI;AACnE,UAAM,SAAS,KAAK,MAAM,cAAc,WAAW,cAAc,IAAI;AACrE,WAAO;AAAA,MACL,EAAE,MAAM,QAAQ,WAAW,CAAC,GAAG,YAAY,CAAC,GAAG,CAAC,QAAQ,KAAK,CAAC,GAAG,OAAO,GAAG,GAAG,MAAM,CAAC,GAAG,GAAG,CAAC,GAAG,MAAM,GAAG,GAAG,QAAQ,CAAC,GAAG,IAAI,CAAC,GAAG,QAAQ,GAAG,OAAO,UAAU,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,EAAE;AAAA,MACvK,EAAE,MAAM,QAAQ,WAAW,CAAC,GAAG,YAAY,GAAG,GAAG,OAAO,UAAU,GAAG,CAAC,EAAE;AAAA,IAC1E;AAAA,EACF;AACF;AAEA,IAAM,aAA+B;AAAA,EACnC,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,UAAU;AAAA,EACV,MAAM;AAAA,EACN,aAAa;AAAA,EACb,uBAAuB;AAAA,EACvB,aAAa,CAAC,EAAE,YAAY,SAAS,MAAM;AAAA,IACzC,EAAE,MAAM,QAAQ,WAAW,CAAC,GAAG,YAAY,CAAC,GAAG,KAAK,GAAG,GAAG,MAAM,GAAG,OAAO,UAAU,CAAC,KAAK,KAAK,GAAG,CAAC,CAAC,EAAE;AAAA,IACtG,EAAE,MAAM,QAAQ,WAAW,CAAC,GAAG,YAAY,GAAG,GAAG,OAAO,UAAU,GAAG,CAAC,EAAE;AAAA,EAC1E;AACF;AAEA,IAAM,WAA6B;AAAA,EACjC,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,UAAU;AAAA,EACV,MAAM;AAAA,EACN,aAAa;AAAA,EACb,uBAAuB;AAAA,EACvB,aAAa,CAAC,EAAE,YAAY,SAAS,MAAM;AAAA,IACzC,EAAE,MAAM,QAAQ,WAAW,CAAC,GAAG,YAAY,CAAC,GAAG,KAAK,GAAG,GAAG,QAAQ,GAAG,OAAO,UAAU,CAAC,KAAK,KAAK,GAAG,CAAC,CAAC,EAAE;AAAA,IACxG,EAAE,MAAM,QAAQ,WAAW,CAAC,GAAG,YAAY,GAAG,GAAG,OAAO,UAAU,GAAG,CAAC,EAAE;AAAA,EAC1E;AACF;AAEA,IAAM,WAA6B;AAAA,EACjC,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,UAAU;AAAA,EACV,MAAM;AAAA,EACN,aAAa;AAAA,EACb,uBAAuB;AAAA,EACvB,aAAa,CAAC,EAAE,YAAY,SAAS,MAAM;AACzC,UAAM,KAAK,aAAa,GACtB,KAAK,aAAa,GAClB,KAAK,aAAa,GAClB,KAAK,aAAa;AACpB,WAAO;AAAA,MACL,EAAE,MAAM,QAAQ,WAAW,CAAC,GAAG,YAAY,CAAC,KAAK,GAAG,CAAC,GAAG,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,GAAG,CAAC,GAAG,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,CAAC,GAAG,QAAQ,GAAG,OAAO,UAAU,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,EAAE;AAAA,MAC/M,EAAE,MAAM,QAAQ,WAAW,CAAC,GAAG,YAAY,GAAG,MAAM,GAAG,GAAG,IAAI,KAAK,MAAM,GAAG,OAAO,UAAU,GAAG,CAAC,EAAE;AAAA,IACrG;AAAA,EACF;AACF;AAIA,IAAM,UAA4B;AAAA,EAChC,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,UAAU;AAAA,EACV,MAAM;AAAA,EACN,aAAa;AAAA,EACb,uBAAuB;AAAA,EACvB,aAAa,CAAC,EAAE,YAAY,SAAS,MAAM;AAAA,IACzC;AAAA,MACE,MAAM;AAAA,MACN,WAAW,CAAC,GAAG,YAAY,KAAK,OAAO,GAAG,OAAO,UAAU,CAAC,CAAC;AAAA,IAC/D;AAAA,EACF;AACF;AAEA,IAAM,aAA+B;AAAA,EACnC,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,UAAU;AAAA,EACV,MAAM;AAAA,EACN,aAAa;AAAA,EACb,uBAAuB;AAAA,EACvB,aAAa,CAAC,EAAE,YAAY,UAAU,MAAM,MAAM;AAAA,IAChD,EAAE,MAAM,QAAQ,WAAW,CAAC,GAAG,YAAY,CAAC,GAAG,GAAG,CAAC,GAAG,OAAO,GAAG,OAAO,UAAU,CAAC,GAAG,CAAC,QAAQ,KAAK,CAAC,CAAC,CAAC,EAAE;AAAA,IACxG,EAAE,MAAM,QAAQ,WAAW,CAAC,GAAG,YAAY,KAAK,OAAO,GAAG,OAAO,UAAU,CAAC,CAAC,EAAE;AAAA,EACjF;AACF;AAEA,IAAM,eAAiC;AAAA,EACrC,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,UAAU;AAAA,EACV,MAAM;AAAA,EACN,aAAa;AAAA,EACb,uBAAuB;AAAA,EACvB,aAAa,CAAC,EAAE,YAAY,UAAU,MAAM,MAAM;AAAA,IAChD,EAAE,MAAM,QAAQ,WAAW,CAAC,GAAG,YAAY,CAAC,GAAG,GAAG,CAAC,GAAG,OAAO,GAAG,OAAO,UAAU,CAAC,GAAG,QAAQ,KAAK,CAAC,CAAC,CAAC,EAAE;AAAA,IACvG,EAAE,MAAM,QAAQ,WAAW,CAAC,GAAG,YAAY,KAAK,OAAO,GAAG,OAAO,UAAU,CAAC,CAAC,EAAE;AAAA,EACjF;AACF;AAEA,IAAM,UAA4B;AAAA,EAChC,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,UAAU;AAAA,EACV,MAAM;AAAA,EACN,aAAa;AAAA,EACb,uBAAuB;AAAA,EACvB,aAAa,CAAC,EAAE,YAAY,SAAS,MAAM;AAAA,IACzC,EAAE,MAAM,QAAQ,WAAW,CAAC,GAAG,YAAY,CAAC,KAAK,KAAK,GAAG,GAAG,OAAO,GAAG,OAAO,UAAU,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,EAAE;AAAA,IACrG,EAAE,MAAM,QAAQ,WAAW,CAAC,GAAG,YAAY,KAAK,OAAO,GAAG,OAAO,UAAU,CAAC,CAAC,EAAE;AAAA,EACjF;AACF;AAEA,IAAM,eAAiC;AAAA,EACrC,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,UAAU;AAAA,EACV,MAAM;AAAA,EACN,aAAa;AAAA,EACb,uBAAuB;AAAA,EACvB,aAAa,CAAC,EAAE,YAAY,SAAS,MAAM;AACzC,UAAM,MAAM,KAAK,MAAM,cAAc,WAAW,cAAc,GAAG;AACjE,WAAO;AAAA,MACL,EAAE,MAAM,QAAQ,WAAW,CAAC,GAAG,YAAY,CAAC,KAAK,KAAK,GAAG,GAAG,OAAO,GAAG,GAAG,KAAK,CAAC,KAAK,KAAK,GAAG,GAAG,OAAO,GAAG,OAAO,UAAU,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,EAAE;AAAA,MACxI,EAAE,MAAM,QAAQ,WAAW,CAAC,GAAG,YAAY,KAAK,MAAM,GAAG,GAAG,KAAK,IAAI,MAAM,GAAG,OAAO,UAAU,CAAC,CAAC,EAAE;AAAA,IACrG;AAAA,EACF;AACF;AAEA,IAAM,YAA8B;AAAA,EAClC,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,UAAU;AAAA,EACV,MAAM;AAAA,EACN,aAAa;AAAA,EACb,uBAAuB;AAAA,EACvB,aAAa,CAAC,EAAE,YAAY,SAAS,MAAM;AACzC,UAAM,KAAK,WAAW,GACpB,KAAK,WAAW,GAChB,KAAK,WAAW;AAClB,WAAO;AAAA,MACL,EAAE,MAAM,QAAQ,WAAW,CAAC,GAAG,YAAY,CAAC,GAAG,GAAG,CAAC,GAAG,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,IAAI,CAAC,GAAG,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,GAAG,CAAC,GAAG,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,MAAM,GAAG,OAAO,UAAU,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,EAAE;AAAA,MACjL,EAAE,MAAM,QAAQ,WAAW,CAAC,GAAG,YAAY,GAAG,GAAG,GAAG,IAAI,IAAI,MAAM,GAAG,GAAG,IAAI,IAAI,MAAM,GAAG,OAAO,UAAU,CAAC,CAAC,EAAE;AAAA,IAChH;AAAA,EACF;AACF;AAIA,IAAM,QAA0B;AAAA,EAC9B,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,UAAU;AAAA,EACV,MAAM;AAAA,EACN,aAAa;AAAA,EACb,uBAAuB;AAAA,EACvB,aAAa,CAAC,EAAE,YAAY,YAAY,MAAM;AAC5C,UAAM,OAAO,KAAK,MAAM,cAAc,CAAC;AACvC,WAAO;AAAA,MACL;AAAA,QACE,MAAM;AAAA,QACN,WAAW,CAAC,GAAG,YAAY,CAAC,KAAK,KAAK,GAAG,GAAG,OAAO,GAAG,GAAG,aAAa,MAAM,CAAC,KAAK,KAAK,GAAG,GAAG,OAAO,GAAG,OAAO,aAAa,aAAa,CAAC,KAAK,KAAK,GAAG,CAAC,CAAC;AAAA,MAC1J;AAAA,IACF;AAAA,EACF;AACF;AAEA,IAAM,UAA4B;AAAA,EAChC,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,UAAU;AAAA,EACV,MAAM;AAAA,EACN,aAAa;AAAA,EACb,uBAAuB;AAAA,EACvB,aAAa,CAAC,EAAE,YAAY,YAAY,MAAM;AAC5C,UAAM,OAAO,KAAK,MAAM,cAAc,CAAC;AACvC,WAAO;AAAA,MACL,EAAE,MAAM,QAAQ,WAAW,CAAC,GAAG,YAAY,CAAC,KAAK,KAAK,GAAG,GAAG,OAAO,GAAG,GAAG,aAAa,MAAM,CAAC,KAAK,KAAK,GAAG,GAAG,OAAO,GAAG,OAAO,aAAa,aAAa,CAAC,KAAK,KAAK,GAAG,CAAC,CAAC,EAAE;AAAA,MAC1K,EAAE,MAAM,QAAQ,WAAW,CAAC,GAAG,YAAY,IAAI,OAAO,GAAG,GAAG,aAAa,MAAM,KAAK,OAAO,GAAG,OAAO,aAAa,aAAa,EAAE,CAAC,EAAE;AAAA,IACtI;AAAA,EACF;AACF;AAEA,IAAM,UAA4B;AAAA,EAChC,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,UAAU;AAAA,EACV,MAAM;AAAA,EACN,aAAa;AAAA,EACb,uBAAuB;AAAA,EACvB,aAAa,CAAC,EAAE,YAAY,YAAY,MAAM;AAC5C,UAAM,OAAO,KAAK,MAAM,cAAc,CAAC;AACvC,WAAO;AAAA,MACL;AAAA,QACE,MAAM;AAAA,QACN,WAAW,CAAC,GAAG,YAAY,CAAC,GAAG,GAAG,CAAC,GAAG,OAAO,GAAG,GAAG,aAAa,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,OAAO,GAAG,OAAO,aAAa,aAAa,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;AAAA,MACzI;AAAA,IACF;AAAA,EACF;AACF;AAEA,IAAM,QAA0B;AAAA,EAC9B,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,UAAU;AAAA,EACV,MAAM;AAAA,EACN,aAAa;AAAA,EACb,uBAAuB;AAAA,EACvB,aAAa,CAAC,EAAE,WAAW,MAAM;AAAA,IAC/B;AAAA,MACE,MAAM;AAAA,MACN,WAAW,CAAC,GAAG,YAAY,CAAC,GAAG,GAAG,CAAC,GAAG,MAAM,GAAG,GAAG,aAAa,GAAG,CAAC,IAAI,GAAG,CAAC,GAAG,MAAM,GAAG,GAAG,aAAa,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,MAAM,GAAG,GAAG,aAAa,GAAG,CAAC,IAAI,GAAG,CAAC,GAAG,MAAM,GAAG,GAAG,aAAa,IAAI,CAAC,GAAG,GAAG,CAAC,GAAG,MAAM,GAAG,GAAG,aAAa,IAAI,CAAC,IAAI,GAAG,CAAC,GAAG,MAAM,GAAG,OAAO,aAAa,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;AAAA,IAC3R;AAAA,EACF;AACF;AAEA,IAAM,SAA2B;AAAA,EAC/B,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,UAAU;AAAA,EACV,MAAM;AAAA,EACN,aAAa;AAAA,EACb,uBAAuB;AAAA,EACvB,aAAa,CAAC,EAAE,WAAW,MAAM;AAAA,IAC/B;AAAA,MACE,MAAM;AAAA,MACN,WAAW,CAAC,GAAG,YAAY,GAAG,OAAO,GAAG,GAAG,aAAa,GAAG,IAAI,OAAO,GAAG,GAAG,aAAa,IAAI,GAAG,OAAO,GAAG,GAAG,aAAa,IAAI,IAAI,OAAO,GAAG,OAAO,aAAa,IAAI,CAAC,CAAC;AAAA,IACxK;AAAA,EACF;AACF;AAEA,IAAM,cAAgC;AAAA,EACpC,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,UAAU;AAAA,EACV,MAAM;AAAA,EACN,aAAa;AAAA,EACb,uBAAuB;AAAA,EACvB,aAAa,CAAC,EAAE,WAAW,MAAM;AAAA,IAC/B;AAAA,MACE,MAAM;AAAA,MACN,WAAW,CAAC,GAAG,YAAY,KAAK,MAAM,GAAG,GAAG,aAAa,GAAG,IAAI,MAAM,GAAG,GAAG,aAAa,GAAG,KAAK,MAAM,GAAG,GAAG,aAAa,GAAG,IAAI,MAAM,GAAG,GAAG,aAAa,GAAG,KAAK,MAAM,GAAG,GAAG,aAAa,IAAI,KAAK,MAAM,GAAG,GAAG,aAAa,IAAI,IAAI,MAAM,GAAG,GAAG,aAAa,IAAI,KAAK,MAAM,GAAG,OAAO,aAAa,IAAI,GAAG,CAAC;AAAA,IAC9S;AAAA,EACF;AACF;AAEA,IAAM,OAAyB;AAAA,EAC7B,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,UAAU;AAAA,EACV,MAAM;AAAA,EACN,aAAa;AAAA,EACb,uBAAuB;AAAA,EACvB,aAAa,CAAC,EAAE,WAAW,MAAM;AAAA,IAC/B;AAAA,MACE,MAAM;AAAA,MACN,WAAW,CAAC,GAAG,YAAY,CAAC,GAAG,GAAG,CAAC,GAAG,OAAO,GAAG,GAAG,aAAa,IAAI,CAAC,GAAG,KAAK,CAAC,GAAG,OAAO,GAAG,GAAG,aAAa,IAAI,CAAC,GAAG,GAAG,CAAC,GAAG,OAAO,GAAG,GAAG,aAAa,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,OAAO,GAAG,OAAO,aAAa,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;AAAA,IAClN;AAAA,EACF;AACF;AAIA,IAAM,YAA8B;AAAA,EAClC,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,UAAU;AAAA,EACV,MAAM;AAAA,EACN,aAAa;AAAA,EACb,uBAAuB;AAAA,EACvB,aAAa,CAAC,EAAE,WAAW,MAAM;AAC/B,UAAM,MAAM,aAAa;AACzB,WAAO;AAAA,MACL;AAAA,QACE,MAAM;AAAA,QACN,WAAW,CAAC,GAAG,YAAY,CAAC,KAAK,KAAK,GAAG,GAAG,QAAQ,GAAG,GAAG,KAAK,CAAC,KAAK,KAAK,GAAG,GAAG,MAAM,GAAG,OAAO,aAAa,IAAI,CAAC,KAAK,KAAK,GAAG,CAAC,CAAC;AAAA,MACnI;AAAA,IACF;AAAA,EACF;AACF;AAEA,IAAM,QAA0B;AAAA,EAC9B,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,UAAU;AAAA,EACV,MAAM;AAAA,EACN,aAAa;AAAA,EACb,uBAAuB;AAAA,EACvB,aAAa,CAAC,EAAE,WAAW,MAAM;AAAA,IAC/B;AAAA,MACE,MAAM;AAAA,MACN,WAAW,CAAC,GAAG,YAAY,CAAC,KAAK,KAAK,GAAG,GAAG,OAAO,GAAG,GAAG,aAAa,GAAG,CAAC,KAAK,IAAI,GAAG,GAAG,MAAM,GAAG,GAAG,aAAa,IAAI,CAAC,IAAI,KAAK,GAAG,GAAG,MAAM,GAAG,GAAG,aAAa,IAAI,CAAC,KAAK,IAAI,GAAG,GAAG,MAAM,GAAG,GAAG,aAAa,IAAI,CAAC,IAAI,KAAK,GAAG,GAAG,MAAM,GAAG,OAAO,aAAa,IAAI,CAAC,KAAK,KAAK,GAAG,CAAC,CAAC;AAAA,IACnR;AAAA,EACF;AACF;AAEA,IAAM,QAA0B;AAAA,EAC9B,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,UAAU;AAAA,EACV,MAAM;AAAA,EACN,aAAa;AAAA,EACb,uBAAuB;AAAA,EACvB,aAAa,CAAC,EAAE,WAAW,MAAM;AAAA,IAC/B;AAAA,MACE,MAAM;AAAA,MACN,WAAW,CAAC,GAAG,YAAY,GAAG,OAAO,GAAG,GAAG,aAAa,GAAG,IAAI,OAAO,GAAG,GAAG,aAAa,IAAI,KAAK,OAAO,GAAG,GAAG,aAAa,IAAI,GAAG,OAAO,GAAG,GAAG,aAAa,IAAI,IAAI,OAAO,GAAG,OAAO,aAAa,IAAI,CAAC,CAAC;AAAA,IAC3M;AAAA,EACF;AACF;AAIO,IAAM,sBAA0C;AAAA;AAAA,EAErD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AACF;AAEO,IAAM,mBAAmB,oBAAoB,OAAO,CAAC,MAAM,EAAE,aAAa,UAAU;AACpF,IAAM,eAAe,oBAAoB,OAAO,CAAC,MAAM,EAAE,aAAa,MAAM;AAC5E,IAAM,eAAe,oBAAoB,OAAO,CAAC,MAAM,EAAE,aAAa,MAAM;AAC5E,IAAM,mBAAmB,oBAAoB,OAAO,CAAC,MAAM,EAAE,aAAa,UAAU;AAEpF,SAAS,cAAc,IAA0C;AACtE,SAAO,oBAAoB,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE;AACpD;AAMO,SAAS,uBAAuB,YAAiB,YAAoB,QAA0B,MAA8C;AAClJ,QAAM,QAAQ,KAAK,MAAM,KAAK,UAAU,UAAU,CAAC;AACnD,QAAME,SAAQ,MAAM,SAAS,UAAU;AACvC,MAAI,CAACA,OAAO,QAAO;AAEnB,QAAM,SAAS,OAAO,YAAY,EAAE,GAAG,MAAM,WAAW,CAAC;AAEzD,aAAW,SAAS,QAAQ;AAC1B,UAAM,OAAO,MAAM,KAAK,MAAM,GAAG;AACjC,QAAI,OAAOA;AACX,eAAW,KAAK,MAAM;AACpB,UAAI,CAAC,KAAK,CAAC,EAAG,MAAK,CAAC,IAAI,CAAC;AACzB,aAAO,KAAK,CAAC;AAAA,IACf;AAGA,QAAI,KAAK,MAAM,KAAK,KAAK,MAAM,QAAW;AACxC,YAAM,YAAY,KAAK,MAAM,MAAM,SAAS,SAAS,MAAM,MAAM,SAAS,SAAS,IAAI,CAAC,GAAG,GAAG,CAAC;AAC/F,WAAK,IAAI;AACT,WAAK,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,UAAU,CAAC;AAAA,IAClC;AAGA,UAAM,WAA2B,KAAK,KAAK,CAAC;AAC5C,eAAW,SAAS,MAAM,WAAW;AACnC,YAAM,MAAM,SAAS,UAAU,CAAC,MAAM,EAAE,MAAM,MAAM,CAAC;AACrD,UAAI,OAAO,GAAG;AACZ,iBAAS,GAAG,IAAI;AAAA,MAClB,OAAO;AACL,iBAAS,KAAK,KAAK;AAAA,MACrB;AAAA,IACF;AACA,aAAS,KAAK,CAAC,GAAG,MAAM,EAAE,IAAI,EAAE,CAAC;AAGjC,aAAS,QAAQ,CAAC,GAAG,MAAM;AACzB,UAAI,MAAM,SAAS,SAAS,GAAG;AAC7B,eAAQ,EAAU;AAClB,eAAQ,EAAU;AAAA,MACpB;AAAA,IACF,CAAC;AAED,SAAK,IAAI;AAAA,EACX;AAEA,SAAO;AACT;AAKO,SAAS,wBAAwB,YAAiB,YAAoB,QAAkB,CAAC,QAAQ,QAAQ,QAAQ,MAAM,GAAQ;AACpI,QAAM,QAAQ,KAAK,MAAM,KAAK,UAAU,UAAU,CAAC;AACnD,QAAMA,SAAQ,MAAM,SAAS,UAAU;AACvC,MAAI,CAACA,OAAO,QAAO;AAEnB,aAAW,QAAQ,OAAO;AACxB,UAAM,OAAO,KAAK,MAAM,GAAG;AAC3B,QAAI,OAAOA;AACX,eAAW,KAAK,MAAM;AACpB,UAAI,CAAC,KAAK,CAAC,EAAG;AACd,UAAI,MAAM,KAAK,KAAK,SAAS,CAAC,GAAG;AAC/B,YAAI,KAAK,CAAC,EAAE,MAAM,KAAK,MAAM,QAAQ,KAAK,CAAC,EAAE,CAAC,GAAG;AAC/C,gBAAMC,UAAS,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,SAAS,CAAC;AAC7C,eAAK,CAAC,IAAI,EAAE,GAAG,GAAG,GAAGA,SAAQ,MAAM,SAAS,SAAS,MAAM,SAAS,SAAS,IAAI,CAAC,GAAG,GAAG,CAAC,GAAG;AAAA,QAC9F;AAAA,MACF,OAAO;AACL,eAAO,KAAK,CAAC;AAAA,MACf;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;;;ACjmBO,IAAM,qBAAqC;AAAA,EAChD,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,UAAU;AAAA,EACV,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,OAAO;AAAA,EACP,UAAU;AAAA,EACV,WAAW;AAAA,EACX,eAAe;AAAA,IACb,EAAE,OAAO,WAAW,UAAU,EAAE;AAAA,IAChC,EAAE,OAAO,WAAW,UAAU,EAAE;AAAA,EAClC;AAAA,EACA,aAAa;AAAA,EACb,eAAe;AAAA,EACf,aAAa;AAAA,EACb,aAAa;AAAA,EACb,eAAe;AAAA,EACf,eAAe;AAAA,EACf,aAAa;AAAA,EACb,YAAY;AAAA,EACZ,eAAe;AAAA,EACf,eAAe;AAAA,EACf,eAAe;AAAA,EACf,aAAa;AAAA,EACb,WAAW;AAAA,EACX,UAAU;AAAA,EACV,aAAa;AAAA,EACb,MAAM;AAAA,EACN,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,SAAS;AACX;AAKO,SAAS,iBAAiB,KAAuC;AACtE,QAAM,QAAQ,IAAI,QAAQ,KAAK,EAAE,EAAE,OAAO,GAAG,GAAG;AAChD,SAAO,CAAC,SAAS,MAAM,MAAM,GAAG,CAAC,GAAG,EAAE,IAAI,KAAK,SAAS,MAAM,MAAM,GAAG,CAAC,GAAG,EAAE,IAAI,KAAK,SAAS,MAAM,MAAM,GAAG,CAAC,GAAG,EAAE,IAAI,GAAG;AAC7H;AAGO,SAAS,iBAAiB,KAAuB;AACtD,QAAM,IAAI,KAAK,OAAO,IAAI,CAAC,KAAK,KAAK,GAAG,EACrC,SAAS,EAAE,EACX,SAAS,GAAG,GAAG;AAClB,QAAM,IAAI,KAAK,OAAO,IAAI,CAAC,KAAK,KAAK,GAAG,EACrC,SAAS,EAAE,EACX,SAAS,GAAG,GAAG;AAClB,QAAM,IAAI,KAAK,OAAO,IAAI,CAAC,KAAK,KAAK,GAAG,EACrC,SAAS,EAAE,EACX,SAAS,GAAG,GAAG;AAClB,SAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,YAAY;AACrC;AAGO,SAAS,oBAAoB,QAAgB,QAAgB,OAAoC;AACtG,QAAM,WAAW,UAAU;AAC3B,QAAM,SAAS,UAAU;AACzB,QAAM,cAAc,UAAU;AAC9B,QAAM,UAAU,UAAU;AAE1B,MAAI,QAAS,QAAO,WAAW,GAAG,MAAM,iBAAiB,GAAG,MAAM;AAClE,MAAI,YAAa,QAAO,WAAW,GAAG,MAAM,qBAAqB,GAAG,MAAM;AAC1E,MAAI,OAAQ,QAAO,WAAW,GAAG,MAAM,gBAAgB,GAAG,MAAM;AAChE,SAAO,WAAW,GAAG,MAAM,YAAY,GAAG,MAAM;AAClD;AAGO,SAAS,eAAe,OAA0B;AACvD,UAAQ,OAAO;AAAA,IACb,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;AAEO,SAAS,eAAe,GAAsB;AACnD,UAAQ,GAAG;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;AAQO,SAAS,yBAAyBC,QAA4B;AACnE,QAAM,QAAwB,EAAE,GAAG,mBAAmB;AACtD,MAAI,CAACA,UAASA,OAAM,OAAO,EAAG,QAAO;AAGrC,QAAM,KAAKA,OAAM,MAAM,CAAC;AACxB,QAAM,MAAM,GAAG,GAAG;AAClB,MAAI,MAAM,QAAQ,GAAG,GAAG;AACtB,UAAM,OAAO,IAAI,CAAC,KAAK;AACvB,UAAM,OAAO,IAAI,CAAC,KAAK;AAAA,EACzB;AACA,QAAM,QAAQ,GAAG,GAAG;AACpB,MAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,UAAM,SAAS,MAAM,CAAC,KAAK;AAC3B,UAAM,SAAS,MAAM,CAAC,KAAK;AAAA,EAC7B;AACA,QAAM,MAAM,GAAG,GAAG;AAClB,MAAI,OAAO,QAAQ,SAAU,OAAM,WAAW;AAC9C,QAAM,KAAK,GAAG,GAAG;AACjB,MAAI,OAAO,OAAO,SAAU,OAAM,UAAU;AAG5C,QAAM,KAAKA,OAAM,GAAG;AACpB,MAAI,CAAC,GAAI,QAAO;AAChB,QAAM,MAAM,MAAM,QAAQ,GAAG,CAAC,IAAI,GAAG,EAAE,CAAC,GAAG,IAAI,GAAG,GAAG;AACrD,MAAI,CAAC,IAAK,QAAO;AAEjB,MAAI,OAAO,IAAI,MAAM,SAAU,OAAM,WAAW,IAAI;AACpD,MAAI,OAAO,IAAI,MAAM,UAAU;AAC7B,UAAM,WAAW,IAAI;AAErB,UAAM,QAAQ,IAAI,EAAE,MAAM,GAAG;AAC7B,UAAM,aAAa,MAAM,CAAC,KAAK;AAC/B,UAAM,UAAU,MAAM,CAAC,GAAG,YAAY,KAAK;AAC3C,UAAM,YAAY,QAAQ,SAAS,QAAQ,IAAI,WAAW;AAC1D,UAAM,aAAa,QAAQ,SAAS,OAAO,IAAI,MAAM,QAAQ,SAAS,WAAW,IAAI,MAAM,QAAQ,SAAS,MAAM,IAAI,MAAM;AAAA,EAC9H;AACA,MAAI,OAAO,IAAI,MAAM,SAAU,OAAM,QAAQ,eAAe,IAAI,CAAC;AACjE,MAAI,OAAO,IAAI,OAAO,SAAU,OAAM,WAAW,IAAI;AACrD,MAAI,OAAO,IAAI,OAAO,SAAU,OAAM,aAAa,IAAI,MAAM,IAAI,KAAK;AAGtE,MAAI,MAAM,QAAQ,IAAI,EAAE,KAAK,IAAI,GAAG,UAAU,GAAG;AAC/C,UAAM,YAAY,iBAAiB,IAAI,EAAE;AACzC,UAAM,WAAW;AAAA,EACnB;AAGA,MAAI,MAAM,QAAQ,IAAI,EAAE,KAAK,IAAI,GAAG,UAAU,GAAG;AAC/C,UAAM,gBAAgB;AACtB,UAAM,cAAc,iBAAiB,IAAI,EAAE;AAC3C,UAAM,cAAc,OAAO,IAAI,OAAO,WAAW,IAAI,KAAK;AAC1D,UAAM,gBAAgB,MAAM,cAAc;AAAA,EAC5C;AAEA,SAAO;AACT;AAQO,SAAS,wBAAwBA,QAAY,OAA4B;AAC9E,QAAM,QAAQ,KAAK,MAAM,KAAK,UAAUA,MAAK,CAAC;AAC9C,MAAI,CAAC,SAAS,MAAM,OAAO,EAAG,QAAO;AAGrC,QAAM,KAAK,MAAM,MAAM,CAAC;AAExB,MAAI,GAAG,GAAG;AACR,QAAI,GAAG,EAAE,MAAM,GAAG;AAChB,YAAM,OAAO,MAAM,QAAQ,GAAG,EAAE,CAAC,IAAI,GAAG,EAAE,IAAI,CAAC,GAAG,GAAG,CAAC;AACtD,SAAG,EAAE,IAAI,CAAC,MAAM,QAAQ,KAAK,CAAC,GAAG,MAAM,QAAQ,KAAK,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC;AAAA,IACtE;AAAA,EACF;AAEA,MAAI,GAAG,GAAG;AACR,QAAI,GAAG,EAAE,MAAM,GAAG;AAChB,SAAG,EAAE,IAAI,CAAC,MAAM,QAAQ,MAAM,QAAQ,GAAG;AAAA,IAC3C;AAAA,EACF;AAEA,MAAI,GAAG,GAAG;AACR,QAAI,GAAG,EAAE,MAAM,EAAG,IAAG,EAAE,IAAI,MAAM;AAAA,EACnC;AAEA,MAAI,GAAG,GAAG;AACR,QAAI,GAAG,EAAE,MAAM,EAAG,IAAG,EAAE,IAAI,MAAM;AAAA,EACnC;AACA,QAAM,KAAK;AAGX,QAAM,KAAK,MAAM,GAAG;AACpB,MAAI,CAAC,GAAI,QAAO;AAEhB,QAAM,aAAa,CAAC,QAAa;AAC/B,QAAI,CAAC,IAAK;AACV,QAAI,IAAI,MAAM;AACd,QAAI,IAAI,MAAM,YAAY,oBAAoB,MAAM,YAAY,MAAM,YAAY,MAAM,SAAS;AACjG,QAAI,IAAI,eAAe,MAAM,KAAK;AAClC,QAAI,KAAK,MAAM;AACf,QAAI,KAAK,MAAM,WAAW,MAAM;AAGhC,QAAI,KAAK,iBAAiB,MAAM,SAAS;AAGzC,QAAI,MAAM,iBAAiB,MAAM,cAAc,GAAG;AAChD,UAAI,KAAK,iBAAiB,MAAM,WAAW;AAC3C,UAAI,KAAK,MAAM;AACf,UAAI,KAAK;AAAA,IACX,OAAO;AACL,UAAI,KAAK;AAAA,IACX;AAAA,EACF;AAEA,MAAI,MAAM,QAAQ,GAAG,CAAC,GAAG;AACvB,OAAG,EAAE,QAAQ,CAACC,QAAY;AACxB,UAAIA,KAAI,EAAG,YAAWA,IAAG,CAAC;AAAA,IAC5B,CAAC;AAAA,EACH,WAAW,GAAG,GAAG,GAAG;AAClB,eAAW,GAAG,EAAE,CAAC;AAAA,EACnB;AAEA,SAAO;AACT;AAKO,SAAS,mBAAmB,YAAiB,YAAoB,OAA4B;AAClG,QAAM,QAAQ,KAAK,MAAM,KAAK,UAAU,UAAU,CAAC;AACnD,MAAI,CAAC,MAAM,SAAS,UAAU,EAAG,QAAO;AACxC,QAAM,OAAO,UAAU,IAAI,wBAAwB,MAAM,OAAO,UAAU,GAAG,KAAK;AAClF,SAAO;AACT;AAcO,SAAS,mBAAmB,YAAiB,OAA6B;AAC/E,QAAM,QAAQ,KAAK,MAAM,KAAK,UAAU,UAAU,CAAC;AACnD,MAAI,CAAC,MAAM,MAAO,OAAM,QAAQ,EAAE,MAAM,CAAC,EAAE;AAC3C,MAAI,CAAC,MAAM,QAAQ,MAAM,MAAM,IAAI,EAAG,OAAM,MAAM,OAAO,CAAC;AAC1D,QAAM,SAAS,MAAM,MAAM,KAAK,KAAK,CAAC,MAAW,EAAE,UAAU,MAAM,KAAK;AACxE,MAAI,CAAC,OAAQ,OAAM,MAAM,KAAK,KAAK,KAAK;AACxC,SAAO;AACT;AAGO,IAAM,0BAAoC,CAAC,WAAW,cAAc,SAAS,UAAU,aAAa,QAAQ,WAAW,UAAU,cAAc,SAAS,oBAAoB,gBAAgB,UAAU,UAAU,mBAAmB,WAAW,aAAa,SAAS,UAAU,SAAS,aAAa,YAAY,WAAW,kBAAkB,WAAW,oBAAoB,SAAS,WAAW,mBAAmB,aAAa;AAEha,IAAM,sBAAsB;AAAA,EACjC,EAAE,OAAO,QAAQ,OAAO,IAAI;AAAA,EAC5B,EAAE,OAAO,SAAS,OAAO,IAAI;AAAA,EAC7B,EAAE,OAAO,WAAW,OAAO,IAAI;AAAA,EAC/B,EAAE,OAAO,UAAU,OAAO,IAAI;AAAA,EAC9B,EAAE,OAAO,YAAY,OAAO,IAAI;AAAA,EAChC,EAAE,OAAO,QAAQ,OAAO,IAAI;AAAA,EAC5B,EAAE,OAAO,aAAa,OAAO,IAAI;AAAA,EACjC,EAAE,OAAO,SAAS,OAAO,IAAI;AAC/B;AAGO,SAAS,iBAAiB,QAAmC;AAClE,QAAM,WAAqE;AAAA,IACzE,EAAE,QAAQ,OAAO,OAAO,WAAW,QAAQ,UAAU;AAAA,IACrD,EAAE,QAAQ,OAAO,OAAO,QAAQ,QAAQ,OAAO;AAAA,IAC/C,EAAE,QAAQ,OAAO,OAAO,UAAU,QAAQ,SAAS;AAAA,IACnD,EAAE,QAAQ,OAAO,OAAO,eAAe,QAAQ,aAAa;AAAA,IAC5D,EAAE,QAAQ,OAAO,OAAO,aAAa,QAAQ,YAAY;AAAA,IACzD,EAAE,QAAQ,OAAO,OAAO,SAAS,QAAQ,QAAQ;AAAA,EACnD;AACA,SAAO,SAAS,IAAI,CAAC,OAAO;AAAA,IAC1B,OAAO,GAAG,MAAM,IAAI,EAAE,MAAM;AAAA,IAC5B,SAAS;AAAA,IACT,SAAS,EAAE;AAAA,IACX,QAAQ,EAAE;AAAA,IACV,QAAQ,GAAG,MAAM,IAAI,EAAE,MAAM;AAAA,IAC7B,YAAY,CAAC,CAAC,SAAS,WAAW,mBAAmB,aAAa,EAAE,SAAS,MAAM;AAAA,EACrF,EAAE;AACJ;;;ACnVA,SAAS,WAAW,KAAuC;AACzD,QAAM,IAAI,IAAI,QAAQ,KAAK,EAAE,EAAE,OAAO,GAAG,GAAG;AAC5C,SAAO,CAAC,SAAS,EAAE,MAAM,GAAG,CAAC,GAAG,EAAE,IAAI,KAAK,SAAS,EAAE,MAAM,GAAG,CAAC,GAAG,EAAE,IAAI,KAAK,SAAS,EAAE,MAAM,GAAG,CAAC,GAAG,EAAE,IAAI,GAAG;AACjH;AAEA,SAAS,aACPC,QACA,MAUK;AACL,QAAM,QAAQ,KAAK,MAAM,KAAK,UAAUA,MAAK,CAAC;AAC9C,QAAM,WAAW,CAAC,QAAa;AAC7B,QAAI,IAAI,KAAK;AACb,QAAI,IAAI,KAAK;AACb,QAAI,IAAI,KAAK;AACb,QAAI,KAAK,WAAW,KAAK,KAAK;AAC9B,QAAI,IAAI,KAAK,SAAS;AACtB,QAAI,KAAK,KAAK,YAAY;AAC1B,QAAI,KAAK,KAAK,OAAO;AACrB,QAAI,KAAK,eAAe,KAAK,aAAa;AACxC,UAAI,KAAK,WAAW,KAAK,WAAW;AACpC,UAAI,KAAK,KAAK;AAAA,IAChB;AAAA,EACF;AACA,QAAM,KAAK,MAAM,GAAG;AACpB,MAAI,CAAC,GAAI,QAAO;AAChB,MAAI,MAAM,QAAQ,GAAG,CAAC;AACpB,OAAG,EAAE,QAAQ,CAACC,QAAY;AACxB,UAAIA,KAAI,EAAG,UAASA,IAAG,CAAC;AAAA,IAC1B,CAAC;AAAA,WACM,GAAG,GAAG,EAAG,UAAS,GAAG,EAAE,CAAC;AACjC,SAAO;AACT;AAEA,SAAS,YAAYD,QAAY,GAAW,GAAgB;AAC1D,QAAM,QAAQ,KAAK,MAAM,KAAK,UAAUA,MAAK,CAAC;AAC9C,MAAI,MAAM,IAAI,GAAG,MAAM,EAAG,OAAM,GAAG,EAAE,IAAI,CAAC,GAAG,GAAG,CAAC;AACjD,SAAO;AACT;AAQA,SAAS,eAAe,QAAa,MAAc,IAAY,IAAY,GAAW,GAAW,GAAW,OAAoB;AAC9H,MAAI,QAAQ,KAAK,MAAM,KAAK,UAAU,MAAM,CAAC;AAC7C,QAAM,CAAC,IAAI,IAAI,EAAE,IAAI,WAAW,KAAK;AACrC,QAAM,aAAa;AAAA,IACjB,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI,MAAM;AAAA,IACV,KAAK;AAAA,IACL,IAAI;AAAA,MACF,GAAG,EAAE,GAAG,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,EAAE;AAAA,MACxB,GAAG,EAAE,GAAG,GAAG,GAAG,CAAC,IAAI,IAAI,CAAC,EAAE;AAAA,MAC1B,GAAG,EAAE,GAAG,GAAG,GAAG,CAAC,KAAK,KAAK,GAAG,EAAE;AAAA,MAC9B,GAAG,EAAE,GAAG,GAAG,GAAG,EAAE;AAAA,MAChB,GAAG,EAAE,GAAG,GAAG,GAAG,IAAI;AAAA,IACpB;AAAA,IACA,QAAQ;AAAA,MACN;AAAA,QACE,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI;AAAA,UACF,EAAE,IAAI,MAAM,IAAI,QAAQ,GAAG,EAAE,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,GAAG,GAAG,EAAE,EAAE;AAAA,UAC1F,EAAE,IAAI,MAAM,IAAI,QAAQ,GAAG,EAAE,GAAG,GAAG,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,GAAG,GAAG,IAAI,EAAE;AAAA,UAC7E,EAAE,IAAI,MAAM,IAAI,MAAM,GAAG,EAAE,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,GAAG,GAAG,CAAC,KAAK,GAAG,EAAE,GAAG,GAAG,EAAE,GAAG,GAAG,GAAG,EAAE,GAAG,GAAG,EAAE,GAAG,GAAG,GAAG,IAAI,EAAE;AAAA,QAC3I;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,QAAM,OAAO,KAAK,UAAU;AAC5B,gBAAc,KAAK;AACnB,SAAO;AACT;AAIA,SAAS,uBAA4B;AACnC,MAAI,IAAI,kBAAkB,MAAM,MAAM,IAAI,GAAG;AAC7C,MAAI,eAAe,GAAG,UAAU,KAAK,KAAK,KAAK,IAAI,GAAG,SAAS;AAC/D,MAAI,aAAa,GAAG,QAAQ,UAAU;AACtC,IAAE,OAAO,CAAC,IAAI,aAAa,EAAE,OAAO,CAAC,GAAG,EAAE,MAAM,YAAY,MAAM,gBAAgB,MAAM,IAAI,OAAO,WAAW,OAAO,GAAG,UAAU,GAAG,CAAC;AACtI,IAAE,OAAO,CAAC,IAAI,YAAY,EAAE,OAAO,CAAC,GAAG,KAAK,GAAG;AAC/C,MAAI,aAAa,GAAG,SAAS,mBAAmB;AAChD,IAAE,OAAO,CAAC,IAAI,aAAa,EAAE,OAAO,CAAC,GAAG,EAAE,MAAM,qBAAqB,MAAM,mBAAmB,MAAM,IAAI,OAAO,WAAW,OAAO,EAAE,CAAC;AACpI,IAAE,OAAO,CAAC,IAAI,YAAY,EAAE,OAAO,CAAC,GAAG,KAAK,GAAG;AAE/C,QAAM,UAAU,EAAE,OAAO,UAAU,CAAC,MAAW,EAAE,OAAO,MAAM;AAC9D,QAAM,WAAW,EAAE,OAAO,UAAU,CAAC,MAAW,EAAE,OAAO,OAAO;AAChE,QAAM,cAAc,cAAc,aAAa;AAC/C,MAAI,eAAe,WAAW,EAAG,KAAI,uBAAuB,GAAG,SAAS,aAAa,EAAE,YAAY,GAAG,UAAU,IAAI,aAAa,KAAK,OAAO,MAAM,OAAO,KAAK,CAAC;AAChK,MAAI,eAAe,YAAY,EAAG,KAAI,uBAAuB,GAAG,UAAU,aAAa,EAAE,YAAY,IAAI,UAAU,IAAI,aAAa,KAAK,OAAO,MAAM,OAAO,KAAK,CAAC;AACnK,gBAAc,CAAC;AACf,SAAO;AACT;AAEA,SAAS,iBAAsB;AAC7B,MAAI,IAAI,kBAAkB,MAAM,MAAM,IAAI,GAAG;AAC7C,MAAI,cAAc,GAAG,MAAM,WAAW,MAAM,IAAI;AAChD,MAAI,aAAa,GAAG,cAAc,aAAa;AAC/C,IAAE,OAAO,CAAC,IAAI,aAAa,EAAE,OAAO,CAAC,GAAG,EAAE,MAAM,eAAe,MAAM,oBAAoB,MAAM,KAAK,OAAO,WAAW,OAAO,GAAG,UAAU,KAAK,aAAa,WAAW,aAAa,EAAE,CAAC;AACvL,IAAE,OAAO,CAAC,IAAI,YAAY,EAAE,OAAO,CAAC,GAAG,KAAK,GAAG;AAC/C,MAAI,aAAa,GAAG,YAAY,gBAAgB;AAChD,IAAE,OAAO,CAAC,IAAI,aAAa,EAAE,OAAO,CAAC,GAAG,EAAE,MAAM,kBAAkB,MAAM,sBAAsB,MAAM,IAAI,OAAO,WAAW,OAAO,GAAG,UAAU,IAAI,CAAC;AACnJ,IAAE,OAAO,CAAC,IAAI,YAAY,EAAE,OAAO,CAAC,GAAG,KAAK,GAAG;AAC/C,QAAM,UAAU,EAAE,OAAO,UAAU,CAAC,MAAW,EAAE,OAAO,YAAY;AACpE,QAAM,SAAS,EAAE,OAAO,UAAU,CAAC,MAAW,EAAE,OAAO,UAAU;AACjE,QAAM,aAAa,cAAc,gBAAgB;AACjD,QAAM,aAAa,cAAc,SAAS;AAC1C,MAAI,cAAc,WAAW,EAAG,KAAI,uBAAuB,GAAG,SAAS,YAAY,EAAE,YAAY,GAAG,UAAU,IAAI,aAAa,KAAK,OAAO,MAAM,OAAO,KAAK,CAAC;AAC9J,MAAI,cAAc,UAAU,EAAG,KAAI,uBAAuB,GAAG,QAAQ,YAAY,EAAE,YAAY,IAAI,UAAU,IAAI,aAAa,KAAK,OAAO,MAAM,OAAO,KAAK,CAAC;AAC7J,gBAAc,CAAC;AACf,SAAO;AACT;AAEA,SAAS,sBAA2B;AAClC,MAAI,IAAI,kBAAkB,MAAM,MAAM,IAAI,EAAE;AAC5C,MAAI,aAAa,GAAG,WAAW,wBAAwB;AACvD,IAAE,OAAO,CAAC,IAAI,aAAa,EAAE,OAAO,CAAC,GAAG,EAAE,MAAM,0BAA0B,MAAM,iBAAiB,MAAM,IAAI,OAAO,WAAW,OAAO,EAAE,CAAC;AACvI,IAAE,OAAO,CAAC,IAAI,YAAY,EAAE,OAAO,CAAC,GAAG,KAAK,GAAG;AAC/C,QAAM,MAAM,EAAE,OAAO,UAAU,CAAC,MAAW,EAAE,OAAO,SAAS;AAC7D,QAAM,SAAS,cAAc,UAAU;AACvC,MAAI,UAAU,OAAO,EAAG,KAAI,uBAAuB,GAAG,KAAK,QAAQ,EAAE,YAAY,GAAG,UAAU,IAAI,aAAa,IAAI,OAAO,MAAM,OAAO,KAAK,CAAC;AAC7I,gBAAc,CAAC;AACf,SAAO;AACT;AAEA,SAAS,mBAAwB;AAC/B,MAAI,IAAI,kBAAkB,MAAM,MAAM,IAAI,GAAG;AAC7C,MAAI,eAAe,GAAG,WAAW,KAAK,KAAK,KAAK,KAAK,IAAI,SAAS;AAClE,MAAI,aAAa,GAAG,WAAW,eAAe;AAC9C,IAAE,OAAO,CAAC,IAAI,aAAa,EAAE,OAAO,CAAC,GAAG,EAAE,MAAM,iBAAiB,MAAM,eAAe,MAAM,IAAI,OAAO,WAAW,OAAO,GAAG,UAAU,IAAI,CAAC;AAC3I,IAAE,OAAO,CAAC,IAAI,YAAY,EAAE,OAAO,CAAC,GAAG,KAAK,GAAG;AAC/C,QAAM,MAAM,EAAE,OAAO,UAAU,CAAC,MAAW,EAAE,OAAO,SAAS;AAC7D,QAAM,SAAS,cAAc,QAAQ;AACrC,MAAI,UAAU,OAAO,EAAG,KAAI,uBAAuB,GAAG,KAAK,QAAQ,EAAE,YAAY,GAAG,UAAU,IAAI,aAAa,KAAK,OAAO,MAAM,OAAO,KAAK,CAAC;AAC9I,gBAAc,CAAC;AACf,SAAO;AACT;AAEA,SAAS,sBAA2B;AAClC,MAAI,IAAI,kBAAkB,MAAM,MAAM,IAAI,GAAG;AAC7C,MAAI,cAAc,GAAG,MAAM,WAAW,MAAM,IAAI;AAEhD,MAAI,eAAe,GAAG,WAAW,KAAK,IAAI,MAAM,KAAK,GAAG,SAAS;AACjE,MAAI,eAAe,GAAG,cAAc,KAAK,MAAM,MAAM,KAAK,GAAG,SAAS;AACtE,MAAI,aAAa,GAAG,cAAc,kBAAkB;AACpD,IAAE,OAAO,CAAC,IAAI,aAAa,EAAE,OAAO,CAAC,GAAG,EAAE,MAAM,oBAAoB,MAAM,yBAAyB,MAAM,IAAI,OAAO,WAAW,OAAO,GAAG,UAAU,IAAI,CAAC;AACxJ,IAAE,OAAO,CAAC,IAAI,YAAY,EAAE,OAAO,CAAC,GAAG,KAAK,GAAG;AAC/C,MAAI,aAAa,GAAG,WAAW,gCAAgC;AAC/D,IAAE,OAAO,CAAC,IAAI,aAAa,EAAE,OAAO,CAAC,GAAG,EAAE,MAAM,kCAAkC,MAAM,2BAA2B,MAAM,IAAI,OAAO,WAAW,OAAO,EAAE,CAAC;AACzJ,IAAE,OAAO,CAAC,IAAI,YAAY,EAAE,OAAO,CAAC,GAAG,KAAK,GAAG;AAC/C,QAAM,WAAW,EAAE,OAAO,UAAU,CAAC,MAAW,EAAE,OAAO,YAAY;AACrE,QAAM,SAAS,EAAE,OAAO,UAAU,CAAC,MAAW,EAAE,OAAO,SAAS;AAChE,QAAM,aAAa,cAAc,SAAS;AAC1C,MAAI,cAAc,YAAY,EAAG,KAAI,uBAAuB,GAAG,UAAU,YAAY,EAAE,YAAY,IAAI,UAAU,IAAI,aAAa,KAAK,OAAO,MAAM,OAAO,KAAK,CAAC;AACjK,MAAI,cAAc,UAAU,EAAG,KAAI,uBAAuB,GAAG,QAAQ,YAAY,EAAE,YAAY,IAAI,UAAU,IAAI,aAAa,KAAK,OAAO,MAAM,OAAO,KAAK,CAAC;AAC7J,gBAAc,CAAC;AACf,SAAO;AACT;AAEA,SAAS,mBAAwB;AAC/B,MAAI,IAAI,kBAAkB,MAAM,MAAM,IAAI,EAAE;AAC5C,MAAI,eAAe,GAAG,YAAY,KAAK,IAAI,KAAK,IAAI,GAAG,SAAS;AAChE,MAAI,aAAa,GAAG,UAAU,QAAQ;AACtC,IAAE,OAAO,CAAC,IAAI,aAAa,EAAE,OAAO,CAAC,GAAG,EAAE,MAAM,UAAU,MAAM,eAAe,MAAM,IAAI,OAAO,WAAW,OAAO,GAAG,UAAU,IAAI,CAAC;AACpI,IAAE,OAAO,CAAC,IAAI,YAAY,EAAE,OAAO,CAAC,GAAG,KAAK,EAAE;AAC9C,MAAI,aAAa,GAAG,SAAS,OAAO;AACpC,IAAE,OAAO,CAAC,IAAI,aAAa,EAAE,OAAO,CAAC,GAAG,EAAE,MAAM,SAAS,MAAM,eAAe,MAAM,IAAI,OAAO,WAAW,OAAO,GAAG,UAAU,GAAG,CAAC;AAClI,IAAE,OAAO,CAAC,IAAI,YAAY,EAAE,OAAO,CAAC,GAAG,KAAK,EAAE;AAC9C,MAAI,aAAa,GAAG,UAAU,QAAQ;AACtC,IAAE,OAAO,CAAC,IAAI,aAAa,EAAE,OAAO,CAAC,GAAG,EAAE,MAAM,UAAU,MAAM,eAAe,MAAM,IAAI,OAAO,WAAW,OAAO,GAAG,UAAU,IAAI,CAAC;AACpI,IAAE,OAAO,CAAC,IAAI,YAAY,EAAE,OAAO,CAAC,GAAG,MAAM,EAAE;AAC/C,QAAM,WAAW,EAAE,OAAO,UAAU,CAAC,MAAW,EAAE,OAAO,OAAO;AAChE,QAAM,SAAS,cAAc,gBAAgB;AAC7C,MAAI,UAAU,YAAY,EAAG,KAAI,uBAAuB,GAAG,UAAU,QAAQ,EAAE,YAAY,GAAG,UAAU,IAAI,aAAa,IAAI,OAAO,MAAM,OAAO,KAAK,CAAC;AACvJ,gBAAc,CAAC;AACf,SAAO;AACT;AAEA,SAAS,mBAAwB;AAC/B,MAAI,IAAI,kBAAkB,MAAM,MAAM,IAAI,GAAG;AAC7C,MAAI,cAAc,GAAG,MAAM,WAAW,MAAM,IAAI;AAChD,MAAI,eAAe,GAAG,QAAQ,KAAK,KAAK,KAAK,KAAK,IAAI,SAAS;AAC/D,MAAI,aAAa,GAAG,SAAS,kEAAkE;AAC/F,IAAE,OAAO,CAAC,IAAI,aAAa,EAAE,OAAO,CAAC,GAAG,EAAE,MAAM,4CAA4C,MAAM,uBAAuB,MAAM,IAAI,OAAO,WAAW,OAAO,EAAE,CAAC;AAC/J,IAAE,OAAO,CAAC,IAAI,YAAY,EAAE,OAAO,CAAC,GAAG,KAAK,GAAG;AAC/C,MAAI,aAAa,GAAG,UAAU,mBAAc;AAC5C,IAAE,OAAO,CAAC,IAAI,aAAa,EAAE,OAAO,CAAC,GAAG,EAAE,MAAM,qBAAgB,MAAM,mBAAmB,MAAM,IAAI,OAAO,WAAW,OAAO,EAAE,CAAC;AAC/H,IAAE,OAAO,CAAC,IAAI,YAAY,EAAE,OAAO,CAAC,GAAG,KAAK,GAAG;AAC/C,QAAM,WAAW,EAAE,OAAO,UAAU,CAAC,MAAW,EAAE,OAAO,OAAO;AAChE,QAAM,YAAY,EAAE,OAAO,UAAU,CAAC,MAAW,EAAE,OAAO,QAAQ;AAClE,QAAM,aAAa,cAAc,SAAS;AAC1C,QAAM,cAAc,cAAc,UAAU;AAC5C,MAAI,cAAc,YAAY,EAAG,KAAI,uBAAuB,GAAG,UAAU,YAAY,EAAE,YAAY,GAAG,UAAU,IAAI,aAAa,KAAK,OAAO,MAAM,OAAO,KAAK,CAAC;AAChK,MAAI,eAAe,aAAa,EAAG,KAAI,uBAAuB,GAAG,WAAW,aAAa,EAAE,YAAY,IAAI,UAAU,IAAI,aAAa,KAAK,OAAO,MAAM,OAAO,KAAK,CAAC;AACrK,gBAAc,CAAC;AACf,SAAO;AACT;AAEA,SAAS,mBAAwB;AAC/B,MAAI,IAAI,kBAAkB,MAAM,MAAM,IAAI,GAAG;AAC7C,MAAI,cAAc,GAAG,MAAM,WAAW,MAAM,IAAI;AAChD,MAAI,aAAa,GAAG,UAAU,MAAM;AACpC,IAAE,OAAO,CAAC,IAAI,aAAa,EAAE,OAAO,CAAC,GAAG,EAAE,MAAM,QAAQ,MAAM,iBAAiB,MAAM,KAAK,OAAO,WAAW,OAAO,GAAG,UAAU,GAAG,CAAC;AACpI,IAAE,OAAO,CAAC,IAAI,YAAY,EAAE,OAAO,CAAC,GAAG,KAAK,GAAG;AAC/C,MAAI,aAAa,GAAG,UAAU,IAAI;AAClC,IAAE,OAAO,CAAC,IAAI,aAAa,EAAE,OAAO,CAAC,GAAG,EAAE,MAAM,MAAM,MAAM,iBAAiB,MAAM,KAAK,OAAO,WAAW,OAAO,GAAG,UAAU,GAAG,CAAC;AAClI,IAAE,OAAO,CAAC,IAAI,YAAY,EAAE,OAAO,CAAC,GAAG,KAAK,GAAG;AAC/C,MAAI,aAAa,GAAG,UAAU,OAAO;AACrC,IAAE,OAAO,CAAC,IAAI,aAAa,EAAE,OAAO,CAAC,GAAG,EAAE,MAAM,SAAS,MAAM,iBAAiB,MAAM,KAAK,OAAO,WAAW,OAAO,GAAG,UAAU,GAAG,CAAC;AACrI,IAAE,OAAO,CAAC,IAAI,YAAY,EAAE,OAAO,CAAC,GAAG,KAAK,GAAG;AAC/C,QAAM,KAAK,EAAE,OAAO,UAAU,CAAC,MAAW,EAAE,OAAO,QAAQ;AAC3D,QAAM,KAAK,EAAE,OAAO,UAAU,CAAC,MAAW,EAAE,OAAO,QAAQ;AAC3D,QAAM,KAAK,EAAE,OAAO,UAAU,CAAC,MAAW,EAAE,OAAO,QAAQ;AAC3D,QAAM,SAAS,cAAc,YAAY;AACzC,QAAM,SAAS,cAAc,aAAa;AAC1C,QAAM,SAAS,cAAc,UAAU;AACvC,MAAI,UAAU,MAAM,EAAG,KAAI,uBAAuB,GAAG,IAAI,QAAQ,EAAE,YAAY,GAAG,UAAU,IAAI,aAAa,KAAK,OAAO,MAAM,OAAO,KAAK,CAAC;AAC5I,MAAI,UAAU,MAAM,EAAG,KAAI,uBAAuB,GAAG,IAAI,QAAQ,EAAE,YAAY,IAAI,UAAU,IAAI,aAAa,KAAK,OAAO,MAAM,OAAO,KAAK,CAAC;AAC7I,MAAI,UAAU,MAAM,EAAG,KAAI,uBAAuB,GAAG,IAAI,QAAQ,EAAE,YAAY,IAAI,UAAU,IAAI,aAAa,KAAK,OAAO,MAAM,OAAO,KAAK,CAAC;AAC7I,gBAAc,CAAC;AACf,SAAO;AACT;AAEA,SAAS,mBAAwB;AAC/B,MAAI,IAAI,kBAAkB,MAAM,MAAM,IAAI,GAAG;AAC7C,MAAI,cAAc,GAAG,MAAM,WAAW,MAAM,IAAI;AAChD,MAAI,aAAa,GAAG,gBAAgB,cAAc;AAClD,IAAE,OAAO,CAAC,IAAI,aAAa,EAAE,OAAO,CAAC,GAAG,EAAE,MAAM,gBAAgB,MAAM,oBAAoB,MAAM,KAAK,OAAO,WAAW,OAAO,GAAG,UAAU,IAAI,CAAC;AAChJ,IAAE,OAAO,CAAC,IAAI,YAAY,EAAE,OAAO,CAAC,GAAG,KAAK,GAAG;AAC/C,MAAI,aAAa,GAAG,OAAO,iBAAiB;AAC5C,IAAE,OAAO,CAAC,IAAI,aAAa,EAAE,OAAO,CAAC,GAAG,EAAE,MAAM,mBAAmB,MAAM,uBAAuB,MAAM,IAAI,OAAO,WAAW,OAAO,GAAG,UAAU,IAAI,CAAC;AACrJ,IAAE,OAAO,CAAC,IAAI,YAAY,EAAE,OAAO,CAAC,GAAG,KAAK,GAAG;AAC/C,QAAM,UAAU,EAAE,OAAO,UAAU,CAAC,MAAW,EAAE,OAAO,cAAc;AACtE,QAAM,SAAS,EAAE,OAAO,UAAU,CAAC,MAAW,EAAE,OAAO,KAAK;AAC5D,QAAM,eAAe,cAAc,WAAW;AAC9C,QAAM,aAAa,cAAc,SAAS;AAC1C,MAAI,gBAAgB,WAAW,EAAG,KAAI,uBAAuB,GAAG,SAAS,cAAc,EAAE,YAAY,GAAG,UAAU,IAAI,aAAa,KAAK,OAAO,MAAM,OAAO,KAAK,CAAC;AAClK,MAAI,cAAc,UAAU,EAAG,KAAI,uBAAuB,GAAG,QAAQ,YAAY,EAAE,YAAY,IAAI,UAAU,IAAI,aAAa,KAAK,OAAO,MAAM,OAAO,KAAK,CAAC;AAC7J,gBAAc,CAAC;AACf,SAAO;AACT;AAEA,SAAS,qBAA0B;AACjC,MAAI,IAAI,kBAAkB,MAAM,MAAM,IAAI,EAAE;AAC5C,MAAI,cAAc,GAAG,MAAM,WAAW,MAAM,IAAI;AAChD,MAAI,aAAa,GAAG,YAAY,YAAY;AAC5C,IAAE,OAAO,CAAC,IAAI,aAAa,EAAE,OAAO,CAAC,GAAG,EAAE,MAAM,cAAc,MAAM,qBAAqB,MAAM,IAAI,OAAO,WAAW,OAAO,GAAG,UAAU,IAAI,CAAC;AAC9I,IAAE,OAAO,CAAC,IAAI,YAAY,EAAE,OAAO,CAAC,GAAG,KAAK,GAAG;AAC/C,MAAI,aAAa,GAAG,QAAQ,2BAA2B;AACvD,IAAE,OAAO,CAAC,IAAI,aAAa,EAAE,OAAO,CAAC,GAAG,EAAE,MAAM,6BAA6B,MAAM,mBAAmB,MAAM,IAAI,OAAO,WAAW,OAAO,EAAE,CAAC;AAC5I,IAAE,OAAO,CAAC,IAAI,YAAY,EAAE,OAAO,CAAC,GAAG,KAAK,GAAG;AAC/C,QAAM,OAAO,EAAE,OAAO,UAAU,CAAC,MAAW,EAAE,OAAO,UAAU;AAC/D,QAAM,OAAO,EAAE,OAAO,UAAU,CAAC,MAAW,EAAE,OAAO,MAAM;AAC3D,QAAM,aAAa,cAAc,SAAS;AAC1C,QAAM,aAAa,cAAc,SAAS;AAC1C,MAAI,cAAc,QAAQ,EAAG,KAAI,uBAAuB,GAAG,MAAM,YAAY,EAAE,YAAY,GAAG,UAAU,IAAI,aAAa,IAAI,OAAO,MAAM,OAAO,KAAK,CAAC;AACvJ,MAAI,cAAc,QAAQ,EAAG,KAAI,uBAAuB,GAAG,MAAM,YAAY,EAAE,YAAY,IAAI,UAAU,IAAI,aAAa,IAAI,OAAO,MAAM,OAAO,KAAK,CAAC;AACxJ,gBAAc,CAAC;AACf,SAAO;AACT;AAEA,SAAS,yBAA8B;AACrC,MAAI,IAAI,kBAAkB,MAAM,MAAM,IAAI,GAAG;AAC7C,MAAI,aAAa,GAAG,QAAQ,YAAY;AACxC,IAAE,OAAO,CAAC,IAAI,aAAa,EAAE,OAAO,CAAC,GAAG,EAAE,MAAM,cAAc,MAAM,cAAc,MAAM,IAAI,OAAO,WAAW,OAAO,GAAG,UAAU,IAAI,CAAC;AACvI,IAAE,OAAO,CAAC,IAAI,YAAY,EAAE,OAAO,CAAC,GAAG,KAAK,GAAG;AAC/C,MAAI,aAAa,GAAG,QAAQ,yBAAyB;AACrD,IAAE,OAAO,CAAC,IAAI,aAAa,EAAE,OAAO,CAAC,GAAG,EAAE,MAAM,2BAA2B,MAAM,iBAAiB,MAAM,IAAI,OAAO,WAAW,OAAO,EAAE,CAAC;AACxI,IAAE,OAAO,CAAC,IAAI,YAAY,EAAE,OAAO,CAAC,GAAG,KAAK,GAAG;AAE/C,MAAI,eAAe,GAAG,eAAe,IAAI,KAAK,GAAG,IAAI,GAAG,SAAS;AACjE,QAAM,UAAU,EAAE,OAAO,UAAU,CAAC,MAAW,EAAE,OAAO,MAAM;AAC9D,QAAM,UAAU,EAAE,OAAO,UAAU,CAAC,MAAW,EAAE,OAAO,MAAM;AAC9D,QAAM,cAAc,cAAc,aAAa;AAC/C,MAAI,eAAe,WAAW,EAAG,KAAI,uBAAuB,GAAG,SAAS,aAAa,EAAE,YAAY,GAAG,UAAU,IAAI,aAAa,KAAK,OAAO,MAAM,OAAO,KAAK,CAAC;AAChK,MAAI,eAAe,WAAW,EAAG,KAAI,uBAAuB,GAAG,SAAS,aAAa,EAAE,YAAY,IAAI,UAAU,IAAI,aAAa,KAAK,OAAO,MAAM,OAAO,KAAK,CAAC;AACjK,gBAAc,CAAC;AACf,SAAO;AACT;AAEA,SAAS,yBAA8B;AACrC,MAAI,IAAI,kBAAkB,MAAM,MAAM,IAAI,GAAG;AAC7C,MAAI,aAAa,GAAG,WAAW,8BAA8B;AAC7D,IAAE,OAAO,CAAC,IAAI,aAAa,EAAE,OAAO,CAAC,GAAG,EAAE,MAAM,gCAAgC,MAAM,uBAAuB,MAAM,IAAI,OAAO,WAAW,OAAO,EAAE,CAAC;AACnJ,IAAE,OAAO,CAAC,IAAI,YAAY,EAAE,OAAO,CAAC,GAAG,KAAK,GAAG;AAC/C,QAAM,MAAM,EAAE,OAAO,UAAU,CAAC,MAAW,EAAE,OAAO,SAAS;AAC7D,QAAM,SAAS,cAAc,YAAY;AACzC,MAAI,UAAU,OAAO,EAAG,KAAI,uBAAuB,GAAG,KAAK,QAAQ,EAAE,YAAY,GAAG,UAAU,IAAI,aAAa,KAAK,OAAO,MAAM,OAAO,KAAK,CAAC;AAC9I,gBAAc,CAAC;AACf,SAAO;AACT;AAEA,SAAS,mBAAwB;AAC/B,MAAI,IAAI,kBAAkB,MAAM,MAAM,IAAI,GAAG;AAC7C,MAAI,cAAc,GAAG,MAAM,WAAW,MAAM,IAAI;AAChD,MAAI,aAAa,GAAG,SAAS,QAAQ;AACrC,IAAE,OAAO,CAAC,IAAI,aAAa,EAAE,OAAO,CAAC,GAAG,EAAE,MAAM,UAAU,MAAM,sBAAsB,MAAM,KAAK,OAAO,WAAW,OAAO,GAAG,UAAU,IAAI,CAAC;AAC5I,IAAE,OAAO,CAAC,IAAI,YAAY,EAAE,OAAO,CAAC,GAAG,KAAK,GAAG;AAC/C,MAAI,aAAa,GAAG,OAAO,gBAAgB;AAC3C,IAAE,OAAO,CAAC,IAAI,aAAa,EAAE,OAAO,CAAC,GAAG,EAAE,MAAM,kBAAkB,MAAM,sBAAsB,MAAM,IAAI,OAAO,WAAW,OAAO,GAAG,UAAU,IAAI,CAAC;AACnJ,IAAE,OAAO,CAAC,IAAI,YAAY,EAAE,OAAO,CAAC,GAAG,KAAK,GAAG;AAC/C,QAAM,WAAW,EAAE,OAAO,UAAU,CAAC,MAAW,EAAE,OAAO,OAAO;AAChE,QAAM,SAAS,EAAE,OAAO,UAAU,CAAC,MAAW,EAAE,OAAO,KAAK;AAC5D,QAAM,aAAa,cAAc,SAAS;AAC1C,QAAM,aAAa,cAAc,SAAS;AAC1C,MAAI,cAAc,YAAY,EAAG,KAAI,uBAAuB,GAAG,UAAU,YAAY,EAAE,YAAY,GAAG,UAAU,IAAI,aAAa,KAAK,OAAO,MAAM,OAAO,KAAK,CAAC;AAChK,MAAI,cAAc,UAAU,EAAG,KAAI,uBAAuB,GAAG,QAAQ,YAAY,EAAE,YAAY,IAAI,UAAU,IAAI,aAAa,KAAK,OAAO,MAAM,OAAO,KAAK,CAAC;AAC7J,gBAAc,CAAC;AACf,SAAO;AACT;AAIO,IAAM,0BAAkD;AAAA,EAC7D;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,aAAa;AAAA,IACb,MAAM,CAAC,eAAe,QAAQ,SAAS,gBAAgB,WAAW;AAAA,IAClE,aAAa;AAAA,IACb,OAAO;AAAA,EACT;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,aAAa;AAAA,IACb,MAAM,CAAC,eAAe,WAAW,SAAS,QAAQ;AAAA,IAClD,aAAa;AAAA,IACb,OAAO;AAAA,EACT;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,aAAa;AAAA,IACb,MAAM,CAAC,QAAQ,SAAS,QAAQ,WAAW,OAAO;AAAA,IAClD,aAAa;AAAA,IACb,OAAO;AAAA,EACT;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,aAAa;AAAA,IACb,MAAM,CAAC,aAAa,QAAQ,WAAW,QAAQ,OAAO;AAAA,IACtD,aAAa;AAAA,IACb,OAAO;AAAA,EACT;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,aAAa;AAAA,IACb,MAAM,CAAC,WAAW,YAAY,WAAW,OAAO;AAAA,IAChD,aAAa;AAAA,IACb,OAAO;AAAA,EACT;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,aAAa;AAAA,IACb,MAAM,CAAC,cAAc,WAAW,SAAS,QAAQ;AAAA,IACjD,aAAa;AAAA,IACb,OAAO;AAAA,EACT;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,aAAa;AAAA,IACb,MAAM,CAAC,WAAW,QAAQ,QAAQ,SAAS,KAAK;AAAA,IAChD,aAAa;AAAA,IACb,OAAO;AAAA,EACT;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,aAAa;AAAA,IACb,MAAM,CAAC,UAAU,SAAS,aAAa,MAAM;AAAA,IAC7C,aAAa;AAAA,IACb,OAAO;AAAA,EACT;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,aAAa;AAAA,IACb,MAAM,CAAC,SAAS,UAAU,aAAa,QAAQ,SAAS;AAAA,IACxD,aAAa;AAAA,IACb,OAAO;AAAA,EACT;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,aAAa;AAAA,IACb,MAAM,CAAC,WAAW,QAAQ,UAAU,UAAU,YAAY;AAAA,IAC1D,aAAa;AAAA,IACb,OAAO;AAAA,EACT;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,aAAa;AAAA,IACb,MAAM,CAAC,UAAU,aAAa,QAAQ,WAAW,OAAO;AAAA,IACxD,aAAa;AAAA,IACb,OAAO;AAAA,EACT;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,aAAa;AAAA,IACb,MAAM,CAAC,SAAS,YAAY,aAAa,UAAU,OAAO;AAAA,IAC1D,aAAa;AAAA,IACb,OAAO;AAAA,EACT;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,aAAa;AAAA,IACb,MAAM,CAAC,QAAQ,UAAU,QAAQ,UAAU,WAAW;AAAA,IACtD,aAAa;AAAA,IACb,OAAO;AAAA,EACT;AACF;AAEO,SAAS,kBAAkB,IAA8C;AAC9E,SAAO,wBAAwB,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE;AACxD;AAEO,SAAS,uBAAuB,UAA0D;AAC/F,SAAO,wBAAwB,OAAO,CAAC,MAAM,EAAE,aAAa,QAAQ;AACtE;AAEO,IAAM,sBAAgD,CAAC,eAAe,cAAc,WAAW,WAAW,WAAW,UAAU,aAAa,UAAU,WAAW,MAAM;;;ACrc9K,eAAsB,eAAe,YAAoB,aAAqB,OAA+D,CAAC,GAAkB;AAC9J,QAAM,EAAE,OAAO,MAAM,WAAW,MAAM,QAAQ,EAAE,IAAI;AAEpD,QAAM,WAA8B;AAAA,IAClC,SAAS;AAAA,IACT,WAAW;AAAA,IACX,YAAY,CAAC,EAAE,IAAI,aAAa,MAAM,UAAU,MAAM,CAAC;AAAA,EACzD;AAEA,QAAM,WAAW,KAAK,UAAU,UAAU;AAC1C,QAAM,eAAe,KAAK,UAAU,UAAU,MAAM,CAAC;AAGrD,QAAM,QAAmD;AAAA,IACvD,EAAE,MAAM,cAAc,WAAW,SAAS,MAAM,IAAI,YAAY,EAAE,OAAO,QAAQ,EAAE;AAAA,IACnF,EAAE,MAAM,iBAAiB,MAAM,IAAI,YAAY,EAAE,OAAO,YAAY,EAAE;AAAA,EACxE;AAEA,SAAO,aAAa,OAAO,iBAAiB;AAC9C;AAKO,SAAS,kBAAkB,YAAoB,UAAkB,aAAsB,MAA8E;AAC1K,QAAM,KAAK,eAAe,SAAS,QAAQ,gBAAgB,GAAG,EAAE,YAAY,KAAK;AACjF,SAAO,eAAe,YAAY,IAAI,IAAI,EAAE,KAAK,CAAC,SAAS;AACzD,oBAAgB,MAAM,SAAS,SAAS,SAAS,IAAI,WAAW,GAAG,QAAQ,SAAS;AAAA,EACtF,CAAC;AACH;AAKO,SAAS,mBAAmB,YAAoB,UAAwB;AAC7E,QAAM,OAAO,IAAI,KAAK,CAAC,KAAK,UAAU,YAAY,MAAM,CAAC,CAAC,GAAG,EAAE,MAAM,mBAAmB,CAAC;AACzF,kBAAgB,MAAM,SAAS,SAAS,OAAO,IAAI,WAAW,GAAG,QAAQ,OAAO;AAClF;AAwBA,eAAsB,oBAAoB,gBAAqB,QAA2B,OAAyB,CAAC,GAAwB;AAC1I,QAAM,MAAM,KAAK,OAAO;AACxB,QAAM,WAAW,KAAK,YAAY,eAAe,eAAe,eAAe,aAAa;AAC5F,QAAM,cAAc,KAAK,KAAK,WAAW,GAAG;AAC5C,QAAM,QAAQ,KAAK,MAAM,MAAM,GAAG;AAElC,QAAM,MAAM,OAAO,WAAW,IAAI;AAClC,MAAI,CAAC,IAAK,OAAM,IAAI,MAAM,mCAAmC;AAE7D,QAAM,SAAqB,CAAC;AAE5B,WAAS,IAAI,GAAG,IAAI,aAAa,KAAK;AACpC,UAAM,cAAe,IAAI,cAAe,eAAe;AACvD,mBAAe,YAAY,aAAa,IAAI;AAG5C,UAAM,IAAI,QAAc,CAAC,MAAM,sBAAsB,MAAM,EAAE,CAAC,CAAC;AAG/D,UAAM,YAAY,eAAe,UAAU,YAAY;AACvD,QAAI,WAAW;AACb,YAAM,MAAM,UAAU,cAAc,KAAK;AACzC,UAAI,KAAK;AACP,cAAM,SAAS,IAAI,cAAc,EAAE,kBAAkB,GAAG;AACxD,cAAM,MAAM,IAAI,MAAM;AACtB,cAAM,OAAO,IAAI,KAAK,CAAC,MAAM,GAAG,EAAE,MAAM,gBAAgB,CAAC;AACzD,cAAM,MAAM,IAAI,gBAAgB,IAAI;AACpC,cAAM,IAAI,QAAc,CAAC,SAAS,WAAW;AAC3C,cAAI,SAAS,MAAM;AACjB,gBAAI,UAAU,GAAG,GAAG,OAAO,OAAO,OAAO,MAAM;AAC/C,gBAAI,UAAU,KAAK,GAAG,GAAG,OAAO,OAAO,OAAO,MAAM;AACpD,gBAAI,gBAAgB,GAAG;AACvB,oBAAQ;AAAA,UACV;AACA,cAAI,UAAU;AACd,cAAI,MAAM;AAAA,QACZ,CAAC;AAAA,MACH;AAAA,IACF;AAEA,WAAO,KAAK;AAAA,MACV,WAAW,IAAI,aAAa,GAAG,GAAG,OAAO,OAAO,OAAO,MAAM;AAAA,MAC7D;AAAA,IACF,CAAC;AAAA,EACH;AAEA,SAAO;AACT;AAMO,SAAS,UAAU,QAAoB,OAAe,QAAgB,OAA6C,CAAC,GAAe;AACxI,QAAM,EAAE,OAAO,MAAM,UAAU,GAAG,IAAI;AAGtC,QAAM,MAAgB,CAAC;AAEvB,QAAM,WAAW,CAAC,MAAc;AAC9B,aAAS,IAAI,GAAG,IAAI,EAAE,QAAQ,IAAK,KAAI,KAAK,EAAE,WAAW,CAAC,CAAC;AAAA,EAC7D;AACA,QAAM,WAAW,CAAC,MAAc;AAC9B,QAAI,KAAK,IAAI,KAAO,KAAK,IAAK,GAAI;AAAA,EACpC;AACA,QAAM,YAAY,CAAC,MAAc,IAAI,KAAK,IAAI,GAAI;AAGlD,WAAS,QAAQ;AACjB,WAAS,KAAK;AACd,WAAS,MAAM;AACf,YAAU,GAAI;AACd,YAAU,CAAC;AACX,YAAU,CAAC;AAGX,WAAS,IAAI,GAAG,IAAI,KAAK,KAAK;AAC5B,QAAI,KAAK,GAAG,GAAG,CAAC;AAAA,EAClB;AAGA,MAAI,MAAM;AACR,aAAS,sBAAiC;AAC1C,aAAS,CAAC;AACV,cAAU,CAAC;AAAA,EACb;AAEA,aAAW,SAAS,QAAQ;AAC1B,UAAM,EAAE,WAAW,MAAM,IAAI;AAC7B,UAAM,SAAS,UAAU;AAGzB,UAAM,UAAU,kBAAkB,QAAQ,GAAG;AAC7C,UAAM,UAAU,mBAAmB,QAAQ,OAAO;AAGlD,QAAI,KAAK,IAAM,KAAM,CAAI;AACzB,cAAU,CAAI;AACd,aAAS,KAAK;AACd,cAAU,CAAC;AACX,cAAU,CAAC;AAGX,cAAU,EAAI;AACd,aAAS,CAAC;AACV,aAAS,CAAC;AACV,aAAS,KAAK;AACd,aAAS,MAAM;AACf,cAAU,GAAI;AAGd,eAAW,CAAC,GAAG,GAAG,CAAC,KAAK,SAAS;AAC/B,UAAI,KAAK,GAAG,GAAG,CAAC;AAAA,IAClB;AAGA,UAAM,UAAU,UAAU,SAAS,CAAC;AACpC,cAAU,CAAC;AACX,aAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK,KAAK;AAC5C,YAAM,QAAQ,QAAQ,MAAM,GAAG,IAAI,GAAG;AACtC,gBAAU,MAAM,MAAM;AACtB,iBAAW,KAAK,MAAO,KAAI,KAAK,CAAC;AAAA,IACnC;AACA,cAAU,CAAC;AAAA,EACb;AAEA,YAAU,EAAI;AACd,SAAO,IAAI,WAAW,GAAG;AAC3B;AAIA,SAAS,gBAAgB,MAAY,UAAwB;AAC3D,QAAM,MAAM,IAAI,gBAAgB,IAAI;AACpC,QAAM,IAAI,SAAS,cAAc,GAAG;AACpC,IAAE,OAAO;AACT,IAAE,WAAW;AACb,IAAE,MAAM;AACR,MAAI,gBAAgB,GAAG;AACzB;AAEA,SAAS,aAAa,OAAkD,WAAW,mBAAyB;AAC1G,QAAM,QAAoB,CAAC;AAC3B,MAAI,SAAS;AACb,QAAM,UAAwB,CAAC;AAE/B,QAAM,YAAY,MAAM;AACtB,UAAM,IAAI,IAAI,YAAY,GAAG;AAC7B,aAAS,IAAI,GAAG,IAAI,KAAK,KAAK;AAC5B,UAAI,IAAI;AACR,eAAS,IAAI,GAAG,IAAI,GAAG,IAAK,KAAI,IAAI,IAAI,aAAc,MAAM,IAAK,MAAM;AACvE,QAAE,CAAC,IAAI,MAAM;AAAA,IACf;AACA,WAAO;AAAA,EACT,GAAG;AAEH,QAAM,QAAQ,CAAC,SAAqB;AAClC,QAAI,IAAI;AACR,aAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,IAAK,KAAI,UAAU,IAAI,KAAK,CAAC,KAAK,GAAI,IAAK,MAAM;AAClF,YAAQ,IAAI,gBAAgB;AAAA,EAC9B;AAEA,QAAM,MAAM,CAAC,KAAe,MAAc,IAAI,KAAK,IAAI,KAAO,MAAM,IAAK,GAAI;AAC7E,QAAM,MAAM,CAAC,KAAe,MAAc,IAAI,KAAK,IAAI,KAAO,MAAM,IAAK,KAAO,MAAM,KAAM,KAAO,MAAM,KAAM,GAAI;AAEnH,aAAW,QAAQ,OAAO;AACxB,UAAM,YAAY,IAAI,YAAY,EAAE,OAAO,KAAK,IAAI;AACpD,UAAM,MAAM,MAAM,KAAK,IAAI;AAC3B,UAAM,QAAkB,CAAC;AACzB,QAAI,OAAO,QAAU;AACrB,QAAI,OAAO,EAAE;AACb,QAAI,OAAO,CAAC;AACZ,QAAI,OAAO,CAAC;AACZ,QAAI,OAAO,CAAC;AACZ,QAAI,OAAO,CAAC;AACZ,QAAI,OAAO,GAAG;AACd,QAAI,OAAO,KAAK,KAAK,MAAM;AAC3B,QAAI,OAAO,KAAK,KAAK,MAAM;AAC3B,QAAI,OAAO,UAAU,MAAM;AAC3B,QAAI,OAAO,CAAC;AACZ,UAAM,KAAK,GAAG,SAAS;AACvB,UAAM,cAAc,IAAI,WAAW,KAAK;AACxC,UAAM,KAAK,aAAa,KAAK,KAAK,OAAO,MAAM,KAAK,KAAK,YAAY,KAAK,KAAK,aAAa,KAAK,KAAK,UAAU,CAAgB;AAEhI,UAAM,KAAe,CAAC;AACtB,QAAI,IAAI,QAAU;AAClB,QAAI,IAAI,EAAE;AACV,QAAI,IAAI,EAAE;AACV,QAAI,IAAI,CAAC;AACT,QAAI,IAAI,CAAC;AACT,QAAI,IAAI,CAAC;AACT,QAAI,IAAI,CAAC;AACT,QAAI,IAAI,GAAG;AACX,QAAI,IAAI,KAAK,KAAK,MAAM;AACxB,QAAI,IAAI,KAAK,KAAK,MAAM;AACxB,QAAI,IAAI,UAAU,MAAM;AACxB,QAAI,IAAI,CAAC;AACT,QAAI,IAAI,CAAC;AACT,QAAI,IAAI,CAAC;AACT,QAAI,IAAI,CAAC;AACT,QAAI,IAAI,CAAC;AACT,QAAI,IAAI,MAAM;AACd,OAAG,KAAK,GAAG,SAAS;AACpB,YAAQ,KAAK,IAAI,WAAW,EAAE,CAAC;AAC/B,cAAU,YAAY,SAAS,KAAK,KAAK;AAAA,EAC3C;AAEA,QAAM,cAAc,QAAQ,OAAO,CAAC,GAAG,MAAM,IAAI,EAAE,QAAQ,CAAC;AAC5D,QAAM,eAAe;AACrB,aAAW,KAAK,QAAS,OAAM,KAAK,EAAE,OAAO,MAAM,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,CAAgB;AAE5G,QAAM,MAAgB,CAAC;AACvB,QAAM,OAAO,CAAC,MAAc,IAAI,KAAK,IAAI,KAAO,MAAM,IAAK,GAAI;AAC/D,QAAM,OAAO,CAAC,MAAc,IAAI,KAAK,IAAI,KAAO,MAAM,IAAK,KAAO,MAAM,KAAM,KAAO,MAAM,KAAM,GAAI;AACrG,OAAK,SAAU;AACf,OAAK,CAAC;AACN,OAAK,CAAC;AACN,OAAK,MAAM,MAAM;AACjB,OAAK,MAAM,MAAM;AACjB,OAAK,WAAW;AAChB,OAAK,YAAY;AACjB,OAAK,CAAC;AACN,QAAM,KAAK,IAAI,WAAW,GAAG,EAAE,MAAqB;AAEpD,SAAO,IAAI,KAAK,OAAO,EAAE,MAAM,SAAS,CAAC;AAC3C;AAGA,SAAS,kBAAkB,QAA2B,WAAoD;AACxG,QAAM,SAA0C,CAAC;AACjD,WAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK,IAAI,GAAG;AAE7C,QAAI,OAAO,IAAI,CAAC,IAAI,EAAG,QAAO,KAAK,CAAC,OAAO,CAAC,GAAG,OAAO,IAAI,CAAC,GAAG,OAAO,IAAI,CAAC,CAAC,CAAC;AAAA,EAC9E;AACA,MAAI,OAAO,WAAW,EAAG,QAAO,MAAM,KAAK,EAAE,QAAQ,UAAU,GAAG,CAAC,GAAG,MAAM,CAAC,GAAG,GAAG,CAAC,CAA6B;AAGjH,QAAM,SAAS,oBAAI,IAAsC;AACzD,aAAW,KAAK,QAAQ;AACtB,UAAM,MAAM,GAAG,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC;AAClD,QAAI,CAAC,OAAO,IAAI,GAAG,EAAG,QAAO,IAAI,KAAK,CAAC;AACvC,QAAI,OAAO,QAAQ,UAAW;AAAA,EAChC;AAEA,QAAM,UAAU,MAAM,KAAK,OAAO,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS;AAC9D,SAAO,QAAQ,SAAS,UAAW,SAAQ,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC;AACzD,SAAO;AACT;AAGA,SAAS,mBAAmB,QAA2B,SAAsD;AAC3G,QAAM,UAAU,IAAI,WAAW,OAAO,SAAS,CAAC;AAChD,WAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK,GAAG;AACzC,UAAM,IAAI,OAAO,CAAC,GAChB,IAAI,OAAO,IAAI,CAAC,GAChB,IAAI,OAAO,IAAI,CAAC;AAClB,QAAI,OAAO,GACT,WAAW;AACb,aAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AACvC,YAAM,KAAK,IAAI,QAAQ,CAAC,EAAE,CAAC,GACzB,KAAK,IAAI,QAAQ,CAAC,EAAE,CAAC,GACrB,KAAK,IAAI,QAAQ,CAAC,EAAE,CAAC;AACvB,YAAM,OAAO,KAAK,KAAK,KAAK,KAAK,KAAK;AACtC,UAAI,OAAO,UAAU;AACnB,mBAAW;AACX,eAAO;AAAA,MACT;AAAA,IACF;AACA,YAAQ,IAAI,CAAC,IAAI;AAAA,EACnB;AACA,SAAO;AACT;AAGA,SAAS,UAAU,SAAqB,aAA+B;AACrE,QAAM,YAAY,KAAK;AACvB,QAAM,UAAU,YAAY;AAC5B,MAAI,WAAW,cAAc;AAC7B,MAAI,WAAW,UAAU;AAEzB,QAAM,QAAQ,oBAAI,IAAoB;AACtC,QAAM,aAAa,MAAM;AACvB,UAAM,MAAM;AACZ,aAAS,IAAI,GAAG,IAAI,WAAW,IAAK,OAAM,IAAI,OAAO,aAAa,CAAC,GAAG,CAAC;AACvE,eAAW,cAAc;AACzB,eAAW,UAAU;AAAA,EACvB;AAEA,QAAM,SAAmB,CAAC;AAC1B,MAAI,SAAS,GACX,SAAS;AAEX,QAAM,OAAO,CAAC,SAAiB;AAC7B,cAAU,QAAQ;AAClB,cAAU;AACV,WAAO,UAAU,GAAG;AAClB,aAAO,KAAK,SAAS,GAAI;AACzB,iBAAW;AACX,gBAAU;AAAA,IACZ;AAAA,EACF;AAEA,aAAW;AACX,OAAK,SAAS;AAEd,MAAI,SAAS,OAAO,aAAa,QAAQ,CAAC,CAAC;AAC3C,WAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AACvC,UAAM,SAAS,OAAO,aAAa,QAAQ,CAAC,CAAC;AAC7C,UAAM,WAAW,SAAS;AAC1B,QAAI,MAAM,IAAI,QAAQ,GAAG;AACvB,eAAS;AAAA,IACX,OAAO;AACL,WAAK,MAAM,IAAI,MAAM,CAAE;AACvB,UAAI,WAAW,MAAM;AACnB,cAAM,IAAI,UAAU,UAAU;AAC9B,YAAI,WAAW,KAAK,YAAY,WAAW,GAAI;AAAA,MACjD,OAAO;AACL,aAAK,SAAS;AACd,mBAAW;AAAA,MACb;AACA,eAAS;AAAA,IACX;AAAA,EACF;AACA,OAAK,MAAM,IAAI,MAAM,CAAE;AACvB,OAAK,OAAO;AACZ,MAAI,SAAS,EAAG,QAAO,KAAK,SAAS,GAAI;AACzC,SAAO;AACT;;;AC/YO,SAAS,kBAAkB,KAAoB,UAA8B,CAAC,GAAuB;AAC1G,QAAM,MAAM,QAAQ,OAAO,IAAI,SAAS,OAAO;AAC/C,QAAM,WAAW,QAAQ,YAAY,IAAI,SAAS,YAAY;AAC9D,QAAM,QAAQ,QAAQ,SAAS,IAAI,OAAO,SAAS;AACnD,QAAM,SAAS,QAAQ,UAAU,IAAI,OAAO,UAAU;AACtD,QAAM,aAAa,KAAK,IAAI,GAAG,KAAK,KAAK,WAAW,GAAG,CAAC;AAExD,QAAM,SAAS,SAAS,cAAc,QAAQ;AAC9C,SAAO,QAAQ;AACf,SAAO,SAAS;AAChB,QAAM,MAAM,OAAO,WAAW,IAAI;AAClC,MAAI,CAAC,IAAK,QAAO,CAAC;AAElB,QAAM,SAA6B,CAAC;AACpC,WAAS,IAAI,GAAG,IAAI,YAAY,KAAK;AACnC,UAAM,OAAO,IAAI;AACjB,QAAI,UAAU,GAAG,GAAG,OAAO,MAAM;AACjC,kBAAc,KAAK,MAAM,GAAG;AAC5B,WAAO,KAAK;AAAA,MACV,OAAO;AAAA,MACP;AAAA,MACA,SAAS,OAAO,UAAU,WAAW;AAAA,IACvC,CAAC;AAAA,EACH;AACA,SAAO;AACT;AAEA,SAAS,oBAAoB,SAA6B;AACxD,QAAM,SAAS,QAAQ,MAAM,GAAG,EAAE,CAAC,KAAK;AACxC,QAAM,SAAS,KAAK,MAAM;AAC1B,QAAM,QAAQ,IAAI,WAAW,OAAO,MAAM;AAC1C,WAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,IAAK,OAAM,CAAC,IAAI,OAAO,WAAW,CAAC;AACtE,SAAO;AACT;AAGO,SAAS,oBAAoB,QAAkC;AACpE,QAAM,QAA8C,OAAO,IAAI,CAAC,OAAO;AAAA,IACrE,MAAM,SAAS,OAAO,EAAE,KAAK,EAAE,SAAS,GAAG,GAAG,CAAC;AAAA,IAC/C,MAAM,oBAAoB,EAAE,OAAO;AAAA,EACrC,EAAE;AAEF,QAAM,QAAoB,CAAC;AAC3B,MAAI,SAAS;AACb,QAAM,UAAwB,CAAC;AAE/B,QAAM,YAAY,MAAM;AACtB,UAAM,QAAQ,IAAI,YAAY,GAAG;AACjC,aAAS,IAAI,GAAG,IAAI,KAAK,KAAK;AAC5B,UAAI,IAAI;AACR,eAAS,IAAI,GAAG,IAAI,GAAG,IAAK,KAAI,IAAI,IAAI,aAAc,MAAM,IAAK,MAAM;AACvE,YAAM,CAAC,IAAI,MAAM;AAAA,IACnB;AACA,WAAO;AAAA,EACT,GAAG;AAEH,QAAM,QAAQ,CAAC,SAAqB;AAClC,QAAI,IAAI;AACR,aAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,IAAK,KAAI,UAAU,IAAI,KAAK,CAAC,KAAK,GAAI,IAAK,MAAM;AAClF,YAAQ,IAAI,gBAAgB;AAAA,EAC9B;AAEA,QAAM,UAAU,CAAC,KAAe,MAAc;AAC5C,QAAI,KAAK,IAAI,KAAO,MAAM,IAAK,GAAI;AAAA,EACrC;AACA,QAAM,UAAU,CAAC,KAAe,MAAc;AAC5C,QAAI,KAAK,IAAI,KAAO,MAAM,IAAK,KAAO,MAAM,KAAM,KAAO,MAAM,KAAM,GAAI;AAAA,EAC3E;AAEA,aAAW,QAAQ,OAAO;AACxB,UAAM,YAAY,IAAI,YAAY,EAAE,OAAO,KAAK,IAAI;AACpD,UAAM,OAAO,KAAK;AAClB,UAAM,MAAM,MAAM,IAAI;AAEtB,UAAM,QAAkB,CAAC;AACzB,YAAQ,OAAO,QAAU;AACzB,YAAQ,OAAO,EAAE;AACjB,YAAQ,OAAO,CAAC;AAChB,YAAQ,OAAO,CAAC;AAChB,YAAQ,OAAO,CAAC;AAChB,YAAQ,OAAO,CAAC;AAChB,YAAQ,OAAO,GAAG;AAClB,YAAQ,OAAO,KAAK,MAAM;AAC1B,YAAQ,OAAO,KAAK,MAAM;AAC1B,YAAQ,OAAO,UAAU,MAAM;AAC/B,YAAQ,OAAO,CAAC;AAChB,UAAM,KAAK,GAAG,SAAS;AAEvB,UAAM,cAAc,IAAI,WAAW,KAAK;AACxC,UAAM,KAAK,WAAW;AACtB,UAAM,KAAK,KAAK,OAAO,MAAM,KAAK,YAAY,KAAK,aAAa,KAAK,UAAU,CAAgB;AAE/F,UAAM,eAAyB,CAAC;AAChC,YAAQ,cAAc,QAAU;AAChC,YAAQ,cAAc,EAAE;AACxB,YAAQ,cAAc,EAAE;AACxB,YAAQ,cAAc,CAAC;AACvB,YAAQ,cAAc,CAAC;AACvB,YAAQ,cAAc,CAAC;AACvB,YAAQ,cAAc,CAAC;AACvB,YAAQ,cAAc,GAAG;AACzB,YAAQ,cAAc,KAAK,MAAM;AACjC,YAAQ,cAAc,KAAK,MAAM;AACjC,YAAQ,cAAc,UAAU,MAAM;AACtC,YAAQ,cAAc,CAAC;AACvB,YAAQ,cAAc,CAAC;AACvB,YAAQ,cAAc,CAAC;AACvB,YAAQ,cAAc,CAAC;AACvB,YAAQ,cAAc,CAAC;AACvB,YAAQ,cAAc,MAAM;AAC5B,iBAAa,KAAK,GAAG,SAAS;AAC9B,YAAQ,KAAK,IAAI,WAAW,YAAY,CAAC;AAEzC,cAAU,YAAY,SAAS,KAAK;AAAA,EACtC;AAEA,QAAM,cAAc,QAAQ,OAAO,CAAC,GAAG,MAAM,IAAI,EAAE,QAAQ,CAAC;AAC5D,QAAM,eAAe;AACrB,aAAW,KAAK,QAAS,OAAM,KAAK,EAAE,OAAO,MAAM,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,CAAgB;AAE5G,QAAM,MAAgB,CAAC;AACvB,UAAQ,KAAK,SAAU;AACvB,UAAQ,KAAK,CAAC;AACd,UAAQ,KAAK,CAAC;AACd,UAAQ,KAAK,MAAM,MAAM;AACzB,UAAQ,KAAK,MAAM,MAAM;AACzB,UAAQ,KAAK,WAAW;AACxB,UAAQ,KAAK,YAAY;AACzB,UAAQ,KAAK,CAAC;AACd,QAAM,KAAK,IAAI,WAAW,GAAG,EAAE,MAAqB;AAEpD,SAAO,IAAI,KAAK,OAAO,EAAE,MAAM,kBAAkB,CAAC;AACpD;AAEO,SAAS,uBAAuB,KAAoB,UAAkB,SAAoC;AAC/G,QAAM,SAAS,kBAAkB,KAAK,OAAO;AAC7C,MAAI,OAAO,WAAW,EAAG;AACzB,QAAM,MAAM,oBAAoB,MAAM;AACtC,QAAM,MAAM,IAAI,gBAAgB,GAAG;AACnC,QAAM,OAAO,SAAS,cAAc,GAAG;AACvC,OAAK,OAAO;AACZ,OAAK,WAAW,SAAS,SAAS,MAAM,IAAI,WAAW,GAAG,QAAQ;AAClE,OAAK,MAAM;AACX,MAAI,gBAAgB,GAAG;AACzB;AAEO,IAAM,yBAAyB;AAEtC,IAAM,uBAAuB,CAAC,yBAAyB,yBAAyB,YAAY;AAQrF,SAAS,2BAA0C;AACxD,MAAI,OAAO,kBAAkB,YAAa,QAAO;AACjD,SAAO,qBAAqB,KAAK,CAAC,MAAM,cAAc,gBAAgB,CAAC,CAAC,KAAK;AAC/E;AAEO,SAAS,wBAAiC;AAC/C,SAAO,OAAO,aAAa,eAAe,OAAO,kBAAkB,eAAe,yBAAyB,MAAM;AACnH;AAEO,SAAS,kBAAkB,KAAoB,UAA6B,CAAC,GAAW;AAC7F,QAAM,MAAM,QAAQ,OAAO,IAAI,SAAS,OAAO;AAC/C,QAAM,WAAW,QAAQ,YAAY,IAAI,SAAS,YAAY;AAC9D,SAAO,KAAK,IAAI,GAAG,KAAK,KAAK,WAAW,GAAG,CAAC;AAC9C;AAEA,SAAS,MAAM,IAA2B;AACxC,SAAO,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,EAAE,CAAC;AACzD;AAQA,eAAsB,gBAAgB,KAAoB,UAA6B,CAAC,GAAkB;AACxG,MAAI,OAAO,aAAa,aAAa;AACnC,UAAM,IAAI,MAAM,6CAA6C;AAAA,EAC/D;AAEA,QAAM,WAAW,yBAAyB;AAC1C,MAAI,CAAC,UAAU;AACb,UAAM,IAAI,MAAM,kDAAkD;AAAA,EACpE;AAEA,QAAM,MAAM,QAAQ,OAAO,IAAI,SAAS,OAAO;AAC/C,QAAM,WAAW,QAAQ,YAAY,IAAI,SAAS,YAAY;AAC9D,QAAM,QAAQ,QAAQ,SAAS,IAAI,OAAO,SAAS;AACnD,QAAM,SAAS,QAAQ,UAAU,IAAI,OAAO,UAAU;AACtD,QAAM,aAAa,kBAAkB,KAAK,OAAO;AAEjD,MAAI,aAAa,wBAAwB;AACvC,UAAM,IAAI,MAAM,oBAAoB,UAAU,UAAU,sBAAsB,0BAA0B;AAAA,EAC1G;AAEA,QAAM,SAAS,SAAS,cAAc,QAAQ;AAC9C,SAAO,QAAQ;AACf,SAAO,SAAS;AAChB,QAAM,MAAM,OAAO,WAAW,IAAI;AAClC,MAAI,CAAC,IAAK,OAAM,IAAI,MAAM,iCAAiC;AAE3D,QAAM,SAAS,OAAO,cAAc,CAAC;AACrC,QAAM,aAAa,OAAO,eAAe,EAAE,CAAC;AAE5C,QAAM,WAAW,IAAI,cAAc,QAAQ;AAAA,IACzC;AAAA,IACA,oBAAoB,QAAQ,sBAAsB;AAAA,EACpD,CAAC;AAED,QAAM,SAAqB,CAAC;AAC5B,QAAM,kBAAkB,MAAO;AAC/B,QAAM,OAAO,QAAQ,mBAAmB;AAExC,QAAM,OAAO,MAAM,IAAI,QAAc,CAAC,SAAS,WAAW;AACxD,aAAS,kBAAkB,CAAC,MAAM;AAChC,UAAI,EAAE,KAAK,OAAO,EAAG,QAAO,KAAK,EAAE,IAAI;AAAA,IACzC;AACA,aAAS,UAAU,MAAM;AACvB,aAAO,IAAI,MAAM,0CAA0C,CAAC;AAAA,IAC9D;AACA,aAAS,SAAS,MAAM;AACtB,YAAM,WAAW,SAAS,MAAM,GAAG,EAAE,CAAC,KAAK;AAC3C,cAAQ,IAAI,KAAK,QAAQ,EAAE,MAAM,SAAS,CAAC,CAAC;AAAA,IAC9C;AAEA,aAAS,MAAM;AAEf,KAAC,YAAY;AACX,UAAI;AACF,iBAAS,IAAI,GAAG,IAAI,YAAY,KAAK;AACnC,gBAAM,OAAO,IAAI;AACjB,cAAI,UAAU,GAAG,GAAG,OAAO,MAAM;AACjC,wBAAc,KAAK,MAAM,GAAG;AAC5B,cAAI,OAAO,WAAW,iBAAiB,YAAY;AACjD,uBAAW,aAAa;AAAA,UAC1B;AACA,cAAI,KAAM,OAAM,MAAM,eAAe;AAAA,cAChC,OAAM,IAAI,QAAc,CAAC,MAAM,sBAAsB,MAAM,EAAE,CAAC,CAAC;AAAA,QACtE;AACA,iBAAS,KAAK;AAAA,MAChB,SAAS,KAAK;AACZ,YAAI;AACF,mBAAS,KAAK;AAAA,QAChB,QAAQ;AAAA,QAER;AACA,eAAO,GAAG;AAAA,MACZ,UAAE;AACA,eAAO,UAAU,EAAE,QAAQ,CAAC,MAAM,EAAE,KAAK,CAAC;AAAA,MAC5C;AAAA,IACF,GAAG;AAAA,EACL,CAAC;AAED,SAAO;AACT;AAEA,eAAsB,kBAAkB,KAAoB,UAAkB,SAA4C;AACxH,QAAM,OAAO,MAAM,gBAAgB,KAAK,OAAO;AAC/C,QAAM,MAAM,IAAI,gBAAgB,IAAI;AACpC,QAAM,OAAO,SAAS,cAAc,GAAG;AACvC,OAAK,OAAO;AACZ,OAAK,WAAW,SAAS,SAAS,OAAO,IAAI,WAAW,GAAG,QAAQ;AACnE,OAAK,MAAM;AACX,MAAI,gBAAgB,GAAG;AACzB;;;ACrRA,IAAM,eAAe,oBAAI,IAAI,CAAC,SAAS,eAAe,iBAAiB,eAAe,WAAW,UAAU,mBAAmB,gBAAgB,WAAW,aAAa,kBAAkB,UAAU,UAAU,CAAC;AAG7M,IAAM,aAAqC;AAAA,EACzC,MAAM;AAAA,EACN,YAAY;AAAA,EACZ,OAAO;AAAA,EACP,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,MAAM;AAAA,EACN,WAAW;AAAA,EACX,OAAO;AACT;AAcO,SAAS,gBAAgB,YAAoC;AAClE,MAAI,CAAC,YAAY,OAAO,KAAM,QAAO,CAAC;AAEtC,QAAM,SAA4B,CAAC;AACnC,QAAM,OAAO,oBAAI,IAAY;AAE7B,aAAW,SAAS,WAAW,MAAM,MAAM;AACzC,UAAM,QAAgB,MAAM,SAAS,MAAM,UAAU;AACrD,QAAI,CAAC,SAAS,KAAK,IAAI,KAAK,EAAG;AAC/B,SAAK,IAAI,KAAK;AAEd,UAAM,UAAkB,MAAM,WAAW,oBAAoB,KAAK;AAClE,UAAM,EAAE,QAAQ,OAAO,IAAI,qBAAqB,KAAK;AAErD,WAAO,KAAK;AAAA,MACV;AAAA,MACA;AAAA,MACA,SAAS;AAAA,MACT,QAAQ,SAAS,WAAW;AAAA,IAC9B,CAAC;AAAA,EACH;AAEA,SAAO;AACT;AAEA,SAAS,oBAAoB,OAAuB;AAElD,QAAM,UAAU,MAAM,YAAY,GAAG;AACrC,SAAO,UAAU,IAAI,MAAM,MAAM,GAAG,OAAO,IAAI;AACjD;AAEA,SAAS,qBAAqB,OAAoD;AAChF,QAAM,UAAU,MAAM,YAAY,GAAG;AACrC,QAAM,UAAU,UAAU,IAAI,MAAM,MAAM,UAAU,CAAC,IAAI;AACzD,QAAM,SAAS,QAAQ,YAAY,EAAE,SAAS,QAAQ;AACtD,QAAM,QAAQ,QAAQ,QAAQ,WAAW,EAAE,EAAE,KAAK;AAClD,QAAM,SAAS,WAAW,KAAK,KAAK;AACpC,SAAO,EAAE,QAAQ,OAAO;AAC1B;AAIA,IAAM,iBAAiB,oBAAI,IAAY;AAOhC,SAAS,gBAAgB,YAAuB;AACrD,MAAI,OAAO,aAAa,YAAa;AAErC,QAAM,SAAS,gBAAgB,UAAU;AACzC,QAAM,iBAAiB,oBAAI,IAAyB;AAEpD,aAAW,SAAS,QAAQ;AAC1B,QAAI,aAAa,IAAI,MAAM,OAAO,EAAG;AACrC,QAAI,CAAC,eAAe,IAAI,MAAM,OAAO,EAAG,gBAAe,IAAI,MAAM,SAAS,oBAAI,IAAI,CAAC;AACnF,UAAM,UAAU,MAAM,WAAW,WAAW,GAAG,MAAM,OAAO,WAAW,GAAG,MAAM,OAAO;AACvF,mBAAe,IAAI,MAAM,OAAO,EAAG,IAAI,OAAO;AAAA,EAChD;AAEA,aAAW,CAAC,QAAQ,QAAQ,KAAK,gBAAgB;AAC/C,QAAI,eAAe,IAAI,MAAM,EAAG;AAChC,mBAAe,IAAI,MAAM;AAGzB,UAAM,OAAO,OAAO,QAAQ,QAAQ,GAAG;AACvC,UAAM,UAAU,MAAM,KAAK,QAAQ,EAChC,IAAI,CAAC,MAAM,EAAE,QAAQ,UAAU,EAAE,CAAC,EAClC,OAAO,OAAO,EACd,KAAK,GAAG;AACX,UAAM,MAAM,4CAA4C,IAAI,cAAc,qBAAqB,QAAQ,CAAC;AAExG,UAAM,SAAS,gBAAgB,OAAO,QAAQ,QAAQ,GAAG,EAAE,YAAY,CAAC;AACxE,QAAI,CAAC,SAAS,eAAe,MAAM,GAAG;AACpC,YAAM,OAAO,SAAS,cAAc,MAAM;AAC1C,WAAK,KAAK;AACV,WAAK,MAAM;AACX,WAAK,OAAO;AACZ,eAAS,KAAK,YAAY,IAAI;AAAA,IAChC;AAAA,EACF;AAGA,sBAAoB,MAAM;AAC5B;AAEA,SAAS,qBAAqB,UAA+B;AAE3D,QAAM,OAAiB,CAAC;AACxB,aAAW,KAAK,UAAU;AACxB,UAAM,WAAW,EAAE,SAAS,QAAQ;AACpC,UAAM,SAAS,EAAE,QAAQ,UAAU,EAAE,KAAK;AAC1C,SAAK,KAAK,GAAG,WAAW,IAAI,CAAC,IAAI,MAAM,EAAE;AAAA,EAC3C;AACA,SAAO,KAAK,KAAK,EAAE,KAAK,GAAG;AAC7B;AAEA,IAAM,oBAAoB,oBAAI,IAAY;AAE1C,SAAS,oBAAoB,QAAiC;AAC5D,MAAI,OAAO,aAAa,YAAa;AAErC,QAAM,QAAkB,CAAC;AAEzB,aAAW,SAAS,QAAQ;AAC1B,QAAI,kBAAkB,IAAI,MAAM,KAAK,EAAG;AACxC,sBAAkB,IAAI,MAAM,KAAK;AAIjC,UAAM;AAAA,MACJ;AAAA;AAAA,kBAEY,MAAM,KAAK;AAAA,gBACb,MAAM,OAAO;AAAA,iBACZ,MAAM,OAAO;AAAA,gBACd,MAAM,MAAM;AAAA;AAAA,MAEtB,KAAK;AAAA,IACP;AAAA,EACF;AAEA,MAAI,MAAM,WAAW,EAAG;AAExB,QAAM,UAAU;AAChB,MAAI,UAAU,SAAS,eAAe,OAAO;AAC7C,MAAI,CAAC,SAAS;AACZ,cAAU,SAAS,cAAc,OAAO;AACxC,YAAQ,KAAK;AACb,aAAS,KAAK,YAAY,OAAO;AAAA,EACnC;AACA,UAAQ,eAAe,OAAO,MAAM,KAAK,IAAI;AAC/C;AAMA,eAAsB,oBAAmC;AACvD,MAAI,OAAO,aAAa,YAAa;AACrC,MAAI,SAAS,OAAO,OAAO;AACzB,UAAM,SAAS,MAAM;AAAA,EACvB,OAAO;AACL,UAAM,IAAI,QAAc,CAAC,MAAM,WAAW,GAAG,GAAG,CAAC;AAAA,EACnD;AACF;AAMO,SAAS,kBAAkB,QAAgB,UAAoB,CAAC,KAAK,GAAG,GAAS;AACtF,MAAI,OAAO,aAAa,YAAa;AACrC,MAAI,aAAa,IAAI,MAAM,EAAG;AAE9B,QAAM,SAAS,gBAAgB,OAAO,QAAQ,QAAQ,GAAG,EAAE,YAAY,CAAC;AACxE,MAAI,SAAS,eAAe,MAAM,EAAG;AAErC,QAAM,OAAO,OAAO,QAAQ,QAAQ,GAAG;AACvC,QAAM,OAAO,QAAQ,KAAK,GAAG;AAC7B,QAAM,MAAM,4CAA4C,IAAI,SAAS,IAAI;AAEzE,QAAM,OAAO,SAAS,cAAc,MAAM;AAC1C,OAAK,KAAK;AACV,OAAK,MAAM;AACX,OAAK,OAAO;AACZ,WAAS,KAAK,YAAY,IAAI;AAChC;AAKO,SAAS,iBAAuB;AACrC,iBAAe,MAAM;AACrB,oBAAkB,MAAM;AAC1B;;;AC3MA,IAAM,gBAAoC;AAAA,EACxC,MAAM;AAAA,EACN,OAAO;AAAA,EACP,KAAK;AAAA,EACL,KAAK;AAAA,EACL,MAAM;AACR;AAEA,IAAM,UAAkE;AAAA,EACtE,QAAQ;AAAA,IACN,EAAE,MAAM,iBAAiB,OAAO,YAAY,KAAK,MAAM,KAAK,KAAK,MAAM,EAAE;AAAA,IACzE,EAAE,MAAM,iBAAiB,OAAO,YAAY,KAAK,MAAM,KAAK,KAAK,MAAM,EAAE;AAAA,IACzE,EAAE,MAAM,cAAc,OAAO,QAAQ,KAAK,GAAG,KAAK,IAAI,MAAM,EAAE;AAAA,IAC9D,EAAE,MAAM,iBAAiB,OAAO,WAAW,KAAK,GAAG,KAAK,KAAK,MAAM,GAAG,MAAM,IAAI;AAAA,EAClF;AAAA,EACA,MAAM;AAAA,IACJ,EAAE,MAAM,QAAQ,OAAO,QAAQ,KAAK,GAAG,KAAK,KAAK,MAAM,EAAE;AAAA,IACzD,EAAE,MAAM,WAAW,OAAO,gBAAgB,KAAK,GAAG,KAAK,KAAK,MAAM,GAAG,MAAM,IAAI;AAAA,IAC/E,EAAE,MAAM,UAAU,OAAO,UAAU,KAAK,GAAG,KAAK,KAAK,MAAM,EAAE;AAAA,IAC7D,EAAE,MAAM,YAAY,OAAO,YAAY,KAAK,GAAG,KAAK,KAAK,MAAM,EAAE;AAAA,EACnE;AAAA,EACA,WAAW;AAAA,IACT,EAAE,MAAM,cAAc,OAAO,SAAS,KAAK,GAAG,KAAK,IAAI,MAAM,EAAE;AAAA,IAC/D,EAAE,MAAM,kBAAkB,OAAO,aAAa,KAAK,GAAG,KAAK,KAAK,MAAM,EAAE;AAAA,IACxE,EAAE,MAAM,eAAe,OAAO,UAAU,KAAK,GAAG,KAAK,KAAK,MAAM,EAAE;AAAA,IAClE,EAAE,MAAM,aAAa,OAAO,gBAAgB,KAAK,GAAG,KAAK,IAAI,MAAM,EAAE;AAAA,EACvE;AAAA,EACA,gBAAgB;AAAA,IACd,EAAE,MAAM,gBAAgB,OAAO,kBAAkB,KAAK,KAAK,KAAK,IAAI,MAAM,EAAE;AAAA,IAC5E,EAAE,MAAM,gBAAgB,OAAO,kBAAkB,KAAK,KAAK,KAAK,IAAI,MAAM,EAAE;AAAA,IAC5E,EAAE,MAAM,cAAc,OAAO,eAAe,KAAK,GAAG,KAAK,IAAI,MAAM,EAAE;AAAA,EACvE;AAAA,EACA,QAAQ;AAAA,IACN,EAAE,MAAM,eAAe,OAAO,SAAS,KAAK,GAAG,KAAK,IAAI,MAAM,IAAI;AAAA,IAClE,EAAE,MAAM,iBAAiB,OAAO,WAAW,KAAK,GAAG,KAAK,KAAK,MAAM,GAAG,MAAM,IAAI;AAAA,IAChF,EAAE,MAAM,cAAc,OAAO,QAAQ,KAAK,GAAG,KAAK,IAAI,MAAM,EAAE;AAAA,EAChE;AAAA,EACA,MAAM,CAAC,EAAE,MAAM,eAAe,OAAO,gBAAgB,KAAK,GAAG,KAAK,KAAK,MAAM,GAAG,MAAM,IAAI,CAAC;AAAA,EAC3F,OAAO;AAAA,IACL,EAAE,MAAM,gBAAgB,OAAO,iBAAiB,KAAK,GAAG,KAAK,KAAK,MAAM,GAAG,MAAM,IAAI;AAAA,IACrF,EAAE,MAAM,iBAAiB,OAAO,aAAa,KAAK,GAAG,KAAK,KAAK,MAAM,EAAE;AAAA,IACvE,EAAE,MAAM,iBAAiB,OAAO,aAAa,KAAK,GAAG,KAAK,KAAK,MAAM,EAAE;AAAA,EACzE;AAAA,EACA,MAAM,CAAC,EAAE,MAAM,kBAAkB,OAAO,UAAU,KAAK,GAAG,KAAK,GAAG,MAAM,KAAK,CAAC;AAAA,EAC9E,QAAQ;AAAA,IACN,EAAE,MAAM,QAAQ,OAAO,QAAQ,KAAK,GAAG,KAAK,IAAI,MAAM,IAAI;AAAA,IAC1D,EAAE,MAAM,SAAS,OAAO,SAAS,KAAK,GAAG,KAAK,GAAG,MAAM,KAAK;AAAA,EAC9D;AACF;AAEO,SAAS,4BAA4BE,QAA0C;AACpF,QAAM,aAAa,QAAQA,OAAM,IAAI,KAAK,CAAC;AAC3C,SAAO,CAAC,eAAe,GAAG,UAAU;AACtC;AAEO,SAAS,sBAAsBA,QAAoB,WAAmD;AAC3G,SAAO,4BAA4BA,MAAK,EAAE,KAAK,CAAC,MAAM,EAAE,SAAS,SAAS;AAC5E;AAEO,SAAS,gBAAgBA,QAAoB,WAA2B;AAC7E,MAAI,cAAc,eAAgB,QAAOA,OAAM;AAC/C,QAAM,QAAQ,UAAU,MAAM,GAAG;AACjC,MAAI,SAAkCA,OAAM;AAC5C,WAAS,IAAI,GAAG,IAAI,MAAM,SAAS,GAAG,KAAK;AACzC,UAAM,MAAM,MAAM,CAAC;AACnB,UAAM,OAAO,OAAO,GAAG;AACvB,QAAI,OAAO,SAAS,YAAY,SAAS,KAAM,QAAO;AACtD,aAAS;AAAA,EACX;AACA,QAAM,OAAO,MAAM,MAAM,SAAS,CAAC;AACnC,QAAM,IAAI,OAAO,IAAI;AACrB,SAAO,OAAO,MAAM,WAAW,IAAI;AACrC;;;AC9EA,SAAS,OAAO,GAAW,GAAW,GAAmB;AACvD,SAAO,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC;AACnC;AAEA,SAAS,SAAS,GAAW,GAAW,GAAmB;AACzD,SAAO,KAAK,IAAI,KAAK;AACvB;AAEA,SAAS,SAAS,MAAc,MAAc,GAAmB;AAC/D,QAAM,QAAQ,CAAC,MAAc;AAC3B,UAAM,IAAI,EAAE,QAAQ,KAAK,EAAE;AAC3B,UAAM,IAAI;AAAA,MACR,EAAE,WAAW,IACT,EACG,MAAM,EAAE,EACR,IAAI,CAAC,MAAM,IAAI,CAAC,EAChB,KAAK,EAAE,IACV;AAAA,MACJ;AAAA,IACF;AACA,WAAO,EAAE,GAAI,KAAK,KAAM,KAAK,GAAI,KAAK,IAAK,KAAK,GAAG,IAAI,IAAI;AAAA,EAC7D;AACA,MAAI;AACF,UAAM,IAAI,MAAM,IAAI;AACpB,UAAM,IAAI,MAAM,IAAI;AACpB,UAAM,IAAI,KAAK,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC;AAC1C,UAAM,IAAI,KAAK,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC;AAC1C,UAAM,KAAK,KAAK,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC;AAC3C,WAAO,MAAM,KAAK,OAAO,KAAK,OAAO,KAAK,KAAK,IAAI,SAAS,EAAE,EAAE,MAAM,CAAC,EAAE,YAAY,CAAC;AAAA,EACxF,QAAQ;AACN,WAAO,IAAI,MAAM,OAAO;AAAA,EAC1B;AACF;AAEA,SAAS,iBAAiB,SAAkC,SAAkC,GAAoC;AAChI,QAAM,MAA+B,CAAC;AACtC,QAAM,OAAO,oBAAI,IAAI,CAAC,GAAG,OAAO,KAAK,OAAO,GAAG,GAAG,OAAO,KAAK,OAAO,CAAC,CAAC;AACvE,aAAW,OAAO,MAAM;AACtB,UAAM,IAAI,QAAQ,GAAG;AACrB,UAAM,IAAI,QAAQ,GAAG;AACrB,QAAI,OAAO,MAAM,YAAY,OAAO,MAAM,UAAU;AAClD,UAAI,GAAG,IAAI,OAAO,UAAU,CAAC,KAAK,OAAO,UAAU,CAAC,IAAI,OAAO,GAAG,GAAG,CAAC,IAAI,SAAS,GAAG,GAAG,CAAC;AAAA,IAC5F,WAAW,OAAO,MAAM,YAAY,OAAO,MAAM,YAAY,EAAE,WAAW,GAAG,KAAK,EAAE,WAAW,GAAG,GAAG;AACnG,UAAI,GAAG,IAAI,SAAS,GAAG,GAAG,CAAC;AAAA,IAC7B,WAAW,MAAM,QAAQ,CAAC,KAAK,MAAM,QAAQ,CAAC,KAAK,QAAQ,qBAAqB;AAC9E,UAAI,GAAG,IAAI,EAAE,IAAI,CAAC,OAA0C,MAAc;AACxE,cAAM,QAAS,EAAe,CAAC,KAAK;AACpC,eAAO;AAAA,UACL,OAAO,SAAS,MAAM,OAAO,MAAM,OAAO,CAAC;AAAA,UAC3C,QAAQ,OAAO,MAAM,QAAQ,MAAM,QAAQ,CAAC;AAAA,QAC9C;AAAA,MACF,CAAC;AAAA,IACH,OAAO;AACL,UAAI,GAAG,IAAI,IAAI,MAAM,IAAI;AAAA,IAC3B;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,kBAAkB,GAAkB,GAAmE;AAC9G,QAAM,QAAyD,CAAC;AAChE,QAAM,QAAQ,oBAAI,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,GAAG,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;AACxE,aAAW,QAAQ,OAAO;AACxB,UAAM,KAAK,EAAE,OAAO,CAAC,MAAM,EAAE,SAAS,IAAI;AAC1C,UAAM,KAAK,EAAE,OAAO,CAAC,MAAM,EAAE,SAAS,IAAI;AAC1C,UAAM,MAAM,KAAK,IAAI,GAAG,QAAQ,GAAG,MAAM;AACzC,aAAS,IAAI,GAAG,IAAI,KAAK,KAAK;AAC5B,YAAM,KAAK,CAAC,GAAG,CAAC,KAAK,MAAM,GAAG,CAAC,KAAK,IAAI,CAAC;AAAA,IAC3C;AAAA,EACF;AACA,SAAO;AACT;AAGO,SAAS,YAAY,QAAuB,QAAuB,OAA8B;AACtG,QAAM,QAAQ,kBAAkB,OAAO,cAAc,OAAO,YAAY;AACxE,QAAM,SAAwB,CAAC;AAE/B,aAAW,CAAC,IAAI,EAAE,KAAK,OAAO;AAC5B,QAAI,CAAC,MAAM,IAAI;AACb,aAAO,KAAK,EAAE,GAAG,IAAI,IAAI,WAAW,GAAG,SAAS,GAAG,UAAU,MAAM,CAAC;AACpE;AAAA,IACF;AACA,QAAI,MAAM,CAAC,IAAI;AACb,aAAO,KAAK,EAAE,GAAG,IAAI,IAAI,WAAW,GAAG,SAAS,GAAG,WAAW,IAAI,OAAO,CAAC;AAC1E;AAAA,IACF;AACA,QAAI,CAAC,MAAM,CAAC,GAAI;AAChB,WAAO,KAAK;AAAA,MACV,GAAG;AAAA,MACH,IAAI,WAAW;AAAA,MACf,SAAS,QAAQ,MAAM,GAAG,UAAU,GAAG;AAAA,MACvC,SAAS,SAAS,GAAG,SAAS,GAAG,SAAS,KAAK;AAAA,MAC/C,QAAQ,iBAAiB,GAAG,QAAQ,GAAG,QAAQ,KAAK;AAAA,IACtD,CAAC;AAAA,EACH;AAEA,SAAO;AAAA,IACL,SAAS;AAAA,IACT,YAAY,QAAQ,MAAM,OAAO,aAAa,OAAO;AAAA,IACrD,QAAQ;AAAA,MACN,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,KAAK;AAAA,MAC7D,QAAQ,OAAO,OAAO,OAAO,QAAQ,OAAO,OAAO,QAAQ,KAAK;AAAA,MAChE,YAAY,OAAO,OAAO;AAAA,IAC5B;AAAA,IACA,MAAM;AAAA,MACJ,SAAS,OAAO,KAAK;AAAA,MACrB,YAAY,QAAQ,MAAM,OAAO,KAAK,aAAa,OAAO,KAAK;AAAA,MAC/D,YAAY,QAAQ,MAAM,OAAO,KAAK,aAAa,OAAO,KAAK;AAAA,MAC/D,WAAW,QAAQ,MAAM,OAAO,KAAK,YAAY,OAAO,KAAK;AAAA,MAC7D,UAAU,OAAO,OAAO,KAAK,UAAU,OAAO,KAAK,UAAU,KAAK;AAAA,MAClE,eAAe,OAAO,OAAO,KAAK,eAAe,OAAO,KAAK,eAAe,KAAK;AAAA,MACjF,YAAY,SAAS,OAAO,KAAK,YAAY,OAAO,KAAK,YAAY,KAAK;AAAA,MAC1E,UAAU,QAAQ,MAAM,OAAO,KAAK,WAAW,OAAO,KAAK;AAAA,MAC3D,UAAU,QAAQ,MAAM,OAAO,KAAK,WAAW,OAAO,KAAK;AAAA,IAC7D;AAAA,IACA,cAAc;AAAA,IACd,gBAAgB,QAAQ,MAAM,OAAO,iBAAiB,OAAO;AAAA,IAC7D,cAAc,OAAO,gBAAgB,OAAO,eAAe,iBAAiB,OAAO,cAAyC,OAAO,cAAyC,KAAK,IAAI,QAAQ,MAAM,OAAO,eAAe,OAAO;AAAA,IAChO,YAAY;AAAA,MACV,MAAM,SAAS,OAAO,WAAW,MAAM,OAAO,WAAW,MAAM,KAAK;AAAA,MACpE,OAAO,SAAS,OAAO,WAAW,OAAO,OAAO,WAAW,OAAO,KAAK;AAAA,MACvE,gBAAgB,SAAS,OAAO,WAAW,kBAAkB,KAAK,OAAO,WAAW,kBAAkB,KAAK,KAAK;AAAA,IAClH;AAAA,IACA,UAAU,QAAQ,MAAM,OAAO,WAAW,OAAO;AAAA,EACnD;AACF;AAEO,SAAS,aAAa,MAAwB,MAAwB,OAAiC;AAC5G,SAAO,cAAc,YAAY,wBAAwB,IAAI,GAAG,wBAAwB,IAAI,GAAG,KAAK,CAAC;AACvG;;;ACnIO,SAAS,qBAAqB,KAGnC;AACA,QAAM,SAAS,KAAK,MAAM,GAAG;AAC7B,MAAI,OAAO,WAAW,YAAY,WAAW,QAAQ,aAAa,UAAW,OAAyB,YAAY,KAAK,MAAM,QAAS,OAAyB,YAAY,GAAG;AAC5K,UAAM,QAAQ;AACd,WAAO,EAAE,OAAO,QAAQ,cAAc,KAAK,EAAE;AAAA,EAC/C;AACA,QAAM,SAAS;AACf,SAAO,EAAE,OAAO,wBAAwB,MAAM,GAAG,OAAO;AAC1D;AAEO,SAAS,cAAc,OAA8B;AAC1D,SAAO,KAAK,UAAU,KAAK;AAC7B;;;AChBO,SAAS,QAAQ,OAA0B;AAChD,SAAO,GAAG,MAAM,OAAO,KAAK,MAAM,SAAS;AAC7C;AAEO,SAAS,eAAe,KAAoB,SAAiB,WAA2B;AAC7F,SAAO,IAAI,SAAS,OAAO;AAAA,IACzB,CAAC,MAAM,EAAE,YAAY,WAAW,EAAE,cAAc;AAAA,EAClD;AACF;AAEO,SAAS,aAAa,KAAoB,SAAiB;AAChE,SAAO,IAAI,aAAa,KAAK,CAAC,MAAM,EAAE,OAAO,OAAO;AACtD;AAEO,SAAS,eACd,KACA,OACe;AACf,SAAO,EAAE,GAAG,KAAK,UAAU,EAAE,GAAG,IAAI,UAAU,GAAG,MAAM,EAAE;AAC3D;AAEO,SAAS,UAAU,KAAoB,QAAoC;AAChF,SAAO,eAAe,KAAK,EAAE,OAAO,CAAC;AACvC;AAEO,SAAS,oBAAoB,KAAoB,SAAgC;AACtF,SAAO;AAAA,IACL;AAAA,IACA,IAAI,SAAS,OAAO,OAAO,CAAC,MAAM,EAAE,YAAY,OAAO;AAAA,EACzD;AACF;AAEO,SAAS,SACd,KACA,SACA,WACA,kBACe;AACf,MAAI,eAAe,KAAK,SAAS,SAAS,KAAK,EAAG,QAAO;AACzD,QAAMC,SAAQ,aAAa,KAAK,OAAO;AACvC,QAAM,OAAOA,SAAQ,gBAAgBA,QAAO,SAAS,IAAI;AACzD,QAAM,QAAmB;AAAA,IACvB;AAAA,IACA;AAAA,IACA,WAAW,oBAAoB,CAAC,EAAE,MAAM,GAAG,OAAO,MAAM,QAAQ,YAAY,CAAC;AAAA,EAC/E;AACA,SAAO,UAAU,KAAK,CAAC,GAAG,IAAI,SAAS,QAAQ,KAAK,CAAC;AACvD;AAEO,SAAS,YAAY,KAAoB,YAAmC;AACjF,QAAM,SAAS,IAAI,SAAS,OAAO,OAAO,CAAC,GAAG,MAAM,MAAM,UAAU;AACpE,SAAO,UAAU,KAAK,MAAM;AAC9B;AAEO,SAAS,YACd,KACA,YACA,SACe;AACf,QAAM,SAAS,IAAI,SAAS,OAAO,IAAI,CAAC,GAAG,MAAO,MAAM,aAAa,QAAQ,CAAC,IAAI,CAAE;AACpF,SAAO,UAAU,KAAK,MAAM;AAC9B;AAEO,SAAS,cAAc,WAAmC;AAC/D,SAAO,CAAC,GAAG,SAAS,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,OAAO,EAAE,IAAI;AACtD;AAEA,IAAM,qBAAqB;AAEpB,SAAS,eACd,OACA,MACA,OACA,QACW;AACX,QAAM,cAAc,KAAK,IAAI,GAAG,IAAI;AACpC,QAAM,cAAc,MAAM,UAAU;AAAA,IAClC,CAAC,MAAM,KAAK,IAAI,EAAE,OAAO,WAAW,IAAI;AAAA,EAC1C;AACA,MAAI,eAAe,GAAG;AACpB,UAAM,OAAO,CAAC,GAAG,MAAM,SAAS;AAChC,SAAK,WAAW,IAAI;AAAA,MAClB,GAAG,KAAK,WAAW;AAAA,MACnB,MAAM;AAAA,MACN,OAAO,SAAS,KAAK,WAAW,EAAE;AAAA,MAClC,QAAQ,UAAU,KAAK,WAAW,EAAE;AAAA,IACtC;AACA,WAAO,EAAE,GAAG,OAAO,WAAW,cAAc,IAAI,EAAE;AAAA,EACpD;AACA,QAAM,gBAAgB,UAAU,MAAM,UAAU,CAAC,GAAG,SAAS;AAC7D,SAAO;AAAA,IACL,GAAG;AAAA,IACH,WAAW,cAAc;AAAA,MACvB,GAAG,MAAM;AAAA,MACT,EAAE,MAAM,aAAa,OAAO,eAAe,QAAQ,UAAU,YAAY;AAAA,IAC3E,CAAC;AAAA,EACH;AACF;AAEO,SAAS,kBACd,KACA,YACA,MACA,OACe;AACf,SAAO,YAAY,KAAK,YAAY,CAAC,UAAU;AAC7C,UAAMA,SAAQ,aAAa,KAAK,MAAM,OAAO;AAC7C,UAAM,WACJ,UAAUA,SAAQ,gBAAgBA,QAAO,MAAM,SAAS,IAAI,MAAM,UAAU,CAAC,GAAG,SAAS;AAC3F,WAAO,eAAe,OAAO,MAAM,QAAQ;AAAA,EAC7C,CAAC;AACH;AAEO,SAAS,aACd,KACA,YACA,eACA,MACA,UACe;AACf,QAAM,UAAU,KAAK,IAAI,GAAG,KAAK,IAAI,UAAU,IAAI,CAAC;AACpD,SAAO,YAAY,KAAK,YAAY,CAAC,UAAU;AAC7C,UAAM,MAAM,CAAC,GAAG,MAAM,SAAS;AAC/B,QAAI,gBAAgB,KAAK,iBAAiB,IAAI,OAAQ,QAAO;AAC7D,QAAI,aAAa,IAAI,EAAE,GAAG,IAAI,aAAa,GAAG,MAAM,QAAQ;AAC5D,WAAO,EAAE,GAAG,OAAO,WAAW,cAAc,GAAG,EAAE;AAAA,EACnD,CAAC;AACH;AAEO,SAAS,eACd,KACA,YACA,eACA,OACe;AACf,SAAO,YAAY,KAAK,YAAY,CAAC,UAAU;AAC7C,UAAM,MAAM,MAAM,UAAU,IAAI,CAAC,GAAG,MAAO,MAAM,gBAAgB,EAAE,GAAG,GAAG,GAAG,MAAM,IAAI,CAAE;AACxF,WAAO,EAAE,GAAG,OAAO,WAAW,cAAc,GAAG,EAAE;AAAA,EACnD,CAAC;AACH;AAEO,SAAS,eACd,KACA,YACA,eACe;AACf,SAAO,YAAY,KAAK,YAAY,CAAC,WAAW;AAAA,IAC9C,GAAG;AAAA,IACH,WAAW,MAAM,UAAU,OAAO,CAAC,GAAG,MAAM,MAAM,aAAa;AAAA,EACjE,EAAE;AACJ;AAEO,SAAS,yBACd,KACA,YACA,aACe;AACf,QAAM,QAAQ,IAAI,SAAS,OAAO,UAAU;AAC5C,MAAI,CAAC,MAAO,QAAO;AACnB,QAAMA,SAAQ,aAAa,KAAK,MAAM,OAAO;AAC7C,QAAM,QAAQA,SAAQ,gBAAgBA,QAAO,MAAM,SAAS,IAAI;AAChE,SAAO,kBAAkB,KAAK,YAAY,aAAa,KAAK;AAC9D;","names":["createCanvas","getCanvas2DContext","hexToRgb","layer","hexToRgb","createCanvas","getCanvas2DContext","startX","startY","layer","layer","kf","layer","layer","kf","layer","lastKf","layer","kf","layer","kf","layer","layer"]}
|