git-hash-art 0.10.1 → 0.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/workflows/deploy-www.yml +13 -3
- package/CHANGELOG.md +10 -0
- package/dist/browser.js +360 -56
- package/dist/browser.js.map +1 -1
- package/dist/main.js +362 -56
- package/dist/main.js.map +1 -1
- package/dist/module.js +362 -56
- package/dist/module.js.map +1 -1
- package/package.json +1 -1
- package/src/lib/archetypes.ts +29 -0
- package/src/lib/canvas/colors.ts +7 -5
- package/src/lib/canvas/draw.ts +14 -4
- package/src/lib/render.ts +249 -60
package/dist/main.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"mappings":"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","sources":["src/index.ts","src/lib/render.ts","src/lib/canvas/colors.ts","global.d.ts","src/lib/utils.ts","src/lib/canvas/draw.ts","src/lib/canvas/shapes/index.ts","src/lib/canvas/shapes/basic.ts","src/lib/canvas/shapes/complex.ts","src/lib/constants.ts","src/lib/canvas/shapes/utils.ts","src/lib/canvas/shapes/sacred.ts","src/lib/canvas/shapes/procedural.ts","src/lib/canvas/shapes/affinity.ts","src/types.ts","src/lib/archetypes.ts"],"sourcesContent":["import { createCanvas } from \"@napi-rs/canvas\";\nimport * as fs from \"fs\";\nimport * as path from \"path\";\nimport { renderHashArt } from \"./lib/render\";\nimport type { GenerationConfig } from \"./types\";\nimport { DEFAULT_CONFIG } from \"./types\";\n\n/**\n * Generate an abstract art PNG buffer from a git hash (Node.js only).\n *\n * Uses @napi-rs/canvas under the hood to create an off-screen canvas,\n * renders the hash-derived art, and returns the result as a PNG Buffer.\n *\n * @param gitHash - Hex hash string used as the deterministic seed\n * @param config - Partial generation config (merged with defaults)\n * @returns PNG buffer of the generated image\n */\nfunction generateImageFromHash(\n gitHash: string,\n config: Partial<GenerationConfig> = {},\n): Buffer {\n const finalConfig: GenerationConfig = { ...DEFAULT_CONFIG, ...config };\n const { width, height } = finalConfig;\n\n const canvas = createCanvas(width, height);\n const ctx = canvas.getContext(\"2d\") as unknown as CanvasRenderingContext2D;\n\n renderHashArt(ctx, gitHash, finalConfig);\n\n return canvas.toBuffer(\"image/png\");\n}\n\n/**\n * Save the generated image to a file (Node.js only).\n *\n * @param imageBuffer - The PNG buffer of the generated image\n * @param outputDir - The directory to save the image\n * @param gitHash - The git hash used to generate the image\n * @param label - Optional label for the output filename\n * @param width - The width of the generated image\n * @param height - The height of the generated image\n * @returns Path to the saved image\n */\nfunction saveImageToFile(\n imageBuffer: Buffer,\n outputDir: string,\n gitHash: string,\n label = \"\",\n width: number,\n height: number,\n): string {\n if (!fs.existsSync(outputDir)) {\n fs.mkdirSync(outputDir, { recursive: true });\n }\n\n const filename = label\n ? `${label}-${width}x${height}-${gitHash.slice(0, 8)}.png`\n : `${gitHash.slice(0, 8)}-${width}x${height}.png`;\n\n const outputPath = path.join(outputDir, filename);\n fs.writeFileSync(outputPath, imageBuffer);\n console.log(`Generated: ${outputPath}`);\n\n return outputPath;\n}\n\nexport { generateImageFromHash, saveImageToFile, renderHashArt };\nexport { PRESETS } from \"./lib/constants\";\nexport type { GenerationConfig } from \"./types\";\nexport { DEFAULT_CONFIG } from \"./types\";\n","/**\n * Pure rendering logic — environment-agnostic.\n *\n * Uses only the standard CanvasRenderingContext2D API so it works\n * identically in Node (@napi-rs/canvas) and browsers.\n *\n * Generation pipeline:\n * 0. Archetype selection + shape palette + color hierarchy\n * 1. Background — style from archetype, gradient mesh for depth\n * 1b. Layered background — archetype-coherent shapes\n * 2. Composition mode + symmetry\n * 3. Focal points + void zones + hero avoidance field\n * 4. Flow field\n * 4b. Hero shape\n * 5. Shape layers — palette-driven selection, affinity-aware styles,\n * size echo, tangent placement, atmospheric depth\n * 5b. Recursive nesting\n * 6. Flow lines — variable color, branching, pressure simulation\n * 6b. Symmetry mirroring\n * 7. Noise texture\n * 8. Vignette\n * 9. Organic connecting curves\n * 10. Post-processing — color grading, chromatic aberration, bloom\n */\nimport {\n SacredColorScheme,\n hexWithAlpha, jitterColorHSL,\n desaturate,\n shiftTemperature,\n luminance,\n enforceContrast,\n buildColorHierarchy,\n pickHierarchyColor, pickColorGrade,\n evolveHierarchy, type ColorHierarchy\n} from \"./canvas/colors\";\nimport {\n enhanceShapeGeneration,\n drawMirroredShape,\n pickMirrorAxis,\n pickBlendMode,\n pickRenderStyle,\n type RenderStyle\n} from \"./canvas/draw\";\nimport { shapes } from \"./canvas/shapes\";\nimport {\n buildShapePalette,\n pickShapeFromPalette,\n pickStyleForShape,\n SHAPE_PROFILES\n} from \"./canvas/shapes/affinity\";\nimport { createRng, seedFromHash, createSimplexNoise, createFBM } from \"./utils\";\nimport { DEFAULT_CONFIG, type GenerationConfig } from \"../types\";\nimport { selectArchetype, type BackgroundStyle } from \"./archetypes\";\n\n\n// ── Shape categories for weighted selection (legacy fallback) ───────\n\nconst SACRED_SHAPES = [\n \"mandala\",\n \"flowerOfLife\",\n \"treeOfLife\",\n \"metatronsCube\",\n \"sriYantra\",\n \"seedOfLife\",\n \"vesicaPiscis\",\n \"torus\",\n \"eggOfLife\",\n];\n\n// ── Composition modes ───────────────────────────────────────────────\n\ntype CompositionMode =\n | \"radial\"\n | \"flow-field\"\n | \"spiral\"\n | \"grid-subdivision\"\n | \"clustered\"\n | \"golden-spiral\";\n\nconst COMPOSITION_MODES: CompositionMode[] = [\n \"radial\",\n \"flow-field\",\n \"spiral\",\n \"grid-subdivision\",\n \"clustered\",\n \"golden-spiral\",\n];\n\n// ── Helper: get position based on composition mode ──────────────────\n\nfunction getCompositionPosition(\n mode: CompositionMode,\n rng: () => number,\n width: number,\n height: number,\n shapeIndex: number,\n totalShapes: number,\n cx: number,\n cy: number,\n): { x: number; y: number } {\n switch (mode) {\n case \"radial\": {\n const angle = rng() * Math.PI * 2;\n const maxR = Math.min(width, height) * 0.45;\n const r = Math.pow(rng(), 0.7) * maxR;\n return { x: cx + Math.cos(angle) * r, y: cy + Math.sin(angle) * r };\n }\n case \"spiral\": {\n const t = shapeIndex / totalShapes;\n const turns = 3 + rng() * 2;\n const angle = t * Math.PI * 2 * turns;\n const maxR = Math.min(width, height) * 0.42;\n const r = t * maxR + (rng() - 0.5) * maxR * 0.15;\n return { x: cx + Math.cos(angle) * r, y: cy + Math.sin(angle) * r };\n }\n case \"grid-subdivision\": {\n const cells = 3 + Math.floor(rng() * 3);\n const cellW = width / cells;\n const cellH = height / cells;\n const gx = Math.floor(rng() * cells);\n const gy = Math.floor(rng() * cells);\n return {\n x: gx * cellW + rng() * cellW,\n y: gy * cellH + rng() * cellH,\n };\n }\n case \"clustered\": {\n const numClusters = 3 + Math.floor(rng() * 3);\n const ci = Math.floor(rng() * numClusters);\n const clusterRng = createRng(seedFromHash(String(ci), 999));\n const clx = width * (0.15 + clusterRng() * 0.7);\n const cly = height * (0.15 + clusterRng() * 0.7);\n const spread = Math.min(width, height) * 0.18;\n return {\n x: clx + (rng() - 0.5) * spread * 2,\n y: cly + (rng() - 0.5) * spread * 2,\n };\n }\n case \"flow-field\":\n default: {\n return { x: rng() * width, y: rng() * height };\n }\n case \"golden-spiral\": {\n // Logarithmic spiral: r = a * e^(b*theta), with golden angle spacing\n const PHI = (1 + Math.sqrt(5)) / 2;\n const goldenAngle = 2 * Math.PI / (PHI * PHI); // ~137.5° in radians\n const t = shapeIndex / totalShapes;\n const angle = shapeIndex * goldenAngle + rng() * 0.3;\n const maxR = Math.min(width, height) * 0.44;\n // Shapes spiral outward with sqrt distribution for even area coverage\n const r = Math.sqrt(t) * maxR + (rng() - 0.5) * maxR * 0.08;\n return { x: cx + Math.cos(angle) * r, y: cy + Math.sin(angle) * r };\n }\n }\n}\n\n// ── Helper: positional color from hierarchy ─────────────────────────\n\nfunction getPositionalColor(\n x: number,\n y: number,\n width: number,\n height: number,\n hierarchy: ColorHierarchy,\n rng: () => number,\n): string {\n // Blend position into color selection — shapes near center lean dominant\n const distFromCenter = Math.hypot(x - width / 2, y - height / 2) /\n Math.hypot(width / 2, height / 2);\n // Center = more dominant, edges = more accent\n if (distFromCenter < 0.35) {\n return jitterColorHSL(hierarchy.dominant, rng, 10, 0.08);\n } else if (distFromCenter < 0.7) {\n return jitterColorHSL(pickHierarchyColor(hierarchy, rng), rng, 8, 0.06);\n } else {\n // Edges: bias toward secondary/accent\n const roll = rng();\n const color = roll < 0.4 ? hierarchy.secondary : roll < 0.75 ? hierarchy.accent : hierarchy.dominant;\n return jitterColorHSL(color, rng, 12, 0.08);\n }\n}\n\n// ── Helper: check if a position is inside a void zone ───────────────\n\nfunction isInVoidZone(\n x: number,\n y: number,\n voidZones: Array<{ x: number; y: number; radius: number }>,\n): boolean {\n for (const zone of voidZones) {\n if (Math.hypot(x - zone.x, y - zone.y) < zone.radius) return true;\n }\n return false;\n}\n\n// ── Helper: density check ───────────────────────────────────────────\n\nfunction localDensity(\n x: number,\n y: number,\n positions: Array<{ x: number; y: number; size: number }>,\n radius: number,\n): number {\n let count = 0;\n for (const p of positions) {\n if (Math.hypot(x - p.x, y - p.y) < radius) count++;\n }\n return count;\n}\n\n// ── Helper: draw background based on archetype style ────────────────\n\nfunction drawBackground(\n ctx: CanvasRenderingContext2D,\n style: BackgroundStyle,\n bgStart: string,\n bgEnd: string,\n width: number,\n height: number,\n cx: number,\n cy: number,\n bgRadius: number,\n rng: () => number,\n colors: string[],\n): void {\n switch (style) {\n case \"radial-light\": {\n const grad = ctx.createRadialGradient(cx, cy, 0, cx, cy, bgRadius);\n grad.addColorStop(0, \"#f0ece4\");\n grad.addColorStop(1, bgStart);\n ctx.fillStyle = grad;\n ctx.fillRect(0, 0, width, height);\n break;\n }\n case \"linear-horizontal\": {\n const grad = ctx.createLinearGradient(0, 0, width, 0);\n grad.addColorStop(0, bgStart);\n grad.addColorStop(1, bgEnd);\n ctx.fillStyle = grad;\n ctx.fillRect(0, 0, width, height);\n break;\n }\n case \"linear-diagonal\": {\n const grad = ctx.createLinearGradient(0, 0, width, height);\n grad.addColorStop(0, bgStart);\n grad.addColorStop(0.5, bgEnd);\n grad.addColorStop(1, bgStart);\n ctx.fillStyle = grad;\n ctx.fillRect(0, 0, width, height);\n break;\n }\n case \"solid-dark\": {\n ctx.fillStyle = bgStart;\n ctx.fillRect(0, 0, width, height);\n break;\n }\n case \"solid-light\": {\n ctx.fillStyle = \"#f5f2eb\";\n ctx.fillRect(0, 0, width, height);\n break;\n }\n case \"multi-stop\": {\n const grad = ctx.createLinearGradient(0, 0, width * 0.7, height);\n grad.addColorStop(0, bgStart);\n grad.addColorStop(0.33, bgEnd);\n if (colors.length > 0) {\n const midColor = hexWithAlpha(colors[0], 1).replace(/rgba\\((\\d+),(\\d+),(\\d+),[^)]+\\)/, (_, r, g, b) => {\n const darken = (v: string) => Math.round(parseInt(v) * 0.4).toString(16).padStart(2, \"0\");\n return `#${darken(r)}${darken(g)}${darken(b)}`;\n });\n grad.addColorStop(0.66, midColor);\n }\n grad.addColorStop(1, bgStart);\n ctx.fillStyle = grad;\n ctx.fillRect(0, 0, width, height);\n break;\n }\n case \"radial-dark\":\n default: {\n const grad = ctx.createRadialGradient(cx, cy, 0, cx, cy, bgRadius);\n grad.addColorStop(0, bgStart);\n grad.addColorStop(1, bgEnd);\n ctx.fillStyle = grad;\n ctx.fillRect(0, 0, width, height);\n break;\n }\n }\n}\n\n// ── Shape constellations — pre-composed groups of shapes ────────\n\ninterface ConstellationDef {\n name: string;\n /** Generate member positions/shapes relative to center */\n build: (rng: () => number, baseSize: number) => Array<{\n dx: number; dy: number; shape: string; size: number; rotation: number;\n }>;\n}\n\nconst CONSTELLATIONS: ConstellationDef[] = [\n {\n name: \"flanked-triangle\",\n build: (rng, baseSize) => {\n const gap = baseSize * (0.6 + rng() * 0.3);\n return [\n { dx: 0, dy: 0, shape: \"triangle\", size: baseSize, rotation: rng() * 360 },\n { dx: -gap, dy: gap * 0.3, shape: \"circle\", size: baseSize * 0.35, rotation: 0 },\n { dx: gap, dy: gap * 0.3, shape: \"circle\", size: baseSize * 0.35, rotation: 0 },\n ];\n },\n },\n {\n name: \"hexagon-ring\",\n build: (rng, baseSize) => {\n const members: Array<{ dx: number; dy: number; shape: string; size: number; rotation: number }> = [];\n const count = 5 + Math.floor(rng() * 2);\n const ringR = baseSize * 0.6;\n for (let i = 0; i < count; i++) {\n const angle = (i / count) * Math.PI * 2;\n members.push({\n dx: Math.cos(angle) * ringR,\n dy: Math.sin(angle) * ringR,\n shape: \"hexagon\",\n size: baseSize * (0.25 + rng() * 0.1),\n rotation: (angle * 180) / Math.PI,\n });\n }\n return members;\n },\n },\n {\n name: \"spiral-dots\",\n build: (rng, baseSize) => {\n const members: Array<{ dx: number; dy: number; shape: string; size: number; rotation: number }> = [];\n const count = 7 + Math.floor(rng() * 5);\n const turns = 1.5 + rng();\n for (let i = 0; i < count; i++) {\n const t = i / count;\n const angle = t * Math.PI * 2 * turns;\n const r = t * baseSize * 0.7;\n members.push({\n dx: Math.cos(angle) * r,\n dy: Math.sin(angle) * r,\n shape: \"circle\",\n size: baseSize * (0.08 + (1 - t) * 0.12),\n rotation: 0,\n });\n }\n return members;\n },\n },\n {\n name: \"diamond-cluster\",\n build: (rng, baseSize) => {\n const gap = baseSize * 0.45;\n return [\n { dx: 0, dy: -gap, shape: \"diamond\", size: baseSize * 0.4, rotation: 0 },\n { dx: gap, dy: 0, shape: \"diamond\", size: baseSize * 0.35, rotation: 15 },\n { dx: 0, dy: gap, shape: \"diamond\", size: baseSize * 0.3, rotation: 30 },\n { dx: -gap, dy: 0, shape: \"diamond\", size: baseSize * 0.35, rotation: -15 },\n ];\n },\n },\n {\n name: \"crescent-pair\",\n build: (rng, baseSize) => {\n const gap = baseSize * 0.5;\n return [\n { dx: -gap * 0.4, dy: 0, shape: \"crescent\", size: baseSize * 0.5, rotation: rng() * 30 },\n { dx: gap * 0.4, dy: 0, shape: \"crescent\", size: baseSize * 0.45, rotation: 180 + rng() * 30 },\n ];\n },\n },\n];\n\n// ── Main render function ────────────────────────────────────────────\n\nexport function renderHashArt(\n ctx: CanvasRenderingContext2D,\n gitHash: string,\n config: Partial<GenerationConfig> = {},\n): void {\n const finalConfig: GenerationConfig = { ...DEFAULT_CONFIG, ...config };\n\n const rng = createRng(seedFromHash(gitHash));\n\n // ── 0. Select archetype — fundamentally different visual personality ──\n const archetype = selectArchetype(rng);\n\n // Archetype overrides defaults, but explicit user config wins\n const {\n width,\n height,\n } = finalConfig;\n const gridSize = config.gridSize ?? archetype.gridSize;\n const layers = config.layers ?? archetype.layers;\n const minShapeSize = config.minShapeSize ?? archetype.minShapeSize;\n const maxShapeSize = config.maxShapeSize ?? archetype.maxShapeSize;\n const baseOpacity = config.baseOpacity ?? archetype.baseOpacity;\n const opacityReduction = config.opacityReduction ?? archetype.opacityReduction;\n\n const shapesPerLayer =\n finalConfig.shapesPerLayer || Math.floor(gridSize * gridSize * 1.5);\n\n const colorScheme = new SacredColorScheme(gitHash);\n const colors = colorScheme.getColorsByMode(archetype.paletteMode);\n const [bgStart, bgEnd] = colorScheme.getBackgroundColorsByMode(archetype.paletteMode);\n const tempMode = colorScheme.getTemperatureMode();\n const fgTempTarget: \"warm\" | \"cool\" | null =\n tempMode === \"warm-bg\" ? \"cool\" : tempMode === \"cool-bg\" ? \"warm\" : null;\n\n // ── 0b. Color hierarchy — dominant/secondary/accent weighting ──\n const colorHierarchy = buildColorHierarchy(colors, rng);\n\n // ── 0c. Shape palette — curated shapes that work well together ──\n const shapeNames = Object.keys(shapes);\n const shapePalette = buildShapePalette(rng, shapeNames, archetype.name);\n\n // ── 0d. Color grading — unified tone for the whole image ───────\n const colorGrade = pickColorGrade(rng);\n\n // ── 0e. Light direction — consistent shadow angle ──────────────\n const lightAngle = rng() * Math.PI * 2;\n\n // ── 0f. Palette evolution — hue drift direction across layers ──\n const paletteHueShift = (rng() - 0.5) * 40; // -20° to +20° total drift\n\n const scaleFactor = Math.min(width, height) / 1024;\n const adjustedMinSize = minShapeSize * scaleFactor;\n const adjustedMaxSize = maxShapeSize * scaleFactor;\n\n const cx = width / 2;\n const cy = height / 2;\n\n // ── 1. Background ──────────────────────────────────────────────\n const bgRadius = Math.hypot(cx, cy);\n drawBackground(ctx, archetype.backgroundStyle, bgStart, bgEnd, width, height, cx, cy, bgRadius, rng, colors);\n\n // Gradient mesh overlay — 3-4 color control points for richer backgrounds\n const meshPoints = 3 + Math.floor(rng() * 2);\n ctx.globalCompositeOperation = \"soft-light\";\n for (let i = 0; i < meshPoints; i++) {\n const mx = rng() * width;\n const my = rng() * height;\n const mRadius = Math.min(width, height) * (0.3 + rng() * 0.4);\n const mColor = pickHierarchyColor(colorHierarchy, rng);\n const grad = ctx.createRadialGradient(mx, my, 0, mx, my, mRadius);\n grad.addColorStop(0, hexWithAlpha(mColor, 0.08 + rng() * 0.06));\n grad.addColorStop(1, \"rgba(0,0,0,0)\");\n ctx.globalAlpha = 1;\n ctx.fillStyle = grad;\n ctx.fillRect(0, 0, width, height);\n }\n ctx.globalCompositeOperation = \"source-over\";\n\n // Compute average background luminance for contrast enforcement\n const bgLum = (luminance(bgStart) + luminance(bgEnd)) / 2;\n\n // ── 1b. Layered background — archetype-coherent shapes ─────────\n const bgShapeCount = 3 + Math.floor(rng() * 4);\n ctx.globalCompositeOperation = \"soft-light\";\n for (let i = 0; i < bgShapeCount; i++) {\n const bx = rng() * width;\n const by = rng() * height;\n const bSize = (width * 0.3 + rng() * width * 0.5);\n const bColor = pickHierarchyColor(colorHierarchy, rng);\n ctx.globalAlpha = 0.03 + rng() * 0.05;\n ctx.fillStyle = hexWithAlpha(bColor, 0.15);\n ctx.beginPath();\n // Use archetype-appropriate background shapes\n if (archetype.name === \"geometric-precision\" || archetype.name === \"op-art\") {\n // Rectangular shapes for geometric archetypes\n ctx.rect(bx - bSize / 2, by - bSize / 2, bSize, bSize * (0.5 + rng() * 0.5));\n } else {\n ctx.arc(bx, by, bSize / 2, 0, Math.PI * 2);\n }\n ctx.fill();\n }\n // Subtle concentric rings from center\n const ringCount = 2 + Math.floor(rng() * 3);\n ctx.globalAlpha = 0.02 + rng() * 0.03;\n ctx.strokeStyle = hexWithAlpha(colorHierarchy.dominant, 0.1);\n ctx.lineWidth = 1 * scaleFactor;\n for (let i = 1; i <= ringCount; i++) {\n const r = (Math.min(width, height) * 0.15) * i;\n ctx.beginPath();\n ctx.arc(cx, cy, r, 0, Math.PI * 2);\n ctx.stroke();\n }\n ctx.globalCompositeOperation = \"source-over\";\n\n // ── 1c. Background pattern layer — subtle textured paper ───────\n const bgPatternRoll = rng();\n if (bgPatternRoll < 0.6) {\n ctx.save();\n ctx.globalCompositeOperation = \"soft-light\";\n const patternOpacity = 0.02 + rng() * 0.04;\n const patternColor = hexWithAlpha(colorHierarchy.dominant, 0.15);\n\n if (bgPatternRoll < 0.2) {\n // Dot grid\n const dotSpacing = Math.max(8, Math.min(width, height) * (0.015 + rng() * 0.015));\n const dotR = dotSpacing * 0.08;\n ctx.globalAlpha = patternOpacity;\n ctx.fillStyle = patternColor;\n for (let px = 0; px < width; px += dotSpacing) {\n for (let py = 0; py < height; py += dotSpacing) {\n ctx.beginPath();\n ctx.arc(px, py, dotR, 0, Math.PI * 2);\n ctx.fill();\n }\n }\n } else if (bgPatternRoll < 0.4) {\n // Diagonal lines\n const lineSpacing = Math.max(6, Math.min(width, height) * (0.02 + rng() * 0.02));\n ctx.globalAlpha = patternOpacity;\n ctx.strokeStyle = patternColor;\n ctx.lineWidth = 0.5 * scaleFactor;\n const diag = Math.hypot(width, height);\n for (let d = -diag; d < diag; d += lineSpacing) {\n ctx.beginPath();\n ctx.moveTo(d, 0);\n ctx.lineTo(d + height, height);\n ctx.stroke();\n }\n } else {\n // Tessellation — hexagonal grid of tiny shapes\n const tessSize = Math.max(10, Math.min(width, height) * (0.025 + rng() * 0.02));\n const tessH = tessSize * Math.sqrt(3);\n ctx.globalAlpha = patternOpacity * 0.7;\n ctx.strokeStyle = patternColor;\n ctx.lineWidth = 0.4 * scaleFactor;\n for (let row = 0; row * tessH < height + tessH; row++) {\n const offsetX = (row % 2) * tessSize * 0.75;\n for (let col = 0; col * tessSize * 1.5 < width + tessSize * 1.5; col++) {\n const hx = col * tessSize * 1.5 + offsetX;\n const hy = row * tessH;\n ctx.beginPath();\n for (let s = 0; s < 6; s++) {\n const angle = (Math.PI / 3) * s - Math.PI / 6;\n const vx = hx + Math.cos(angle) * tessSize * 0.5;\n const vy = hy + Math.sin(angle) * tessSize * 0.5;\n if (s === 0) ctx.moveTo(vx, vy);\n else ctx.lineTo(vx, vy);\n }\n ctx.closePath();\n ctx.stroke();\n }\n }\n }\n ctx.restore();\n }\n ctx.globalCompositeOperation = \"source-over\";\n\n // ── 2. Composition mode ────────────────────────────────────────\n const compositionMode =\n COMPOSITION_MODES[Math.floor(rng() * COMPOSITION_MODES.length)];\n\n // ── 2b. Symmetry mode — ~25% of hashes trigger mirroring ──────\n type SymmetryMode = \"none\" | \"bilateral-x\" | \"bilateral-y\" | \"quad\";\n const symRoll = rng();\n const symmetryMode: SymmetryMode =\n symRoll < 0.10 ? \"bilateral-x\" :\n symRoll < 0.20 ? \"bilateral-y\" :\n symRoll < 0.25 ? \"quad\" : \"none\";\n\n // ── 3. Focal points + void zones ───────────────────────────────\n const THIRDS_POINTS = [\n { x: 1 / 3, y: 1 / 3 },\n { x: 2 / 3, y: 1 / 3 },\n { x: 1 / 3, y: 2 / 3 },\n { x: 2 / 3, y: 2 / 3 },\n ];\n const numFocal = 1 + Math.floor(rng() * 2);\n const focalPoints: Array<{ x: number; y: number; strength: number }> = [];\n for (let f = 0; f < numFocal; f++) {\n if (rng() < 0.7) {\n const tp = THIRDS_POINTS[Math.floor(rng() * THIRDS_POINTS.length)];\n focalPoints.push({\n x: width * (tp.x + (rng() - 0.5) * 0.08),\n y: height * (tp.y + (rng() - 0.5) * 0.08),\n strength: 0.3 + rng() * 0.4,\n });\n } else {\n focalPoints.push({\n x: width * (0.2 + rng() * 0.6),\n y: height * (0.2 + rng() * 0.6),\n strength: 0.3 + rng() * 0.4,\n });\n }\n }\n\n const numVoids = Math.floor(rng() * 2) + 1;\n const voidZones: Array<{ x: number; y: number; radius: number }> = [];\n for (let v = 0; v < numVoids; v++) {\n voidZones.push({\n x: width * (0.15 + rng() * 0.7),\n y: height * (0.15 + rng() * 0.7),\n radius: Math.min(width, height) * (0.06 + rng() * 0.1),\n });\n }\n\n function applyFocalBias(rx: number, ry: number): [number, number] {\n let nearest = focalPoints[0];\n let minDist = Infinity;\n for (const fp of focalPoints) {\n const d = Math.hypot(rx - fp.x, ry - fp.y);\n if (d < minDist) {\n minDist = d;\n nearest = fp;\n }\n }\n const pull = nearest.strength * rng() * 0.5;\n return [rx + (nearest.x - rx) * pull, ry + (nearest.y - ry) * pull];\n }\n\n // ── 3b. Void zone decoration — intentional negative space ────\n for (const zone of voidZones) {\n // Subtle halo ring around void zones\n ctx.globalAlpha = 0.04 + rng() * 0.04;\n ctx.strokeStyle = hexWithAlpha(colorHierarchy.accent, 0.2);\n ctx.lineWidth = 1.5 * scaleFactor;\n ctx.beginPath();\n ctx.arc(zone.x, zone.y, zone.radius, 0, Math.PI * 2);\n ctx.stroke();\n\n // ~50% chance: scatter tiny dots inside the void\n if (rng() < 0.5) {\n const dotCount = 3 + Math.floor(rng() * 6);\n ctx.globalAlpha = 0.06 + rng() * 0.04;\n ctx.fillStyle = hexWithAlpha(colorHierarchy.secondary, 0.15);\n for (let d = 0; d < dotCount; d++) {\n const angle = rng() * Math.PI * 2;\n const dist = rng() * zone.radius * 0.7;\n const dotR = (1 + rng() * 3) * scaleFactor;\n ctx.beginPath();\n ctx.arc(\n zone.x + Math.cos(angle) * dist,\n zone.y + Math.sin(angle) * dist,\n dotR, 0, Math.PI * 2,\n );\n ctx.fill();\n }\n }\n\n // ~30% chance: thin concentric ring inside\n if (rng() < 0.3) {\n ctx.globalAlpha = 0.03 + rng() * 0.03;\n ctx.strokeStyle = hexWithAlpha(colorHierarchy.dominant, 0.1);\n ctx.lineWidth = 0.5 * scaleFactor;\n const innerR = zone.radius * (0.4 + rng() * 0.3);\n ctx.beginPath();\n ctx.arc(zone.x, zone.y, innerR, 0, Math.PI * 2);\n ctx.stroke();\n }\n }\n ctx.globalAlpha = 1;\n\n // ── 4. Flow field — simplex noise for organic variation ─────────\n // Create a seeded simplex noise field (unique per hash)\n const noiseFieldRng = createRng(seedFromHash(gitHash, 333));\n const simplexNoise = createSimplexNoise(noiseFieldRng);\n const fbmNoise = createFBM(simplexNoise, 3, 2.0, 0.5);\n const fieldAngleBase = rng() * Math.PI * 2;\n const fieldFreq = 1.5 + rng() * 2.5; // noise sampling frequency\n\n function flowAngle(x: number, y: number): number {\n // Sample FBM noise at the position, scaled by frequency\n const nx = (x / width) * fieldFreq;\n const ny = (y / height) * fieldFreq;\n return fieldAngleBase + fbmNoise(nx, ny) * Math.PI;\n }\n\n // Noise-based size modulation — shapes in \"high noise\" areas get scaled\n function noiseSizeModulation(x: number, y: number): number {\n const n = simplexNoise((x / width) * 3, (y / height) * 3);\n // Map [-1,1] to [0.7, 1.3] — subtle terrain-like size variation\n return 0.7 + (n + 1) * 0.3;\n }\n\n // Track all placed shapes for density checks and connecting curves\n const shapePositions: Array<{ x: number; y: number; size: number; shape: string }> = [];\n\n // Hero avoidance radius — shapes near the hero orient toward it\n let heroCenter: { x: number; y: number; size: number } | null = null;\n\n // ── 4b. Hero shape — a dominant focal element ───────────────────\n if (archetype.heroShape && rng() < 0.6) {\n const heroFocal = focalPoints[0];\n // Use shape palette hero candidates\n const heroPool = [...shapePalette.primary, ...shapePalette.supporting]\n .filter((s) => SHAPE_PROFILES[s]?.heroCandidate && shapeNames.includes(s));\n const heroShape = heroPool.length > 0\n ? heroPool[Math.floor(rng() * heroPool.length)]\n : shapeNames[Math.floor(rng() * shapeNames.length)];\n\n const heroSize = adjustedMaxSize * (0.8 + rng() * 0.5);\n const heroRotation = rng() * 360;\n const heroFill = hexWithAlpha(\n enforceContrast(jitterColorHSL(colorHierarchy.dominant, rng, 6, 0.05), bgLum),\n 0.15 + rng() * 0.2,\n );\n const heroStroke = enforceContrast(jitterColorHSL(colorHierarchy.accent, rng, 6, 0.05), bgLum);\n\n // Get best style for this hero shape\n const heroProfile = SHAPE_PROFILES[heroShape];\n const heroStyle: RenderStyle = heroProfile\n ? (heroProfile.bestStyles[Math.floor(rng() * heroProfile.bestStyles.length)] as RenderStyle)\n : (rng() < 0.4 ? \"watercolor\" : \"fill-and-stroke\");\n\n ctx.globalAlpha = 0.5 + rng() * 0.2;\n enhanceShapeGeneration(ctx, heroShape, heroFocal.x, heroFocal.y, {\n fillColor: heroFill,\n strokeColor: heroStroke,\n strokeWidth: (1.5 + rng() * 2) * scaleFactor,\n size: heroSize,\n rotation: heroRotation,\n proportionType: \"GOLDEN_RATIO\",\n glowRadius: (12 + rng() * 20) * scaleFactor,\n glowColor: hexWithAlpha(heroStroke, 0.4),\n gradientFillEnd: jitterColorHSL(colorHierarchy.secondary, rng, 10, 0.1),\n renderStyle: heroStyle,\n rng,\n lightAngle,\n scaleFactor,\n });\n\n heroCenter = { x: heroFocal.x, y: heroFocal.y, size: heroSize };\n shapePositions.push({ x: heroFocal.x, y: heroFocal.y, size: heroSize, shape: heroShape });\n }\n\n\n // ── 5. Shape layers ────────────────────────────────────────────\n const densityCheckRadius = Math.min(width, height) * 0.08;\n const maxLocalDensity = Math.ceil(shapesPerLayer * 0.15);\n\n for (let layer = 0; layer < layers; layer++) {\n const layerRatio = layers > 1 ? layer / (layers - 1) : 0;\n const numShapes =\n shapesPerLayer +\n Math.floor(rng() * shapesPerLayer * 0.3);\n const layerOpacity = Math.max(0.15, baseOpacity - layer * opacityReduction);\n const layerSizeScale = 1 - layer * 0.15;\n\n // Per-layer blend mode\n const layerBlend = pickBlendMode(rng);\n ctx.globalCompositeOperation = layerBlend;\n\n // Per-layer render style bias — prefer archetype styles\n const layerRenderStyle: RenderStyle = rng() < 0.6\n ? archetype.preferredStyles[Math.floor(rng() * archetype.preferredStyles.length)]\n : pickRenderStyle(rng);\n\n // Atmospheric desaturation for later layers\n const atmosphericDesat = layerRatio * 0.3;\n\n // Depth-of-field simulation — later layers are \"further away\"\n // Reduce stroke widths and shift colors toward the background\n const dofFactor = 1 - layerRatio * 0.5; // 1.0 for front layer, 0.5 for back\n const dofStrokeScale = 0.4 + dofFactor * 0.6; // strokes thin out with depth\n const dofContrastReduction = layerRatio * 0.2; // colors fade toward bg\n\n // Color palette evolution — hue-rotate the hierarchy per layer\n const layerHierarchy = evolveHierarchy(colorHierarchy, layerRatio, paletteHueShift);\n\n // Focal depth: shapes near focal points get more detail\n const focalDetailBoost = (px: number, py: number): number => {\n let minFocalDist = Infinity;\n for (const fp of focalPoints) {\n const d = Math.hypot(px - fp.x, py - fp.y);\n if (d < minFocalDist) minFocalDist = d;\n }\n const maxDist = Math.hypot(width, height) * 0.5;\n return Math.max(0, 1 - minFocalDist / maxDist); // 1.0 at focal, 0.0 at edges\n };\n\n for (let i = 0; i < numShapes; i++) {\n // Position from composition mode, then focal bias\n const rawPos = getCompositionPosition(\n compositionMode,\n rng,\n width,\n height,\n i,\n numShapes,\n cx,\n cy,\n );\n const [x, y] = applyFocalBias(rawPos.x, rawPos.y);\n\n // Skip shapes in void zones, reduce in dense areas\n if (isInVoidZone(x, y, voidZones)) {\n if (rng() < 0.85) continue;\n }\n if (localDensity(x, y, shapePositions, densityCheckRadius) > maxLocalDensity) {\n if (rng() < 0.6) continue;\n }\n\n // Power distribution for size — archetype controls the curve\n const sizeT = Math.pow(rng(), archetype.sizePower);\n const size =\n (adjustedMinSize + sizeT * (adjustedMaxSize - adjustedMinSize)) *\n layerSizeScale * noiseSizeModulation(x, y);\n\n // Size fraction for affinity-aware shape selection\n const sizeFraction = size / adjustedMaxSize;\n\n // Palette-driven shape selection (replaces naive pickShape)\n const shape = pickShapeFromPalette(shapePalette, rng, sizeFraction);\n\n // Flow-field rotation in flow-field mode, random otherwise\n let rotation =\n compositionMode === \"flow-field\"\n ? (flowAngle(x, y) * 180) / Math.PI + (rng() - 0.5) * 30\n : rng() * 360;\n\n // Hero avoidance: shapes near the hero orient toward it\n if (heroCenter) {\n const distToHero = Math.hypot(x - heroCenter.x, y - heroCenter.y);\n const heroInfluence = heroCenter.size * 1.5;\n if (distToHero < heroInfluence && distToHero > 0) {\n const angleToHero = Math.atan2(heroCenter.y - y, heroCenter.x - x) * 180 / Math.PI;\n const blendFactor = 1 - (distToHero / heroInfluence);\n rotation = rotation + (angleToHero - rotation) * blendFactor * 0.4;\n }\n }\n\n // Positional color from hierarchy + jitter (using evolved layer palette)\n let fillBase = getPositionalColor(x, y, width, height, layerHierarchy, rng);\n const strokeBase = pickHierarchyColor(layerHierarchy, rng);\n\n // Desaturate colors on later layers for depth\n if (atmosphericDesat > 0) {\n fillBase = desaturate(fillBase, atmosphericDesat);\n }\n\n // Temperature contrast: shift foreground shapes opposite to background\n if (fgTempTarget) {\n fillBase = shiftTemperature(fillBase, fgTempTarget, 0.15 + layerRatio * 0.1);\n }\n\n const fillColor = enforceContrast(jitterColorHSL(fillBase, rng, 6, 0.05), bgLum);\n const strokeColor = enforceContrast(jitterColorHSL(strokeBase, rng, 5, 0.04), bgLum);\n\n // Semi-transparent fill\n const fillAlpha = 0.2 + rng() * 0.5;\n const transparentFill = hexWithAlpha(fillColor, fillAlpha);\n\n const strokeWidth = (0.5 + rng() * 2.0) * scaleFactor * dofStrokeScale;\n\n // Depth-of-field: reduce opacity slightly for distant layers\n const dofOpacityScale = 1 - dofContrastReduction;\n ctx.globalAlpha = layerOpacity * (0.5 + rng() * 0.5) * dofOpacityScale;\n\n // Glow on sacred shapes more often — scaled by archetype\n const isSacred = SACRED_SHAPES.includes(shape);\n const baseGlowChance = isSacred ? 0.45 : 0.2;\n const glowChance = baseGlowChance * archetype.glowMultiplier;\n const hasGlow = rng() < glowChance;\n const glowRadius = hasGlow ? (8 + rng() * 20) * scaleFactor : 0;\n\n // Gradient fill on ~30%\n const hasGradient = rng() < 0.3;\n const gradientEnd = hasGradient\n ? jitterColorHSL(pickHierarchyColor(colorHierarchy, rng), rng, 10, 0.1)\n : undefined;\n\n // Affinity-aware render style selection\n const shapeRenderStyle = pickStyleForShape(shape, layerRenderStyle, rng) as RenderStyle;\n\n // Organic edge jitter — applied via watercolor style on ~15% of shapes\n const useOrganicEdges = rng() < 0.15 && shapeRenderStyle === \"fill-and-stroke\";\n const finalRenderStyle = useOrganicEdges ? \"watercolor\" as RenderStyle : shapeRenderStyle;\n\n // Consistent light direction — subtle shadow offset\n const shadowDist = hasGlow ? 0 : (size * 0.02);\n const shadowOffX = shadowDist * Math.cos(lightAngle);\n const shadowOffY = shadowDist * Math.sin(lightAngle);\n\n // ── 5a. Tangent placement — nudge toward nearest shape edge ──\n let finalX = x;\n let finalY = y;\n if (shapePositions.length > 0 && rng() < 0.25) {\n // Find nearest placed shape\n let nearestDist = Infinity;\n let nearestPos: { x: number; y: number; size: number } | null = null;\n for (const sp of shapePositions) {\n const d = Math.hypot(x - sp.x, y - sp.y);\n if (d < nearestDist && d > 0) {\n nearestDist = d;\n nearestPos = sp;\n }\n }\n if (nearestPos) {\n // Target distance: edges kissing (sum of half-sizes)\n const targetDist = (size + nearestPos.size) * 0.5;\n if (nearestDist > targetDist * 0.5 && nearestDist < targetDist * 3) {\n const angle = Math.atan2(y - nearestPos.y, x - nearestPos.x);\n finalX = nearestPos.x + Math.cos(angle) * targetDist;\n finalY = nearestPos.y + Math.sin(angle) * targetDist;\n // Keep in bounds\n finalX = Math.max(0, Math.min(width, finalX));\n finalY = Math.max(0, Math.min(height, finalY));\n }\n }\n }\n\n // ── 5b. Shape mirroring — basic shapes get reflected copies ──\n const mirrorAxis = pickMirrorAxis(rng);\n const isBasicShape = [\"circle\", \"triangle\", \"square\", \"hexagon\", \"star\",\n \"diamond\", \"crescent\", \"penroseTile\", \"reuleauxTriangle\"].includes(shape);\n const shouldMirror = mirrorAxis !== null && isBasicShape && size > adjustedMaxSize * 0.2;\n\n const shapeConfig = {\n fillColor: transparentFill,\n strokeColor,\n strokeWidth,\n size,\n rotation,\n proportionType: \"GOLDEN_RATIO\" as const,\n glowRadius: glowRadius || (shadowDist > 0 ? shadowDist * 2 : 0),\n glowColor: hasGlow\n ? hexWithAlpha(fillColor, 0.6)\n : (shadowDist > 0 ? \"rgba(0,0,0,0.08)\" : undefined),\n gradientFillEnd: gradientEnd,\n renderStyle: finalRenderStyle,\n rng,\n lightAngle,\n scaleFactor,\n };\n\n if (shouldMirror) {\n drawMirroredShape(ctx, shape, finalX, finalY, {\n ...shapeConfig,\n mirrorAxis: mirrorAxis!,\n mirrorGap: size * (0.1 + rng() * 0.3),\n });\n } else {\n enhanceShapeGeneration(ctx, shape, finalX, finalY, shapeConfig);\n }\n\n // ── Glazing — luminous multi-pass transparency on ~20% of shapes ──\n if (rng() < 0.2 && size > adjustedMinSize * 2) {\n const glazePasses = 2 + Math.floor(rng() * 2);\n for (let g = 0; g < glazePasses; g++) {\n const glazeScale = 1 - (g + 1) * 0.12; // progressively smaller\n const glazeAlpha = 0.08 + g * 0.04; // progressively more opaque toward center\n ctx.globalAlpha = glazeAlpha;\n enhanceShapeGeneration(ctx, shape, finalX, finalY, {\n fillColor: hexWithAlpha(fillColor, 0.15 + g * 0.1),\n strokeColor: \"rgba(0,0,0,0)\",\n strokeWidth: 0,\n size: size * glazeScale,\n rotation,\n proportionType: \"GOLDEN_RATIO\",\n renderStyle: \"fill-only\",\n rng,\n });\n }\n }\n\n shapePositions.push({ x: finalX, y: finalY, size, shape });\n\n // ── 5c. Size echo — large shapes spawn trailing smaller copies ──\n if (size > adjustedMaxSize * 0.5 && rng() < 0.2) {\n const echoCount = 2 + Math.floor(rng() * 2);\n const echoAngle = rng() * Math.PI * 2;\n for (let e = 0; e < echoCount; e++) {\n const echoScale = 0.3 - e * 0.08;\n const echoDist = size * (0.6 + e * 0.4);\n const echoX = finalX + Math.cos(echoAngle) * echoDist;\n const echoY = finalY + Math.sin(echoAngle) * echoDist;\n const echoSize = size * Math.max(0.1, echoScale);\n\n if (echoX < 0 || echoX > width || echoY < 0 || echoY > height) continue;\n\n ctx.globalAlpha = layerOpacity * (0.4 - e * 0.1);\n enhanceShapeGeneration(ctx, shape, echoX, echoY, {\n fillColor: hexWithAlpha(fillColor, fillAlpha * 0.6),\n strokeColor: hexWithAlpha(strokeColor, 0.4),\n strokeWidth: strokeWidth * 0.6,\n size: echoSize,\n rotation: rotation + (e + 1) * 15,\n proportionType: \"GOLDEN_RATIO\",\n renderStyle: finalRenderStyle,\n rng,\n });\n shapePositions.push({ x: echoX, y: echoY, size: echoSize, shape });\n }\n }\n\n // ── 5d. Recursive nesting ──────────────────────────────────\n // Focal depth: shapes near focal points get more detail\n const focalProximity = focalDetailBoost(finalX, finalY);\n const nestingChance = 0.15 + focalProximity * 0.15; // 15-30% near focal\n if (size > adjustedMaxSize * 0.4 && rng() < nestingChance) {\n const innerCount = 1 + Math.floor(rng() * 3);\n for (let n = 0; n < innerCount; n++) {\n // Pick inner shape from palette affinities\n const innerSizeFraction = (size * 0.25) / adjustedMaxSize;\n const innerShape = pickShapeFromPalette(shapePalette, rng, innerSizeFraction);\n const innerSize = size * (0.15 + rng() * 0.25);\n const innerOffX = (rng() - 0.5) * size * 0.4;\n const innerOffY = (rng() - 0.5) * size * 0.4;\n const innerRot = rng() * 360;\n const innerFill = hexWithAlpha(\n jitterColorHSL(pickHierarchyColor(colorHierarchy, rng), rng, 10, 0.1),\n 0.3 + rng() * 0.4,\n );\n\n ctx.globalAlpha = layerOpacity * 0.7;\n enhanceShapeGeneration(\n ctx,\n innerShape,\n finalX + innerOffX,\n finalY + innerOffY,\n {\n fillColor: innerFill,\n strokeColor: hexWithAlpha(strokeColor, 0.5),\n strokeWidth: strokeWidth * 0.6,\n size: innerSize,\n rotation: innerRot,\n proportionType: \"GOLDEN_RATIO\",\n renderStyle: pickStyleForShape(innerShape, layerRenderStyle, rng) as RenderStyle,\n rng,\n },\n );\n }\n }\n\n // ── 5e. Shape constellations — pre-composed groups ─────────\n const constellationChance = 0.12 + focalProximity * 0.1; // 12-22% near focal\n if (size > adjustedMaxSize * 0.35 && rng() < constellationChance) {\n const constellation = CONSTELLATIONS[Math.floor(rng() * CONSTELLATIONS.length)];\n const members = constellation.build(rng, size);\n const groupRotation = rng() * Math.PI * 2;\n const cosR = Math.cos(groupRotation);\n const sinR = Math.sin(groupRotation);\n\n for (const member of members) {\n // Rotate the group offset by the group rotation\n const mx = finalX + member.dx * cosR - member.dy * sinR;\n const my = finalY + member.dx * sinR + member.dy * cosR;\n\n if (mx < 0 || mx > width || my < 0 || my > height) continue;\n\n const memberFill = hexWithAlpha(\n jitterColorHSL(pickHierarchyColor(colorHierarchy, rng), rng, 8, 0.06),\n fillAlpha * 0.8,\n );\n const memberStroke = enforceContrast(\n jitterColorHSL(strokeBase, rng, 5, 0.04), bgLum,\n );\n\n ctx.globalAlpha = layerOpacity * 0.6;\n // Use the member's shape if available, otherwise fall back to palette\n const memberShape = shapeNames.includes(member.shape)\n ? member.shape\n : pickShapeFromPalette(shapePalette, rng, member.size / adjustedMaxSize);\n\n enhanceShapeGeneration(ctx, memberShape, mx, my, {\n fillColor: memberFill,\n strokeColor: memberStroke,\n strokeWidth: strokeWidth * 0.7,\n size: member.size,\n rotation: member.rotation + (groupRotation * 180) / Math.PI,\n proportionType: \"GOLDEN_RATIO\",\n renderStyle: pickStyleForShape(memberShape, layerRenderStyle, rng) as RenderStyle,\n rng,\n });\n shapePositions.push({ x: mx, y: my, size: member.size, shape: memberShape });\n }\n }\n }\n }\n\n // Reset blend mode for post-processing passes\n ctx.globalCompositeOperation = \"source-over\";\n\n // ── 5f. Layered masking / cutout portals ───────────────────────\n // ~18% of images get 1-3 portal windows that paint over foreground\n // with a tinted background wash, creating a \"peek through\" effect.\n if (rng() < 0.18 && shapePositions.length > 3) {\n const portalCount = 1 + Math.floor(rng() * 2);\n for (let p = 0; p < portalCount; p++) {\n // Pick a position biased toward placed shapes\n const sourceShape = shapePositions[Math.floor(rng() * shapePositions.length)];\n const portalX = sourceShape.x + (rng() - 0.5) * sourceShape.size * 0.5;\n const portalY = sourceShape.y + (rng() - 0.5) * sourceShape.size * 0.5;\n const portalSize = adjustedMaxSize * (0.15 + rng() * 0.25);\n\n // Pick a portal shape from the palette\n const portalShape = pickShapeFromPalette(shapePalette, rng, portalSize / adjustedMaxSize);\n const portalRotation = rng() * 360;\n const portalAlpha = 0.6 + rng() * 0.35;\n\n ctx.save();\n ctx.translate(portalX, portalY);\n ctx.rotate((portalRotation * Math.PI) / 180);\n\n // Step 1: Clip to the portal shape and fill with background wash\n ctx.beginPath();\n shapes[portalShape]?.(ctx, portalSize);\n ctx.clip();\n\n // Fill the clipped region with a radial gradient from background colors\n const portalColor = jitterColorHSL(bgStart, rng, 15, 0.1);\n const portalGrad = ctx.createRadialGradient(0, 0, 0, 0, 0, portalSize);\n portalGrad.addColorStop(0, portalColor);\n portalGrad.addColorStop(1, bgEnd);\n ctx.globalAlpha = portalAlpha;\n ctx.fillStyle = portalGrad;\n ctx.fillRect(-portalSize, -portalSize, portalSize * 2, portalSize * 2);\n\n // Optional: subtle inner texture — a few tiny dots inside the portal\n if (rng() < 0.5) {\n const dotCount = 3 + Math.floor(rng() * 5);\n ctx.globalAlpha = portalAlpha * 0.3;\n ctx.fillStyle = hexWithAlpha(pickHierarchyColor(colorHierarchy, rng), 0.2);\n for (let d = 0; d < dotCount; d++) {\n const dx = (rng() - 0.5) * portalSize * 1.4;\n const dy = (rng() - 0.5) * portalSize * 1.4;\n const dr = (1 + rng() * 3) * scaleFactor;\n ctx.beginPath();\n ctx.arc(dx, dy, dr, 0, Math.PI * 2);\n ctx.fill();\n }\n }\n\n ctx.restore();\n\n // Step 2: Draw a border ring around the portal (outside the clip)\n ctx.save();\n ctx.translate(portalX, portalY);\n ctx.rotate((portalRotation * Math.PI) / 180);\n ctx.globalAlpha = 0.15 + rng() * 0.2;\n ctx.strokeStyle = hexWithAlpha(pickHierarchyColor(colorHierarchy, rng), 0.5);\n ctx.lineWidth = (1.5 + rng() * 2.5) * scaleFactor;\n ctx.beginPath();\n shapes[portalShape]?.(ctx, portalSize * 1.06);\n ctx.stroke();\n ctx.restore();\n }\n }\n\n\n // ── 6. Flow-line pass — variable color, branching, pressure ────\n const baseFlowLines = 6 + Math.floor(rng() * 10);\n const numFlowLines = Math.round(baseFlowLines * archetype.flowLineMultiplier);\n\n for (let i = 0; i < numFlowLines; i++) {\n let fx = rng() * width;\n let fy = rng() * height;\n const steps = 30 + Math.floor(rng() * 40);\n const stepLen = (3 + rng() * 5) * scaleFactor;\n const startWidth = (1 + rng() * 3) * scaleFactor;\n\n // Variable color: interpolate between two hierarchy colors along the stroke\n const lineColorStart = enforceContrast(pickHierarchyColor(colorHierarchy, rng), bgLum);\n const lineColorEnd = enforceContrast(pickHierarchyColor(colorHierarchy, rng), bgLum);\n const lineAlpha = 0.06 + rng() * 0.1;\n\n // Pressure simulation: sinusoidal width variation\n const pressureFreq = 2 + rng() * 4;\n const pressurePhase = rng() * Math.PI * 2;\n\n let prevX = fx;\n let prevY = fy;\n for (let s = 0; s < steps; s++) {\n const angle = flowAngle(fx, fy) + (rng() - 0.5) * 0.3;\n fx += Math.cos(angle) * stepLen;\n fy += Math.sin(angle) * stepLen;\n\n if (fx < 0 || fx > width || fy < 0 || fy > height) break;\n\n const t = s / steps;\n // Taper + pressure\n const taper = 1 - t * 0.8;\n const pressure = 0.6 + 0.4 * Math.sin(t * pressureFreq * Math.PI + pressurePhase);\n\n ctx.globalAlpha = lineAlpha * taper;\n // Interpolate color along stroke\n const lineColor = t < 0.5\n ? hexWithAlpha(lineColorStart, 0.4 + t * 0.2)\n : hexWithAlpha(lineColorEnd, 0.4 + (1 - t) * 0.2);\n ctx.strokeStyle = lineColor;\n ctx.lineWidth = startWidth * taper * pressure;\n ctx.lineCap = \"round\";\n\n ctx.beginPath();\n ctx.moveTo(prevX, prevY);\n ctx.lineTo(fx, fy);\n ctx.stroke();\n\n // Branching: ~12% chance per step to spawn a thinner child stroke\n if (rng() < 0.12 && s > 5 && s < steps - 10) {\n const branchAngle = angle + (rng() < 0.5 ? 1 : -1) * (0.3 + rng() * 0.5);\n let bx = fx;\n let by = fy;\n let bPrevX = fx;\n let bPrevY = fy;\n const branchSteps = 5 + Math.floor(rng() * 10);\n const branchWidth = startWidth * taper * 0.4;\n for (let bs = 0; bs < branchSteps; bs++) {\n const bAngle = branchAngle + (rng() - 0.5) * 0.2;\n bx += Math.cos(bAngle) * stepLen * 0.8;\n by += Math.sin(bAngle) * stepLen * 0.8;\n if (bx < 0 || bx > width || by < 0 || by > height) break;\n const bTaper = 1 - (bs / branchSteps) * 0.9;\n ctx.globalAlpha = lineAlpha * taper * bTaper * 0.6;\n ctx.lineWidth = branchWidth * bTaper;\n ctx.beginPath();\n ctx.moveTo(bPrevX, bPrevY);\n ctx.lineTo(bx, by);\n ctx.stroke();\n bPrevX = bx;\n bPrevY = by;\n }\n }\n\n prevX = fx;\n prevY = fy;\n }\n }\n\n // ── 6b. Motion/energy lines — short directional bursts ─────────\n const energyArchetypes = [\"dense-chaotic\", \"cosmic\", \"neon-glow\", \"bold-graphic\"];\n const hasEnergyLines = energyArchetypes.some(a => archetype.name.includes(a)) || rng() < 0.25;\n if (hasEnergyLines && shapePositions.length > 0) {\n const energyCount = 5 + Math.floor(rng() * 10);\n ctx.lineCap = \"round\";\n for (let e = 0; e < energyCount; e++) {\n // Pick a random shape to radiate from\n const source = shapePositions[Math.floor(rng() * shapePositions.length)];\n const burstCount = 2 + Math.floor(rng() * 4);\n const baseAngle = flowAngle(source.x, source.y);\n\n for (let b = 0; b < burstCount; b++) {\n const angle = baseAngle + (rng() - 0.5) * 1.2;\n const lineLen = (source.size * 0.3 + rng() * source.size * 0.5) * scaleFactor * 0.3;\n const startDist = source.size * 0.5;\n const sx = source.x + Math.cos(angle) * startDist;\n const sy = source.y + Math.sin(angle) * startDist;\n const ex = sx + Math.cos(angle) * lineLen;\n const ey = sy + Math.sin(angle) * lineLen;\n\n ctx.globalAlpha = 0.04 + rng() * 0.06;\n ctx.strokeStyle = hexWithAlpha(\n enforceContrast(pickHierarchyColor(colorHierarchy, rng), bgLum), 0.3,\n );\n ctx.lineWidth = (0.5 + rng() * 1.5) * scaleFactor;\n ctx.beginPath();\n ctx.moveTo(sx, sy);\n ctx.lineTo(ex, ey);\n ctx.stroke();\n }\n }\n }\n\n // ── 6c. Apply symmetry mirroring ─────────────────────────────────\n if (symmetryMode !== \"none\") {\n const canvas = ctx.canvas;\n ctx.save();\n if (symmetryMode === \"bilateral-x\" || symmetryMode === \"quad\") {\n ctx.save();\n ctx.translate(width, 0);\n ctx.scale(-1, 1);\n ctx.drawImage(canvas, 0, 0, Math.ceil(cx), height, 0, 0, Math.ceil(cx), height);\n ctx.restore();\n }\n if (symmetryMode === \"bilateral-y\" || symmetryMode === \"quad\") {\n ctx.save();\n ctx.translate(0, height);\n ctx.scale(1, -1);\n ctx.drawImage(canvas, 0, 0, width, Math.ceil(cy), 0, 0, width, Math.ceil(cy));\n ctx.restore();\n }\n ctx.restore();\n }\n\n\n // ── 7. Noise texture overlay ───────────────────────────────────\n const noiseRng = createRng(seedFromHash(gitHash, 777));\n const noiseDensity = Math.floor((width * height) / 800);\n for (let i = 0; i < noiseDensity; i++) {\n const nx = noiseRng() * width;\n const ny = noiseRng() * height;\n const brightness = noiseRng() > 0.5 ? 255 : 0;\n const alpha = 0.01 + noiseRng() * 0.03;\n ctx.globalAlpha = alpha;\n ctx.fillStyle = `rgba(${brightness},${brightness},${brightness},1)`;\n ctx.fillRect(nx, ny, 1 * scaleFactor, 1 * scaleFactor);\n }\n\n // ── 8. Vignette — darken edges to draw the eye inward ───────────\n ctx.globalAlpha = 1;\n const vignetteStrength = 0.25 + rng() * 0.2;\n const vigGrad = ctx.createRadialGradient(cx, cy, Math.min(width, height) * 0.3, cx, cy, bgRadius);\n vigGrad.addColorStop(0, \"rgba(0,0,0,0)\");\n vigGrad.addColorStop(0.6, \"rgba(0,0,0,0)\");\n vigGrad.addColorStop(1, `rgba(0,0,0,${vignetteStrength.toFixed(3)})`);\n ctx.fillStyle = vigGrad;\n ctx.fillRect(0, 0, width, height);\n\n // ── 9. Organic connecting curves ───────────────────────────────\n if (shapePositions.length > 1) {\n const numCurves = Math.floor((8 * (width * height)) / (1024 * 1024));\n ctx.lineWidth = 0.8 * scaleFactor;\n\n for (let i = 0; i < numCurves; i++) {\n const idxA = Math.floor(rng() * shapePositions.length);\n const offset =\n 1 + Math.floor(rng() * Math.min(5, shapePositions.length - 1));\n const idxB = (idxA + offset) % shapePositions.length;\n\n const a = shapePositions[idxA];\n const b = shapePositions[idxB];\n\n const mx = (a.x + b.x) / 2;\n const my = (a.y + b.y) / 2;\n const dx = b.x - a.x;\n const dy = b.y - a.y;\n const dist = Math.hypot(dx, dy);\n const bulge = (rng() - 0.5) * dist * 0.4;\n\n const cpx = mx + (-dy / (dist || 1)) * bulge;\n const cpy = my + (dx / (dist || 1)) * bulge;\n\n ctx.globalAlpha = 0.06 + rng() * 0.1;\n ctx.strokeStyle = hexWithAlpha(\n enforceContrast(pickHierarchyColor(colorHierarchy, rng), bgLum),\n 0.3,\n );\n\n ctx.beginPath();\n ctx.moveTo(a.x, a.y);\n ctx.quadraticCurveTo(cpx, cpy, b.x, b.y);\n ctx.stroke();\n }\n }\n\n // ── 10. Post-processing ────────────────────────────────────────\n\n // 10a. Color grading — unified tone across the whole image\n // Apply as a semi-transparent overlay in the grade hue\n ctx.globalAlpha = colorGrade.intensity * 0.25;\n ctx.globalCompositeOperation = \"soft-light\";\n const gradeHsl = `hsl(${Math.round(colorGrade.hue)}, 40%, 50%)`;\n ctx.fillStyle = gradeHsl;\n ctx.fillRect(0, 0, width, height);\n ctx.globalCompositeOperation = \"source-over\";\n\n // 10b. Chromatic aberration — subtle RGB channel offset at edges\n // Only apply for neon/cosmic/ethereal archetypes where it fits\n const chromaArchetypes = [\"neon-glow\", \"cosmic\", \"ethereal\"];\n if (chromaArchetypes.includes(archetype.name)) {\n const chromaOffset = Math.ceil(2 * scaleFactor);\n const canvas = ctx.canvas;\n // Shift red channel slightly\n ctx.globalAlpha = 0.03;\n ctx.globalCompositeOperation = \"screen\";\n ctx.drawImage(canvas, chromaOffset, 0, width, height, 0, 0, width, height);\n // Shift blue channel opposite\n ctx.drawImage(canvas, -chromaOffset, 0, width, height, 0, 0, width, height);\n ctx.globalCompositeOperation = \"source-over\";\n }\n\n // 10c. Bloom — soft glow on bright areas for neon/cosmic archetypes\n const bloomArchetypes = [\"neon-glow\", \"cosmic\"];\n if (bloomArchetypes.includes(archetype.name)) {\n const canvas = ctx.canvas;\n ctx.globalAlpha = 0.08;\n ctx.globalCompositeOperation = \"screen\";\n // Draw the image slightly scaled up and blurred via shadow\n ctx.save();\n ctx.shadowBlur = 30 * scaleFactor;\n ctx.shadowColor = \"rgba(255,255,255,0.3)\";\n ctx.drawImage(canvas, 0, 0, width, height);\n ctx.restore();\n ctx.globalCompositeOperation = \"source-over\";\n }\n\n // 10d. Gradient map — map luminance through a two-color gradient\n // Uses dominant→accent as the dark→light ramp for a cohesive tonal look\n if (rng() < 0.35) {\n const gmDark = colorHierarchy.dominant;\n const gmLight = colorHierarchy.accent;\n ctx.globalAlpha = 0.06 + rng() * 0.06; // very subtle: 6-12%\n ctx.globalCompositeOperation = \"color\";\n // Paint a linear gradient from dark color (top) to light color (bottom)\n const gmGrad = ctx.createLinearGradient(0, 0, 0, height);\n gmGrad.addColorStop(0, gmDark);\n gmGrad.addColorStop(1, gmLight);\n ctx.fillStyle = gmGrad;\n ctx.fillRect(0, 0, width, height);\n ctx.globalCompositeOperation = \"source-over\";\n }\n\n // ── 10e. Generative borders — archetype-driven decorative frames ──\n {\n ctx.save();\n ctx.globalAlpha = 1;\n ctx.globalCompositeOperation = \"source-over\";\n const borderRng = createRng(seedFromHash(gitHash, 314));\n const borderPad = Math.min(width, height) * 0.025;\n const borderColor = hexWithAlpha(colorHierarchy.accent, 0.2);\n const borderColorSolid = colorHierarchy.accent;\n const archName = archetype.name;\n\n if (archName.includes(\"geometric\") || archName.includes(\"op-art\") || archName.includes(\"shattered\")) {\n // Clean ruled lines with corner ornaments\n ctx.strokeStyle = borderColor;\n ctx.lineWidth = Math.max(1, 1.5 * scaleFactor);\n ctx.globalAlpha = 0.18 + borderRng() * 0.1;\n\n // Outer rule\n ctx.strokeRect(borderPad, borderPad, width - borderPad * 2, height - borderPad * 2);\n // Inner rule (thinner, offset)\n const innerPad = borderPad * 1.8;\n ctx.lineWidth = Math.max(0.5, 0.8 * scaleFactor);\n ctx.globalAlpha *= 0.7;\n ctx.strokeRect(innerPad, innerPad, width - innerPad * 2, height - innerPad * 2);\n\n // Corner ornaments — small squares at each corner\n const ornSize = borderPad * 0.6;\n ctx.fillStyle = hexWithAlpha(borderColorSolid, 0.12);\n const corners = [\n [borderPad, borderPad],\n [width - borderPad - ornSize, borderPad],\n [borderPad, height - borderPad - ornSize],\n [width - borderPad - ornSize, height - borderPad - ornSize],\n ];\n for (const [cx2, cy2] of corners) {\n ctx.fillRect(cx2, cy2, ornSize, ornSize);\n // Diagonal cross inside ornament\n ctx.beginPath();\n ctx.moveTo(cx2, cy2);\n ctx.lineTo(cx2 + ornSize, cy2 + ornSize);\n ctx.moveTo(cx2 + ornSize, cy2);\n ctx.lineTo(cx2, cy2 + ornSize);\n ctx.stroke();\n }\n } else if (archName.includes(\"botanical\") || archName.includes(\"organic\") || archName.includes(\"watercolor\")) {\n // Vine tendrils — organic curving lines along edges\n ctx.strokeStyle = hexWithAlpha(colorHierarchy.secondary, 0.15);\n ctx.lineWidth = Math.max(0.8, 1.2 * scaleFactor);\n ctx.globalAlpha = 0.12 + borderRng() * 0.08;\n ctx.lineCap = \"round\";\n\n const tendrilCount = 8 + Math.floor(borderRng() * 8);\n for (let t = 0; t < tendrilCount; t++) {\n // Start from a random edge point\n const edge = Math.floor(borderRng() * 4);\n let tx: number, ty: number;\n if (edge === 0) { tx = borderRng() * width; ty = borderPad; }\n else if (edge === 1) { tx = borderRng() * width; ty = height - borderPad; }\n else if (edge === 2) { tx = borderPad; ty = borderRng() * height; }\n else { tx = width - borderPad; ty = borderRng() * height; }\n\n ctx.beginPath();\n ctx.moveTo(tx, ty);\n const segs = 3 + Math.floor(borderRng() * 4);\n for (let s = 0; s < segs; s++) {\n const inward = borderPad * (1 + borderRng() * 2);\n // Curl inward from edge\n const cpx2 = tx + (borderRng() - 0.5) * borderPad * 4;\n const cpy2 = ty + (edge < 2 ? (edge === 0 ? inward : -inward) : 0);\n const cpx3 = tx + (edge >= 2 ? (edge === 2 ? inward : -inward) : (borderRng() - 0.5) * borderPad * 3);\n const cpy3 = ty + (borderRng() - 0.5) * borderPad * 3;\n tx = cpx3;\n ty = cpy3;\n ctx.quadraticCurveTo(cpx2, cpy2, tx, ty);\n }\n ctx.stroke();\n\n // Small leaf/dot at tendril end\n if (borderRng() < 0.6) {\n ctx.beginPath();\n ctx.arc(tx, ty, borderPad * (0.15 + borderRng() * 0.2), 0, Math.PI * 2);\n ctx.fillStyle = hexWithAlpha(colorHierarchy.secondary, 0.08);\n ctx.fill();\n }\n }\n } else if (archName.includes(\"celestial\") || archName.includes(\"cosmic\") || archName.includes(\"neon\")) {\n // Star-studded arcs along edges\n ctx.globalAlpha = 0.1 + borderRng() * 0.08;\n ctx.fillStyle = hexWithAlpha(colorHierarchy.accent, 0.2);\n ctx.strokeStyle = hexWithAlpha(colorHierarchy.accent, 0.12);\n ctx.lineWidth = Math.max(0.5, 0.7 * scaleFactor);\n\n // Subtle arc along top and bottom\n ctx.beginPath();\n ctx.arc(cx, -height * 0.3, height * 0.6, 0.3, Math.PI - 0.3);\n ctx.stroke();\n ctx.beginPath();\n ctx.arc(cx, height * 1.3, height * 0.6, Math.PI + 0.3, -0.3);\n ctx.stroke();\n\n // Scatter small stars along the border region\n const starCount = 15 + Math.floor(borderRng() * 15);\n for (let s = 0; s < starCount; s++) {\n const edge = Math.floor(borderRng() * 4);\n let sx: number, sy: number;\n if (edge === 0) { sx = borderRng() * width; sy = borderPad * (0.5 + borderRng()); }\n else if (edge === 1) { sx = borderRng() * width; sy = height - borderPad * (0.5 + borderRng()); }\n else if (edge === 2) { sx = borderPad * (0.5 + borderRng()); sy = borderRng() * height; }\n else { sx = width - borderPad * (0.5 + borderRng()); sy = borderRng() * height; }\n\n const starR = (1 + borderRng() * 2.5) * scaleFactor;\n // 4-point star\n ctx.beginPath();\n for (let p = 0; p < 8; p++) {\n const a = (p / 8) * Math.PI * 2;\n const r = p % 2 === 0 ? starR : starR * 0.4;\n const px2 = sx + Math.cos(a) * r;\n const py2 = sy + Math.sin(a) * r;\n if (p === 0) ctx.moveTo(px2, py2);\n else ctx.lineTo(px2, py2);\n }\n ctx.closePath();\n ctx.fill();\n }\n } else if (archName.includes(\"minimal\") || archName.includes(\"monochrome\") || archName.includes(\"stipple\")) {\n // Thin single rule — understated elegance\n ctx.strokeStyle = hexWithAlpha(colorHierarchy.dominant, 0.1);\n ctx.lineWidth = Math.max(0.5, 0.6 * scaleFactor);\n ctx.globalAlpha = 0.1 + borderRng() * 0.06;\n ctx.strokeRect(borderPad * 1.5, borderPad * 1.5, width - borderPad * 3, height - borderPad * 3);\n }\n // Other archetypes: no border (intentional — not every image needs one)\n\n ctx.restore();\n }\n\n // ── 11. Signature mark — unique geometric chop from hash prefix ──\n {\n const sigRng = createRng(seedFromHash(gitHash, 42));\n const sigSize = Math.min(width, height) * 0.025;\n // Bottom-right corner with padding\n const sigX = width - sigSize * 2.5;\n const sigY = height - sigSize * 2.5;\n const sigSegments = 4 + Math.floor(sigRng() * 4); // 4-7 segments\n const sigColor = hexWithAlpha(colorHierarchy.accent, 0.15);\n\n ctx.save();\n ctx.globalAlpha = 0.12 + sigRng() * 0.08;\n ctx.translate(sigX, sigY);\n ctx.strokeStyle = sigColor;\n ctx.fillStyle = hexWithAlpha(colorHierarchy.dominant, 0.06);\n ctx.lineWidth = Math.max(0.5, 0.8 * scaleFactor);\n\n // Outer ring\n ctx.beginPath();\n ctx.arc(0, 0, sigSize, 0, Math.PI * 2);\n ctx.stroke();\n ctx.fill();\n\n // Inner geometric pattern — unique per hash\n ctx.beginPath();\n for (let s = 0; s < sigSegments; s++) {\n const angle1 = sigRng() * Math.PI * 2;\n const angle2 = sigRng() * Math.PI * 2;\n const r1 = sigSize * (0.2 + sigRng() * 0.6);\n const r2 = sigSize * (0.2 + sigRng() * 0.6);\n ctx.moveTo(Math.cos(angle1) * r1, Math.sin(angle1) * r1);\n ctx.lineTo(Math.cos(angle2) * r2, Math.sin(angle2) * r2);\n }\n ctx.stroke();\n\n // Center dot\n ctx.beginPath();\n ctx.arc(0, 0, sigSize * 0.12, 0, Math.PI * 2);\n ctx.fillStyle = sigColor;\n ctx.fill();\n\n ctx.restore();\n }\n\n ctx.globalAlpha = 1;\n\n}\n","import ColorScheme from \"color-scheme\";\nimport \"../../../global.d\";\n\nimport { gitHashToSeed, createRng, seedFromHash } from \"../utils\";\n\n// ── Color variation modes ───────────────────────────────────────────\n// The hash deterministically selects a variation, producing dramatically\n// different palettes from the same hue.\n\nconst COLOR_VARIATIONS = [\n \"soft\",\n \"hard\",\n \"pastel\",\n \"light\",\n \"pale\",\n \"default\",\n] as const;\ntype ColorVariation = (typeof COLOR_VARIATIONS)[number];\n\n/**\n * Pick a color variation mode deterministically from a seed.\n */\nfunction pickVariation(seed: number): ColorVariation {\n return COLOR_VARIATIONS[Math.abs(seed) % COLOR_VARIATIONS.length];\n}\n\n/**\n * Scheme type also varies — some hashes get near-monochromatic palettes,\n * others get high-contrast complementary schemes.\n */\nconst SCHEME_TYPES = [\n \"analogic\",\n \"mono\",\n \"contrast\",\n \"triade\",\n \"tetrade\",\n] as const;\ntype SchemeType = (typeof SCHEME_TYPES)[number];\n\nfunction pickSchemeType(seed: number): SchemeType {\n return SCHEME_TYPES[Math.abs(seed >> 4) % SCHEME_TYPES.length];\n}\n\n\n// ── Temperature contrast ─────────────────────────────────────────\n// Warm hues: 0-60 (red-yellow) and 300-360 (magenta-red)\n// Cool hues: 150-270 (cyan-blue-purple)\n// Neutral: everything else\n\ntype TemperatureMode = \"warm-bg\" | \"cool-bg\" | \"neutral\";\n\nfunction classifyHue(hue: number): \"warm\" | \"cool\" | \"neutral\" {\n if ((hue >= 0 && hue <= 60) || hue >= 300) return \"warm\";\n if (hue >= 150 && hue <= 270) return \"cool\";\n return \"neutral\";\n}\n\n/**\n * Shift a hue toward a target temperature zone.\n * Returns a new hue biased warm or cool.\n */\nfunction shiftHueToward(hue: number, target: \"warm\" | \"cool\", amount: number): number {\n if (target === \"warm\") {\n // Pull toward 30 (orange) — the warmest point\n const warmTarget = 30;\n const diff = ((warmTarget - hue + 540) % 360) - 180;\n return (hue + diff * amount + 360) % 360;\n } else {\n // Pull toward 210 (blue) — the coolest point\n const coolTarget = 210;\n const diff = ((coolTarget - hue + 540) % 360) - 180;\n return (hue + diff * amount + 360) % 360;\n }\n}\n\n// Enhanced color scheme generation for sacred geometry\nexport class SacredColorScheme {\n private seed: number;\n private rng: () => number;\n private variation: ColorVariation;\n private schemeType: SchemeType;\n private temperatureMode: TemperatureMode;\n public baseScheme: string[];\n private complementaryScheme: string[];\n private triadicScheme: string[];\n\n constructor(gitHash: string) {\n this.seed = gitHashToSeed(gitHash);\n this.rng = createRng(seedFromHash(gitHash, 42));\n // Hash-driven variation and scheme type for palette diversity\n this.variation = pickVariation(this.seed);\n this.schemeType = pickSchemeType(this.seed);\n // ~40% warm-bg, ~40% cool-bg, ~20% neutral (no temperature bias)\n const tempRoll = this.rng();\n this.temperatureMode = tempRoll < 0.4 ? \"warm-bg\" : tempRoll < 0.8 ? \"cool-bg\" : \"neutral\";\n this.baseScheme = this.generateBaseScheme();\n this.complementaryScheme = this.generateComplementaryScheme();\n this.triadicScheme = this.generateTriadicScheme();\n }\n\n private generateBaseScheme(): string[] {\n const scheme = new ColorScheme();\n return scheme\n .from_hue(this.seed % 360)\n .scheme(this.schemeType)\n .variation(this.variation)\n .colors()\n .map((hex: string) => `#${hex}`);\n }\n\n private generateComplementaryScheme(): string[] {\n const complementaryHue = (this.seed + 180) % 360;\n // Complementary uses a contrasting variation for tension\n const compVariation =\n this.variation === \"soft\" ? \"hard\" : this.variation === \"pale\" ? \"light\" : this.variation;\n const scheme = new ColorScheme();\n return scheme\n .from_hue(complementaryHue)\n .scheme(\"mono\")\n .variation(compVariation)\n .colors()\n .map((hex: string) => `#${hex}`);\n }\n\n private generateTriadicScheme(): string[] {\n const triadicHue = (this.seed + 120) % 360;\n const scheme = new ColorScheme();\n return scheme\n .from_hue(triadicHue)\n .scheme(\"triade\")\n .variation(this.variation)\n .colors()\n .map((hex: string) => `#${hex}`);\n }\n\n /**\n * Returns a flat array of hash-derived colors suitable for art generation.\n * Combines base analogic, complementary, and triadic schemes for variety\n * while maintaining color harmony.\n */\n getColors(): string[] {\n // Deduplicate and return a rich palette\n const all = [\n ...this.baseScheme.slice(0, 4),\n ...this.complementaryScheme.slice(0, 2),\n ...this.triadicScheme.slice(0, 2),\n ];\n return [...new Set(all)];\n }\n\n /**\n * Returns a palette shaped by the given palette mode.\n * Falls back to getColors() for \"harmonious\".\n */\n getColorsByMode(mode: string): string[] {\n const baseHue = this.seed % 360;\n switch (mode) {\n case \"monochrome\": {\n // Single hue, 5 lightness steps\n const s = 0.5 + this.rng() * 0.3;\n return [0.15, 0.3, 0.45, 0.6, 0.75].map((l) =>\n hslToHex(baseHue, s, l),\n );\n }\n case \"duotone\": {\n // Two contrasting colors + tints\n const hue2 = (baseHue + 150 + this.rng() * 60) % 360;\n return [\n hslToHex(baseHue, 0.7, 0.5),\n hslToHex(baseHue, 0.6, 0.7),\n hslToHex(hue2, 0.7, 0.5),\n hslToHex(hue2, 0.6, 0.7),\n ];\n }\n case \"neon\": {\n // High saturation, vivid colors\n const hues = [baseHue, (baseHue + 90) % 360, (baseHue + 180) % 360, (baseHue + 270) % 360];\n return hues.map((h) => hslToHex(h, 1.0, 0.55 + this.rng() * 0.1));\n }\n case \"pastel-light\": {\n // Soft pastels\n const hues = [baseHue, (baseHue + 60) % 360, (baseHue + 120) % 360, (baseHue + 200) % 360];\n return hues.map((h) => hslToHex(h, 0.4 + this.rng() * 0.2, 0.75 + this.rng() * 0.1));\n }\n case \"earth\": {\n // Warm muted naturals: browns, olives, terracotta, sage\n const earthHues = [25, 35, 45, 80, 150]; // orange-brown to olive to sage\n return earthHues.map((h) =>\n hslToHex(h + this.rng() * 15, 0.25 + this.rng() * 0.2, 0.35 + this.rng() * 0.2),\n );\n }\n case \"high-contrast\": {\n // Black, white, and one accent color\n const accent = hslToHex(baseHue, 0.9, 0.5);\n return [\"#111111\", \"#eeeeee\", accent, hslToHex(baseHue, 0.7, 0.35)];\n }\n case \"split-complementary\": {\n // Base hue + two colors flanking the complement (±30°)\n const comp = (baseHue + 180) % 360;\n const split1 = (comp - 30 + 360) % 360;\n const split2 = (comp + 30) % 360;\n const sat = 0.55 + this.rng() * 0.25;\n return [\n hslToHex(baseHue, sat, 0.5),\n hslToHex(baseHue, sat * 0.8, 0.65),\n hslToHex(split1, sat, 0.5),\n hslToHex(split2, sat, 0.5),\n hslToHex(split1, sat * 0.7, 0.7),\n ];\n }\n case \"analogous-accent\": {\n // Tight cluster of 3 analogous hues + 1 distant accent\n const step = 15 + this.rng() * 20; // 15-35° apart\n const h1 = (baseHue - step + 360) % 360;\n const h2 = (baseHue + step) % 360;\n const accentHue = (baseHue + 150 + this.rng() * 60) % 360;\n const sat = 0.5 + this.rng() * 0.3;\n return [\n hslToHex(baseHue, sat, 0.5),\n hslToHex(h1, sat, 0.55),\n hslToHex(h2, sat, 0.45),\n hslToHex(accentHue, sat + 0.15, 0.5),\n ];\n }\n case \"limited-palette\": {\n // Only 3 colors — like a risograph print\n const h2 = (baseHue + 120 + this.rng() * 40) % 360;\n const h3 = (baseHue + 220 + this.rng() * 40) % 360;\n const sat = 0.6 + this.rng() * 0.2;\n return [\n hslToHex(baseHue, sat, 0.5),\n hslToHex(h2, sat, 0.5),\n hslToHex(h3, sat * 0.9, 0.55),\n ];\n }\n case \"harmonious\":\n default:\n return this.getColors();\n }\n }\n\n /**\n * Returns background colors appropriate for the given palette mode.\n */\n getBackgroundColorsByMode(mode: string): [string, string] {\n switch (mode) {\n case \"pastel-light\":\n return [hslToHex(this.seed % 360, 0.15, 0.92), hslToHex((this.seed + 30) % 360, 0.1, 0.88)];\n case \"high-contrast\":\n case \"monochrome-ink\":\n return [\"#f5f5f0\", \"#e8e8e0\"];\n case \"split-complementary\":\n case \"analogous-accent\":\n return this.getBackgroundColors();\n case \"limited-palette\":\n return [hslToHex(this.seed % 360, 0.08, 0.94), hslToHex((this.seed + 20) % 360, 0.06, 0.90)];\n case \"neon\":\n return [\"#0a0a12\", \"#050510\"];\n case \"earth\":\n return [this.darken(hslToHex(35, 0.3, 0.25), 0.8), this.darken(hslToHex(25, 0.25, 0.2), 0.7)];\n default:\n return this.getBackgroundColors();\n }\n }\n\n /**\n * Returns two background colors derived from the hash — darker variants\n * of the base scheme, temperature-shifted for warm/cool contrast.\n */\n getBackgroundColors(): [string, string] {\n let bg0 = this.baseScheme[0];\n let bg1 = this.baseScheme[1];\n\n if (this.temperatureMode !== \"neutral\") {\n const bgTemp = this.temperatureMode === \"warm-bg\" ? \"warm\" : \"cool\";\n bg0 = this.shiftColorTemperature(bg0, bgTemp, 0.3);\n bg1 = this.shiftColorTemperature(bg1, bgTemp, 0.25);\n }\n\n return [this.darken(bg0, 0.65), this.darken(bg1, 0.55)];\n }\n\n /**\n * Returns the temperature mode so the renderer can apply\n * contrasting temperature to foreground elements.\n */\n getTemperatureMode(): TemperatureMode {\n return this.temperatureMode;\n }\n\n /**\n * Shift a hex color's hue toward warm or cool.\n */\n private shiftColorTemperature(hex: string, target: \"warm\" | \"cool\", amount: number): string {\n const [h, s, l] = hexToHsl(hex);\n const shifted = shiftHueToward(h, target, amount);\n return hslToHex(shifted, s, l);\n }\n\n /**\n * Simple hex color darkening by a factor (0 = black, 1 = unchanged).\n */\n private darken(hex: string, factor: number): string {\n const c = hex.replace(\"#\", \"\");\n const r = Math.round(parseInt(c.substring(0, 2), 16) * factor);\n const g = Math.round(parseInt(c.substring(2, 4), 16) * factor);\n const b = Math.round(parseInt(c.substring(4, 6), 16) * factor);\n return `#${r.toString(16).padStart(2, \"0\")}${g.toString(16).padStart(2, \"0\")}${b.toString(16).padStart(2, \"0\")}`;\n }\n}\n\n// ── Standalone color utilities ──────────────────────────────────────\n\n/** Parse a hex color (#RRGGBB) into [r, g, b] 0-255. */\nfunction hexToRgb(hex: string): [number, number, number] {\n const c = hex.replace(\"#\", \"\");\n return [\n parseInt(c.substring(0, 2), 16),\n parseInt(c.substring(2, 4), 16),\n parseInt(c.substring(4, 6), 16),\n ];\n}\n\n/** Format [r, g, b] back to #RRGGBB. */\nfunction rgbToHex(r: number, g: number, b: number): string {\n const clamp = (v: number) => Math.max(0, Math.min(255, Math.round(v)));\n return `#${clamp(r).toString(16).padStart(2, \"0\")}${clamp(g).toString(16).padStart(2, \"0\")}${clamp(b).toString(16).padStart(2, \"0\")}`;\n}\n\n/** Convert hex to HSL [h 0-360, s 0-1, l 0-1]. */\nfunction hexToHsl(hex: string): [number, number, number] {\n const [r, g, b] = hexToRgb(hex).map((v) => v / 255);\n const max = Math.max(r, g, b);\n const min = Math.min(r, g, b);\n const l = (max + min) / 2;\n if (max === min) return [0, 0, l];\n const d = max - min;\n const s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n let h = 0;\n if (max === r) h = ((g - b) / d + (g < b ? 6 : 0)) / 6;\n else if (max === g) h = ((b - r) / d + 2) / 6;\n else h = ((r - g) / d + 4) / 6;\n return [h * 360, s, l];\n}\n\n/** Convert HSL [h 0-360, s 0-1, l 0-1] back to hex. */\nfunction hslToHex(h: number, s: number, l: number): string {\n h = ((h % 360) + 360) % 360;\n const c = (1 - Math.abs(2 * l - 1)) * s;\n const x = c * (1 - Math.abs(((h / 60) % 2) - 1));\n const m = l - c / 2;\n let r = 0, g = 0, b = 0;\n if (h < 60) { r = c; g = x; }\n else if (h < 120) { r = x; g = c; }\n else if (h < 180) { g = c; b = x; }\n else if (h < 240) { g = x; b = c; }\n else if (h < 300) { r = x; b = c; }\n else { r = c; b = x; }\n return rgbToHex((r + m) * 255, (g + m) * 255, (b + m) * 255);\n}\n\n/**\n * Return a hex color with an alpha component as an rgba() CSS string.\n * `alpha` is 0-1.\n */\nexport function hexWithAlpha(hex: string, alpha: number): string {\n const [r, g, b] = hexToRgb(hex);\n return `rgba(${r},${g},${b},${alpha.toFixed(3)})`;\n}\n\n/**\n * Color hierarchy — assigns dominant/secondary/accent roles to a palette.\n * Dominant gets ~60% of usage, secondary ~25%, accent ~15%.\n */\nexport interface ColorHierarchy {\n dominant: string;\n secondary: string;\n accent: string;\n all: string[];\n}\n\nexport function buildColorHierarchy(colors: string[], rng: () => number): ColorHierarchy {\n if (colors.length < 3) {\n return {\n dominant: colors[0] || \"#888888\",\n secondary: colors[1] || colors[0] || \"#888888\",\n accent: colors[colors.length - 1] || \"#888888\",\n all: colors,\n };\n }\n // Pick dominant as the color closest to the palette's average hue\n const hsls = colors.map((c) => hexToHsl(c));\n const avgHue = hsls.reduce((s, h) => s + h[0], 0) / hsls.length;\n let dominantIdx = 0;\n let minDist = 360;\n for (let i = 0; i < hsls.length; i++) {\n const d = Math.min(Math.abs(hsls[i][0] - avgHue), 360 - Math.abs(hsls[i][0] - avgHue));\n if (d < minDist) { minDist = d; dominantIdx = i; }\n }\n // Accent is the color most distant from dominant in hue\n let accentIdx = 0;\n let maxDist = 0;\n for (let i = 0; i < hsls.length; i++) {\n if (i === dominantIdx) continue;\n const d = Math.min(Math.abs(hsls[i][0] - hsls[dominantIdx][0]), 360 - Math.abs(hsls[i][0] - hsls[dominantIdx][0]));\n if (d > maxDist) { maxDist = d; accentIdx = i; }\n }\n // Secondary is the remaining color with highest saturation\n let secondaryIdx = 0;\n let maxSat = -1;\n for (let i = 0; i < hsls.length; i++) {\n if (i === dominantIdx || i === accentIdx) continue;\n if (hsls[i][1] > maxSat) { maxSat = hsls[i][1]; secondaryIdx = i; }\n }\n if (secondaryIdx === dominantIdx) secondaryIdx = accentIdx === 0 ? 1 : 0;\n\n return {\n dominant: colors[dominantIdx],\n secondary: colors[secondaryIdx],\n accent: colors[accentIdx],\n all: colors,\n };\n}\n\n/**\n * Pick a color from the hierarchy with weighted probability.\n * ~60% dominant, ~25% secondary, ~15% accent.\n */\nexport function pickHierarchyColor(hierarchy: ColorHierarchy, rng: () => number): string {\n const roll = rng();\n if (roll < 0.60) return hierarchy.dominant;\n if (roll < 0.85) return hierarchy.secondary;\n return hierarchy.accent;\n}\n\n/**\n * HSL-space color jitter — preserves vibrancy better than RGB jitter.\n * Applies small hue wobble + saturation/lightness variation.\n */\nexport function jitterColorHSL(\n hex: string,\n rng: () => number,\n hueAmount = 8,\n slAmount = 0.06,\n): string {\n const [h, s, l] = hexToHsl(hex);\n const newH = (h + (rng() - 0.5) * hueAmount * 2 + 360) % 360;\n const newS = Math.max(0, Math.min(1, s + (rng() - 0.5) * slAmount * 2));\n const newL = Math.max(0, Math.min(1, l + (rng() - 0.5) * slAmount * 2));\n return hslToHex(newH, newS, newL);\n}\n\nexport function jitterColor(\n hex: string,\n rng: () => number,\n amount = 0.1,\n): string {\n const [r, g, b] = hexToRgb(hex);\n const jit = () => (rng() - 0.5) * 2 * amount * 255;\n return rgbToHex(r + jit(), g + jit(), b + jit());\n}\n\n/**\n * Desaturate a hex color by blending toward its luminance gray.\n * `amount` 0 = unchanged, 1 = fully gray.\n */\nexport function desaturate(hex: string, amount: number): string {\n const [r, g, b] = hexToRgb(hex);\n const gray = 0.299 * r + 0.587 * g + 0.114 * b;\n const mix = (c: number) => c + (gray - c) * amount;\n return rgbToHex(mix(r), mix(g), mix(b));\n}\n\n/**\n * Shift a hex color's hue toward warm (orange) or cool (blue).\n * `amount` 0 = unchanged, 1 = fully shifted.\n */\nexport function shiftTemperature(hex: string, target: \"warm\" | \"cool\", amount: number): string {\n const [h, s, l] = hexToHsl(hex);\n return hslToHex(shiftHueToward(h, target, amount), s, l);\n}\n\n/**\n * Compute relative luminance of a hex color (0 = black, 1 = white).\n * Uses the sRGB luminance formula from WCAG.\n */\nexport function luminance(hex: string): number {\n const [r, g, b] = hexToRgb(hex).map((c) => {\n const s = c / 255;\n return s <= 0.03928 ? s / 12.92 : Math.pow((s + 0.055) / 1.055, 2.4);\n });\n return 0.2126 * r + 0.7152 * g + 0.0722 * b;\n}\n\n/**\n * Enforce minimum contrast between a foreground color and a background\n * luminance. On light backgrounds, darkens/saturates the foreground.\n * On dark backgrounds, lightens/saturates the foreground.\n *\n * `bgLuminance` is 0-1 (pre-computed from the background color).\n * `minContrast` is the minimum luminance difference to enforce (default 0.15).\n */\nexport function enforceContrast(\n fgHex: string,\n bgLuminance: number,\n minContrast = 0.15,\n): string {\n const fgLum = luminance(fgHex);\n const diff = Math.abs(fgLum - bgLuminance);\n\n if (diff >= minContrast) return fgHex;\n\n const [h, s, l] = hexToHsl(fgHex);\n\n if (bgLuminance > 0.5) {\n // Light background — darken and boost saturation\n const targetL = Math.max(0.08, l - (minContrast - diff) * 1.5);\n const targetS = Math.min(1, s + 0.2);\n return hslToHex(h, targetS, targetL);\n } else {\n // Dark background — lighten and boost saturation\n const targetL = Math.min(0.92, l + (minContrast - diff) * 1.5);\n const targetS = Math.min(1, s + 0.15);\n return hslToHex(h, targetS, targetL);\n }\n}\n\n/**\n * Apply a unified color grade to a hex color — shifts the entire image\n * toward a cohesive tone. This is the \"Instagram filter\" effect.\n */\nexport function applyColorGrade(\n hex: string,\n gradeHue: number,\n intensity: number,\n): string {\n const [h, s, l] = hexToHsl(hex);\n // Blend hue toward the grade hue\n const hueDiff = ((gradeHue - h + 540) % 360) - 180;\n const newH = (h + hueDiff * intensity * 0.3 + 360) % 360;\n // Slightly unify saturation\n const newS = Math.max(0, Math.min(1, s + (0.5 - s) * intensity * 0.15));\n return hslToHex(newH, newS, l);\n}\n\n/**\n * Compute a deterministic color grade from the hash.\n * Returns a hue (0-360) and intensity (0.15-0.4).\n */\nexport function pickColorGrade(rng: () => number): { hue: number; intensity: number } {\n // Warm golden, cool blue, rosy, teal, amber\n const GRADE_HUES = [40, 220, 340, 175, 30];\n const hue = GRADE_HUES[Math.floor(rng() * GRADE_HUES.length)] + (rng() - 0.5) * 20;\n const intensity = 0.15 + rng() * 0.25;\n return { hue: (hue + 360) % 360, intensity };\n}\n\n/**\n * Rotate the hue of a hex color by a given number of degrees.\n */\nexport function hueRotate(hex: string, degrees: number): string {\n const [h, s, l] = hexToHsl(hex);\n return hslToHex((h + degrees + 360) % 360, s, l);\n}\n\n/**\n * Evolve a color hierarchy for a given layer — shifts hue progressively.\n * Creates atmospheric color perspective (like distant mountains shifting blue).\n */\nexport function evolveHierarchy(\n base: ColorHierarchy,\n layerRatio: number,\n hueShiftPerLayer: number,\n): ColorHierarchy {\n const shift = layerRatio * hueShiftPerLayer;\n return {\n dominant: hueRotate(base.dominant, shift),\n secondary: hueRotate(base.secondary, shift * 0.7),\n accent: hueRotate(base.accent, shift * 0.5),\n all: base.all.map(c => hueRotate(c, shift * 0.6)),\n };\n}\n","declare module 'color-scheme' {\n class ColorScheme {\n from_hue(hue: number): this;\n scheme(name: string): this;\n variation(name: string): this;\n colors(): string[];\n }\n\n export = ColorScheme;\n}\n\n// declare module 'color-scheme';\n","export function gitHashToSeed(gitHash: string): number {\n return parseInt(gitHash.slice(0, 8), 16);\n}\n\n/**\n * Mulberry32 — a fast, high-quality 32-bit seeded PRNG.\n * Returns a function that produces deterministic floats in [0, 1).\n */\nexport function createRng(seed: number): () => number {\n let s = seed | 0;\n return () => {\n s = (s + 0x6d2b79f5) | 0;\n let t = Math.imul(s ^ (s >>> 15), 1 | s);\n t = (t + Math.imul(t ^ (t >>> 7), 61 | t)) ^ t;\n return ((t ^ (t >>> 14)) >>> 0) / 4294967296;\n };\n}\n\n/**\n * Derive a deterministic seed from a hash string and an extra index\n * so each call-site gets its own independent stream.\n */\nexport function seedFromHash(hash: string, offset = 0): number {\n let h = 0;\n for (let i = 0; i < hash.length; i++) {\n h = (Math.imul(31, h) + hash.charCodeAt(i)) | 0;\n }\n return (h + offset) | 0;\n}\n\n/**\n * Legacy helper kept for backward compat — now backed by mulberry32.\n * Prefer createRng() + rng() for new code.\n */\nexport function getRandomFromHash(\n hash: string,\n index: number,\n min: number,\n max: number,\n): number {\n const rng = createRng(seedFromHash(hash, index));\n return min + rng() * (max - min);\n}\n\n// Golden ratio and other important proportions\nexport const Proportions = {\n GOLDEN_RATIO: 1.618034,\n SQUARE_ROOT_2: Math.sqrt(2),\n SQUARE_ROOT_3: Math.sqrt(3),\n SQUARE_ROOT_5: Math.sqrt(5),\n PI: Math.PI,\n PHI: (1 + Math.sqrt(5)) / 2,\n};\n\nexport type ProportionType = keyof typeof Proportions;\n\n// ── Deterministic 2D Simplex Noise ──────────────────────────────────\n// A compact implementation seeded from the RNG so every hash produces\n// a unique noise field without external dependencies.\n\n/**\n * Create a seeded 2D simplex noise function.\n * Returns noise(x, y) → float in approximately [-1, 1].\n */\nexport function createSimplexNoise(rng: () => number): (x: number, y: number) => number {\n // Build a deterministic permutation table (256 entries, doubled)\n const perm = new Uint8Array(512);\n const p = new Uint8Array(256);\n for (let i = 0; i < 256; i++) p[i] = i;\n // Fisher-Yates shuffle with our seeded RNG\n for (let i = 255; i > 0; i--) {\n const j = Math.floor(rng() * (i + 1));\n const tmp = p[i]; p[i] = p[j]; p[j] = tmp;\n }\n for (let i = 0; i < 512; i++) perm[i] = p[i & 255];\n\n // 12 gradient vectors for 2D simplex\n const GRAD2 = [\n [1,1],[-1,1],[1,-1],[-1,-1],\n [1,0],[-1,0],[0,1],[0,-1],\n [1,1],[-1,1],[1,-1],[-1,-1],\n ];\n\n const F2 = 0.5 * (Math.sqrt(3) - 1);\n const G2 = (3 - Math.sqrt(3)) / 6;\n\n function dot2(g: number[], x: number, y: number): number {\n return g[0] * x + g[1] * y;\n }\n\n return function noise2D(xin: number, yin: number): number {\n const s = (xin + yin) * F2;\n const i = Math.floor(xin + s);\n const j = Math.floor(yin + s);\n const t = (i + j) * G2;\n const X0 = i - t;\n const Y0 = j - t;\n const x0 = xin - X0;\n const y0 = yin - Y0;\n\n let i1: number, j1: number;\n if (x0 > y0) { i1 = 1; j1 = 0; }\n else { i1 = 0; j1 = 1; }\n\n const x1 = x0 - i1 + G2;\n const y1 = y0 - j1 + G2;\n const x2 = x0 - 1 + 2 * G2;\n const y2 = y0 - 1 + 2 * G2;\n\n const ii = i & 255;\n const jj = j & 255;\n\n let n0 = 0, n1 = 0, n2 = 0;\n\n let t0 = 0.5 - x0 * x0 - y0 * y0;\n if (t0 >= 0) {\n t0 *= t0;\n const gi0 = perm[ii + perm[jj]] % 12;\n n0 = t0 * t0 * dot2(GRAD2[gi0], x0, y0);\n }\n\n let t1 = 0.5 - x1 * x1 - y1 * y1;\n if (t1 >= 0) {\n t1 *= t1;\n const gi1 = perm[ii + i1 + perm[jj + j1]] % 12;\n n1 = t1 * t1 * dot2(GRAD2[gi1], x1, y1);\n }\n\n let t2 = 0.5 - x2 * x2 - y2 * y2;\n if (t2 >= 0) {\n t2 *= t2;\n const gi2 = perm[ii + 1 + perm[jj + 1]] % 12;\n n2 = t2 * t2 * dot2(GRAD2[gi2], x2, y2);\n }\n\n // Scale to approximately [-1, 1]\n return 70 * (n0 + n1 + n2);\n };\n}\n\n/**\n * Fractal Brownian Motion — layer multiple octaves of noise for richer fields.\n * Returns a function (x, y) → float in approximately [-1, 1].\n */\nexport function createFBM(\n noise: (x: number, y: number) => number,\n octaves = 4,\n lacunarity = 2.0,\n gain = 0.5,\n): (x: number, y: number) => number {\n return function fbm(x: number, y: number): number {\n let value = 0;\n let amplitude = 1;\n let frequency = 1;\n let maxAmp = 0;\n for (let i = 0; i < octaves; i++) {\n value += noise(x * frequency, y * frequency) * amplitude;\n maxAmp += amplitude;\n amplitude *= gain;\n frequency *= lacunarity;\n }\n return value / maxAmp;\n };\n}\n\ninterface Pattern {\n type: string;\n config: any;\n}\n\ninterface LayerConfig {\n baseSize: number;\n baseOpacity?: number;\n opacityReduction?: number;\n rotationOffset?: number;\n proportionType?: ProportionType;\n}\n\n// Pattern combination utilities\nexport class PatternCombiner {\n static getProportionalSize(baseSize: number, proportion: number): number {\n return baseSize * proportion;\n }\n\n static centerPattern(\n ctx: CanvasRenderingContext2D,\n width: number,\n height: number,\n ): void {\n ctx.translate(width / 2, height / 2);\n }\n\n // Combines sacred geometry patterns with proper proportions\n static layerPatterns(\n ctx: CanvasRenderingContext2D,\n patterns: Pattern[],\n config: LayerConfig,\n ): void {\n const {\n baseSize,\n baseOpacity = 0.6,\n opacityReduction = 0.1,\n rotationOffset = 0,\n proportionType = \"GOLDEN_RATIO\",\n } = config;\n\n patterns.forEach((pattern, index) => {\n const size = this.getProportionalSize(\n baseSize,\n Math.pow(Proportions[proportionType], index),\n );\n const opacity = Math.max(0.1, baseOpacity - index * opacityReduction);\n const rotation = rotationOffset * index;\n\n ctx.save();\n ctx.globalAlpha = opacity;\n ctx.rotate((rotation * Math.PI) / 180);\n\n shapes[pattern.type](ctx, size, pattern.config);\n ctx.restore();\n });\n }\n}\n","import { PatternCombiner, ProportionType } from \"../utils\";\nimport { shapes } from \"./shapes\";\n\n// ── Blend modes for layer-level compositing (Feature B) ─────────────\n// These are all standard Canvas 2D globalCompositeOperation values,\n// safe in both Node (@napi-rs/canvas) and browsers.\n\nexport const BLEND_MODES: GlobalCompositeOperation[] = [\n \"source-over\", // default — safe fallback\n \"screen\",\n \"multiply\",\n \"overlay\",\n \"soft-light\",\n \"color-dodge\",\n \"color-burn\",\n \"lighter\",\n];\n\n/**\n * Pick a blend mode deterministically from the RNG.\n * ~40% chance of default source-over to keep some images clean.\n */\nexport function pickBlendMode(rng: () => number): GlobalCompositeOperation {\n if (rng() < 0.4) return \"source-over\";\n return BLEND_MODES[1 + Math.floor(rng() * (BLEND_MODES.length - 1))];\n}\n\n// ── Shape rendering styles (Feature C) ──────────────────────────────\n\nexport type RenderStyle =\n | \"fill-and-stroke\" // classic (current behavior)\n | \"fill-only\" // soft, no outline\n | \"stroke-only\" // wireframe\n | \"double-stroke\" // inner + outer stroke\n | \"dashed\" // dashed outline\n | \"watercolor\" // multiple offset passes at low opacity\n | \"hatched\" // cross-hatch texture fill\n | \"incomplete\" // draw only 60-85% of the stroke path\n | \"stipple\" // dot-fill texture\n | \"stencil\" // negative-space cutout effect\n | \"noise-grain\" // procedural noise grain texture clipped to shape\n | \"wood-grain\" // parallel wavy lines simulating wood\n | \"marble-vein\" // branching vein lines on a soft fill\n | \"fabric-weave\" // interlocking horizontal/vertical threads\n | \"hand-drawn\"; // wobbly hand-drawn edge treatment\n\nconst RENDER_STYLES: RenderStyle[] = [\n \"fill-and-stroke\",\n \"fill-and-stroke\", // weighted: appears twice for higher probability\n \"fill-only\",\n \"stroke-only\",\n \"double-stroke\",\n \"dashed\",\n \"watercolor\",\n \"hatched\",\n \"incomplete\",\n \"stipple\",\n \"stencil\",\n \"noise-grain\",\n \"wood-grain\",\n \"marble-vein\",\n \"fabric-weave\",\n \"hand-drawn\",\n];\n\nexport function pickRenderStyle(rng: () => number): RenderStyle {\n return RENDER_STYLES[Math.floor(rng() * RENDER_STYLES.length)];\n}\n\n// ── Config interfaces ───────────────────────────────────────────────\n\ninterface DrawShapeConfig {\n fillColor: string;\n strokeColor: string;\n strokeWidth: number;\n size: number;\n rotation: number;\n}\n\ninterface EnhanceShapeConfig extends DrawShapeConfig {\n patterns?: Array<{ type: string; config: any }>;\n proportionType?: ProportionType;\n baseOpacity?: number;\n opacityReduction?: number;\n /** If provided, applies a glow (shadowBlur) effect. */\n glowRadius?: number;\n glowColor?: string;\n /** If provided, fills with a radial gradient between two colors. */\n gradientFillEnd?: string;\n /** Rendering style — controls fill/stroke treatment. */\n renderStyle?: RenderStyle;\n /** RNG for watercolor jitter (required for \"watercolor\" style). */\n rng?: () => number;\n /** Light direction angle in radians — used for shadow & highlight. */\n lightAngle?: number;\n /** Scale factor for resolution-independent sizing. */\n scaleFactor?: number;\n}\n\nexport function drawShape(\n ctx: CanvasRenderingContext2D,\n shape: string,\n x: number,\n y: number,\n config: DrawShapeConfig,\n) {\n const { fillColor, strokeColor, strokeWidth, size, rotation } = config;\n ctx.save();\n ctx.translate(x, y);\n ctx.rotate((rotation * Math.PI) / 180);\n ctx.fillStyle = fillColor;\n ctx.strokeStyle = strokeColor;\n ctx.lineWidth = strokeWidth;\n\n const drawFunction = shapes[shape];\n if (drawFunction) {\n drawFunction(ctx, size);\n ctx.fill();\n ctx.stroke();\n }\n\n ctx.restore();\n}\n\n/**\n * Apply the chosen render style to the current path.\n */\nfunction applyRenderStyle(\n ctx: CanvasRenderingContext2D,\n style: RenderStyle,\n fillColor: string,\n strokeColor: string,\n strokeWidth: number,\n size: number,\n rng?: () => number,\n): void {\n switch (style) {\n case \"fill-only\":\n ctx.fill();\n break;\n\n case \"stroke-only\":\n ctx.fill(); // transparent fill to define the path\n ctx.globalAlpha *= 0.3; // ghost fill\n ctx.fill();\n ctx.globalAlpha /= 0.3;\n ctx.stroke();\n break;\n\n case \"double-stroke\": {\n ctx.fill();\n // Outer stroke\n ctx.lineWidth = strokeWidth * 2;\n ctx.globalAlpha *= 0.5;\n ctx.stroke();\n ctx.globalAlpha /= 0.5;\n // Inner stroke\n ctx.lineWidth = strokeWidth * 0.5;\n ctx.strokeStyle = fillColor;\n ctx.stroke();\n break;\n }\n\n case \"dashed\":\n ctx.fill();\n ctx.setLineDash([size * 0.05, size * 0.03]);\n ctx.stroke();\n ctx.setLineDash([]);\n break;\n\n case \"watercolor\": {\n // Improved watercolor: edge darkening + radial bleed + layered washes\n const passes = 4 + (rng ? Math.floor(rng() * 2) : 0);\n const savedAlpha = ctx.globalAlpha;\n\n // Pass 1: Base wash — large, soft fill at low opacity\n ctx.globalAlpha = savedAlpha * 0.15;\n ctx.save();\n const baseScale = 1.08 + (rng ? rng() * 0.04 : 0);\n ctx.scale(baseScale, baseScale);\n ctx.fill();\n ctx.restore();\n\n // Pass 2: Multiple offset washes with radial displacement\n ctx.globalAlpha = savedAlpha * (0.25 / passes * 2);\n for (let p = 0; p < passes; p++) {\n // Radial outward displacement (not uniform) for organic bleed\n const angle = rng ? rng() * Math.PI * 2 : p * Math.PI / 2;\n const dist = rng ? rng() * size * 0.05 : size * 0.02;\n const jx = Math.cos(angle) * dist;\n const jy = Math.sin(angle) * dist;\n ctx.save();\n ctx.translate(jx, jy);\n ctx.fill();\n ctx.restore();\n }\n\n // Pass 3: Edge darkening — draw a slightly smaller shape with lighter fill\n // to simulate pigment pooling at boundaries\n ctx.globalAlpha = savedAlpha * 0.35;\n ctx.save();\n const innerScale = 0.85 + (rng ? rng() * 0.08 : 0);\n ctx.scale(innerScale, innerScale);\n // Lighten the fill for the inner area\n const origFill = ctx.fillStyle;\n if (typeof fillColor === \"string\") {\n ctx.fillStyle = fillColor.replace(/[\\d.]+\\)$/, (m) => {\n const v = parseFloat(m);\n return Math.min(1, v * 1.4).toFixed(2) + \")\";\n });\n }\n ctx.fill();\n ctx.fillStyle = origFill;\n ctx.restore();\n\n // Pass 4: Organic edge erosion — irregular bites along the boundary\n if (rng && size > 20) {\n const erosionBites = 6 + Math.floor(rng() * 8);\n const edgeRadius = size * 0.45;\n ctx.save();\n ctx.globalCompositeOperation = \"destination-out\";\n ctx.globalAlpha = 0.6 + rng() * 0.3;\n for (let eb = 0; eb < erosionBites; eb++) {\n const biteAngle = rng() * Math.PI * 2;\n const biteDist = edgeRadius * (0.85 + rng() * 0.25);\n const biteR = size * (0.02 + rng() * 0.04);\n ctx.beginPath();\n ctx.arc(\n Math.cos(biteAngle) * biteDist,\n Math.sin(biteAngle) * biteDist,\n biteR, 0, Math.PI * 2,\n );\n ctx.fill();\n }\n ctx.restore();\n }\n\n ctx.globalAlpha = savedAlpha;\n // Soft stroke on top — thinner than normal for delicacy\n ctx.globalAlpha *= 0.25;\n ctx.lineWidth = strokeWidth * 0.6;\n ctx.stroke();\n ctx.globalAlpha /= 0.25;\n break;\n }\n\n case \"hatched\": {\n // Fill normally at reduced opacity, then overlay cross-hatch lines\n const savedAlphaH = ctx.globalAlpha;\n ctx.globalAlpha = savedAlphaH * 0.3;\n ctx.fill();\n ctx.globalAlpha = savedAlphaH;\n\n // Clip to shape, then draw hatch lines\n ctx.save();\n ctx.clip();\n const hatchSpacing = Math.max(3, size * 0.06);\n const hatchAngle = rng ? rng() * Math.PI : Math.PI / 4;\n ctx.lineWidth = Math.max(0.5, strokeWidth * 0.4);\n ctx.globalAlpha = savedAlphaH * 0.6;\n\n // Draw parallel lines across the bounding box\n const extent = size * 0.8;\n const cos = Math.cos(hatchAngle);\n const sin = Math.sin(hatchAngle);\n for (let d = -extent; d <= extent; d += hatchSpacing) {\n ctx.beginPath();\n ctx.moveTo(d * cos - extent * sin, d * sin + extent * cos);\n ctx.lineTo(d * cos + extent * sin, d * sin - extent * cos);\n ctx.stroke();\n }\n // Second pass at perpendicular angle for cross-hatch (~50% chance)\n if (!rng || rng() < 0.5) {\n const crossAngle = hatchAngle + Math.PI / 2;\n const cos2 = Math.cos(crossAngle);\n const sin2 = Math.sin(crossAngle);\n ctx.globalAlpha = savedAlphaH * 0.35;\n for (let d = -extent; d <= extent; d += hatchSpacing * 1.4) {\n ctx.beginPath();\n ctx.moveTo(d * cos2 - extent * sin2, d * sin2 + extent * cos2);\n ctx.lineTo(d * cos2 + extent * sin2, d * sin2 - extent * cos2);\n ctx.stroke();\n }\n }\n ctx.restore();\n ctx.globalAlpha = savedAlphaH;\n // Outline stroke\n ctx.globalAlpha *= 0.5;\n ctx.stroke();\n ctx.globalAlpha /= 0.5;\n break;\n }\n\n case \"incomplete\": {\n // Draw the fill at low opacity, then a dashed stroke that\n // simulates drawing only part of the outline\n const savedAlphaI = ctx.globalAlpha;\n ctx.globalAlpha = savedAlphaI * 0.25;\n ctx.fill();\n ctx.globalAlpha = savedAlphaI;\n\n // Use a long dash pattern where gaps create the \"incomplete\" look\n const completeness = rng ? 0.6 + rng() * 0.25 : 0.7; // 60-85%\n const segLen = size * 0.12;\n const gapLen = segLen * ((1 - completeness) / completeness);\n ctx.setLineDash([segLen, gapLen]);\n // Offset the dash so each shape starts at a different point\n ctx.lineDashOffset = rng ? rng() * segLen * 4 : 0;\n // Slightly thicker stroke for hand-drawn feel\n ctx.lineWidth = strokeWidth * 1.3;\n ctx.stroke();\n ctx.setLineDash([]);\n ctx.lineDashOffset = 0;\n break;\n }\n\n case \"stipple\": {\n // Dot-fill texture — clip to shape, then scatter dots\n const savedAlphaS = ctx.globalAlpha;\n ctx.globalAlpha = savedAlphaS * 0.15;\n ctx.fill(); // ghost fill\n ctx.globalAlpha = savedAlphaS;\n\n ctx.save();\n ctx.clip();\n const dotSpacing = Math.max(2, size * 0.03);\n const extent = size * 0.55;\n ctx.globalAlpha = savedAlphaS * 0.7;\n for (let dx = -extent; dx <= extent; dx += dotSpacing) {\n for (let dy = -extent; dy <= extent; dy += dotSpacing) {\n // Jitter each dot position for organic feel\n const jx = rng ? (rng() - 0.5) * dotSpacing * 0.6 : 0;\n const jy = rng ? (rng() - 0.5) * dotSpacing * 0.6 : 0;\n const dotR = rng ? dotSpacing * (0.15 + rng() * 0.2) : dotSpacing * 0.2;\n ctx.beginPath();\n ctx.arc(dx + jx, dy + jy, dotR, 0, Math.PI * 2);\n ctx.fill();\n }\n }\n ctx.restore();\n ctx.globalAlpha = savedAlphaS;\n // Outline\n ctx.globalAlpha *= 0.4;\n ctx.stroke();\n ctx.globalAlpha /= 0.4;\n break;\n }\n\n case \"stencil\": {\n // Negative-space cutout — fill a rectangle, then erase the shape\n const savedAlphaSt = ctx.globalAlpha;\n // Fill a bounding area with the stroke color\n ctx.globalAlpha = savedAlphaSt * 0.5;\n ctx.fillStyle = strokeColor;\n ctx.fillRect(-size * 0.6, -size * 0.6, size * 1.2, size * 1.2);\n // Cut out the shape using destination-out\n ctx.globalCompositeOperation = \"destination-out\";\n ctx.globalAlpha = 1;\n ctx.fill();\n ctx.globalCompositeOperation = \"source-over\";\n ctx.globalAlpha = savedAlphaSt;\n // Subtle outline of the cutout\n ctx.globalAlpha *= 0.3;\n ctx.stroke();\n ctx.globalAlpha /= 0.3;\n break;\n }\n\n case \"noise-grain\": {\n // Procedural noise grain texture clipped to shape boundary\n const savedAlphaN = ctx.globalAlpha;\n ctx.globalAlpha = savedAlphaN * 0.25;\n ctx.fill(); // base tint\n ctx.globalAlpha = savedAlphaN;\n\n ctx.save();\n ctx.clip();\n const grainSpacing = Math.max(1.5, size * 0.015);\n const extentN = size * 0.55;\n ctx.globalAlpha = savedAlphaN * 0.6;\n for (let gx = -extentN; gx <= extentN; gx += grainSpacing) {\n for (let gy = -extentN; gy <= extentN; gy += grainSpacing) {\n if (!rng) break;\n const jx = (rng() - 0.5) * grainSpacing * 1.2;\n const jy = (rng() - 0.5) * grainSpacing * 1.2;\n const brightness = rng() > 0.5 ? 255 : 0;\n const dotAlpha = 0.15 + rng() * 0.35;\n ctx.globalAlpha = savedAlphaN * dotAlpha;\n ctx.fillStyle = `rgba(${brightness},${brightness},${brightness},1)`;\n const dotSize = grainSpacing * (0.3 + rng() * 0.5);\n ctx.fillRect(gx + jx, gy + jy, dotSize, dotSize);\n }\n }\n ctx.restore();\n ctx.fillStyle = fillColor;\n ctx.globalAlpha = savedAlphaN;\n ctx.globalAlpha *= 0.4;\n ctx.stroke();\n ctx.globalAlpha /= 0.4;\n break;\n }\n\n case \"wood-grain\": {\n // Parallel wavy lines simulating wood grain, clipped to shape\n const savedAlphaW = ctx.globalAlpha;\n ctx.globalAlpha = savedAlphaW * 0.2;\n ctx.fill(); // base tint\n ctx.globalAlpha = savedAlphaW;\n\n ctx.save();\n ctx.clip();\n const grainLineSpacing = Math.max(2, size * 0.035);\n const extentW = size * 0.55;\n const waveFreq = rng ? 3 + rng() * 5 : 5;\n const waveAmp = rng ? size * (0.01 + rng() * 0.03) : size * 0.02;\n const grainAngle = rng ? rng() * Math.PI : Math.PI * 0.25;\n ctx.lineWidth = Math.max(0.5, strokeWidth * 0.3);\n ctx.globalAlpha = savedAlphaW * 0.5;\n\n const cosG = Math.cos(grainAngle);\n const sinG = Math.sin(grainAngle);\n for (let d = -extentW; d <= extentW; d += grainLineSpacing) {\n ctx.beginPath();\n for (let t = -extentW; t <= extentW; t += 2) {\n const wave = Math.sin((t / extentW) * waveFreq * Math.PI) * waveAmp;\n const px = t * cosG - (d + wave) * sinG;\n const py = t * sinG + (d + wave) * cosG;\n if (t === -extentW) ctx.moveTo(px, py);\n else ctx.lineTo(px, py);\n }\n ctx.stroke();\n }\n ctx.restore();\n ctx.globalAlpha = savedAlphaW;\n ctx.globalAlpha *= 0.35;\n ctx.stroke();\n ctx.globalAlpha /= 0.35;\n break;\n }\n\n case \"marble-vein\": {\n // Branching vein lines on a soft fill, clipped to shape\n const savedAlphaM = ctx.globalAlpha;\n ctx.globalAlpha = savedAlphaM * 0.35;\n ctx.fill(); // soft base\n ctx.globalAlpha = savedAlphaM;\n\n ctx.save();\n ctx.clip();\n const veinCount = rng ? 2 + Math.floor(rng() * 3) : 3;\n const extentM = size * 0.45;\n ctx.lineWidth = Math.max(0.5, strokeWidth * 0.5);\n ctx.globalAlpha = savedAlphaM * 0.4;\n\n for (let v = 0; v < veinCount; v++) {\n const startX = rng ? (rng() - 0.5) * extentM * 2 : 0;\n const startY = rng ? -extentM + rng() * extentM * 0.5 : -extentM;\n let vx = startX;\n let vy = startY;\n const steps = 15 + (rng ? Math.floor(rng() * 15) : 10);\n const stepLen = size * 0.04;\n\n ctx.beginPath();\n ctx.moveTo(vx, vy);\n for (let s = 0; s < steps; s++) {\n const drift = rng ? (rng() - 0.5) * stepLen * 1.5 : 0;\n vx += drift;\n vy += stepLen;\n ctx.lineTo(vx, vy);\n // Branch ~20% of the time\n if (rng && rng() < 0.2 && s > 2 && s < steps - 3) {\n const branchDir = rng() < 0.5 ? -1 : 1;\n let bx = vx;\n let by = vy;\n const bSteps = 3 + Math.floor(rng() * 5);\n ctx.moveTo(bx, by);\n for (let bs = 0; bs < bSteps; bs++) {\n bx += branchDir * stepLen * (0.5 + rng() * 0.5);\n by += stepLen * 0.6;\n ctx.lineTo(bx, by);\n }\n ctx.moveTo(vx, vy); // return to main vein\n }\n }\n ctx.stroke();\n }\n ctx.restore();\n ctx.globalAlpha = savedAlphaM;\n ctx.globalAlpha *= 0.3;\n ctx.stroke();\n ctx.globalAlpha /= 0.3;\n break;\n }\n\n case \"fabric-weave\": {\n // Interlocking horizontal/vertical threads clipped to shape\n const savedAlphaF = ctx.globalAlpha;\n ctx.globalAlpha = savedAlphaF * 0.15;\n ctx.fill(); // ghost base\n ctx.globalAlpha = savedAlphaF;\n\n ctx.save();\n ctx.clip();\n const threadSpacing = Math.max(2, size * 0.04);\n const extentF = size * 0.55;\n ctx.lineWidth = Math.max(0.8, threadSpacing * 0.5);\n ctx.globalAlpha = savedAlphaF * 0.55;\n\n // Horizontal threads\n for (let y = -extentF; y <= extentF; y += threadSpacing * 2) {\n ctx.beginPath();\n ctx.moveTo(-extentF, y);\n ctx.lineTo(extentF, y);\n ctx.stroke();\n }\n // Vertical threads (offset by half spacing for weave effect)\n ctx.globalAlpha = savedAlphaF * 0.45;\n ctx.strokeStyle = fillColor;\n for (let x = -extentF; x <= extentF; x += threadSpacing * 2) {\n ctx.beginPath();\n for (let y = -extentF; y <= extentF; y += threadSpacing * 2) {\n // Over-under: draw segment, skip segment\n ctx.moveTo(x, y);\n ctx.lineTo(x, y + threadSpacing);\n }\n ctx.stroke();\n }\n ctx.strokeStyle = strokeColor;\n ctx.restore();\n ctx.globalAlpha = savedAlphaF;\n ctx.globalAlpha *= 0.3;\n ctx.stroke();\n ctx.globalAlpha /= 0.3;\n break;\n }\n\n case \"hand-drawn\": {\n // Wobbly hand-drawn edge treatment — fill normally, then redraw\n // the outline with perturbed control points for a sketchy feel\n const savedAlphaHD = ctx.globalAlpha;\n ctx.globalAlpha = savedAlphaHD * 0.85;\n ctx.fill();\n ctx.globalAlpha = savedAlphaHD;\n\n // Draw 2-3 slightly offset wobbly strokes for a sketchy look\n const wobblePasses = 2 + (rng ? Math.floor(rng() * 2) : 0);\n ctx.lineWidth = strokeWidth * 0.8;\n for (let wp = 0; wp < wobblePasses; wp++) {\n ctx.globalAlpha = savedAlphaHD * (0.4 - wp * 0.1);\n ctx.save();\n // Slight random offset per pass\n const wobbleX = rng ? (rng() - 0.5) * size * 0.02 : 0;\n const wobbleY = rng ? (rng() - 0.5) * size * 0.02 : 0;\n ctx.translate(wobbleX, wobbleY);\n // Slightly different scale per pass for edge variation\n const wobbleScale = 1 + (rng ? (rng() - 0.5) * 0.03 : 0);\n ctx.scale(wobbleScale, wobbleScale);\n ctx.stroke();\n ctx.restore();\n }\n\n // Organic edge erosion — small irregular bites for rough paper feel\n if (rng && size > 20) {\n const erosionBites = 4 + Math.floor(rng() * 6);\n const edgeRadius = size * 0.42;\n ctx.save();\n ctx.globalCompositeOperation = \"destination-out\";\n ctx.globalAlpha = 0.5 + rng() * 0.3;\n for (let eb = 0; eb < erosionBites; eb++) {\n const biteAngle = rng() * Math.PI * 2;\n const biteDist = edgeRadius * (0.9 + rng() * 0.2);\n const biteR = size * (0.015 + rng() * 0.03);\n ctx.beginPath();\n ctx.arc(\n Math.cos(biteAngle) * biteDist,\n Math.sin(biteAngle) * biteDist,\n biteR, 0, Math.PI * 2,\n );\n ctx.fill();\n }\n ctx.restore();\n }\n\n ctx.globalAlpha = savedAlphaHD;\n break;\n }\n\n case \"fill-and-stroke\":\n default:\n ctx.fill();\n ctx.stroke();\n break;\n }\n}\n\n/**\n * Enhanced shape drawing with glow, gradient fills, blend modes,\n * render style variety, and pattern layering.\n */\nexport function enhanceShapeGeneration(\n ctx: CanvasRenderingContext2D,\n shape: string,\n x: number,\n y: number,\n config: EnhanceShapeConfig,\n) {\n const {\n fillColor,\n strokeColor,\n strokeWidth,\n size,\n rotation,\n patterns = [],\n proportionType = \"GOLDEN_RATIO\",\n baseOpacity = 0.6,\n opacityReduction = 0.1,\n glowRadius = 0,\n glowColor,\n gradientFillEnd,\n renderStyle = \"fill-and-stroke\",\n rng,\n lightAngle,\n scaleFactor = 1,\n } = config;\n\n ctx.save();\n ctx.translate(x, y);\n ctx.rotate((rotation * Math.PI) / 180);\n\n // ── Drop shadow — soft colored shadow offset along light direction ──\n if (lightAngle !== undefined && size > 10) {\n const shadowDist = size * 0.035;\n const shadowBlurR = size * 0.06;\n ctx.shadowOffsetX = Math.cos(lightAngle + Math.PI) * shadowDist;\n ctx.shadowOffsetY = Math.sin(lightAngle + Math.PI) * shadowDist;\n ctx.shadowBlur = shadowBlurR;\n ctx.shadowColor = \"rgba(0,0,0,0.12)\";\n } else if (glowRadius > 0) {\n // Glow / shadow effect (legacy path)\n ctx.shadowBlur = glowRadius;\n ctx.shadowColor = glowColor || fillColor;\n ctx.shadowOffsetX = 0;\n ctx.shadowOffsetY = 0;\n }\n\n // Gradient fill or flat fill\n if (gradientFillEnd) {\n const grad = ctx.createRadialGradient(0, 0, 0, 0, 0, size / 2);\n grad.addColorStop(0, fillColor);\n grad.addColorStop(1, gradientFillEnd);\n ctx.fillStyle = grad;\n } else {\n ctx.fillStyle = fillColor;\n }\n\n ctx.strokeStyle = strokeColor;\n ctx.lineWidth = strokeWidth;\n\n const drawFunction = shapes[shape];\n if (drawFunction) {\n drawFunction(ctx, size, { rng });\n applyRenderStyle(ctx, renderStyle, fillColor, strokeColor, strokeWidth, size, rng);\n }\n\n // Reset shadow so patterns and highlight aren't double-shadowed\n ctx.shadowBlur = 0;\n ctx.shadowOffsetX = 0;\n ctx.shadowOffsetY = 0;\n ctx.shadowColor = \"transparent\";\n\n // ── Specular highlight — bright arc on the light-facing side ──\n if (lightAngle !== undefined && size > 15 && rng) {\n const hlRadius = size * 0.35;\n const hlDist = size * 0.15;\n const hlX = Math.cos(lightAngle) * hlDist;\n const hlY = Math.sin(lightAngle) * hlDist;\n const hlGrad = ctx.createRadialGradient(hlX, hlY, 0, hlX, hlY, hlRadius);\n hlGrad.addColorStop(0, \"rgba(255,255,255,0.18)\");\n hlGrad.addColorStop(0.5, \"rgba(255,255,255,0.05)\");\n hlGrad.addColorStop(1, \"rgba(255,255,255,0)\");\n const savedOp = ctx.globalCompositeOperation;\n ctx.globalCompositeOperation = \"soft-light\";\n ctx.fillStyle = hlGrad;\n ctx.beginPath();\n ctx.arc(hlX, hlY, hlRadius, 0, Math.PI * 2);\n ctx.fill();\n ctx.globalCompositeOperation = savedOp;\n }\n\n // Layer additional patterns if specified\n if (patterns.length > 0) {\n PatternCombiner.layerPatterns(ctx, patterns, {\n baseSize: size,\n baseOpacity,\n opacityReduction,\n proportionType,\n });\n }\n\n ctx.restore();\n}\n\n// ── Shape mirroring effect ──────────────────────────────────────────\n// Draws a shape and its mirror (reflected across an axis) for visual\n// symmetry. Works especially well with basic shapes like triangles,\n// crescents, and penrose tiles.\n\nexport type MirrorAxis = \"horizontal\" | \"vertical\" | \"diagonal\" | \"radial-4\";\n\n/**\n * Draw a shape with a mirrored reflection.\n * The mirror is drawn at reduced opacity with optional offset.\n */\nexport function drawMirroredShape(\n ctx: CanvasRenderingContext2D,\n shape: string,\n x: number,\n y: number,\n config: EnhanceShapeConfig & { mirrorAxis?: MirrorAxis; mirrorGap?: number },\n): void {\n const { mirrorAxis = \"horizontal\", mirrorGap = 0 } = config;\n\n // Draw the primary shape\n enhanceShapeGeneration(ctx, shape, x, y, config);\n\n // Draw the mirrored copy\n ctx.save();\n const savedAlpha = ctx.globalAlpha;\n ctx.globalAlpha = savedAlpha * 0.7; // mirror is slightly softer\n\n switch (mirrorAxis) {\n case \"horizontal\":\n // Reflect across vertical axis at shape position\n enhanceShapeGeneration(ctx, shape, x, y + mirrorGap, {\n ...config,\n rotation: -(config.rotation || 0),\n size: config.size * 0.95,\n });\n break;\n case \"vertical\":\n enhanceShapeGeneration(ctx, shape, x + mirrorGap, y, {\n ...config,\n rotation: 180 - (config.rotation || 0),\n size: config.size * 0.95,\n });\n break;\n case \"diagonal\":\n // Reflect across 45° axis\n enhanceShapeGeneration(ctx, shape, x + mirrorGap * 0.7, y + mirrorGap * 0.7, {\n ...config,\n rotation: 90 - (config.rotation || 0),\n size: config.size * 0.9,\n });\n break;\n case \"radial-4\":\n // Four-way radial mirror\n for (let i = 1; i < 4; i++) {\n const angle = (i / 4) * Math.PI * 2;\n const mx = x + Math.cos(angle) * mirrorGap;\n const my = y + Math.sin(angle) * mirrorGap;\n ctx.globalAlpha = savedAlpha * (0.7 - i * 0.1);\n enhanceShapeGeneration(ctx, shape, mx, my, {\n ...config,\n rotation: (config.rotation || 0) + i * 90,\n size: config.size * (0.95 - i * 0.05),\n });\n }\n break;\n }\n\n ctx.globalAlpha = savedAlpha;\n ctx.restore();\n}\n\n/**\n * Pick a mirror axis deterministically.\n * Returns null ~60% of the time (no mirroring).\n */\nexport function pickMirrorAxis(rng: () => number): MirrorAxis | null {\n const roll = rng();\n if (roll < 0.60) return null;\n if (roll < 0.75) return \"horizontal\";\n if (roll < 0.87) return \"vertical\";\n if (roll < 0.95) return \"diagonal\";\n return \"radial-4\";\n}\n","import { basicShapes } from \"./basic\";\nimport { complexShapes } from \"./complex\";\nimport { sacredShapes } from \"./sacred\";\nimport { proceduralShapes } from \"./procedural\";\n\ntype DrawFunction = (\n ctx: CanvasRenderingContext2D,\n size: number,\n config?: any,\n) => void;\n\nexport const shapes: Record<string, DrawFunction> = {\n ...basicShapes,\n ...complexShapes,\n ...sacredShapes,\n ...proceduralShapes,\n};\n","type DrawFunction = (ctx: CanvasRenderingContext2D, size: number) => void;\n\nexport const drawCircle: DrawFunction = (ctx, size) => {\n ctx.beginPath();\n ctx.arc(0, 0, size / 2, 0, Math.PI * 2);\n};\n\nexport const drawSquare: DrawFunction = (ctx, size) => {\n ctx.beginPath();\n ctx.rect(-size / 2, -size / 2, size, size);\n};\n\nexport const drawTriangle: DrawFunction = (ctx, size) => {\n ctx.beginPath();\n ctx.moveTo(0, -size / 2);\n ctx.lineTo(-size / 2, size / 2);\n ctx.lineTo(size / 2, size / 2);\n ctx.closePath();\n};\n\nexport const drawHexagon: DrawFunction = (ctx, size) => {\n ctx.beginPath();\n for (let i = 0; i < 6; i++) {\n const angle = ((Math.PI * 2) / 6) * i;\n const x = (size / 2) * Math.cos(angle);\n const y = (size / 2) * Math.sin(angle);\n if (i === 0) ctx.moveTo(x, y);\n else ctx.lineTo(x, y);\n }\n ctx.closePath();\n};\n\nexport const drawStar: DrawFunction = (ctx, size) => {\n ctx.beginPath();\n for (let i = 0; i < 10; i++) {\n const angle = Math.PI / 5 + (Math.PI / 5) * i * 3;\n const radius = i % 2 === 0 ? size / 2 : size / 4;\n const x = radius * Math.cos(angle);\n const y = radius * Math.sin(angle);\n if (i === 0) ctx.moveTo(x, y);\n else ctx.lineTo(x, y);\n }\n ctx.closePath();\n};\n\nexport const drawJackedStar: DrawFunction = (ctx, size) => {\n ctx.beginPath();\n for (let i = 0; i < 10; i++) {\n const angle = Math.PI / 30 + (Math.PI / 30) * i * 8;\n const radius = i % 2 === 0 ? size / 2 : size / 8;\n const x = radius * Math.cos(angle);\n const y = radius * Math.sin(angle);\n if (i === 0) ctx.moveTo(x, y);\n else ctx.lineTo(x, y);\n }\n ctx.closePath();\n};\n\nexport const drawHeart: DrawFunction = (ctx, size) => {\n ctx.beginPath();\n ctx.moveTo(0, size / 4);\n ctx.quadraticCurveTo(size / 2, size / 4, 0, -size / 4);\n ctx.quadraticCurveTo(-size / 2, size / 4, 0, size / 4);\n};\n\nexport const drawDiamond: DrawFunction = (ctx, size) => {\n ctx.beginPath();\n ctx.moveTo(0, -size / 2);\n ctx.lineTo(size / 2, 0);\n ctx.lineTo(0, size / 2);\n ctx.lineTo(-size / 2, 0);\n ctx.closePath();\n};\n\nexport const drawCube: DrawFunction = (ctx, size) => {\n ctx.beginPath();\n ctx.moveTo(-size / 2, -size / 2);\n ctx.lineTo(size / 2, -size / 2);\n ctx.lineTo(size / 2, size / 2);\n ctx.lineTo(-size / 2, size / 2);\n ctx.closePath();\n};\n\n// Optional: Create a shape map for easier lookup\nexport const basicShapes: Record<string, DrawFunction> = {\n circle: drawCircle,\n square: drawSquare,\n triangle: drawTriangle,\n hexagon: drawHexagon,\n star: drawStar,\n \"jacked-star\": drawJackedStar,\n heart: drawHeart,\n diamond: drawDiamond,\n cube: drawCube,\n};\n","import { defaultShapeConfig } from \"../../constants\";\nimport { applyTransforms, createCirclePoints, restoreContext } from \"./utils\";\n\ninterface PlatonicSolidConfig {\n vertices: number;\n faces: number;\n}\n\ninterface FibonacciConfig {\n iterations: number;\n growthFactor: number;\n}\n\ninterface GoldenRatioConfig {\n iterations: number;\n ratio: number;\n}\n\nexport const ShapeConfigs = {\n platonic: {\n tetrahedron: { vertices: 4, faces: 4 },\n cube: { vertices: 8, faces: 6 },\n octahedron: { vertices: 6, faces: 8 },\n dodecahedron: { vertices: 20, faces: 12 },\n icosahedron: { vertices: 12, faces: 20 },\n } as Record<string, PlatonicSolidConfig>,\n fibonacci: {\n iterations: 13,\n growthFactor: 1.618034, // Golden ratio\n } as FibonacciConfig,\n goldenRatio: {\n iterations: 8,\n ratio: 1.618034,\n } as GoldenRatioConfig,\n};\n\ninterface ShapeConfig {\n fillStyle?: string;\n strokeStyle?: string;\n lineWidth?: number;\n rotation?: number;\n iterations?: number;\n animate?: boolean;\n type?: string;\n}\n\ntype DrawFunction = (\n ctx: CanvasRenderingContext2D,\n size: number,\n config?: ShapeConfig,\n) => void;\n\nexport const drawPlatonicSolid: DrawFunction = (ctx, size, config = {}) => {\n const finalConfig = { ...defaultShapeConfig, ...config };\n applyTransforms(ctx, size, finalConfig);\n\n const solidType = config.type as keyof typeof ShapeConfigs.platonic;\n const solidConfig =\n ShapeConfigs.platonic[solidType] ?? ShapeConfigs.platonic.icosahedron;\n const {\n vertices,\n // faces\n } = solidConfig;\n const radius = size / 2;\n\n // Calculate vertices based on platonic solid type\n const points = createCirclePoints(0, 0, radius, vertices);\n\n ctx.beginPath();\n // Draw edges between vertices\n points.forEach((p1, i) => {\n points.slice(i + 1).forEach((p2) => {\n ctx.moveTo(p1.x, p1.y);\n ctx.lineTo(p2.x, p2.y);\n });\n });\n\n if (finalConfig.fillStyle !== \"transparent\") {\n ctx.fill();\n }\n ctx.stroke();\n restoreContext(ctx);\n};\n\nexport const drawFibonacciSpiral: DrawFunction = (ctx, size, config = {}) => {\n const finalConfig = {\n ...defaultShapeConfig,\n ...ShapeConfigs.fibonacci,\n ...config,\n };\n applyTransforms(ctx, size, finalConfig);\n\n let current = 1;\n let previous = 1;\n let scale = size / Math.pow(finalConfig.growthFactor, finalConfig.iterations);\n\n ctx.beginPath();\n for (let i = 0; i < finalConfig.iterations; i++) {\n const radius = scale * current;\n const centerX = radius / 2;\n const centerY = radius / 2;\n\n ctx.arc(centerX, centerY, radius, Math.PI, Math.PI * 1.5);\n\n // Calculate next Fibonacci number\n const next = current + previous;\n previous = current;\n current = next;\n\n // Transform for next iteration\n ctx.translate(radius, 0);\n ctx.rotate(Math.PI / 2);\n }\n\n ctx.stroke();\n restoreContext(ctx);\n};\n\nexport const drawIslamicPattern: DrawFunction = (ctx, size, config = {}) => {\n const finalConfig = { ...defaultShapeConfig, ...config };\n applyTransforms(ctx, size, finalConfig);\n\n const gridSize = 8;\n const unit = size / gridSize;\n\n ctx.beginPath();\n // Create base grid\n for (let i = 0; i <= gridSize; i++) {\n for (let j = 0; j <= gridSize; j++) {\n const x = (i - gridSize / 2) * unit;\n const y = (j - gridSize / 2) * unit;\n\n // Draw star pattern at each intersection\n const radius = unit / 2;\n for (let k = 0; k < 8; k++) {\n const angle = (Math.PI / 4) * k;\n const x1 = x + radius * Math.cos(angle);\n const y1 = y + radius * Math.sin(angle);\n const x2 = x + radius * Math.cos(angle + Math.PI / 4);\n const y2 = y + radius * Math.sin(angle + Math.PI / 4);\n ctx.moveTo(x1, y1);\n ctx.lineTo(x2, y2);\n }\n }\n }\n\n ctx.stroke();\n restoreContext(ctx);\n};\n\nexport const drawCelticKnot: DrawFunction = (ctx, size, config = {}) => {\n const finalConfig = { ...defaultShapeConfig, ...config };\n applyTransforms(ctx, size, finalConfig);\n\n const gridSize = 4;\n const unit = size / gridSize;\n\n const drawKnotSegment = (x: number, y: number, type: string) => {\n ctx.beginPath();\n switch (type) {\n case \"over\":\n ctx.moveTo(x, y);\n ctx.bezierCurveTo(\n x + unit / 2,\n y,\n x + unit / 2,\n y + unit,\n x + unit,\n y + unit,\n );\n break;\n case \"under\":\n ctx.moveTo(x, y + unit);\n ctx.bezierCurveTo(x + unit / 2, y + unit, x + unit / 2, y, x + unit, y);\n break;\n }\n ctx.stroke();\n };\n\n // Create knot pattern\n for (let i = 0; i < gridSize; i++) {\n for (let j = 0; j < gridSize; j++) {\n const x = (i - gridSize / 2) * unit;\n const y = (j - gridSize / 2) * unit;\n drawKnotSegment(x, y, (i + j) % 2 === 0 ? \"over\" : \"under\");\n }\n }\n\n restoreContext(ctx);\n};\n\nexport const drawMerkaba: DrawFunction = (ctx, size, config = {}) => {\n const finalConfig = { ...defaultShapeConfig, ...config };\n applyTransforms(ctx, size, finalConfig);\n\n const radius = size / 2;\n\n // Draw two intersecting tetrahedra\n ctx.beginPath();\n // First tetrahedron\n const points1 = createCirclePoints(0, 0, radius, 3);\n points1.forEach((p1, i) => {\n points1.slice(i + 1).forEach((p2) => {\n ctx.moveTo(p1.x, p1.y);\n ctx.lineTo(p2.x, p2.y);\n });\n });\n\n // Second tetrahedron (rotated)\n ctx.rotate(Math.PI / 6);\n const points2 = createCirclePoints(0, 0, radius, 3);\n points2.forEach((p1, i) => {\n points2.slice(i + 1).forEach((p2) => {\n ctx.moveTo(p1.x, p1.y);\n ctx.lineTo(p2.x, p2.y);\n });\n });\n\n if (finalConfig.fillStyle !== \"transparent\") {\n ctx.fill();\n }\n ctx.stroke();\n restoreContext(ctx);\n};\n\nexport const drawMandala: DrawFunction = (ctx, size, config = {}) => {\n const finalConfig = { ...defaultShapeConfig, ...config };\n applyTransforms(ctx, size, finalConfig);\n\n const numCircles = 8;\n const numPoints = 16;\n const radius = size / 2;\n\n ctx.beginPath();\n for (let i = 1; i <= numCircles; i++) {\n const circleRadius = (radius / numCircles) * i;\n ctx.moveTo(circleRadius, 0);\n ctx.arc(0, 0, circleRadius, 0, Math.PI * 2);\n\n for (let j = 0; j < numPoints; j++) {\n const angle = (Math.PI * 2 * j) / numPoints;\n const x = circleRadius * Math.cos(angle);\n const y = circleRadius * Math.sin(angle);\n ctx.moveTo(0, 0);\n ctx.lineTo(x, y);\n }\n }\n\n ctx.stroke();\n restoreContext(ctx);\n};\n\nexport const drawFractal: DrawFunction = (ctx, size, config = {}) => {\n const finalConfig = { ...defaultShapeConfig, ...config, iterations: 5 };\n applyTransforms(ctx, size, finalConfig);\n\n const drawBranch = (\n x: number,\n y: number,\n length: number,\n angle: number,\n depth: number,\n ) => {\n if (depth === 0) return;\n\n const endX = x + length * Math.cos(angle);\n const endY = y + length * Math.sin(angle);\n\n ctx.beginPath();\n ctx.moveTo(x, y);\n ctx.lineTo(endX, endY);\n ctx.stroke();\n\n drawBranch(endX, endY, length * 0.7, angle - Math.PI / 6, depth - 1);\n drawBranch(endX, endY, length * 0.7, angle + Math.PI / 6, depth - 1);\n };\n\n drawBranch(0, size / 2, size / 4, -Math.PI / 2, finalConfig.iterations);\n restoreContext(ctx);\n};\n\nexport const complexShapes: Record<string, DrawFunction> = {\n platonicSolid: drawPlatonicSolid,\n fibonacciSpiral: drawFibonacciSpiral,\n islamicPattern: drawIslamicPattern,\n celticKnot: drawCelticKnot,\n merkaba: drawMerkaba,\n mandala: drawMandala,\n fractal: drawFractal,\n};\n","// Define interfaces for our configurations\ninterface PresetConfig {\n hash: string;\n width: number;\n height: number;\n gridSize?: number;\n shapesPerLayer?: number;\n layers?: number;\n baseOpacity?: number;\n minShapeSize?: number;\n maxShapeSize?: number;\n}\n\ninterface ShapeConfig {\n strokeStyle: string;\n fillStyle: string;\n lineWidth: number;\n rotation: number;\n iterations: number;\n animate: boolean;\n}\n\n// Define the type for PRESETS\ntype Presets = {\n [key: string]: PresetConfig;\n};\n\nexport const PRESETS: Presets = {\n // Standard sizes with different hashes\n react: {\n hash: \"46192e59d42f741c761cbea79462a8b3815dd905\",\n width: 1024,\n height: 1024,\n },\n angular: {\n hash: \"f31a6c3e94420f43c0cd323a5a6a99376ee59ff8\",\n width: 1024,\n height: 1024,\n gridSize: 6, // Higher density grid\n },\n // Wide format variations\n banner: {\n hash: \"d847ffd4269b22c54d6e85ad3c1892a298e961fb\",\n width: 1920,\n height: 480,\n gridSize: 8, // More horizontal cells for wide format\n shapesPerLayer: 40,\n },\n ultrawide: {\n hash: \"a3e126e537ed2cd11ddf3a96c37066e97c7afee6\",\n width: 3440,\n height: 1440,\n gridSize: 12, // Extra wide needs more cells\n shapesPerLayer: 60,\n },\n // Social media sizes\n \"instagram-square\": {\n hash: \"ff00ff00ff00ff00ff00ff00ff00ff00ff00ff0\",\n width: 1080,\n height: 1080,\n },\n \"instagram-story\": {\n hash: \"abc123def456abc123def456abc123def456abc1\",\n width: 1080,\n height: 1920,\n gridSize: 6,\n layers: 6,\n },\n \"twitter-header\": {\n hash: \"7777777777777777777777777777777777777777\",\n width: 1500,\n height: 500,\n gridSize: 8,\n shapesPerLayer: 35,\n },\n \"linkedin-banner\": {\n hash: \"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\",\n width: 1584,\n height: 396,\n gridSize: 8,\n shapesPerLayer: 35,\n },\n // Mobile sizes\n \"phone-wallpaper\": {\n hash: \"ffffffffffffffffffffffffffffffffaaaaaaaa\",\n width: 1170,\n height: 2532, // iPhone 13 Pro size\n gridSize: 5,\n layers: 6,\n },\n \"tablet-wallpaper\": {\n hash: \"123456789abcdef0123456789abcdef012345678\",\n width: 2048,\n height: 2732, // iPad Pro size\n gridSize: 7,\n layers: 6,\n },\n // Special configurations\n minimal: {\n hash: \"000000000000000000000000000000000fffffff\",\n width: 1024,\n height: 1024,\n layers: 3,\n baseOpacity: 0.8,\n shapesPerLayer: 15,\n },\n complex: {\n hash: \"deadbeefdeadbeefdeadbeefdeadbeefdeadbeef\",\n width: 2048,\n height: 2048,\n gridSize: 8,\n layers: 7,\n shapesPerLayer: 50,\n minShapeSize: 30,\n maxShapeSize: 250,\n },\n};\n\n// Basic configuration that applies to all shapes\nexport const defaultShapeConfig: ShapeConfig = {\n strokeStyle: \"#000000\",\n fillStyle: \"transparent\",\n lineWidth: 1,\n rotation: 0,\n iterations: 1,\n animate: false, // For future use\n};\n\n// Base configuration types that can be extended per shape\nexport const ShapeConfigTypes = {\n BASIC: \"basic\",\n DETAILED: \"detailed\",\n ANIMATED: \"animated\",\n};\n\n// Golden ratio and other important proportions\nexport const Proportions = {\n GOLDEN_RATIO: 1.618034,\n SQUARE_ROOT_2: Math.sqrt(2),\n SQUARE_ROOT_3: Math.sqrt(3),\n SQUARE_ROOT_5: Math.sqrt(5),\n PI: Math.PI,\n PHI: (1 + Math.sqrt(5)) / 2,\n};\n\n// Helper for creating common sacred geometry combinations\nexport const PatternPresets = {\n flowerOfLifeMandala: (size: number) => [\n // { type: \"flowerOfLife\", config: { size } },\n { type: \"merkaba\", config: { size: size * 0.8 } },\n { type: \"sriYantra\", config: { size: size * 0.5 } },\n ],\n\n platonicProgression: (size: number) => [\n { type: \"platonicSolid\", config: { size, type: \"tetrahedron\" } },\n { type: \"platonicSolid\", config: { size: size * 0.8, type: \"cube\" } },\n { type: \"platonicSolid\", config: { size: size * 0.6, type: \"octahedron\" } },\n ],\n\n cosmicTree: (size: number) => [\n // { type: \"treeOfLife\", config: { size } },\n { type: \"fibonacciSpiral\", config: { size: size * 0.9 } },\n { type: \"metatronsCube\", config: { size: size * 0.7 } },\n ],\n};\n","interface Point {\n x: number;\n y: number;\n}\n\ninterface ShapeConfig {\n rotation?: number;\n lineWidth: number;\n strokeStyle: string;\n fillStyle: string;\n}\n\ninterface AnimationConfig {\n enabled: boolean;\n duration: number;\n easing: string;\n type: string;\n}\n\nexport const degToRad = (degrees: number): number => (degrees * Math.PI) / 180;\n\nexport const applyTransforms = (\n ctx: CanvasRenderingContext2D,\n size: number,\n config: ShapeConfig,\n): void => {\n ctx.save();\n ctx.translate(0, 0);\n if (config.rotation) {\n ctx.rotate(degToRad(config.rotation));\n }\n ctx.lineWidth = config.lineWidth;\n ctx.strokeStyle = config.strokeStyle;\n ctx.fillStyle = config.fillStyle;\n};\n\nexport const restoreContext = (ctx: CanvasRenderingContext2D): void => {\n ctx.restore();\n};\n\n// Animation configuration stub for future use\nexport const createAnimationConfig = (type: string): AnimationConfig => ({\n enabled: false,\n duration: 1000,\n easing: \"linear\",\n type,\n // Add more animation-specific properties as needed\n});\n\nexport const createCirclePoints = (\n cx: number,\n cy: number,\n radius: number,\n segments: number,\n): Point[] => {\n const points: Point[] = [];\n for (let i = 0; i < segments; i++) {\n const angle = (i / segments) * Math.PI * 2;\n points.push({\n x: cx + Math.cos(angle) * radius,\n y: cy + Math.sin(angle) * radius,\n });\n }\n return points;\n};\n","import { createCirclePoints } from \"./utils\";\n\ntype DrawFunction = (ctx: CanvasRenderingContext2D, size: number) => void;\n\ninterface Point {\n x: number;\n y: number;\n}\n\nexport const drawFlowerOfLife: DrawFunction = (ctx, size) => {\n const radius = size / 6;\n const centers: Point[] = [\n { x: 0, y: 0 },\n { x: radius * Math.sqrt(3), y: 0 },\n { x: (radius * Math.sqrt(3)) / 2, y: 1.5 * radius },\n { x: (-radius * Math.sqrt(3)) / 2, y: 1.5 * radius },\n { x: -radius * Math.sqrt(3), y: 0 },\n { x: (-radius * Math.sqrt(3)) / 2, y: -1.5 * radius },\n { x: (radius * Math.sqrt(3)) / 2, y: -1.5 * radius },\n ];\n\n ctx.beginPath();\n centers.forEach((center) => {\n ctx.moveTo(center.x + radius, center.y);\n ctx.arc(center.x, center.y, radius, 0, Math.PI * 2);\n });\n};\n\nexport const drawTreeOfLife: DrawFunction = (ctx, size) => {\n const radius = size / 12;\n const spacing = radius * 2.5;\n\n // Sephirot positions (traditional layout)\n const positions: Point[] = [\n { x: 0, y: -spacing * 2 }, // Kether\n { x: -spacing, y: -spacing }, // Chokmah\n { x: spacing, y: -spacing }, // Binah\n { x: -spacing, y: 0 }, // Chesed\n { x: spacing, y: 0 }, // Geburah\n { x: 0, y: 0 }, // Tiphereth\n { x: -spacing, y: spacing }, // Netzach\n { x: spacing, y: spacing }, // Hod\n { x: 0, y: spacing * 2 }, // Yesod\n { x: 0, y: spacing * 3 }, // Malkuth\n ];\n\n // Draw circles\n ctx.beginPath();\n positions.forEach((pos) => {\n ctx.moveTo(pos.x + radius, pos.y);\n ctx.arc(pos.x, pos.y, radius, 0, Math.PI * 2);\n });\n\n // Draw connecting lines\n ctx.moveTo(positions[0].x, positions[0].y);\n positions.forEach((pos, i) => {\n if (i > 0) {\n positions.slice(i + 1).forEach((nextPos) => {\n ctx.moveTo(pos.x, pos.y);\n ctx.lineTo(nextPos.x, nextPos.y);\n });\n }\n });\n};\n\nexport const drawMetatronsCube: DrawFunction = (ctx, size) => {\n const radius = size / 3;\n\n // Create 13 points - one center and 12 vertices of an icosahedron\n\n // const phi = (1 + Math.sqrt(5)) / 2; // Golden ratio\n\n const vertices: Point[] = [\n { x: 0, y: 0 }, // Center point\n ...createCirclePoints(0, 0, radius, 6), // Inner hexagon\n ...createCirclePoints(0, 0, radius * 1.5, 6), // Outer hexagon\n ];\n\n ctx.beginPath();\n // Draw all connecting lines\n vertices.forEach((v1, i) => {\n vertices.slice(i + 1).forEach((v2) => {\n ctx.moveTo(v1.x, v1.y);\n ctx.lineTo(v2.x, v2.y);\n });\n });\n};\n\nexport const drawSriYantra: DrawFunction = (ctx, size) => {\n const radius = size / 2;\n ctx.beginPath();\n\n // Draw outer triangles\n for (let i = 0; i < 9; i++) {\n const angle = (i / 9) * Math.PI * 2;\n const x1 = Math.cos(angle) * radius;\n const y1 = Math.sin(angle) * radius;\n const x2 = Math.cos(angle + Math.PI / 9) * radius;\n const y2 = Math.sin(angle + Math.PI / 9) * radius;\n\n ctx.moveTo(0, 0);\n ctx.lineTo(x1, y1);\n ctx.lineTo(x2, y2);\n ctx.lineTo(0, 0);\n }\n\n // Draw inner triangles\n const innerRadius = radius * 0.6;\n for (let i = 0; i < 9; i++) {\n const angle = (i / 9) * Math.PI * 2 + Math.PI / 18;\n const x1 = Math.cos(angle) * innerRadius;\n const y1 = Math.sin(angle) * innerRadius;\n const x2 = Math.cos(angle + Math.PI / 9) * innerRadius;\n const y2 = Math.sin(angle + Math.PI / 9) * innerRadius;\n\n ctx.moveTo(0, 0);\n ctx.lineTo(x1, y1);\n ctx.lineTo(x2, y2);\n ctx.lineTo(0, 0);\n }\n};\n\nexport const drawSeedOfLife: DrawFunction = (ctx, size) => {\n const radius = size / 6;\n const centers: Point[] = [\n { x: 0, y: 0 },\n { x: radius * Math.sqrt(3), y: 0 },\n { x: (radius * Math.sqrt(3)) / 2, y: 1.5 * radius },\n { x: (-radius * Math.sqrt(3)) / 2, y: 1.5 * radius },\n { x: -radius * Math.sqrt(3), y: 0 },\n { x: (-radius * Math.sqrt(3)) / 2, y: -1.5 * radius },\n { x: (radius * Math.sqrt(3)) / 2, y: -1.5 * radius },\n ];\n\n ctx.beginPath();\n centers.forEach((center) => {\n ctx.moveTo(center.x + radius, center.y);\n ctx.arc(center.x, center.y, radius, 0, Math.PI * 2);\n });\n};\n\nexport const drawVesicaPiscis: DrawFunction = (ctx, size) => {\n const radius = size / 4;\n ctx.beginPath();\n ctx.arc(-radius / 2, 0, radius, 0, Math.PI * 2);\n ctx.arc(radius / 2, 0, radius, 0, Math.PI * 2);\n};\n\nexport const drawTorus: DrawFunction = (ctx, size) => {\n const outerRadius = size / 2;\n const innerRadius = size / 4;\n const steps = 36;\n\n ctx.beginPath();\n for (let i = 0; i < steps; i++) {\n const angle1 = (i / steps) * Math.PI * 2;\n // const angle2 = ((i + 1) / steps) * Math.PI * 2;\n\n for (let j = 0; j < steps; j++) {\n const phi1 = (j / steps) * Math.PI * 2;\n const phi2 = ((j + 1) / steps) * Math.PI * 2;\n\n const x1 =\n (outerRadius + innerRadius * Math.cos(phi1)) * Math.cos(angle1);\n const y1 =\n (outerRadius + innerRadius * Math.cos(phi1)) * Math.sin(angle1);\n const x2 =\n (outerRadius + innerRadius * Math.cos(phi2)) * Math.cos(angle1);\n const y2 =\n (outerRadius + innerRadius * Math.cos(phi2)) * Math.sin(angle1);\n\n ctx.moveTo(x1, y1);\n ctx.lineTo(x2, y2);\n }\n }\n};\n\nexport const drawEggOfLife: DrawFunction = (ctx, size) => {\n const radius = size / 8;\n const centers: Point[] = [\n { x: 0, y: 0 },\n { x: radius * 2, y: 0 },\n { x: radius, y: radius * Math.sqrt(3) },\n { x: -radius, y: radius * Math.sqrt(3) },\n { x: -radius * 2, y: 0 },\n { x: -radius, y: -radius * Math.sqrt(3) },\n { x: radius, y: -radius * Math.sqrt(3) },\n ];\n\n ctx.beginPath();\n centers.forEach((center) => {\n ctx.moveTo(center.x + radius, center.y);\n ctx.arc(center.x, center.y, radius, 0, Math.PI * 2);\n });\n};\n\nexport const sacredShapes: Record<string, DrawFunction> = {\n flowerOfLife: drawFlowerOfLife,\n treeOfLife: drawTreeOfLife,\n metatronsCube: drawMetatronsCube,\n sriYantra: drawSriYantra,\n seedOfLife: drawSeedOfLife,\n vesicaPiscis: drawVesicaPiscis,\n torus: drawTorus,\n eggOfLife: drawEggOfLife,\n};\n","/**\n * Procedural shape generators — hash-derived shapes that are unique\n * per generation. Unlike the fixed shape library, these produce geometry\n * that doesn't repeat across hashes.\n *\n * All draw functions accept an RNG via the config parameter so the\n * shapes are deterministic from the hash.\n */\n\ntype DrawFunction = (\n ctx: CanvasRenderingContext2D,\n size: number,\n config?: any,\n) => void;\n\n// ── Blob: organic closed curve via cubic bezier ─────────────────────\n\nexport const drawBlob: DrawFunction = (ctx, size, config) => {\n const rng: () => number = config?.rng ?? Math.random;\n const r = size / 2;\n const numPoints = 5 + Math.floor(rng() * 5);\n const points: Array<{ x: number; y: number }> = [];\n\n for (let i = 0; i < numPoints; i++) {\n const angle = (i / numPoints) * Math.PI * 2;\n const jitter = 0.5 + rng() * 0.5;\n points.push({\n x: Math.cos(angle) * r * jitter,\n y: Math.sin(angle) * r * jitter,\n });\n }\n\n ctx.beginPath();\n const last = points[points.length - 1];\n const first = points[0];\n ctx.moveTo((last.x + first.x) / 2, (last.y + first.y) / 2);\n\n for (let i = 0; i < numPoints; i++) {\n const curr = points[i];\n const next = points[(i + 1) % numPoints];\n ctx.quadraticCurveTo(curr.x, curr.y, (curr.x + next.x) / 2, (curr.y + next.y) / 2);\n }\n ctx.closePath();\n};\n\n// ── Ngon: irregular polygon with hash-controlled vertices ───────────\n\nexport const drawNgon: DrawFunction = (ctx, size, config) => {\n const rng: () => number = config?.rng ?? Math.random;\n const r = size / 2;\n const sides = 3 + Math.floor(rng() * 10);\n const jitterAmount = 0.1 + rng() * 0.4;\n\n ctx.beginPath();\n for (let i = 0; i < sides; i++) {\n const angle = (i / sides) * Math.PI * 2 - Math.PI / 2;\n const radiusJitter = 1 - jitterAmount + rng() * jitterAmount * 2;\n const x = Math.cos(angle) * r * radiusJitter;\n const y = Math.sin(angle) * r * radiusJitter;\n if (i === 0) ctx.moveTo(x, y);\n else ctx.lineTo(x, y);\n }\n ctx.closePath();\n};\n\n// ── Lissajous: parametric curves with hash-derived frequency ratios ─\n\nexport const drawLissajous: DrawFunction = (ctx, size, config) => {\n const rng: () => number = config?.rng ?? Math.random;\n const r = size / 2;\n const freqA = 1 + Math.floor(rng() * 5);\n const freqB = 1 + Math.floor(rng() * 5);\n const phase = rng() * Math.PI;\n const steps = 120;\n\n ctx.beginPath();\n for (let i = 0; i <= steps; i++) {\n const t = (i / steps) * Math.PI * 2;\n const x = Math.sin(freqA * t + phase) * r;\n const y = Math.sin(freqB * t) * r;\n if (i === 0) ctx.moveTo(x, y);\n else ctx.lineTo(x, y);\n }\n ctx.closePath();\n};\n\n// ── Superellipse: |x|^n + |y|^n = 1 with hash-derived exponent ─────\n\nexport const drawSuperellipse: DrawFunction = (ctx, size, config) => {\n const rng: () => number = config?.rng ?? Math.random;\n const r = size / 2;\n const n = 0.3 + rng() * 4.7;\n const steps = 120;\n\n ctx.beginPath();\n for (let i = 0; i <= steps; i++) {\n const t = (i / steps) * Math.PI * 2;\n const cosT = Math.cos(t);\n const sinT = Math.sin(t);\n const x = Math.sign(cosT) * Math.pow(Math.abs(cosT), 2 / n) * r;\n const y = Math.sign(sinT) * Math.pow(Math.abs(sinT), 2 / n) * r;\n if (i === 0) ctx.moveTo(x, y);\n else ctx.lineTo(x, y);\n }\n ctx.closePath();\n};\n\n// ── Spirograph: hypotrochoid curves ─────────────────────────────────\n\nexport const drawSpirograph: DrawFunction = (ctx, size, config) => {\n const rng: () => number = config?.rng ?? Math.random;\n const scale = size / 2;\n const R = 1;\n const r = 0.2 + rng() * 0.6;\n const d = 0.3 + rng() * 0.7;\n const gcd = (a: number, b: number): number => {\n const ai = Math.round(a * 1000);\n const bi = Math.round(b * 1000);\n const g = (x: number, y: number): number => (y === 0 ? x : g(y, x % y));\n return g(ai, bi) / 1000;\n };\n const period = r / gcd(R, r);\n const maxT = Math.min(period, 10) * Math.PI * 2;\n const steps = Math.min(600, Math.floor(maxT * 20));\n\n ctx.beginPath();\n for (let i = 0; i <= steps; i++) {\n const t = (i / steps) * maxT;\n const x = ((R - r) * Math.cos(t) + d * Math.cos(((R - r) / r) * t)) * scale / (1 + d);\n const y = ((R - r) * Math.sin(t) - d * Math.sin(((R - r) / r) * t)) * scale / (1 + d);\n if (i === 0) ctx.moveTo(x, y);\n else ctx.lineTo(x, y);\n }\n ctx.closePath();\n};\n\n// ── Wave ring: concentric ring with sinusoidal displacement ─────────\n\nexport const drawWaveRing: DrawFunction = (ctx, size, config) => {\n const rng: () => number = config?.rng ?? Math.random;\n const r = size / 2;\n const rings = 2 + Math.floor(rng() * 4);\n const freq = 3 + Math.floor(rng() * 12);\n const amp = 0.05 + rng() * 0.15;\n\n ctx.beginPath();\n for (let ring = 0; ring < rings; ring++) {\n const baseR = r * (0.3 + (ring / rings) * 0.7);\n const steps = 80;\n for (let i = 0; i <= steps; i++) {\n const t = (i / steps) * Math.PI * 2;\n const wave = Math.sin(t * freq + ring * 1.5) * baseR * amp;\n const x = Math.cos(t) * (baseR + wave);\n const y = Math.sin(t) * (baseR + wave);\n if (i === 0) ctx.moveTo(x, y);\n else ctx.lineTo(x, y);\n }\n }\n};\n\n// ── Rose curve: polar rose r = cos(k*theta) ────────────────────────\n\nexport const drawRose: DrawFunction = (ctx, size, config) => {\n const rng: () => number = config?.rng ?? Math.random;\n const r = size / 2;\n const k = 2 + Math.floor(rng() * 6);\n const steps = 200;\n\n ctx.beginPath();\n for (let i = 0; i <= steps; i++) {\n const theta = (i / steps) * Math.PI * 2 * (k % 2 === 0 ? 1 : 2);\n const rr = Math.cos(k * theta) * r;\n const x = rr * Math.cos(theta);\n const y = rr * Math.sin(theta);\n if (i === 0) ctx.moveTo(x, y);\n else ctx.lineTo(x, y);\n }\n ctx.closePath();\n};\n\n// ═══════════════════════════════════════════════════════════════════\n// NEW PROCEDURAL SHAPES\n// ═══════════════════════════════════════════════════════════════════\n\n// ── ShardField: cluster of angular shards (broken glass / crystals) ─\n// Generates 4-8 convex polygonal shards radiating from center.\n\nexport const drawShardField: DrawFunction = (ctx, size, config) => {\n const rng: () => number = config?.rng ?? Math.random;\n const r = size / 2;\n const shardCount = 4 + Math.floor(rng() * 5); // 4-8 shards\n\n ctx.beginPath();\n for (let s = 0; s < shardCount; s++) {\n const baseAngle = (s / shardCount) * Math.PI * 2 + (rng() - 0.5) * 0.3;\n const dist = r * (0.15 + rng() * 0.35);\n const cx = Math.cos(baseAngle) * dist;\n const cy = Math.sin(baseAngle) * dist;\n const shardSize = r * (0.2 + rng() * 0.4);\n const verts = 3 + Math.floor(rng() * 3); // 3-5 vertices per shard\n const shardAngleOffset = rng() * Math.PI * 2;\n\n for (let v = 0; v < verts; v++) {\n const angle = shardAngleOffset + (v / verts) * Math.PI * 2;\n // Elongate shards along their radial direction\n const stretch = v % 2 === 0 ? 1.0 : 0.3 + rng() * 0.4;\n const px = cx + Math.cos(angle) * shardSize * stretch;\n const py = cy + Math.sin(angle) * shardSize * stretch;\n if (v === 0) ctx.moveTo(px, py);\n else ctx.lineTo(px, py);\n }\n ctx.closePath();\n }\n};\n\n// ── VoronoiCell: single organic cell with straight edges ────────────\n// Simulates a Voronoi cell by generating a convex hull around\n// a jittered set of midpoints between center and random neighbors.\n\nexport const drawVoronoiCell: DrawFunction = (ctx, size, config) => {\n const rng: () => number = config?.rng ?? Math.random;\n const r = size / 2;\n const edgeCount = 5 + Math.floor(rng() * 4); // 5-8 edges\n const points: Array<{ angle: number; x: number; y: number }> = [];\n\n // Generate edge midpoints at varying distances\n for (let i = 0; i < edgeCount; i++) {\n const angle = (i / edgeCount) * Math.PI * 2 + (rng() - 0.5) * 0.4;\n const dist = r * (0.6 + rng() * 0.4);\n points.push({\n angle,\n x: Math.cos(angle) * dist,\n y: Math.sin(angle) * dist,\n });\n }\n // Sort by angle for proper winding\n points.sort((a, b) => a.angle - b.angle);\n\n ctx.beginPath();\n ctx.moveTo(points[0].x, points[0].y);\n for (let i = 1; i < points.length; i++) {\n ctx.lineTo(points[i].x, points[i].y);\n }\n ctx.closePath();\n};\n\n// ── Crescent: two overlapping circles subtracted ────────────────────\n// Hash controls bite size and angle of the crescent.\n\nexport const drawCrescent: DrawFunction = (ctx, size, config) => {\n const rng: () => number = config?.rng ?? Math.random;\n const r = size / 2;\n const biteSize = 0.6 + rng() * 0.3; // 60-90% of radius\n const biteOffset = r * (0.3 + rng() * 0.4);\n const biteAngle = rng() * Math.PI * 2;\n\n // Outer circle\n ctx.beginPath();\n ctx.arc(0, 0, r, 0, Math.PI * 2);\n\n // Subtract inner circle using even-odd rule\n const bx = Math.cos(biteAngle) * biteOffset;\n const by = Math.sin(biteAngle) * biteOffset;\n // Draw inner circle counter-clockwise for subtraction\n ctx.moveTo(bx + r * biteSize, by);\n ctx.arc(bx, by, r * biteSize, 0, Math.PI * 2, true);\n};\n\n// ── Tendril: tapered curving stroke that branches ───────────────────\n// Like a vine or neural dendrite. Draws as a filled tapered path.\n\nexport const drawTendril: DrawFunction = (ctx, size, config) => {\n const rng: () => number = config?.rng ?? Math.random;\n const r = size / 2;\n const segments = 12 + Math.floor(rng() * 8);\n const startAngle = rng() * Math.PI * 2;\n const curvature = (rng() - 0.5) * 0.4;\n\n // Build spine points\n const spine: Array<{ x: number; y: number }> = [];\n let angle = startAngle;\n let px = 0, py = 0;\n for (let i = 0; i <= segments; i++) {\n spine.push({ x: px, y: py });\n const stepLen = (r / segments) * (1.5 + rng() * 0.5);\n angle += curvature + (rng() - 0.5) * 0.6;\n px += Math.cos(angle) * stepLen;\n py += Math.sin(angle) * stepLen;\n }\n\n // Build tapered outline by offsetting perpendicular to spine\n ctx.beginPath();\n const leftSide: Array<{ x: number; y: number }> = [];\n const rightSide: Array<{ x: number; y: number }> = [];\n\n for (let i = 0; i < spine.length; i++) {\n const t = i / (spine.length - 1);\n const width = r * 0.12 * (1 - t * 0.9); // taper from thick to thin\n const next = spine[Math.min(i + 1, spine.length - 1)];\n const dx = next.x - spine[i].x;\n const dy = next.y - spine[i].y;\n const len = Math.hypot(dx, dy) || 1;\n const nx = -dy / len;\n const ny = dx / len;\n leftSide.push({ x: spine[i].x + nx * width, y: spine[i].y + ny * width });\n rightSide.push({ x: spine[i].x - nx * width, y: spine[i].y - ny * width });\n }\n\n ctx.moveTo(leftSide[0].x, leftSide[0].y);\n for (let i = 1; i < leftSide.length; i++) {\n ctx.lineTo(leftSide[i].x, leftSide[i].y);\n }\n for (let i = rightSide.length - 1; i >= 0; i--) {\n ctx.lineTo(rightSide[i].x, rightSide[i].y);\n }\n ctx.closePath();\n};\n\n// ── CloudForm: overlapping circles along a curved spine ─────────────\n// Like cumulus clouds — soft, billowy, organic.\n\nexport const drawCloudForm: DrawFunction = (ctx, size, config) => {\n const rng: () => number = config?.rng ?? Math.random;\n const r = size / 2;\n const lobeCount = 4 + Math.floor(rng() * 4); // 4-7 lobes\n const spineAngle = rng() * Math.PI * 2;\n const spineLen = r * 0.6;\n\n ctx.beginPath();\n for (let i = 0; i < lobeCount; i++) {\n const t = (i / (lobeCount - 1)) - 0.5; // -0.5 to 0.5\n const sx = Math.cos(spineAngle) * spineLen * t;\n const sy = Math.sin(spineAngle) * spineLen * t;\n // Offset perpendicular for cloud shape\n const perpAngle = spineAngle + Math.PI / 2;\n const perpOff = (rng() - 0.3) * r * 0.3;\n const cx = sx + Math.cos(perpAngle) * perpOff;\n const cy = sy + Math.sin(perpAngle) * perpOff;\n const lobeR = r * (0.25 + rng() * 0.2);\n ctx.moveTo(cx + lobeR, cy);\n ctx.arc(cx, cy, lobeR, 0, Math.PI * 2);\n }\n};\n\n// ── InkSplat: radial spikes with bezier curves between them ─────────\n// Like an ink drop hitting paper — organic, explosive.\n\nexport const drawInkSplat: DrawFunction = (ctx, size, config) => {\n const rng: () => number = config?.rng ?? Math.random;\n const r = size / 2;\n const spikeCount = 8 + Math.floor(rng() * 8); // 8-15 spikes\n const points: Array<{ x: number; y: number }> = [];\n\n for (let i = 0; i < spikeCount; i++) {\n const angle = (i / spikeCount) * Math.PI * 2;\n const isSpike = i % 2 === 0;\n const dist = isSpike\n ? r * (0.5 + rng() * 0.5) // spikes reach 50-100% of radius\n : r * (0.15 + rng() * 0.2); // valleys at 15-35%\n points.push({\n x: Math.cos(angle) * dist,\n y: Math.sin(angle) * dist,\n });\n }\n\n ctx.beginPath();\n ctx.moveTo(points[0].x, points[0].y);\n for (let i = 0; i < points.length; i++) {\n const curr = points[i];\n const next = points[(i + 1) % points.length];\n const cpx = (curr.x + next.x) / 2 + (rng() - 0.5) * r * 0.15;\n const cpy = (curr.y + next.y) / 2 + (rng() - 0.5) * r * 0.15;\n ctx.quadraticCurveTo(cpx, cpy, next.x, next.y);\n }\n ctx.closePath();\n};\n\n// ── GeodesicDome: subdivided icosahedron projection ─────────────────\n// Hash controls subdivision level (1-3). Projected to 2D.\n\nexport const drawGeodesicDome: DrawFunction = (ctx, size, config) => {\n const rng: () => number = config?.rng ?? Math.random;\n const r = size / 2;\n const subdivisions = 1 + Math.floor(rng() * 3); // 1-3\n\n // Start with icosahedron vertices projected to 2D\n const baseVerts = 6 + subdivisions * 4;\n const points: Array<{ x: number; y: number }> = [];\n for (let i = 0; i < baseVerts; i++) {\n const angle = (i / baseVerts) * Math.PI * 2;\n const ring = i % 2 === 0 ? 1.0 : 0.5 + rng() * 0.3;\n points.push({\n x: Math.cos(angle) * r * ring,\n y: Math.sin(angle) * r * ring,\n });\n }\n\n ctx.beginPath();\n // Draw triangulated mesh — connect each point to neighbors and center\n for (let i = 0; i < points.length; i++) {\n const next = points[(i + 1) % points.length];\n ctx.moveTo(points[i].x, points[i].y);\n ctx.lineTo(next.x, next.y);\n // Connect to center\n ctx.moveTo(points[i].x, points[i].y);\n ctx.lineTo(0, 0);\n // Cross-connect to create triangulation\n if (i % 2 === 0 && i + 2 < points.length) {\n ctx.moveTo(points[i].x, points[i].y);\n ctx.lineTo(points[i + 2].x, points[i + 2].y);\n }\n }\n // Outer ring\n ctx.moveTo(points[0].x, points[0].y);\n for (let i = 1; i < points.length; i++) {\n ctx.lineTo(points[i].x, points[i].y);\n }\n ctx.closePath();\n};\n\n// ── PenroseTile: kite or dart shape from Penrose tiling ─────────────\n// Hash selects kite vs dart and rotation.\n\nexport const drawPenroseTile: DrawFunction = (ctx, size, config) => {\n const rng: () => number = config?.rng ?? Math.random;\n const r = size / 2;\n const phi = (1 + Math.sqrt(5)) / 2; // golden ratio\n const isKite = rng() < 0.5;\n\n ctx.beginPath();\n if (isKite) {\n // Kite: two golden triangles joined at base\n const topY = -r;\n const bottomY = r * (1 / phi);\n const midY = r * (1 / phi - 1) * 0.3;\n const wingX = r * 0.6;\n ctx.moveTo(0, topY);\n ctx.lineTo(wingX, midY);\n ctx.lineTo(0, bottomY);\n ctx.lineTo(-wingX, midY);\n } else {\n // Dart: concave quadrilateral\n const topY = -r;\n const bottomY = r * 0.3;\n const midY = -r * 0.1;\n const wingX = r * 0.5;\n ctx.moveTo(0, topY);\n ctx.lineTo(wingX, midY);\n ctx.lineTo(0, bottomY);\n ctx.lineTo(-wingX, midY);\n }\n ctx.closePath();\n};\n\n// ── ReuleauxTriangle: constant-width curve ──────────────────────────\n// Three circular arcs connecting the vertices of an equilateral triangle.\n\nexport const drawReuleauxTriangle: DrawFunction = (ctx, size, config) => {\n const r = size / 2;\n // Vertices of equilateral triangle\n const verts = [];\n for (let i = 0; i < 3; i++) {\n const angle = (i / 3) * Math.PI * 2 - Math.PI / 2;\n verts.push({ x: Math.cos(angle) * r * 0.7, y: Math.sin(angle) * r * 0.7 });\n }\n // Side length = distance between vertices\n const sideLen = Math.hypot(verts[1].x - verts[0].x, verts[1].y - verts[0].y);\n\n ctx.beginPath();\n for (let i = 0; i < 3; i++) {\n const from = verts[(i + 1) % 3];\n const to = verts[(i + 2) % 3];\n const center = verts[i];\n const startAngle = Math.atan2(from.y - center.y, from.x - center.x);\n const endAngle = Math.atan2(to.y - center.y, to.x - center.x);\n if (i === 0) ctx.moveTo(from.x, from.y);\n ctx.arc(center.x, center.y, sideLen, startAngle, endAngle);\n }\n ctx.closePath();\n};\n\n// ── DotCluster: cloud of dots in a bounded region ───────────────────\n// Hash controls density, spread, and clustering.\n\nexport const drawDotCluster: DrawFunction = (ctx, size, config) => {\n const rng: () => number = config?.rng ?? Math.random;\n const r = size / 2;\n const dotCount = 15 + Math.floor(rng() * 25); // 15-39 dots\n const clusterTightness = 0.3 + rng() * 0.5;\n\n ctx.beginPath();\n for (let i = 0; i < dotCount; i++) {\n // Gaussian-ish distribution via Box-Muller approximation\n const u1 = Math.max(0.001, rng());\n const u2 = rng();\n const mag = Math.sqrt(-2 * Math.log(u1)) * clusterTightness;\n const angle = u2 * Math.PI * 2;\n const dx = Math.cos(angle) * mag * r;\n const dy = Math.sin(angle) * mag * r;\n const dotR = r * (0.02 + rng() * 0.04);\n ctx.moveTo(dx + dotR, dy);\n ctx.arc(dx, dy, dotR, 0, Math.PI * 2);\n }\n};\n\n// ── CrosshatchPatch: bounded region filled with directional lines ───\n// Like an engraving or etching mark.\n\nexport const drawCrosshatchPatch: DrawFunction = (ctx, size, config) => {\n const rng: () => number = config?.rng ?? Math.random;\n const r = size / 2;\n const angle1 = rng() * Math.PI;\n const angle2 = angle1 + Math.PI / 2 + (rng() - 0.5) * 0.3;\n const spacing = r * (0.08 + rng() * 0.08);\n const hasCross = rng() < 0.6;\n\n // Draw bounding shape (ellipse)\n const rx = r * (0.7 + rng() * 0.3);\n const ry = r * (0.5 + rng() * 0.3);\n\n // Outer boundary\n ctx.beginPath();\n ctx.ellipse(0, 0, rx, ry, 0, 0, Math.PI * 2);\n\n // Hatch lines clipped to the ellipse\n const cos1 = Math.cos(angle1);\n const sin1 = Math.sin(angle1);\n for (let d = -r; d <= r; d += spacing) {\n const lx1 = d * cos1 - r * sin1;\n const ly1 = d * sin1 + r * cos1;\n const lx2 = d * cos1 + r * sin1;\n const ly2 = d * sin1 - r * cos1;\n ctx.moveTo(lx1, ly1);\n ctx.lineTo(lx2, ly2);\n }\n\n if (hasCross) {\n const cos2 = Math.cos(angle2);\n const sin2 = Math.sin(angle2);\n for (let d = -r; d <= r; d += spacing * 1.3) {\n const lx1 = d * cos2 - r * sin2;\n const ly1 = d * sin2 + r * cos2;\n const lx2 = d * cos2 + r * sin2;\n const ly2 = d * sin2 - r * cos2;\n ctx.moveTo(lx1, ly1);\n ctx.lineTo(lx2, ly2);\n }\n }\n};\n\n// ── Shape registry ──────────────────────────────────────────────────\n\nexport const proceduralShapes: Record<string, DrawFunction> = {\n blob: drawBlob,\n ngon: drawNgon,\n lissajous: drawLissajous,\n superellipse: drawSuperellipse,\n spirograph: drawSpirograph,\n waveRing: drawWaveRing,\n rose: drawRose,\n shardField: drawShardField,\n voronoiCell: drawVoronoiCell,\n crescent: drawCrescent,\n tendril: drawTendril,\n cloudForm: drawCloudForm,\n inkSplat: drawInkSplat,\n geodesicDome: drawGeodesicDome,\n penroseTile: drawPenroseTile,\n reuleauxTriangle: drawReuleauxTriangle,\n dotCluster: drawDotCluster,\n crosshatchPatch: drawCrosshatchPatch,\n};\n","/**\n * Shape affinity system — controls which shapes look good together,\n * quality tiers for different rendering contexts, and size preferences.\n *\n * This replaces the naive \"pick any shape\" approach with intentional\n * curation that produces more cohesive compositions.\n */\n\n// ── Quality tiers ───────────────────────────────────────────────────\n// Not all shapes render equally well at all sizes or in all contexts.\n// Tier 1 shapes are visually strong at any size; Tier 3 shapes need\n// specific conditions to look good.\n\nexport type ShapeTier = 1 | 2 | 3;\n\nexport interface ShapeProfile {\n /** Visual quality tier (1 = always good, 3 = situational) */\n tier: ShapeTier;\n /** Minimum size (as fraction of maxShapeSize) before shape looks bad */\n minSizeFraction: number;\n /** Maximum size fraction — some shapes look bad when huge */\n maxSizeFraction: number;\n /** Which shapes this one composes well with */\n affinities: string[];\n /** Category for grouping */\n category: \"basic\" | \"complex\" | \"sacred\" | \"procedural\";\n /** Whether this shape works well as a hero/focal element */\n heroCandidate: boolean;\n /** Best render styles for this shape */\n bestStyles: string[];\n}\n\nexport const SHAPE_PROFILES: Record<string, ShapeProfile> = {\n // ── Basic shapes ──────────────────────────────────────────────\n circle: {\n tier: 1,\n minSizeFraction: 0.05,\n maxSizeFraction: 1.0,\n affinities: [\"circle\", \"blob\", \"hexagon\", \"flowerOfLife\", \"seedOfLife\"],\n category: \"basic\",\n heroCandidate: false,\n bestStyles: [\"fill-only\", \"watercolor\", \"fill-and-stroke\", \"hand-drawn\"],\n },\n square: {\n tier: 2,\n minSizeFraction: 0.08,\n maxSizeFraction: 0.7,\n affinities: [\"square\", \"diamond\", \"superellipse\", \"islamicPattern\"],\n category: \"basic\",\n heroCandidate: false,\n bestStyles: [\"fill-and-stroke\", \"stroke-only\", \"hatched\"],\n },\n triangle: {\n tier: 1,\n minSizeFraction: 0.06,\n maxSizeFraction: 0.9,\n affinities: [\"triangle\", \"diamond\", \"hexagon\", \"merkaba\", \"sriYantra\"],\n category: \"basic\",\n heroCandidate: false,\n bestStyles: [\"fill-and-stroke\", \"fill-only\", \"watercolor\", \"hand-drawn\"],\n },\n hexagon: {\n tier: 1,\n minSizeFraction: 0.05,\n maxSizeFraction: 1.0,\n affinities: [\"hexagon\", \"circle\", \"flowerOfLife\", \"metatronsCube\", \"triangle\"],\n category: \"basic\",\n heroCandidate: false,\n bestStyles: [\"fill-only\", \"fill-and-stroke\", \"watercolor\"],\n },\n star: {\n tier: 2,\n minSizeFraction: 0.08,\n maxSizeFraction: 0.6,\n affinities: [\"star\", \"circle\", \"mandala\", \"spirograph\"],\n category: \"basic\",\n heroCandidate: false,\n bestStyles: [\"fill-and-stroke\", \"stroke-only\", \"dashed\"],\n },\n \"jacked-star\": {\n tier: 3,\n minSizeFraction: 0.1,\n maxSizeFraction: 0.4,\n affinities: [\"star\", \"circle\"],\n category: \"basic\",\n heroCandidate: false,\n bestStyles: [\"stroke-only\", \"dashed\"],\n },\n heart: {\n tier: 3,\n minSizeFraction: 0.1,\n maxSizeFraction: 0.5,\n affinities: [\"circle\", \"blob\"],\n category: \"basic\",\n heroCandidate: false,\n bestStyles: [\"fill-only\", \"watercolor\"],\n },\n diamond: {\n tier: 2,\n minSizeFraction: 0.06,\n maxSizeFraction: 0.8,\n affinities: [\"diamond\", \"triangle\", \"square\", \"merkaba\"],\n category: \"basic\",\n heroCandidate: false,\n bestStyles: [\"fill-and-stroke\", \"fill-only\", \"double-stroke\"],\n },\n cube: {\n tier: 3,\n minSizeFraction: 0.08,\n maxSizeFraction: 0.5,\n affinities: [\"square\", \"diamond\"],\n category: \"basic\",\n heroCandidate: false,\n bestStyles: [\"stroke-only\", \"fill-and-stroke\"],\n },\n\n // ── Complex shapes ────────────────────────────────────────────\n platonicSolid: {\n tier: 2,\n minSizeFraction: 0.15,\n maxSizeFraction: 0.8,\n affinities: [\"metatronsCube\", \"merkaba\", \"hexagon\", \"triangle\"],\n category: \"complex\",\n heroCandidate: true,\n bestStyles: [\"stroke-only\", \"double-stroke\", \"dashed\"],\n },\n fibonacciSpiral: {\n tier: 1,\n minSizeFraction: 0.2,\n maxSizeFraction: 1.0,\n affinities: [\"circle\", \"rose\", \"spirograph\", \"flowerOfLife\"],\n category: \"complex\",\n heroCandidate: true,\n bestStyles: [\"stroke-only\", \"incomplete\", \"watercolor\"],\n },\n islamicPattern: {\n tier: 2,\n minSizeFraction: 0.25,\n maxSizeFraction: 0.9,\n affinities: [\"square\", \"hexagon\", \"star\", \"mandala\"],\n category: \"complex\",\n heroCandidate: true,\n bestStyles: [\"stroke-only\", \"dashed\", \"hatched\"],\n },\n celticKnot: {\n tier: 2,\n minSizeFraction: 0.2,\n maxSizeFraction: 0.7,\n affinities: [\"circle\", \"lissajous\", \"spirograph\"],\n category: \"complex\",\n heroCandidate: true,\n bestStyles: [\"stroke-only\", \"double-stroke\"],\n },\n merkaba: {\n tier: 1,\n minSizeFraction: 0.15,\n maxSizeFraction: 1.0,\n affinities: [\"triangle\", \"diamond\", \"sriYantra\", \"metatronsCube\"],\n category: \"complex\",\n heroCandidate: true,\n bestStyles: [\"stroke-only\", \"fill-and-stroke\", \"double-stroke\"],\n },\n mandala: {\n tier: 1,\n minSizeFraction: 0.2,\n maxSizeFraction: 1.0,\n affinities: [\"circle\", \"flowerOfLife\", \"spirograph\", \"rose\"],\n category: \"complex\",\n heroCandidate: true,\n bestStyles: [\"stroke-only\", \"dashed\", \"incomplete\"],\n },\n fractal: {\n tier: 2,\n minSizeFraction: 0.2,\n maxSizeFraction: 0.8,\n affinities: [\"blob\", \"lissajous\", \"circle\"],\n category: \"complex\",\n heroCandidate: true,\n bestStyles: [\"stroke-only\", \"incomplete\"],\n },\n\n // ── Sacred shapes ─────────────────────────────────────────────\n flowerOfLife: {\n tier: 1,\n minSizeFraction: 0.2,\n maxSizeFraction: 1.0,\n affinities: [\"circle\", \"hexagon\", \"seedOfLife\", \"eggOfLife\", \"metatronsCube\"],\n category: \"sacred\",\n heroCandidate: true,\n bestStyles: [\"stroke-only\", \"watercolor\", \"incomplete\"],\n },\n treeOfLife: {\n tier: 2,\n minSizeFraction: 0.25,\n maxSizeFraction: 0.9,\n affinities: [\"circle\", \"flowerOfLife\", \"metatronsCube\"],\n category: \"sacred\",\n heroCandidate: true,\n bestStyles: [\"stroke-only\", \"double-stroke\"],\n },\n metatronsCube: {\n tier: 1,\n minSizeFraction: 0.2,\n maxSizeFraction: 1.0,\n affinities: [\"hexagon\", \"flowerOfLife\", \"platonicSolid\", \"merkaba\"],\n category: \"sacred\",\n heroCandidate: true,\n bestStyles: [\"stroke-only\", \"dashed\", \"incomplete\"],\n },\n sriYantra: {\n tier: 1,\n minSizeFraction: 0.2,\n maxSizeFraction: 1.0,\n affinities: [\"triangle\", \"merkaba\", \"mandala\", \"diamond\"],\n category: \"sacred\",\n heroCandidate: true,\n bestStyles: [\"stroke-only\", \"fill-and-stroke\", \"double-stroke\"],\n },\n seedOfLife: {\n tier: 1,\n minSizeFraction: 0.15,\n maxSizeFraction: 0.9,\n affinities: [\"circle\", \"flowerOfLife\", \"eggOfLife\", \"hexagon\"],\n category: \"sacred\",\n heroCandidate: true,\n bestStyles: [\"stroke-only\", \"watercolor\", \"fill-only\"],\n },\n vesicaPiscis: {\n tier: 2,\n minSizeFraction: 0.15,\n maxSizeFraction: 0.7,\n affinities: [\"circle\", \"seedOfLife\", \"flowerOfLife\"],\n category: \"sacred\",\n heroCandidate: false,\n bestStyles: [\"stroke-only\", \"watercolor\"],\n },\n torus: {\n tier: 3,\n minSizeFraction: 0.2,\n maxSizeFraction: 0.6,\n affinities: [\"circle\", \"spirograph\", \"waveRing\"],\n category: \"sacred\",\n heroCandidate: false,\n bestStyles: [\"stroke-only\", \"dashed\"],\n },\n eggOfLife: {\n tier: 2,\n minSizeFraction: 0.15,\n maxSizeFraction: 0.8,\n affinities: [\"circle\", \"seedOfLife\", \"flowerOfLife\"],\n category: \"sacred\",\n heroCandidate: true,\n bestStyles: [\"stroke-only\", \"watercolor\"],\n },\n\n // ── Procedural shapes ─────────────────────────────────────────\n blob: {\n tier: 1,\n minSizeFraction: 0.05,\n maxSizeFraction: 1.0,\n affinities: [\"blob\", \"circle\", \"superellipse\", \"waveRing\"],\n category: \"procedural\",\n heroCandidate: false,\n bestStyles: [\"fill-only\", \"watercolor\", \"fill-and-stroke\", \"hand-drawn\"],\n },\n ngon: {\n tier: 2,\n minSizeFraction: 0.06,\n maxSizeFraction: 0.8,\n affinities: [\"hexagon\", \"triangle\", \"diamond\", \"superellipse\"],\n category: \"procedural\",\n heroCandidate: false,\n bestStyles: [\"fill-and-stroke\", \"fill-only\", \"hatched\"],\n },\n lissajous: {\n tier: 2,\n minSizeFraction: 0.15,\n maxSizeFraction: 0.8,\n affinities: [\"spirograph\", \"rose\", \"celticKnot\", \"fibonacciSpiral\"],\n category: \"procedural\",\n heroCandidate: false,\n bestStyles: [\"stroke-only\", \"incomplete\", \"dashed\"],\n },\n superellipse: {\n tier: 1,\n minSizeFraction: 0.05,\n maxSizeFraction: 1.0,\n affinities: [\"circle\", \"square\", \"blob\", \"hexagon\"],\n category: \"procedural\",\n heroCandidate: false,\n bestStyles: [\"fill-only\", \"watercolor\", \"fill-and-stroke\", \"wood-grain\"],\n },\n spirograph: {\n tier: 1,\n minSizeFraction: 0.15,\n maxSizeFraction: 0.9,\n affinities: [\"rose\", \"lissajous\", \"mandala\", \"flowerOfLife\"],\n category: \"procedural\",\n heroCandidate: true,\n bestStyles: [\"stroke-only\", \"incomplete\", \"dashed\"],\n },\n waveRing: {\n tier: 2,\n minSizeFraction: 0.1,\n maxSizeFraction: 0.8,\n affinities: [\"circle\", \"blob\", \"torus\", \"spirograph\"],\n category: \"procedural\",\n heroCandidate: false,\n bestStyles: [\"stroke-only\", \"dashed\", \"incomplete\"],\n },\n rose: {\n tier: 1,\n minSizeFraction: 0.1,\n maxSizeFraction: 0.9,\n affinities: [\"spirograph\", \"mandala\", \"flowerOfLife\", \"circle\"],\n category: \"procedural\",\n heroCandidate: true,\n bestStyles: [\"stroke-only\", \"fill-only\", \"watercolor\"],\n },\n\n // ── New procedural shapes ─────────────────────────────────────\n shardField: {\n tier: 2,\n minSizeFraction: 0.1,\n maxSizeFraction: 0.7,\n affinities: [\"voronoiCell\", \"diamond\", \"triangle\", \"penroseTile\"],\n category: \"procedural\",\n heroCandidate: false,\n bestStyles: [\"fill-and-stroke\", \"stroke-only\", \"fill-only\"],\n },\n voronoiCell: {\n tier: 1,\n minSizeFraction: 0.08,\n maxSizeFraction: 0.9,\n affinities: [\"shardField\", \"ngon\", \"superellipse\", \"blob\"],\n category: \"procedural\",\n heroCandidate: false,\n bestStyles: [\"fill-and-stroke\", \"fill-only\", \"watercolor\", \"marble-vein\"],\n },\n crescent: {\n tier: 1,\n minSizeFraction: 0.1,\n maxSizeFraction: 1.0,\n affinities: [\"circle\", \"blob\", \"cloudForm\", \"vesicaPiscis\"],\n category: \"procedural\",\n heroCandidate: true,\n bestStyles: [\"fill-only\", \"watercolor\", \"fill-and-stroke\"],\n },\n tendril: {\n tier: 2,\n minSizeFraction: 0.1,\n maxSizeFraction: 0.8,\n affinities: [\"blob\", \"inkSplat\", \"lissajous\", \"fibonacciSpiral\"],\n category: \"procedural\",\n heroCandidate: false,\n bestStyles: [\"fill-only\", \"watercolor\", \"fill-and-stroke\"],\n },\n cloudForm: {\n tier: 1,\n minSizeFraction: 0.15,\n maxSizeFraction: 1.0,\n affinities: [\"blob\", \"circle\", \"crescent\", \"superellipse\"],\n category: \"procedural\",\n heroCandidate: false,\n bestStyles: [\"fill-only\", \"watercolor\"],\n },\n inkSplat: {\n tier: 2,\n minSizeFraction: 0.1,\n maxSizeFraction: 0.8,\n affinities: [\"blob\", \"tendril\", \"shardField\", \"star\"],\n category: \"procedural\",\n heroCandidate: false,\n bestStyles: [\"fill-only\", \"watercolor\", \"fill-and-stroke\"],\n },\n geodesicDome: {\n tier: 2,\n minSizeFraction: 0.2,\n maxSizeFraction: 0.9,\n affinities: [\"metatronsCube\", \"platonicSolid\", \"hexagon\", \"triangle\"],\n category: \"procedural\",\n heroCandidate: true,\n bestStyles: [\"stroke-only\", \"dashed\", \"double-stroke\"],\n },\n penroseTile: {\n tier: 2,\n minSizeFraction: 0.06,\n maxSizeFraction: 0.6,\n affinities: [\"diamond\", \"triangle\", \"shardField\", \"voronoiCell\"],\n category: \"procedural\",\n heroCandidate: false,\n bestStyles: [\"fill-and-stroke\", \"fill-only\", \"double-stroke\"],\n },\n reuleauxTriangle: {\n tier: 1,\n minSizeFraction: 0.08,\n maxSizeFraction: 1.0,\n affinities: [\"triangle\", \"circle\", \"superellipse\", \"vesicaPiscis\"],\n category: \"procedural\",\n heroCandidate: true,\n bestStyles: [\"fill-and-stroke\", \"fill-only\", \"watercolor\"],\n },\n dotCluster: {\n tier: 3,\n minSizeFraction: 0.05,\n maxSizeFraction: 0.5,\n affinities: [\"cloudForm\", \"inkSplat\", \"blob\"],\n category: \"procedural\",\n heroCandidate: false,\n bestStyles: [\"fill-only\", \"stipple\"],\n },\n crosshatchPatch: {\n tier: 3,\n minSizeFraction: 0.1,\n maxSizeFraction: 0.6,\n affinities: [\"voronoiCell\", \"ngon\", \"superellipse\"],\n category: \"procedural\",\n heroCandidate: false,\n bestStyles: [\"stroke-only\", \"hatched\", \"fabric-weave\"],\n },\n};\n\n// ── Shape palette: curated sets of shapes that work well together ────\n\nexport interface ShapePalette {\n /** Primary shapes — used most often */\n primary: string[];\n /** Supporting shapes — used less frequently */\n supporting: string[];\n /** Accent shapes — rare, for visual punctuation */\n accents: string[];\n}\n\n/**\n * Build a curated shape palette from a seed shape.\n * Uses affinity data to select shapes that compose well together,\n * filtering out low-tier shapes that don't work at the current scale.\n */\nexport function buildShapePalette(\n rng: () => number,\n shapeNames: string[],\n archetypeName: string,\n): ShapePalette {\n const available = shapeNames.filter((s) => SHAPE_PROFILES[s]);\n\n // Pick a seed shape — tier 1 shapes that are hero candidates\n const heroPool = available.filter(\n (s) => SHAPE_PROFILES[s].tier === 1 && SHAPE_PROFILES[s].heroCandidate,\n );\n const seedShape = heroPool.length > 0\n ? heroPool[Math.floor(rng() * heroPool.length)]\n : available[Math.floor(rng() * available.length)];\n\n const seedProfile = SHAPE_PROFILES[seedShape];\n\n // Primary: seed shape + its direct affinities (tier 1-2 only)\n const primaryCandidates = [seedShape, ...seedProfile.affinities]\n .filter((s) => available.includes(s))\n .filter((s) => SHAPE_PROFILES[s].tier <= 2);\n const primary = [...new Set(primaryCandidates)].slice(0, 5);\n\n // Supporting: affinities of affinities, plus same-category shapes\n const supportingSet = new Set<string>();\n for (const p of primary) {\n const profile = SHAPE_PROFILES[p];\n if (!profile) continue;\n for (const aff of profile.affinities) {\n if (available.includes(aff) && !primary.includes(aff)) {\n supportingSet.add(aff);\n }\n }\n }\n // Add same-category tier 1-2 shapes\n for (const s of available) {\n const p = SHAPE_PROFILES[s];\n if (p.category === seedProfile.category && p.tier <= 2 && !primary.includes(s)) {\n supportingSet.add(s);\n }\n }\n const supporting = [...supportingSet].slice(0, 6);\n\n // Accents: tier 1 shapes from other categories for contrast\n const usedCategories = new Set(\n [...primary, ...supporting].map((s) => SHAPE_PROFILES[s]?.category),\n );\n const accentCandidates = available.filter(\n (s) =>\n !primary.includes(s) &&\n !supporting.includes(s) &&\n SHAPE_PROFILES[s].tier <= 2 &&\n !usedCategories.has(SHAPE_PROFILES[s].category),\n );\n // Shuffle and take a few\n const accents: string[] = [];\n const shuffled = [...accentCandidates];\n for (let i = shuffled.length - 1; i > 0; i--) {\n const j = Math.floor(rng() * (i + 1));\n [shuffled[i], shuffled[j]] = [shuffled[j], shuffled[i]];\n }\n accents.push(...shuffled.slice(0, 3));\n\n // For certain archetypes, bias the palette\n if (archetypeName === \"geometric-precision\") {\n // Remove blobs and organic shapes from primary\n return {\n primary: primary.filter((s) => SHAPE_PROFILES[s]?.category !== \"procedural\" || s === \"ngon\"),\n supporting: supporting.filter((s) => s !== \"blob\"),\n accents,\n };\n }\n if (archetypeName === \"organic-flow\") {\n // Boost procedural/organic shapes\n const organicBoost = available.filter(\n (s) => [\"blob\", \"superellipse\", \"waveRing\", \"rose\"].includes(s) && !primary.includes(s),\n );\n return {\n primary: [...primary, ...organicBoost.slice(0, 2)],\n supporting,\n accents,\n };\n }\n if (archetypeName === \"shattered-glass\") {\n // Favor angular, fragmented shapes\n const shardBoost = available.filter(\n (s) => [\"shardField\", \"voronoiCell\", \"penroseTile\", \"diamond\", \"triangle\", \"ngon\"].includes(s) && !primary.includes(s),\n );\n return {\n primary: [...primary.filter((s) => s !== \"blob\" && s !== \"cloudForm\"), ...shardBoost.slice(0, 3)],\n supporting: supporting.filter((s) => s !== \"blob\" && s !== \"cloudForm\"),\n accents,\n };\n }\n if (archetypeName === \"botanical\") {\n // Favor organic, flowing shapes\n const botanicalBoost = available.filter(\n (s) => [\"tendril\", \"cloudForm\", \"blob\", \"crescent\", \"rose\", \"inkSplat\"].includes(s) && !primary.includes(s),\n );\n return {\n primary: [...primary, ...botanicalBoost.slice(0, 3)],\n supporting,\n accents,\n };\n }\n if (archetypeName === \"stipple-portrait\") {\n // Favor small, dot-friendly shapes\n const stippleBoost = available.filter(\n (s) => [\"dotCluster\", \"circle\", \"crosshatchPatch\", \"voronoiCell\", \"blob\"].includes(s) && !primary.includes(s),\n );\n return {\n primary: [...primary, ...stippleBoost.slice(0, 3)],\n supporting,\n accents,\n };\n }\n if (archetypeName === \"celestial\") {\n // Favor sacred geometry and cosmic shapes\n const celestialBoost = available.filter(\n (s) => [\"crescent\", \"geodesicDome\", \"mandala\", \"flowerOfLife\", \"spirograph\", \"fibonacciSpiral\"].includes(s) && !primary.includes(s),\n );\n return {\n primary: [...primary, ...celestialBoost.slice(0, 3)],\n supporting,\n accents,\n };\n }\n\n return { primary, supporting, accents };\n}\n\n/**\n * Pick a shape from the palette with weighted probability.\n * Primary: ~60%, Supporting: ~30%, Accent: ~10%.\n * Also respects size constraints from the shape profile.\n */\nexport function pickShapeFromPalette(\n palette: ShapePalette,\n rng: () => number,\n sizeFraction: number,\n): string {\n // Filter each tier by size constraints\n const validPrimary = palette.primary.filter((s) => {\n const p = SHAPE_PROFILES[s];\n return p && sizeFraction >= p.minSizeFraction && sizeFraction <= p.maxSizeFraction;\n });\n const validSupporting = palette.supporting.filter((s) => {\n const p = SHAPE_PROFILES[s];\n return p && sizeFraction >= p.minSizeFraction && sizeFraction <= p.maxSizeFraction;\n });\n const validAccents = palette.accents.filter((s) => {\n const p = SHAPE_PROFILES[s];\n return p && sizeFraction >= p.minSizeFraction && sizeFraction <= p.maxSizeFraction;\n });\n\n const roll = rng();\n if (roll < 0.60 && validPrimary.length > 0) {\n return validPrimary[Math.floor(rng() * validPrimary.length)];\n }\n if (roll < 0.90 && validSupporting.length > 0) {\n return validSupporting[Math.floor(rng() * validSupporting.length)];\n }\n if (validAccents.length > 0) {\n return validAccents[Math.floor(rng() * validAccents.length)];\n }\n // Fallback: any valid primary or supporting\n const fallback = [...validPrimary, ...validSupporting];\n if (fallback.length > 0) return fallback[Math.floor(rng() * fallback.length)];\n // Ultimate fallback\n return palette.primary[0] || \"circle\";\n}\n\n/**\n * Get the best render style for a shape, with some randomness.\n * 70% chance of using one of the shape's best styles,\n * 30% chance of using the layer's style.\n */\nexport function pickStyleForShape(\n shapeName: string,\n layerStyle: string,\n rng: () => number,\n): string {\n const profile = SHAPE_PROFILES[shapeName];\n if (!profile || rng() > 0.7) return layerStyle;\n return profile.bestStyles[Math.floor(rng() * profile.bestStyles.length)];\n}\n","/**\n * Configuration options for image generation.\n */\nexport interface GenerationConfig {\n /** Canvas width in pixels (default: 2048) */\n width: number;\n /** Canvas height in pixels (default: 2048) */\n height: number;\n /** Controls base shape count per layer — gridSize² × 1.5 (default: 5) */\n gridSize: number;\n /** Number of layers to generate (default: 4) */\n layers: number;\n /** Minimum shape size in pixels, scaled to canvas (default: 30) */\n minShapeSize: number;\n /** Maximum shape size in pixels, scaled to canvas (default: 400) */\n maxShapeSize: number;\n /** Starting opacity for the first layer (default: 0.7) */\n baseOpacity: number;\n /** Opacity reduction per layer (default: 0.12) */\n opacityReduction: number;\n /** Base shapes per layer — defaults to gridSize² × 1.5 when 0 */\n shapesPerLayer: number;\n}\n\nexport const DEFAULT_CONFIG: GenerationConfig = {\n width: 2048,\n height: 2048,\n gridSize: 5,\n layers: 4,\n minShapeSize: 30,\n maxShapeSize: 400,\n baseOpacity: 0.7,\n opacityReduction: 0.12,\n shapesPerLayer: 0,\n};\n","/**\n * Visual archetypes — fundamentally different rendering personalities\n * selected deterministically from the hash.\n *\n * Each archetype overrides key rendering parameters to produce images\n * that look like they came from different generators entirely.\n */\nimport type { RenderStyle } from \"./canvas/draw\";\n\n// ── Background types ────────────────────────────────────────────────\n\nexport type BackgroundStyle =\n | \"radial-dark\" // current default: dark radial gradient\n | \"radial-light\" // light center, medium edges\n | \"linear-horizontal\" // left-to-right gradient\n | \"linear-diagonal\" // corner-to-corner gradient\n | \"solid-dark\" // flat dark color\n | \"solid-light\" // flat light/white color\n | \"multi-stop\"; // 3-4 color gradient\n\n// ── Palette modes ───────────────────────────────────────────────────\n\nexport type PaletteMode =\n | \"harmonious\" // current default: full palette\n | \"monochrome\" // single hue, varying lightness\n | \"duotone\" // two colors only\n | \"neon\" // high saturation on dark\n | \"pastel-light\" // soft pastels on light background\n | \"earth\" // muted warm naturals\n | \"high-contrast\" // black + white + one accent\n | \"split-complementary\" // base hue + two flanking complements\n | \"analogous-accent\" // tight analogous cluster + one distant accent\n | \"limited-palette\"; // 3 colors only, risograph-print feel\n\n// ── Archetype definition ────────────────────────────────────────────\n\nexport interface Archetype {\n name: string;\n /** Override gridSize (controls shape count) */\n gridSize: number;\n /** Override layer count */\n layers: number;\n /** Override base opacity */\n baseOpacity: number;\n /** Override opacity reduction per layer */\n opacityReduction: number;\n /** Override min shape size */\n minShapeSize: number;\n /** Override max shape size */\n maxShapeSize: number;\n /** Background rendering style */\n backgroundStyle: BackgroundStyle;\n /** Color palette mode */\n paletteMode: PaletteMode;\n /** Preferred render styles (weighted toward these) */\n preferredStyles: RenderStyle[];\n /** Flow line count multiplier (1 = default) */\n flowLineMultiplier: number;\n /** Whether to draw the hero shape */\n heroShape: boolean;\n /** Glow probability multiplier */\n glowMultiplier: number;\n /** Shape size power curve exponent (higher = more small shapes) */\n sizePower: number;\n /** Whether to invert colors (light shapes on dark, or dark on light) */\n invertForeground: boolean;\n}\n\n// ── Archetype definitions ───────────────────────────────────────────\n\nconst ARCHETYPES: Archetype[] = [\n {\n name: \"dense-chaotic\",\n gridSize: 9,\n layers: 5,\n baseOpacity: 0.5,\n opacityReduction: 0.06,\n minShapeSize: 10,\n maxShapeSize: 200,\n backgroundStyle: \"radial-dark\",\n paletteMode: \"harmonious\",\n preferredStyles: [\"fill-and-stroke\", \"watercolor\", \"fill-only\"],\n flowLineMultiplier: 2.5,\n heroShape: false,\n glowMultiplier: 0.5,\n sizePower: 1.2,\n invertForeground: false,\n },\n {\n name: \"minimal-spacious\",\n gridSize: 2,\n layers: 2,\n baseOpacity: 0.85,\n opacityReduction: 0.05,\n minShapeSize: 150,\n maxShapeSize: 600,\n backgroundStyle: \"solid-light\",\n paletteMode: \"duotone\",\n preferredStyles: [\"fill-and-stroke\", \"stroke-only\", \"incomplete\"],\n flowLineMultiplier: 0.3,\n heroShape: true,\n glowMultiplier: 0,\n sizePower: 0.8,\n invertForeground: false,\n },\n {\n name: \"organic-flow\",\n gridSize: 4,\n layers: 3,\n baseOpacity: 0.4,\n opacityReduction: 0.08,\n minShapeSize: 20,\n maxShapeSize: 250,\n backgroundStyle: \"radial-dark\",\n paletteMode: \"earth\",\n preferredStyles: [\"watercolor\", \"fill-only\", \"incomplete\"],\n flowLineMultiplier: 4,\n heroShape: false,\n glowMultiplier: 0.3,\n sizePower: 1.5,\n invertForeground: false,\n },\n {\n name: \"geometric-precision\",\n gridSize: 6,\n layers: 3,\n baseOpacity: 0.9,\n opacityReduction: 0.15,\n minShapeSize: 40,\n maxShapeSize: 300,\n backgroundStyle: \"solid-dark\",\n paletteMode: \"high-contrast\",\n preferredStyles: [\"stroke-only\", \"dashed\", \"double-stroke\", \"hatched\"],\n flowLineMultiplier: 0,\n heroShape: false,\n glowMultiplier: 0,\n sizePower: 1.0,\n invertForeground: false,\n },\n {\n name: \"ethereal\",\n gridSize: 7,\n layers: 5,\n baseOpacity: 0.3,\n opacityReduction: 0.03,\n minShapeSize: 50,\n maxShapeSize: 500,\n backgroundStyle: \"radial-light\",\n paletteMode: \"pastel-light\",\n preferredStyles: [\"watercolor\", \"incomplete\", \"fill-only\"],\n flowLineMultiplier: 1.5,\n heroShape: true,\n glowMultiplier: 2,\n sizePower: 1.4,\n invertForeground: false,\n },\n {\n name: \"bold-graphic\",\n gridSize: 2,\n layers: 2,\n baseOpacity: 0.95,\n opacityReduction: 0.1,\n minShapeSize: 200,\n maxShapeSize: 800,\n backgroundStyle: \"linear-diagonal\",\n paletteMode: \"duotone\",\n preferredStyles: [\"fill-and-stroke\", \"double-stroke\"],\n flowLineMultiplier: 0,\n heroShape: true,\n glowMultiplier: 0,\n sizePower: 0.5,\n invertForeground: false,\n },\n {\n name: \"neon-glow\",\n gridSize: 5,\n layers: 4,\n baseOpacity: 0.6,\n opacityReduction: 0.1,\n minShapeSize: 20,\n maxShapeSize: 350,\n backgroundStyle: \"solid-dark\",\n paletteMode: \"neon\",\n preferredStyles: [\"stroke-only\", \"double-stroke\", \"dashed\"],\n flowLineMultiplier: 2,\n heroShape: true,\n glowMultiplier: 3,\n sizePower: 1.6,\n invertForeground: false,\n },\n {\n name: \"monochrome-ink\",\n gridSize: 6,\n layers: 3,\n baseOpacity: 0.7,\n opacityReduction: 0.15,\n minShapeSize: 15,\n maxShapeSize: 350,\n backgroundStyle: \"solid-light\",\n paletteMode: \"monochrome\",\n preferredStyles: [\"hatched\", \"incomplete\", \"stroke-only\", \"dashed\"],\n flowLineMultiplier: 1.5,\n heroShape: false,\n glowMultiplier: 0,\n sizePower: 1.8,\n invertForeground: false,\n },\n {\n name: \"cosmic\",\n gridSize: 8,\n layers: 5,\n baseOpacity: 0.5,\n opacityReduction: 0.06,\n minShapeSize: 5,\n maxShapeSize: 300,\n backgroundStyle: \"radial-dark\",\n paletteMode: \"neon\",\n preferredStyles: [\"fill-only\", \"watercolor\", \"fill-and-stroke\"],\n flowLineMultiplier: 3,\n heroShape: true,\n glowMultiplier: 2.5,\n sizePower: 2.5,\n invertForeground: false,\n },\n {\n name: \"watercolor-wash\",\n gridSize: 3,\n layers: 3,\n baseOpacity: 0.25,\n opacityReduction: 0.03,\n minShapeSize: 200,\n maxShapeSize: 700,\n backgroundStyle: \"radial-light\",\n paletteMode: \"harmonious\",\n preferredStyles: [\"watercolor\", \"fill-only\", \"incomplete\"],\n flowLineMultiplier: 0.5,\n heroShape: false,\n glowMultiplier: 0.3,\n sizePower: 0.6,\n invertForeground: false,\n },\n {\n name: \"op-art\",\n gridSize: 8,\n layers: 2,\n baseOpacity: 0.95,\n opacityReduction: 0.05,\n minShapeSize: 20,\n maxShapeSize: 200,\n backgroundStyle: \"solid-light\",\n paletteMode: \"high-contrast\",\n preferredStyles: [\"fill-and-stroke\", \"stroke-only\", \"dashed\"],\n flowLineMultiplier: 0,\n heroShape: false,\n glowMultiplier: 0,\n sizePower: 0.4,\n invertForeground: false,\n },\n {\n name: \"collage\",\n gridSize: 4,\n layers: 3,\n baseOpacity: 0.9,\n opacityReduction: 0.08,\n minShapeSize: 80,\n maxShapeSize: 500,\n backgroundStyle: \"solid-light\",\n paletteMode: \"duotone\",\n preferredStyles: [\"fill-and-stroke\", \"fill-only\", \"double-stroke\"],\n flowLineMultiplier: 0,\n heroShape: true,\n glowMultiplier: 0,\n sizePower: 0.7,\n invertForeground: false,\n },\n {\n name: \"classic\",\n gridSize: 5,\n layers: 4,\n baseOpacity: 0.7,\n opacityReduction: 0.12,\n minShapeSize: 30,\n maxShapeSize: 400,\n backgroundStyle: \"radial-dark\",\n paletteMode: \"harmonious\",\n preferredStyles: [\"fill-and-stroke\", \"watercolor\", \"fill-only\"],\n flowLineMultiplier: 1,\n heroShape: true,\n glowMultiplier: 1,\n sizePower: 1.8,\n invertForeground: false,\n },\n {\n name: \"shattered-glass\",\n gridSize: 8,\n layers: 3,\n baseOpacity: 0.85,\n opacityReduction: 0.1,\n minShapeSize: 15,\n maxShapeSize: 250,\n backgroundStyle: \"solid-dark\",\n paletteMode: \"high-contrast\",\n preferredStyles: [\"fill-and-stroke\", \"stroke-only\", \"fill-only\"],\n flowLineMultiplier: 0,\n heroShape: false,\n glowMultiplier: 0.3,\n sizePower: 1.0,\n invertForeground: false,\n },\n {\n name: \"botanical\",\n gridSize: 4,\n layers: 4,\n baseOpacity: 0.5,\n opacityReduction: 0.06,\n minShapeSize: 30,\n maxShapeSize: 400,\n backgroundStyle: \"radial-light\",\n paletteMode: \"earth\",\n preferredStyles: [\"watercolor\", \"fill-only\", \"incomplete\"],\n flowLineMultiplier: 3,\n heroShape: true,\n glowMultiplier: 0.2,\n sizePower: 1.6,\n invertForeground: false,\n },\n {\n name: \"stipple-portrait\",\n gridSize: 9,\n layers: 2,\n baseOpacity: 0.8,\n opacityReduction: 0.05,\n minShapeSize: 5,\n maxShapeSize: 120,\n backgroundStyle: \"solid-light\",\n paletteMode: \"monochrome\",\n preferredStyles: [\"stipple\", \"fill-only\", \"hatched\"],\n flowLineMultiplier: 0,\n heroShape: false,\n glowMultiplier: 0,\n sizePower: 2.8,\n invertForeground: false,\n },\n {\n name: \"celestial\",\n gridSize: 7,\n layers: 5,\n baseOpacity: 0.45,\n opacityReduction: 0.04,\n minShapeSize: 8,\n maxShapeSize: 450,\n backgroundStyle: \"radial-dark\",\n paletteMode: \"neon\",\n preferredStyles: [\"fill-only\", \"watercolor\", \"stroke-only\", \"incomplete\"],\n flowLineMultiplier: 2,\n heroShape: true,\n glowMultiplier: 2.5,\n sizePower: 2.2,\n invertForeground: false,\n },\n];\n\n/**\n * Linearly interpolate between two archetype numeric parameters.\n */\nfunction lerpNum(a: number, b: number, t: number): number {\n return a + (b - a) * t;\n}\n\n/**\n * Blend two archetypes by interpolating their numeric parameters\n * and merging their style arrays.\n */\nfunction blendArchetypes(a: Archetype, b: Archetype, t: number): Archetype {\n // Merge preferred styles — unique union, primary archetype first\n const mergedStyles = [...new Set([...a.preferredStyles, ...b.preferredStyles])] as RenderStyle[];\n\n return {\n name: `${a.name}+${b.name}`,\n gridSize: Math.round(lerpNum(a.gridSize, b.gridSize, t)),\n layers: Math.round(lerpNum(a.layers, b.layers, t)),\n baseOpacity: lerpNum(a.baseOpacity, b.baseOpacity, t),\n opacityReduction: lerpNum(a.opacityReduction, b.opacityReduction, t),\n minShapeSize: Math.round(lerpNum(a.minShapeSize, b.minShapeSize, t)),\n maxShapeSize: Math.round(lerpNum(a.maxShapeSize, b.maxShapeSize, t)),\n backgroundStyle: t < 0.5 ? a.backgroundStyle : b.backgroundStyle,\n paletteMode: t < 0.5 ? a.paletteMode : b.paletteMode,\n preferredStyles: mergedStyles,\n flowLineMultiplier: lerpNum(a.flowLineMultiplier, b.flowLineMultiplier, t),\n heroShape: t < 0.5 ? a.heroShape : b.heroShape,\n glowMultiplier: lerpNum(a.glowMultiplier, b.glowMultiplier, t),\n sizePower: lerpNum(a.sizePower, b.sizePower, t),\n invertForeground: t < 0.5 ? a.invertForeground : b.invertForeground,\n };\n}\n\n/**\n * Select an archetype deterministically from the hash.\n * ~15% of hashes produce a blended archetype (interpolation of two).\n */\nexport function selectArchetype(rng: () => number): Archetype {\n const primary = ARCHETYPES[Math.floor(rng() * ARCHETYPES.length)];\n\n // ~15% chance of blending with a second archetype\n if (rng() < 0.15) {\n const secondary = ARCHETYPES[Math.floor(rng() * ARCHETYPES.length)];\n if (secondary.name !== primary.name) {\n const blendT = 0.25 + rng() * 0.25; // 25-50% blend toward secondary\n return blendArchetypes(primary, secondary, blendT);\n }\n }\n\n return primary;\n}\n"],"names":[],"version":3,"file":"main.js.map","sourceRoot":"../"}
|
|
1
|
+
{"mappings":";;;;;;;;;;;;;;;;;;;;;;ACAA;;;;;;;;;;;;;;;;;;;;;;;;AEAA,CAWA,iCAAiC;;;ACX1B,SAAS,0CAAc,OAAe;IAC3C,OAAO,SAAS,QAAQ,KAAK,CAAC,GAAG,IAAI;AACvC;AAMO,SAAS,0CAAU,IAAY;IACpC,IAAI,IAAI,OAAO;IACf,OAAO;QACL,IAAI,AAAC,IAAI,aAAc;QACvB,IAAI,IAAI,KAAK,IAAI,CAAC,IAAK,MAAM,IAAK,IAAI;QACtC,IAAI,AAAC,IAAI,KAAK,IAAI,CAAC,IAAK,MAAM,GAAI,KAAK,KAAM;QAC7C,OAAO,AAAC,CAAA,AAAC,CAAA,IAAK,MAAM,EAAE,MAAO,CAAA,IAAK;IACpC;AACF;AAMO,SAAS,0CAAa,IAAY,EAAE,SAAS,CAAC;IACnD,IAAI,IAAI;IACR,IAAK,IAAI,IAAI,GAAG,IAAI,KAAK,MAAM,EAAE,IAC/B,IAAI,AAAC,KAAK,IAAI,CAAC,IAAI,KAAK,KAAK,UAAU,CAAC,KAAM;IAEhD,OAAO,AAAC,IAAI,SAAU;AACxB;AAMO,SAAS,0CACd,IAAY,EACZ,KAAa,EACb,GAAW,EACX,GAAW;IAEX,MAAM,MAAM,0CAAU,0CAAa,MAAM;IACzC,OAAO,MAAM,QAAS,CAAA,MAAM,GAAE;AAChC;AAGO,MAAM,4CAAc;IACzB,cAAc;IACd,eAAe,KAAK,IAAI,CAAC;IACzB,eAAe,KAAK,IAAI,CAAC;IACzB,eAAe,KAAK,IAAI,CAAC;IACzB,IAAI,KAAK,EAAE;IACX,KAAK,AAAC,CAAA,IAAI,KAAK,IAAI,CAAC,EAAC,IAAK;AAC5B;AAYO,SAAS,0CAAmB,GAAiB;IAClD,iEAAiE;IACjE,MAAM,OAAO,IAAI,WAAW;IAC5B,MAAM,IAAI,IAAI,WAAW;IACzB,IAAK,IAAI,IAAI,GAAG,IAAI,KAAK,IAAK,CAAC,CAAC,EAAE,GAAG;IACrC,2CAA2C;IAC3C,IAAK,IAAI,IAAI,KAAK,IAAI,GAAG,IAAK;QAC5B,MAAM,IAAI,KAAK,KAAK,CAAC,QAAS,CAAA,IAAI,CAAA;QAClC,MAAM,MAAM,CAAC,CAAC,EAAE;QAAE,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE;QAAE,CAAC,CAAC,EAAE,GAAG;IACxC;IACA,IAAK,IAAI,IAAI,GAAG,IAAI,KAAK,IAAK,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC,IAAI,IAAI;IAElD,qCAAqC;IACrC,MAAM,QAAQ;QACZ;YAAC;YAAE;SAAE;QAAC;YAAC;YAAG;SAAE;QAAC;YAAC;YAAE;SAAG;QAAC;YAAC;YAAG;SAAG;QAC3B;YAAC;YAAE;SAAE;QAAC;YAAC;YAAG;SAAE;QAAC;YAAC;YAAE;SAAE;QAAC;YAAC;YAAE;SAAG;QACzB;YAAC;YAAE;SAAE;QAAC;YAAC;YAAG;SAAE;QAAC;YAAC;YAAE;SAAG;QAAC;YAAC;YAAG;SAAG;KAC5B;IAED,MAAM,KAAK,MAAO,CAAA,KAAK,IAAI,CAAC,KAAK,CAAA;IACjC,MAAM,KAAK,AAAC,CAAA,IAAI,KAAK,IAAI,CAAC,EAAC,IAAK;IAEhC,SAAS,KAAK,CAAW,EAAE,CAAS,EAAE,CAAS;QAC7C,OAAO,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC,EAAE,GAAG;IAC3B;IAEA,OAAO,SAAS,QAAQ,GAAW,EAAE,GAAW;QAC9C,MAAM,IAAI,AAAC,CAAA,MAAM,GAAE,IAAK;QACxB,MAAM,IAAI,KAAK,KAAK,CAAC,MAAM;QAC3B,MAAM,IAAI,KAAK,KAAK,CAAC,MAAM;QAC3B,MAAM,IAAI,AAAC,CAAA,IAAI,CAAA,IAAK;QACpB,MAAM,KAAK,IAAI;QACf,MAAM,KAAK,IAAI;QACf,MAAM,KAAK,MAAM;QACjB,MAAM,KAAK,MAAM;QAEjB,IAAI,IAAY;QAChB,IAAI,KAAK,IAAI;YAAE,KAAK;YAAG,KAAK;QAAG,OAC1B;YAAE,KAAK;YAAG,KAAK;QAAG;QAEvB,MAAM,KAAK,KAAK,KAAK;QACrB,MAAM,KAAK,KAAK,KAAK;QACrB,MAAM,KAAK,KAAK,IAAI,IAAI;QACxB,MAAM,KAAK,KAAK,IAAI,IAAI;QAExB,MAAM,KAAK,IAAI;QACf,MAAM,KAAK,IAAI;QAEf,IAAI,KAAK,GAAG,KAAK,GAAG,KAAK;QAEzB,IAAI,KAAK,MAAM,KAAK,KAAK,KAAK;QAC9B,IAAI,MAAM,GAAG;YACX,MAAM;YACN,MAAM,MAAM,IAAI,CAAC,KAAK,IAAI,CAAC,GAAG,CAAC,GAAG;YAClC,KAAK,KAAK,KAAK,KAAK,KAAK,CAAC,IAAI,EAAE,IAAI;QACtC;QAEA,IAAI,KAAK,MAAM,KAAK,KAAK,KAAK;QAC9B,IAAI,MAAM,GAAG;YACX,MAAM;YACN,MAAM,MAAM,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK,GAAG,CAAC,GAAG;YAC5C,KAAK,KAAK,KAAK,KAAK,KAAK,CAAC,IAAI,EAAE,IAAI;QACtC;QAEA,IAAI,KAAK,MAAM,KAAK,KAAK,KAAK;QAC9B,IAAI,MAAM,GAAG;YACX,MAAM;YACN,MAAM,MAAM,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC,GAAG;YAC1C,KAAK,KAAK,KAAK,KAAK,KAAK,CAAC,IAAI,EAAE,IAAI;QACtC;QAEA,iCAAiC;QACjC,OAAO,KAAM,CAAA,KAAK,KAAK,EAAC;IAC1B;AACF;AAMO,SAAS,0CACd,KAAuC,EACvC,UAAU,CAAC,EACX,aAAa,GAAG,EAChB,OAAO,GAAG;IAEV,OAAO,SAAS,IAAI,CAAS,EAAE,CAAS;QACtC,IAAI,QAAQ;QACZ,IAAI,YAAY;QAChB,IAAI,YAAY;QAChB,IAAI,SAAS;QACb,IAAK,IAAI,IAAI,GAAG,IAAI,SAAS,IAAK;YAChC,SAAS,MAAM,IAAI,WAAW,IAAI,aAAa;YAC/C,UAAU;YACV,aAAa;YACb,aAAa;QACf;QACA,OAAO,QAAQ;IACjB;AACF;AAgBO,MAAM;IACX,OAAO,oBAAoB,QAAgB,EAAE,UAAkB,EAAU;QACvE,OAAO,WAAW;IACpB;IAEA,OAAO,cACL,GAA6B,EAC7B,KAAa,EACb,MAAc,EACR;QACN,IAAI,SAAS,CAAC,QAAQ,GAAG,SAAS;IACpC;IAEA,4DAA4D;IAC5D,OAAO,cACL,GAA6B,EAC7B,QAAmB,EACnB,MAAmB,EACb;QACN,MAAM,YACJ,QAAQ,eACR,cAAc,uBACd,mBAAmB,qBACnB,iBAAiB,mBACjB,iBAAiB,gBAClB,GAAG;QAEJ,SAAS,OAAO,CAAC,CAAC,SAAS;YACzB,MAAM,OAAO,IAAI,CAAC,mBAAmB,CACnC,UACA,KAAK,GAAG,CAAC,yCAAW,CAAC,eAAe,EAAE;YAExC,MAAM,UAAU,KAAK,GAAG,CAAC,KAAK,cAAc,QAAQ;YACpD,MAAM,WAAW,iBAAiB;YAElC,IAAI,IAAI;YACR,IAAI,WAAW,GAAG;YAClB,IAAI,MAAM,CAAC,AAAC,WAAW,KAAK,EAAE,GAAI;YAElC,MAAM,CAAC,QAAQ,IAAI,CAAC,CAAC,KAAK,MAAM,QAAQ,MAAM;YAC9C,IAAI,OAAO;QACb;IACF;AACF;;;AFzNA,uEAAuE;AACvE,yEAAyE;AACzE,wCAAwC;AAExC,MAAM,yCAAmB;IACvB;IACA;IACA;IACA;IACA;IACA;CACD;AAGD;;CAEC,GACD,SAAS,oCAAc,IAAY;IACjC,OAAO,sCAAgB,CAAC,KAAK,GAAG,CAAC,QAAQ,uCAAiB,MAAM,CAAC;AACnE;AAEA;;;CAGC,GACD,MAAM,qCAAe;IACnB;IACA;IACA;IACA;IACA;CACD;AAGD,SAAS,qCAAe,IAAY;IAClC,OAAO,kCAAY,CAAC,KAAK,GAAG,CAAC,QAAQ,KAAK,mCAAa,MAAM,CAAC;AAChE;AAUA,SAAS,kCAAY,GAAW;IAC9B,IAAI,AAAC,OAAO,KAAK,OAAO,MAAO,OAAO,KAAK,OAAO;IAClD,IAAI,OAAO,OAAO,OAAO,KAAK,OAAO;IACrC,OAAO;AACT;AAEA;;;CAGC,GACD,SAAS,qCAAe,GAAW,EAAE,MAAuB,EAAE,MAAc;IAC1E,IAAI,WAAW,QAAQ;QACrB,8CAA8C;QAC9C,MAAM,aAAa;QACnB,MAAM,OAAO,AAAE,CAAA,aAAa,MAAM,GAAE,IAAK,MAAO;QAChD,OAAO,AAAC,CAAA,MAAM,OAAO,SAAS,GAAE,IAAK;IACvC,OAAO;QACL,6CAA6C;QAC7C,MAAM,aAAa;QACnB,MAAM,OAAO,AAAE,CAAA,aAAa,MAAM,GAAE,IAAK,MAAO;QAChD,OAAO,AAAC,CAAA,MAAM,OAAO,SAAS,GAAE,IAAK;IACvC;AACF;AAGO,MAAM;IACH,KAAa;IACb,IAAkB;IAClB,UAA0B;IAC1B,WAAuB;IACvB,gBAAiC;IAClC,WAAqB;IACpB,oBAA8B;IAC9B,cAAwB;IAEhC,YAAY,OAAe,CAAE;QAC3B,IAAI,CAAC,IAAI,GAAG,CAAA,GAAA,yCAAY,EAAE;QAC1B,IAAI,CAAC,GAAG,GAAG,CAAA,GAAA,yCAAQ,EAAE,CAAA,GAAA,yCAAW,EAAE,SAAS;QAC3C,8DAA8D;QAC9D,IAAI,CAAC,SAAS,GAAG,oCAAc,IAAI,CAAC,IAAI;QACxC,IAAI,CAAC,UAAU,GAAG,qCAAe,IAAI,CAAC,IAAI;QAC1C,iEAAiE;QACjE,MAAM,WAAW,IAAI,CAAC,GAAG;QACzB,IAAI,CAAC,eAAe,GAAG,WAAW,MAAM,YAAY,WAAW,MAAM,YAAY;QACjF,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,kBAAkB;QACzC,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC,2BAA2B;QAC3D,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,qBAAqB;IACjD;IAEQ,qBAA+B;QACrC,MAAM,SAAS,IAAI,CAAA,GAAA,4CAAU;QAC7B,OAAO,OACJ,QAAQ,CAAC,IAAI,CAAC,IAAI,GAAG,KACrB,MAAM,CAAC,IAAI,CAAC,UAAU,EACtB,SAAS,CAAC,IAAI,CAAC,SAAS,EACxB,MAAM,GACN,GAAG,CAAC,CAAC,MAAgB,CAAC,CAAC,EAAE,IAAI,CAAC;IACnC;IAEQ,8BAAwC;QAC9C,MAAM,mBAAmB,AAAC,CAAA,IAAI,CAAC,IAAI,GAAG,GAAE,IAAK;QAC7C,yDAAyD;QACzD,MAAM,gBACJ,IAAI,CAAC,SAAS,KAAK,SAAS,SAAS,IAAI,CAAC,SAAS,KAAK,SAAS,UAAU,IAAI,CAAC,SAAS;QAC3F,MAAM,SAAS,IAAI,CAAA,GAAA,4CAAU;QAC7B,OAAO,OACJ,QAAQ,CAAC,kBACT,MAAM,CAAC,QACP,SAAS,CAAC,eACV,MAAM,GACN,GAAG,CAAC,CAAC,MAAgB,CAAC,CAAC,EAAE,IAAI,CAAC;IACnC;IAEQ,wBAAkC;QACxC,MAAM,aAAa,AAAC,CAAA,IAAI,CAAC,IAAI,GAAG,GAAE,IAAK;QACvC,MAAM,SAAS,IAAI,CAAA,GAAA,4CAAU;QAC7B,OAAO,OACJ,QAAQ,CAAC,YACT,MAAM,CAAC,UACP,SAAS,CAAC,IAAI,CAAC,SAAS,EACxB,MAAM,GACN,GAAG,CAAC,CAAC,MAAgB,CAAC,CAAC,EAAE,IAAI,CAAC;IACnC;IAEA;;;;GAIC,GACD,YAAsB;QACpB,wCAAwC;QACxC,MAAM,MAAM;eACP,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG;eACzB,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,GAAG;eAClC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,GAAG;SAChC;QACD,OAAO;eAAI,IAAI,IAAI;SAAK;IAC1B;IAEA;;;GAGC,GACD,gBAAgB,IAAY,EAAY;QACtC,MAAM,UAAU,IAAI,CAAC,IAAI,GAAG;QAC5B,OAAQ;YACN,KAAK;gBAAc;oBACjB,gCAAgC;oBAChC,MAAM,IAAI,MAAM,IAAI,CAAC,GAAG,KAAK;oBAC7B,OAAO;wBAAC;wBAAM;wBAAK;wBAAM;wBAAK;qBAAK,CAAC,GAAG,CAAC,CAAC,IACvC,+BAAS,SAAS,GAAG;gBAEzB;YACA,KAAK;gBAAW;oBACd,iCAAiC;oBACjC,MAAM,OAAO,AAAC,CAAA,UAAU,MAAM,IAAI,CAAC,GAAG,KAAK,EAAC,IAAK;oBACjD,OAAO;wBACL,+BAAS,SAAS,KAAK;wBACvB,+BAAS,SAAS,KAAK;wBACvB,+BAAS,MAAM,KAAK;wBACpB,+BAAS,MAAM,KAAK;qBACrB;gBACH;YACA,KAAK;gBAAQ;oBACX,gCAAgC;oBAChC,MAAM,OAAO;wBAAC;wBAAU,CAAA,UAAU,EAAC,IAAK;wBAAM,CAAA,UAAU,GAAE,IAAK;wBAAM,CAAA,UAAU,GAAE,IAAK;qBAAI;oBAC1F,OAAO,KAAK,GAAG,CAAC,CAAC,IAAM,+BAAS,GAAG,KAAK,OAAO,IAAI,CAAC,GAAG,KAAK;gBAC9D;YACA,KAAK;gBAAgB;oBACnB,eAAe;oBACf,MAAM,OAAO;wBAAC;wBAAU,CAAA,UAAU,EAAC,IAAK;wBAAM,CAAA,UAAU,GAAE,IAAK;wBAAM,CAAA,UAAU,GAAE,IAAK;qBAAI;oBAC1F,OAAO,KAAK,GAAG,CAAC,CAAC,IAAM,+BAAS,GAAG,MAAM,IAAI,CAAC,GAAG,KAAK,KAAK,OAAO,IAAI,CAAC,GAAG,KAAK;gBACjF;YACA,KAAK;gBAAS;oBACZ,wDAAwD;oBACxD,MAAM,YAAY;wBAAC;wBAAI;wBAAI;wBAAI;wBAAI;qBAAI,EAAE,gCAAgC;oBACzE,OAAO,UAAU,GAAG,CAAC,CAAC,IACpB,+BAAS,IAAI,IAAI,CAAC,GAAG,KAAK,IAAI,OAAO,IAAI,CAAC,GAAG,KAAK,KAAK,OAAO,IAAI,CAAC,GAAG,KAAK;gBAE/E;YACA,KAAK;gBAAiB;oBACpB,qCAAqC;oBACrC,MAAM,SAAS,+BAAS,SAAS,KAAK;oBACtC,OAAO;wBAAC;wBAAW;wBAAW;wBAAQ,+BAAS,SAAS,KAAK;qBAAM;gBACrE;YACA,KAAK;gBAAuB;oBAC1B,uDAAuD;oBACvD,MAAM,OAAO,AAAC,CAAA,UAAU,GAAE,IAAK;oBAC/B,MAAM,SAAS,AAAC,CAAA,OAAO,KAAK,GAAE,IAAK;oBACnC,MAAM,SAAS,AAAC,CAAA,OAAO,EAAC,IAAK;oBAC7B,MAAM,MAAM,OAAO,IAAI,CAAC,GAAG,KAAK;oBAChC,OAAO;wBACL,+BAAS,SAAS,KAAK;wBACvB,+BAAS,SAAS,MAAM,KAAK;wBAC7B,+BAAS,QAAQ,KAAK;wBACtB,+BAAS,QAAQ,KAAK;wBACtB,+BAAS,QAAQ,MAAM,KAAK;qBAC7B;gBACH;YACA,KAAK;gBAAoB;oBACvB,uDAAuD;oBACvD,MAAM,OAAO,KAAK,IAAI,CAAC,GAAG,KAAK,IAAI,eAAe;oBAClD,MAAM,KAAK,AAAC,CAAA,UAAU,OAAO,GAAE,IAAK;oBACpC,MAAM,KAAK,AAAC,CAAA,UAAU,IAAG,IAAK;oBAC9B,MAAM,YAAY,AAAC,CAAA,UAAU,MAAM,IAAI,CAAC,GAAG,KAAK,EAAC,IAAK;oBACtD,MAAM,MAAM,MAAM,IAAI,CAAC,GAAG,KAAK;oBAC/B,OAAO;wBACL,+BAAS,SAAS,KAAK;wBACvB,+BAAS,IAAI,KAAK;wBAClB,+BAAS,IAAI,KAAK;wBAClB,+BAAS,WAAW,MAAM,MAAM;qBACjC;gBACH;YACA,KAAK;gBAAmB;oBACtB,yCAAyC;oBACzC,MAAM,KAAK,AAAC,CAAA,UAAU,MAAM,IAAI,CAAC,GAAG,KAAK,EAAC,IAAK;oBAC/C,MAAM,KAAK,AAAC,CAAA,UAAU,MAAM,IAAI,CAAC,GAAG,KAAK,EAAC,IAAK;oBAC/C,MAAM,MAAM,MAAM,IAAI,CAAC,GAAG,KAAK;oBAC/B,OAAO;wBACL,+BAAS,SAAS,KAAK;wBACvB,+BAAS,IAAI,KAAK;wBAClB,+BAAS,IAAI,MAAM,KAAK;qBACzB;gBACH;YACA,KAAK;YACL;gBACE,OAAO,IAAI,CAAC,SAAS;QACzB;IACF;IAEA;;GAEC,GACD,0BAA0B,IAAY,EAAoB;QACxD,OAAQ;YACN,KAAK;gBACH,OAAO;oBAAC,+BAAS,IAAI,CAAC,IAAI,GAAG,KAAK,MAAM;oBAAO,+BAAS,AAAC,CAAA,IAAI,CAAC,IAAI,GAAG,EAAC,IAAK,KAAK,KAAK;iBAAM;YAC7F,KAAK;YACL,KAAK;gBACH,OAAO;oBAAC;oBAAW;iBAAU;YAC/B,KAAK;YACL,KAAK;gBACH,OAAO,IAAI,CAAC,mBAAmB;YACjC,KAAK;gBACH,OAAO;oBAAC,+BAAS,IAAI,CAAC,IAAI,GAAG,KAAK,MAAM;oBAAO,+BAAS,AAAC,CAAA,IAAI,CAAC,IAAI,GAAG,EAAC,IAAK,KAAK,MAAM;iBAAM;YAC9F,KAAK;gBACH,OAAO;oBAAC;oBAAW;iBAAU;YAC/B,KAAK;gBACH,OAAO;oBAAC,IAAI,CAAC,MAAM,CAAC,+BAAS,IAAI,KAAK,OAAO;oBAAM,IAAI,CAAC,MAAM,CAAC,+BAAS,IAAI,MAAM,MAAM;iBAAK;YAC/F;gBACE,OAAO,IAAI,CAAC,mBAAmB;QACnC;IACF;IAEA;;;GAGC,GACD,sBAAwC;QACtC,IAAI,MAAM,IAAI,CAAC,UAAU,CAAC,EAAE;QAC5B,IAAI,MAAM,IAAI,CAAC,UAAU,CAAC,EAAE;QAE5B,IAAI,IAAI,CAAC,eAAe,KAAK,WAAW;YACtC,MAAM,SAAS,IAAI,CAAC,eAAe,KAAK,YAAY,SAAS;YAC7D,MAAM,IAAI,CAAC,qBAAqB,CAAC,KAAK,QAAQ;YAC9C,MAAM,IAAI,CAAC,qBAAqB,CAAC,KAAK,QAAQ;QAChD;QAEA,OAAO;YAAC,IAAI,CAAC,MAAM,CAAC,KAAK;YAAO,IAAI,CAAC,MAAM,CAAC,KAAK;SAAM;IACzD;IAEA;;;GAGC,GACD,qBAAsC;QACpC,OAAO,IAAI,CAAC,eAAe;IAC7B;IAEA;;GAEC,GACD,AAAQ,sBAAsB,GAAW,EAAE,MAAuB,EAAE,MAAc,EAAU;QAC1F,MAAM,CAAC,GAAG,GAAG,EAAE,GAAG,+BAAS;QAC3B,MAAM,UAAU,qCAAe,GAAG,QAAQ;QAC1C,OAAO,+BAAS,SAAS,GAAG;IAC9B;IAEA;;GAEC,GACD,AAAQ,OAAO,GAAW,EAAE,MAAc,EAAU;QAClD,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK;QAC3B,MAAM,IAAI,KAAK,KAAK,CAAC,SAAS,EAAE,SAAS,CAAC,GAAG,IAAI,MAAM;QACvD,MAAM,IAAI,KAAK,KAAK,CAAC,SAAS,EAAE,SAAS,CAAC,GAAG,IAAI,MAAM;QACvD,MAAM,IAAI,KAAK,KAAK,CAAC,SAAS,EAAE,SAAS,CAAC,GAAG,IAAI,MAAM;QACvD,OAAO,CAAC,CAAC,EAAE,EAAE,QAAQ,CAAC,IAAI,QAAQ,CAAC,GAAG,KAAK,EAAE,EAAE,QAAQ,CAAC,IAAI,QAAQ,CAAC,GAAG,KAAK,EAAE,EAAE,QAAQ,CAAC,IAAI,QAAQ,CAAC,GAAG,KAAK,CAAC;IAClH;AACF;AAEA,uEAAuE;AAEvE,sDAAsD,GACtD,SAAS,+BAAS,GAAW;IAC3B,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK;IAC3B,OAAO;QACL,SAAS,EAAE,SAAS,CAAC,GAAG,IAAI;QAC5B,SAAS,EAAE,SAAS,CAAC,GAAG,IAAI;QAC5B,SAAS,EAAE,SAAS,CAAC,GAAG,IAAI;KAC7B;AACH;AAEA,sCAAsC,GACtC,SAAS,+BAAS,CAAS,EAAE,CAAS,EAAE,CAAS;IAC/C,MAAM,QAAQ,CAAC,IAAc,KAAK,GAAG,CAAC,GAAG,KAAK,GAAG,CAAC,KAAK,KAAK,KAAK,CAAC;IAClE,OAAO,CAAC,CAAC,EAAE,MAAM,GAAG,QAAQ,CAAC,IAAI,QAAQ,CAAC,GAAG,KAAK,EAAE,MAAM,GAAG,QAAQ,CAAC,IAAI,QAAQ,CAAC,GAAG,KAAK,EAAE,MAAM,GAAG,QAAQ,CAAC,IAAI,QAAQ,CAAC,GAAG,KAAK,CAAC;AACvI;AAEA,gDAAgD,GAChD,SAAS,+BAAS,GAAW;IAC3B,MAAM,CAAC,GAAG,GAAG,EAAE,GAAG,+BAAS,KAAK,GAAG,CAAC,CAAC,IAAM,IAAI;IAC/C,MAAM,MAAM,KAAK,GAAG,CAAC,GAAG,GAAG;IAC3B,MAAM,MAAM,KAAK,GAAG,CAAC,GAAG,GAAG;IAC3B,MAAM,IAAI,AAAC,CAAA,MAAM,GAAE,IAAK;IACxB,IAAI,QAAQ,KAAK,OAAO;QAAC;QAAG;QAAG;KAAE;IACjC,MAAM,IAAI,MAAM;IAChB,MAAM,IAAI,IAAI,MAAM,IAAK,CAAA,IAAI,MAAM,GAAE,IAAK,IAAK,CAAA,MAAM,GAAE;IACvD,IAAI,IAAI;IACR,IAAI,QAAQ,GAAG,IAAI,AAAC,CAAA,AAAC,CAAA,IAAI,CAAA,IAAK,IAAK,CAAA,IAAI,IAAI,IAAI,CAAA,CAAC,IAAK;SAChD,IAAI,QAAQ,GAAG,IAAI,AAAC,CAAA,AAAC,CAAA,IAAI,CAAA,IAAK,IAAI,CAAA,IAAK;SACvC,IAAI,AAAC,CAAA,AAAC,CAAA,IAAI,CAAA,IAAK,IAAI,CAAA,IAAK;IAC7B,OAAO;QAAC,IAAI;QAAK;QAAG;KAAE;AACxB;AAEA,qDAAqD,GACrD,SAAS,+BAAS,CAAS,EAAE,CAAS,EAAE,CAAS;IAC/C,IAAI,AAAC,CAAA,AAAC,IAAI,MAAO,GAAE,IAAK;IACxB,MAAM,IAAI,AAAC,CAAA,IAAI,KAAK,GAAG,CAAC,IAAI,IAAI,EAAC,IAAK;IACtC,MAAM,IAAI,IAAK,CAAA,IAAI,KAAK,GAAG,CAAC,AAAE,IAAI,KAAM,IAAK,EAAC;IAC9C,MAAM,IAAI,IAAI,IAAI;IAClB,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI;IACtB,IAAI,IAAI,IAAI;QAAE,IAAI;QAAG,IAAI;IAAG,OACvB,IAAI,IAAI,KAAK;QAAE,IAAI;QAAG,IAAI;IAAG,OAC7B,IAAI,IAAI,KAAK;QAAE,IAAI;QAAG,IAAI;IAAG,OAC7B,IAAI,IAAI,KAAK;QAAE,IAAI;QAAG,IAAI;IAAG,OAC7B,IAAI,IAAI,KAAK;QAAE,IAAI;QAAG,IAAI;IAAG,OAC7B;QAAE,IAAI;QAAG,IAAI;IAAG;IACrB,OAAO,+BAAS,AAAC,CAAA,IAAI,CAAA,IAAK,KAAK,AAAC,CAAA,IAAI,CAAA,IAAK,KAAK,AAAC,CAAA,IAAI,CAAA,IAAK;AAC1D;AAMO,SAAS,0CAAa,GAAW,EAAE,KAAa;IACrD,MAAM,CAAC,GAAG,GAAG,EAAE,GAAG,+BAAS;IAC3B,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC;AACnD;AAaO,SAAS,yCAAoB,MAAgB,EAAE,GAAiB;IACrE,IAAI,OAAO,MAAM,GAAG,GAClB,OAAO;QACL,UAAU,MAAM,CAAC,EAAE,IAAI;QACvB,WAAW,MAAM,CAAC,EAAE,IAAI,MAAM,CAAC,EAAE,IAAI;QACrC,QAAQ,MAAM,CAAC,OAAO,MAAM,GAAG,EAAE,IAAI;QACrC,KAAK;IACP;IAEF,uFAAuF;IACvF,yEAAyE;IACzE,MAAM,OAAO,OAAO,GAAG,CAAC,CAAC,IAAM,+BAAS;IACxC,IAAI,cAAc;IAClB,IAAI,YAAY;IAChB,IAAK,IAAI,IAAI,GAAG,IAAI,KAAK,MAAM,EAAE,IAAK;QACpC,0EAA0E;QAC1E,MAAM,oBAAoB,IAAI,KAAK,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,GAAG,OAAO,GAAG,iBAAiB;QAC/E,MAAM,SAAS,IAAI,CAAC,EAAE,CAAC,EAAE,GAAG;QAC5B,IAAI,SAAS,WAAW;YAAE,YAAY;YAAQ,cAAc;QAAG;IACjE;IACA,wDAAwD;IACxD,IAAI,YAAY;IAChB,IAAI,UAAU;IACd,IAAK,IAAI,IAAI,GAAG,IAAI,KAAK,MAAM,EAAE,IAAK;QACpC,IAAI,MAAM,aAAa;QACvB,MAAM,IAAI,KAAK,GAAG,CAAC,KAAK,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,GAAG,IAAI,CAAC,YAAY,CAAC,EAAE,GAAG,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,GAAG,IAAI,CAAC,YAAY,CAAC,EAAE;QAChH,IAAI,IAAI,SAAS;YAAE,UAAU;YAAG,YAAY;QAAG;IACjD;IACA,2DAA2D;IAC3D,IAAI,eAAe;IACnB,IAAI,SAAS;IACb,IAAK,IAAI,IAAI,GAAG,IAAI,KAAK,MAAM,EAAE,IAAK;QACpC,IAAI,MAAM,eAAe,MAAM,WAAW;QAC1C,IAAI,IAAI,CAAC,EAAE,CAAC,EAAE,GAAG,QAAQ;YAAE,SAAS,IAAI,CAAC,EAAE,CAAC,EAAE;YAAE,eAAe;QAAG;IACpE;IACA,IAAI,iBAAiB,aAAa,eAAe,cAAc,IAAI,IAAI;IAEvE,OAAO;QACL,UAAU,MAAM,CAAC,YAAY;QAC7B,WAAW,MAAM,CAAC,aAAa;QAC/B,QAAQ,MAAM,CAAC,UAAU;QACzB,KAAK;IACP;AACF;AAMO,SAAS,0CAAmB,SAAyB,EAAE,GAAiB;IAC7E,MAAM,OAAO;IACb,IAAI,OAAO,MAAM,OAAO,UAAU,QAAQ;IAC1C,IAAI,OAAO,MAAM,OAAO,UAAU,SAAS;IAC3C,OAAO,UAAU,MAAM;AACzB;AAMO,SAAS,0CACd,GAAW,EACX,GAAiB,EACjB,YAAY,CAAC,EACb,WAAW,IAAI;IAEf,MAAM,CAAC,GAAG,GAAG,EAAE,GAAG,+BAAS;IAC3B,MAAM,OAAO,AAAC,CAAA,IAAI,AAAC,CAAA,QAAQ,GAAE,IAAK,YAAY,IAAI,GAAE,IAAK;IACzD,MAAM,OAAO,KAAK,GAAG,CAAC,GAAG,KAAK,GAAG,CAAC,GAAG,IAAI,AAAC,CAAA,QAAQ,GAAE,IAAK,WAAW;IACpE,MAAM,OAAO,KAAK,GAAG,CAAC,GAAG,KAAK,GAAG,CAAC,GAAG,IAAI,AAAC,CAAA,QAAQ,GAAE,IAAK,WAAW;IACpE,OAAO,+BAAS,MAAM,MAAM;AAC9B;AAEO,SAAS,0CACd,GAAW,EACX,GAAiB,EACjB,SAAS,GAAG;IAEZ,MAAM,CAAC,GAAG,GAAG,EAAE,GAAG,+BAAS;IAC3B,MAAM,MAAM,IAAM,AAAC,CAAA,QAAQ,GAAE,IAAK,IAAI,SAAS;IAC/C,OAAO,+BAAS,IAAI,OAAO,IAAI,OAAO,IAAI;AAC5C;AAMO,SAAS,yCAAW,GAAW,EAAE,MAAc;IACpD,MAAM,CAAC,GAAG,GAAG,EAAE,GAAG,+BAAS;IAC3B,MAAM,OAAO,QAAQ,IAAI,QAAQ,IAAI,QAAQ;IAC7C,MAAM,MAAM,CAAC,IAAc,IAAI,AAAC,CAAA,OAAO,CAAA,IAAK;IAC5C,OAAO,+BAAS,IAAI,IAAI,IAAI,IAAI,IAAI;AACtC;AAMO,SAAS,0CAAiB,GAAW,EAAE,MAAuB,EAAE,MAAc;IACnF,MAAM,CAAC,GAAG,GAAG,EAAE,GAAG,+BAAS;IAC3B,OAAO,+BAAS,qCAAe,GAAG,QAAQ,SAAS,GAAG;AACxD;AAMO,SAAS,0CAAU,GAAW;IACnC,MAAM,CAAC,GAAG,GAAG,EAAE,GAAG,+BAAS,KAAK,GAAG,CAAC,CAAC;QACnC,MAAM,IAAI,IAAI;QACd,OAAO,KAAK,UAAU,IAAI,QAAQ,KAAK,GAAG,CAAC,AAAC,CAAA,IAAI,KAAI,IAAK,OAAO;IAClE;IACA,OAAO,SAAS,IAAI,SAAS,IAAI,SAAS;AAC5C;AAUO,SAAS,0CACd,KAAa,EACb,WAAmB,EACnB,cAAc,IAAI;IAElB,MAAM,QAAQ,0CAAU;IACxB,MAAM,OAAO,KAAK,GAAG,CAAC,QAAQ;IAE9B,IAAI,QAAQ,aAAa,OAAO;IAEhC,MAAM,CAAC,GAAG,GAAG,EAAE,GAAG,+BAAS;IAE3B,IAAI,cAAc,KAAK;QACrB,iDAAiD;QACjD,MAAM,UAAU,KAAK,GAAG,CAAC,MAAM,IAAI,AAAC,CAAA,cAAc,IAAG,IAAK;QAC1D,MAAM,UAAU,KAAK,GAAG,CAAC,GAAG,IAAI;QAChC,OAAO,+BAAS,GAAG,SAAS;IAC9B,OAAO;QACL,iDAAiD;QACjD,MAAM,UAAU,KAAK,GAAG,CAAC,MAAM,IAAI,AAAC,CAAA,cAAc,IAAG,IAAK;QAC1D,MAAM,UAAU,KAAK,GAAG,CAAC,GAAG,IAAI;QAChC,OAAO,+BAAS,GAAG,SAAS;IAC9B;AACF;AAMO,SAAS,yCACd,GAAW,EACX,QAAgB,EAChB,SAAiB;IAEjB,MAAM,CAAC,GAAG,GAAG,EAAE,GAAG,+BAAS;IAC3B,iCAAiC;IACjC,MAAM,UAAU,AAAE,CAAA,WAAW,IAAI,GAAE,IAAK,MAAO;IAC/C,MAAM,OAAO,AAAC,CAAA,IAAI,UAAU,YAAY,MAAM,GAAE,IAAK;IACrD,4BAA4B;IAC5B,MAAM,OAAO,KAAK,GAAG,CAAC,GAAG,KAAK,GAAG,CAAC,GAAG,IAAI,AAAC,CAAA,MAAM,CAAA,IAAK,YAAY;IACjE,OAAO,+BAAS,MAAM,MAAM;AAC9B;AAMO,SAAS,0CAAe,GAAiB;IAC9C,4CAA4C;IAC5C,MAAM,aAAa;QAAC;QAAI;QAAK;QAAK;QAAK;KAAG;IAC1C,MAAM,MAAM,UAAU,CAAC,KAAK,KAAK,CAAC,QAAQ,WAAW,MAAM,EAAE,GAAG,AAAC,CAAA,QAAQ,GAAE,IAAK;IAChF,MAAM,YAAY,OAAO,QAAQ;IACjC,OAAO;QAAE,KAAK,AAAC,CAAA,MAAM,GAAE,IAAK;mBAAK;IAAU;AAC7C;AAKO,SAAS,0CAAU,GAAW,EAAE,OAAe;IACpD,MAAM,CAAC,GAAG,GAAG,EAAE,GAAG,+BAAS;IAC3B,OAAO,+BAAS,AAAC,CAAA,IAAI,UAAU,GAAE,IAAK,KAAK,GAAG;AAChD;AAMO,SAAS,0CACd,IAAoB,EACpB,UAAkB,EAClB,gBAAwB;IAExB,MAAM,QAAQ,aAAa;IAC3B,OAAO;QACL,UAAU,0CAAU,KAAK,QAAQ,EAAE;QACnC,WAAW,0CAAU,KAAK,SAAS,EAAE,QAAQ;QAC7C,QAAQ,0CAAU,KAAK,MAAM,EAAE,QAAQ;QACvC,KAAK,KAAK,GAAG,CAAC,GAAG,CAAC,CAAA,IAAK,0CAAU,GAAG,QAAQ;IAC9C;AACF;;CDhjBC;;AMrBM,MAAM,4CAA2B,CAAC,KAAK;IAC5C,IAAI,SAAS;IACb,IAAI,GAAG,CAAC,GAAG,GAAG,OAAO,GAAG,GAAG,KAAK,EAAE,GAAG;AACvC;AAEO,MAAM,4CAA2B,CAAC,KAAK;IAC5C,IAAI,SAAS;IACb,IAAI,IAAI,CAAC,CAAC,OAAO,GAAG,CAAC,OAAO,GAAG,MAAM;AACvC;AAEO,MAAM,4CAA6B,CAAC,KAAK;IAC9C,IAAI,SAAS;IACb,IAAI,MAAM,CAAC,GAAG,CAAC,OAAO;IACtB,IAAI,MAAM,CAAC,CAAC,OAAO,GAAG,OAAO;IAC7B,IAAI,MAAM,CAAC,OAAO,GAAG,OAAO;IAC5B,IAAI,SAAS;AACf;AAEO,MAAM,4CAA4B,CAAC,KAAK;IAC7C,IAAI,SAAS;IACb,IAAK,IAAI,IAAI,GAAG,IAAI,GAAG,IAAK;QAC1B,MAAM,QAAQ,AAAE,KAAK,EAAE,GAAG,IAAK,IAAK;QACpC,MAAM,IAAI,AAAC,OAAO,IAAK,KAAK,GAAG,CAAC;QAChC,MAAM,IAAI,AAAC,OAAO,IAAK,KAAK,GAAG,CAAC;QAChC,IAAI,MAAM,GAAG,IAAI,MAAM,CAAC,GAAG;aACtB,IAAI,MAAM,CAAC,GAAG;IACrB;IACA,IAAI,SAAS;AACf;AAEO,MAAM,2CAAyB,CAAC,KAAK;IAC1C,IAAI,SAAS;IACb,IAAK,IAAI,IAAI,GAAG,IAAI,IAAI,IAAK;QAC3B,MAAM,QAAQ,KAAK,EAAE,GAAG,IAAI,AAAC,KAAK,EAAE,GAAG,IAAK,IAAI;QAChD,MAAM,SAAS,IAAI,MAAM,IAAI,OAAO,IAAI,OAAO;QAC/C,MAAM,IAAI,SAAS,KAAK,GAAG,CAAC;QAC5B,MAAM,IAAI,SAAS,KAAK,GAAG,CAAC;QAC5B,IAAI,MAAM,GAAG,IAAI,MAAM,CAAC,GAAG;aACtB,IAAI,MAAM,CAAC,GAAG;IACrB;IACA,IAAI,SAAS;AACf;AAEO,MAAM,4CAA+B,CAAC,KAAK;IAChD,IAAI,SAAS;IACb,IAAK,IAAI,IAAI,GAAG,IAAI,IAAI,IAAK;QAC3B,MAAM,QAAQ,KAAK,EAAE,GAAG,KAAK,AAAC,KAAK,EAAE,GAAG,KAAM,IAAI;QAClD,MAAM,SAAS,IAAI,MAAM,IAAI,OAAO,IAAI,OAAO;QAC/C,MAAM,IAAI,SAAS,KAAK,GAAG,CAAC;QAC5B,MAAM,IAAI,SAAS,KAAK,GAAG,CAAC;QAC5B,IAAI,MAAM,GAAG,IAAI,MAAM,CAAC,GAAG;aACtB,IAAI,MAAM,CAAC,GAAG;IACrB;IACA,IAAI,SAAS;AACf;AAEO,MAAM,4CAA0B,CAAC,KAAK;IAC3C,IAAI,SAAS;IACb,IAAI,MAAM,CAAC,GAAG,OAAO;IACrB,IAAI,gBAAgB,CAAC,OAAO,GAAG,OAAO,GAAG,GAAG,CAAC,OAAO;IACpD,IAAI,gBAAgB,CAAC,CAAC,OAAO,GAAG,OAAO,GAAG,GAAG,OAAO;AACtD;AAEO,MAAM,2CAA4B,CAAC,KAAK;IAC7C,IAAI,SAAS;IACb,IAAI,MAAM,CAAC,GAAG,CAAC,OAAO;IACtB,IAAI,MAAM,CAAC,OAAO,GAAG;IACrB,IAAI,MAAM,CAAC,GAAG,OAAO;IACrB,IAAI,MAAM,CAAC,CAAC,OAAO,GAAG;IACtB,IAAI,SAAS;AACf;AAEO,MAAM,4CAAyB,CAAC,KAAK;IAC1C,IAAI,SAAS;IACb,IAAI,MAAM,CAAC,CAAC,OAAO,GAAG,CAAC,OAAO;IAC9B,IAAI,MAAM,CAAC,OAAO,GAAG,CAAC,OAAO;IAC7B,IAAI,MAAM,CAAC,OAAO,GAAG,OAAO;IAC5B,IAAI,MAAM,CAAC,CAAC,OAAO,GAAG,OAAO;IAC7B,IAAI,SAAS;AACf;AAGO,MAAM,4CAA4C;IACvD,QAAQ;IACR,QAAQ;IACR,UAAU;IACV,SAAS;IACT,MAAM;IACN,eAAe;IACf,OAAO;IACP,SAAS;IACT,MAAM;AACR;;;AE9FA,2CAA2C;AA2BpC,MAAM,2CAAmB;IAC9B,uCAAuC;IACvC,OAAO;QACL,MAAM;QACN,OAAO;QACP,QAAQ;IACV;IACA,SAAS;QACP,MAAM;QACN,OAAO;QACP,QAAQ;QACR,UAAU;IACZ;IACA,yBAAyB;IACzB,QAAQ;QACN,MAAM;QACN,OAAO;QACP,QAAQ;QACR,UAAU;QACV,gBAAgB;IAClB;IACA,WAAW;QACT,MAAM;QACN,OAAO;QACP,QAAQ;QACR,UAAU;QACV,gBAAgB;IAClB;IACA,qBAAqB;IACrB,oBAAoB;QAClB,MAAM;QACN,OAAO;QACP,QAAQ;IACV;IACA,mBAAmB;QACjB,MAAM;QACN,OAAO;QACP,QAAQ;QACR,UAAU;QACV,QAAQ;IACV;IACA,kBAAkB;QAChB,MAAM;QACN,OAAO;QACP,QAAQ;QACR,UAAU;QACV,gBAAgB;IAClB;IACA,mBAAmB;QACjB,MAAM;QACN,OAAO;QACP,QAAQ;QACR,UAAU;QACV,gBAAgB;IAClB;IACA,eAAe;IACf,mBAAmB;QACjB,MAAM;QACN,OAAO;QACP,QAAQ;QACR,UAAU;QACV,QAAQ;IACV;IACA,oBAAoB;QAClB,MAAM;QACN,OAAO;QACP,QAAQ;QACR,UAAU;QACV,QAAQ;IACV;IACA,yBAAyB;IACzB,SAAS;QACP,MAAM;QACN,OAAO;QACP,QAAQ;QACR,QAAQ;QACR,aAAa;QACb,gBAAgB;IAClB;IACA,SAAS;QACP,MAAM;QACN,OAAO;QACP,QAAQ;QACR,UAAU;QACV,QAAQ;QACR,gBAAgB;QAChB,cAAc;QACd,cAAc;IAChB;AACF;AAGO,MAAM,4CAAkC;IAC7C,aAAa;IACb,WAAW;IACX,WAAW;IACX,UAAU;IACV,YAAY;IACZ,SAAS;AACX;AAGO,MAAM,4CAAmB;IAC9B,OAAO;IACP,UAAU;IACV,UAAU;AACZ;AAGO,MAAM,4CAAc;IACzB,cAAc;IACd,eAAe,KAAK,IAAI,CAAC;IACzB,eAAe,KAAK,IAAI,CAAC;IACzB,eAAe,KAAK,IAAI,CAAC;IACzB,IAAI,KAAK,EAAE;IACX,KAAK,AAAC,CAAA,IAAI,KAAK,IAAI,CAAC,EAAC,IAAK;AAC5B;AAGO,MAAM,4CAAiB;IAC5B,qBAAqB,CAAC,OAAiB;YACrC,8CAA8C;YAC9C;gBAAE,MAAM;gBAAW,QAAQ;oBAAE,MAAM,OAAO;gBAAI;YAAE;YAChD;gBAAE,MAAM;gBAAa,QAAQ;oBAAE,MAAM,OAAO;gBAAI;YAAE;SACnD;IAED,qBAAqB,CAAC,OAAiB;YACrC;gBAAE,MAAM;gBAAiB,QAAQ;0BAAE;oBAAM,MAAM;gBAAc;YAAE;YAC/D;gBAAE,MAAM;gBAAiB,QAAQ;oBAAE,MAAM,OAAO;oBAAK,MAAM;gBAAO;YAAE;YACpE;gBAAE,MAAM;gBAAiB,QAAQ;oBAAE,MAAM,OAAO;oBAAK,MAAM;gBAAa;YAAE;SAC3E;IAED,YAAY,CAAC,OAAiB;YAC5B,4CAA4C;YAC5C;gBAAE,MAAM;gBAAmB,QAAQ;oBAAE,MAAM,OAAO;gBAAI;YAAE;YACxD;gBAAE,MAAM;gBAAiB,QAAQ;oBAAE,MAAM,OAAO;gBAAI;YAAE;SACvD;AACH;;;ACjJO,MAAM,4CAAW,CAAC,UAA4B,AAAC,UAAU,KAAK,EAAE,GAAI;AAEpE,MAAM,4CAAkB,CAC7B,KACA,MACA;IAEA,IAAI,IAAI;IACR,IAAI,SAAS,CAAC,GAAG;IACjB,IAAI,OAAO,QAAQ,EACjB,IAAI,MAAM,CAAC,0CAAS,OAAO,QAAQ;IAErC,IAAI,SAAS,GAAG,OAAO,SAAS;IAChC,IAAI,WAAW,GAAG,OAAO,WAAW;IACpC,IAAI,SAAS,GAAG,OAAO,SAAS;AAClC;AAEO,MAAM,4CAAiB,CAAC;IAC7B,IAAI,OAAO;AACb;AAGO,MAAM,4CAAwB,CAAC,OAAmC,CAAA;QACvE,SAAS;QACT,UAAU;QACV,QAAQ;cACR;IAEF,CAAA;AAEO,MAAM,4CAAqB,CAChC,IACA,IACA,QACA;IAEA,MAAM,SAAkB,EAAE;IAC1B,IAAK,IAAI,IAAI,GAAG,IAAI,UAAU,IAAK;QACjC,MAAM,QAAQ,AAAC,IAAI,WAAY,KAAK,EAAE,GAAG;QACzC,OAAO,IAAI,CAAC;YACV,GAAG,KAAK,KAAK,GAAG,CAAC,SAAS;YAC1B,GAAG,KAAK,KAAK,GAAG,CAAC,SAAS;QAC5B;IACF;IACA,OAAO;AACT;;;AF9CO,MAAM,4CAAe;IAC1B,UAAU;QACR,aAAa;YAAE,UAAU;YAAG,OAAO;QAAE;QACrC,MAAM;YAAE,UAAU;YAAG,OAAO;QAAE;QAC9B,YAAY;YAAE,UAAU;YAAG,OAAO;QAAE;QACpC,cAAc;YAAE,UAAU;YAAI,OAAO;QAAG;QACxC,aAAa;YAAE,UAAU;YAAI,OAAO;QAAG;IACzC;IACA,WAAW;QACT,YAAY;QACZ,cAAc;IAChB;IACA,aAAa;QACX,YAAY;QACZ,OAAO;IACT;AACF;AAkBO,MAAM,4CAAkC,CAAC,KAAK,MAAM,SAAS,CAAC,CAAC;IACpE,MAAM,cAAc;QAAE,GAAG,CAAA,GAAA,yCAAiB,CAAC;QAAE,GAAG,MAAM;IAAC;IACvD,CAAA,GAAA,yCAAc,EAAE,KAAK,MAAM;IAE3B,MAAM,YAAY,OAAO,IAAI;IAC7B,MAAM,cACJ,0CAAa,QAAQ,CAAC,UAAU,IAAI,0CAAa,QAAQ,CAAC,WAAW;IACvE,MAAM,YACJ,QAAQ,EAET,GAAG;IACJ,MAAM,SAAS,OAAO;IAEtB,kDAAkD;IAClD,MAAM,SAAS,CAAA,GAAA,yCAAiB,EAAE,GAAG,GAAG,QAAQ;IAEhD,IAAI,SAAS;IACb,8BAA8B;IAC9B,OAAO,OAAO,CAAC,CAAC,IAAI;QAClB,OAAO,KAAK,CAAC,IAAI,GAAG,OAAO,CAAC,CAAC;YAC3B,IAAI,MAAM,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC;YACrB,IAAI,MAAM,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC;QACvB;IACF;IAEA,IAAI,YAAY,SAAS,KAAK,eAC5B,IAAI,IAAI;IAEV,IAAI,MAAM;IACV,CAAA,GAAA,yCAAa,EAAE;AACjB;AAEO,MAAM,4CAAoC,CAAC,KAAK,MAAM,SAAS,CAAC,CAAC;IACtE,MAAM,cAAc;QAClB,GAAG,CAAA,GAAA,yCAAiB,CAAC;QACrB,GAAG,0CAAa,SAAS;QACzB,GAAG,MAAM;IACX;IACA,CAAA,GAAA,yCAAc,EAAE,KAAK,MAAM;IAE3B,IAAI,UAAU;IACd,IAAI,WAAW;IACf,IAAI,QAAQ,OAAO,KAAK,GAAG,CAAC,YAAY,YAAY,EAAE,YAAY,UAAU;IAE5E,IAAI,SAAS;IACb,IAAK,IAAI,IAAI,GAAG,IAAI,YAAY,UAAU,EAAE,IAAK;QAC/C,MAAM,SAAS,QAAQ;QACvB,MAAM,UAAU,SAAS;QACzB,MAAM,UAAU,SAAS;QAEzB,IAAI,GAAG,CAAC,SAAS,SAAS,QAAQ,KAAK,EAAE,EAAE,KAAK,EAAE,GAAG;QAErD,kCAAkC;QAClC,MAAM,OAAO,UAAU;QACvB,WAAW;QACX,UAAU;QAEV,+BAA+B;QAC/B,IAAI,SAAS,CAAC,QAAQ;QACtB,IAAI,MAAM,CAAC,KAAK,EAAE,GAAG;IACvB;IAEA,IAAI,MAAM;IACV,CAAA,GAAA,yCAAa,EAAE;AACjB;AAEO,MAAM,4CAAmC,CAAC,KAAK,MAAM,SAAS,CAAC,CAAC;IACrE,MAAM,cAAc;QAAE,GAAG,CAAA,GAAA,yCAAiB,CAAC;QAAE,GAAG,MAAM;IAAC;IACvD,CAAA,GAAA,yCAAc,EAAE,KAAK,MAAM;IAE3B,MAAM,WAAW;IACjB,MAAM,OAAO,OAAO;IAEpB,IAAI,SAAS;IACb,mBAAmB;IACnB,IAAK,IAAI,IAAI,GAAG,KAAK,UAAU,IAC7B,IAAK,IAAI,IAAI,GAAG,KAAK,UAAU,IAAK;QAClC,MAAM,IAAI,AAAC,CAAA,IAAI,WAAW,CAAA,IAAK;QAC/B,MAAM,IAAI,AAAC,CAAA,IAAI,WAAW,CAAA,IAAK;QAE/B,yCAAyC;QACzC,MAAM,SAAS,OAAO;QACtB,IAAK,IAAI,IAAI,GAAG,IAAI,GAAG,IAAK;YAC1B,MAAM,QAAQ,AAAC,KAAK,EAAE,GAAG,IAAK;YAC9B,MAAM,KAAK,IAAI,SAAS,KAAK,GAAG,CAAC;YACjC,MAAM,KAAK,IAAI,SAAS,KAAK,GAAG,CAAC;YACjC,MAAM,KAAK,IAAI,SAAS,KAAK,GAAG,CAAC,QAAQ,KAAK,EAAE,GAAG;YACnD,MAAM,KAAK,IAAI,SAAS,KAAK,GAAG,CAAC,QAAQ,KAAK,EAAE,GAAG;YACnD,IAAI,MAAM,CAAC,IAAI;YACf,IAAI,MAAM,CAAC,IAAI;QACjB;IACF;IAGF,IAAI,MAAM;IACV,CAAA,GAAA,yCAAa,EAAE;AACjB;AAEO,MAAM,4CAA+B,CAAC,KAAK,MAAM,SAAS,CAAC,CAAC;IACjE,MAAM,cAAc;QAAE,GAAG,CAAA,GAAA,yCAAiB,CAAC;QAAE,GAAG,MAAM;IAAC;IACvD,CAAA,GAAA,yCAAc,EAAE,KAAK,MAAM;IAE3B,MAAM,WAAW;IACjB,MAAM,OAAO,OAAO;IAEpB,MAAM,kBAAkB,CAAC,GAAW,GAAW;QAC7C,IAAI,SAAS;QACb,OAAQ;YACN,KAAK;gBACH,IAAI,MAAM,CAAC,GAAG;gBACd,IAAI,aAAa,CACf,IAAI,OAAO,GACX,GACA,IAAI,OAAO,GACX,IAAI,MACJ,IAAI,MACJ,IAAI;gBAEN;YACF,KAAK;gBACH,IAAI,MAAM,CAAC,GAAG,IAAI;gBAClB,IAAI,aAAa,CAAC,IAAI,OAAO,GAAG,IAAI,MAAM,IAAI,OAAO,GAAG,GAAG,IAAI,MAAM;gBACrE;QACJ;QACA,IAAI,MAAM;IACZ;IAEA,sBAAsB;IACtB,IAAK,IAAI,IAAI,GAAG,IAAI,UAAU,IAC5B,IAAK,IAAI,IAAI,GAAG,IAAI,UAAU,IAAK;QACjC,MAAM,IAAI,AAAC,CAAA,IAAI,WAAW,CAAA,IAAK;QAC/B,MAAM,IAAI,AAAC,CAAA,IAAI,WAAW,CAAA,IAAK;QAC/B,gBAAgB,GAAG,GAAG,AAAC,CAAA,IAAI,CAAA,IAAK,MAAM,IAAI,SAAS;IACrD;IAGF,CAAA,GAAA,yCAAa,EAAE;AACjB;AAEO,MAAM,4CAA4B,CAAC,KAAK,MAAM,SAAS,CAAC,CAAC;IAC9D,MAAM,cAAc;QAAE,GAAG,CAAA,GAAA,yCAAiB,CAAC;QAAE,GAAG,MAAM;IAAC;IACvD,CAAA,GAAA,yCAAc,EAAE,KAAK,MAAM;IAE3B,MAAM,SAAS,OAAO;IAEtB,mCAAmC;IACnC,IAAI,SAAS;IACb,oBAAoB;IACpB,MAAM,UAAU,CAAA,GAAA,yCAAiB,EAAE,GAAG,GAAG,QAAQ;IACjD,QAAQ,OAAO,CAAC,CAAC,IAAI;QACnB,QAAQ,KAAK,CAAC,IAAI,GAAG,OAAO,CAAC,CAAC;YAC5B,IAAI,MAAM,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC;YACrB,IAAI,MAAM,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC;QACvB;IACF;IAEA,+BAA+B;IAC/B,IAAI,MAAM,CAAC,KAAK,EAAE,GAAG;IACrB,MAAM,UAAU,CAAA,GAAA,yCAAiB,EAAE,GAAG,GAAG,QAAQ;IACjD,QAAQ,OAAO,CAAC,CAAC,IAAI;QACnB,QAAQ,KAAK,CAAC,IAAI,GAAG,OAAO,CAAC,CAAC;YAC5B,IAAI,MAAM,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC;YACrB,IAAI,MAAM,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC;QACvB;IACF;IAEA,IAAI,YAAY,SAAS,KAAK,eAC5B,IAAI,IAAI;IAEV,IAAI,MAAM;IACV,CAAA,GAAA,yCAAa,EAAE;AACjB;AAEO,MAAM,4CAA4B,CAAC,KAAK,MAAM,SAAS,CAAC,CAAC;IAC9D,MAAM,cAAc;QAAE,GAAG,CAAA,GAAA,yCAAiB,CAAC;QAAE,GAAG,MAAM;IAAC;IACvD,CAAA,GAAA,yCAAc,EAAE,KAAK,MAAM;IAE3B,MAAM,aAAa;IACnB,MAAM,YAAY;IAClB,MAAM,SAAS,OAAO;IAEtB,IAAI,SAAS;IACb,IAAK,IAAI,IAAI,GAAG,KAAK,YAAY,IAAK;QACpC,MAAM,eAAe,AAAC,SAAS,aAAc;QAC7C,IAAI,MAAM,CAAC,cAAc;QACzB,IAAI,GAAG,CAAC,GAAG,GAAG,cAAc,GAAG,KAAK,EAAE,GAAG;QAEzC,IAAK,IAAI,IAAI,GAAG,IAAI,WAAW,IAAK;YAClC,MAAM,QAAQ,AAAC,KAAK,EAAE,GAAG,IAAI,IAAK;YAClC,MAAM,IAAI,eAAe,KAAK,GAAG,CAAC;YAClC,MAAM,IAAI,eAAe,KAAK,GAAG,CAAC;YAClC,IAAI,MAAM,CAAC,GAAG;YACd,IAAI,MAAM,CAAC,GAAG;QAChB;IACF;IAEA,IAAI,MAAM;IACV,CAAA,GAAA,yCAAa,EAAE;AACjB;AAEO,MAAM,4CAA4B,CAAC,KAAK,MAAM,SAAS,CAAC,CAAC;IAC9D,MAAM,cAAc;QAAE,GAAG,CAAA,GAAA,yCAAiB,CAAC;QAAE,GAAG,MAAM;QAAE,YAAY;IAAE;IACtE,CAAA,GAAA,yCAAc,EAAE,KAAK,MAAM;IAE3B,MAAM,aAAa,CACjB,GACA,GACA,QACA,OACA;QAEA,IAAI,UAAU,GAAG;QAEjB,MAAM,OAAO,IAAI,SAAS,KAAK,GAAG,CAAC;QACnC,MAAM,OAAO,IAAI,SAAS,KAAK,GAAG,CAAC;QAEnC,IAAI,SAAS;QACb,IAAI,MAAM,CAAC,GAAG;QACd,IAAI,MAAM,CAAC,MAAM;QACjB,IAAI,MAAM;QAEV,WAAW,MAAM,MAAM,SAAS,KAAK,QAAQ,KAAK,EAAE,GAAG,GAAG,QAAQ;QAClE,WAAW,MAAM,MAAM,SAAS,KAAK,QAAQ,KAAK,EAAE,GAAG,GAAG,QAAQ;IACpE;IAEA,WAAW,GAAG,OAAO,GAAG,OAAO,GAAG,CAAC,KAAK,EAAE,GAAG,GAAG,YAAY,UAAU;IACtE,CAAA,GAAA,yCAAa,EAAE;AACjB;AAEO,MAAM,4CAA8C;IACzD,eAAe;IACf,iBAAiB;IACjB,gBAAgB;IAChB,YAAY;IACZ,SAAS;IACT,SAAS;IACT,SAAS;AACX;;;;AGxRO,MAAM,4CAAiC,CAAC,KAAK;IAClD,MAAM,SAAS,OAAO;IACtB,MAAM,UAAmB;QACvB;YAAE,GAAG;YAAG,GAAG;QAAE;QACb;YAAE,GAAG,SAAS,KAAK,IAAI,CAAC;YAAI,GAAG;QAAE;QACjC;YAAE,GAAG,AAAC,SAAS,KAAK,IAAI,CAAC,KAAM;YAAG,GAAG,MAAM;QAAO;QAClD;YAAE,GAAG,AAAC,CAAC,SAAS,KAAK,IAAI,CAAC,KAAM;YAAG,GAAG,MAAM;QAAO;QACnD;YAAE,GAAG,CAAC,SAAS,KAAK,IAAI,CAAC;YAAI,GAAG;QAAE;QAClC;YAAE,GAAG,AAAC,CAAC,SAAS,KAAK,IAAI,CAAC,KAAM;YAAG,GAAG,OAAO;QAAO;QACpD;YAAE,GAAG,AAAC,SAAS,KAAK,IAAI,CAAC,KAAM;YAAG,GAAG,OAAO;QAAO;KACpD;IAED,IAAI,SAAS;IACb,QAAQ,OAAO,CAAC,CAAC;QACf,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,QAAQ,OAAO,CAAC;QACtC,IAAI,GAAG,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC,EAAE,QAAQ,GAAG,KAAK,EAAE,GAAG;IACnD;AACF;AAEO,MAAM,4CAA+B,CAAC,KAAK;IAChD,MAAM,SAAS,OAAO;IACtB,MAAM,UAAU,SAAS;IAEzB,0CAA0C;IAC1C,MAAM,YAAqB;QACzB;YAAE,GAAG;YAAG,GAAG,CAAC,UAAU;QAAE;QACxB;YAAE,GAAG,CAAC;YAAS,GAAG,CAAC;QAAQ;QAC3B;YAAE,GAAG;YAAS,GAAG,CAAC;QAAQ;QAC1B;YAAE,GAAG,CAAC;YAAS,GAAG;QAAE;QACpB;YAAE,GAAG;YAAS,GAAG;QAAE;QACnB;YAAE,GAAG;YAAG,GAAG;QAAE;QACb;YAAE,GAAG,CAAC;YAAS,GAAG;QAAQ;QAC1B;YAAE,GAAG;YAAS,GAAG;QAAQ;QACzB;YAAE,GAAG;YAAG,GAAG,UAAU;QAAE;QACvB;YAAE,GAAG;YAAG,GAAG,UAAU;QAAE;KACxB;IAED,eAAe;IACf,IAAI,SAAS;IACb,UAAU,OAAO,CAAC,CAAC;QACjB,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,QAAQ,IAAI,CAAC;QAChC,IAAI,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,QAAQ,GAAG,KAAK,EAAE,GAAG;IAC7C;IAEA,wBAAwB;IACxB,IAAI,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,EAAE,SAAS,CAAC,EAAE,CAAC,CAAC;IACzC,UAAU,OAAO,CAAC,CAAC,KAAK;QACtB,IAAI,IAAI,GACN,UAAU,KAAK,CAAC,IAAI,GAAG,OAAO,CAAC,CAAC;YAC9B,IAAI,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC;YACvB,IAAI,MAAM,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC;QACjC;IAEJ;AACF;AAEO,MAAM,4CAAkC,CAAC,KAAK;IACnD,MAAM,SAAS,OAAO;IAEtB,kEAAkE;IAElE,sDAAsD;IAEtD,MAAM,WAAoB;QACxB;YAAE,GAAG;YAAG,GAAG;QAAE;WACV,CAAA,GAAA,yCAAiB,EAAE,GAAG,GAAG,QAAQ;WACjC,CAAA,GAAA,yCAAiB,EAAE,GAAG,GAAG,SAAS,KAAK;KAC3C;IAED,IAAI,SAAS;IACb,4BAA4B;IAC5B,SAAS,OAAO,CAAC,CAAC,IAAI;QACpB,SAAS,KAAK,CAAC,IAAI,GAAG,OAAO,CAAC,CAAC;YAC7B,IAAI,MAAM,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC;YACrB,IAAI,MAAM,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC;QACvB;IACF;AACF;AAEO,MAAM,4CAA8B,CAAC,KAAK;IAC/C,MAAM,SAAS,OAAO;IACtB,IAAI,SAAS;IAEb,uBAAuB;IACvB,IAAK,IAAI,IAAI,GAAG,IAAI,GAAG,IAAK;QAC1B,MAAM,QAAQ,AAAC,IAAI,IAAK,KAAK,EAAE,GAAG;QAClC,MAAM,KAAK,KAAK,GAAG,CAAC,SAAS;QAC7B,MAAM,KAAK,KAAK,GAAG,CAAC,SAAS;QAC7B,MAAM,KAAK,KAAK,GAAG,CAAC,QAAQ,KAAK,EAAE,GAAG,KAAK;QAC3C,MAAM,KAAK,KAAK,GAAG,CAAC,QAAQ,KAAK,EAAE,GAAG,KAAK;QAE3C,IAAI,MAAM,CAAC,GAAG;QACd,IAAI,MAAM,CAAC,IAAI;QACf,IAAI,MAAM,CAAC,IAAI;QACf,IAAI,MAAM,CAAC,GAAG;IAChB;IAEA,uBAAuB;IACvB,MAAM,cAAc,SAAS;IAC7B,IAAK,IAAI,IAAI,GAAG,IAAI,GAAG,IAAK;QAC1B,MAAM,QAAQ,AAAC,IAAI,IAAK,KAAK,EAAE,GAAG,IAAI,KAAK,EAAE,GAAG;QAChD,MAAM,KAAK,KAAK,GAAG,CAAC,SAAS;QAC7B,MAAM,KAAK,KAAK,GAAG,CAAC,SAAS;QAC7B,MAAM,KAAK,KAAK,GAAG,CAAC,QAAQ,KAAK,EAAE,GAAG,KAAK;QAC3C,MAAM,KAAK,KAAK,GAAG,CAAC,QAAQ,KAAK,EAAE,GAAG,KAAK;QAE3C,IAAI,MAAM,CAAC,GAAG;QACd,IAAI,MAAM,CAAC,IAAI;QACf,IAAI,MAAM,CAAC,IAAI;QACf,IAAI,MAAM,CAAC,GAAG;IAChB;AACF;AAEO,MAAM,4CAA+B,CAAC,KAAK;IAChD,MAAM,SAAS,OAAO;IACtB,MAAM,UAAmB;QACvB;YAAE,GAAG;YAAG,GAAG;QAAE;QACb;YAAE,GAAG,SAAS,KAAK,IAAI,CAAC;YAAI,GAAG;QAAE;QACjC;YAAE,GAAG,AAAC,SAAS,KAAK,IAAI,CAAC,KAAM;YAAG,GAAG,MAAM;QAAO;QAClD;YAAE,GAAG,AAAC,CAAC,SAAS,KAAK,IAAI,CAAC,KAAM;YAAG,GAAG,MAAM;QAAO;QACnD;YAAE,GAAG,CAAC,SAAS,KAAK,IAAI,CAAC;YAAI,GAAG;QAAE;QAClC;YAAE,GAAG,AAAC,CAAC,SAAS,KAAK,IAAI,CAAC,KAAM;YAAG,GAAG,OAAO;QAAO;QACpD;YAAE,GAAG,AAAC,SAAS,KAAK,IAAI,CAAC,KAAM;YAAG,GAAG,OAAO;QAAO;KACpD;IAED,IAAI,SAAS;IACb,QAAQ,OAAO,CAAC,CAAC;QACf,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,QAAQ,OAAO,CAAC;QACtC,IAAI,GAAG,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC,EAAE,QAAQ,GAAG,KAAK,EAAE,GAAG;IACnD;AACF;AAEO,MAAM,4CAAiC,CAAC,KAAK;IAClD,MAAM,SAAS,OAAO;IACtB,IAAI,SAAS;IACb,IAAI,GAAG,CAAC,CAAC,SAAS,GAAG,GAAG,QAAQ,GAAG,KAAK,EAAE,GAAG;IAC7C,IAAI,GAAG,CAAC,SAAS,GAAG,GAAG,QAAQ,GAAG,KAAK,EAAE,GAAG;AAC9C;AAEO,MAAM,4CAA0B,CAAC,KAAK;IAC3C,MAAM,cAAc,OAAO;IAC3B,MAAM,cAAc,OAAO;IAC3B,MAAM,QAAQ;IAEd,IAAI,SAAS;IACb,IAAK,IAAI,IAAI,GAAG,IAAI,OAAO,IAAK;QAC9B,MAAM,SAAS,AAAC,IAAI,QAAS,KAAK,EAAE,GAAG;QACvC,kDAAkD;QAElD,IAAK,IAAI,IAAI,GAAG,IAAI,OAAO,IAAK;YAC9B,MAAM,OAAO,AAAC,IAAI,QAAS,KAAK,EAAE,GAAG;YACrC,MAAM,OAAO,AAAE,CAAA,IAAI,CAAA,IAAK,QAAS,KAAK,EAAE,GAAG;YAE3C,MAAM,KACJ,AAAC,CAAA,cAAc,cAAc,KAAK,GAAG,CAAC,KAAI,IAAK,KAAK,GAAG,CAAC;YAC1D,MAAM,KACJ,AAAC,CAAA,cAAc,cAAc,KAAK,GAAG,CAAC,KAAI,IAAK,KAAK,GAAG,CAAC;YAC1D,MAAM,KACJ,AAAC,CAAA,cAAc,cAAc,KAAK,GAAG,CAAC,KAAI,IAAK,KAAK,GAAG,CAAC;YAC1D,MAAM,KACJ,AAAC,CAAA,cAAc,cAAc,KAAK,GAAG,CAAC,KAAI,IAAK,KAAK,GAAG,CAAC;YAE1D,IAAI,MAAM,CAAC,IAAI;YACf,IAAI,MAAM,CAAC,IAAI;QACjB;IACF;AACF;AAEO,MAAM,4CAA8B,CAAC,KAAK;IAC/C,MAAM,SAAS,OAAO;IACtB,MAAM,UAAmB;QACvB;YAAE,GAAG;YAAG,GAAG;QAAE;QACb;YAAE,GAAG,SAAS;YAAG,GAAG;QAAE;QACtB;YAAE,GAAG;YAAQ,GAAG,SAAS,KAAK,IAAI,CAAC;QAAG;QACtC;YAAE,GAAG,CAAC;YAAQ,GAAG,SAAS,KAAK,IAAI,CAAC;QAAG;QACvC;YAAE,GAAG,CAAC,SAAS;YAAG,GAAG;QAAE;QACvB;YAAE,GAAG,CAAC;YAAQ,GAAG,CAAC,SAAS,KAAK,IAAI,CAAC;QAAG;QACxC;YAAE,GAAG;YAAQ,GAAG,CAAC,SAAS,KAAK,IAAI,CAAC;QAAG;KACxC;IAED,IAAI,SAAS;IACb,QAAQ,OAAO,CAAC,CAAC;QACf,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,QAAQ,OAAO,CAAC;QACtC,IAAI,GAAG,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC,EAAE,QAAQ,GAAG,KAAK,EAAE,GAAG;IACnD;AACF;AAEO,MAAM,4CAA6C;IACxD,cAAc;IACd,YAAY;IACZ,eAAe;IACf,WAAW;IACX,YAAY;IACZ,cAAc;IACd,OAAO;IACP,WAAW;AACb;;;AC7MA;;;;;;;CAOC,GAUM,MAAM,4CAAyB,CAAC,KAAK,MAAM;IAChD,MAAM,MAAoB,QAAQ,OAAO,KAAK,MAAM;IACpD,MAAM,IAAI,OAAO;IACjB,MAAM,YAAY,IAAI,KAAK,KAAK,CAAC,QAAQ;IACzC,MAAM,SAA0C,EAAE;IAElD,IAAK,IAAI,IAAI,GAAG,IAAI,WAAW,IAAK;QAClC,MAAM,QAAQ,AAAC,IAAI,YAAa,KAAK,EAAE,GAAG;QAC1C,MAAM,SAAS,MAAM,QAAQ;QAC7B,OAAO,IAAI,CAAC;YACV,GAAG,KAAK,GAAG,CAAC,SAAS,IAAI;YACzB,GAAG,KAAK,GAAG,CAAC,SAAS,IAAI;QAC3B;IACF;IAEA,IAAI,SAAS;IACb,MAAM,OAAO,MAAM,CAAC,OAAO,MAAM,GAAG,EAAE;IACtC,MAAM,QAAQ,MAAM,CAAC,EAAE;IACvB,IAAI,MAAM,CAAC,AAAC,CAAA,KAAK,CAAC,GAAG,MAAM,CAAC,AAAD,IAAK,GAAG,AAAC,CAAA,KAAK,CAAC,GAAG,MAAM,CAAC,AAAD,IAAK;IAExD,IAAK,IAAI,IAAI,GAAG,IAAI,WAAW,IAAK;QAClC,MAAM,OAAO,MAAM,CAAC,EAAE;QACtB,MAAM,OAAO,MAAM,CAAC,AAAC,CAAA,IAAI,CAAA,IAAK,UAAU;QACxC,IAAI,gBAAgB,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,EAAE,AAAC,CAAA,KAAK,CAAC,GAAG,KAAK,CAAC,AAAD,IAAK,GAAG,AAAC,CAAA,KAAK,CAAC,GAAG,KAAK,CAAC,AAAD,IAAK;IAClF;IACA,IAAI,SAAS;AACf;AAIO,MAAM,4CAAyB,CAAC,KAAK,MAAM;IAChD,MAAM,MAAoB,QAAQ,OAAO,KAAK,MAAM;IACpD,MAAM,IAAI,OAAO;IACjB,MAAM,QAAQ,IAAI,KAAK,KAAK,CAAC,QAAQ;IACrC,MAAM,eAAe,MAAM,QAAQ;IAEnC,IAAI,SAAS;IACb,IAAK,IAAI,IAAI,GAAG,IAAI,OAAO,IAAK;QAC9B,MAAM,QAAQ,AAAC,IAAI,QAAS,KAAK,EAAE,GAAG,IAAI,KAAK,EAAE,GAAG;QACpD,MAAM,eAAe,IAAI,eAAe,QAAQ,eAAe;QAC/D,MAAM,IAAI,KAAK,GAAG,CAAC,SAAS,IAAI;QAChC,MAAM,IAAI,KAAK,GAAG,CAAC,SAAS,IAAI;QAChC,IAAI,MAAM,GAAG,IAAI,MAAM,CAAC,GAAG;aACtB,IAAI,MAAM,CAAC,GAAG;IACrB;IACA,IAAI,SAAS;AACf;AAIO,MAAM,4CAA8B,CAAC,KAAK,MAAM;IACrD,MAAM,MAAoB,QAAQ,OAAO,KAAK,MAAM;IACpD,MAAM,IAAI,OAAO;IACjB,MAAM,QAAQ,IAAI,KAAK,KAAK,CAAC,QAAQ;IACrC,MAAM,QAAQ,IAAI,KAAK,KAAK,CAAC,QAAQ;IACrC,MAAM,QAAQ,QAAQ,KAAK,EAAE;IAC7B,MAAM,QAAQ;IAEd,IAAI,SAAS;IACb,IAAK,IAAI,IAAI,GAAG,KAAK,OAAO,IAAK;QAC/B,MAAM,IAAI,AAAC,IAAI,QAAS,KAAK,EAAE,GAAG;QAClC,MAAM,IAAI,KAAK,GAAG,CAAC,QAAQ,IAAI,SAAS;QACxC,MAAM,IAAI,KAAK,GAAG,CAAC,QAAQ,KAAK;QAChC,IAAI,MAAM,GAAG,IAAI,MAAM,CAAC,GAAG;aACtB,IAAI,MAAM,CAAC,GAAG;IACrB;IACA,IAAI,SAAS;AACf;AAIO,MAAM,4CAAiC,CAAC,KAAK,MAAM;IACxD,MAAM,MAAoB,QAAQ,OAAO,KAAK,MAAM;IACpD,MAAM,IAAI,OAAO;IACjB,MAAM,IAAI,MAAM,QAAQ;IACxB,MAAM,QAAQ;IAEd,IAAI,SAAS;IACb,IAAK,IAAI,IAAI,GAAG,KAAK,OAAO,IAAK;QAC/B,MAAM,IAAI,AAAC,IAAI,QAAS,KAAK,EAAE,GAAG;QAClC,MAAM,OAAO,KAAK,GAAG,CAAC;QACtB,MAAM,OAAO,KAAK,GAAG,CAAC;QACtB,MAAM,IAAI,KAAK,IAAI,CAAC,QAAQ,KAAK,GAAG,CAAC,KAAK,GAAG,CAAC,OAAO,IAAI,KAAK;QAC9D,MAAM,IAAI,KAAK,IAAI,CAAC,QAAQ,KAAK,GAAG,CAAC,KAAK,GAAG,CAAC,OAAO,IAAI,KAAK;QAC9D,IAAI,MAAM,GAAG,IAAI,MAAM,CAAC,GAAG;aACtB,IAAI,MAAM,CAAC,GAAG;IACrB;IACA,IAAI,SAAS;AACf;AAIO,MAAM,4CAA+B,CAAC,KAAK,MAAM;IACtD,MAAM,MAAoB,QAAQ,OAAO,KAAK,MAAM;IACpD,MAAM,QAAQ,OAAO;IACrB,MAAM,IAAI;IACV,MAAM,IAAI,MAAM,QAAQ;IACxB,MAAM,IAAI,MAAM,QAAQ;IACxB,MAAM,MAAM,CAAC,GAAW;QACtB,MAAM,KAAK,KAAK,KAAK,CAAC,IAAI;QAC1B,MAAM,KAAK,KAAK,KAAK,CAAC,IAAI;QAC1B,MAAM,IAAI,CAAC,GAAW,IAAuB,MAAM,IAAI,IAAI,EAAE,GAAG,IAAI;QACpE,OAAO,EAAE,IAAI,MAAM;IACrB;IACA,MAAM,SAAS,IAAI,IAAI,GAAG;IAC1B,MAAM,OAAO,KAAK,GAAG,CAAC,QAAQ,MAAM,KAAK,EAAE,GAAG;IAC9C,MAAM,QAAQ,KAAK,GAAG,CAAC,KAAK,KAAK,KAAK,CAAC,OAAO;IAE9C,IAAI,SAAS;IACb,IAAK,IAAI,IAAI,GAAG,KAAK,OAAO,IAAK;QAC/B,MAAM,IAAI,AAAC,IAAI,QAAS;QACxB,MAAM,IAAI,AAAC,CAAA,AAAC,CAAA,IAAI,CAAA,IAAK,KAAK,GAAG,CAAC,KAAK,IAAI,KAAK,GAAG,CAAC,AAAE,CAAA,IAAI,CAAA,IAAK,IAAK,EAAC,IAAK,QAAS,CAAA,IAAI,CAAA;QACnF,MAAM,IAAI,AAAC,CAAA,AAAC,CAAA,IAAI,CAAA,IAAK,KAAK,GAAG,CAAC,KAAK,IAAI,KAAK,GAAG,CAAC,AAAE,CAAA,IAAI,CAAA,IAAK,IAAK,EAAC,IAAK,QAAS,CAAA,IAAI,CAAA;QACnF,IAAI,MAAM,GAAG,IAAI,MAAM,CAAC,GAAG;aACtB,IAAI,MAAM,CAAC,GAAG;IACrB;IACA,IAAI,SAAS;AACf;AAIO,MAAM,4CAA6B,CAAC,KAAK,MAAM;IACpD,MAAM,MAAoB,QAAQ,OAAO,KAAK,MAAM;IACpD,MAAM,IAAI,OAAO;IACjB,MAAM,QAAQ,IAAI,KAAK,KAAK,CAAC,QAAQ;IACrC,MAAM,OAAO,IAAI,KAAK,KAAK,CAAC,QAAQ;IACpC,MAAM,MAAM,OAAO,QAAQ;IAE3B,IAAI,SAAS;IACb,IAAK,IAAI,OAAO,GAAG,OAAO,OAAO,OAAQ;QACvC,MAAM,QAAQ,IAAK,CAAA,MAAM,AAAC,OAAO,QAAS,GAAE;QAC5C,MAAM,QAAQ;QACd,IAAK,IAAI,IAAI,GAAG,KAAK,OAAO,IAAK;YAC/B,MAAM,IAAI,AAAC,IAAI,QAAS,KAAK,EAAE,GAAG;YAClC,MAAM,OAAO,KAAK,GAAG,CAAC,IAAI,OAAO,OAAO,OAAO,QAAQ;YACvD,MAAM,IAAI,KAAK,GAAG,CAAC,KAAM,CAAA,QAAQ,IAAG;YACpC,MAAM,IAAI,KAAK,GAAG,CAAC,KAAM,CAAA,QAAQ,IAAG;YACpC,IAAI,MAAM,GAAG,IAAI,MAAM,CAAC,GAAG;iBACtB,IAAI,MAAM,CAAC,GAAG;QACrB;IACF;AACF;AAIO,MAAM,4CAAyB,CAAC,KAAK,MAAM;IAChD,MAAM,MAAoB,QAAQ,OAAO,KAAK,MAAM;IACpD,MAAM,IAAI,OAAO;IACjB,MAAM,IAAI,IAAI,KAAK,KAAK,CAAC,QAAQ;IACjC,MAAM,QAAQ;IAEd,IAAI,SAAS;IACb,IAAK,IAAI,IAAI,GAAG,KAAK,OAAO,IAAK;QAC/B,MAAM,QAAQ,AAAC,IAAI,QAAS,KAAK,EAAE,GAAG,IAAK,CAAA,IAAI,MAAM,IAAI,IAAI,CAAA;QAC7D,MAAM,KAAK,KAAK,GAAG,CAAC,IAAI,SAAS;QACjC,MAAM,IAAI,KAAK,KAAK,GAAG,CAAC;QACxB,MAAM,IAAI,KAAK,KAAK,GAAG,CAAC;QACxB,IAAI,MAAM,GAAG,IAAI,MAAM,CAAC,GAAG;aACtB,IAAI,MAAM,CAAC,GAAG;IACrB;IACA,IAAI,SAAS;AACf;AASO,MAAM,4CAA+B,CAAC,KAAK,MAAM;IACtD,MAAM,MAAoB,QAAQ,OAAO,KAAK,MAAM;IACpD,MAAM,IAAI,OAAO;IACjB,MAAM,aAAa,IAAI,KAAK,KAAK,CAAC,QAAQ,IAAI,aAAa;IAE3D,IAAI,SAAS;IACb,IAAK,IAAI,IAAI,GAAG,IAAI,YAAY,IAAK;QACnC,MAAM,YAAY,AAAC,IAAI,aAAc,KAAK,EAAE,GAAG,IAAI,AAAC,CAAA,QAAQ,GAAE,IAAK;QACnE,MAAM,OAAO,IAAK,CAAA,OAAO,QAAQ,IAAG;QACpC,MAAM,KAAK,KAAK,GAAG,CAAC,aAAa;QACjC,MAAM,KAAK,KAAK,GAAG,CAAC,aAAa;QACjC,MAAM,YAAY,IAAK,CAAA,MAAM,QAAQ,GAAE;QACvC,MAAM,QAAQ,IAAI,KAAK,KAAK,CAAC,QAAQ,IAAI,yBAAyB;QAClE,MAAM,mBAAmB,QAAQ,KAAK,EAAE,GAAG;QAE3C,IAAK,IAAI,IAAI,GAAG,IAAI,OAAO,IAAK;YAC9B,MAAM,QAAQ,mBAAmB,AAAC,IAAI,QAAS,KAAK,EAAE,GAAG;YACzD,+CAA+C;YAC/C,MAAM,UAAU,IAAI,MAAM,IAAI,MAAM,MAAM,QAAQ;YAClD,MAAM,KAAK,KAAK,KAAK,GAAG,CAAC,SAAS,YAAY;YAC9C,MAAM,KAAK,KAAK,KAAK,GAAG,CAAC,SAAS,YAAY;YAC9C,IAAI,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI;iBACvB,IAAI,MAAM,CAAC,IAAI;QACtB;QACA,IAAI,SAAS;IACf;AACF;AAMO,MAAM,4CAAgC,CAAC,KAAK,MAAM;IACvD,MAAM,MAAoB,QAAQ,OAAO,KAAK,MAAM;IACpD,MAAM,IAAI,OAAO;IACjB,MAAM,YAAY,IAAI,KAAK,KAAK,CAAC,QAAQ,IAAI,YAAY;IACzD,MAAM,SAAyD,EAAE;IAEjE,+CAA+C;IAC/C,IAAK,IAAI,IAAI,GAAG,IAAI,WAAW,IAAK;QAClC,MAAM,QAAQ,AAAC,IAAI,YAAa,KAAK,EAAE,GAAG,IAAI,AAAC,CAAA,QAAQ,GAAE,IAAK;QAC9D,MAAM,OAAO,IAAK,CAAA,MAAM,QAAQ,GAAE;QAClC,OAAO,IAAI,CAAC;mBACV;YACA,GAAG,KAAK,GAAG,CAAC,SAAS;YACrB,GAAG,KAAK,GAAG,CAAC,SAAS;QACvB;IACF;IACA,mCAAmC;IACnC,OAAO,IAAI,CAAC,CAAC,GAAG,IAAM,EAAE,KAAK,GAAG,EAAE,KAAK;IAEvC,IAAI,SAAS;IACb,IAAI,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;IACnC,IAAK,IAAI,IAAI,GAAG,IAAI,OAAO,MAAM,EAAE,IACjC,IAAI,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;IAErC,IAAI,SAAS;AACf;AAKO,MAAM,4CAA6B,CAAC,KAAK,MAAM;IACpD,MAAM,MAAoB,QAAQ,OAAO,KAAK,MAAM;IACpD,MAAM,IAAI,OAAO;IACjB,MAAM,WAAW,MAAM,QAAQ,KAAK,mBAAmB;IACvD,MAAM,aAAa,IAAK,CAAA,MAAM,QAAQ,GAAE;IACxC,MAAM,YAAY,QAAQ,KAAK,EAAE,GAAG;IAEpC,eAAe;IACf,IAAI,SAAS;IACb,IAAI,GAAG,CAAC,GAAG,GAAG,GAAG,GAAG,KAAK,EAAE,GAAG;IAE9B,4CAA4C;IAC5C,MAAM,KAAK,KAAK,GAAG,CAAC,aAAa;IACjC,MAAM,KAAK,KAAK,GAAG,CAAC,aAAa;IACjC,sDAAsD;IACtD,IAAI,MAAM,CAAC,KAAK,IAAI,UAAU;IAC9B,IAAI,GAAG,CAAC,IAAI,IAAI,IAAI,UAAU,GAAG,KAAK,EAAE,GAAG,GAAG;AAChD;AAKO,MAAM,4CAA4B,CAAC,KAAK,MAAM;IACnD,MAAM,MAAoB,QAAQ,OAAO,KAAK,MAAM;IACpD,MAAM,IAAI,OAAO;IACjB,MAAM,WAAW,KAAK,KAAK,KAAK,CAAC,QAAQ;IACzC,MAAM,aAAa,QAAQ,KAAK,EAAE,GAAG;IACrC,MAAM,YAAY,AAAC,CAAA,QAAQ,GAAE,IAAK;IAElC,qBAAqB;IACrB,MAAM,QAAyC,EAAE;IACjD,IAAI,QAAQ;IACZ,IAAI,KAAK,GAAG,KAAK;IACjB,IAAK,IAAI,IAAI,GAAG,KAAK,UAAU,IAAK;QAClC,MAAM,IAAI,CAAC;YAAE,GAAG;YAAI,GAAG;QAAG;QAC1B,MAAM,UAAU,AAAC,IAAI,WAAa,CAAA,MAAM,QAAQ,GAAE;QAClD,SAAS,YAAY,AAAC,CAAA,QAAQ,GAAE,IAAK;QACrC,MAAM,KAAK,GAAG,CAAC,SAAS;QACxB,MAAM,KAAK,GAAG,CAAC,SAAS;IAC1B;IAEA,6DAA6D;IAC7D,IAAI,SAAS;IACb,MAAM,WAA4C,EAAE;IACpD,MAAM,YAA6C,EAAE;IAErD,IAAK,IAAI,IAAI,GAAG,IAAI,MAAM,MAAM,EAAE,IAAK;QACrC,MAAM,IAAI,IAAK,CAAA,MAAM,MAAM,GAAG,CAAA;QAC9B,MAAM,QAAQ,IAAI,OAAQ,CAAA,IAAI,IAAI,GAAE,GAAI,2BAA2B;QACnE,MAAM,OAAO,KAAK,CAAC,KAAK,GAAG,CAAC,IAAI,GAAG,MAAM,MAAM,GAAG,GAAG;QACrD,MAAM,KAAK,KAAK,CAAC,GAAG,KAAK,CAAC,EAAE,CAAC,CAAC;QAC9B,MAAM,KAAK,KAAK,CAAC,GAAG,KAAK,CAAC,EAAE,CAAC,CAAC;QAC9B,MAAM,MAAM,KAAK,KAAK,CAAC,IAAI,OAAO;QAClC,MAAM,KAAK,CAAC,KAAK;QACjB,MAAM,KAAK,KAAK;QAChB,SAAS,IAAI,CAAC;YAAE,GAAG,KAAK,CAAC,EAAE,CAAC,CAAC,GAAG,KAAK;YAAO,GAAG,KAAK,CAAC,EAAE,CAAC,CAAC,GAAG,KAAK;QAAM;QACvE,UAAU,IAAI,CAAC;YAAE,GAAG,KAAK,CAAC,EAAE,CAAC,CAAC,GAAG,KAAK;YAAO,GAAG,KAAK,CAAC,EAAE,CAAC,CAAC,GAAG,KAAK;QAAM;IAC1E;IAEA,IAAI,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC;IACvC,IAAK,IAAI,IAAI,GAAG,IAAI,SAAS,MAAM,EAAE,IACnC,IAAI,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC;IAEzC,IAAK,IAAI,IAAI,UAAU,MAAM,GAAG,GAAG,KAAK,GAAG,IACzC,IAAI,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,EAAE,SAAS,CAAC,EAAE,CAAC,CAAC;IAE3C,IAAI,SAAS;AACf;AAKO,MAAM,4CAA8B,CAAC,KAAK,MAAM;IACrD,MAAM,MAAoB,QAAQ,OAAO,KAAK,MAAM;IACpD,MAAM,IAAI,OAAO;IACjB,MAAM,YAAY,IAAI,KAAK,KAAK,CAAC,QAAQ,IAAI,YAAY;IACzD,MAAM,aAAa,QAAQ,KAAK,EAAE,GAAG;IACrC,MAAM,WAAW,IAAI;IAErB,IAAI,SAAS;IACb,IAAK,IAAI,IAAI,GAAG,IAAI,WAAW,IAAK;QAClC,MAAM,IAAI,AAAC,IAAK,CAAA,YAAY,CAAA,IAAM,KAAK,cAAc;QACrD,MAAM,KAAK,KAAK,GAAG,CAAC,cAAc,WAAW;QAC7C,MAAM,KAAK,KAAK,GAAG,CAAC,cAAc,WAAW;QAC7C,uCAAuC;QACvC,MAAM,YAAY,aAAa,KAAK,EAAE,GAAG;QACzC,MAAM,UAAU,AAAC,CAAA,QAAQ,GAAE,IAAK,IAAI;QACpC,MAAM,KAAK,KAAK,KAAK,GAAG,CAAC,aAAa;QACtC,MAAM,KAAK,KAAK,KAAK,GAAG,CAAC,aAAa;QACtC,MAAM,QAAQ,IAAK,CAAA,OAAO,QAAQ,GAAE;QACpC,IAAI,MAAM,CAAC,KAAK,OAAO;QACvB,IAAI,GAAG,CAAC,IAAI,IAAI,OAAO,GAAG,KAAK,EAAE,GAAG;IACtC;AACF;AAKO,MAAM,4CAA6B,CAAC,KAAK,MAAM;IACpD,MAAM,MAAoB,QAAQ,OAAO,KAAK,MAAM;IACpD,MAAM,IAAI,OAAO;IACjB,MAAM,aAAa,IAAI,KAAK,KAAK,CAAC,QAAQ,IAAI,cAAc;IAC5D,MAAM,SAA0C,EAAE;IAElD,IAAK,IAAI,IAAI,GAAG,IAAI,YAAY,IAAK;QACnC,MAAM,QAAQ,AAAC,IAAI,aAAc,KAAK,EAAE,GAAG;QAC3C,MAAM,UAAU,IAAI,MAAM;QAC1B,MAAM,OAAO,UACT,IAAK,CAAA,MAAM,QAAQ,IAAK,iCAAiC;QAApC,IACrB,IAAK,CAAA,OAAO,QAAQ,GAAE,GAAI,oBAAoB;QAClD,OAAO,IAAI,CAAC;YACV,GAAG,KAAK,GAAG,CAAC,SAAS;YACrB,GAAG,KAAK,GAAG,CAAC,SAAS;QACvB;IACF;IAEA,IAAI,SAAS;IACb,IAAI,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;IACnC,IAAK,IAAI,IAAI,GAAG,IAAI,OAAO,MAAM,EAAE,IAAK;QACtC,MAAM,OAAO,MAAM,CAAC,EAAE;QACtB,MAAM,OAAO,MAAM,CAAC,AAAC,CAAA,IAAI,CAAA,IAAK,OAAO,MAAM,CAAC;QAC5C,MAAM,MAAM,AAAC,CAAA,KAAK,CAAC,GAAG,KAAK,CAAC,AAAD,IAAK,IAAI,AAAC,CAAA,QAAQ,GAAE,IAAK,IAAI;QACxD,MAAM,MAAM,AAAC,CAAA,KAAK,CAAC,GAAG,KAAK,CAAC,AAAD,IAAK,IAAI,AAAC,CAAA,QAAQ,GAAE,IAAK,IAAI;QACxD,IAAI,gBAAgB,CAAC,KAAK,KAAK,KAAK,CAAC,EAAE,KAAK,CAAC;IAC/C;IACA,IAAI,SAAS;AACf;AAKO,MAAM,4CAAiC,CAAC,KAAK,MAAM;IACxD,MAAM,MAAoB,QAAQ,OAAO,KAAK,MAAM;IACpD,MAAM,IAAI,OAAO;IACjB,MAAM,eAAe,IAAI,KAAK,KAAK,CAAC,QAAQ,IAAI,MAAM;IAEtD,kDAAkD;IAClD,MAAM,YAAY,IAAI,eAAe;IACrC,MAAM,SAA0C,EAAE;IAClD,IAAK,IAAI,IAAI,GAAG,IAAI,WAAW,IAAK;QAClC,MAAM,QAAQ,AAAC,IAAI,YAAa,KAAK,EAAE,GAAG;QAC1C,MAAM,OAAO,IAAI,MAAM,IAAI,MAAM,MAAM,QAAQ;QAC/C,OAAO,IAAI,CAAC;YACV,GAAG,KAAK,GAAG,CAAC,SAAS,IAAI;YACzB,GAAG,KAAK,GAAG,CAAC,SAAS,IAAI;QAC3B;IACF;IAEA,IAAI,SAAS;IACb,sEAAsE;IACtE,IAAK,IAAI,IAAI,GAAG,IAAI,OAAO,MAAM,EAAE,IAAK;QACtC,MAAM,OAAO,MAAM,CAAC,AAAC,CAAA,IAAI,CAAA,IAAK,OAAO,MAAM,CAAC;QAC5C,IAAI,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;QACnC,IAAI,MAAM,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC;QACzB,oBAAoB;QACpB,IAAI,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;QACnC,IAAI,MAAM,CAAC,GAAG;QACd,wCAAwC;QACxC,IAAI,IAAI,MAAM,KAAK,IAAI,IAAI,OAAO,MAAM,EAAE;YACxC,IAAI,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;YACnC,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QAC7C;IACF;IACA,aAAa;IACb,IAAI,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;IACnC,IAAK,IAAI,IAAI,GAAG,IAAI,OAAO,MAAM,EAAE,IACjC,IAAI,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;IAErC,IAAI,SAAS;AACf;AAKO,MAAM,4CAAgC,CAAC,KAAK,MAAM;IACvD,MAAM,MAAoB,QAAQ,OAAO,KAAK,MAAM;IACpD,MAAM,IAAI,OAAO;IACjB,MAAM,MAAM,AAAC,CAAA,IAAI,KAAK,IAAI,CAAC,EAAC,IAAK,GAAG,eAAe;IACnD,MAAM,SAAS,QAAQ;IAEvB,IAAI,SAAS;IACb,IAAI,QAAQ;QACV,4CAA4C;QAC5C,MAAM,OAAO,CAAC;QACd,MAAM,UAAU,IAAK,CAAA,IAAI,GAAE;QAC3B,MAAM,OAAO,IAAK,CAAA,IAAI,MAAM,CAAA,IAAK;QACjC,MAAM,QAAQ,IAAI;QAClB,IAAI,MAAM,CAAC,GAAG;QACd,IAAI,MAAM,CAAC,OAAO;QAClB,IAAI,MAAM,CAAC,GAAG;QACd,IAAI,MAAM,CAAC,CAAC,OAAO;IACrB,OAAO;QACL,8BAA8B;QAC9B,MAAM,OAAO,CAAC;QACd,MAAM,UAAU,IAAI;QACpB,MAAM,OAAO,CAAC,IAAI;QAClB,MAAM,QAAQ,IAAI;QAClB,IAAI,MAAM,CAAC,GAAG;QACd,IAAI,MAAM,CAAC,OAAO;QAClB,IAAI,MAAM,CAAC,GAAG;QACd,IAAI,MAAM,CAAC,CAAC,OAAO;IACrB;IACA,IAAI,SAAS;AACf;AAKO,MAAM,4CAAqC,CAAC,KAAK,MAAM;IAC5D,MAAM,IAAI,OAAO;IACjB,mCAAmC;IACnC,MAAM,QAAQ,EAAE;IAChB,IAAK,IAAI,IAAI,GAAG,IAAI,GAAG,IAAK;QAC1B,MAAM,QAAQ,AAAC,IAAI,IAAK,KAAK,EAAE,GAAG,IAAI,KAAK,EAAE,GAAG;QAChD,MAAM,IAAI,CAAC;YAAE,GAAG,KAAK,GAAG,CAAC,SAAS,IAAI;YAAK,GAAG,KAAK,GAAG,CAAC,SAAS,IAAI;QAAI;IAC1E;IACA,0CAA0C;IAC1C,MAAM,UAAU,KAAK,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,GAAG,KAAK,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC,GAAG,KAAK,CAAC,EAAE,CAAC,CAAC;IAE3E,IAAI,SAAS;IACb,IAAK,IAAI,IAAI,GAAG,IAAI,GAAG,IAAK;QAC1B,MAAM,OAAO,KAAK,CAAC,AAAC,CAAA,IAAI,CAAA,IAAK,EAAE;QAC/B,MAAM,KAAK,KAAK,CAAC,AAAC,CAAA,IAAI,CAAA,IAAK,EAAE;QAC7B,MAAM,SAAS,KAAK,CAAC,EAAE;QACvB,MAAM,aAAa,KAAK,KAAK,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC,EAAE,KAAK,CAAC,GAAG,OAAO,CAAC;QAClE,MAAM,WAAW,KAAK,KAAK,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC;QAC5D,IAAI,MAAM,GAAG,IAAI,MAAM,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC;QACtC,IAAI,GAAG,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC,EAAE,SAAS,YAAY;IACnD;IACA,IAAI,SAAS;AACf;AAKO,MAAM,4CAA+B,CAAC,KAAK,MAAM;IACtD,MAAM,MAAoB,QAAQ,OAAO,KAAK,MAAM;IACpD,MAAM,IAAI,OAAO;IACjB,MAAM,WAAW,KAAK,KAAK,KAAK,CAAC,QAAQ,KAAK,aAAa;IAC3D,MAAM,mBAAmB,MAAM,QAAQ;IAEvC,IAAI,SAAS;IACb,IAAK,IAAI,IAAI,GAAG,IAAI,UAAU,IAAK;QACjC,yDAAyD;QACzD,MAAM,KAAK,KAAK,GAAG,CAAC,OAAO;QAC3B,MAAM,KAAK;QACX,MAAM,MAAM,KAAK,IAAI,CAAC,KAAK,KAAK,GAAG,CAAC,OAAO;QAC3C,MAAM,QAAQ,KAAK,KAAK,EAAE,GAAG;QAC7B,MAAM,KAAK,KAAK,GAAG,CAAC,SAAS,MAAM;QACnC,MAAM,KAAK,KAAK,GAAG,CAAC,SAAS,MAAM;QACnC,MAAM,OAAO,IAAK,CAAA,OAAO,QAAQ,IAAG;QACpC,IAAI,MAAM,CAAC,KAAK,MAAM;QACtB,IAAI,GAAG,CAAC,IAAI,IAAI,MAAM,GAAG,KAAK,EAAE,GAAG;IACrC;AACF;AAKO,MAAM,4CAAoC,CAAC,KAAK,MAAM;IAC3D,MAAM,MAAoB,QAAQ,OAAO,KAAK,MAAM;IACpD,MAAM,IAAI,OAAO;IACjB,MAAM,SAAS,QAAQ,KAAK,EAAE;IAC9B,MAAM,SAAS,SAAS,KAAK,EAAE,GAAG,IAAI,AAAC,CAAA,QAAQ,GAAE,IAAK;IACtD,MAAM,UAAU,IAAK,CAAA,OAAO,QAAQ,IAAG;IACvC,MAAM,WAAW,QAAQ;IAEzB,gCAAgC;IAChC,MAAM,KAAK,IAAK,CAAA,MAAM,QAAQ,GAAE;IAChC,MAAM,KAAK,IAAK,CAAA,MAAM,QAAQ,GAAE;IAEhC,iBAAiB;IACjB,IAAI,SAAS;IACb,IAAI,OAAO,CAAC,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,KAAK,EAAE,GAAG;IAE1C,qCAAqC;IACrC,MAAM,OAAO,KAAK,GAAG,CAAC;IACtB,MAAM,OAAO,KAAK,GAAG,CAAC;IACtB,IAAK,IAAI,IAAI,CAAC,GAAG,KAAK,GAAG,KAAK,QAAS;QACrC,MAAM,MAAM,IAAI,OAAO,IAAI;QAC3B,MAAM,MAAM,IAAI,OAAO,IAAI;QAC3B,MAAM,MAAM,IAAI,OAAO,IAAI;QAC3B,MAAM,MAAM,IAAI,OAAO,IAAI;QAC3B,IAAI,MAAM,CAAC,KAAK;QAChB,IAAI,MAAM,CAAC,KAAK;IAClB;IAEA,IAAI,UAAU;QACZ,MAAM,OAAO,KAAK,GAAG,CAAC;QACtB,MAAM,OAAO,KAAK,GAAG,CAAC;QACtB,IAAK,IAAI,IAAI,CAAC,GAAG,KAAK,GAAG,KAAK,UAAU,IAAK;YAC3C,MAAM,MAAM,IAAI,OAAO,IAAI;YAC3B,MAAM,MAAM,IAAI,OAAO,IAAI;YAC3B,MAAM,MAAM,IAAI,OAAO,IAAI;YAC3B,MAAM,MAAM,IAAI,OAAO,IAAI;YAC3B,IAAI,MAAM,CAAC,KAAK;YAChB,IAAI,MAAM,CAAC,KAAK;QAClB;IACF;AACF;AAIO,MAAM,4CAAiD;IAC5D,MAAM;IACN,MAAM;IACN,WAAW;IACX,cAAc;IACd,YAAY;IACZ,UAAU;IACV,MAAM;IACN,YAAY;IACZ,aAAa;IACb,UAAU;IACV,SAAS;IACT,WAAW;IACX,UAAU;IACV,cAAc;IACd,aAAa;IACb,kBAAkB;IAClB,YAAY;IACZ,iBAAiB;AACnB;;;ANhjBO,MAAM,4CAAuC;IAClD,GAAG,CAAA,GAAA,yCAAU,CAAC;IACd,GAAG,CAAA,GAAA,yCAAY,CAAC;IAChB,GAAG,CAAA,GAAA,yCAAW,CAAC;IACf,GAAG,CAAA,GAAA,yCAAe,CAAC;AACrB;;;ADTO,MAAM,4CAA0C;IACrD;IACA;IACA;IACA;IACA;IACA;IACA;IACA;CACD;AAMM,SAAS,0CAAc,GAAiB;IAC7C,IAAI,QAAQ,KAAK,OAAO;IACxB,OAAO,yCAAW,CAAC,IAAI,KAAK,KAAK,CAAC,QAAS,CAAA,0CAAY,MAAM,GAAG,CAAA,GAAI;AACtE;AAqBA,MAAM,sCAA+B;IACnC;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;CACD;AAEM,SAAS,0CAAgB,GAAiB;IAC/C,OAAO,mCAAa,CAAC,KAAK,KAAK,CAAC,QAAQ,oCAAc,MAAM,EAAE;AAChE;AAgCO,SAAS,0CACd,GAA6B,EAC7B,KAAa,EACb,CAAS,EACT,CAAS,EACT,MAAuB;IAEvB,MAAM,aAAE,SAAS,eAAE,WAAW,eAAE,WAAW,QAAE,IAAI,YAAE,QAAQ,EAAE,GAAG;IAChE,IAAI,IAAI;IACR,IAAI,SAAS,CAAC,GAAG;IACjB,IAAI,MAAM,CAAC,AAAC,WAAW,KAAK,EAAE,GAAI;IAClC,IAAI,SAAS,GAAG;IAChB,IAAI,WAAW,GAAG;IAClB,IAAI,SAAS,GAAG;IAEhB,MAAM,eAAe,CAAA,GAAA,yCAAK,CAAC,CAAC,MAAM;IAClC,IAAI,cAAc;QAChB,aAAa,KAAK;QAClB,IAAI,IAAI;QACR,IAAI,MAAM;IACZ;IAEA,IAAI,OAAO;AACb;AAEA;;CAEC,GACD,SAAS,uCACP,GAA6B,EAC7B,KAAkB,EAClB,SAAiB,EACjB,WAAmB,EACnB,WAAmB,EACnB,IAAY,EACZ,GAAkB;IAElB,OAAQ;QACN,KAAK;YACH,IAAI,IAAI;YACR;QAEF,KAAK;YACH,IAAI,IAAI,IAAI,sCAAsC;YAClD,IAAI,WAAW,IAAI,KAAK,aAAa;YACrC,IAAI,IAAI;YACR,IAAI,WAAW,IAAI;YACnB,IAAI,MAAM;YACV;QAEF,KAAK;YACH,IAAI,IAAI;YACR,eAAe;YACf,IAAI,SAAS,GAAG,cAAc;YAC9B,IAAI,WAAW,IAAI;YACnB,IAAI,MAAM;YACV,IAAI,WAAW,IAAI;YACnB,eAAe;YACf,IAAI,SAAS,GAAG,cAAc;YAC9B,IAAI,WAAW,GAAG;YAClB,IAAI,MAAM;YACV;QAGF,KAAK;YACH,IAAI,IAAI;YACR,IAAI,WAAW,CAAC;gBAAC,OAAO;gBAAM,OAAO;aAAK;YAC1C,IAAI,MAAM;YACV,IAAI,WAAW,CAAC,EAAE;YAClB;QAEF,KAAK;YAAc;gBACjB,sEAAsE;gBACtE,MAAM,SAAS,IAAK,CAAA,MAAM,KAAK,KAAK,CAAC,QAAQ,KAAK,CAAA;gBAClD,MAAM,aAAa,IAAI,WAAW;gBAElC,sDAAsD;gBACtD,IAAI,WAAW,GAAG,aAAa;gBAC/B,IAAI,IAAI;gBACR,MAAM,YAAY,OAAQ,CAAA,MAAM,QAAQ,OAAO,CAAA;gBAC/C,IAAI,KAAK,CAAC,WAAW;gBACrB,IAAI,IAAI;gBACR,IAAI,OAAO;gBAEX,0DAA0D;gBAC1D,IAAI,WAAW,GAAG,aAAc,CAAA,OAAO,SAAS,CAAA;gBAChD,IAAK,IAAI,IAAI,GAAG,IAAI,QAAQ,IAAK;oBAC/B,8DAA8D;oBAC9D,MAAM,QAAQ,MAAM,QAAQ,KAAK,EAAE,GAAG,IAAI,IAAI,KAAK,EAAE,GAAG;oBACxD,MAAM,OAAO,MAAM,QAAQ,OAAO,OAAO,OAAO;oBAChD,MAAM,KAAK,KAAK,GAAG,CAAC,SAAS;oBAC7B,MAAM,KAAK,KAAK,GAAG,CAAC,SAAS;oBAC7B,IAAI,IAAI;oBACR,IAAI,SAAS,CAAC,IAAI;oBAClB,IAAI,IAAI;oBACR,IAAI,OAAO;gBACb;gBAEA,2EAA2E;gBAC3E,4CAA4C;gBAC5C,IAAI,WAAW,GAAG,aAAa;gBAC/B,IAAI,IAAI;gBACR,MAAM,aAAa,OAAQ,CAAA,MAAM,QAAQ,OAAO,CAAA;gBAChD,IAAI,KAAK,CAAC,YAAY;gBACtB,sCAAsC;gBACtC,MAAM,WAAW,IAAI,SAAS;gBAC9B,IAAI,OAAO,cAAc,UACvB,IAAI,SAAS,GAAG,UAAU,OAAO,CAAC,aAAa,CAAC;oBAC9C,MAAM,IAAI,WAAW;oBACrB,OAAO,KAAK,GAAG,CAAC,GAAG,IAAI,KAAK,OAAO,CAAC,KAAK;gBAC3C;gBAEF,IAAI,IAAI;gBACR,IAAI,SAAS,GAAG;gBAChB,IAAI,OAAO;gBAEX,oEAAoE;gBACpE,IAAI,OAAO,OAAO,IAAI;oBACpB,MAAM,eAAe,IAAI,KAAK,KAAK,CAAC,QAAQ;oBAC5C,MAAM,aAAa,OAAO;oBAC1B,IAAI,IAAI;oBACR,IAAI,wBAAwB,GAAG;oBAC/B,IAAI,WAAW,GAAG,MAAM,QAAQ;oBAChC,IAAK,IAAI,KAAK,GAAG,KAAK,cAAc,KAAM;wBACxC,MAAM,YAAY,QAAQ,KAAK,EAAE,GAAG;wBACpC,MAAM,WAAW,aAAc,CAAA,OAAO,QAAQ,IAAG;wBACjD,MAAM,QAAQ,OAAQ,CAAA,OAAO,QAAQ,IAAG;wBACxC,IAAI,SAAS;wBACb,IAAI,GAAG,CACL,KAAK,GAAG,CAAC,aAAa,UACtB,KAAK,GAAG,CAAC,aAAa,UACtB,OAAO,GAAG,KAAK,EAAE,GAAG;wBAEtB,IAAI,IAAI;oBACV;oBACA,IAAI,OAAO;gBACb;gBAEA,IAAI,WAAW,GAAG;gBAClB,wDAAwD;gBACxD,IAAI,WAAW,IAAI;gBACnB,IAAI,SAAS,GAAG,cAAc;gBAC9B,IAAI,MAAM;gBACV,IAAI,WAAW,IAAI;gBACnB;YACF;QAEA,KAAK;YAAW;gBACd,mEAAmE;gBACnE,MAAM,cAAc,IAAI,WAAW;gBACnC,IAAI,WAAW,GAAG,cAAc;gBAChC,IAAI,IAAI;gBACR,IAAI,WAAW,GAAG;gBAElB,uCAAuC;gBACvC,IAAI,IAAI;gBACR,IAAI,IAAI;gBACR,MAAM,eAAe,KAAK,GAAG,CAAC,GAAG,OAAO;gBACxC,MAAM,aAAa,MAAM,QAAQ,KAAK,EAAE,GAAG,KAAK,EAAE,GAAG;gBACrD,IAAI,SAAS,GAAG,KAAK,GAAG,CAAC,KAAK,cAAc;gBAC5C,IAAI,WAAW,GAAG,cAAc;gBAEhC,8CAA8C;gBAC9C,MAAM,SAAS,OAAO;gBACtB,MAAM,MAAM,KAAK,GAAG,CAAC;gBACrB,MAAM,MAAM,KAAK,GAAG,CAAC;gBACrB,IAAK,IAAI,IAAI,CAAC,QAAQ,KAAK,QAAQ,KAAK,aAAc;oBACpD,IAAI,SAAS;oBACb,IAAI,MAAM,CAAC,IAAI,MAAM,SAAS,KAAK,IAAI,MAAM,SAAS;oBACtD,IAAI,MAAM,CAAC,IAAI,MAAM,SAAS,KAAK,IAAI,MAAM,SAAS;oBACtD,IAAI,MAAM;gBACZ;gBACA,mEAAmE;gBACnE,IAAI,CAAC,OAAO,QAAQ,KAAK;oBACvB,MAAM,aAAa,aAAa,KAAK,EAAE,GAAG;oBAC1C,MAAM,OAAO,KAAK,GAAG,CAAC;oBACtB,MAAM,OAAO,KAAK,GAAG,CAAC;oBACtB,IAAI,WAAW,GAAG,cAAc;oBAChC,IAAK,IAAI,IAAI,CAAC,QAAQ,KAAK,QAAQ,KAAK,eAAe,IAAK;wBAC1D,IAAI,SAAS;wBACb,IAAI,MAAM,CAAC,IAAI,OAAO,SAAS,MAAM,IAAI,OAAO,SAAS;wBACzD,IAAI,MAAM,CAAC,IAAI,OAAO,SAAS,MAAM,IAAI,OAAO,SAAS;wBACzD,IAAI,MAAM;oBACZ;gBACF;gBACA,IAAI,OAAO;gBACX,IAAI,WAAW,GAAG;gBAClB,iBAAiB;gBACjB,IAAI,WAAW,IAAI;gBACnB,IAAI,MAAM;gBACV,IAAI,WAAW,IAAI;gBACnB;YACF;QAEA,KAAK;YAAc;gBACjB,0DAA0D;gBAC1D,6CAA6C;gBAC7C,MAAM,cAAc,IAAI,WAAW;gBACnC,IAAI,WAAW,GAAG,cAAc;gBAChC,IAAI,IAAI;gBACR,IAAI,WAAW,GAAG;gBAElB,kEAAkE;gBAClE,MAAM,eAAe,MAAM,MAAM,QAAQ,OAAO,KAAK,SAAS;gBAC9D,MAAM,SAAS,OAAO;gBACtB,MAAM,SAAS,SAAU,CAAA,AAAC,CAAA,IAAI,YAAW,IAAK,YAAW;gBACzD,IAAI,WAAW,CAAC;oBAAC;oBAAQ;iBAAO;gBAChC,4DAA4D;gBAC5D,IAAI,cAAc,GAAG,MAAM,QAAQ,SAAS,IAAI;gBAChD,8CAA8C;gBAC9C,IAAI,SAAS,GAAG,cAAc;gBAC9B,IAAI,MAAM;gBACV,IAAI,WAAW,CAAC,EAAE;gBAClB,IAAI,cAAc,GAAG;gBACrB;YACF;QAEA,KAAK;YAAW;gBACd,sDAAsD;gBACtD,MAAM,cAAc,IAAI,WAAW;gBACnC,IAAI,WAAW,GAAG,cAAc;gBAChC,IAAI,IAAI,IAAI,aAAa;gBACzB,IAAI,WAAW,GAAG;gBAElB,IAAI,IAAI;gBACR,IAAI,IAAI;gBACR,MAAM,aAAa,KAAK,GAAG,CAAC,GAAG,OAAO;gBACtC,MAAM,SAAS,OAAO;gBACtB,IAAI,WAAW,GAAG,cAAc;gBAChC,IAAK,IAAI,KAAK,CAAC,QAAQ,MAAM,QAAQ,MAAM,WACzC,IAAK,IAAI,KAAK,CAAC,QAAQ,MAAM,QAAQ,MAAM,WAAY;oBACrD,4CAA4C;oBAC5C,MAAM,KAAK,MAAM,AAAC,CAAA,QAAQ,GAAE,IAAK,aAAa,MAAM;oBACpD,MAAM,KAAK,MAAM,AAAC,CAAA,QAAQ,GAAE,IAAK,aAAa,MAAM;oBACpD,MAAM,OAAO,MAAM,aAAc,CAAA,OAAO,QAAQ,GAAE,IAAK,aAAa;oBACpE,IAAI,SAAS;oBACb,IAAI,GAAG,CAAC,KAAK,IAAI,KAAK,IAAI,MAAM,GAAG,KAAK,EAAE,GAAG;oBAC7C,IAAI,IAAI;gBACV;gBAEF,IAAI,OAAO;gBACX,IAAI,WAAW,GAAG;gBAClB,UAAU;gBACV,IAAI,WAAW,IAAI;gBACnB,IAAI,MAAM;gBACV,IAAI,WAAW,IAAI;gBACnB;YACF;QAEA,KAAK;YAAW;gBACd,iEAAiE;gBACjE,MAAM,eAAe,IAAI,WAAW;gBACpC,6CAA6C;gBAC7C,IAAI,WAAW,GAAG,eAAe;gBACjC,IAAI,SAAS,GAAG;gBAChB,IAAI,QAAQ,CAAC,CAAC,OAAO,KAAK,CAAC,OAAO,KAAK,OAAO,KAAK,OAAO;gBAC1D,0CAA0C;gBAC1C,IAAI,wBAAwB,GAAG;gBAC/B,IAAI,WAAW,GAAG;gBAClB,IAAI,IAAI;gBACR,IAAI,wBAAwB,GAAG;gBAC/B,IAAI,WAAW,GAAG;gBAClB,+BAA+B;gBAC/B,IAAI,WAAW,IAAI;gBACnB,IAAI,MAAM;gBACV,IAAI,WAAW,IAAI;gBACnB;YACF;QAEA,KAAK;YAAe;gBAClB,2DAA2D;gBAC3D,MAAM,cAAc,IAAI,WAAW;gBACnC,IAAI,WAAW,GAAG,cAAc;gBAChC,IAAI,IAAI,IAAI,YAAY;gBACxB,IAAI,WAAW,GAAG;gBAElB,IAAI,IAAI;gBACR,IAAI,IAAI;gBACR,MAAM,eAAe,KAAK,GAAG,CAAC,KAAK,OAAO;gBAC1C,MAAM,UAAU,OAAO;gBACvB,IAAI,WAAW,GAAG,cAAc;gBAChC,IAAK,IAAI,KAAK,CAAC,SAAS,MAAM,SAAS,MAAM,aAC3C,IAAK,IAAI,KAAK,CAAC,SAAS,MAAM,SAAS,MAAM,aAAc;oBACzD,IAAI,CAAC,KAAK;oBACV,MAAM,KAAK,AAAC,CAAA,QAAQ,GAAE,IAAK,eAAe;oBAC1C,MAAM,KAAK,AAAC,CAAA,QAAQ,GAAE,IAAK,eAAe;oBAC1C,MAAM,aAAa,QAAQ,MAAM,MAAM;oBACvC,MAAM,WAAW,OAAO,QAAQ;oBAChC,IAAI,WAAW,GAAG,cAAc;oBAChC,IAAI,SAAS,GAAG,CAAC,KAAK,EAAE,WAAW,CAAC,EAAE,WAAW,CAAC,EAAE,WAAW,GAAG,CAAC;oBACnE,MAAM,UAAU,eAAgB,CAAA,MAAM,QAAQ,GAAE;oBAChD,IAAI,QAAQ,CAAC,KAAK,IAAI,KAAK,IAAI,SAAS;gBAC1C;gBAEF,IAAI,OAAO;gBACX,IAAI,SAAS,GAAG;gBAChB,IAAI,WAAW,GAAG;gBAClB,IAAI,WAAW,IAAI;gBACnB,IAAI,MAAM;gBACV,IAAI,WAAW,IAAI;gBACnB;YACF;QAEA,KAAK;YAAc;gBACjB,8DAA8D;gBAC9D,MAAM,cAAc,IAAI,WAAW;gBACnC,IAAI,WAAW,GAAG,cAAc;gBAChC,IAAI,IAAI,IAAI,YAAY;gBACxB,IAAI,WAAW,GAAG;gBAElB,IAAI,IAAI;gBACR,IAAI,IAAI;gBACR,MAAM,mBAAmB,KAAK,GAAG,CAAC,GAAG,OAAO;gBAC5C,MAAM,UAAU,OAAO;gBACvB,MAAM,WAAW,MAAM,IAAI,QAAQ,IAAI;gBACvC,MAAM,UAAU,MAAM,OAAQ,CAAA,OAAO,QAAQ,IAAG,IAAK,OAAO;gBAC5D,MAAM,aAAa,MAAM,QAAQ,KAAK,EAAE,GAAG,KAAK,EAAE,GAAG;gBACrD,IAAI,SAAS,GAAG,KAAK,GAAG,CAAC,KAAK,cAAc;gBAC5C,IAAI,WAAW,GAAG,cAAc;gBAEhC,MAAM,OAAO,KAAK,GAAG,CAAC;gBACtB,MAAM,OAAO,KAAK,GAAG,CAAC;gBACtB,IAAK,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS,KAAK,iBAAkB;oBAC1D,IAAI,SAAS;oBACb,IAAK,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS,KAAK,EAAG;wBAC3C,MAAM,OAAO,KAAK,GAAG,CAAC,AAAC,IAAI,UAAW,WAAW,KAAK,EAAE,IAAI;wBAC5D,MAAM,KAAK,IAAI,OAAO,AAAC,CAAA,IAAI,IAAG,IAAK;wBACnC,MAAM,KAAK,IAAI,OAAO,AAAC,CAAA,IAAI,IAAG,IAAK;wBACnC,IAAI,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,IAAI;6BAC9B,IAAI,MAAM,CAAC,IAAI;oBACtB;oBACA,IAAI,MAAM;gBACZ;gBACA,IAAI,OAAO;gBACX,IAAI,WAAW,GAAG;gBAClB,IAAI,WAAW,IAAI;gBACnB,IAAI,MAAM;gBACV,IAAI,WAAW,IAAI;gBACnB;YACF;QAEA,KAAK;YAAe;gBAClB,wDAAwD;gBACxD,MAAM,cAAc,IAAI,WAAW;gBACnC,IAAI,WAAW,GAAG,cAAc;gBAChC,IAAI,IAAI,IAAI,YAAY;gBACxB,IAAI,WAAW,GAAG;gBAElB,IAAI,IAAI;gBACR,IAAI,IAAI;gBACR,MAAM,YAAY,MAAM,IAAI,KAAK,KAAK,CAAC,QAAQ,KAAK;gBACpD,MAAM,UAAU,OAAO;gBACvB,IAAI,SAAS,GAAG,KAAK,GAAG,CAAC,KAAK,cAAc;gBAC5C,IAAI,WAAW,GAAG,cAAc;gBAEhC,IAAK,IAAI,IAAI,GAAG,IAAI,WAAW,IAAK;oBAClC,MAAM,SAAS,MAAM,AAAC,CAAA,QAAQ,GAAE,IAAK,UAAU,IAAI;oBACnD,MAAM,SAAS,MAAM,CAAC,UAAU,QAAQ,UAAU,MAAM,CAAC;oBACzD,IAAI,KAAK;oBACT,IAAI,KAAK;oBACT,MAAM,QAAQ,KAAM,CAAA,MAAM,KAAK,KAAK,CAAC,QAAQ,MAAM,EAAC;oBACpD,MAAM,UAAU,OAAO;oBAEvB,IAAI,SAAS;oBACb,IAAI,MAAM,CAAC,IAAI;oBACf,IAAK,IAAI,IAAI,GAAG,IAAI,OAAO,IAAK;wBAC9B,MAAM,QAAQ,MAAM,AAAC,CAAA,QAAQ,GAAE,IAAK,UAAU,MAAM;wBACpD,MAAM;wBACN,MAAM;wBACN,IAAI,MAAM,CAAC,IAAI;wBACf,0BAA0B;wBAC1B,IAAI,OAAO,QAAQ,OAAO,IAAI,KAAK,IAAI,QAAQ,GAAG;4BAChD,MAAM,YAAY,QAAQ,MAAM,KAAK;4BACrC,IAAI,KAAK;4BACT,IAAI,KAAK;4BACT,MAAM,SAAS,IAAI,KAAK,KAAK,CAAC,QAAQ;4BACtC,IAAI,MAAM,CAAC,IAAI;4BACf,IAAK,IAAI,KAAK,GAAG,KAAK,QAAQ,KAAM;gCAClC,MAAM,YAAY,UAAW,CAAA,MAAM,QAAQ,GAAE;gCAC7C,MAAM,UAAU;gCAChB,IAAI,MAAM,CAAC,IAAI;4BACjB;4BACA,IAAI,MAAM,CAAC,IAAI,KAAK,sBAAsB;wBAC5C;oBACF;oBACA,IAAI,MAAM;gBACZ;gBACA,IAAI,OAAO;gBACX,IAAI,WAAW,GAAG;gBAClB,IAAI,WAAW,IAAI;gBACnB,IAAI,MAAM;gBACV,IAAI,WAAW,IAAI;gBACnB;YACF;QAEA,KAAK;YAAgB;gBACnB,4DAA4D;gBAC5D,MAAM,cAAc,IAAI,WAAW;gBACnC,IAAI,WAAW,GAAG,cAAc;gBAChC,IAAI,IAAI,IAAI,aAAa;gBACzB,IAAI,WAAW,GAAG;gBAElB,IAAI,IAAI;gBACR,IAAI,IAAI;gBACR,MAAM,gBAAgB,KAAK,GAAG,CAAC,GAAG,OAAO;gBACzC,MAAM,UAAU,OAAO;gBACvB,IAAI,SAAS,GAAG,KAAK,GAAG,CAAC,KAAK,gBAAgB;gBAC9C,IAAI,WAAW,GAAG,cAAc;gBAEhC,qBAAqB;gBACrB,IAAK,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS,KAAK,gBAAgB,EAAG;oBAC3D,IAAI,SAAS;oBACb,IAAI,MAAM,CAAC,CAAC,SAAS;oBACrB,IAAI,MAAM,CAAC,SAAS;oBACpB,IAAI,MAAM;gBACZ;gBACA,6DAA6D;gBAC7D,IAAI,WAAW,GAAG,cAAc;gBAChC,IAAI,WAAW,GAAG;gBAClB,IAAK,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS,KAAK,gBAAgB,EAAG;oBAC3D,IAAI,SAAS;oBACb,IAAK,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS,KAAK,gBAAgB,EAAG;wBAC3D,yCAAyC;wBACzC,IAAI,MAAM,CAAC,GAAG;wBACd,IAAI,MAAM,CAAC,GAAG,IAAI;oBACpB;oBACA,IAAI,MAAM;gBACZ;gBACA,IAAI,WAAW,GAAG;gBAClB,IAAI,OAAO;gBACX,IAAI,WAAW,GAAG;gBAClB,IAAI,WAAW,IAAI;gBACnB,IAAI,MAAM;gBACV,IAAI,WAAW,IAAI;gBACnB;YACF;QAEA,KAAK;YAAc;gBACjB,gEAAgE;gBAChE,+DAA+D;gBAC/D,MAAM,eAAe,IAAI,WAAW;gBACpC,IAAI,WAAW,GAAG,eAAe;gBACjC,IAAI,IAAI;gBACR,IAAI,WAAW,GAAG;gBAElB,6DAA6D;gBAC7D,MAAM,eAAe,IAAK,CAAA,MAAM,KAAK,KAAK,CAAC,QAAQ,KAAK,CAAA;gBACxD,IAAI,SAAS,GAAG,cAAc;gBAC9B,IAAK,IAAI,KAAK,GAAG,KAAK,cAAc,KAAM;oBACxC,IAAI,WAAW,GAAG,eAAgB,CAAA,MAAM,KAAK,GAAE;oBAC/C,IAAI,IAAI;oBACR,gCAAgC;oBAChC,MAAM,UAAU,MAAM,AAAC,CAAA,QAAQ,GAAE,IAAK,OAAO,OAAO;oBACpD,MAAM,UAAU,MAAM,AAAC,CAAA,QAAQ,GAAE,IAAK,OAAO,OAAO;oBACpD,IAAI,SAAS,CAAC,SAAS;oBACvB,uDAAuD;oBACvD,MAAM,cAAc,IAAK,CAAA,MAAM,AAAC,CAAA,QAAQ,GAAE,IAAK,OAAO,CAAA;oBACtD,IAAI,KAAK,CAAC,aAAa;oBACvB,IAAI,MAAM;oBACV,IAAI,OAAO;gBACb;gBAEA,oEAAoE;gBACpE,IAAI,OAAO,OAAO,IAAI;oBACpB,MAAM,eAAe,IAAI,KAAK,KAAK,CAAC,QAAQ;oBAC5C,MAAM,aAAa,OAAO;oBAC1B,IAAI,IAAI;oBACR,IAAI,wBAAwB,GAAG;oBAC/B,IAAI,WAAW,GAAG,MAAM,QAAQ;oBAChC,IAAK,IAAI,KAAK,GAAG,KAAK,cAAc,KAAM;wBACxC,MAAM,YAAY,QAAQ,KAAK,EAAE,GAAG;wBACpC,MAAM,WAAW,aAAc,CAAA,MAAM,QAAQ,GAAE;wBAC/C,MAAM,QAAQ,OAAQ,CAAA,QAAQ,QAAQ,IAAG;wBACzC,IAAI,SAAS;wBACb,IAAI,GAAG,CACL,KAAK,GAAG,CAAC,aAAa,UACtB,KAAK,GAAG,CAAC,aAAa,UACtB,OAAO,GAAG,KAAK,EAAE,GAAG;wBAEtB,IAAI,IAAI;oBACV;oBACA,IAAI,OAAO;gBACb;gBAEA,IAAI,WAAW,GAAG;gBAClB;YACF;QAEA,KAAK;QACL;YACE,IAAI,IAAI;YACR,IAAI,MAAM;YACV;IACJ;AACF;AAMO,SAAS,0CACd,GAA6B,EAC7B,KAAa,EACb,CAAS,EACT,CAAS,EACT,MAA0B;IAE1B,MAAM,aACJ,SAAS,eACT,WAAW,eACX,WAAW,QACX,IAAI,YACJ,QAAQ,YACR,WAAW,EAAE,kBACb,iBAAiB,6BACjB,cAAc,uBACd,mBAAmB,iBACnB,aAAa,cACb,SAAS,mBACT,eAAe,eACf,cAAc,wBACd,GAAG,cACH,UAAU,eACV,cAAc,GACf,GAAG;IAEJ,IAAI,IAAI;IACR,IAAI,SAAS,CAAC,GAAG;IACjB,IAAI,MAAM,CAAC,AAAC,WAAW,KAAK,EAAE,GAAI;IAElC,uEAAuE;IACvE,IAAI,eAAe,aAAa,OAAO,IAAI;QACzC,MAAM,aAAa,OAAO;QAC1B,MAAM,cAAc,OAAO;QAC3B,IAAI,aAAa,GAAG,KAAK,GAAG,CAAC,aAAa,KAAK,EAAE,IAAI;QACrD,IAAI,aAAa,GAAG,KAAK,GAAG,CAAC,aAAa,KAAK,EAAE,IAAI;QACrD,IAAI,UAAU,GAAG;QACjB,IAAI,WAAW,GAAG;IACpB,OAAO,IAAI,aAAa,GAAG;QACzB,qCAAqC;QACrC,IAAI,UAAU,GAAG;QACjB,IAAI,WAAW,GAAG,aAAa;QAC/B,IAAI,aAAa,GAAG;QACpB,IAAI,aAAa,GAAG;IACtB;IAEA,6BAA6B;IAC7B,IAAI,iBAAiB;QACnB,MAAM,OAAO,IAAI,oBAAoB,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,OAAO;QAC5D,KAAK,YAAY,CAAC,GAAG;QACrB,KAAK,YAAY,CAAC,GAAG;QACrB,IAAI,SAAS,GAAG;IAClB,OACE,IAAI,SAAS,GAAG;IAGlB,IAAI,WAAW,GAAG;IAClB,IAAI,SAAS,GAAG;IAEhB,MAAM,eAAe,CAAA,GAAA,yCAAK,CAAC,CAAC,MAAM;IAClC,IAAI,cAAc;QAChB,aAAa,KAAK,MAAM;iBAAE;QAAI;QAC9B,uCAAiB,KAAK,aAAa,WAAW,aAAa,aAAa,MAAM;IAChF;IAEA,gEAAgE;IAChE,IAAI,UAAU,GAAG;IACjB,IAAI,aAAa,GAAG;IACpB,IAAI,aAAa,GAAG;IACpB,IAAI,WAAW,GAAG;IAElB,iEAAiE;IACjE,IAAI,eAAe,aAAa,OAAO,MAAM,KAAK;QAChD,MAAM,WAAW,OAAO;QACxB,MAAM,SAAS,OAAO;QACtB,MAAM,MAAM,KAAK,GAAG,CAAC,cAAc;QACnC,MAAM,MAAM,KAAK,GAAG,CAAC,cAAc;QACnC,MAAM,SAAS,IAAI,oBAAoB,CAAC,KAAK,KAAK,GAAG,KAAK,KAAK;QAC/D,4DAA4D;QAC5D,oEAAoE;QACpE,IAAI,SAAS;QACb,IAAI,OAAO,cAAc,YAAY,UAAU,UAAU,CAAC,QAAQ,UAAU,MAAM,IAAI,GAAG;YACvF,MAAM,IAAI,SAAS,UAAU,KAAK,CAAC,GAAG,IAAI;YAC1C,MAAM,IAAI,SAAS,UAAU,KAAK,CAAC,GAAG,IAAI;YAC1C,MAAM,IAAI,SAAS,UAAU,KAAK,CAAC,GAAG,IAAI;YAC1C,0DAA0D;YAC1D,SAAS,CAAC,EAAE,KAAK,KAAK,CAAC,IAAI,OAAO,QAAY,CAAC,EAAE,KAAK,KAAK,CAAC,IAAI,OAAO,QAAY,CAAC,EAAE,KAAK,KAAK,CAAC,IAAI,OAAO,QAAY,CAAC;QAC3H;QACA,OAAO,YAAY,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,MAAM,CAAC;QAC7C,OAAO,YAAY,CAAC,KAAK,CAAC,KAAK,EAAE,OAAO,MAAM,CAAC;QAC/C,OAAO,YAAY,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,GAAG,CAAC;QAC1C,MAAM,UAAU,IAAI,wBAAwB;QAC5C,IAAI,wBAAwB,GAAG;QAC/B,IAAI,SAAS,GAAG;QAChB,IAAI,SAAS;QACb,IAAI,GAAG,CAAC,KAAK,KAAK,UAAU,GAAG,KAAK,EAAE,GAAG;QACzC,IAAI,IAAI;QACR,IAAI,wBAAwB,GAAG;IACjC;IAEA,yCAAyC;IACzC,IAAI,SAAS,MAAM,GAAG,GACpB,CAAA,GAAA,yCAAc,EAAE,aAAa,CAAC,KAAK,UAAU;QAC3C,UAAU;qBACV;0BACA;wBACA;IACF;IAGF,IAAI,OAAO;AACb;AAaO,SAAS,0CACd,GAA6B,EAC7B,KAAa,EACb,CAAS,EACT,CAAS,EACT,MAA4E;IAE5E,MAAM,cAAE,aAAa,yBAAc,YAAY,GAAG,GAAG;IAErD,yBAAyB;IACzB,0CAAuB,KAAK,OAAO,GAAG,GAAG;IAEzC,yBAAyB;IACzB,IAAI,IAAI;IACR,MAAM,aAAa,IAAI,WAAW;IAClC,IAAI,WAAW,GAAG,aAAa,KAAK,4BAA4B;IAEhE,OAAQ;QACN,KAAK;YACH,iDAAiD;YACjD,0CAAuB,KAAK,OAAO,GAAG,IAAI,WAAW;gBACnD,GAAG,MAAM;gBACT,UAAU,CAAE,CAAA,OAAO,QAAQ,IAAI,CAAA;gBAC/B,MAAM,OAAO,IAAI,GAAG;YACtB;YACA;QACF,KAAK;YACH,0CAAuB,KAAK,OAAO,IAAI,WAAW,GAAG;gBACnD,GAAG,MAAM;gBACT,UAAU,MAAO,CAAA,OAAO,QAAQ,IAAI,CAAA;gBACpC,MAAM,OAAO,IAAI,GAAG;YACtB;YACA;QACF,KAAK;YACH,0BAA0B;YAC1B,0CAAuB,KAAK,OAAO,IAAI,YAAY,KAAK,IAAI,YAAY,KAAK;gBAC3E,GAAG,MAAM;gBACT,UAAU,KAAM,CAAA,OAAO,QAAQ,IAAI,CAAA;gBACnC,MAAM,OAAO,IAAI,GAAG;YACtB;YACA;QACF,KAAK;YACH,yBAAyB;YACzB,IAAK,IAAI,IAAI,GAAG,IAAI,GAAG,IAAK;gBAC1B,MAAM,QAAQ,AAAC,IAAI,IAAK,KAAK,EAAE,GAAG;gBAClC,MAAM,KAAK,IAAI,KAAK,GAAG,CAAC,SAAS;gBACjC,MAAM,KAAK,IAAI,KAAK,GAAG,CAAC,SAAS;gBACjC,IAAI,WAAW,GAAG,aAAc,CAAA,MAAM,IAAI,GAAE;gBAC5C,0CAAuB,KAAK,OAAO,IAAI,IAAI;oBACzC,GAAG,MAAM;oBACT,UAAU,AAAC,CAAA,OAAO,QAAQ,IAAI,CAAA,IAAK,IAAI;oBACvC,MAAM,OAAO,IAAI,GAAI,CAAA,OAAO,IAAI,IAAG;gBACrC;YACF;YACA;IACJ;IAEA,IAAI,WAAW,GAAG;IAClB,IAAI,OAAO;AACb;AAMO,SAAS,0CAAe,GAAiB;IAC9C,MAAM,OAAO;IACb,IAAI,OAAO,MAAM,OAAO;IACxB,IAAI,OAAO,MAAM,OAAO;IACxB,IAAI,OAAO,MAAM,OAAO;IACxB,IAAI,OAAO,MAAM,OAAO;IACxB,OAAO;AACT;;;;AQ3xBA;;;;;;CAMC,GAED,uEAAuE;AACvE,sEAAsE;AACtE,oEAAoE;AACpE,oCAAoC;AAqB7B,MAAM,4CAA+C;IAC1D,iEAAiE;IACjE,QAAQ;QACN,MAAM;QACN,iBAAiB;QACjB,iBAAiB;QACjB,YAAY;YAAC;YAAU;YAAQ;YAAW;YAAgB;SAAa;QACvE,UAAU;QACV,eAAe;QACf,YAAY;YAAC;YAAa;YAAc;YAAmB;SAAa;IAC1E;IACA,QAAQ;QACN,MAAM;QACN,iBAAiB;QACjB,iBAAiB;QACjB,YAAY;YAAC;YAAU;YAAW;YAAgB;SAAiB;QACnE,UAAU;QACV,eAAe;QACf,YAAY;YAAC;YAAmB;YAAe;SAAU;IAC3D;IACA,UAAU;QACR,MAAM;QACN,iBAAiB;QACjB,iBAAiB;QACjB,YAAY;YAAC;YAAY;YAAW;YAAW;YAAW;SAAY;QACtE,UAAU;QACV,eAAe;QACf,YAAY;YAAC;YAAmB;YAAa;YAAc;SAAa;IAC1E;IACA,SAAS;QACP,MAAM;QACN,iBAAiB;QACjB,iBAAiB;QACjB,YAAY;YAAC;YAAW;YAAU;YAAgB;YAAiB;SAAW;QAC9E,UAAU;QACV,eAAe;QACf,YAAY;YAAC;YAAa;YAAmB;SAAa;IAC5D;IACA,MAAM;QACJ,MAAM;QACN,iBAAiB;QACjB,iBAAiB;QACjB,YAAY;YAAC;YAAQ;YAAU;YAAW;SAAa;QACvD,UAAU;QACV,eAAe;QACf,YAAY;YAAC;YAAmB;YAAe;SAAS;IAC1D;IACA,eAAe;QACb,MAAM;QACN,iBAAiB;QACjB,iBAAiB;QACjB,YAAY;YAAC;YAAQ;SAAS;QAC9B,UAAU;QACV,eAAe;QACf,YAAY;YAAC;YAAe;SAAS;IACvC;IACA,OAAO;QACL,MAAM;QACN,iBAAiB;QACjB,iBAAiB;QACjB,YAAY;YAAC;YAAU;SAAO;QAC9B,UAAU;QACV,eAAe;QACf,YAAY;YAAC;YAAa;SAAa;IACzC;IACA,SAAS;QACP,MAAM;QACN,iBAAiB;QACjB,iBAAiB;QACjB,YAAY;YAAC;YAAW;YAAY;YAAU;SAAU;QACxD,UAAU;QACV,eAAe;QACf,YAAY;YAAC;YAAmB;YAAa;SAAgB;IAC/D;IACA,MAAM;QACJ,MAAM;QACN,iBAAiB;QACjB,iBAAiB;QACjB,YAAY;YAAC;YAAU;SAAU;QACjC,UAAU;QACV,eAAe;QACf,YAAY;YAAC;YAAe;SAAkB;IAChD;IAEA,iEAAiE;IACjE,eAAe;QACb,MAAM;QACN,iBAAiB;QACjB,iBAAiB;QACjB,YAAY;YAAC;YAAiB;YAAW;YAAW;SAAW;QAC/D,UAAU;QACV,eAAe;QACf,YAAY;YAAC;YAAe;YAAiB;SAAS;IACxD;IACA,iBAAiB;QACf,MAAM;QACN,iBAAiB;QACjB,iBAAiB;QACjB,YAAY;YAAC;YAAU;YAAQ;YAAc;SAAe;QAC5D,UAAU;QACV,eAAe;QACf,YAAY;YAAC;YAAe;YAAc;SAAa;IACzD;IACA,gBAAgB;QACd,MAAM;QACN,iBAAiB;QACjB,iBAAiB;QACjB,YAAY;YAAC;YAAU;YAAW;YAAQ;SAAU;QACpD,UAAU;QACV,eAAe;QACf,YAAY;YAAC;YAAe;YAAU;SAAU;IAClD;IACA,YAAY;QACV,MAAM;QACN,iBAAiB;QACjB,iBAAiB;QACjB,YAAY;YAAC;YAAU;YAAa;SAAa;QACjD,UAAU;QACV,eAAe;QACf,YAAY;YAAC;YAAe;SAAgB;IAC9C;IACA,SAAS;QACP,MAAM;QACN,iBAAiB;QACjB,iBAAiB;QACjB,YAAY;YAAC;YAAY;YAAW;YAAa;SAAgB;QACjE,UAAU;QACV,eAAe;QACf,YAAY;YAAC;YAAe;YAAmB;SAAgB;IACjE;IACA,SAAS;QACP,MAAM;QACN,iBAAiB;QACjB,iBAAiB;QACjB,YAAY;YAAC;YAAU;YAAgB;YAAc;SAAO;QAC5D,UAAU;QACV,eAAe;QACf,YAAY;YAAC;YAAe;YAAU;SAAa;IACrD;IACA,SAAS;QACP,MAAM;QACN,iBAAiB;QACjB,iBAAiB;QACjB,YAAY;YAAC;YAAQ;YAAa;SAAS;QAC3C,UAAU;QACV,eAAe;QACf,YAAY;YAAC;YAAe;SAAa;IAC3C;IAEA,iEAAiE;IACjE,cAAc;QACZ,MAAM;QACN,iBAAiB;QACjB,iBAAiB;QACjB,YAAY;YAAC;YAAU;YAAW;YAAc;YAAa;SAAgB;QAC7E,UAAU;QACV,eAAe;QACf,YAAY;YAAC;YAAe;YAAc;SAAa;IACzD;IACA,YAAY;QACV,MAAM;QACN,iBAAiB;QACjB,iBAAiB;QACjB,YAAY;YAAC;YAAU;YAAgB;SAAgB;QACvD,UAAU;QACV,eAAe;QACf,YAAY;YAAC;YAAe;SAAgB;IAC9C;IACA,eAAe;QACb,MAAM;QACN,iBAAiB;QACjB,iBAAiB;QACjB,YAAY;YAAC;YAAW;YAAgB;YAAiB;SAAU;QACnE,UAAU;QACV,eAAe;QACf,YAAY;YAAC;YAAe;YAAU;SAAa;IACrD;IACA,WAAW;QACT,MAAM;QACN,iBAAiB;QACjB,iBAAiB;QACjB,YAAY;YAAC;YAAY;YAAW;YAAW;SAAU;QACzD,UAAU;QACV,eAAe;QACf,YAAY;YAAC;YAAe;YAAmB;SAAgB;IACjE;IACA,YAAY;QACV,MAAM;QACN,iBAAiB;QACjB,iBAAiB;QACjB,YAAY;YAAC;YAAU;YAAgB;YAAa;SAAU;QAC9D,UAAU;QACV,eAAe;QACf,YAAY;YAAC;YAAe;YAAc;SAAY;IACxD;IACA,cAAc;QACZ,MAAM;QACN,iBAAiB;QACjB,iBAAiB;QACjB,YAAY;YAAC;YAAU;YAAc;SAAe;QACpD,UAAU;QACV,eAAe;QACf,YAAY;YAAC;YAAe;SAAa;IAC3C;IACA,OAAO;QACL,MAAM;QACN,iBAAiB;QACjB,iBAAiB;QACjB,YAAY;YAAC;YAAU;YAAc;SAAW;QAChD,UAAU;QACV,eAAe;QACf,YAAY;YAAC;YAAe;SAAS;IACvC;IACA,WAAW;QACT,MAAM;QACN,iBAAiB;QACjB,iBAAiB;QACjB,YAAY;YAAC;YAAU;YAAc;SAAe;QACpD,UAAU;QACV,eAAe;QACf,YAAY;YAAC;YAAe;SAAa;IAC3C;IAEA,iEAAiE;IACjE,MAAM;QACJ,MAAM;QACN,iBAAiB;QACjB,iBAAiB;QACjB,YAAY;YAAC;YAAQ;YAAU;YAAgB;SAAW;QAC1D,UAAU;QACV,eAAe;QACf,YAAY;YAAC;YAAa;YAAc;YAAmB;SAAa;IAC1E;IACA,MAAM;QACJ,MAAM;QACN,iBAAiB;QACjB,iBAAiB;QACjB,YAAY;YAAC;YAAW;YAAY;YAAW;SAAe;QAC9D,UAAU;QACV,eAAe;QACf,YAAY;YAAC;YAAmB;YAAa;SAAU;IACzD;IACA,WAAW;QACT,MAAM;QACN,iBAAiB;QACjB,iBAAiB;QACjB,YAAY;YAAC;YAAc;YAAQ;YAAc;SAAkB;QACnE,UAAU;QACV,eAAe;QACf,YAAY;YAAC;YAAe;YAAc;SAAS;IACrD;IACA,cAAc;QACZ,MAAM;QACN,iBAAiB;QACjB,iBAAiB;QACjB,YAAY;YAAC;YAAU;YAAU;YAAQ;SAAU;QACnD,UAAU;QACV,eAAe;QACf,YAAY;YAAC;YAAa;YAAc;YAAmB;SAAa;IAC1E;IACA,YAAY;QACV,MAAM;QACN,iBAAiB;QACjB,iBAAiB;QACjB,YAAY;YAAC;YAAQ;YAAa;YAAW;SAAe;QAC5D,UAAU;QACV,eAAe;QACf,YAAY;YAAC;YAAe;YAAc;SAAS;IACrD;IACA,UAAU;QACR,MAAM;QACN,iBAAiB;QACjB,iBAAiB;QACjB,YAAY;YAAC;YAAU;YAAQ;YAAS;SAAa;QACrD,UAAU;QACV,eAAe;QACf,YAAY;YAAC;YAAe;YAAU;SAAa;IACrD;IACA,MAAM;QACJ,MAAM;QACN,iBAAiB;QACjB,iBAAiB;QACjB,YAAY;YAAC;YAAc;YAAW;YAAgB;SAAS;QAC/D,UAAU;QACV,eAAe;QACf,YAAY;YAAC;YAAe;YAAa;SAAa;IACxD;IAEA,iEAAiE;IACjE,YAAY;QACV,MAAM;QACN,iBAAiB;QACjB,iBAAiB;QACjB,YAAY;YAAC;YAAe;YAAW;YAAY;SAAc;QACjE,UAAU;QACV,eAAe;QACf,YAAY;YAAC;YAAmB;YAAe;SAAY;IAC7D;IACA,aAAa;QACX,MAAM;QACN,iBAAiB;QACjB,iBAAiB;QACjB,YAAY;YAAC;YAAc;YAAQ;YAAgB;SAAO;QAC1D,UAAU;QACV,eAAe;QACf,YAAY;YAAC;YAAmB;YAAa;YAAc;SAAc;IAC3E;IACA,UAAU;QACR,MAAM;QACN,iBAAiB;QACjB,iBAAiB;QACjB,YAAY;YAAC;YAAU;YAAQ;YAAa;SAAe;QAC3D,UAAU;QACV,eAAe;QACf,YAAY;YAAC;YAAa;YAAc;SAAkB;IAC5D;IACA,SAAS;QACP,MAAM;QACN,iBAAiB;QACjB,iBAAiB;QACjB,YAAY;YAAC;YAAQ;YAAY;YAAa;SAAkB;QAChE,UAAU;QACV,eAAe;QACf,YAAY;YAAC;YAAa;YAAc;SAAkB;IAC5D;IACA,WAAW;QACT,MAAM;QACN,iBAAiB;QACjB,iBAAiB;QACjB,YAAY;YAAC;YAAQ;YAAU;YAAY;SAAe;QAC1D,UAAU;QACV,eAAe;QACf,YAAY;YAAC;YAAa;SAAa;IACzC;IACA,UAAU;QACR,MAAM;QACN,iBAAiB;QACjB,iBAAiB;QACjB,YAAY;YAAC;YAAQ;YAAW;YAAc;SAAO;QACrD,UAAU;QACV,eAAe;QACf,YAAY;YAAC;YAAa;YAAc;SAAkB;IAC5D;IACA,cAAc;QACZ,MAAM;QACN,iBAAiB;QACjB,iBAAiB;QACjB,YAAY;YAAC;YAAiB;YAAiB;YAAW;SAAW;QACrE,UAAU;QACV,eAAe;QACf,YAAY;YAAC;YAAe;YAAU;SAAgB;IACxD;IACA,aAAa;QACX,MAAM;QACN,iBAAiB;QACjB,iBAAiB;QACjB,YAAY;YAAC;YAAW;YAAY;YAAc;SAAc;QAChE,UAAU;QACV,eAAe;QACf,YAAY;YAAC;YAAmB;YAAa;SAAgB;IAC/D;IACA,kBAAkB;QAChB,MAAM;QACN,iBAAiB;QACjB,iBAAiB;QACjB,YAAY;YAAC;YAAY;YAAU;YAAgB;SAAe;QAClE,UAAU;QACV,eAAe;QACf,YAAY;YAAC;YAAmB;YAAa;SAAa;IAC5D;IACA,YAAY;QACV,MAAM;QACN,iBAAiB;QACjB,iBAAiB;QACjB,YAAY;YAAC;YAAa;YAAY;SAAO;QAC7C,UAAU;QACV,eAAe;QACf,YAAY;YAAC;YAAa;SAAU;IACtC;IACA,iBAAiB;QACf,MAAM;QACN,iBAAiB;QACjB,iBAAiB;QACjB,YAAY;YAAC;YAAe;YAAQ;SAAe;QACnD,UAAU;QACV,eAAe;QACf,YAAY;YAAC;YAAe;YAAW;SAAe;IACxD;AACF;AAkBO,SAAS,0CACd,GAAiB,EACjB,UAAoB,EACpB,aAAqB;IAErB,MAAM,YAAY,WAAW,MAAM,CAAC,CAAC,IAAM,yCAAc,CAAC,EAAE;IAE5D,6DAA6D;IAC7D,MAAM,WAAW,UAAU,MAAM,CAC/B,CAAC,IAAM,yCAAc,CAAC,EAAE,CAAC,IAAI,KAAK,KAAK,yCAAc,CAAC,EAAE,CAAC,aAAa;IAExE,MAAM,YAAY,SAAS,MAAM,GAAG,IAChC,QAAQ,CAAC,KAAK,KAAK,CAAC,QAAQ,SAAS,MAAM,EAAE,GAC7C,SAAS,CAAC,KAAK,KAAK,CAAC,QAAQ,UAAU,MAAM,EAAE;IAEnD,MAAM,cAAc,yCAAc,CAAC,UAAU;IAE7C,8DAA8D;IAC9D,MAAM,oBAAoB;QAAC;WAAc,YAAY,UAAU;KAAC,CAC7D,MAAM,CAAC,CAAC,IAAM,UAAU,QAAQ,CAAC,IACjC,MAAM,CAAC,CAAC,IAAM,yCAAc,CAAC,EAAE,CAAC,IAAI,IAAI;IAC3C,MAAM,UAAU;WAAI,IAAI,IAAI;KAAmB,CAAC,KAAK,CAAC,GAAG;IAEzD,kEAAkE;IAClE,MAAM,gBAAgB,IAAI;IAC1B,KAAK,MAAM,KAAK,QAAS;QACvB,MAAM,UAAU,yCAAc,CAAC,EAAE;QACjC,IAAI,CAAC,SAAS;QACd,KAAK,MAAM,OAAO,QAAQ,UAAU,CAClC,IAAI,UAAU,QAAQ,CAAC,QAAQ,CAAC,QAAQ,QAAQ,CAAC,MAC/C,cAAc,GAAG,CAAC;IAGxB;IACA,oCAAoC;IACpC,KAAK,MAAM,KAAK,UAAW;QACzB,MAAM,IAAI,yCAAc,CAAC,EAAE;QAC3B,IAAI,EAAE,QAAQ,KAAK,YAAY,QAAQ,IAAI,EAAE,IAAI,IAAI,KAAK,CAAC,QAAQ,QAAQ,CAAC,IAC1E,cAAc,GAAG,CAAC;IAEtB;IACA,MAAM,aAAa;WAAI;KAAc,CAAC,KAAK,CAAC,GAAG;IAE/C,4DAA4D;IAC5D,MAAM,iBAAiB,IAAI,IACzB;WAAI;WAAY;KAAW,CAAC,GAAG,CAAC,CAAC,IAAM,yCAAc,CAAC,EAAE,EAAE;IAE5D,MAAM,mBAAmB,UAAU,MAAM,CACvC,CAAC,IACC,CAAC,QAAQ,QAAQ,CAAC,MAClB,CAAC,WAAW,QAAQ,CAAC,MACrB,yCAAc,CAAC,EAAE,CAAC,IAAI,IAAI,KAC1B,CAAC,eAAe,GAAG,CAAC,yCAAc,CAAC,EAAE,CAAC,QAAQ;IAElD,yBAAyB;IACzB,MAAM,UAAoB,EAAE;IAC5B,MAAM,WAAW;WAAI;KAAiB;IACtC,IAAK,IAAI,IAAI,SAAS,MAAM,GAAG,GAAG,IAAI,GAAG,IAAK;QAC5C,MAAM,IAAI,KAAK,KAAK,CAAC,QAAS,CAAA,IAAI,CAAA;QAClC,CAAC,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC,EAAE,CAAC,GAAG;YAAC,QAAQ,CAAC,EAAE;YAAE,QAAQ,CAAC,EAAE;SAAC;IACzD;IACA,QAAQ,IAAI,IAAI,SAAS,KAAK,CAAC,GAAG;IAElC,2CAA2C;IAC3C,IAAI,kBAAkB,uBACpB,+CAA+C;IAC/C,OAAO;QACL,SAAS,QAAQ,MAAM,CAAC,CAAC,IAAM,yCAAc,CAAC,EAAE,EAAE,aAAa,gBAAgB,MAAM;QACrF,YAAY,WAAW,MAAM,CAAC,CAAC,IAAM,MAAM;iBAC3C;IACF;IAEF,IAAI,kBAAkB,gBAAgB;QACpC,kCAAkC;QAClC,MAAM,eAAe,UAAU,MAAM,CACnC,CAAC,IAAM;gBAAC;gBAAQ;gBAAgB;gBAAY;aAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,QAAQ,CAAC;QAEvF,OAAO;YACL,SAAS;mBAAI;mBAAY,aAAa,KAAK,CAAC,GAAG;aAAG;wBAClD;qBACA;QACF;IACF;IACA,IAAI,kBAAkB,mBAAmB;QACvC,mCAAmC;QACnC,MAAM,aAAa,UAAU,MAAM,CACjC,CAAC,IAAM;gBAAC;gBAAc;gBAAe;gBAAe;gBAAW;gBAAY;aAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,QAAQ,CAAC;QAEtH,OAAO;YACL,SAAS;mBAAI,QAAQ,MAAM,CAAC,CAAC,IAAM,MAAM,UAAU,MAAM;mBAAiB,WAAW,KAAK,CAAC,GAAG;aAAG;YACjG,YAAY,WAAW,MAAM,CAAC,CAAC,IAAM,MAAM,UAAU,MAAM;qBAC3D;QACF;IACF;IACA,IAAI,kBAAkB,aAAa;QACjC,gCAAgC;QAChC,MAAM,iBAAiB,UAAU,MAAM,CACrC,CAAC,IAAM;gBAAC;gBAAW;gBAAa;gBAAQ;gBAAY;gBAAQ;aAAW,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,QAAQ,CAAC;QAE3G,OAAO;YACL,SAAS;mBAAI;mBAAY,eAAe,KAAK,CAAC,GAAG;aAAG;wBACpD;qBACA;QACF;IACF;IACA,IAAI,kBAAkB,oBAAoB;QACxC,mCAAmC;QACnC,MAAM,eAAe,UAAU,MAAM,CACnC,CAAC,IAAM;gBAAC;gBAAc;gBAAU;gBAAmB;gBAAe;aAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,QAAQ,CAAC;QAE7G,OAAO;YACL,SAAS;mBAAI;mBAAY,aAAa,KAAK,CAAC,GAAG;aAAG;wBAClD;qBACA;QACF;IACF;IACA,IAAI,kBAAkB,aAAa;QACjC,0CAA0C;QAC1C,MAAM,iBAAiB,UAAU,MAAM,CACrC,CAAC,IAAM;gBAAC;gBAAY;gBAAgB;gBAAW;gBAAgB;gBAAc;aAAkB,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,QAAQ,CAAC;QAEnI,OAAO;YACL,SAAS;mBAAI;mBAAY,eAAe,KAAK,CAAC,GAAG;aAAG;wBACpD;qBACA;QACF;IACF;IAEA,OAAO;iBAAE;oBAAS;iBAAY;IAAQ;AACxC;AAOO,SAAS,0CACd,OAAqB,EACrB,GAAiB,EACjB,YAAoB;IAEpB,uCAAuC;IACvC,MAAM,eAAe,QAAQ,OAAO,CAAC,MAAM,CAAC,CAAC;QAC3C,MAAM,IAAI,yCAAc,CAAC,EAAE;QAC3B,OAAO,KAAK,gBAAgB,EAAE,eAAe,IAAI,gBAAgB,EAAE,eAAe;IACpF;IACA,MAAM,kBAAkB,QAAQ,UAAU,CAAC,MAAM,CAAC,CAAC;QACjD,MAAM,IAAI,yCAAc,CAAC,EAAE;QAC3B,OAAO,KAAK,gBAAgB,EAAE,eAAe,IAAI,gBAAgB,EAAE,eAAe;IACpF;IACA,MAAM,eAAe,QAAQ,OAAO,CAAC,MAAM,CAAC,CAAC;QAC3C,MAAM,IAAI,yCAAc,CAAC,EAAE;QAC3B,OAAO,KAAK,gBAAgB,EAAE,eAAe,IAAI,gBAAgB,EAAE,eAAe;IACpF;IAEA,MAAM,OAAO;IACb,IAAI,OAAO,QAAQ,aAAa,MAAM,GAAG,GACvC,OAAO,YAAY,CAAC,KAAK,KAAK,CAAC,QAAQ,aAAa,MAAM,EAAE;IAE9D,IAAI,OAAO,QAAQ,gBAAgB,MAAM,GAAG,GAC1C,OAAO,eAAe,CAAC,KAAK,KAAK,CAAC,QAAQ,gBAAgB,MAAM,EAAE;IAEpE,IAAI,aAAa,MAAM,GAAG,GACxB,OAAO,YAAY,CAAC,KAAK,KAAK,CAAC,QAAQ,aAAa,MAAM,EAAE;IAE9D,4CAA4C;IAC5C,MAAM,WAAW;WAAI;WAAiB;KAAgB;IACtD,IAAI,SAAS,MAAM,GAAG,GAAG,OAAO,QAAQ,CAAC,KAAK,KAAK,CAAC,QAAQ,SAAS,MAAM,EAAE;IAC7E,oBAAoB;IACpB,OAAO,QAAQ,OAAO,CAAC,EAAE,IAAI;AAC/B;AAOO,SAAS,0CACd,SAAiB,EACjB,UAAkB,EAClB,GAAiB;IAEjB,MAAM,UAAU,yCAAc,CAAC,UAAU;IACzC,IAAI,CAAC,WAAW,QAAQ,KAAK,OAAO;IACpC,OAAO,QAAQ,UAAU,CAAC,KAAK,KAAK,CAAC,QAAQ,QAAQ,UAAU,CAAC,MAAM,EAAE;AAC1E;;;;AC/mBA;;CAEC,GAsBM,MAAM,4CAAmC;IAC9C,OAAO;IACP,QAAQ;IACR,UAAU;IACV,QAAQ;IACR,cAAc;IACd,cAAc;IACd,aAAa;IACb,kBAAkB;IAClB,gBAAgB;AAClB;;;AClCA;;;;;;CAMC,GAwED,uEAAuE;AAEvE,MAAM,mCAA0B;IAC9B;QACE,MAAM;QACN,UAAU;QACV,QAAQ;QACR,aAAa;QACb,kBAAkB;QAClB,cAAc;QACd,cAAc;QACd,iBAAiB;QACjB,aAAa;QACb,iBAAiB;YAAC;YAAmB;YAAc;SAAY;QAC/D,uBAAuB;YAAC;YAAa;YAAc;SAAS;QAC5D,oBAAoB;QACpB,WAAW;QACX,gBAAgB;QAChB,WAAW;QACX,kBAAkB;IACpB;IACA;QACE,MAAM;QACN,UAAU;QACV,QAAQ;QACR,aAAa;QACb,kBAAkB;QAClB,cAAc;QACd,cAAc;QACd,iBAAiB;QACjB,aAAa;QACb,iBAAiB;YAAC;YAAmB;YAAe;SAAa;QACjE,uBAAuB;YAAC;YAAiB;SAAmB;QAC5D,oBAAoB;QACpB,WAAW;QACX,gBAAgB;QAChB,WAAW;QACX,kBAAkB;IACpB;IACA;QACE,MAAM;QACN,UAAU;QACV,QAAQ;QACR,aAAa;QACb,kBAAkB;QAClB,cAAc;QACd,cAAc;QACd,iBAAiB;QACjB,aAAa;QACb,iBAAiB;YAAC;YAAc;YAAa;SAAa;QAC1D,uBAAuB;YAAC;YAAc;YAAiB;SAAS;QAChE,oBAAoB;QACpB,WAAW;QACX,gBAAgB;QAChB,WAAW;QACX,kBAAkB;IACpB;IACA;QACE,MAAM;QACN,UAAU;QACV,QAAQ;QACR,aAAa;QACb,kBAAkB;QAClB,cAAc;QACd,cAAc;QACd,iBAAiB;QACjB,aAAa;QACb,iBAAiB;YAAC;YAAe;YAAU;YAAiB;SAAU;QACtE,uBAAuB;YAAC;YAAoB;SAAS;QACrD,oBAAoB;QACpB,WAAW;QACX,gBAAgB;QAChB,WAAW;QACX,kBAAkB;IACpB;IACA;QACE,MAAM;QACN,UAAU;QACV,QAAQ;QACR,aAAa;QACb,kBAAkB;QAClB,cAAc;QACd,cAAc;QACd,iBAAiB;QACjB,aAAa;QACb,iBAAiB;YAAC;YAAc;YAAc;SAAY;QAC1D,uBAAuB;YAAC;YAAiB;YAAU;SAAS;QAC5D,oBAAoB;QACpB,WAAW;QACX,gBAAgB;QAChB,WAAW;QACX,kBAAkB;IACpB;IACA;QACE,MAAM;QACN,UAAU;QACV,QAAQ;QACR,aAAa;QACb,kBAAkB;QAClB,cAAc;QACd,cAAc;QACd,iBAAiB;QACjB,aAAa;QACb,iBAAiB;YAAC;YAAmB;SAAgB;QACrD,uBAAuB;YAAC;YAAoB;SAAgB;QAC5D,oBAAoB;QACpB,WAAW;QACX,gBAAgB;QAChB,WAAW;QACX,kBAAkB;IACpB;IACA;QACE,MAAM;QACN,UAAU;QACV,QAAQ;QACR,aAAa;QACb,kBAAkB;QAClB,cAAc;QACd,cAAc;QACd,iBAAiB;QACjB,aAAa;QACb,iBAAiB;YAAC;YAAe;YAAiB;SAAS;QAC3D,uBAAuB;YAAC;YAAU;YAAU;SAAY;QACxD,oBAAoB;QACpB,WAAW;QACX,gBAAgB;QAChB,WAAW;QACX,kBAAkB;IACpB;IACA;QACE,MAAM;QACN,UAAU;QACV,QAAQ;QACR,aAAa;QACb,kBAAkB;QAClB,cAAc;QACd,cAAc;QACd,iBAAiB;QACjB,aAAa;QACb,iBAAiB;YAAC;YAAW;YAAc;YAAe;SAAS;QACnE,uBAAuB;YAAC;YAAc;YAAoB;SAAY;QACtE,oBAAoB;QACpB,WAAW;QACX,gBAAgB;QAChB,WAAW;QACX,kBAAkB;IACpB;IACA;QACE,MAAM;QACN,UAAU;QACV,QAAQ;QACR,aAAa;QACb,kBAAkB;QAClB,cAAc;QACd,cAAc;QACd,iBAAiB;QACjB,aAAa;QACb,iBAAiB;YAAC;YAAa;YAAc;SAAkB;QAC/D,uBAAuB;YAAC;YAAU;YAAU;SAAgB;QAC5D,oBAAoB;QACpB,WAAW;QACX,gBAAgB;QAChB,WAAW;QACX,kBAAkB;IACpB;IACA;QACE,MAAM;QACN,UAAU;QACV,QAAQ;QACR,aAAa;QACb,kBAAkB;QAClB,cAAc;QACd,cAAc;QACd,iBAAiB;QACjB,aAAa;QACb,iBAAiB;YAAC;YAAc;YAAa;SAAa;QAC1D,uBAAuB;YAAC;YAAiB;YAAc;SAAS;QAChE,oBAAoB;QACpB,WAAW;QACX,gBAAgB;QAChB,WAAW;QACX,kBAAkB;IACpB;IACA;QACE,MAAM;QACN,UAAU;QACV,QAAQ;QACR,aAAa;QACb,kBAAkB;QAClB,cAAc;QACd,cAAc;QACd,iBAAiB;QACjB,aAAa;QACb,iBAAiB;YAAC;YAAmB;YAAe;SAAS;QAC7D,uBAAuB;YAAC;YAAoB;SAAS;QACrD,oBAAoB;QACpB,WAAW;QACX,gBAAgB;QAChB,WAAW;QACX,kBAAkB;IACpB;IACA;QACE,MAAM;QACN,UAAU;QACV,QAAQ;QACR,aAAa;QACb,kBAAkB;QAClB,cAAc;QACd,cAAc;QACd,iBAAiB;QACjB,aAAa;QACb,iBAAiB;YAAC;YAAmB;YAAa;SAAgB;QAClE,uBAAuB;YAAC;YAAoB;SAAY;QACxD,oBAAoB;QACpB,WAAW;QACX,gBAAgB;QAChB,WAAW;QACX,kBAAkB;IACpB;IACA;QACE,MAAM;QACN,UAAU;QACV,QAAQ;QACR,aAAa;QACb,kBAAkB;QAClB,cAAc;QACd,cAAc;QACd,iBAAiB;QACjB,aAAa;QACb,iBAAiB;YAAC;YAAmB;YAAc;SAAY;QAC/D,uBAAuB;YAAC;YAAU;YAAiB;SAAa;QAChE,oBAAoB;QACpB,WAAW;QACX,gBAAgB;QAChB,WAAW;QACX,kBAAkB;IACpB;IACA;QACE,MAAM;QACN,UAAU;QACV,QAAQ;QACR,aAAa;QACb,kBAAkB;QAClB,cAAc;QACd,cAAc;QACd,iBAAiB;QACjB,aAAa;QACb,iBAAiB;YAAC;YAAmB;YAAe;SAAY;QAChE,uBAAuB;YAAC;YAAa;YAAoB;SAAS;QAClE,oBAAoB;QACpB,WAAW;QACX,gBAAgB;QAChB,WAAW;QACX,kBAAkB;IACpB;IACA;QACE,MAAM;QACN,UAAU;QACV,QAAQ;QACR,aAAa;QACb,kBAAkB;QAClB,cAAc;QACd,cAAc;QACd,iBAAiB;QACjB,aAAa;QACb,iBAAiB;YAAC;YAAc;YAAa;SAAa;QAC1D,uBAAuB;YAAC;YAAc;YAAiB;SAAS;QAChE,oBAAoB;QACpB,WAAW;QACX,gBAAgB;QAChB,WAAW;QACX,kBAAkB;IACpB;IACA;QACE,MAAM;QACN,UAAU;QACV,QAAQ;QACR,aAAa;QACb,kBAAkB;QAClB,cAAc;QACd,cAAc;QACd,iBAAiB;QACjB,aAAa;QACb,iBAAiB;YAAC;YAAW;YAAa;SAAU;QACpD,uBAAuB;YAAC;YAAU;YAAa;SAAa;QAC5D,oBAAoB;QACpB,WAAW;QACX,gBAAgB;QAChB,WAAW;QACX,kBAAkB;IACpB;IACA;QACE,MAAM;QACN,UAAU;QACV,QAAQ;QACR,aAAa;QACb,kBAAkB;QAClB,cAAc;QACd,cAAc;QACd,iBAAiB;QACjB,aAAa;QACb,iBAAiB;YAAC;YAAa;YAAc;YAAe;SAAa;QACzE,uBAAuB;YAAC;YAAU;YAAU;SAAgB;QAC5D,oBAAoB;QACpB,WAAW;QACX,gBAAgB;QAChB,WAAW;QACX,kBAAkB;IACpB;CACD;AAED;;CAEC,GACD,SAAS,8BAAQ,CAAS,EAAE,CAAS,EAAE,CAAS;IAC9C,OAAO,IAAI,AAAC,CAAA,IAAI,CAAA,IAAK;AACvB;AAEA;;;CAGC,GACD,SAAS,sCAAgB,CAAY,EAAE,CAAY,EAAE,CAAS;IAC5D,iEAAiE;IACjE,MAAM,eAAe;WAAI,IAAI,IAAI;eAAI,EAAE,eAAe;eAAK,EAAE,eAAe;SAAC;KAAE;IAC/E,MAAM,qBAAqB;WAAI,IAAI,IAAI;eAAI,EAAE,qBAAqB;eAAK,EAAE,qBAAqB;SAAC;KAAE;IAEjG,OAAO;QACL,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;QAC3B,UAAU,KAAK,KAAK,CAAC,8BAAQ,EAAE,QAAQ,EAAE,EAAE,QAAQ,EAAE;QACrD,QAAQ,KAAK,KAAK,CAAC,8BAAQ,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE;QAC/C,aAAa,8BAAQ,EAAE,WAAW,EAAE,EAAE,WAAW,EAAE;QACnD,kBAAkB,8BAAQ,EAAE,gBAAgB,EAAE,EAAE,gBAAgB,EAAE;QAClE,cAAc,KAAK,KAAK,CAAC,8BAAQ,EAAE,YAAY,EAAE,EAAE,YAAY,EAAE;QACjE,cAAc,KAAK,KAAK,CAAC,8BAAQ,EAAE,YAAY,EAAE,EAAE,YAAY,EAAE;QACjE,iBAAiB,IAAI,MAAM,EAAE,eAAe,GAAG,EAAE,eAAe;QAChE,aAAa,IAAI,MAAM,EAAE,WAAW,GAAG,EAAE,WAAW;QACpD,iBAAiB;QACjB,uBAAuB;QACvB,oBAAoB,8BAAQ,EAAE,kBAAkB,EAAE,EAAE,kBAAkB,EAAE;QACxE,WAAW,IAAI,MAAM,EAAE,SAAS,GAAG,EAAE,SAAS;QAC9C,gBAAgB,8BAAQ,EAAE,cAAc,EAAE,EAAE,cAAc,EAAE;QAC5D,WAAW,8BAAQ,EAAE,SAAS,EAAE,EAAE,SAAS,EAAE;QAC7C,kBAAkB,IAAI,MAAM,EAAE,gBAAgB,GAAG,EAAE,gBAAgB;IACrE;AACF;AAMO,SAAS,0CAAgB,GAAiB;IAC/C,MAAM,UAAU,gCAAU,CAAC,KAAK,KAAK,CAAC,QAAQ,iCAAW,MAAM,EAAE;IAEjE,kDAAkD;IAClD,IAAI,QAAQ,MAAM;QAChB,MAAM,YAAY,gCAAU,CAAC,KAAK,KAAK,CAAC,QAAQ,iCAAW,MAAM,EAAE;QACnE,IAAI,UAAU,IAAI,KAAK,QAAQ,IAAI,EAAE;YACnC,MAAM,SAAS,OAAO,QAAQ,MAAM,gCAAgC;YACpE,OAAO,sCAAgB,SAAS,WAAW;QAC7C;IACF;IAEA,OAAO;AACT;;;AdnYA,uEAAuE;AAEvE,MAAM,sCAAgB;IACpB;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;CACD;AAED,uEAAuE;AAEvE,MAAM,8CAA2C;IAC/C;IACA;IACA;IACA;IACA;IACA;CACD;AAED,uEAAuE;AAEvE,SAAS,6CACP,IAAqB,EACrB,GAAiB,EACjB,KAAa,EACb,MAAc,EACd,UAAkB,EAClB,WAAmB,EACnB,EAAU,EACV,EAAU;IAEV,OAAQ;QACN,KAAK;YAAU;gBACb,MAAM,QAAQ,QAAQ,KAAK,EAAE,GAAG;gBAChC,MAAM,OAAO,KAAK,GAAG,CAAC,OAAO,UAAU;gBACvC,MAAM,IAAI,KAAK,GAAG,CAAC,OAAO,OAAO;gBACjC,OAAO;oBAAE,GAAG,KAAK,KAAK,GAAG,CAAC,SAAS;oBAAG,GAAG,KAAK,KAAK,GAAG,CAAC,SAAS;gBAAE;YACpE;QACA,KAAK;YAAU;gBACb,MAAM,IAAI,aAAa;gBACvB,MAAM,QAAQ,IAAI,QAAQ;gBAC1B,MAAM,QAAQ,IAAI,KAAK,EAAE,GAAG,IAAI;gBAChC,MAAM,OAAO,KAAK,GAAG,CAAC,OAAO,UAAU;gBACvC,MAAM,IAAI,IAAI,OAAO,AAAC,CAAA,QAAQ,GAAE,IAAK,OAAO;gBAC5C,OAAO;oBAAE,GAAG,KAAK,KAAK,GAAG,CAAC,SAAS;oBAAG,GAAG,KAAK,KAAK,GAAG,CAAC,SAAS;gBAAE;YACpE;QACA,KAAK;YAAoB;gBACvB,MAAM,QAAQ,IAAI,KAAK,KAAK,CAAC,QAAQ;gBACrC,MAAM,QAAQ,QAAQ;gBACtB,MAAM,QAAQ,SAAS;gBACvB,MAAM,KAAK,KAAK,KAAK,CAAC,QAAQ;gBAC9B,MAAM,KAAK,KAAK,KAAK,CAAC,QAAQ;gBAC9B,OAAO;oBACL,GAAG,KAAK,QAAQ,QAAQ;oBACxB,GAAG,KAAK,QAAQ,QAAQ;gBAC1B;YACF;QACA,KAAK;YAAa;gBAChB,MAAM,cAAc,IAAI,KAAK,KAAK,CAAC,QAAQ;gBAC3C,MAAM,KAAK,KAAK,KAAK,CAAC,QAAQ;gBAC9B,MAAM,aAAa,CAAA,GAAA,yCAAQ,EAAE,CAAA,GAAA,yCAAW,EAAE,OAAO,KAAK;gBACtD,MAAM,MAAM,QAAS,CAAA,OAAO,eAAe,GAAE;gBAC7C,MAAM,MAAM,SAAU,CAAA,OAAO,eAAe,GAAE;gBAC9C,MAAM,SAAS,KAAK,GAAG,CAAC,OAAO,UAAU;gBACzC,OAAO;oBACL,GAAG,MAAM,AAAC,CAAA,QAAQ,GAAE,IAAK,SAAS;oBAClC,GAAG,MAAM,AAAC,CAAA,QAAQ,GAAE,IAAK,SAAS;gBACpC;YACF;QACA,KAAK;QACL;YACE,OAAO;gBAAE,GAAG,QAAQ;gBAAO,GAAG,QAAQ;YAAO;QAE/C,KAAK;YAAiB;gBACpB,qEAAqE;gBACrE,MAAM,MAAM,AAAC,CAAA,IAAI,KAAK,IAAI,CAAC,EAAC,IAAK;gBACjC,MAAM,cAAc,IAAI,KAAK,EAAE,GAAI,CAAA,MAAM,GAAE,GAAI,qBAAqB;gBACpE,MAAM,IAAI,aAAa;gBACvB,MAAM,QAAQ,aAAa,cAAc,QAAQ;gBACjD,MAAM,OAAO,KAAK,GAAG,CAAC,OAAO,UAAU;gBACvC,sEAAsE;gBACtE,MAAM,IAAI,KAAK,IAAI,CAAC,KAAK,OAAO,AAAC,CAAA,QAAQ,GAAE,IAAK,OAAO;gBACvD,OAAO;oBAAE,GAAG,KAAK,KAAK,GAAG,CAAC,SAAS;oBAAG,GAAG,KAAK,KAAK,GAAG,CAAC,SAAS;gBAAE;YACpE;IACF;AACF;AAEA,uEAAuE;AAEvE,SAAS,yCACP,CAAS,EACT,CAAS,EACT,KAAa,EACb,MAAc,EACd,SAAyB,EACzB,GAAiB;IAEjB,yEAAyE;IACzE,MAAM,iBAAiB,KAAK,KAAK,CAAC,IAAI,QAAQ,GAAG,IAAI,SAAS,KAC5D,KAAK,KAAK,CAAC,QAAQ,GAAG,SAAS;IACjC,8CAA8C;IAC9C,IAAI,iBAAiB,MACnB,OAAO,CAAA,GAAA,yCAAa,EAAE,UAAU,QAAQ,EAAE,KAAK,IAAI;SAC9C,IAAI,iBAAiB,KAC1B,OAAO,CAAA,GAAA,yCAAa,EAAE,CAAA,GAAA,yCAAiB,EAAE,WAAW,MAAM,KAAK,GAAG;SAC7D;QACL,sCAAsC;QACtC,MAAM,OAAO;QACb,MAAM,QAAQ,OAAO,MAAM,UAAU,SAAS,GAAG,OAAO,OAAO,UAAU,MAAM,GAAG,UAAU,QAAQ;QACpG,OAAO,CAAA,GAAA,yCAAa,EAAE,OAAO,KAAK,IAAI;IACxC;AACF;AAEA,uEAAuE;AAEvE,SAAS,mCACP,CAAS,EACT,CAAS,EACT,SAA0D;IAE1D,KAAK,MAAM,QAAQ,UAAW;QAC5B,IAAI,KAAK,KAAK,CAAC,IAAI,KAAK,CAAC,EAAE,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,EAAE,OAAO;IAC/D;IACA,OAAO;AACT;AAEA,uEAAuE;AAEvE,MAAM;IACI,MAAiF;IACjF,SAAiB;IAEzB,YAAY,QAAgB,CAAE;QAC5B,IAAI,CAAC,KAAK,GAAG,IAAI;QACjB,IAAI,CAAC,QAAQ,GAAG;IAClB;IAEQ,IAAI,EAAU,EAAE,EAAU,EAAU;QAC1C,OAAO,CAAC,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC;IACtB;IAEA,OAAO,IAA2D,EAAQ;QACxE,MAAM,KAAK,KAAK,KAAK,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,QAAQ;QAC5C,MAAM,KAAK,KAAK,KAAK,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,QAAQ;QAC5C,MAAM,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI;QACvB,MAAM,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC;QAC5B,IAAI,MAAM,KAAK,IAAI,CAAC;aACf,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG;YAAC;SAAK;IAC/B;IAEA,wCAAwC,GACxC,UAAU,CAAS,EAAE,CAAS,EAAE,MAAc,EAAU;QACtD,MAAM,KAAK,SAAS;QACpB,MAAM,QAAQ,KAAK,KAAK,CAAC,AAAC,CAAA,IAAI,MAAK,IAAK,IAAI,CAAC,QAAQ;QACrD,MAAM,QAAQ,KAAK,KAAK,CAAC,AAAC,CAAA,IAAI,MAAK,IAAK,IAAI,CAAC,QAAQ;QACrD,MAAM,QAAQ,KAAK,KAAK,CAAC,AAAC,CAAA,IAAI,MAAK,IAAK,IAAI,CAAC,QAAQ;QACrD,MAAM,QAAQ,KAAK,KAAK,CAAC,AAAC,CAAA,IAAI,MAAK,IAAK,IAAI,CAAC,QAAQ;QACrD,IAAI,QAAQ;QACZ,IAAK,IAAI,KAAK,OAAO,MAAM,OAAO,KAChC,IAAK,IAAI,KAAK,OAAO,MAAM,OAAO,KAAM;YACtC,MAAM,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI;YACzC,IAAI,CAAC,MAAM;YACX,KAAK,MAAM,KAAK,KAAM;gBACpB,MAAM,KAAK,IAAI,EAAE,CAAC;gBAClB,MAAM,KAAK,IAAI,EAAE,CAAC;gBAClB,IAAI,KAAK,KAAK,KAAK,KAAK,IAAI;YAC9B;QACF;QAEF,OAAO;IACT;IAEA,gCAAgC,GAChC,YAAY,CAAS,EAAE,CAAS,EAAE,YAAoB,EAAiD;QACrG,MAAM,QAAQ,KAAK,KAAK,CAAC,AAAC,CAAA,IAAI,YAAW,IAAK,IAAI,CAAC,QAAQ;QAC3D,MAAM,QAAQ,KAAK,KAAK,CAAC,AAAC,CAAA,IAAI,YAAW,IAAK,IAAI,CAAC,QAAQ;QAC3D,MAAM,QAAQ,KAAK,KAAK,CAAC,AAAC,CAAA,IAAI,YAAW,IAAK,IAAI,CAAC,QAAQ;QAC3D,MAAM,QAAQ,KAAK,KAAK,CAAC,AAAC,CAAA,IAAI,YAAW,IAAK,IAAI,CAAC,QAAQ;QAC3D,IAAI,UAAyD;QAC7D,IAAI,YAAY;QAChB,IAAK,IAAI,KAAK,OAAO,MAAM,OAAO,KAChC,IAAK,IAAI,KAAK,OAAO,MAAM,OAAO,KAAM;YACtC,MAAM,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI;YACzC,IAAI,CAAC,MAAM;YACX,KAAK,MAAM,KAAK,KAAM;gBACpB,MAAM,KAAK,IAAI,EAAE,CAAC;gBAClB,MAAM,KAAK,IAAI,EAAE,CAAC;gBAClB,MAAM,KAAK,KAAK,KAAK,KAAK;gBAC1B,IAAI,KAAK,KAAK,KAAK,WAAW;oBAC5B,YAAY;oBACZ,UAAU;gBACZ;YACF;QACF;QAEF,OAAO;IACT;AACF;AAEA,uEAAuE;AAEvE,SAAS,mCACP,CAAS,EACT,CAAS,EACT,SAAwD,EACxD,MAAc;IAEd,IAAI,QAAQ;IACZ,KAAK,MAAM,KAAK,UACd,IAAI,KAAK,KAAK,CAAC,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,IAAI,QAAQ;IAE7C,OAAO;AACT;AAEA,uEAAuE;AAEvE,SAAS,qCACP,GAA6B,EAC7B,KAAsB,EACtB,OAAe,EACf,KAAa,EACb,KAAa,EACb,MAAc,EACd,EAAU,EACV,EAAU,EACV,QAAgB,EAChB,GAAiB,EACjB,MAAgB;IAEhB,OAAQ;QACN,KAAK;YAAgB;gBACnB,MAAM,OAAO,IAAI,oBAAoB,CAAC,IAAI,IAAI,GAAG,IAAI,IAAI;gBACzD,KAAK,YAAY,CAAC,GAAG;gBACrB,KAAK,YAAY,CAAC,GAAG;gBACrB,IAAI,SAAS,GAAG;gBAChB,IAAI,QAAQ,CAAC,GAAG,GAAG,OAAO;gBAC1B;YACF;QACA,KAAK;YAAqB;gBACxB,MAAM,OAAO,IAAI,oBAAoB,CAAC,GAAG,GAAG,OAAO;gBACnD,KAAK,YAAY,CAAC,GAAG;gBACrB,KAAK,YAAY,CAAC,GAAG;gBACrB,IAAI,SAAS,GAAG;gBAChB,IAAI,QAAQ,CAAC,GAAG,GAAG,OAAO;gBAC1B;YACF;QACA,KAAK;YAAmB;gBACtB,MAAM,OAAO,IAAI,oBAAoB,CAAC,GAAG,GAAG,OAAO;gBACnD,KAAK,YAAY,CAAC,GAAG;gBACrB,KAAK,YAAY,CAAC,KAAK;gBACvB,KAAK,YAAY,CAAC,GAAG;gBACrB,IAAI,SAAS,GAAG;gBAChB,IAAI,QAAQ,CAAC,GAAG,GAAG,OAAO;gBAC1B;YACF;QACA,KAAK;YACH,IAAI,SAAS,GAAG;YAChB,IAAI,QAAQ,CAAC,GAAG,GAAG,OAAO;YAC1B;QAEF,KAAK;YACH,IAAI,SAAS,GAAG;YAChB,IAAI,QAAQ,CAAC,GAAG,GAAG,OAAO;YAC1B;QAEF,KAAK;YAAc;gBACjB,MAAM,OAAO,IAAI,oBAAoB,CAAC,GAAG,GAAG,QAAQ,KAAK;gBACzD,KAAK,YAAY,CAAC,GAAG;gBACrB,KAAK,YAAY,CAAC,MAAM;gBACxB,IAAI,OAAO,MAAM,GAAG,GAAG;oBACrB,MAAM,WAAW,CAAA,GAAA,yCAAW,EAAE,MAAM,CAAC,EAAE,EAAE,GAAG,OAAO,CAAC,mCAAmC,CAAC,GAAG,GAAG,GAAG;wBAC/F,MAAM,SAAS,CAAC,IAAc,KAAK,KAAK,CAAC,SAAS,KAAK,KAAK,QAAQ,CAAC,IAAI,QAAQ,CAAC,GAAG;wBACrF,OAAO,CAAC,CAAC,EAAE,OAAO,GAAG,EAAE,OAAO,GAAG,EAAE,OAAO,GAAG,CAAC;oBAChD;oBACA,KAAK,YAAY,CAAC,MAAM;gBAC1B;gBACA,KAAK,YAAY,CAAC,GAAG;gBACrB,IAAI,SAAS,GAAG;gBAChB,IAAI,QAAQ,CAAC,GAAG,GAAG,OAAO;gBAC1B;YACF;QACA,KAAK;QACL;YAAS;gBACP,MAAM,OAAO,IAAI,oBAAoB,CAAC,IAAI,IAAI,GAAG,IAAI,IAAI;gBACzD,KAAK,YAAY,CAAC,GAAG;gBACrB,KAAK,YAAY,CAAC,GAAG;gBACrB,IAAI,SAAS,GAAG;gBAChB,IAAI,QAAQ,CAAC,GAAG,GAAG,OAAO;gBAC1B;YACF;IACF;AACF;AAYA,MAAM,uCAAqC;IACzC;QACE,MAAM;QACN,OAAO,CAAC,KAAK;YACX,MAAM,MAAM,WAAY,CAAA,MAAM,QAAQ,GAAE;YACxC,OAAO;gBACL;oBAAE,IAAI;oBAAG,IAAI;oBAAG,OAAO;oBAAY,MAAM;oBAAU,UAAU,QAAQ;gBAAI;gBACzE;oBAAE,IAAI,CAAC;oBAAK,IAAI,MAAM;oBAAK,OAAO;oBAAU,MAAM,WAAW;oBAAM,UAAU;gBAAE;gBAC/E;oBAAE,IAAI;oBAAK,IAAI,MAAM;oBAAK,OAAO;oBAAU,MAAM,WAAW;oBAAM,UAAU;gBAAE;aAC/E;QACH;IACF;IACA;QACE,MAAM;QACN,OAAO,CAAC,KAAK;YACX,MAAM,UAA4F,EAAE;YACpG,MAAM,QAAQ,IAAI,KAAK,KAAK,CAAC,QAAQ;YACrC,MAAM,QAAQ,WAAW;YACzB,IAAK,IAAI,IAAI,GAAG,IAAI,OAAO,IAAK;gBAC9B,MAAM,QAAQ,AAAC,IAAI,QAAS,KAAK,EAAE,GAAG;gBACtC,QAAQ,IAAI,CAAC;oBACX,IAAI,KAAK,GAAG,CAAC,SAAS;oBACtB,IAAI,KAAK,GAAG,CAAC,SAAS;oBACtB,OAAO;oBACP,MAAM,WAAY,CAAA,OAAO,QAAQ,GAAE;oBACnC,UAAU,AAAC,QAAQ,MAAO,KAAK,EAAE;gBACnC;YACF;YACA,OAAO;QACT;IACF;IACA;QACE,MAAM;QACN,OAAO,CAAC,KAAK;YACX,MAAM,UAA4F,EAAE;YACpG,MAAM,QAAQ,IAAI,KAAK,KAAK,CAAC,QAAQ;YACrC,MAAM,QAAQ,MAAM;YACpB,IAAK,IAAI,IAAI,GAAG,IAAI,OAAO,IAAK;gBAC9B,MAAM,IAAI,IAAI;gBACd,MAAM,QAAQ,IAAI,KAAK,EAAE,GAAG,IAAI;gBAChC,MAAM,IAAI,IAAI,WAAW;gBACzB,QAAQ,IAAI,CAAC;oBACX,IAAI,KAAK,GAAG,CAAC,SAAS;oBACtB,IAAI,KAAK,GAAG,CAAC,SAAS;oBACtB,OAAO;oBACP,MAAM,WAAY,CAAA,OAAO,AAAC,CAAA,IAAI,CAAA,IAAK,IAAG;oBACtC,UAAU;gBACZ;YACF;YACA,OAAO;QACT;IACF;IACA;QACE,MAAM;QACN,OAAO,CAAC,KAAK;YACX,MAAM,MAAM,WAAW;YACvB,OAAO;gBACL;oBAAE,IAAI;oBAAG,IAAI,CAAC;oBAAK,OAAO;oBAAW,MAAM,WAAW;oBAAK,UAAU;gBAAE;gBACvE;oBAAE,IAAI;oBAAK,IAAI;oBAAG,OAAO;oBAAW,MAAM,WAAW;oBAAM,UAAU;gBAAG;gBACxE;oBAAE,IAAI;oBAAG,IAAI;oBAAK,OAAO;oBAAW,MAAM,WAAW;oBAAK,UAAU;gBAAG;gBACvE;oBAAE,IAAI,CAAC;oBAAK,IAAI;oBAAG,OAAO;oBAAW,MAAM,WAAW;oBAAM,UAAU;gBAAI;aAC3E;QACH;IACF;IACA;QACE,MAAM;QACN,OAAO,CAAC,KAAK;YACX,MAAM,MAAM,WAAW;YACvB,OAAO;gBACL;oBAAE,IAAI,CAAC,MAAM;oBAAK,IAAI;oBAAG,OAAO;oBAAY,MAAM,WAAW;oBAAK,UAAU,QAAQ;gBAAG;gBACvF;oBAAE,IAAI,MAAM;oBAAK,IAAI;oBAAG,OAAO;oBAAY,MAAM,WAAW;oBAAM,UAAU,MAAM,QAAQ;gBAAG;aAC9F;QACH;IACF;CACD;AAIM,SAAS,0CACd,GAA6B,EAC7B,OAAe,EACf,SAAoC,CAAC,CAAC;IAEtC,MAAM,cAAgC;QAAE,GAAG,CAAA,GAAA,yCAAa,CAAC;QAAE,GAAG,MAAM;IAAC;IAErE,MAAM,MAAM,CAAA,GAAA,yCAAQ,EAAE,CAAA,GAAA,yCAAW,EAAE;IAEnC,yEAAyE;IACzE,MAAM,YAAY,CAAA,GAAA,yCAAc,EAAE;IAElC,8DAA8D;IAC9D,MAAM,SACJ,KAAK,UACL,MAAM,EACP,GAAG;IACJ,MAAM,WAAW,OAAO,QAAQ,IAAI,UAAU,QAAQ;IACtD,MAAM,SAAS,OAAO,MAAM,IAAI,UAAU,MAAM;IAChD,MAAM,eAAe,OAAO,YAAY,IAAI,UAAU,YAAY;IAClE,MAAM,eAAe,OAAO,YAAY,IAAI,UAAU,YAAY;IAClE,MAAM,cAAc,OAAO,WAAW,IAAI,UAAU,WAAW;IAC/D,MAAM,mBAAmB,OAAO,gBAAgB,IAAI,UAAU,gBAAgB;IAE9E,MAAM,iBACJ,YAAY,cAAc,IAAI,KAAK,KAAK,CAAC,WAAW,WAAW;IAEjE,MAAM,cAAc,IAAI,CAAA,GAAA,yCAAgB,EAAE;IAC1C,MAAM,SAAS,YAAY,eAAe,CAAC,UAAU,WAAW;IAChE,MAAM,CAAC,SAAS,MAAM,GAAG,YAAY,yBAAyB,CAAC,UAAU,WAAW;IACpF,MAAM,WAAW,YAAY,kBAAkB;IAC/C,MAAM,eACJ,aAAa,YAAY,SAAS,aAAa,YAAY,SAAS;IAEtE,kEAAkE;IAClE,MAAM,iBAAiB,CAAA,GAAA,wCAAkB,EAAE,QAAQ;IAEnD,mEAAmE;IACnE,MAAM,aAAa,OAAO,IAAI,CAAC,CAAA,GAAA,yCAAK;IACpC,MAAM,eAAe,CAAA,GAAA,yCAAgB,EAAE,KAAK,YAAY,UAAU,IAAI;IAEtE,kEAAkE;IAClE,MAAM,aAAa,CAAA,GAAA,yCAAa,EAAE;IAElC,kEAAkE;IAClE,MAAM,aAAa,QAAQ,KAAK,EAAE,GAAG;IAErC,kEAAkE;IAClE,MAAM,kBAAkB,AAAC,CAAA,QAAQ,GAAE,IAAK,IAAI,2BAA2B;IAEvE,MAAM,cAAc,KAAK,GAAG,CAAC,OAAO,UAAU;IAC9C,MAAM,kBAAkB,eAAe;IACvC,MAAM,kBAAkB,eAAe;IAEvC,MAAM,KAAK,QAAQ;IACnB,MAAM,KAAK,SAAS;IAEpB,kEAAkE;IAClE,MAAM,WAAW,KAAK,KAAK,CAAC,IAAI;IAChC,qCAAe,KAAK,UAAU,eAAe,EAAE,SAAS,OAAO,OAAO,QAAQ,IAAI,IAAI,UAAU,KAAK;IAErG,0EAA0E;IAC1E,MAAM,aAAa,IAAI,KAAK,KAAK,CAAC,QAAQ;IAC1C,IAAI,wBAAwB,GAAG;IAC/B,IAAK,IAAI,IAAI,GAAG,IAAI,YAAY,IAAK;QACnC,MAAM,KAAK,QAAQ;QACnB,MAAM,KAAK,QAAQ;QACnB,MAAM,UAAU,KAAK,GAAG,CAAC,OAAO,UAAW,CAAA,MAAM,QAAQ,GAAE;QAC3D,MAAM,SAAS,CAAA,GAAA,yCAAiB,EAAE,gBAAgB;QAClD,MAAM,OAAO,IAAI,oBAAoB,CAAC,IAAI,IAAI,GAAG,IAAI,IAAI;QACzD,KAAK,YAAY,CAAC,GAAG,CAAA,GAAA,yCAAW,EAAE,QAAQ,OAAO,QAAQ;QACzD,KAAK,YAAY,CAAC,GAAG;QACrB,IAAI,WAAW,GAAG;QAClB,IAAI,SAAS,GAAG;QAChB,IAAI,QAAQ,CAAC,GAAG,GAAG,OAAO;IAC5B;IACA,IAAI,wBAAwB,GAAG;IAE/B,gEAAgE;IAChE,MAAM,QAAQ,AAAC,CAAA,CAAA,GAAA,yCAAQ,EAAE,WAAW,CAAA,GAAA,yCAAQ,EAAE,MAAK,IAAK;IAExD,kEAAkE;IAClE,MAAM,eAAe,IAAI,KAAK,KAAK,CAAC,QAAQ;IAC5C,IAAI,wBAAwB,GAAG;IAC/B,IAAK,IAAI,IAAI,GAAG,IAAI,cAAc,IAAK;QACrC,MAAM,KAAK,QAAQ;QACnB,MAAM,KAAK,QAAQ;QACnB,MAAM,QAAS,QAAQ,MAAM,QAAQ,QAAQ;QAC7C,MAAM,SAAS,CAAA,GAAA,yCAAiB,EAAE,gBAAgB;QAClD,IAAI,WAAW,GAAG,OAAO,QAAQ;QACjC,IAAI,SAAS,GAAG,CAAA,GAAA,yCAAW,EAAE,QAAQ;QACrC,IAAI,SAAS;QACb,8CAA8C;QAC9C,IAAI,UAAU,IAAI,KAAK,yBAAyB,UAAU,IAAI,KAAK,UACjE,8CAA8C;QAC9C,IAAI,IAAI,CAAC,KAAK,QAAQ,GAAG,KAAK,QAAQ,GAAG,OAAO,QAAS,CAAA,MAAM,QAAQ,GAAE;aAEzE,IAAI,GAAG,CAAC,IAAI,IAAI,QAAQ,GAAG,GAAG,KAAK,EAAE,GAAG;QAE1C,IAAI,IAAI;IACV;IACA,sCAAsC;IACtC,MAAM,YAAY,IAAI,KAAK,KAAK,CAAC,QAAQ;IACzC,IAAI,WAAW,GAAG,OAAO,QAAQ;IACjC,IAAI,WAAW,GAAG,CAAA,GAAA,yCAAW,EAAE,eAAe,QAAQ,EAAE;IACxD,IAAI,SAAS,GAAG,IAAI;IACpB,IAAK,IAAI,IAAI,GAAG,KAAK,WAAW,IAAK;QACnC,MAAM,IAAI,AAAC,KAAK,GAAG,CAAC,OAAO,UAAU,OAAQ;QAC7C,IAAI,SAAS;QACb,IAAI,GAAG,CAAC,IAAI,IAAI,GAAG,GAAG,KAAK,EAAE,GAAG;QAChC,IAAI,MAAM;IACZ;IACA,IAAI,wBAAwB,GAAG;IAE/B,kEAAkE;IAClE,MAAM,gBAAgB;IACtB,IAAI,gBAAgB,KAAK;QACvB,IAAI,IAAI;QACR,IAAI,wBAAwB,GAAG;QAC/B,MAAM,iBAAiB,OAAO,QAAQ;QACtC,MAAM,eAAe,CAAA,GAAA,yCAAW,EAAE,eAAe,QAAQ,EAAE;QAE3D,IAAI,gBAAgB,KAAK;YACvB,wCAAwC;YACxC,MAAM,aAAa,KAAK,GAAG,CAAC,GAAG,KAAK,GAAG,CAAC,OAAO,UAAW,CAAA,QAAQ,QAAQ,KAAI;YAC9E,MAAM,OAAO,aAAa;YAC1B,IAAI,WAAW,GAAG;YAClB,IAAI,SAAS,GAAG;YAChB,IAAI,SAAS;YACb,IAAK,IAAI,KAAK,GAAG,KAAK,OAAO,MAAM,WACjC,IAAK,IAAI,KAAK,GAAG,KAAK,QAAQ,MAAM,WAAY;gBAC9C,IAAI,MAAM,CAAC,KAAK,MAAM;gBACtB,IAAI,GAAG,CAAC,IAAI,IAAI,MAAM,GAAG,KAAK,EAAE,GAAG;YACrC;YAEF,IAAI,IAAI;QACV,OAAO,IAAI,gBAAgB,KAAK;YAC9B,8CAA8C;YAC9C,MAAM,cAAc,KAAK,GAAG,CAAC,GAAG,KAAK,GAAG,CAAC,OAAO,UAAW,CAAA,OAAO,QAAQ,IAAG;YAC7E,IAAI,WAAW,GAAG;YAClB,IAAI,WAAW,GAAG;YAClB,IAAI,SAAS,GAAG,MAAM;YACtB,MAAM,OAAO,KAAK,KAAK,CAAC,OAAO;YAC/B,IAAI,SAAS;YACb,IAAK,IAAI,IAAI,CAAC,MAAM,IAAI,MAAM,KAAK,YAAa;gBAC9C,IAAI,MAAM,CAAC,GAAG;gBACd,IAAI,MAAM,CAAC,IAAI,QAAQ;YACzB;YACA,IAAI,MAAM;QACZ,OAAO;YACL,4DAA4D;YAC5D,MAAM,WAAW,KAAK,GAAG,CAAC,IAAI,KAAK,GAAG,CAAC,OAAO,UAAW,CAAA,QAAQ,QAAQ,IAAG;YAC5E,MAAM,QAAQ,WAAW,KAAK,IAAI,CAAC;YACnC,IAAI,WAAW,GAAG,iBAAiB;YACnC,IAAI,WAAW,GAAG;YAClB,IAAI,SAAS,GAAG,MAAM;YACtB,IAAI,SAAS;YACb,IAAK,IAAI,MAAM,GAAG,MAAM,QAAQ,SAAS,OAAO,MAAO;gBACrD,MAAM,UAAU,AAAC,MAAM,IAAK,WAAW;gBACvC,IAAK,IAAI,MAAM,GAAG,MAAM,WAAW,MAAM,QAAQ,WAAW,KAAK,MAAO;oBACtE,MAAM,KAAK,MAAM,WAAW,MAAM;oBAClC,MAAM,KAAK,MAAM;oBACjB,IAAK,IAAI,IAAI,GAAG,IAAI,GAAG,IAAK;wBAC1B,MAAM,QAAQ,AAAC,KAAK,EAAE,GAAG,IAAK,IAAI,KAAK,EAAE,GAAG;wBAC5C,MAAM,KAAK,KAAK,KAAK,GAAG,CAAC,SAAS,WAAW;wBAC7C,MAAM,KAAK,KAAK,KAAK,GAAG,CAAC,SAAS,WAAW;wBAC7C,IAAI,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI;6BACvB,IAAI,MAAM,CAAC,IAAI;oBACtB;oBACA,IAAI,SAAS;gBACf;YACF;YACA,IAAI,MAAM;QACZ;QACA,IAAI,OAAO;IACb;IACA,IAAI,wBAAwB,GAAG;IAE/B,oEAAoE;IACpE,MAAM,kBAAmC,QAAQ,MAC7C,UAAU,qBAAqB,CAAC,KAAK,KAAK,CAAC,QAAQ,UAAU,qBAAqB,CAAC,MAAM,EAAE,GAC3F,2CAAqB,CAAC,KAAK,KAAK,CAAC,QAAQ,4CAAsB,MAAM,EAAE;IAI3E,MAAM,UAAU;IAChB,MAAM,eACJ,UAAU,OAAO,gBACjB,UAAU,OAAO,gBACjB,UAAU,OAAO,SAAS;IAE5B,oEAAoE;IACpE,MAAM,gBAAgB;QACpB;YAAE,GAAG,IAAI;YAAG,GAAG,IAAI;QAAE;QACrB;YAAE,GAAG,IAAI;YAAG,GAAG,IAAI;QAAE;QACrB;YAAE,GAAG,IAAI;YAAG,GAAG,IAAI;QAAE;QACrB;YAAE,GAAG,IAAI;YAAG,GAAG,IAAI;QAAE;KACtB;IACD,MAAM,WAAW,IAAI,KAAK,KAAK,CAAC,QAAQ;IACxC,MAAM,cAAiE,EAAE;IACzE,IAAK,IAAI,IAAI,GAAG,IAAI,UAAU,IAC5B,IAAI,QAAQ,KAAK;QACf,MAAM,KAAK,aAAa,CAAC,KAAK,KAAK,CAAC,QAAQ,cAAc,MAAM,EAAE;QAClE,YAAY,IAAI,CAAC;YACf,GAAG,QAAS,CAAA,GAAG,CAAC,GAAG,AAAC,CAAA,QAAQ,GAAE,IAAK,IAAG;YACtC,GAAG,SAAU,CAAA,GAAG,CAAC,GAAG,AAAC,CAAA,QAAQ,GAAE,IAAK,IAAG;YACvC,UAAU,MAAM,QAAQ;QAC1B;IACF,OACE,YAAY,IAAI,CAAC;QACf,GAAG,QAAS,CAAA,MAAM,QAAQ,GAAE;QAC5B,GAAG,SAAU,CAAA,MAAM,QAAQ,GAAE;QAC7B,UAAU,MAAM,QAAQ;IAC1B;IAIJ,mEAAmE;IACnE,uDAAuD;IACvD,MAAM,MAAM,AAAC,CAAA,IAAI,KAAK,IAAI,CAAC,EAAC,IAAK;IACjC,MAAM,qBAAqB,UAAU,QAAQ,IAAI;IACjD,MAAM,mBAAmB,UAAU,QAAQ,IAAI;IAC/C,MAAM,WAAW,mBAAmB,IAAK,KAAK,KAAK,CAAC,QAAQ,KAAK;IACjE,MAAM,YAA6D,EAAE;IACrE,IAAK,IAAI,IAAI,GAAG,IAAI,UAAU,IAC5B,IAAI,oBAAoB;QACtB,uEAAuE;QACvE,MAAM,KAAK,AAAC,MAAM,IAAK,IAAI,MAAM,IAAI,IAAI;QACzC,MAAM,KAAK,AAAC,MAAM,IAAK,IAAI,IAAI,MAAM,IAAI;QACzC,UAAU,IAAI,CAAC;YACb,GAAG,QAAS,CAAA,KAAK,AAAC,CAAA,QAAQ,GAAE,IAAK,IAAG;YACpC,GAAG,SAAU,CAAA,KAAK,AAAC,CAAA,QAAQ,GAAE,IAAK,IAAG;YACrC,QAAQ,KAAK,GAAG,CAAC,OAAO,UAAW,CAAA,OAAO,QAAQ,IAAG;QACvD;IACF,OACE,UAAU,IAAI,CAAC;QACb,GAAG,QAAS,CAAA,OAAO,QAAQ,GAAE;QAC7B,GAAG,SAAU,CAAA,OAAO,QAAQ,GAAE;QAC9B,QAAQ,KAAK,GAAG,CAAC,OAAO,UAAW,CAAA,OAAO,QAAQ,GAAE;IACtD;IAIJ,SAAS,eAAe,EAAU,EAAE,EAAU;QAC5C,IAAI,UAAU,WAAW,CAAC,EAAE;QAC5B,IAAI,UAAU;QACd,KAAK,MAAM,MAAM,YAAa;YAC5B,MAAM,IAAI,KAAK,KAAK,CAAC,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC;YACzC,IAAI,IAAI,SAAS;gBACf,UAAU;gBACV,UAAU;YACZ;QACF;QACA,MAAM,OAAO,QAAQ,QAAQ,GAAG,QAAQ;QACxC,OAAO;YAAC,KAAK,AAAC,CAAA,QAAQ,CAAC,GAAG,EAAC,IAAK;YAAM,KAAK,AAAC,CAAA,QAAQ,CAAC,GAAG,EAAC,IAAK;SAAK;IACrE;IAEA,gEAAgE;IAChE,KAAK,MAAM,QAAQ,UAAW;QAC5B,qCAAqC;QACrC,IAAI,WAAW,GAAG,OAAO,QAAQ;QACjC,IAAI,WAAW,GAAG,CAAA,GAAA,yCAAW,EAAE,eAAe,MAAM,EAAE;QACtD,IAAI,SAAS,GAAG,MAAM;QACtB,IAAI,SAAS;QACb,IAAI,GAAG,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,EAAE,KAAK,MAAM,EAAE,GAAG,KAAK,EAAE,GAAG;QAClD,IAAI,MAAM;QAEV,iDAAiD;QACjD,IAAI,QAAQ,KAAK;YACf,MAAM,WAAW,IAAI,KAAK,KAAK,CAAC,QAAQ;YACxC,IAAI,WAAW,GAAG,OAAO,QAAQ;YACjC,IAAI,SAAS,GAAG,CAAA,GAAA,yCAAW,EAAE,eAAe,SAAS,EAAE;YACvD,IAAK,IAAI,IAAI,GAAG,IAAI,UAAU,IAAK;gBACjC,MAAM,QAAQ,QAAQ,KAAK,EAAE,GAAG;gBAChC,MAAM,OAAO,QAAQ,KAAK,MAAM,GAAG;gBACnC,MAAM,OAAO,AAAC,CAAA,IAAI,QAAQ,CAAA,IAAK;gBAC/B,IAAI,SAAS;gBACb,IAAI,GAAG,CACL,KAAK,CAAC,GAAG,KAAK,GAAG,CAAC,SAAS,MAC3B,KAAK,CAAC,GAAG,KAAK,GAAG,CAAC,SAAS,MAC3B,MAAM,GAAG,KAAK,EAAE,GAAG;gBAErB,IAAI,IAAI;YACV;QACF;QAEA,2CAA2C;QAC3C,IAAI,QAAQ,KAAK;YACf,IAAI,WAAW,GAAG,OAAO,QAAQ;YACjC,IAAI,WAAW,GAAG,CAAA,GAAA,yCAAW,EAAE,eAAe,QAAQ,EAAE;YACxD,IAAI,SAAS,GAAG,MAAM;YACtB,MAAM,SAAS,KAAK,MAAM,GAAI,CAAA,MAAM,QAAQ,GAAE;YAC9C,IAAI,SAAS;YACb,IAAI,GAAG,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,EAAE,QAAQ,GAAG,KAAK,EAAE,GAAG;YAC7C,IAAI,MAAM;QACZ;IACF;IACA,IAAI,WAAW,GAAG;IAElB,mEAAmE;IACnE,wDAAwD;IACxD,MAAM,gBAAgB,CAAA,GAAA,yCAAQ,EAAE,CAAA,GAAA,yCAAW,EAAE,SAAS;IACtD,MAAM,eAAe,CAAA,GAAA,yCAAiB,EAAE;IACxC,MAAM,WAAW,CAAA,GAAA,yCAAQ,EAAE,cAAc,GAAG,KAAK;IACjD,MAAM,iBAAiB,QAAQ,KAAK,EAAE,GAAG;IACzC,MAAM,YAAY,MAAM,QAAQ,KAAK,2BAA2B;IAEhE,SAAS,UAAU,CAAS,EAAE,CAAS;QACrC,wDAAwD;QACxD,MAAM,KAAK,AAAC,IAAI,QAAS;QACzB,MAAM,KAAK,AAAC,IAAI,SAAU;QAC1B,OAAO,iBAAiB,SAAS,IAAI,MAAM,KAAK,EAAE;IACpD;IAEA,wEAAwE;IACxE,SAAS,oBAAoB,CAAS,EAAE,CAAS;QAC/C,MAAM,IAAI,aAAa,AAAC,IAAI,QAAS,GAAG,AAAC,IAAI,SAAU;QACvD,gEAAgE;QAChE,OAAO,MAAM,AAAC,CAAA,IAAI,CAAA,IAAK;IACzB;IAEA,mEAAmE;IACnE,MAAM,iBAA+E,EAAE;IAEvF,6DAA6D;IAC7D,MAAM,qBAAqB,KAAK,GAAG,CAAC,OAAO,UAAU;IACrD,MAAM,cAAc,IAAI,kCAAY;IAEpC,gEAAgE;IAChE,IAAI,aAA4D;IAEhE,mEAAmE;IACnE,IAAI,UAAU,SAAS,IAAI,QAAQ,KAAK;QACtC,MAAM,YAAY,WAAW,CAAC,EAAE;QAChC,oCAAoC;QACpC,MAAM,WAAW;eAAI,aAAa,OAAO;eAAK,aAAa,UAAU;SAAC,CACnE,MAAM,CAAC,CAAC,IAAM,CAAA,GAAA,yCAAa,CAAC,CAAC,EAAE,EAAE,iBAAiB,WAAW,QAAQ,CAAC;QACzE,MAAM,YAAY,SAAS,MAAM,GAAG,IAChC,QAAQ,CAAC,KAAK,KAAK,CAAC,QAAQ,SAAS,MAAM,EAAE,GAC7C,UAAU,CAAC,KAAK,KAAK,CAAC,QAAQ,WAAW,MAAM,EAAE;QAErD,MAAM,WAAW,kBAAmB,CAAA,MAAM,QAAQ,GAAE;QACpD,MAAM,eAAe,QAAQ;QAC7B,MAAM,WAAW,CAAA,GAAA,yCAAW,EAC1B,CAAA,GAAA,yCAAc,EAAE,CAAA,GAAA,yCAAa,EAAE,eAAe,QAAQ,EAAE,KAAK,GAAG,OAAO,QACvE,OAAO,QAAQ;QAEjB,MAAM,aAAa,CAAA,GAAA,yCAAc,EAAE,CAAA,GAAA,yCAAa,EAAE,eAAe,MAAM,EAAE,KAAK,GAAG,OAAO;QAExF,qCAAqC;QACrC,MAAM,cAAc,CAAA,GAAA,yCAAa,CAAC,CAAC,UAAU;QAC7C,MAAM,YAAyB,cAC1B,YAAY,UAAU,CAAC,KAAK,KAAK,CAAC,QAAQ,YAAY,UAAU,CAAC,MAAM,EAAE,GACzE,QAAQ,MAAM,eAAe;QAElC,IAAI,WAAW,GAAG,MAAM,QAAQ;QAChC,CAAA,GAAA,yCAAqB,EAAE,KAAK,WAAW,UAAU,CAAC,EAAE,UAAU,CAAC,EAAE;YAC/D,WAAW;YACX,aAAa;YACb,aAAa,AAAC,CAAA,MAAM,QAAQ,CAAA,IAAK;YACjC,MAAM;YACN,UAAU;YACV,gBAAgB;YAChB,YAAY,AAAC,CAAA,KAAK,QAAQ,EAAC,IAAK;YAChC,WAAW,CAAA,GAAA,yCAAW,EAAE,YAAY;YACpC,iBAAiB,CAAA,GAAA,yCAAa,EAAE,eAAe,SAAS,EAAE,KAAK,IAAI;YACnE,aAAa;iBACb;wBACA;yBACA;QACF;QAEA,aAAa;YAAE,GAAG,UAAU,CAAC;YAAE,GAAG,UAAU,CAAC;YAAE,MAAM;QAAS;QAC9D,eAAe,IAAI,CAAC;YAAE,GAAG,UAAU,CAAC;YAAE,GAAG,UAAU,CAAC;YAAE,MAAM;YAAU,OAAO;QAAU;QACvF,YAAY,MAAM,CAAC;YAAE,GAAG,UAAU,CAAC;YAAE,GAAG,UAAU,CAAC;YAAE,MAAM;YAAU,OAAO;QAAU;IACxF;IAGA,kEAAkE;IAClE,MAAM,kBAAkB,KAAK,IAAI,CAAC,iBAAiB;IAEnD,IAAK,IAAI,QAAQ,GAAG,QAAQ,QAAQ,QAAS;QAC3C,MAAM,aAAa,SAAS,IAAI,QAAS,CAAA,SAAS,CAAA,IAAK;QACvD,MAAM,YACJ,iBACA,KAAK,KAAK,CAAC,QAAQ,iBAAiB;QACtC,MAAM,eAAe,KAAK,GAAG,CAAC,MAAM,cAAc,QAAQ;QAC1D,MAAM,iBAAiB,IAAI,QAAQ;QAEnC,uBAAuB;QACvB,MAAM,aAAa,CAAA,GAAA,yCAAY,EAAE;QACjC,IAAI,wBAAwB,GAAG;QAE/B,wDAAwD;QACxD,MAAM,mBAAgC,QAAQ,MAC1C,UAAU,eAAe,CAAC,KAAK,KAAK,CAAC,QAAQ,UAAU,eAAe,CAAC,MAAM,EAAE,GAC/E,CAAA,GAAA,yCAAc,EAAE;QAEpB,4CAA4C;QAC5C,MAAM,mBAAmB,aAAa;QAEtC,8DAA8D;QAC9D,8DAA8D;QAC9D,MAAM,YAAY,IAAI,aAAa,KAAK,oCAAoC;QAC5E,MAAM,iBAAiB,MAAM,YAAY,KAAK,8BAA8B;QAC5E,MAAM,uBAAuB,aAAa,KAAK,wBAAwB;QAEvE,+DAA+D;QAC/D,MAAM,iBAAiB,CAAA,GAAA,yCAAc,EAAE,gBAAgB,YAAY;QAEnE,wDAAwD;QACxD,MAAM,mBAAmB,CAAC,IAAY;YACpC,IAAI,eAAe;YACnB,KAAK,MAAM,MAAM,YAAa;gBAC5B,MAAM,IAAI,KAAK,KAAK,CAAC,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC;gBACzC,IAAI,IAAI,cAAc,eAAe;YACvC;YACA,MAAM,UAAU,KAAK,KAAK,CAAC,OAAO,UAAU;YAC5C,OAAO,KAAK,GAAG,CAAC,GAAG,IAAI,eAAe,UAAU,6BAA6B;QAC/E;QAEA,IAAK,IAAI,IAAI,GAAG,IAAI,WAAW,IAAK;YAClC,kDAAkD;YAClD,MAAM,SAAS,6CACb,iBACA,KACA,OACA,QACA,GACA,WACA,IACA;YAEF,MAAM,CAAC,GAAG,EAAE,GAAG,eAAe,OAAO,CAAC,EAAE,OAAO,CAAC;YAEhD,mDAAmD;YACnD,IAAI,mCAAa,GAAG,GAAG,YAAY;gBACjC,IAAI,QAAQ,MAAM;YACpB;YACA,IAAI,YAAY,SAAS,CAAC,GAAG,GAAG,sBAAsB,iBAAiB;gBACrE,IAAI,QAAQ,KAAK;YACnB;YAEA,6DAA6D;YAC7D,MAAM,QAAQ,KAAK,GAAG,CAAC,OAAO,UAAU,SAAS;YACjD,MAAM,OACJ,AAAC,CAAA,kBAAkB,QAAS,CAAA,kBAAkB,eAAc,CAAC,IAC7D,iBAAiB,oBAAoB,GAAG;YAE1C,mDAAmD;YACnD,MAAM,eAAe,OAAO;YAE5B,4DAA4D;YAC5D,MAAM,QAAQ,CAAA,GAAA,yCAAmB,EAAE,cAAc,KAAK;YAEtD,2DAA2D;YAC3D,IAAI,WACF,oBAAoB,eAChB,AAAC,UAAU,GAAG,KAAK,MAAO,KAAK,EAAE,GAAG,AAAC,CAAA,QAAQ,GAAE,IAAK,KACpD,QAAQ;YAEd,wDAAwD;YACxD,IAAI,YAAY;gBACd,MAAM,aAAa,KAAK,KAAK,CAAC,IAAI,WAAW,CAAC,EAAE,IAAI,WAAW,CAAC;gBAChE,MAAM,gBAAgB,WAAW,IAAI,GAAG;gBACxC,IAAI,aAAa,iBAAiB,aAAa,GAAG;oBAChD,MAAM,cAAc,KAAK,KAAK,CAAC,WAAW,CAAC,GAAG,GAAG,WAAW,CAAC,GAAG,KAAK,MAAM,KAAK,EAAE;oBAClF,MAAM,cAAc,IAAK,aAAa;oBACtC,WAAW,WAAW,AAAC,CAAA,cAAc,QAAO,IAAK,cAAc;gBACjE;YACF;YAEA,yEAAyE;YACzE,IAAI,WAAW,yCAAmB,GAAG,GAAG,OAAO,QAAQ,gBAAgB;YACvE,MAAM,aAAa,CAAA,GAAA,yCAAiB,EAAE,gBAAgB;YAEtD,8CAA8C;YAC9C,IAAI,mBAAmB,GACrB,WAAW,CAAA,GAAA,wCAAS,EAAE,UAAU;YAGlC,uEAAuE;YACvE,IAAI,cACF,WAAW,CAAA,GAAA,yCAAe,EAAE,UAAU,cAAc,OAAO,aAAa;YAG1E,MAAM,YAAY,CAAA,GAAA,yCAAc,EAAE,CAAA,GAAA,yCAAa,EAAE,UAAU,KAAK,GAAG,OAAO;YAC1E,MAAM,cAAc,CAAA,GAAA,yCAAc,EAAE,CAAA,GAAA,yCAAa,EAAE,YAAY,KAAK,GAAG,OAAO;YAE9E,wBAAwB;YACxB,MAAM,YAAY,MAAM,QAAQ;YAChC,MAAM,kBAAkB,CAAA,GAAA,yCAAW,EAAE,WAAW;YAEhD,MAAM,cAAc,AAAC,CAAA,MAAM,QAAQ,GAAE,IAAK,cAAc;YAExD,6DAA6D;YAC7D,MAAM,kBAAkB,IAAI;YAC5B,IAAI,WAAW,GAAG,eAAgB,CAAA,MAAM,QAAQ,GAAE,IAAK;YAEvD,yDAAyD;YACzD,MAAM,WAAW,oCAAc,QAAQ,CAAC;YACxC,MAAM,iBAAiB,WAAW,OAAO;YACzC,MAAM,aAAa,iBAAiB,UAAU,cAAc;YAC5D,MAAM,UAAU,QAAQ;YACxB,MAAM,aAAa,UAAU,AAAC,CAAA,IAAI,QAAQ,EAAC,IAAK,cAAc;YAE9D,wBAAwB;YACxB,MAAM,cAAc,QAAQ;YAC5B,MAAM,cAAc,cAChB,CAAA,GAAA,yCAAa,EAAE,CAAA,GAAA,yCAAiB,EAAE,gBAAgB,MAAM,KAAK,IAAI,OACjE;YAEJ,wCAAwC;YACxC,MAAM,mBAAmB,CAAA,GAAA,yCAAgB,EAAE,OAAO,kBAAkB;YAEpE,uEAAuE;YACvE,MAAM,kBAAkB,QAAQ,QAAQ,qBAAqB;YAC7D,MAAM,mBAAmB,kBAAkB,eAA8B;YAEzE,oDAAoD;YACpD,MAAM,aAAa,UAAU,IAAK,OAAO;YACzC,MAAM,aAAa,aAAa,KAAK,GAAG,CAAC;YACzC,MAAM,aAAa,aAAa,KAAK,GAAG,CAAC;YAEzC,gEAAgE;YAChE,IAAI,SAAS;YACb,IAAI,SAAS;YACb,IAAI,eAAe,MAAM,GAAG,KAAK,QAAQ,MAAM;gBAC7C,oDAAoD;gBACpD,MAAM,eAAe,kBAAkB;gBACvC,MAAM,aAAa,YAAY,WAAW,CAAC,GAAG,GAAG;gBACjD,IAAI,YAAY;oBACd,MAAM,cAAc,KAAK,KAAK,CAAC,IAAI,WAAW,CAAC,EAAE,IAAI,WAAW,CAAC;oBACjE,qDAAqD;oBACrD,MAAM,aAAa,AAAC,CAAA,OAAO,WAAW,IAAI,AAAD,IAAK;oBAC9C,IAAI,cAAc,aAAa,OAAO,cAAc,aAAa,GAAG;wBAClE,MAAM,QAAQ,KAAK,KAAK,CAAC,IAAI,WAAW,CAAC,EAAE,IAAI,WAAW,CAAC;wBAC3D,SAAS,WAAW,CAAC,GAAG,KAAK,GAAG,CAAC,SAAS;wBAC1C,SAAS,WAAW,CAAC,GAAG,KAAK,GAAG,CAAC,SAAS;wBAC1C,iBAAiB;wBACjB,SAAS,KAAK,GAAG,CAAC,GAAG,KAAK,GAAG,CAAC,OAAO;wBACrC,SAAS,KAAK,GAAG,CAAC,GAAG,KAAK,GAAG,CAAC,QAAQ;oBACxC;gBACF;YACF;YAEA,gEAAgE;YAChE,MAAM,aAAa,CAAA,GAAA,yCAAa,EAAE;YAClC,MAAM,eAAe;gBAAC;gBAAU;gBAAY;gBAAU;gBAAW;gBAC/D;gBAAW;gBAAY;gBAAe;aAAmB,CAAC,QAAQ,CAAC;YACrE,MAAM,eAAe,eAAe,QAAQ,gBAAgB,OAAO,kBAAkB;YAErF,MAAM,cAAc;gBAClB,WAAW;6BACX;6BACA;sBACA;0BACA;gBACA,gBAAgB;gBAChB,YAAY,cAAe,CAAA,aAAa,IAAI,aAAa,IAAI,CAAA;gBAC7D,WAAW,UACP,CAAA,GAAA,yCAAW,EAAE,WAAW,OACvB,aAAa,IAAI,qBAAqB;gBAC3C,iBAAiB;gBACjB,aAAa;qBACb;4BACA;6BACA;YACF;YAEA,IAAI,cACF,CAAA,GAAA,yCAAgB,EAAE,KAAK,OAAO,QAAQ,QAAQ;gBAC5C,GAAG,WAAW;gBACd,YAAY;gBACZ,WAAW,OAAQ,CAAA,MAAM,QAAQ,GAAE;YACrC;iBAEA,CAAA,GAAA,yCAAqB,EAAE,KAAK,OAAO,QAAQ,QAAQ;YAGrD,qEAAqE;YACrE,IAAI,QAAQ,OAAO,OAAO,kBAAkB,GAAG;gBAC7C,MAAM,cAAc,IAAI,KAAK,KAAK,CAAC,QAAQ;gBAC3C,IAAK,IAAI,IAAI,GAAG,IAAI,aAAa,IAAK;oBACpC,MAAM,aAAa,IAAI,AAAC,CAAA,IAAI,CAAA,IAAK,MAAM,wBAAwB;oBAC/D,MAAM,aAAa,OAAO,IAAI,MAAM,0CAA0C;oBAC9E,IAAI,WAAW,GAAG;oBAClB,CAAA,GAAA,yCAAqB,EAAE,KAAK,OAAO,QAAQ,QAAQ;wBACjD,WAAW,CAAA,GAAA,yCAAW,EAAE,WAAW,OAAO,IAAI;wBAC9C,aAAa;wBACb,aAAa;wBACb,MAAM,OAAO;kCACb;wBACA,gBAAgB;wBAChB,aAAa;6BACb;oBACF;gBACF;YACF;YAEA,eAAe,IAAI,CAAC;gBAAE,GAAG;gBAAQ,GAAG;sBAAQ;uBAAM;YAAM;YACxD,YAAY,MAAM,CAAC;gBAAE,GAAG;gBAAQ,GAAG;sBAAQ;uBAAM;YAAM;YAEvD,mEAAmE;YACnE,IAAI,OAAO,kBAAkB,OAAO,QAAQ,KAAK;gBAC/C,MAAM,YAAY,IAAI,KAAK,KAAK,CAAC,QAAQ;gBACzC,MAAM,YAAY,QAAQ,KAAK,EAAE,GAAG;gBACpC,IAAK,IAAI,IAAI,GAAG,IAAI,WAAW,IAAK;oBAClC,MAAM,YAAY,MAAM,IAAI;oBAC5B,MAAM,WAAW,OAAQ,CAAA,MAAM,IAAI,GAAE;oBACrC,MAAM,QAAQ,SAAS,KAAK,GAAG,CAAC,aAAa;oBAC7C,MAAM,QAAQ,SAAS,KAAK,GAAG,CAAC,aAAa;oBAC7C,MAAM,WAAW,OAAO,KAAK,GAAG,CAAC,KAAK;oBAEtC,IAAI,QAAQ,KAAK,QAAQ,SAAS,QAAQ,KAAK,QAAQ,QAAQ;oBAE/D,IAAI,WAAW,GAAG,eAAgB,CAAA,MAAM,IAAI,GAAE;oBAC9C,CAAA,GAAA,yCAAqB,EAAE,KAAK,OAAO,OAAO,OAAO;wBAC/C,WAAW,CAAA,GAAA,yCAAW,EAAE,WAAW,YAAY;wBAC/C,aAAa,CAAA,GAAA,yCAAW,EAAE,aAAa;wBACvC,aAAa,cAAc;wBAC3B,MAAM;wBACN,UAAU,WAAW,AAAC,CAAA,IAAI,CAAA,IAAK;wBAC/B,gBAAgB;wBAChB,aAAa;6BACb;oBACF;oBACA,eAAe,IAAI,CAAC;wBAAE,GAAG;wBAAO,GAAG;wBAAO,MAAM;+BAAU;oBAAM;oBAChE,YAAY,MAAM,CAAC;wBAAE,GAAG;wBAAO,GAAG;wBAAO,MAAM;+BAAU;oBAAM;gBACjE;YACF;YAEA,8DAA8D;YAC9D,wDAAwD;YACxD,MAAM,iBAAiB,iBAAiB,QAAQ;YAChD,MAAM,gBAAgB,OAAO,iBAAiB,MAAM,oBAAoB;YACxE,IAAI,OAAO,kBAAkB,OAAO,QAAQ,eAAe;gBACzD,MAAM,aAAa,IAAI,KAAK,KAAK,CAAC,QAAQ;gBAC1C,IAAK,IAAI,IAAI,GAAG,IAAI,YAAY,IAAK;oBACnC,2CAA2C;oBAC3C,MAAM,oBAAoB,AAAC,OAAO,OAAQ;oBAC1C,MAAM,aAAa,CAAA,GAAA,yCAAmB,EAAE,cAAc,KAAK;oBAC3D,MAAM,YAAY,OAAQ,CAAA,OAAO,QAAQ,IAAG;oBAC5C,MAAM,YAAY,AAAC,CAAA,QAAQ,GAAE,IAAK,OAAO;oBACzC,MAAM,YAAY,AAAC,CAAA,QAAQ,GAAE,IAAK,OAAO;oBACzC,MAAM,WAAW,QAAQ;oBACzB,MAAM,YAAY,CAAA,GAAA,yCAAW,EAC3B,CAAA,GAAA,yCAAa,EAAE,CAAA,GAAA,yCAAiB,EAAE,gBAAgB,MAAM,KAAK,IAAI,MACjE,MAAM,QAAQ;oBAGhB,IAAI,WAAW,GAAG,eAAe;oBACjC,CAAA,GAAA,yCAAqB,EACnB,KACA,YACA,SAAS,WACT,SAAS,WACT;wBACE,WAAW;wBACX,aAAa,CAAA,GAAA,yCAAW,EAAE,aAAa;wBACvC,aAAa,cAAc;wBAC3B,MAAM;wBACN,UAAU;wBACV,gBAAgB;wBAChB,aAAa,CAAA,GAAA,yCAAgB,EAAE,YAAY,kBAAkB;6BAC7D;oBACF;gBAEJ;YACF;YAEA,8DAA8D;YAC9D,MAAM,sBAAsB,OAAO,iBAAiB,KAAK,oBAAoB;YAC7E,IAAI,OAAO,kBAAkB,QAAQ,QAAQ,qBAAqB;gBAChE,MAAM,gBAAgB,oCAAc,CAAC,KAAK,KAAK,CAAC,QAAQ,qCAAe,MAAM,EAAE;gBAC/E,MAAM,UAAU,cAAc,KAAK,CAAC,KAAK;gBACzC,MAAM,gBAAgB,QAAQ,KAAK,EAAE,GAAG;gBACxC,MAAM,OAAO,KAAK,GAAG,CAAC;gBACtB,MAAM,OAAO,KAAK,GAAG,CAAC;gBAEtB,KAAK,MAAM,UAAU,QAAS;oBAC5B,gDAAgD;oBAChD,MAAM,KAAK,SAAS,OAAO,EAAE,GAAG,OAAO,OAAO,EAAE,GAAG;oBACnD,MAAM,KAAK,SAAS,OAAO,EAAE,GAAG,OAAO,OAAO,EAAE,GAAG;oBAEnD,IAAI,KAAK,KAAK,KAAK,SAAS,KAAK,KAAK,KAAK,QAAQ;oBAEnD,MAAM,aAAa,CAAA,GAAA,yCAAW,EAC5B,CAAA,GAAA,yCAAa,EAAE,CAAA,GAAA,yCAAiB,EAAE,gBAAgB,MAAM,KAAK,GAAG,OAChE,YAAY;oBAEd,MAAM,eAAe,CAAA,GAAA,yCAAc,EACjC,CAAA,GAAA,yCAAa,EAAE,YAAY,KAAK,GAAG,OAAO;oBAG5C,IAAI,WAAW,GAAG,eAAe;oBACjC,sEAAsE;oBACtE,MAAM,cAAc,WAAW,QAAQ,CAAC,OAAO,KAAK,IAChD,OAAO,KAAK,GACZ,CAAA,GAAA,yCAAmB,EAAE,cAAc,KAAK,OAAO,IAAI,GAAG;oBAE1D,CAAA,GAAA,yCAAqB,EAAE,KAAK,aAAa,IAAI,IAAI;wBAC/C,WAAW;wBACX,aAAa;wBACb,aAAa,cAAc;wBAC3B,MAAM,OAAO,IAAI;wBACjB,UAAU,OAAO,QAAQ,GAAG,AAAC,gBAAgB,MAAO,KAAK,EAAE;wBAC3D,gBAAgB;wBAChB,aAAa,CAAA,GAAA,yCAAgB,EAAE,aAAa,kBAAkB;6BAC9D;oBACF;oBACA,eAAe,IAAI,CAAC;wBAAE,GAAG;wBAAI,GAAG;wBAAI,MAAM,OAAO,IAAI;wBAAE,OAAO;oBAAY;oBAC1E,YAAY,MAAM,CAAC;wBAAE,GAAG;wBAAI,GAAG;wBAAI,MAAM,OAAO,IAAI;wBAAE,OAAO;oBAAY;gBAC3E;YACF;YAEA,iEAAiE;YACjE,wDAAwD;YACxD,IAAI,OAAO,kBAAkB,QAAQ,QAAQ,MAAM;gBACjD,MAAM,cAAc,IAAI,KAAK,KAAK,CAAC,QAAQ,IAAI,aAAa;gBAC5D,MAAM,cAAc,QAAQ,KAAK,EAAE,GAAG;gBACtC,MAAM,gBAAgB,OAAQ,CAAA,MAAM,QAAQ,GAAE;gBAC9C,MAAM,cAAc,MAAM,QAAQ,MAAM,2BAA2B;gBACnE,MAAM,cAAc,OAAO,+BAA+B;gBAE1D,IAAI,aAAa,OAAO;gBACxB,IAAK,IAAI,IAAI,GAAG,IAAI,aAAa,IAAK;oBACpC,MAAM,KAAK,SAAS,KAAK,GAAG,CAAC,eAAe,gBAAiB,CAAA,IAAI,CAAA;oBACjE,MAAM,KAAK,SAAS,KAAK,GAAG,CAAC,eAAe,gBAAiB,CAAA,IAAI,CAAA;oBAEjE,IAAI,KAAK,KAAK,KAAK,SAAS,KAAK,KAAK,KAAK,QAAQ;oBACnD,IAAI,mCAAa,IAAI,IAAI,YAAY;oBAErC,cAAc;oBACd,IAAI,aAAa,iBAAiB;oBAElC,MAAM,cAAc,eAAgB,CAAA,MAAM,IAAI,IAAG;oBACjD,IAAI,WAAW,GAAG,KAAK,GAAG,CAAC,KAAK;oBAEhC,MAAM,aAAa,CAAA,GAAA,yCAAW,EAC5B,CAAA,GAAA,yCAAa,EAAE,CAAA,GAAA,yCAAiB,EAAE,gBAAgB,MAAM,KAAK,GAAG,OAChE,YAAY;oBAGd,CAAA,GAAA,yCAAqB,EAAE,KAAK,aAAa,IAAI,IAAI;wBAC/C,WAAW;wBACX,aAAa,CAAA,GAAA,yCAAW,EAAE,aAAa;wBACvC,aAAa,cAAc;wBAC3B,MAAM;wBACN,UAAU,WAAW,AAAC,CAAA,IAAI,CAAA,IAAK;wBAC/B,gBAAgB;wBAChB,aAAa;6BACb;oBACF;oBACA,eAAe,IAAI,CAAC;wBAAE,GAAG;wBAAI,GAAG;wBAAI,MAAM;wBAAY,OAAO;oBAAY;oBACzE,YAAY,MAAM,CAAC;wBAAE,GAAG;wBAAI,GAAG;wBAAI,MAAM;wBAAY,OAAO;oBAAY;gBAC1E;YACF;QACF;IACF;IAEA,8CAA8C;IAC9C,IAAI,wBAAwB,GAAG;IAE/B,kEAAkE;IAClE,mEAAmE;IACnE,mEAAmE;IACnE,IAAI,QAAQ,QAAQ,eAAe,MAAM,GAAG,GAAG;QAC7C,MAAM,cAAc,IAAI,KAAK,KAAK,CAAC,QAAQ;QAC3C,IAAK,IAAI,IAAI,GAAG,IAAI,aAAa,IAAK;YACpC,8CAA8C;YAC9C,MAAM,cAAc,cAAc,CAAC,KAAK,KAAK,CAAC,QAAQ,eAAe,MAAM,EAAE;YAC7E,MAAM,UAAU,YAAY,CAAC,GAAG,AAAC,CAAA,QAAQ,GAAE,IAAK,YAAY,IAAI,GAAG;YACnE,MAAM,UAAU,YAAY,CAAC,GAAG,AAAC,CAAA,QAAQ,GAAE,IAAK,YAAY,IAAI,GAAG;YACnE,MAAM,aAAa,kBAAmB,CAAA,OAAO,QAAQ,IAAG;YAExD,uCAAuC;YACvC,MAAM,cAAc,CAAA,GAAA,yCAAmB,EAAE,cAAc,KAAK,aAAa;YACzE,MAAM,iBAAiB,QAAQ;YAC/B,MAAM,cAAc,MAAM,QAAQ;YAElC,IAAI,IAAI;YACR,IAAI,SAAS,CAAC,SAAS;YACvB,IAAI,MAAM,CAAC,AAAC,iBAAiB,KAAK,EAAE,GAAI;YAExC,iEAAiE;YACjE,IAAI,SAAS;YACb,CAAA,GAAA,yCAAK,CAAC,CAAC,YAAY,GAAG,KAAK;YAC3B,IAAI,IAAI;YAER,wEAAwE;YACxE,MAAM,cAAc,CAAA,GAAA,yCAAa,EAAE,SAAS,KAAK,IAAI;YACrD,MAAM,aAAa,IAAI,oBAAoB,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG;YAC3D,WAAW,YAAY,CAAC,GAAG;YAC3B,WAAW,YAAY,CAAC,GAAG;YAC3B,IAAI,WAAW,GAAG;YAClB,IAAI,SAAS,GAAG;YAChB,IAAI,QAAQ,CAAC,CAAC,YAAY,CAAC,YAAY,aAAa,GAAG,aAAa;YAEpE,qEAAqE;YACrE,IAAI,QAAQ,KAAK;gBACf,MAAM,WAAW,IAAI,KAAK,KAAK,CAAC,QAAQ;gBACxC,IAAI,WAAW,GAAG,cAAc;gBAChC,IAAI,SAAS,GAAG,CAAA,GAAA,yCAAW,EAAE,CAAA,GAAA,yCAAiB,EAAE,gBAAgB,MAAM;gBACtE,IAAK,IAAI,IAAI,GAAG,IAAI,UAAU,IAAK;oBACjC,MAAM,KAAK,AAAC,CAAA,QAAQ,GAAE,IAAK,aAAa;oBACxC,MAAM,KAAK,AAAC,CAAA,QAAQ,GAAE,IAAK,aAAa;oBACxC,MAAM,KAAK,AAAC,CAAA,IAAI,QAAQ,CAAA,IAAK;oBAC7B,IAAI,SAAS;oBACb,IAAI,GAAG,CAAC,IAAI,IAAI,IAAI,GAAG,KAAK,EAAE,GAAG;oBACjC,IAAI,IAAI;gBACV;YACF;YAEA,IAAI,OAAO;YAEX,kEAAkE;YAClE,IAAI,IAAI;YACR,IAAI,SAAS,CAAC,SAAS;YACvB,IAAI,MAAM,CAAC,AAAC,iBAAiB,KAAK,EAAE,GAAI;YACxC,IAAI,WAAW,GAAG,OAAO,QAAQ;YACjC,IAAI,WAAW,GAAG,CAAA,GAAA,yCAAW,EAAE,CAAA,GAAA,yCAAiB,EAAE,gBAAgB,MAAM;YACxE,IAAI,SAAS,GAAG,AAAC,CAAA,MAAM,QAAQ,GAAE,IAAK;YACtC,IAAI,SAAS;YACb,CAAA,GAAA,yCAAK,CAAC,CAAC,YAAY,GAAG,KAAK,aAAa;YACxC,IAAI,MAAM;YACV,IAAI,OAAO;QACb;IACF;IAGA,kEAAkE;IAClE,MAAM,gBAAgB,IAAI,KAAK,KAAK,CAAC,QAAQ;IAC7C,MAAM,eAAe,KAAK,KAAK,CAAC,gBAAgB,UAAU,kBAAkB;IAE5E,IAAK,IAAI,IAAI,GAAG,IAAI,cAAc,IAAK;QACrC,IAAI,KAAK,QAAQ;QACjB,IAAI,KAAK,QAAQ;QACjB,MAAM,QAAQ,KAAK,KAAK,KAAK,CAAC,QAAQ;QACtC,MAAM,UAAU,AAAC,CAAA,IAAI,QAAQ,CAAA,IAAK;QAClC,MAAM,aAAa,AAAC,CAAA,IAAI,QAAQ,CAAA,IAAK;QAErC,4EAA4E;QAC5E,MAAM,iBAAiB,CAAA,GAAA,yCAAc,EAAE,CAAA,GAAA,yCAAiB,EAAE,gBAAgB,MAAM;QAChF,MAAM,eAAe,CAAA,GAAA,yCAAc,EAAE,CAAA,GAAA,yCAAiB,EAAE,gBAAgB,MAAM;QAC9E,MAAM,YAAY,OAAO,QAAQ;QAEjC,kDAAkD;QAClD,MAAM,eAAe,IAAI,QAAQ;QACjC,MAAM,gBAAgB,QAAQ,KAAK,EAAE,GAAG;QAExC,IAAI,QAAQ;QACZ,IAAI,QAAQ;QACZ,IAAK,IAAI,IAAI,GAAG,IAAI,OAAO,IAAK;YAC9B,MAAM,QAAQ,UAAU,IAAI,MAAM,AAAC,CAAA,QAAQ,GAAE,IAAK;YAClD,MAAM,KAAK,GAAG,CAAC,SAAS;YACxB,MAAM,KAAK,GAAG,CAAC,SAAS;YAExB,IAAI,KAAK,KAAK,KAAK,SAAS,KAAK,KAAK,KAAK,QAAQ;YAEnD,6CAA6C;YAC7C,IAAI,mCAAa,IAAI,IAAI,YAAY;gBACnC,QAAQ;gBACR,QAAQ;gBACR;YACF;YAEA,MAAM,IAAI,IAAI;YACd,mBAAmB;YACnB,MAAM,QAAQ,IAAI,IAAI;YACtB,MAAM,WAAW,MAAM,MAAM,KAAK,GAAG,CAAC,IAAI,eAAe,KAAK,EAAE,GAAG;YAEnE,IAAI,WAAW,GAAG,YAAY;YAC9B,iCAAiC;YACjC,MAAM,YAAY,IAAI,MAClB,CAAA,GAAA,yCAAW,EAAE,gBAAgB,MAAM,IAAI,OACvC,CAAA,GAAA,yCAAW,EAAE,cAAc,MAAM,AAAC,CAAA,IAAI,CAAA,IAAK;YAC/C,IAAI,WAAW,GAAG;YAClB,IAAI,SAAS,GAAG,aAAa,QAAQ;YACrC,IAAI,OAAO,GAAG;YAEd,IAAI,SAAS;YACb,IAAI,MAAM,CAAC,OAAO;YAClB,IAAI,MAAM,CAAC,IAAI;YACf,IAAI,MAAM;YAEV,kEAAkE;YAClE,IAAI,QAAQ,QAAQ,IAAI,KAAK,IAAI,QAAQ,IAAI;gBAC3C,MAAM,cAAc,QAAQ,AAAC,CAAA,QAAQ,MAAM,IAAI,EAAC,IAAM,CAAA,MAAM,QAAQ,GAAE;gBACtE,IAAI,KAAK;gBACT,IAAI,KAAK;gBACT,IAAI,SAAS;gBACb,IAAI,SAAS;gBACb,MAAM,cAAc,IAAI,KAAK,KAAK,CAAC,QAAQ;gBAC3C,MAAM,cAAc,aAAa,QAAQ;gBACzC,IAAK,IAAI,KAAK,GAAG,KAAK,aAAa,KAAM;oBACvC,MAAM,SAAS,cAAc,AAAC,CAAA,QAAQ,GAAE,IAAK;oBAC7C,MAAM,KAAK,GAAG,CAAC,UAAU,UAAU;oBACnC,MAAM,KAAK,GAAG,CAAC,UAAU,UAAU;oBACnC,IAAI,KAAK,KAAK,KAAK,SAAS,KAAK,KAAK,KAAK,QAAQ;oBACnD,MAAM,SAAS,IAAI,AAAC,KAAK,cAAe;oBACxC,IAAI,WAAW,GAAG,YAAY,QAAQ,SAAS;oBAC/C,IAAI,SAAS,GAAG,cAAc;oBAC9B,IAAI,SAAS;oBACb,IAAI,MAAM,CAAC,QAAQ;oBACnB,IAAI,MAAM,CAAC,IAAI;oBACf,IAAI,MAAM;oBACV,SAAS;oBACT,SAAS;gBACX;YACF;YAEA,QAAQ;YACR,QAAQ;QACV;IACF;IAEA,kEAAkE;IAClE,MAAM,mBAAmB;QAAC;QAAiB;QAAU;QAAa;KAAe;IACjF,MAAM,iBAAiB,iBAAiB,IAAI,CAAC,CAAA,IAAK,UAAU,IAAI,CAAC,QAAQ,CAAC,OAAO,QAAQ;IACzF,IAAI,kBAAkB,eAAe,MAAM,GAAG,GAAG;QAC/C,MAAM,cAAc,IAAI,KAAK,KAAK,CAAC,QAAQ;QAC3C,IAAI,OAAO,GAAG;QACd,IAAK,IAAI,IAAI,GAAG,IAAI,aAAa,IAAK;YACpC,sCAAsC;YACtC,MAAM,SAAS,cAAc,CAAC,KAAK,KAAK,CAAC,QAAQ,eAAe,MAAM,EAAE;YACxE,MAAM,aAAa,IAAI,KAAK,KAAK,CAAC,QAAQ;YAC1C,MAAM,YAAY,UAAU,OAAO,CAAC,EAAE,OAAO,CAAC;YAE9C,IAAK,IAAI,IAAI,GAAG,IAAI,YAAY,IAAK;gBACnC,MAAM,QAAQ,YAAY,AAAC,CAAA,QAAQ,GAAE,IAAK;gBAC1C,MAAM,UAAU,AAAC,CAAA,OAAO,IAAI,GAAG,MAAM,QAAQ,OAAO,IAAI,GAAG,GAAE,IAAK,cAAc;gBAChF,MAAM,YAAY,OAAO,IAAI,GAAG;gBAChC,MAAM,KAAK,OAAO,CAAC,GAAG,KAAK,GAAG,CAAC,SAAS;gBACxC,MAAM,KAAK,OAAO,CAAC,GAAG,KAAK,GAAG,CAAC,SAAS;gBACxC,MAAM,KAAK,KAAK,KAAK,GAAG,CAAC,SAAS;gBAClC,MAAM,KAAK,KAAK,KAAK,GAAG,CAAC,SAAS;gBAElC,IAAI,WAAW,GAAG,OAAO,QAAQ;gBACjC,IAAI,WAAW,GAAG,CAAA,GAAA,yCAAW,EAC3B,CAAA,GAAA,yCAAc,EAAE,CAAA,GAAA,yCAAiB,EAAE,gBAAgB,MAAM,QAAQ;gBAEnE,IAAI,SAAS,GAAG,AAAC,CAAA,MAAM,QAAQ,GAAE,IAAK;gBACtC,IAAI,SAAS;gBACb,IAAI,MAAM,CAAC,IAAI;gBACf,IAAI,MAAM,CAAC,IAAI;gBACf,IAAI,MAAM;YACZ;QACF;IACF;IAEA,oEAAoE;IACpE,IAAI,iBAAiB,QAAQ;QAC3B,MAAM,SAAS,IAAI,MAAM;QACzB,IAAI,IAAI;QACR,IAAI,iBAAiB,iBAAiB,iBAAiB,QAAQ;YAC7D,IAAI,IAAI;YACR,IAAI,SAAS,CAAC,OAAO;YACrB,IAAI,KAAK,CAAC,IAAI;YACd,IAAI,SAAS,CAAC,QAAQ,GAAG,GAAG,KAAK,IAAI,CAAC,KAAK,QAAQ,GAAG,GAAG,KAAK,IAAI,CAAC,KAAK;YACxE,IAAI,OAAO;QACb;QACA,IAAI,iBAAiB,iBAAiB,iBAAiB,QAAQ;YAC7D,IAAI,IAAI;YACR,IAAI,SAAS,CAAC,GAAG;YACjB,IAAI,KAAK,CAAC,GAAG;YACb,IAAI,SAAS,CAAC,QAAQ,GAAG,GAAG,OAAO,KAAK,IAAI,CAAC,KAAK,GAAG,GAAG,OAAO,KAAK,IAAI,CAAC;YACzE,IAAI,OAAO;QACb;QACA,IAAI,OAAO;IACb;IAGA,oEAAoE;IACpE,MAAM,WAAW,CAAA,GAAA,yCAAQ,EAAE,CAAA,GAAA,yCAAW,EAAE,SAAS;IACjD,MAAM,eAAe,KAAK,KAAK,CAAC,AAAC,QAAQ,SAAU;IACnD,IAAI;QACF,MAAM,YAAY,IAAI,YAAY,CAAC,GAAG,GAAG,OAAO;QAChD,MAAM,OAAO,UAAU,IAAI;QAC3B,MAAM,aAAa,KAAK,GAAG,CAAC,GAAG,KAAK,KAAK,CAAC;QAC1C,IAAK,IAAI,IAAI,GAAG,IAAI,cAAc,IAAK;YACrC,MAAM,KAAK,KAAK,KAAK,CAAC,aAAa;YACnC,MAAM,KAAK,KAAK,KAAK,CAAC,aAAa;YACnC,MAAM,aAAa,aAAa,MAAM,MAAM;YAC5C,MAAM,QAAQ,KAAK,KAAK,CAAC,AAAC,CAAA,OAAO,aAAa,IAAG,IAAK;YACtD,0CAA0C;YAC1C,IAAK,IAAI,KAAK,GAAG,KAAK,cAAc,KAAK,KAAK,QAAQ,KACpD,IAAK,IAAI,KAAK,GAAG,KAAK,cAAc,KAAK,KAAK,OAAO,KAAM;gBACzD,MAAM,MAAM,AAAC,CAAA,AAAC,CAAA,KAAK,EAAC,IAAK,QAAS,CAAA,KAAK,EAAC,CAAC,IAAK;gBAC9C,qDAAqD;gBACrD,MAAM,OAAO,QAAQ;gBACrB,MAAM,OAAO,IAAI;gBACjB,IAAI,CAAC,IAAI,GAAG,KAAK,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,OAAO,aAAa;gBACvD,IAAI,CAAC,MAAM,EAAE,GAAG,KAAK,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,OAAO,aAAa;gBAC/D,IAAI,CAAC,MAAM,EAAE,GAAG,KAAK,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,OAAO,aAAa;YAC/D,sBAAsB;YACxB;QAEJ;QACA,IAAI,YAAY,CAAC,WAAW,GAAG;IACjC,EAAE,OAAM;QACN,2FAA2F;QAC3F,IAAK,IAAI,IAAI,GAAG,IAAI,cAAc,IAAK;YACrC,MAAM,KAAK,aAAa;YACxB,MAAM,KAAK,aAAa;YACxB,MAAM,aAAa,aAAa,MAAM,MAAM;YAC5C,MAAM,QAAQ,OAAO,aAAa;YAClC,IAAI,WAAW,GAAG;YAClB,IAAI,SAAS,GAAG,CAAC,KAAK,EAAE,WAAW,CAAC,EAAE,WAAW,CAAC,EAAE,WAAW,GAAG,CAAC;YACnE,IAAI,QAAQ,CAAC,IAAI,IAAI,IAAI,aAAa,IAAI;QAC5C;IACF;IAEA,mEAAmE;IACnE,IAAI,WAAW,GAAG;IAClB,MAAM,mBAAmB,OAAO,QAAQ;IACxC,MAAM,UAAU,IAAI,oBAAoB,CAAC,IAAI,IAAI,KAAK,GAAG,CAAC,OAAO,UAAU,KAAK,IAAI,IAAI;IACxF,8EAA8E;IAC9E,MAAM,YAAY,QAAQ;IAC1B,MAAM,gBAAgB,YAClB,CAAC,cAAc,EAAE,iBAAiB,OAAO,CAAC,GAAG,CAAC,CAAC,CAAG,aAAa;OAC/D,CAAC,WAAW,EAAE,iBAAiB,OAAO,CAAC,GAAG,CAAC,CAAC,EAAO,eAAe;IACtE,QAAQ,YAAY,CAAC,GAAG;IACxB,QAAQ,YAAY,CAAC,KAAK;IAC1B,QAAQ,YAAY,CAAC,GAAG;IACxB,IAAI,SAAS,GAAG;IAChB,IAAI,QAAQ,CAAC,GAAG,GAAG,OAAO;IAE1B,oEAAoE;IACpE,IAAI,eAAe,MAAM,GAAG,GAAG;QAC7B,MAAM,YAAY,KAAK,KAAK,CAAC,AAAC,IAAK,CAAA,QAAQ,MAAK,IAAO;QACvD,MAAM,eAAe,KAAK,KAAK,CAAC,OAAO,UAAU,KAAK,6BAA6B;QACnF,IAAI,SAAS,GAAG,MAAM;QAEtB,IAAK,IAAI,IAAI,GAAG,IAAI,WAAW,IAAK;YAClC,MAAM,OAAO,KAAK,KAAK,CAAC,QAAQ,eAAe,MAAM;YACrD,MAAM,SACJ,IAAI,KAAK,KAAK,CAAC,QAAQ,KAAK,GAAG,CAAC,GAAG,eAAe,MAAM,GAAG;YAC7D,MAAM,OAAO,AAAC,CAAA,OAAO,MAAK,IAAK,eAAe,MAAM;YAEpD,MAAM,IAAI,cAAc,CAAC,KAAK;YAC9B,MAAM,IAAI,cAAc,CAAC,KAAK;YAE9B,MAAM,KAAK,EAAE,CAAC,GAAG,EAAE,CAAC;YACpB,MAAM,KAAK,EAAE,CAAC,GAAG,EAAE,CAAC;YACpB,MAAM,OAAO,KAAK,KAAK,CAAC,IAAI;YAE5B,0CAA0C;YAC1C,IAAI,OAAO,cAAc;YAEzB,MAAM,KAAK,AAAC,CAAA,EAAE,CAAC,GAAG,EAAE,CAAC,AAAD,IAAK;YACzB,MAAM,KAAK,AAAC,CAAA,EAAE,CAAC,GAAG,EAAE,CAAC,AAAD,IAAK;YACzB,MAAM,QAAQ,AAAC,CAAA,QAAQ,GAAE,IAAK,OAAO;YAErC,MAAM,MAAM,KAAK,AAAC,CAAC,KAAM,CAAA,QAAQ,CAAA,IAAM;YACvC,MAAM,MAAM,KAAK,AAAC,KAAM,CAAA,QAAQ,CAAA,IAAM;YAEtC,IAAI,WAAW,GAAG,OAAO,QAAQ;YACjC,IAAI,WAAW,GAAG,CAAA,GAAA,yCAAW,EAC3B,CAAA,GAAA,yCAAc,EAAE,CAAA,GAAA,yCAAiB,EAAE,gBAAgB,MAAM,QACzD;YAGF,IAAI,SAAS;YACb,IAAI,MAAM,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YACnB,IAAI,gBAAgB,CAAC,KAAK,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;YACvC,IAAI,MAAM;QACZ;IACF;IAEA,kEAAkE;IAElE,2DAA2D;IAC3D,uDAAuD;IACvD,IAAI,WAAW,GAAG,WAAW,SAAS,GAAG;IACzC,IAAI,wBAAwB,GAAG;IAC/B,MAAM,WAAW,CAAC,IAAI,EAAE,KAAK,KAAK,CAAC,WAAW,GAAG,EAAE,WAAW,CAAC;IAC/D,IAAI,SAAS,GAAG;IAChB,IAAI,QAAQ,CAAC,GAAG,GAAG,OAAO;IAC1B,IAAI,wBAAwB,GAAG;IAE/B,iEAAiE;IACjE,+DAA+D;IAC/D,MAAM,mBAAmB;QAAC;QAAa;QAAU;KAAW;IAC5D,IAAI,iBAAiB,QAAQ,CAAC,UAAU,IAAI,GAAG;QAC7C,MAAM,eAAe,KAAK,IAAI,CAAC,IAAI;QACnC,MAAM,SAAS,IAAI,MAAM;QACzB,6BAA6B;QAC7B,IAAI,WAAW,GAAG;QAClB,IAAI,wBAAwB,GAAG;QAC/B,IAAI,SAAS,CAAC,QAAQ,cAAc,GAAG,OAAO,QAAQ,GAAG,GAAG,OAAO;QACnE,8BAA8B;QAC9B,IAAI,SAAS,CAAC,QAAQ,CAAC,cAAc,GAAG,OAAO,QAAQ,GAAG,GAAG,OAAO;QACpE,IAAI,wBAAwB,GAAG;IACjC;IAEA,oEAAoE;IACpE,MAAM,kBAAkB;QAAC;QAAa;KAAS;IAC/C,IAAI,gBAAgB,QAAQ,CAAC,UAAU,IAAI,GAAG;QAC5C,MAAM,SAAS,IAAI,MAAM;QACzB,IAAI,WAAW,GAAG;QAClB,IAAI,wBAAwB,GAAG;QAC/B,2DAA2D;QAC3D,IAAI,IAAI;QACR,IAAI,UAAU,GAAG,KAAK;QACtB,IAAI,WAAW,GAAG;QAClB,IAAI,SAAS,CAAC,QAAQ,GAAG,GAAG,OAAO;QACnC,IAAI,OAAO;QACX,IAAI,wBAAwB,GAAG;IACjC;IAEA,iEAAiE;IACjE,wEAAwE;IACxE,IAAI,QAAQ,MAAM;QAChB,MAAM,SAAS,eAAe,QAAQ;QACtC,MAAM,UAAU,eAAe,MAAM;QACrC,IAAI,WAAW,GAAG,OAAO,QAAQ,MAAM,qBAAqB;QAC5D,IAAI,wBAAwB,GAAG;QAC/B,wEAAwE;QACxE,MAAM,SAAS,IAAI,oBAAoB,CAAC,GAAG,GAAG,GAAG;QACjD,OAAO,YAAY,CAAC,GAAG;QACvB,OAAO,YAAY,CAAC,GAAG;QACvB,IAAI,SAAS,GAAG;QAChB,IAAI,QAAQ,CAAC,GAAG,GAAG,OAAO;QAC1B,IAAI,wBAAwB,GAAG;IACjC;IAEA,qEAAqE;IACrE;QACE,IAAI,IAAI;QACR,IAAI,WAAW,GAAG;QAClB,IAAI,wBAAwB,GAAG;QAC/B,MAAM,YAAY,CAAA,GAAA,yCAAQ,EAAE,CAAA,GAAA,yCAAW,EAAE,SAAS;QAClD,MAAM,YAAY,KAAK,GAAG,CAAC,OAAO,UAAU;QAC5C,MAAM,cAAc,CAAA,GAAA,yCAAW,EAAE,eAAe,MAAM,EAAE;QACxD,MAAM,mBAAmB,eAAe,MAAM;QAC9C,MAAM,WAAW,UAAU,IAAI;QAE/B,IAAI,SAAS,QAAQ,CAAC,gBAAgB,SAAS,QAAQ,CAAC,aAAa,SAAS,QAAQ,CAAC,cAAc;YACnG,0CAA0C;YAC1C,IAAI,WAAW,GAAG;YAClB,IAAI,SAAS,GAAG,KAAK,GAAG,CAAC,GAAG,MAAM;YAClC,IAAI,WAAW,GAAG,OAAO,cAAc;YAEvC,aAAa;YACb,IAAI,UAAU,CAAC,WAAW,WAAW,QAAQ,YAAY,GAAG,SAAS,YAAY;YACjF,+BAA+B;YAC/B,MAAM,WAAW,YAAY;YAC7B,IAAI,SAAS,GAAG,KAAK,GAAG,CAAC,KAAK,MAAM;YACpC,IAAI,WAAW,IAAI;YACnB,IAAI,UAAU,CAAC,UAAU,UAAU,QAAQ,WAAW,GAAG,SAAS,WAAW;YAE7E,kDAAkD;YAClD,MAAM,UAAU,YAAY;YAC5B,IAAI,SAAS,GAAG,CAAA,GAAA,yCAAW,EAAE,kBAAkB;YAC/C,MAAM,UAAU;gBACd;oBAAC;oBAAW;iBAAU;gBACtB;oBAAC,QAAQ,YAAY;oBAAS;iBAAU;gBACxC;oBAAC;oBAAW,SAAS,YAAY;iBAAQ;gBACzC;oBAAC,QAAQ,YAAY;oBAAS,SAAS,YAAY;iBAAQ;aAC5D;YACD,KAAK,MAAM,CAAC,KAAK,IAAI,IAAI,QAAS;gBAChC,IAAI,QAAQ,CAAC,KAAK,KAAK,SAAS;gBAChC,iCAAiC;gBACjC,IAAI,SAAS;gBACb,IAAI,MAAM,CAAC,KAAK;gBAChB,IAAI,MAAM,CAAC,MAAM,SAAS,MAAM;gBAChC,IAAI,MAAM,CAAC,MAAM,SAAS;gBAC1B,IAAI,MAAM,CAAC,KAAK,MAAM;gBACtB,IAAI,MAAM;YACZ;QACF,OAAO,IAAI,SAAS,QAAQ,CAAC,gBAAgB,SAAS,QAAQ,CAAC,cAAc,SAAS,QAAQ,CAAC,eAAe;YAC5G,oDAAoD;YACpD,IAAI,WAAW,GAAG,CAAA,GAAA,yCAAW,EAAE,eAAe,SAAS,EAAE;YACzD,IAAI,SAAS,GAAG,KAAK,GAAG,CAAC,KAAK,MAAM;YACpC,IAAI,WAAW,GAAG,OAAO,cAAc;YACvC,IAAI,OAAO,GAAG;YAEd,MAAM,eAAe,IAAI,KAAK,KAAK,CAAC,cAAc;YAClD,IAAK,IAAI,IAAI,GAAG,IAAI,cAAc,IAAK;gBACrC,iCAAiC;gBACjC,MAAM,OAAO,KAAK,KAAK,CAAC,cAAc;gBACtC,IAAI,IAAY;gBAChB,IAAI,SAAS,GAAG;oBAAE,KAAK,cAAc;oBAAO,KAAK;gBAAW,OACvD,IAAI,SAAS,GAAG;oBAAE,KAAK,cAAc;oBAAO,KAAK,SAAS;gBAAW,OACrE,IAAI,SAAS,GAAG;oBAAE,KAAK;oBAAW,KAAK,cAAc;gBAAQ,OAC7D;oBAAE,KAAK,QAAQ;oBAAW,KAAK,cAAc;gBAAQ;gBAE1D,IAAI,SAAS;gBACb,IAAI,MAAM,CAAC,IAAI;gBACf,MAAM,OAAO,IAAI,KAAK,KAAK,CAAC,cAAc;gBAC1C,IAAK,IAAI,IAAI,GAAG,IAAI,MAAM,IAAK;oBAC7B,MAAM,SAAS,YAAa,CAAA,IAAI,cAAc,CAAA;oBAC9C,wBAAwB;oBACxB,MAAM,OAAO,KAAK,AAAC,CAAA,cAAc,GAAE,IAAK,YAAY;oBACpD,MAAM,OAAO,KAAM,CAAA,OAAO,IAAK,SAAS,IAAI,SAAS,CAAC,SAAU,CAAA;oBAChE,MAAM,OAAO,KAAM,CAAA,QAAQ,IAAK,SAAS,IAAI,SAAS,CAAC,SAAU,AAAC,CAAA,cAAc,GAAE,IAAK,YAAY,CAAA;oBACnG,MAAM,OAAO,KAAK,AAAC,CAAA,cAAc,GAAE,IAAK,YAAY;oBACpD,KAAK;oBACL,KAAK;oBACL,IAAI,gBAAgB,CAAC,MAAM,MAAM,IAAI;gBACvC;gBACA,IAAI,MAAM;gBAEV,gCAAgC;gBAChC,IAAI,cAAc,KAAK;oBACrB,IAAI,SAAS;oBACb,IAAI,GAAG,CAAC,IAAI,IAAI,YAAa,CAAA,OAAO,cAAc,GAAE,GAAI,GAAG,KAAK,EAAE,GAAG;oBACrE,IAAI,SAAS,GAAG,CAAA,GAAA,yCAAW,EAAE,eAAe,SAAS,EAAE;oBACvD,IAAI,IAAI;gBACV;YACF;QACF,OAAO,IAAI,SAAS,QAAQ,CAAC,gBAAgB,SAAS,QAAQ,CAAC,aAAa,SAAS,QAAQ,CAAC,SAAS;YACrG,gCAAgC;YAChC,IAAI,WAAW,GAAG,MAAM,cAAc;YACtC,IAAI,SAAS,GAAG,CAAA,GAAA,yCAAW,EAAE,eAAe,MAAM,EAAE;YACpD,IAAI,WAAW,GAAG,CAAA,GAAA,yCAAW,EAAE,eAAe,MAAM,EAAE;YACtD,IAAI,SAAS,GAAG,KAAK,GAAG,CAAC,KAAK,MAAM;YAEpC,kCAAkC;YAClC,IAAI,SAAS;YACb,IAAI,GAAG,CAAC,IAAI,CAAC,SAAS,KAAK,SAAS,KAAK,KAAK,KAAK,EAAE,GAAG;YACxD,IAAI,MAAM;YACV,IAAI,SAAS;YACb,IAAI,GAAG,CAAC,IAAI,SAAS,KAAK,SAAS,KAAK,KAAK,EAAE,GAAG,KAAK;YACvD,IAAI,MAAM;YAEV,8CAA8C;YAC9C,MAAM,YAAY,KAAK,KAAK,KAAK,CAAC,cAAc;YAChD,IAAK,IAAI,IAAI,GAAG,IAAI,WAAW,IAAK;gBAClC,MAAM,OAAO,KAAK,KAAK,CAAC,cAAc;gBACtC,IAAI,IAAY;gBAChB,IAAI,SAAS,GAAG;oBAAE,KAAK,cAAc;oBAAO,KAAK,YAAa,CAAA,MAAM,WAAU;gBAAI,OAC7E,IAAI,SAAS,GAAG;oBAAE,KAAK,cAAc;oBAAO,KAAK,SAAS,YAAa,CAAA,MAAM,WAAU;gBAAI,OAC3F,IAAI,SAAS,GAAG;oBAAE,KAAK,YAAa,CAAA,MAAM,WAAU;oBAAI,KAAK,cAAc;gBAAQ,OACnF;oBAAE,KAAK,QAAQ,YAAa,CAAA,MAAM,WAAU;oBAAI,KAAK,cAAc;gBAAQ;gBAEhF,MAAM,QAAQ,AAAC,CAAA,IAAI,cAAc,GAAE,IAAK;gBACxC,eAAe;gBACf,IAAI,SAAS;gBACb,IAAK,IAAI,IAAI,GAAG,IAAI,GAAG,IAAK;oBAC1B,MAAM,IAAI,AAAC,IAAI,IAAK,KAAK,EAAE,GAAG;oBAC9B,MAAM,IAAI,IAAI,MAAM,IAAI,QAAQ,QAAQ;oBACxC,MAAM,MAAM,KAAK,KAAK,GAAG,CAAC,KAAK;oBAC/B,MAAM,MAAM,KAAK,KAAK,GAAG,CAAC,KAAK;oBAC/B,IAAI,MAAM,GAAG,IAAI,MAAM,CAAC,KAAK;yBACxB,IAAI,MAAM,CAAC,KAAK;gBACvB;gBACA,IAAI,SAAS;gBACb,IAAI,IAAI;YACV;QACF,OAAO,IAAI,SAAS,QAAQ,CAAC,cAAc,SAAS,QAAQ,CAAC,iBAAiB,SAAS,QAAQ,CAAC,YAAY;YAC1G,0CAA0C;YAC1C,IAAI,WAAW,GAAG,CAAA,GAAA,yCAAW,EAAE,eAAe,QAAQ,EAAE;YACxD,IAAI,SAAS,GAAG,KAAK,GAAG,CAAC,KAAK,MAAM;YACpC,IAAI,WAAW,GAAG,MAAM,cAAc;YACtC,IAAI,UAAU,CAAC,YAAY,KAAK,YAAY,KAAK,QAAQ,YAAY,GAAG,SAAS,YAAY;QAC/F;QACA,wEAAwE;QAExE,IAAI,OAAO;IACb;IAEA,kEAAkE;IAClE;QACE,MAAM,SAAS,CAAA,GAAA,yCAAQ,EAAE,CAAA,GAAA,yCAAW,EAAE,SAAS;QAC/C,MAAM,UAAU,KAAK,GAAG,CAAC,OAAO,UAAU;QAC1C,MAAM,YAAY,UAAU;QAE5B,gDAAgD;QAChD,MAAM,mBAAmB;YACvB;gBAAE,GAAG;gBAAW,GAAG;YAAU;YAC7B;gBAAE,GAAG,QAAQ;gBAAW,GAAG;YAAU;YACrC;gBAAE,GAAG;gBAAW,GAAG,SAAS;YAAU;YACtC;gBAAE,GAAG,QAAQ;gBAAW,GAAG,SAAS;YAAU;SAC/C;QACD,IAAI,aAAa,gBAAgB,CAAC,EAAE,EAAE,wBAAwB;QAC9D,IAAI,aAAa;QACjB,KAAK,MAAM,UAAU,iBAAkB;YACrC,MAAM,UAAU,YAAY,SAAS,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC,EAAE,UAAU;YACpE,IAAI,UAAU,YAAY;gBACxB,aAAa;gBACb,aAAa;YACf;QACF;QAEA,MAAM,OAAO,WAAW,CAAC;QACzB,MAAM,OAAO,WAAW,CAAC;QACzB,MAAM,cAAc,IAAI,KAAK,KAAK,CAAC,WAAW,IAAI,eAAe;QACjE,MAAM,WAAW,CAAA,GAAA,yCAAW,EAAE,eAAe,MAAM,EAAE;QAErD,IAAI,IAAI;QACR,IAAI,WAAW,GAAG,OAAO,WAAW;QACpC,IAAI,SAAS,CAAC,MAAM;QACpB,IAAI,WAAW,GAAG;QAClB,IAAI,SAAS,GAAG,CAAA,GAAA,yCAAW,EAAE,eAAe,QAAQ,EAAE;QACtD,IAAI,SAAS,GAAG,KAAK,GAAG,CAAC,KAAK,MAAM;QAEpC,aAAa;QACb,IAAI,SAAS;QACb,IAAI,GAAG,CAAC,GAAG,GAAG,SAAS,GAAG,KAAK,EAAE,GAAG;QACpC,IAAI,MAAM;QACV,IAAI,IAAI;QAER,4CAA4C;QAC5C,IAAI,SAAS;QACb,IAAK,IAAI,IAAI,GAAG,IAAI,aAAa,IAAK;YACpC,MAAM,SAAS,WAAW,KAAK,EAAE,GAAG;YACpC,MAAM,SAAS,WAAW,KAAK,EAAE,GAAG;YACpC,MAAM,KAAK,UAAW,CAAA,MAAM,WAAW,GAAE;YACzC,MAAM,KAAK,UAAW,CAAA,MAAM,WAAW,GAAE;YACzC,IAAI,MAAM,CAAC,KAAK,GAAG,CAAC,UAAU,IAAI,KAAK,GAAG,CAAC,UAAU;YACrD,IAAI,MAAM,CAAC,KAAK,GAAG,CAAC,UAAU,IAAI,KAAK,GAAG,CAAC,UAAU;QACvD;QACA,IAAI,MAAM;QAEV,aAAa;QACb,IAAI,SAAS;QACb,IAAI,GAAG,CAAC,GAAG,GAAG,UAAU,MAAM,GAAG,KAAK,EAAE,GAAG;QAC3C,IAAI,SAAS,GAAG;QAChB,IAAI,IAAI;QAER,IAAI,OAAO;IACb;IAEA,IAAI,WAAW,GAAG;AAEpB;;;;;ADluDA;;;;;;;;;CASC,GACD,SAAS,0CACP,OAAe,EACf,SAAoC,CAAC,CAAC;IAEtC,MAAM,cAAgC;QAAE,GAAG,CAAA,GAAA,yCAAa,CAAC;QAAE,GAAG,MAAM;IAAC;IACrE,MAAM,SAAE,KAAK,UAAE,MAAM,EAAE,GAAG;IAE1B,MAAM,SAAS,CAAA,GAAA,gCAAW,EAAE,OAAO;IACnC,MAAM,MAAM,OAAO,UAAU,CAAC;IAE9B,CAAA,GAAA,yCAAY,EAAE,KAAK,SAAS;IAE5B,OAAO,OAAO,QAAQ,CAAC;AACzB;AAEA;;;;;;;;;;CAUC,GACD,SAAS,0CACP,WAAmB,EACnB,SAAiB,EACjB,OAAe,EACf,QAAQ,EAAE,EACV,KAAa,EACb,MAAc;IAEd,IAAI,CAAC,qBAAc,YACjB,oBAAa,WAAW;QAAE,WAAW;IAAK;IAG5C,MAAM,WAAW,QACb,CAAC,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,EAAE,OAAO,CAAC,EAAE,QAAQ,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,GACxD,CAAC,EAAE,QAAQ,KAAK,CAAC,GAAG,GAAG,CAAC,EAAE,MAAM,CAAC,EAAE,OAAO,IAAI,CAAC;IAEnD,MAAM,aAAa,iBAAU,WAAW;IACxC,wBAAiB,YAAY;IAC7B,QAAQ,GAAG,CAAC,CAAC,WAAW,EAAE,WAAW,CAAC;IAEtC,OAAO;AACT","sources":["src/index.ts","src/lib/render.ts","src/lib/canvas/colors.ts","global.d.ts","src/lib/utils.ts","src/lib/canvas/draw.ts","src/lib/canvas/shapes/index.ts","src/lib/canvas/shapes/basic.ts","src/lib/canvas/shapes/complex.ts","src/lib/constants.ts","src/lib/canvas/shapes/utils.ts","src/lib/canvas/shapes/sacred.ts","src/lib/canvas/shapes/procedural.ts","src/lib/canvas/shapes/affinity.ts","src/types.ts","src/lib/archetypes.ts"],"sourcesContent":["import { createCanvas } from \"@napi-rs/canvas\";\nimport * as fs from \"fs\";\nimport * as path from \"path\";\nimport { renderHashArt } from \"./lib/render\";\nimport type { GenerationConfig } from \"./types\";\nimport { DEFAULT_CONFIG } from \"./types\";\n\n/**\n * Generate an abstract art PNG buffer from a git hash (Node.js only).\n *\n * Uses @napi-rs/canvas under the hood to create an off-screen canvas,\n * renders the hash-derived art, and returns the result as a PNG Buffer.\n *\n * @param gitHash - Hex hash string used as the deterministic seed\n * @param config - Partial generation config (merged with defaults)\n * @returns PNG buffer of the generated image\n */\nfunction generateImageFromHash(\n gitHash: string,\n config: Partial<GenerationConfig> = {},\n): Buffer {\n const finalConfig: GenerationConfig = { ...DEFAULT_CONFIG, ...config };\n const { width, height } = finalConfig;\n\n const canvas = createCanvas(width, height);\n const ctx = canvas.getContext(\"2d\") as unknown as CanvasRenderingContext2D;\n\n renderHashArt(ctx, gitHash, finalConfig);\n\n return canvas.toBuffer(\"image/png\");\n}\n\n/**\n * Save the generated image to a file (Node.js only).\n *\n * @param imageBuffer - The PNG buffer of the generated image\n * @param outputDir - The directory to save the image\n * @param gitHash - The git hash used to generate the image\n * @param label - Optional label for the output filename\n * @param width - The width of the generated image\n * @param height - The height of the generated image\n * @returns Path to the saved image\n */\nfunction saveImageToFile(\n imageBuffer: Buffer,\n outputDir: string,\n gitHash: string,\n label = \"\",\n width: number,\n height: number,\n): string {\n if (!fs.existsSync(outputDir)) {\n fs.mkdirSync(outputDir, { recursive: true });\n }\n\n const filename = label\n ? `${label}-${width}x${height}-${gitHash.slice(0, 8)}.png`\n : `${gitHash.slice(0, 8)}-${width}x${height}.png`;\n\n const outputPath = path.join(outputDir, filename);\n fs.writeFileSync(outputPath, imageBuffer);\n console.log(`Generated: ${outputPath}`);\n\n return outputPath;\n}\n\nexport { generateImageFromHash, saveImageToFile, renderHashArt };\nexport { PRESETS } from \"./lib/constants\";\nexport type { GenerationConfig } from \"./types\";\nexport { DEFAULT_CONFIG } from \"./types\";\n","/**\n * Pure rendering logic — environment-agnostic.\n *\n * Uses only the standard CanvasRenderingContext2D API so it works\n * identically in Node (@napi-rs/canvas) and browsers.\n *\n * Generation pipeline:\n * 0. Archetype selection + shape palette + color hierarchy\n * 1. Background — style from archetype, gradient mesh for depth\n * 1b. Layered background — archetype-coherent shapes\n * 2. Composition mode + symmetry\n * 3. Focal points + void zones + hero avoidance field\n * 4. Flow field\n * 4b. Hero shape\n * 5. Shape layers — palette-driven selection, affinity-aware styles,\n * size echo, tangent placement, atmospheric depth\n * 5b. Recursive nesting\n * 6. Flow lines — variable color, branching, pressure simulation\n * 6b. Symmetry mirroring\n * 7. Noise texture\n * 8. Vignette\n * 9. Organic connecting curves\n * 10. Post-processing — color grading, chromatic aberration, bloom\n */\nimport {\n SacredColorScheme,\n hexWithAlpha, jitterColorHSL,\n desaturate,\n shiftTemperature,\n luminance,\n enforceContrast,\n buildColorHierarchy,\n pickHierarchyColor, pickColorGrade,\n evolveHierarchy, type ColorHierarchy\n} from \"./canvas/colors\";\nimport {\n enhanceShapeGeneration,\n drawMirroredShape,\n pickMirrorAxis,\n pickBlendMode,\n pickRenderStyle,\n type RenderStyle\n} from \"./canvas/draw\";\nimport { shapes } from \"./canvas/shapes\";\nimport {\n buildShapePalette,\n pickShapeFromPalette,\n pickStyleForShape,\n SHAPE_PROFILES\n} from \"./canvas/shapes/affinity\";\nimport { createRng, seedFromHash, createSimplexNoise, createFBM } from \"./utils\";\nimport { DEFAULT_CONFIG, type GenerationConfig } from \"../types\";\nimport { selectArchetype, type BackgroundStyle, type CompositionMode } from \"./archetypes\";\n\n\n// ── Shape categories for weighted selection (legacy fallback) ───────\n\nconst SACRED_SHAPES = [\n \"mandala\",\n \"flowerOfLife\",\n \"treeOfLife\",\n \"metatronsCube\",\n \"sriYantra\",\n \"seedOfLife\",\n \"vesicaPiscis\",\n \"torus\",\n \"eggOfLife\",\n];\n\n// ── Composition modes ───────────────────────────────────────────────\n\nconst ALL_COMPOSITION_MODES: CompositionMode[] = [\n \"radial\",\n \"flow-field\",\n \"spiral\",\n \"grid-subdivision\",\n \"clustered\",\n \"golden-spiral\",\n];\n\n// ── Helper: get position based on composition mode ──────────────────\n\nfunction getCompositionPosition(\n mode: CompositionMode,\n rng: () => number,\n width: number,\n height: number,\n shapeIndex: number,\n totalShapes: number,\n cx: number,\n cy: number,\n): { x: number; y: number } {\n switch (mode) {\n case \"radial\": {\n const angle = rng() * Math.PI * 2;\n const maxR = Math.min(width, height) * 0.45;\n const r = Math.pow(rng(), 0.7) * maxR;\n return { x: cx + Math.cos(angle) * r, y: cy + Math.sin(angle) * r };\n }\n case \"spiral\": {\n const t = shapeIndex / totalShapes;\n const turns = 3 + rng() * 2;\n const angle = t * Math.PI * 2 * turns;\n const maxR = Math.min(width, height) * 0.42;\n const r = t * maxR + (rng() - 0.5) * maxR * 0.15;\n return { x: cx + Math.cos(angle) * r, y: cy + Math.sin(angle) * r };\n }\n case \"grid-subdivision\": {\n const cells = 3 + Math.floor(rng() * 3);\n const cellW = width / cells;\n const cellH = height / cells;\n const gx = Math.floor(rng() * cells);\n const gy = Math.floor(rng() * cells);\n return {\n x: gx * cellW + rng() * cellW,\n y: gy * cellH + rng() * cellH,\n };\n }\n case \"clustered\": {\n const numClusters = 3 + Math.floor(rng() * 3);\n const ci = Math.floor(rng() * numClusters);\n const clusterRng = createRng(seedFromHash(String(ci), 999));\n const clx = width * (0.15 + clusterRng() * 0.7);\n const cly = height * (0.15 + clusterRng() * 0.7);\n const spread = Math.min(width, height) * 0.18;\n return {\n x: clx + (rng() - 0.5) * spread * 2,\n y: cly + (rng() - 0.5) * spread * 2,\n };\n }\n case \"flow-field\":\n default: {\n return { x: rng() * width, y: rng() * height };\n }\n case \"golden-spiral\": {\n // Logarithmic spiral: r = a * e^(b*theta), with golden angle spacing\n const PHI = (1 + Math.sqrt(5)) / 2;\n const goldenAngle = 2 * Math.PI / (PHI * PHI); // ~137.5° in radians\n const t = shapeIndex / totalShapes;\n const angle = shapeIndex * goldenAngle + rng() * 0.3;\n const maxR = Math.min(width, height) * 0.44;\n // Shapes spiral outward with sqrt distribution for even area coverage\n const r = Math.sqrt(t) * maxR + (rng() - 0.5) * maxR * 0.08;\n return { x: cx + Math.cos(angle) * r, y: cy + Math.sin(angle) * r };\n }\n }\n}\n\n// ── Helper: positional color from hierarchy ─────────────────────────\n\nfunction getPositionalColor(\n x: number,\n y: number,\n width: number,\n height: number,\n hierarchy: ColorHierarchy,\n rng: () => number,\n): string {\n // Blend position into color selection — shapes near center lean dominant\n const distFromCenter = Math.hypot(x - width / 2, y - height / 2) /\n Math.hypot(width / 2, height / 2);\n // Center = more dominant, edges = more accent\n if (distFromCenter < 0.35) {\n return jitterColorHSL(hierarchy.dominant, rng, 10, 0.08);\n } else if (distFromCenter < 0.7) {\n return jitterColorHSL(pickHierarchyColor(hierarchy, rng), rng, 8, 0.06);\n } else {\n // Edges: bias toward secondary/accent\n const roll = rng();\n const color = roll < 0.4 ? hierarchy.secondary : roll < 0.75 ? hierarchy.accent : hierarchy.dominant;\n return jitterColorHSL(color, rng, 12, 0.08);\n }\n}\n\n// ── Helper: check if a position is inside a void zone ───────────────\n\nfunction isInVoidZone(\n x: number,\n y: number,\n voidZones: Array<{ x: number; y: number; radius: number }>,\n): boolean {\n for (const zone of voidZones) {\n if (Math.hypot(x - zone.x, y - zone.y) < zone.radius) return true;\n }\n return false;\n}\n\n// ── Spatial hash grid for O(1) density checks and nearest-neighbor ──\n\nclass SpatialGrid {\n private cells: Map<string, Array<{ x: number; y: number; size: number; shape: string }>>;\n private cellSize: number;\n\n constructor(cellSize: number) {\n this.cells = new Map();\n this.cellSize = cellSize;\n }\n\n private key(cx: number, cy: number): string {\n return `${cx},${cy}`;\n }\n\n insert(item: { x: number; y: number; size: number; shape: string }): void {\n const cx = Math.floor(item.x / this.cellSize);\n const cy = Math.floor(item.y / this.cellSize);\n const k = this.key(cx, cy);\n const cell = this.cells.get(k);\n if (cell) cell.push(item);\n else this.cells.set(k, [item]);\n }\n\n /** Count items within radius of (x, y) */\n countNear(x: number, y: number, radius: number): number {\n const r2 = radius * radius;\n const minCx = Math.floor((x - radius) / this.cellSize);\n const maxCx = Math.floor((x + radius) / this.cellSize);\n const minCy = Math.floor((y - radius) / this.cellSize);\n const maxCy = Math.floor((y + radius) / this.cellSize);\n let count = 0;\n for (let cx = minCx; cx <= maxCx; cx++) {\n for (let cy = minCy; cy <= maxCy; cy++) {\n const cell = this.cells.get(this.key(cx, cy));\n if (!cell) continue;\n for (const p of cell) {\n const dx = x - p.x;\n const dy = y - p.y;\n if (dx * dx + dy * dy < r2) count++;\n }\n }\n }\n return count;\n }\n\n /** Find nearest item to (x, y) */\n findNearest(x: number, y: number, searchRadius: number): { x: number; y: number; size: number } | null {\n const minCx = Math.floor((x - searchRadius) / this.cellSize);\n const maxCx = Math.floor((x + searchRadius) / this.cellSize);\n const minCy = Math.floor((y - searchRadius) / this.cellSize);\n const maxCy = Math.floor((y + searchRadius) / this.cellSize);\n let nearest: { x: number; y: number; size: number } | null = null;\n let bestDist2 = Infinity;\n for (let cx = minCx; cx <= maxCx; cx++) {\n for (let cy = minCy; cy <= maxCy; cy++) {\n const cell = this.cells.get(this.key(cx, cy));\n if (!cell) continue;\n for (const p of cell) {\n const dx = x - p.x;\n const dy = y - p.y;\n const d2 = dx * dx + dy * dy;\n if (d2 > 0 && d2 < bestDist2) {\n bestDist2 = d2;\n nearest = p;\n }\n }\n }\n }\n return nearest;\n }\n}\n\n// ── Helper: density check (legacy wrapper) ──────────────────────────\n\nfunction localDensity(\n x: number,\n y: number,\n positions: Array<{ x: number; y: number; size: number }>,\n radius: number,\n): number {\n let count = 0;\n for (const p of positions) {\n if (Math.hypot(x - p.x, y - p.y) < radius) count++;\n }\n return count;\n}\n\n// ── Helper: draw background based on archetype style ────────────────\n\nfunction drawBackground(\n ctx: CanvasRenderingContext2D,\n style: BackgroundStyle,\n bgStart: string,\n bgEnd: string,\n width: number,\n height: number,\n cx: number,\n cy: number,\n bgRadius: number,\n rng: () => number,\n colors: string[],\n): void {\n switch (style) {\n case \"radial-light\": {\n const grad = ctx.createRadialGradient(cx, cy, 0, cx, cy, bgRadius);\n grad.addColorStop(0, \"#f0ece4\");\n grad.addColorStop(1, bgStart);\n ctx.fillStyle = grad;\n ctx.fillRect(0, 0, width, height);\n break;\n }\n case \"linear-horizontal\": {\n const grad = ctx.createLinearGradient(0, 0, width, 0);\n grad.addColorStop(0, bgStart);\n grad.addColorStop(1, bgEnd);\n ctx.fillStyle = grad;\n ctx.fillRect(0, 0, width, height);\n break;\n }\n case \"linear-diagonal\": {\n const grad = ctx.createLinearGradient(0, 0, width, height);\n grad.addColorStop(0, bgStart);\n grad.addColorStop(0.5, bgEnd);\n grad.addColorStop(1, bgStart);\n ctx.fillStyle = grad;\n ctx.fillRect(0, 0, width, height);\n break;\n }\n case \"solid-dark\": {\n ctx.fillStyle = bgStart;\n ctx.fillRect(0, 0, width, height);\n break;\n }\n case \"solid-light\": {\n ctx.fillStyle = \"#f5f2eb\";\n ctx.fillRect(0, 0, width, height);\n break;\n }\n case \"multi-stop\": {\n const grad = ctx.createLinearGradient(0, 0, width * 0.7, height);\n grad.addColorStop(0, bgStart);\n grad.addColorStop(0.33, bgEnd);\n if (colors.length > 0) {\n const midColor = hexWithAlpha(colors[0], 1).replace(/rgba\\((\\d+),(\\d+),(\\d+),[^)]+\\)/, (_, r, g, b) => {\n const darken = (v: string) => Math.round(parseInt(v) * 0.4).toString(16).padStart(2, \"0\");\n return `#${darken(r)}${darken(g)}${darken(b)}`;\n });\n grad.addColorStop(0.66, midColor);\n }\n grad.addColorStop(1, bgStart);\n ctx.fillStyle = grad;\n ctx.fillRect(0, 0, width, height);\n break;\n }\n case \"radial-dark\":\n default: {\n const grad = ctx.createRadialGradient(cx, cy, 0, cx, cy, bgRadius);\n grad.addColorStop(0, bgStart);\n grad.addColorStop(1, bgEnd);\n ctx.fillStyle = grad;\n ctx.fillRect(0, 0, width, height);\n break;\n }\n }\n}\n\n// ── Shape constellations — pre-composed groups of shapes ────────\n\ninterface ConstellationDef {\n name: string;\n /** Generate member positions/shapes relative to center */\n build: (rng: () => number, baseSize: number) => Array<{\n dx: number; dy: number; shape: string; size: number; rotation: number;\n }>;\n}\n\nconst CONSTELLATIONS: ConstellationDef[] = [\n {\n name: \"flanked-triangle\",\n build: (rng, baseSize) => {\n const gap = baseSize * (0.6 + rng() * 0.3);\n return [\n { dx: 0, dy: 0, shape: \"triangle\", size: baseSize, rotation: rng() * 360 },\n { dx: -gap, dy: gap * 0.3, shape: \"circle\", size: baseSize * 0.35, rotation: 0 },\n { dx: gap, dy: gap * 0.3, shape: \"circle\", size: baseSize * 0.35, rotation: 0 },\n ];\n },\n },\n {\n name: \"hexagon-ring\",\n build: (rng, baseSize) => {\n const members: Array<{ dx: number; dy: number; shape: string; size: number; rotation: number }> = [];\n const count = 5 + Math.floor(rng() * 2);\n const ringR = baseSize * 0.6;\n for (let i = 0; i < count; i++) {\n const angle = (i / count) * Math.PI * 2;\n members.push({\n dx: Math.cos(angle) * ringR,\n dy: Math.sin(angle) * ringR,\n shape: \"hexagon\",\n size: baseSize * (0.25 + rng() * 0.1),\n rotation: (angle * 180) / Math.PI,\n });\n }\n return members;\n },\n },\n {\n name: \"spiral-dots\",\n build: (rng, baseSize) => {\n const members: Array<{ dx: number; dy: number; shape: string; size: number; rotation: number }> = [];\n const count = 7 + Math.floor(rng() * 5);\n const turns = 1.5 + rng();\n for (let i = 0; i < count; i++) {\n const t = i / count;\n const angle = t * Math.PI * 2 * turns;\n const r = t * baseSize * 0.7;\n members.push({\n dx: Math.cos(angle) * r,\n dy: Math.sin(angle) * r,\n shape: \"circle\",\n size: baseSize * (0.08 + (1 - t) * 0.12),\n rotation: 0,\n });\n }\n return members;\n },\n },\n {\n name: \"diamond-cluster\",\n build: (rng, baseSize) => {\n const gap = baseSize * 0.45;\n return [\n { dx: 0, dy: -gap, shape: \"diamond\", size: baseSize * 0.4, rotation: 0 },\n { dx: gap, dy: 0, shape: \"diamond\", size: baseSize * 0.35, rotation: 15 },\n { dx: 0, dy: gap, shape: \"diamond\", size: baseSize * 0.3, rotation: 30 },\n { dx: -gap, dy: 0, shape: \"diamond\", size: baseSize * 0.35, rotation: -15 },\n ];\n },\n },\n {\n name: \"crescent-pair\",\n build: (rng, baseSize) => {\n const gap = baseSize * 0.5;\n return [\n { dx: -gap * 0.4, dy: 0, shape: \"crescent\", size: baseSize * 0.5, rotation: rng() * 30 },\n { dx: gap * 0.4, dy: 0, shape: \"crescent\", size: baseSize * 0.45, rotation: 180 + rng() * 30 },\n ];\n },\n },\n];\n\n// ── Main render function ────────────────────────────────────────────\n\nexport function renderHashArt(\n ctx: CanvasRenderingContext2D,\n gitHash: string,\n config: Partial<GenerationConfig> = {},\n): void {\n const finalConfig: GenerationConfig = { ...DEFAULT_CONFIG, ...config };\n\n const rng = createRng(seedFromHash(gitHash));\n\n // ── 0. Select archetype — fundamentally different visual personality ──\n const archetype = selectArchetype(rng);\n\n // Archetype overrides defaults, but explicit user config wins\n const {\n width,\n height,\n } = finalConfig;\n const gridSize = config.gridSize ?? archetype.gridSize;\n const layers = config.layers ?? archetype.layers;\n const minShapeSize = config.minShapeSize ?? archetype.minShapeSize;\n const maxShapeSize = config.maxShapeSize ?? archetype.maxShapeSize;\n const baseOpacity = config.baseOpacity ?? archetype.baseOpacity;\n const opacityReduction = config.opacityReduction ?? archetype.opacityReduction;\n\n const shapesPerLayer =\n finalConfig.shapesPerLayer || Math.floor(gridSize * gridSize * 1.5);\n\n const colorScheme = new SacredColorScheme(gitHash);\n const colors = colorScheme.getColorsByMode(archetype.paletteMode);\n const [bgStart, bgEnd] = colorScheme.getBackgroundColorsByMode(archetype.paletteMode);\n const tempMode = colorScheme.getTemperatureMode();\n const fgTempTarget: \"warm\" | \"cool\" | null =\n tempMode === \"warm-bg\" ? \"cool\" : tempMode === \"cool-bg\" ? \"warm\" : null;\n\n // ── 0b. Color hierarchy — dominant/secondary/accent weighting ──\n const colorHierarchy = buildColorHierarchy(colors, rng);\n\n // ── 0c. Shape palette — curated shapes that work well together ──\n const shapeNames = Object.keys(shapes);\n const shapePalette = buildShapePalette(rng, shapeNames, archetype.name);\n\n // ── 0d. Color grading — unified tone for the whole image ───────\n const colorGrade = pickColorGrade(rng);\n\n // ── 0e. Light direction — consistent shadow angle ──────────────\n const lightAngle = rng() * Math.PI * 2;\n\n // ── 0f. Palette evolution — hue drift direction across layers ──\n const paletteHueShift = (rng() - 0.5) * 40; // -20° to +20° total drift\n\n const scaleFactor = Math.min(width, height) / 1024;\n const adjustedMinSize = minShapeSize * scaleFactor;\n const adjustedMaxSize = maxShapeSize * scaleFactor;\n\n const cx = width / 2;\n const cy = height / 2;\n\n // ── 1. Background ──────────────────────────────────────────────\n const bgRadius = Math.hypot(cx, cy);\n drawBackground(ctx, archetype.backgroundStyle, bgStart, bgEnd, width, height, cx, cy, bgRadius, rng, colors);\n\n // Gradient mesh overlay — 3-4 color control points for richer backgrounds\n const meshPoints = 3 + Math.floor(rng() * 2);\n ctx.globalCompositeOperation = \"soft-light\";\n for (let i = 0; i < meshPoints; i++) {\n const mx = rng() * width;\n const my = rng() * height;\n const mRadius = Math.min(width, height) * (0.3 + rng() * 0.4);\n const mColor = pickHierarchyColor(colorHierarchy, rng);\n const grad = ctx.createRadialGradient(mx, my, 0, mx, my, mRadius);\n grad.addColorStop(0, hexWithAlpha(mColor, 0.08 + rng() * 0.06));\n grad.addColorStop(1, \"rgba(0,0,0,0)\");\n ctx.globalAlpha = 1;\n ctx.fillStyle = grad;\n ctx.fillRect(0, 0, width, height);\n }\n ctx.globalCompositeOperation = \"source-over\";\n\n // Compute average background luminance for contrast enforcement\n const bgLum = (luminance(bgStart) + luminance(bgEnd)) / 2;\n\n // ── 1b. Layered background — archetype-coherent shapes ─────────\n const bgShapeCount = 3 + Math.floor(rng() * 4);\n ctx.globalCompositeOperation = \"soft-light\";\n for (let i = 0; i < bgShapeCount; i++) {\n const bx = rng() * width;\n const by = rng() * height;\n const bSize = (width * 0.3 + rng() * width * 0.5);\n const bColor = pickHierarchyColor(colorHierarchy, rng);\n ctx.globalAlpha = 0.03 + rng() * 0.05;\n ctx.fillStyle = hexWithAlpha(bColor, 0.15);\n ctx.beginPath();\n // Use archetype-appropriate background shapes\n if (archetype.name === \"geometric-precision\" || archetype.name === \"op-art\") {\n // Rectangular shapes for geometric archetypes\n ctx.rect(bx - bSize / 2, by - bSize / 2, bSize, bSize * (0.5 + rng() * 0.5));\n } else {\n ctx.arc(bx, by, bSize / 2, 0, Math.PI * 2);\n }\n ctx.fill();\n }\n // Subtle concentric rings from center\n const ringCount = 2 + Math.floor(rng() * 3);\n ctx.globalAlpha = 0.02 + rng() * 0.03;\n ctx.strokeStyle = hexWithAlpha(colorHierarchy.dominant, 0.1);\n ctx.lineWidth = 1 * scaleFactor;\n for (let i = 1; i <= ringCount; i++) {\n const r = (Math.min(width, height) * 0.15) * i;\n ctx.beginPath();\n ctx.arc(cx, cy, r, 0, Math.PI * 2);\n ctx.stroke();\n }\n ctx.globalCompositeOperation = \"source-over\";\n\n // ── 1c. Background pattern layer — subtle textured paper ───────\n const bgPatternRoll = rng();\n if (bgPatternRoll < 0.6) {\n ctx.save();\n ctx.globalCompositeOperation = \"soft-light\";\n const patternOpacity = 0.02 + rng() * 0.04;\n const patternColor = hexWithAlpha(colorHierarchy.dominant, 0.15);\n\n if (bgPatternRoll < 0.2) {\n // Dot grid — batched into a single path\n const dotSpacing = Math.max(8, Math.min(width, height) * (0.015 + rng() * 0.015));\n const dotR = dotSpacing * 0.08;\n ctx.globalAlpha = patternOpacity;\n ctx.fillStyle = patternColor;\n ctx.beginPath();\n for (let px = 0; px < width; px += dotSpacing) {\n for (let py = 0; py < height; py += dotSpacing) {\n ctx.moveTo(px + dotR, py);\n ctx.arc(px, py, dotR, 0, Math.PI * 2);\n }\n }\n ctx.fill();\n } else if (bgPatternRoll < 0.4) {\n // Diagonal lines — batched into a single path\n const lineSpacing = Math.max(6, Math.min(width, height) * (0.02 + rng() * 0.02));\n ctx.globalAlpha = patternOpacity;\n ctx.strokeStyle = patternColor;\n ctx.lineWidth = 0.5 * scaleFactor;\n const diag = Math.hypot(width, height);\n ctx.beginPath();\n for (let d = -diag; d < diag; d += lineSpacing) {\n ctx.moveTo(d, 0);\n ctx.lineTo(d + height, height);\n }\n ctx.stroke();\n } else {\n // Tessellation — hexagonal grid, batched into a single path\n const tessSize = Math.max(10, Math.min(width, height) * (0.025 + rng() * 0.02));\n const tessH = tessSize * Math.sqrt(3);\n ctx.globalAlpha = patternOpacity * 0.7;\n ctx.strokeStyle = patternColor;\n ctx.lineWidth = 0.4 * scaleFactor;\n ctx.beginPath();\n for (let row = 0; row * tessH < height + tessH; row++) {\n const offsetX = (row % 2) * tessSize * 0.75;\n for (let col = 0; col * tessSize * 1.5 < width + tessSize * 1.5; col++) {\n const hx = col * tessSize * 1.5 + offsetX;\n const hy = row * tessH;\n for (let s = 0; s < 6; s++) {\n const angle = (Math.PI / 3) * s - Math.PI / 6;\n const vx = hx + Math.cos(angle) * tessSize * 0.5;\n const vy = hy + Math.sin(angle) * tessSize * 0.5;\n if (s === 0) ctx.moveTo(vx, vy);\n else ctx.lineTo(vx, vy);\n }\n ctx.closePath();\n }\n }\n ctx.stroke();\n }\n ctx.restore();\n }\n ctx.globalCompositeOperation = \"source-over\";\n\n // ── 2. Composition mode — archetype-aware selection ──────────────\n const compositionMode: CompositionMode = rng() < 0.7\n ? archetype.preferredCompositions[Math.floor(rng() * archetype.preferredCompositions.length)]\n : ALL_COMPOSITION_MODES[Math.floor(rng() * ALL_COMPOSITION_MODES.length)];\n\n // ── 2b. Symmetry mode — ~25% of hashes trigger mirroring ──────\n type SymmetryMode = \"none\" | \"bilateral-x\" | \"bilateral-y\" | \"quad\";\n const symRoll = rng();\n const symmetryMode: SymmetryMode =\n symRoll < 0.10 ? \"bilateral-x\" :\n symRoll < 0.20 ? \"bilateral-y\" :\n symRoll < 0.25 ? \"quad\" : \"none\";\n\n // ── 3. Focal points + void zones (archetype-aware) ───────────────\n const THIRDS_POINTS = [\n { x: 1 / 3, y: 1 / 3 },\n { x: 2 / 3, y: 1 / 3 },\n { x: 1 / 3, y: 2 / 3 },\n { x: 2 / 3, y: 2 / 3 },\n ];\n const numFocal = 1 + Math.floor(rng() * 2);\n const focalPoints: Array<{ x: number; y: number; strength: number }> = [];\n for (let f = 0; f < numFocal; f++) {\n if (rng() < 0.7) {\n const tp = THIRDS_POINTS[Math.floor(rng() * THIRDS_POINTS.length)];\n focalPoints.push({\n x: width * (tp.x + (rng() - 0.5) * 0.08),\n y: height * (tp.y + (rng() - 0.5) * 0.08),\n strength: 0.3 + rng() * 0.4,\n });\n } else {\n focalPoints.push({\n x: width * (0.2 + rng() * 0.6),\n y: height * (0.2 + rng() * 0.6),\n strength: 0.3 + rng() * 0.4,\n });\n }\n }\n\n // Archetype-aware void zones: dense archetypes get fewer/no voids,\n // minimal archetypes get golden-ratio positioned voids\n const PHI = (1 + Math.sqrt(5)) / 2;\n const isMinimalArchetype = archetype.gridSize <= 3;\n const isDenseArchetype = archetype.gridSize >= 8;\n const numVoids = isDenseArchetype ? 0 : (Math.floor(rng() * 2) + 1);\n const voidZones: Array<{ x: number; y: number; radius: number }> = [];\n for (let v = 0; v < numVoids; v++) {\n if (isMinimalArchetype) {\n // Place voids at golden-ratio positions for intentional negative space\n const gx = (v === 0) ? 1 / PHI : 1 - 1 / PHI;\n const gy = (v === 0) ? 1 - 1 / PHI : 1 / PHI;\n voidZones.push({\n x: width * (gx + (rng() - 0.5) * 0.05),\n y: height * (gy + (rng() - 0.5) * 0.05),\n radius: Math.min(width, height) * (0.08 + rng() * 0.08),\n });\n } else {\n voidZones.push({\n x: width * (0.15 + rng() * 0.7),\n y: height * (0.15 + rng() * 0.7),\n radius: Math.min(width, height) * (0.06 + rng() * 0.1),\n });\n }\n }\n\n function applyFocalBias(rx: number, ry: number): [number, number] {\n let nearest = focalPoints[0];\n let minDist = Infinity;\n for (const fp of focalPoints) {\n const d = Math.hypot(rx - fp.x, ry - fp.y);\n if (d < minDist) {\n minDist = d;\n nearest = fp;\n }\n }\n const pull = nearest.strength * rng() * 0.5;\n return [rx + (nearest.x - rx) * pull, ry + (nearest.y - ry) * pull];\n }\n\n // ── 3b. Void zone decoration — intentional negative space ────\n for (const zone of voidZones) {\n // Subtle halo ring around void zones\n ctx.globalAlpha = 0.04 + rng() * 0.04;\n ctx.strokeStyle = hexWithAlpha(colorHierarchy.accent, 0.2);\n ctx.lineWidth = 1.5 * scaleFactor;\n ctx.beginPath();\n ctx.arc(zone.x, zone.y, zone.radius, 0, Math.PI * 2);\n ctx.stroke();\n\n // ~50% chance: scatter tiny dots inside the void\n if (rng() < 0.5) {\n const dotCount = 3 + Math.floor(rng() * 6);\n ctx.globalAlpha = 0.06 + rng() * 0.04;\n ctx.fillStyle = hexWithAlpha(colorHierarchy.secondary, 0.15);\n for (let d = 0; d < dotCount; d++) {\n const angle = rng() * Math.PI * 2;\n const dist = rng() * zone.radius * 0.7;\n const dotR = (1 + rng() * 3) * scaleFactor;\n ctx.beginPath();\n ctx.arc(\n zone.x + Math.cos(angle) * dist,\n zone.y + Math.sin(angle) * dist,\n dotR, 0, Math.PI * 2,\n );\n ctx.fill();\n }\n }\n\n // ~30% chance: thin concentric ring inside\n if (rng() < 0.3) {\n ctx.globalAlpha = 0.03 + rng() * 0.03;\n ctx.strokeStyle = hexWithAlpha(colorHierarchy.dominant, 0.1);\n ctx.lineWidth = 0.5 * scaleFactor;\n const innerR = zone.radius * (0.4 + rng() * 0.3);\n ctx.beginPath();\n ctx.arc(zone.x, zone.y, innerR, 0, Math.PI * 2);\n ctx.stroke();\n }\n }\n ctx.globalAlpha = 1;\n\n // ── 4. Flow field — simplex noise for organic variation ─────────\n // Create a seeded simplex noise field (unique per hash)\n const noiseFieldRng = createRng(seedFromHash(gitHash, 333));\n const simplexNoise = createSimplexNoise(noiseFieldRng);\n const fbmNoise = createFBM(simplexNoise, 3, 2.0, 0.5);\n const fieldAngleBase = rng() * Math.PI * 2;\n const fieldFreq = 1.5 + rng() * 2.5; // noise sampling frequency\n\n function flowAngle(x: number, y: number): number {\n // Sample FBM noise at the position, scaled by frequency\n const nx = (x / width) * fieldFreq;\n const ny = (y / height) * fieldFreq;\n return fieldAngleBase + fbmNoise(nx, ny) * Math.PI;\n }\n\n // Noise-based size modulation — shapes in \"high noise\" areas get scaled\n function noiseSizeModulation(x: number, y: number): number {\n const n = simplexNoise((x / width) * 3, (y / height) * 3);\n // Map [-1,1] to [0.7, 1.3] — subtle terrain-like size variation\n return 0.7 + (n + 1) * 0.3;\n }\n\n // Track all placed shapes for density checks and connecting curves\n const shapePositions: Array<{ x: number; y: number; size: number; shape: string }> = [];\n\n // Spatial grid for O(1) density and nearest-neighbor lookups\n const densityCheckRadius = Math.min(width, height) * 0.08;\n const spatialGrid = new SpatialGrid(densityCheckRadius);\n\n // Hero avoidance radius — shapes near the hero orient toward it\n let heroCenter: { x: number; y: number; size: number } | null = null;\n\n // ── 4b. Hero shape — a dominant focal element ───────────────────\n if (archetype.heroShape && rng() < 0.6) {\n const heroFocal = focalPoints[0];\n // Use shape palette hero candidates\n const heroPool = [...shapePalette.primary, ...shapePalette.supporting]\n .filter((s) => SHAPE_PROFILES[s]?.heroCandidate && shapeNames.includes(s));\n const heroShape = heroPool.length > 0\n ? heroPool[Math.floor(rng() * heroPool.length)]\n : shapeNames[Math.floor(rng() * shapeNames.length)];\n\n const heroSize = adjustedMaxSize * (0.8 + rng() * 0.5);\n const heroRotation = rng() * 360;\n const heroFill = hexWithAlpha(\n enforceContrast(jitterColorHSL(colorHierarchy.dominant, rng, 6, 0.05), bgLum),\n 0.15 + rng() * 0.2,\n );\n const heroStroke = enforceContrast(jitterColorHSL(colorHierarchy.accent, rng, 6, 0.05), bgLum);\n\n // Get best style for this hero shape\n const heroProfile = SHAPE_PROFILES[heroShape];\n const heroStyle: RenderStyle = heroProfile\n ? (heroProfile.bestStyles[Math.floor(rng() * heroProfile.bestStyles.length)] as RenderStyle)\n : (rng() < 0.4 ? \"watercolor\" : \"fill-and-stroke\");\n\n ctx.globalAlpha = 0.5 + rng() * 0.2;\n enhanceShapeGeneration(ctx, heroShape, heroFocal.x, heroFocal.y, {\n fillColor: heroFill,\n strokeColor: heroStroke,\n strokeWidth: (1.5 + rng() * 2) * scaleFactor,\n size: heroSize,\n rotation: heroRotation,\n proportionType: \"GOLDEN_RATIO\",\n glowRadius: (12 + rng() * 20) * scaleFactor,\n glowColor: hexWithAlpha(heroStroke, 0.4),\n gradientFillEnd: jitterColorHSL(colorHierarchy.secondary, rng, 10, 0.1),\n renderStyle: heroStyle,\n rng,\n lightAngle,\n scaleFactor,\n });\n\n heroCenter = { x: heroFocal.x, y: heroFocal.y, size: heroSize };\n shapePositions.push({ x: heroFocal.x, y: heroFocal.y, size: heroSize, shape: heroShape });\n spatialGrid.insert({ x: heroFocal.x, y: heroFocal.y, size: heroSize, shape: heroShape });\n }\n\n\n // ── 5. Shape layers ────────────────────────────────────────────\n const maxLocalDensity = Math.ceil(shapesPerLayer * 0.15);\n\n for (let layer = 0; layer < layers; layer++) {\n const layerRatio = layers > 1 ? layer / (layers - 1) : 0;\n const numShapes =\n shapesPerLayer +\n Math.floor(rng() * shapesPerLayer * 0.3);\n const layerOpacity = Math.max(0.15, baseOpacity - layer * opacityReduction);\n const layerSizeScale = 1 - layer * 0.15;\n\n // Per-layer blend mode\n const layerBlend = pickBlendMode(rng);\n ctx.globalCompositeOperation = layerBlend;\n\n // Per-layer render style bias — prefer archetype styles\n const layerRenderStyle: RenderStyle = rng() < 0.6\n ? archetype.preferredStyles[Math.floor(rng() * archetype.preferredStyles.length)]\n : pickRenderStyle(rng);\n\n // Atmospheric desaturation for later layers\n const atmosphericDesat = layerRatio * 0.3;\n\n // Depth-of-field simulation — later layers are \"further away\"\n // Reduce stroke widths and shift colors toward the background\n const dofFactor = 1 - layerRatio * 0.5; // 1.0 for front layer, 0.5 for back\n const dofStrokeScale = 0.4 + dofFactor * 0.6; // strokes thin out with depth\n const dofContrastReduction = layerRatio * 0.2; // colors fade toward bg\n\n // Color palette evolution — hue-rotate the hierarchy per layer\n const layerHierarchy = evolveHierarchy(colorHierarchy, layerRatio, paletteHueShift);\n\n // Focal depth: shapes near focal points get more detail\n const focalDetailBoost = (px: number, py: number): number => {\n let minFocalDist = Infinity;\n for (const fp of focalPoints) {\n const d = Math.hypot(px - fp.x, py - fp.y);\n if (d < minFocalDist) minFocalDist = d;\n }\n const maxDist = Math.hypot(width, height) * 0.5;\n return Math.max(0, 1 - minFocalDist / maxDist); // 1.0 at focal, 0.0 at edges\n };\n\n for (let i = 0; i < numShapes; i++) {\n // Position from composition mode, then focal bias\n const rawPos = getCompositionPosition(\n compositionMode,\n rng,\n width,\n height,\n i,\n numShapes,\n cx,\n cy,\n );\n const [x, y] = applyFocalBias(rawPos.x, rawPos.y);\n\n // Skip shapes in void zones, reduce in dense areas\n if (isInVoidZone(x, y, voidZones)) {\n if (rng() < 0.85) continue;\n }\n if (spatialGrid.countNear(x, y, densityCheckRadius) > maxLocalDensity) {\n if (rng() < 0.6) continue;\n }\n\n // Power distribution for size — archetype controls the curve\n const sizeT = Math.pow(rng(), archetype.sizePower);\n const size =\n (adjustedMinSize + sizeT * (adjustedMaxSize - adjustedMinSize)) *\n layerSizeScale * noiseSizeModulation(x, y);\n\n // Size fraction for affinity-aware shape selection\n const sizeFraction = size / adjustedMaxSize;\n\n // Palette-driven shape selection (replaces naive pickShape)\n const shape = pickShapeFromPalette(shapePalette, rng, sizeFraction);\n\n // Flow-field rotation in flow-field mode, random otherwise\n let rotation =\n compositionMode === \"flow-field\"\n ? (flowAngle(x, y) * 180) / Math.PI + (rng() - 0.5) * 30\n : rng() * 360;\n\n // Hero avoidance: shapes near the hero orient toward it\n if (heroCenter) {\n const distToHero = Math.hypot(x - heroCenter.x, y - heroCenter.y);\n const heroInfluence = heroCenter.size * 1.5;\n if (distToHero < heroInfluence && distToHero > 0) {\n const angleToHero = Math.atan2(heroCenter.y - y, heroCenter.x - x) * 180 / Math.PI;\n const blendFactor = 1 - (distToHero / heroInfluence);\n rotation = rotation + (angleToHero - rotation) * blendFactor * 0.4;\n }\n }\n\n // Positional color from hierarchy + jitter (using evolved layer palette)\n let fillBase = getPositionalColor(x, y, width, height, layerHierarchy, rng);\n const strokeBase = pickHierarchyColor(layerHierarchy, rng);\n\n // Desaturate colors on later layers for depth\n if (atmosphericDesat > 0) {\n fillBase = desaturate(fillBase, atmosphericDesat);\n }\n\n // Temperature contrast: shift foreground shapes opposite to background\n if (fgTempTarget) {\n fillBase = shiftTemperature(fillBase, fgTempTarget, 0.15 + layerRatio * 0.1);\n }\n\n const fillColor = enforceContrast(jitterColorHSL(fillBase, rng, 6, 0.05), bgLum);\n const strokeColor = enforceContrast(jitterColorHSL(strokeBase, rng, 5, 0.04), bgLum);\n\n // Semi-transparent fill\n const fillAlpha = 0.2 + rng() * 0.5;\n const transparentFill = hexWithAlpha(fillColor, fillAlpha);\n\n const strokeWidth = (0.5 + rng() * 2.0) * scaleFactor * dofStrokeScale;\n\n // Depth-of-field: reduce opacity slightly for distant layers\n const dofOpacityScale = 1 - dofContrastReduction;\n ctx.globalAlpha = layerOpacity * (0.5 + rng() * 0.5) * dofOpacityScale;\n\n // Glow on sacred shapes more often — scaled by archetype\n const isSacred = SACRED_SHAPES.includes(shape);\n const baseGlowChance = isSacred ? 0.45 : 0.2;\n const glowChance = baseGlowChance * archetype.glowMultiplier;\n const hasGlow = rng() < glowChance;\n const glowRadius = hasGlow ? (8 + rng() * 20) * scaleFactor : 0;\n\n // Gradient fill on ~30%\n const hasGradient = rng() < 0.3;\n const gradientEnd = hasGradient\n ? jitterColorHSL(pickHierarchyColor(colorHierarchy, rng), rng, 10, 0.1)\n : undefined;\n\n // Affinity-aware render style selection\n const shapeRenderStyle = pickStyleForShape(shape, layerRenderStyle, rng) as RenderStyle;\n\n // Organic edge jitter — applied via watercolor style on ~15% of shapes\n const useOrganicEdges = rng() < 0.15 && shapeRenderStyle === \"fill-and-stroke\";\n const finalRenderStyle = useOrganicEdges ? \"watercolor\" as RenderStyle : shapeRenderStyle;\n\n // Consistent light direction — subtle shadow offset\n const shadowDist = hasGlow ? 0 : (size * 0.02);\n const shadowOffX = shadowDist * Math.cos(lightAngle);\n const shadowOffY = shadowDist * Math.sin(lightAngle);\n\n // ── 5a. Tangent placement — nudge toward nearest shape edge ──\n let finalX = x;\n let finalY = y;\n if (shapePositions.length > 0 && rng() < 0.25) {\n // Use spatial grid for O(1) nearest-neighbor lookup\n const searchRadius = adjustedMaxSize * 3;\n const nearestPos = spatialGrid.findNearest(x, y, searchRadius);\n if (nearestPos) {\n const nearestDist = Math.hypot(x - nearestPos.x, y - nearestPos.y);\n // Target distance: edges kissing (sum of half-sizes)\n const targetDist = (size + nearestPos.size) * 0.5;\n if (nearestDist > targetDist * 0.5 && nearestDist < targetDist * 3) {\n const angle = Math.atan2(y - nearestPos.y, x - nearestPos.x);\n finalX = nearestPos.x + Math.cos(angle) * targetDist;\n finalY = nearestPos.y + Math.sin(angle) * targetDist;\n // Keep in bounds\n finalX = Math.max(0, Math.min(width, finalX));\n finalY = Math.max(0, Math.min(height, finalY));\n }\n }\n }\n\n // ── 5b. Shape mirroring — basic shapes get reflected copies ──\n const mirrorAxis = pickMirrorAxis(rng);\n const isBasicShape = [\"circle\", \"triangle\", \"square\", \"hexagon\", \"star\",\n \"diamond\", \"crescent\", \"penroseTile\", \"reuleauxTriangle\"].includes(shape);\n const shouldMirror = mirrorAxis !== null && isBasicShape && size > adjustedMaxSize * 0.2;\n\n const shapeConfig = {\n fillColor: transparentFill,\n strokeColor,\n strokeWidth,\n size,\n rotation,\n proportionType: \"GOLDEN_RATIO\" as const,\n glowRadius: glowRadius || (shadowDist > 0 ? shadowDist * 2 : 0),\n glowColor: hasGlow\n ? hexWithAlpha(fillColor, 0.6)\n : (shadowDist > 0 ? \"rgba(0,0,0,0.08)\" : undefined),\n gradientFillEnd: gradientEnd,\n renderStyle: finalRenderStyle,\n rng,\n lightAngle,\n scaleFactor,\n };\n\n if (shouldMirror) {\n drawMirroredShape(ctx, shape, finalX, finalY, {\n ...shapeConfig,\n mirrorAxis: mirrorAxis!,\n mirrorGap: size * (0.1 + rng() * 0.3),\n });\n } else {\n enhanceShapeGeneration(ctx, shape, finalX, finalY, shapeConfig);\n }\n\n // ── Glazing — luminous multi-pass transparency on ~20% of shapes ──\n if (rng() < 0.2 && size > adjustedMinSize * 2) {\n const glazePasses = 2 + Math.floor(rng() * 2);\n for (let g = 0; g < glazePasses; g++) {\n const glazeScale = 1 - (g + 1) * 0.12; // progressively smaller\n const glazeAlpha = 0.08 + g * 0.04; // progressively more opaque toward center\n ctx.globalAlpha = glazeAlpha;\n enhanceShapeGeneration(ctx, shape, finalX, finalY, {\n fillColor: hexWithAlpha(fillColor, 0.15 + g * 0.1),\n strokeColor: \"rgba(0,0,0,0)\",\n strokeWidth: 0,\n size: size * glazeScale,\n rotation,\n proportionType: \"GOLDEN_RATIO\",\n renderStyle: \"fill-only\",\n rng,\n });\n }\n }\n\n shapePositions.push({ x: finalX, y: finalY, size, shape });\n spatialGrid.insert({ x: finalX, y: finalY, size, shape });\n\n // ── 5c. Size echo — large shapes spawn trailing smaller copies ──\n if (size > adjustedMaxSize * 0.5 && rng() < 0.2) {\n const echoCount = 2 + Math.floor(rng() * 2);\n const echoAngle = rng() * Math.PI * 2;\n for (let e = 0; e < echoCount; e++) {\n const echoScale = 0.3 - e * 0.08;\n const echoDist = size * (0.6 + e * 0.4);\n const echoX = finalX + Math.cos(echoAngle) * echoDist;\n const echoY = finalY + Math.sin(echoAngle) * echoDist;\n const echoSize = size * Math.max(0.1, echoScale);\n\n if (echoX < 0 || echoX > width || echoY < 0 || echoY > height) continue;\n\n ctx.globalAlpha = layerOpacity * (0.4 - e * 0.1);\n enhanceShapeGeneration(ctx, shape, echoX, echoY, {\n fillColor: hexWithAlpha(fillColor, fillAlpha * 0.6),\n strokeColor: hexWithAlpha(strokeColor, 0.4),\n strokeWidth: strokeWidth * 0.6,\n size: echoSize,\n rotation: rotation + (e + 1) * 15,\n proportionType: \"GOLDEN_RATIO\",\n renderStyle: finalRenderStyle,\n rng,\n });\n shapePositions.push({ x: echoX, y: echoY, size: echoSize, shape });\n spatialGrid.insert({ x: echoX, y: echoY, size: echoSize, shape });\n }\n }\n\n // ── 5d. Recursive nesting ──────────────────────────────────\n // Focal depth: shapes near focal points get more detail\n const focalProximity = focalDetailBoost(finalX, finalY);\n const nestingChance = 0.15 + focalProximity * 0.15; // 15-30% near focal\n if (size > adjustedMaxSize * 0.4 && rng() < nestingChance) {\n const innerCount = 1 + Math.floor(rng() * 3);\n for (let n = 0; n < innerCount; n++) {\n // Pick inner shape from palette affinities\n const innerSizeFraction = (size * 0.25) / adjustedMaxSize;\n const innerShape = pickShapeFromPalette(shapePalette, rng, innerSizeFraction);\n const innerSize = size * (0.15 + rng() * 0.25);\n const innerOffX = (rng() - 0.5) * size * 0.4;\n const innerOffY = (rng() - 0.5) * size * 0.4;\n const innerRot = rng() * 360;\n const innerFill = hexWithAlpha(\n jitterColorHSL(pickHierarchyColor(colorHierarchy, rng), rng, 10, 0.1),\n 0.3 + rng() * 0.4,\n );\n\n ctx.globalAlpha = layerOpacity * 0.7;\n enhanceShapeGeneration(\n ctx,\n innerShape,\n finalX + innerOffX,\n finalY + innerOffY,\n {\n fillColor: innerFill,\n strokeColor: hexWithAlpha(strokeColor, 0.5),\n strokeWidth: strokeWidth * 0.6,\n size: innerSize,\n rotation: innerRot,\n proportionType: \"GOLDEN_RATIO\",\n renderStyle: pickStyleForShape(innerShape, layerRenderStyle, rng) as RenderStyle,\n rng,\n },\n );\n }\n }\n\n // ── 5e. Shape constellations — pre-composed groups ─────────\n const constellationChance = 0.12 + focalProximity * 0.1; // 12-22% near focal\n if (size > adjustedMaxSize * 0.35 && rng() < constellationChance) {\n const constellation = CONSTELLATIONS[Math.floor(rng() * CONSTELLATIONS.length)];\n const members = constellation.build(rng, size);\n const groupRotation = rng() * Math.PI * 2;\n const cosR = Math.cos(groupRotation);\n const sinR = Math.sin(groupRotation);\n\n for (const member of members) {\n // Rotate the group offset by the group rotation\n const mx = finalX + member.dx * cosR - member.dy * sinR;\n const my = finalY + member.dx * sinR + member.dy * cosR;\n\n if (mx < 0 || mx > width || my < 0 || my > height) continue;\n\n const memberFill = hexWithAlpha(\n jitterColorHSL(pickHierarchyColor(colorHierarchy, rng), rng, 8, 0.06),\n fillAlpha * 0.8,\n );\n const memberStroke = enforceContrast(\n jitterColorHSL(strokeBase, rng, 5, 0.04), bgLum,\n );\n\n ctx.globalAlpha = layerOpacity * 0.6;\n // Use the member's shape if available, otherwise fall back to palette\n const memberShape = shapeNames.includes(member.shape)\n ? member.shape\n : pickShapeFromPalette(shapePalette, rng, member.size / adjustedMaxSize);\n\n enhanceShapeGeneration(ctx, memberShape, mx, my, {\n fillColor: memberFill,\n strokeColor: memberStroke,\n strokeWidth: strokeWidth * 0.7,\n size: member.size,\n rotation: member.rotation + (groupRotation * 180) / Math.PI,\n proportionType: \"GOLDEN_RATIO\",\n renderStyle: pickStyleForShape(memberShape, layerRenderStyle, rng) as RenderStyle,\n rng,\n });\n shapePositions.push({ x: mx, y: my, size: member.size, shape: memberShape });\n spatialGrid.insert({ x: mx, y: my, size: member.size, shape: memberShape });\n }\n }\n\n // ── 5f. Rhythm placement — deliberate geometric progressions ──\n // ~12% of medium-large shapes spawn a rhythmic sequence\n if (size > adjustedMaxSize * 0.25 && rng() < 0.12) {\n const rhythmCount = 3 + Math.floor(rng() * 4); // 3-6 shapes\n const rhythmAngle = rng() * Math.PI * 2;\n const rhythmSpacing = size * (0.8 + rng() * 0.6);\n const rhythmDecay = 0.7 + rng() * 0.15; // size multiplier per step\n const rhythmShape = shape; // same shape for visual rhythm\n\n let rhythmSize = size * 0.6;\n for (let r = 0; r < rhythmCount; r++) {\n const rx = finalX + Math.cos(rhythmAngle) * rhythmSpacing * (r + 1);\n const ry = finalY + Math.sin(rhythmAngle) * rhythmSpacing * (r + 1);\n\n if (rx < 0 || rx > width || ry < 0 || ry > height) break;\n if (isInVoidZone(rx, ry, voidZones)) break;\n\n rhythmSize *= rhythmDecay;\n if (rhythmSize < adjustedMinSize) break;\n\n const rhythmAlpha = layerOpacity * (0.6 - r * 0.08);\n ctx.globalAlpha = Math.max(0.1, rhythmAlpha);\n\n const rhythmFill = hexWithAlpha(\n jitterColorHSL(pickHierarchyColor(layerHierarchy, rng), rng, 5, 0.04),\n fillAlpha * 0.7,\n );\n\n enhanceShapeGeneration(ctx, rhythmShape, rx, ry, {\n fillColor: rhythmFill,\n strokeColor: hexWithAlpha(strokeColor, 0.5),\n strokeWidth: strokeWidth * 0.7,\n size: rhythmSize,\n rotation: rotation + (r + 1) * 12,\n proportionType: \"GOLDEN_RATIO\",\n renderStyle: finalRenderStyle,\n rng,\n });\n shapePositions.push({ x: rx, y: ry, size: rhythmSize, shape: rhythmShape });\n spatialGrid.insert({ x: rx, y: ry, size: rhythmSize, shape: rhythmShape });\n }\n }\n }\n }\n\n // Reset blend mode for post-processing passes\n ctx.globalCompositeOperation = \"source-over\";\n\n // ── 5g. Layered masking / cutout portals ───────────────────────\n // ~18% of images get 1-3 portal windows that paint over foreground\n // with a tinted background wash, creating a \"peek through\" effect.\n if (rng() < 0.18 && shapePositions.length > 3) {\n const portalCount = 1 + Math.floor(rng() * 2);\n for (let p = 0; p < portalCount; p++) {\n // Pick a position biased toward placed shapes\n const sourceShape = shapePositions[Math.floor(rng() * shapePositions.length)];\n const portalX = sourceShape.x + (rng() - 0.5) * sourceShape.size * 0.5;\n const portalY = sourceShape.y + (rng() - 0.5) * sourceShape.size * 0.5;\n const portalSize = adjustedMaxSize * (0.15 + rng() * 0.25);\n\n // Pick a portal shape from the palette\n const portalShape = pickShapeFromPalette(shapePalette, rng, portalSize / adjustedMaxSize);\n const portalRotation = rng() * 360;\n const portalAlpha = 0.6 + rng() * 0.35;\n\n ctx.save();\n ctx.translate(portalX, portalY);\n ctx.rotate((portalRotation * Math.PI) / 180);\n\n // Step 1: Clip to the portal shape and fill with background wash\n ctx.beginPath();\n shapes[portalShape]?.(ctx, portalSize);\n ctx.clip();\n\n // Fill the clipped region with a radial gradient from background colors\n const portalColor = jitterColorHSL(bgStart, rng, 15, 0.1);\n const portalGrad = ctx.createRadialGradient(0, 0, 0, 0, 0, portalSize);\n portalGrad.addColorStop(0, portalColor);\n portalGrad.addColorStop(1, bgEnd);\n ctx.globalAlpha = portalAlpha;\n ctx.fillStyle = portalGrad;\n ctx.fillRect(-portalSize, -portalSize, portalSize * 2, portalSize * 2);\n\n // Optional: subtle inner texture — a few tiny dots inside the portal\n if (rng() < 0.5) {\n const dotCount = 3 + Math.floor(rng() * 5);\n ctx.globalAlpha = portalAlpha * 0.3;\n ctx.fillStyle = hexWithAlpha(pickHierarchyColor(colorHierarchy, rng), 0.2);\n for (let d = 0; d < dotCount; d++) {\n const dx = (rng() - 0.5) * portalSize * 1.4;\n const dy = (rng() - 0.5) * portalSize * 1.4;\n const dr = (1 + rng() * 3) * scaleFactor;\n ctx.beginPath();\n ctx.arc(dx, dy, dr, 0, Math.PI * 2);\n ctx.fill();\n }\n }\n\n ctx.restore();\n\n // Step 2: Draw a border ring around the portal (outside the clip)\n ctx.save();\n ctx.translate(portalX, portalY);\n ctx.rotate((portalRotation * Math.PI) / 180);\n ctx.globalAlpha = 0.15 + rng() * 0.2;\n ctx.strokeStyle = hexWithAlpha(pickHierarchyColor(colorHierarchy, rng), 0.5);\n ctx.lineWidth = (1.5 + rng() * 2.5) * scaleFactor;\n ctx.beginPath();\n shapes[portalShape]?.(ctx, portalSize * 1.06);\n ctx.stroke();\n ctx.restore();\n }\n }\n\n\n // ── 6. Flow-line pass — variable color, branching, pressure ────\n const baseFlowLines = 6 + Math.floor(rng() * 10);\n const numFlowLines = Math.round(baseFlowLines * archetype.flowLineMultiplier);\n\n for (let i = 0; i < numFlowLines; i++) {\n let fx = rng() * width;\n let fy = rng() * height;\n const steps = 30 + Math.floor(rng() * 40);\n const stepLen = (3 + rng() * 5) * scaleFactor;\n const startWidth = (1 + rng() * 3) * scaleFactor;\n\n // Variable color: interpolate between two hierarchy colors along the stroke\n const lineColorStart = enforceContrast(pickHierarchyColor(colorHierarchy, rng), bgLum);\n const lineColorEnd = enforceContrast(pickHierarchyColor(colorHierarchy, rng), bgLum);\n const lineAlpha = 0.06 + rng() * 0.1;\n\n // Pressure simulation: sinusoidal width variation\n const pressureFreq = 2 + rng() * 4;\n const pressurePhase = rng() * Math.PI * 2;\n\n let prevX = fx;\n let prevY = fy;\n for (let s = 0; s < steps; s++) {\n const angle = flowAngle(fx, fy) + (rng() - 0.5) * 0.3;\n fx += Math.cos(angle) * stepLen;\n fy += Math.sin(angle) * stepLen;\n\n if (fx < 0 || fx > width || fy < 0 || fy > height) break;\n\n // Skip segments that pass through void zones\n if (isInVoidZone(fx, fy, voidZones)) {\n prevX = fx;\n prevY = fy;\n continue;\n }\n\n const t = s / steps;\n // Taper + pressure\n const taper = 1 - t * 0.8;\n const pressure = 0.6 + 0.4 * Math.sin(t * pressureFreq * Math.PI + pressurePhase);\n\n ctx.globalAlpha = lineAlpha * taper;\n // Interpolate color along stroke\n const lineColor = t < 0.5\n ? hexWithAlpha(lineColorStart, 0.4 + t * 0.2)\n : hexWithAlpha(lineColorEnd, 0.4 + (1 - t) * 0.2);\n ctx.strokeStyle = lineColor;\n ctx.lineWidth = startWidth * taper * pressure;\n ctx.lineCap = \"round\";\n\n ctx.beginPath();\n ctx.moveTo(prevX, prevY);\n ctx.lineTo(fx, fy);\n ctx.stroke();\n\n // Branching: ~12% chance per step to spawn a thinner child stroke\n if (rng() < 0.12 && s > 5 && s < steps - 10) {\n const branchAngle = angle + (rng() < 0.5 ? 1 : -1) * (0.3 + rng() * 0.5);\n let bx = fx;\n let by = fy;\n let bPrevX = fx;\n let bPrevY = fy;\n const branchSteps = 5 + Math.floor(rng() * 10);\n const branchWidth = startWidth * taper * 0.4;\n for (let bs = 0; bs < branchSteps; bs++) {\n const bAngle = branchAngle + (rng() - 0.5) * 0.2;\n bx += Math.cos(bAngle) * stepLen * 0.8;\n by += Math.sin(bAngle) * stepLen * 0.8;\n if (bx < 0 || bx > width || by < 0 || by > height) break;\n const bTaper = 1 - (bs / branchSteps) * 0.9;\n ctx.globalAlpha = lineAlpha * taper * bTaper * 0.6;\n ctx.lineWidth = branchWidth * bTaper;\n ctx.beginPath();\n ctx.moveTo(bPrevX, bPrevY);\n ctx.lineTo(bx, by);\n ctx.stroke();\n bPrevX = bx;\n bPrevY = by;\n }\n }\n\n prevX = fx;\n prevY = fy;\n }\n }\n\n // ── 6b. Motion/energy lines — short directional bursts ─────────\n const energyArchetypes = [\"dense-chaotic\", \"cosmic\", \"neon-glow\", \"bold-graphic\"];\n const hasEnergyLines = energyArchetypes.some(a => archetype.name.includes(a)) || rng() < 0.25;\n if (hasEnergyLines && shapePositions.length > 0) {\n const energyCount = 5 + Math.floor(rng() * 10);\n ctx.lineCap = \"round\";\n for (let e = 0; e < energyCount; e++) {\n // Pick a random shape to radiate from\n const source = shapePositions[Math.floor(rng() * shapePositions.length)];\n const burstCount = 2 + Math.floor(rng() * 4);\n const baseAngle = flowAngle(source.x, source.y);\n\n for (let b = 0; b < burstCount; b++) {\n const angle = baseAngle + (rng() - 0.5) * 1.2;\n const lineLen = (source.size * 0.3 + rng() * source.size * 0.5) * scaleFactor * 0.3;\n const startDist = source.size * 0.5;\n const sx = source.x + Math.cos(angle) * startDist;\n const sy = source.y + Math.sin(angle) * startDist;\n const ex = sx + Math.cos(angle) * lineLen;\n const ey = sy + Math.sin(angle) * lineLen;\n\n ctx.globalAlpha = 0.04 + rng() * 0.06;\n ctx.strokeStyle = hexWithAlpha(\n enforceContrast(pickHierarchyColor(colorHierarchy, rng), bgLum), 0.3,\n );\n ctx.lineWidth = (0.5 + rng() * 1.5) * scaleFactor;\n ctx.beginPath();\n ctx.moveTo(sx, sy);\n ctx.lineTo(ex, ey);\n ctx.stroke();\n }\n }\n }\n\n // ── 6c. Apply symmetry mirroring ─────────────────────────────────\n if (symmetryMode !== \"none\") {\n const canvas = ctx.canvas;\n ctx.save();\n if (symmetryMode === \"bilateral-x\" || symmetryMode === \"quad\") {\n ctx.save();\n ctx.translate(width, 0);\n ctx.scale(-1, 1);\n ctx.drawImage(canvas, 0, 0, Math.ceil(cx), height, 0, 0, Math.ceil(cx), height);\n ctx.restore();\n }\n if (symmetryMode === \"bilateral-y\" || symmetryMode === \"quad\") {\n ctx.save();\n ctx.translate(0, height);\n ctx.scale(1, -1);\n ctx.drawImage(canvas, 0, 0, width, Math.ceil(cy), 0, 0, width, Math.ceil(cy));\n ctx.restore();\n }\n ctx.restore();\n }\n\n\n // ── 7. Noise texture overlay — batched via ImageData ─────────────\n const noiseRng = createRng(seedFromHash(gitHash, 777));\n const noiseDensity = Math.floor((width * height) / 800);\n try {\n const imageData = ctx.getImageData(0, 0, width, height);\n const data = imageData.data;\n const pixelScale = Math.max(1, Math.round(scaleFactor));\n for (let i = 0; i < noiseDensity; i++) {\n const nx = Math.floor(noiseRng() * width);\n const ny = Math.floor(noiseRng() * height);\n const brightness = noiseRng() > 0.5 ? 255 : 0;\n const alpha = Math.floor((0.01 + noiseRng() * 0.03) * 255);\n // Write a small block of pixels for scale\n for (let dy = 0; dy < pixelScale && ny + dy < height; dy++) {\n for (let dx = 0; dx < pixelScale && nx + dx < width; dx++) {\n const idx = ((ny + dy) * width + (nx + dx)) * 4;\n // Alpha-blend the noise dot onto existing pixel data\n const srcA = alpha / 255;\n const invA = 1 - srcA;\n data[idx] = Math.round(data[idx] * invA + brightness * srcA);\n data[idx + 1] = Math.round(data[idx + 1] * invA + brightness * srcA);\n data[idx + 2] = Math.round(data[idx + 2] * invA + brightness * srcA);\n // Keep existing alpha\n }\n }\n }\n ctx.putImageData(imageData, 0, 0);\n } catch {\n // Fallback for environments where getImageData isn't available (e.g. some OffscreenCanvas)\n for (let i = 0; i < noiseDensity; i++) {\n const nx = noiseRng() * width;\n const ny = noiseRng() * height;\n const brightness = noiseRng() > 0.5 ? 255 : 0;\n const alpha = 0.01 + noiseRng() * 0.03;\n ctx.globalAlpha = alpha;\n ctx.fillStyle = `rgba(${brightness},${brightness},${brightness},1)`;\n ctx.fillRect(nx, ny, 1 * scaleFactor, 1 * scaleFactor);\n }\n }\n\n // ── 8. Vignette — darken edges to draw the eye inward ───────────\n ctx.globalAlpha = 1;\n const vignetteStrength = 0.25 + rng() * 0.2;\n const vigGrad = ctx.createRadialGradient(cx, cy, Math.min(width, height) * 0.3, cx, cy, bgRadius);\n // Tint vignette based on background: warm sepia for light, cool blue for dark\n const isLightBg = bgLum > 0.5;\n const vignetteColor = isLightBg\n ? `rgba(80,60,30,${vignetteStrength.toFixed(3)})` // warm sepia\n : `rgba(0,0,0,${vignetteStrength.toFixed(3)})`; // classic dark\n vigGrad.addColorStop(0, \"rgba(0,0,0,0)\");\n vigGrad.addColorStop(0.6, \"rgba(0,0,0,0)\");\n vigGrad.addColorStop(1, vignetteColor);\n ctx.fillStyle = vigGrad;\n ctx.fillRect(0, 0, width, height);\n\n // ── 9. Organic connecting curves — proximity-aware ───────────────\n if (shapePositions.length > 1) {\n const numCurves = Math.floor((8 * (width * height)) / (1024 * 1024));\n const maxCurveDist = Math.hypot(width, height) * 0.2; // only connect nearby shapes\n ctx.lineWidth = 0.8 * scaleFactor;\n\n for (let i = 0; i < numCurves; i++) {\n const idxA = Math.floor(rng() * shapePositions.length);\n const offset =\n 1 + Math.floor(rng() * Math.min(5, shapePositions.length - 1));\n const idxB = (idxA + offset) % shapePositions.length;\n\n const a = shapePositions[idxA];\n const b = shapePositions[idxB];\n\n const dx = b.x - a.x;\n const dy = b.y - a.y;\n const dist = Math.hypot(dx, dy);\n\n // Skip connections between distant shapes\n if (dist > maxCurveDist) continue;\n\n const mx = (a.x + b.x) / 2;\n const my = (a.y + b.y) / 2;\n const bulge = (rng() - 0.5) * dist * 0.4;\n\n const cpx = mx + (-dy / (dist || 1)) * bulge;\n const cpy = my + (dx / (dist || 1)) * bulge;\n\n ctx.globalAlpha = 0.06 + rng() * 0.1;\n ctx.strokeStyle = hexWithAlpha(\n enforceContrast(pickHierarchyColor(colorHierarchy, rng), bgLum),\n 0.3,\n );\n\n ctx.beginPath();\n ctx.moveTo(a.x, a.y);\n ctx.quadraticCurveTo(cpx, cpy, b.x, b.y);\n ctx.stroke();\n }\n }\n\n // ── 10. Post-processing ────────────────────────────────────────\n\n // 10a. Color grading — unified tone across the whole image\n // Apply as a semi-transparent overlay in the grade hue\n ctx.globalAlpha = colorGrade.intensity * 0.25;\n ctx.globalCompositeOperation = \"soft-light\";\n const gradeHsl = `hsl(${Math.round(colorGrade.hue)}, 40%, 50%)`;\n ctx.fillStyle = gradeHsl;\n ctx.fillRect(0, 0, width, height);\n ctx.globalCompositeOperation = \"source-over\";\n\n // 10b. Chromatic aberration — subtle RGB channel offset at edges\n // Only apply for neon/cosmic/ethereal archetypes where it fits\n const chromaArchetypes = [\"neon-glow\", \"cosmic\", \"ethereal\"];\n if (chromaArchetypes.includes(archetype.name)) {\n const chromaOffset = Math.ceil(2 * scaleFactor);\n const canvas = ctx.canvas;\n // Shift red channel slightly\n ctx.globalAlpha = 0.03;\n ctx.globalCompositeOperation = \"screen\";\n ctx.drawImage(canvas, chromaOffset, 0, width, height, 0, 0, width, height);\n // Shift blue channel opposite\n ctx.drawImage(canvas, -chromaOffset, 0, width, height, 0, 0, width, height);\n ctx.globalCompositeOperation = \"source-over\";\n }\n\n // 10c. Bloom — soft glow on bright areas for neon/cosmic archetypes\n const bloomArchetypes = [\"neon-glow\", \"cosmic\"];\n if (bloomArchetypes.includes(archetype.name)) {\n const canvas = ctx.canvas;\n ctx.globalAlpha = 0.08;\n ctx.globalCompositeOperation = \"screen\";\n // Draw the image slightly scaled up and blurred via shadow\n ctx.save();\n ctx.shadowBlur = 30 * scaleFactor;\n ctx.shadowColor = \"rgba(255,255,255,0.3)\";\n ctx.drawImage(canvas, 0, 0, width, height);\n ctx.restore();\n ctx.globalCompositeOperation = \"source-over\";\n }\n\n // 10d. Gradient map — map luminance through a two-color gradient\n // Uses dominant→accent as the dark→light ramp for a cohesive tonal look\n if (rng() < 0.35) {\n const gmDark = colorHierarchy.dominant;\n const gmLight = colorHierarchy.accent;\n ctx.globalAlpha = 0.06 + rng() * 0.06; // very subtle: 6-12%\n ctx.globalCompositeOperation = \"color\";\n // Paint a linear gradient from dark color (top) to light color (bottom)\n const gmGrad = ctx.createLinearGradient(0, 0, 0, height);\n gmGrad.addColorStop(0, gmDark);\n gmGrad.addColorStop(1, gmLight);\n ctx.fillStyle = gmGrad;\n ctx.fillRect(0, 0, width, height);\n ctx.globalCompositeOperation = \"source-over\";\n }\n\n // ── 10e. Generative borders — archetype-driven decorative frames ──\n {\n ctx.save();\n ctx.globalAlpha = 1;\n ctx.globalCompositeOperation = \"source-over\";\n const borderRng = createRng(seedFromHash(gitHash, 314));\n const borderPad = Math.min(width, height) * 0.025;\n const borderColor = hexWithAlpha(colorHierarchy.accent, 0.2);\n const borderColorSolid = colorHierarchy.accent;\n const archName = archetype.name;\n\n if (archName.includes(\"geometric\") || archName.includes(\"op-art\") || archName.includes(\"shattered\")) {\n // Clean ruled lines with corner ornaments\n ctx.strokeStyle = borderColor;\n ctx.lineWidth = Math.max(1, 1.5 * scaleFactor);\n ctx.globalAlpha = 0.18 + borderRng() * 0.1;\n\n // Outer rule\n ctx.strokeRect(borderPad, borderPad, width - borderPad * 2, height - borderPad * 2);\n // Inner rule (thinner, offset)\n const innerPad = borderPad * 1.8;\n ctx.lineWidth = Math.max(0.5, 0.8 * scaleFactor);\n ctx.globalAlpha *= 0.7;\n ctx.strokeRect(innerPad, innerPad, width - innerPad * 2, height - innerPad * 2);\n\n // Corner ornaments — small squares at each corner\n const ornSize = borderPad * 0.6;\n ctx.fillStyle = hexWithAlpha(borderColorSolid, 0.12);\n const corners = [\n [borderPad, borderPad],\n [width - borderPad - ornSize, borderPad],\n [borderPad, height - borderPad - ornSize],\n [width - borderPad - ornSize, height - borderPad - ornSize],\n ];\n for (const [cx2, cy2] of corners) {\n ctx.fillRect(cx2, cy2, ornSize, ornSize);\n // Diagonal cross inside ornament\n ctx.beginPath();\n ctx.moveTo(cx2, cy2);\n ctx.lineTo(cx2 + ornSize, cy2 + ornSize);\n ctx.moveTo(cx2 + ornSize, cy2);\n ctx.lineTo(cx2, cy2 + ornSize);\n ctx.stroke();\n }\n } else if (archName.includes(\"botanical\") || archName.includes(\"organic\") || archName.includes(\"watercolor\")) {\n // Vine tendrils — organic curving lines along edges\n ctx.strokeStyle = hexWithAlpha(colorHierarchy.secondary, 0.15);\n ctx.lineWidth = Math.max(0.8, 1.2 * scaleFactor);\n ctx.globalAlpha = 0.12 + borderRng() * 0.08;\n ctx.lineCap = \"round\";\n\n const tendrilCount = 8 + Math.floor(borderRng() * 8);\n for (let t = 0; t < tendrilCount; t++) {\n // Start from a random edge point\n const edge = Math.floor(borderRng() * 4);\n let tx: number, ty: number;\n if (edge === 0) { tx = borderRng() * width; ty = borderPad; }\n else if (edge === 1) { tx = borderRng() * width; ty = height - borderPad; }\n else if (edge === 2) { tx = borderPad; ty = borderRng() * height; }\n else { tx = width - borderPad; ty = borderRng() * height; }\n\n ctx.beginPath();\n ctx.moveTo(tx, ty);\n const segs = 3 + Math.floor(borderRng() * 4);\n for (let s = 0; s < segs; s++) {\n const inward = borderPad * (1 + borderRng() * 2);\n // Curl inward from edge\n const cpx2 = tx + (borderRng() - 0.5) * borderPad * 4;\n const cpy2 = ty + (edge < 2 ? (edge === 0 ? inward : -inward) : 0);\n const cpx3 = tx + (edge >= 2 ? (edge === 2 ? inward : -inward) : (borderRng() - 0.5) * borderPad * 3);\n const cpy3 = ty + (borderRng() - 0.5) * borderPad * 3;\n tx = cpx3;\n ty = cpy3;\n ctx.quadraticCurveTo(cpx2, cpy2, tx, ty);\n }\n ctx.stroke();\n\n // Small leaf/dot at tendril end\n if (borderRng() < 0.6) {\n ctx.beginPath();\n ctx.arc(tx, ty, borderPad * (0.15 + borderRng() * 0.2), 0, Math.PI * 2);\n ctx.fillStyle = hexWithAlpha(colorHierarchy.secondary, 0.08);\n ctx.fill();\n }\n }\n } else if (archName.includes(\"celestial\") || archName.includes(\"cosmic\") || archName.includes(\"neon\")) {\n // Star-studded arcs along edges\n ctx.globalAlpha = 0.1 + borderRng() * 0.08;\n ctx.fillStyle = hexWithAlpha(colorHierarchy.accent, 0.2);\n ctx.strokeStyle = hexWithAlpha(colorHierarchy.accent, 0.12);\n ctx.lineWidth = Math.max(0.5, 0.7 * scaleFactor);\n\n // Subtle arc along top and bottom\n ctx.beginPath();\n ctx.arc(cx, -height * 0.3, height * 0.6, 0.3, Math.PI - 0.3);\n ctx.stroke();\n ctx.beginPath();\n ctx.arc(cx, height * 1.3, height * 0.6, Math.PI + 0.3, -0.3);\n ctx.stroke();\n\n // Scatter small stars along the border region\n const starCount = 15 + Math.floor(borderRng() * 15);\n for (let s = 0; s < starCount; s++) {\n const edge = Math.floor(borderRng() * 4);\n let sx: number, sy: number;\n if (edge === 0) { sx = borderRng() * width; sy = borderPad * (0.5 + borderRng()); }\n else if (edge === 1) { sx = borderRng() * width; sy = height - borderPad * (0.5 + borderRng()); }\n else if (edge === 2) { sx = borderPad * (0.5 + borderRng()); sy = borderRng() * height; }\n else { sx = width - borderPad * (0.5 + borderRng()); sy = borderRng() * height; }\n\n const starR = (1 + borderRng() * 2.5) * scaleFactor;\n // 4-point star\n ctx.beginPath();\n for (let p = 0; p < 8; p++) {\n const a = (p / 8) * Math.PI * 2;\n const r = p % 2 === 0 ? starR : starR * 0.4;\n const px2 = sx + Math.cos(a) * r;\n const py2 = sy + Math.sin(a) * r;\n if (p === 0) ctx.moveTo(px2, py2);\n else ctx.lineTo(px2, py2);\n }\n ctx.closePath();\n ctx.fill();\n }\n } else if (archName.includes(\"minimal\") || archName.includes(\"monochrome\") || archName.includes(\"stipple\")) {\n // Thin single rule — understated elegance\n ctx.strokeStyle = hexWithAlpha(colorHierarchy.dominant, 0.1);\n ctx.lineWidth = Math.max(0.5, 0.6 * scaleFactor);\n ctx.globalAlpha = 0.1 + borderRng() * 0.06;\n ctx.strokeRect(borderPad * 1.5, borderPad * 1.5, width - borderPad * 3, height - borderPad * 3);\n }\n // Other archetypes: no border (intentional — not every image needs one)\n\n ctx.restore();\n }\n\n // ── 11. Signature mark — placed in the least-dense corner ──────\n {\n const sigRng = createRng(seedFromHash(gitHash, 42));\n const sigSize = Math.min(width, height) * 0.025;\n const sigMargin = sigSize * 2.5;\n\n // Find the corner with the lowest local density\n const cornerCandidates = [\n { x: sigMargin, y: sigMargin }, // top-left\n { x: width - sigMargin, y: sigMargin }, // top-right\n { x: sigMargin, y: height - sigMargin }, // bottom-left\n { x: width - sigMargin, y: height - sigMargin }, // bottom-right\n ];\n let bestCorner = cornerCandidates[3]; // default: bottom-right\n let minDensity = Infinity;\n for (const corner of cornerCandidates) {\n const density = spatialGrid.countNear(corner.x, corner.y, sigSize * 5);\n if (density < minDensity) {\n minDensity = density;\n bestCorner = corner;\n }\n }\n\n const sigX = bestCorner.x;\n const sigY = bestCorner.y;\n const sigSegments = 4 + Math.floor(sigRng() * 4); // 4-7 segments\n const sigColor = hexWithAlpha(colorHierarchy.accent, 0.15);\n\n ctx.save();\n ctx.globalAlpha = 0.12 + sigRng() * 0.08;\n ctx.translate(sigX, sigY);\n ctx.strokeStyle = sigColor;\n ctx.fillStyle = hexWithAlpha(colorHierarchy.dominant, 0.06);\n ctx.lineWidth = Math.max(0.5, 0.8 * scaleFactor);\n\n // Outer ring\n ctx.beginPath();\n ctx.arc(0, 0, sigSize, 0, Math.PI * 2);\n ctx.stroke();\n ctx.fill();\n\n // Inner geometric pattern — unique per hash\n ctx.beginPath();\n for (let s = 0; s < sigSegments; s++) {\n const angle1 = sigRng() * Math.PI * 2;\n const angle2 = sigRng() * Math.PI * 2;\n const r1 = sigSize * (0.2 + sigRng() * 0.6);\n const r2 = sigSize * (0.2 + sigRng() * 0.6);\n ctx.moveTo(Math.cos(angle1) * r1, Math.sin(angle1) * r1);\n ctx.lineTo(Math.cos(angle2) * r2, Math.sin(angle2) * r2);\n }\n ctx.stroke();\n\n // Center dot\n ctx.beginPath();\n ctx.arc(0, 0, sigSize * 0.12, 0, Math.PI * 2);\n ctx.fillStyle = sigColor;\n ctx.fill();\n\n ctx.restore();\n }\n\n ctx.globalAlpha = 1;\n\n}\n","import ColorScheme from \"color-scheme\";\nimport \"../../../global.d\";\n\nimport { gitHashToSeed, createRng, seedFromHash } from \"../utils\";\n\n// ── Color variation modes ───────────────────────────────────────────\n// The hash deterministically selects a variation, producing dramatically\n// different palettes from the same hue.\n\nconst COLOR_VARIATIONS = [\n \"soft\",\n \"hard\",\n \"pastel\",\n \"light\",\n \"pale\",\n \"default\",\n] as const;\ntype ColorVariation = (typeof COLOR_VARIATIONS)[number];\n\n/**\n * Pick a color variation mode deterministically from a seed.\n */\nfunction pickVariation(seed: number): ColorVariation {\n return COLOR_VARIATIONS[Math.abs(seed) % COLOR_VARIATIONS.length];\n}\n\n/**\n * Scheme type also varies — some hashes get near-monochromatic palettes,\n * others get high-contrast complementary schemes.\n */\nconst SCHEME_TYPES = [\n \"analogic\",\n \"mono\",\n \"contrast\",\n \"triade\",\n \"tetrade\",\n] as const;\ntype SchemeType = (typeof SCHEME_TYPES)[number];\n\nfunction pickSchemeType(seed: number): SchemeType {\n return SCHEME_TYPES[Math.abs(seed >> 4) % SCHEME_TYPES.length];\n}\n\n\n// ── Temperature contrast ─────────────────────────────────────────\n// Warm hues: 0-60 (red-yellow) and 300-360 (magenta-red)\n// Cool hues: 150-270 (cyan-blue-purple)\n// Neutral: everything else\n\ntype TemperatureMode = \"warm-bg\" | \"cool-bg\" | \"neutral\";\n\nfunction classifyHue(hue: number): \"warm\" | \"cool\" | \"neutral\" {\n if ((hue >= 0 && hue <= 60) || hue >= 300) return \"warm\";\n if (hue >= 150 && hue <= 270) return \"cool\";\n return \"neutral\";\n}\n\n/**\n * Shift a hue toward a target temperature zone.\n * Returns a new hue biased warm or cool.\n */\nfunction shiftHueToward(hue: number, target: \"warm\" | \"cool\", amount: number): number {\n if (target === \"warm\") {\n // Pull toward 30 (orange) — the warmest point\n const warmTarget = 30;\n const diff = ((warmTarget - hue + 540) % 360) - 180;\n return (hue + diff * amount + 360) % 360;\n } else {\n // Pull toward 210 (blue) — the coolest point\n const coolTarget = 210;\n const diff = ((coolTarget - hue + 540) % 360) - 180;\n return (hue + diff * amount + 360) % 360;\n }\n}\n\n// Enhanced color scheme generation for sacred geometry\nexport class SacredColorScheme {\n private seed: number;\n private rng: () => number;\n private variation: ColorVariation;\n private schemeType: SchemeType;\n private temperatureMode: TemperatureMode;\n public baseScheme: string[];\n private complementaryScheme: string[];\n private triadicScheme: string[];\n\n constructor(gitHash: string) {\n this.seed = gitHashToSeed(gitHash);\n this.rng = createRng(seedFromHash(gitHash, 42));\n // Hash-driven variation and scheme type for palette diversity\n this.variation = pickVariation(this.seed);\n this.schemeType = pickSchemeType(this.seed);\n // ~40% warm-bg, ~40% cool-bg, ~20% neutral (no temperature bias)\n const tempRoll = this.rng();\n this.temperatureMode = tempRoll < 0.4 ? \"warm-bg\" : tempRoll < 0.8 ? \"cool-bg\" : \"neutral\";\n this.baseScheme = this.generateBaseScheme();\n this.complementaryScheme = this.generateComplementaryScheme();\n this.triadicScheme = this.generateTriadicScheme();\n }\n\n private generateBaseScheme(): string[] {\n const scheme = new ColorScheme();\n return scheme\n .from_hue(this.seed % 360)\n .scheme(this.schemeType)\n .variation(this.variation)\n .colors()\n .map((hex: string) => `#${hex}`);\n }\n\n private generateComplementaryScheme(): string[] {\n const complementaryHue = (this.seed + 180) % 360;\n // Complementary uses a contrasting variation for tension\n const compVariation =\n this.variation === \"soft\" ? \"hard\" : this.variation === \"pale\" ? \"light\" : this.variation;\n const scheme = new ColorScheme();\n return scheme\n .from_hue(complementaryHue)\n .scheme(\"mono\")\n .variation(compVariation)\n .colors()\n .map((hex: string) => `#${hex}`);\n }\n\n private generateTriadicScheme(): string[] {\n const triadicHue = (this.seed + 120) % 360;\n const scheme = new ColorScheme();\n return scheme\n .from_hue(triadicHue)\n .scheme(\"triade\")\n .variation(this.variation)\n .colors()\n .map((hex: string) => `#${hex}`);\n }\n\n /**\n * Returns a flat array of hash-derived colors suitable for art generation.\n * Combines base analogic, complementary, and triadic schemes for variety\n * while maintaining color harmony.\n */\n getColors(): string[] {\n // Deduplicate and return a rich palette\n const all = [\n ...this.baseScheme.slice(0, 4),\n ...this.complementaryScheme.slice(0, 2),\n ...this.triadicScheme.slice(0, 2),\n ];\n return [...new Set(all)];\n }\n\n /**\n * Returns a palette shaped by the given palette mode.\n * Falls back to getColors() for \"harmonious\".\n */\n getColorsByMode(mode: string): string[] {\n const baseHue = this.seed % 360;\n switch (mode) {\n case \"monochrome\": {\n // Single hue, 5 lightness steps\n const s = 0.5 + this.rng() * 0.3;\n return [0.15, 0.3, 0.45, 0.6, 0.75].map((l) =>\n hslToHex(baseHue, s, l),\n );\n }\n case \"duotone\": {\n // Two contrasting colors + tints\n const hue2 = (baseHue + 150 + this.rng() * 60) % 360;\n return [\n hslToHex(baseHue, 0.7, 0.5),\n hslToHex(baseHue, 0.6, 0.7),\n hslToHex(hue2, 0.7, 0.5),\n hslToHex(hue2, 0.6, 0.7),\n ];\n }\n case \"neon\": {\n // High saturation, vivid colors\n const hues = [baseHue, (baseHue + 90) % 360, (baseHue + 180) % 360, (baseHue + 270) % 360];\n return hues.map((h) => hslToHex(h, 1.0, 0.55 + this.rng() * 0.1));\n }\n case \"pastel-light\": {\n // Soft pastels\n const hues = [baseHue, (baseHue + 60) % 360, (baseHue + 120) % 360, (baseHue + 200) % 360];\n return hues.map((h) => hslToHex(h, 0.4 + this.rng() * 0.2, 0.75 + this.rng() * 0.1));\n }\n case \"earth\": {\n // Warm muted naturals: browns, olives, terracotta, sage\n const earthHues = [25, 35, 45, 80, 150]; // orange-brown to olive to sage\n return earthHues.map((h) =>\n hslToHex(h + this.rng() * 15, 0.25 + this.rng() * 0.2, 0.35 + this.rng() * 0.2),\n );\n }\n case \"high-contrast\": {\n // Black, white, and one accent color\n const accent = hslToHex(baseHue, 0.9, 0.5);\n return [\"#111111\", \"#eeeeee\", accent, hslToHex(baseHue, 0.7, 0.35)];\n }\n case \"split-complementary\": {\n // Base hue + two colors flanking the complement (±30°)\n const comp = (baseHue + 180) % 360;\n const split1 = (comp - 30 + 360) % 360;\n const split2 = (comp + 30) % 360;\n const sat = 0.55 + this.rng() * 0.25;\n return [\n hslToHex(baseHue, sat, 0.5),\n hslToHex(baseHue, sat * 0.8, 0.65),\n hslToHex(split1, sat, 0.5),\n hslToHex(split2, sat, 0.5),\n hslToHex(split1, sat * 0.7, 0.7),\n ];\n }\n case \"analogous-accent\": {\n // Tight cluster of 3 analogous hues + 1 distant accent\n const step = 15 + this.rng() * 20; // 15-35° apart\n const h1 = (baseHue - step + 360) % 360;\n const h2 = (baseHue + step) % 360;\n const accentHue = (baseHue + 150 + this.rng() * 60) % 360;\n const sat = 0.5 + this.rng() * 0.3;\n return [\n hslToHex(baseHue, sat, 0.5),\n hslToHex(h1, sat, 0.55),\n hslToHex(h2, sat, 0.45),\n hslToHex(accentHue, sat + 0.15, 0.5),\n ];\n }\n case \"limited-palette\": {\n // Only 3 colors — like a risograph print\n const h2 = (baseHue + 120 + this.rng() * 40) % 360;\n const h3 = (baseHue + 220 + this.rng() * 40) % 360;\n const sat = 0.6 + this.rng() * 0.2;\n return [\n hslToHex(baseHue, sat, 0.5),\n hslToHex(h2, sat, 0.5),\n hslToHex(h3, sat * 0.9, 0.55),\n ];\n }\n case \"harmonious\":\n default:\n return this.getColors();\n }\n }\n\n /**\n * Returns background colors appropriate for the given palette mode.\n */\n getBackgroundColorsByMode(mode: string): [string, string] {\n switch (mode) {\n case \"pastel-light\":\n return [hslToHex(this.seed % 360, 0.15, 0.92), hslToHex((this.seed + 30) % 360, 0.1, 0.88)];\n case \"high-contrast\":\n case \"monochrome-ink\":\n return [\"#f5f5f0\", \"#e8e8e0\"];\n case \"split-complementary\":\n case \"analogous-accent\":\n return this.getBackgroundColors();\n case \"limited-palette\":\n return [hslToHex(this.seed % 360, 0.08, 0.94), hslToHex((this.seed + 20) % 360, 0.06, 0.90)];\n case \"neon\":\n return [\"#0a0a12\", \"#050510\"];\n case \"earth\":\n return [this.darken(hslToHex(35, 0.3, 0.25), 0.8), this.darken(hslToHex(25, 0.25, 0.2), 0.7)];\n default:\n return this.getBackgroundColors();\n }\n }\n\n /**\n * Returns two background colors derived from the hash — darker variants\n * of the base scheme, temperature-shifted for warm/cool contrast.\n */\n getBackgroundColors(): [string, string] {\n let bg0 = this.baseScheme[0];\n let bg1 = this.baseScheme[1];\n\n if (this.temperatureMode !== \"neutral\") {\n const bgTemp = this.temperatureMode === \"warm-bg\" ? \"warm\" : \"cool\";\n bg0 = this.shiftColorTemperature(bg0, bgTemp, 0.3);\n bg1 = this.shiftColorTemperature(bg1, bgTemp, 0.25);\n }\n\n return [this.darken(bg0, 0.65), this.darken(bg1, 0.55)];\n }\n\n /**\n * Returns the temperature mode so the renderer can apply\n * contrasting temperature to foreground elements.\n */\n getTemperatureMode(): TemperatureMode {\n return this.temperatureMode;\n }\n\n /**\n * Shift a hex color's hue toward warm or cool.\n */\n private shiftColorTemperature(hex: string, target: \"warm\" | \"cool\", amount: number): string {\n const [h, s, l] = hexToHsl(hex);\n const shifted = shiftHueToward(h, target, amount);\n return hslToHex(shifted, s, l);\n }\n\n /**\n * Simple hex color darkening by a factor (0 = black, 1 = unchanged).\n */\n private darken(hex: string, factor: number): string {\n const c = hex.replace(\"#\", \"\");\n const r = Math.round(parseInt(c.substring(0, 2), 16) * factor);\n const g = Math.round(parseInt(c.substring(2, 4), 16) * factor);\n const b = Math.round(parseInt(c.substring(4, 6), 16) * factor);\n return `#${r.toString(16).padStart(2, \"0\")}${g.toString(16).padStart(2, \"0\")}${b.toString(16).padStart(2, \"0\")}`;\n }\n}\n\n// ── Standalone color utilities ──────────────────────────────────────\n\n/** Parse a hex color (#RRGGBB) into [r, g, b] 0-255. */\nfunction hexToRgb(hex: string): [number, number, number] {\n const c = hex.replace(\"#\", \"\");\n return [\n parseInt(c.substring(0, 2), 16),\n parseInt(c.substring(2, 4), 16),\n parseInt(c.substring(4, 6), 16),\n ];\n}\n\n/** Format [r, g, b] back to #RRGGBB. */\nfunction rgbToHex(r: number, g: number, b: number): string {\n const clamp = (v: number) => Math.max(0, Math.min(255, Math.round(v)));\n return `#${clamp(r).toString(16).padStart(2, \"0\")}${clamp(g).toString(16).padStart(2, \"0\")}${clamp(b).toString(16).padStart(2, \"0\")}`;\n}\n\n/** Convert hex to HSL [h 0-360, s 0-1, l 0-1]. */\nfunction hexToHsl(hex: string): [number, number, number] {\n const [r, g, b] = hexToRgb(hex).map((v) => v / 255);\n const max = Math.max(r, g, b);\n const min = Math.min(r, g, b);\n const l = (max + min) / 2;\n if (max === min) return [0, 0, l];\n const d = max - min;\n const s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n let h = 0;\n if (max === r) h = ((g - b) / d + (g < b ? 6 : 0)) / 6;\n else if (max === g) h = ((b - r) / d + 2) / 6;\n else h = ((r - g) / d + 4) / 6;\n return [h * 360, s, l];\n}\n\n/** Convert HSL [h 0-360, s 0-1, l 0-1] back to hex. */\nfunction hslToHex(h: number, s: number, l: number): string {\n h = ((h % 360) + 360) % 360;\n const c = (1 - Math.abs(2 * l - 1)) * s;\n const x = c * (1 - Math.abs(((h / 60) % 2) - 1));\n const m = l - c / 2;\n let r = 0, g = 0, b = 0;\n if (h < 60) { r = c; g = x; }\n else if (h < 120) { r = x; g = c; }\n else if (h < 180) { g = c; b = x; }\n else if (h < 240) { g = x; b = c; }\n else if (h < 300) { r = x; b = c; }\n else { r = c; b = x; }\n return rgbToHex((r + m) * 255, (g + m) * 255, (b + m) * 255);\n}\n\n/**\n * Return a hex color with an alpha component as an rgba() CSS string.\n * `alpha` is 0-1.\n */\nexport function hexWithAlpha(hex: string, alpha: number): string {\n const [r, g, b] = hexToRgb(hex);\n return `rgba(${r},${g},${b},${alpha.toFixed(3)})`;\n}\n\n/**\n * Color hierarchy — assigns dominant/secondary/accent roles to a palette.\n * Dominant gets ~60% of usage, secondary ~25%, accent ~15%.\n */\nexport interface ColorHierarchy {\n dominant: string;\n secondary: string;\n accent: string;\n all: string[];\n}\n\nexport function buildColorHierarchy(colors: string[], rng: () => number): ColorHierarchy {\n if (colors.length < 3) {\n return {\n dominant: colors[0] || \"#888888\",\n secondary: colors[1] || colors[0] || \"#888888\",\n accent: colors[colors.length - 1] || \"#888888\",\n all: colors,\n };\n }\n // Pick dominant as the color with the highest chroma (saturation × distance from gray)\n // This selects the most visually prominent color rather than the average\n const hsls = colors.map((c) => hexToHsl(c));\n let dominantIdx = 0;\n let maxChroma = -1;\n for (let i = 0; i < hsls.length; i++) {\n // Chroma approximation: saturation × how far lightness is from 50% (gray)\n const lightnessVibrancy = 1 - Math.abs(hsls[i][2] - 0.5) * 2; // peaks at L=0.5\n const chroma = hsls[i][1] * lightnessVibrancy;\n if (chroma > maxChroma) { maxChroma = chroma; dominantIdx = i; }\n }\n // Accent is the color most distant from dominant in hue\n let accentIdx = 0;\n let maxDist = 0;\n for (let i = 0; i < hsls.length; i++) {\n if (i === dominantIdx) continue;\n const d = Math.min(Math.abs(hsls[i][0] - hsls[dominantIdx][0]), 360 - Math.abs(hsls[i][0] - hsls[dominantIdx][0]));\n if (d > maxDist) { maxDist = d; accentIdx = i; }\n }\n // Secondary is the remaining color with highest saturation\n let secondaryIdx = 0;\n let maxSat = -1;\n for (let i = 0; i < hsls.length; i++) {\n if (i === dominantIdx || i === accentIdx) continue;\n if (hsls[i][1] > maxSat) { maxSat = hsls[i][1]; secondaryIdx = i; }\n }\n if (secondaryIdx === dominantIdx) secondaryIdx = accentIdx === 0 ? 1 : 0;\n\n return {\n dominant: colors[dominantIdx],\n secondary: colors[secondaryIdx],\n accent: colors[accentIdx],\n all: colors,\n };\n}\n\n/**\n * Pick a color from the hierarchy with weighted probability.\n * ~60% dominant, ~25% secondary, ~15% accent.\n */\nexport function pickHierarchyColor(hierarchy: ColorHierarchy, rng: () => number): string {\n const roll = rng();\n if (roll < 0.60) return hierarchy.dominant;\n if (roll < 0.85) return hierarchy.secondary;\n return hierarchy.accent;\n}\n\n/**\n * HSL-space color jitter — preserves vibrancy better than RGB jitter.\n * Applies small hue wobble + saturation/lightness variation.\n */\nexport function jitterColorHSL(\n hex: string,\n rng: () => number,\n hueAmount = 8,\n slAmount = 0.06,\n): string {\n const [h, s, l] = hexToHsl(hex);\n const newH = (h + (rng() - 0.5) * hueAmount * 2 + 360) % 360;\n const newS = Math.max(0, Math.min(1, s + (rng() - 0.5) * slAmount * 2));\n const newL = Math.max(0, Math.min(1, l + (rng() - 0.5) * slAmount * 2));\n return hslToHex(newH, newS, newL);\n}\n\nexport function jitterColor(\n hex: string,\n rng: () => number,\n amount = 0.1,\n): string {\n const [r, g, b] = hexToRgb(hex);\n const jit = () => (rng() - 0.5) * 2 * amount * 255;\n return rgbToHex(r + jit(), g + jit(), b + jit());\n}\n\n/**\n * Desaturate a hex color by blending toward its luminance gray.\n * `amount` 0 = unchanged, 1 = fully gray.\n */\nexport function desaturate(hex: string, amount: number): string {\n const [r, g, b] = hexToRgb(hex);\n const gray = 0.299 * r + 0.587 * g + 0.114 * b;\n const mix = (c: number) => c + (gray - c) * amount;\n return rgbToHex(mix(r), mix(g), mix(b));\n}\n\n/**\n * Shift a hex color's hue toward warm (orange) or cool (blue).\n * `amount` 0 = unchanged, 1 = fully shifted.\n */\nexport function shiftTemperature(hex: string, target: \"warm\" | \"cool\", amount: number): string {\n const [h, s, l] = hexToHsl(hex);\n return hslToHex(shiftHueToward(h, target, amount), s, l);\n}\n\n/**\n * Compute relative luminance of a hex color (0 = black, 1 = white).\n * Uses the sRGB luminance formula from WCAG.\n */\nexport function luminance(hex: string): number {\n const [r, g, b] = hexToRgb(hex).map((c) => {\n const s = c / 255;\n return s <= 0.03928 ? s / 12.92 : Math.pow((s + 0.055) / 1.055, 2.4);\n });\n return 0.2126 * r + 0.7152 * g + 0.0722 * b;\n}\n\n/**\n * Enforce minimum contrast between a foreground color and a background\n * luminance. On light backgrounds, darkens/saturates the foreground.\n * On dark backgrounds, lightens/saturates the foreground.\n *\n * `bgLuminance` is 0-1 (pre-computed from the background color).\n * `minContrast` is the minimum luminance difference to enforce (default 0.15).\n */\nexport function enforceContrast(\n fgHex: string,\n bgLuminance: number,\n minContrast = 0.15,\n): string {\n const fgLum = luminance(fgHex);\n const diff = Math.abs(fgLum - bgLuminance);\n\n if (diff >= minContrast) return fgHex;\n\n const [h, s, l] = hexToHsl(fgHex);\n\n if (bgLuminance > 0.5) {\n // Light background — darken and boost saturation\n const targetL = Math.max(0.08, l - (minContrast - diff) * 1.5);\n const targetS = Math.min(1, s + 0.2);\n return hslToHex(h, targetS, targetL);\n } else {\n // Dark background — lighten and boost saturation\n const targetL = Math.min(0.92, l + (minContrast - diff) * 1.5);\n const targetS = Math.min(1, s + 0.15);\n return hslToHex(h, targetS, targetL);\n }\n}\n\n/**\n * Apply a unified color grade to a hex color — shifts the entire image\n * toward a cohesive tone. This is the \"Instagram filter\" effect.\n */\nexport function applyColorGrade(\n hex: string,\n gradeHue: number,\n intensity: number,\n): string {\n const [h, s, l] = hexToHsl(hex);\n // Blend hue toward the grade hue\n const hueDiff = ((gradeHue - h + 540) % 360) - 180;\n const newH = (h + hueDiff * intensity * 0.3 + 360) % 360;\n // Slightly unify saturation\n const newS = Math.max(0, Math.min(1, s + (0.5 - s) * intensity * 0.15));\n return hslToHex(newH, newS, l);\n}\n\n/**\n * Compute a deterministic color grade from the hash.\n * Returns a hue (0-360) and intensity (0.15-0.4).\n */\nexport function pickColorGrade(rng: () => number): { hue: number; intensity: number } {\n // Warm golden, cool blue, rosy, teal, amber\n const GRADE_HUES = [40, 220, 340, 175, 30];\n const hue = GRADE_HUES[Math.floor(rng() * GRADE_HUES.length)] + (rng() - 0.5) * 20;\n const intensity = 0.15 + rng() * 0.25;\n return { hue: (hue + 360) % 360, intensity };\n}\n\n/**\n * Rotate the hue of a hex color by a given number of degrees.\n */\nexport function hueRotate(hex: string, degrees: number): string {\n const [h, s, l] = hexToHsl(hex);\n return hslToHex((h + degrees + 360) % 360, s, l);\n}\n\n/**\n * Evolve a color hierarchy for a given layer — shifts hue progressively.\n * Creates atmospheric color perspective (like distant mountains shifting blue).\n */\nexport function evolveHierarchy(\n base: ColorHierarchy,\n layerRatio: number,\n hueShiftPerLayer: number,\n): ColorHierarchy {\n const shift = layerRatio * hueShiftPerLayer;\n return {\n dominant: hueRotate(base.dominant, shift),\n secondary: hueRotate(base.secondary, shift * 0.7),\n accent: hueRotate(base.accent, shift * 0.5),\n all: base.all.map(c => hueRotate(c, shift * 0.6)),\n };\n}\n","declare module 'color-scheme' {\n class ColorScheme {\n from_hue(hue: number): this;\n scheme(name: string): this;\n variation(name: string): this;\n colors(): string[];\n }\n\n export = ColorScheme;\n}\n\n// declare module 'color-scheme';\n","export function gitHashToSeed(gitHash: string): number {\n return parseInt(gitHash.slice(0, 8), 16);\n}\n\n/**\n * Mulberry32 — a fast, high-quality 32-bit seeded PRNG.\n * Returns a function that produces deterministic floats in [0, 1).\n */\nexport function createRng(seed: number): () => number {\n let s = seed | 0;\n return () => {\n s = (s + 0x6d2b79f5) | 0;\n let t = Math.imul(s ^ (s >>> 15), 1 | s);\n t = (t + Math.imul(t ^ (t >>> 7), 61 | t)) ^ t;\n return ((t ^ (t >>> 14)) >>> 0) / 4294967296;\n };\n}\n\n/**\n * Derive a deterministic seed from a hash string and an extra index\n * so each call-site gets its own independent stream.\n */\nexport function seedFromHash(hash: string, offset = 0): number {\n let h = 0;\n for (let i = 0; i < hash.length; i++) {\n h = (Math.imul(31, h) + hash.charCodeAt(i)) | 0;\n }\n return (h + offset) | 0;\n}\n\n/**\n * Legacy helper kept for backward compat — now backed by mulberry32.\n * Prefer createRng() + rng() for new code.\n */\nexport function getRandomFromHash(\n hash: string,\n index: number,\n min: number,\n max: number,\n): number {\n const rng = createRng(seedFromHash(hash, index));\n return min + rng() * (max - min);\n}\n\n// Golden ratio and other important proportions\nexport const Proportions = {\n GOLDEN_RATIO: 1.618034,\n SQUARE_ROOT_2: Math.sqrt(2),\n SQUARE_ROOT_3: Math.sqrt(3),\n SQUARE_ROOT_5: Math.sqrt(5),\n PI: Math.PI,\n PHI: (1 + Math.sqrt(5)) / 2,\n};\n\nexport type ProportionType = keyof typeof Proportions;\n\n// ── Deterministic 2D Simplex Noise ──────────────────────────────────\n// A compact implementation seeded from the RNG so every hash produces\n// a unique noise field without external dependencies.\n\n/**\n * Create a seeded 2D simplex noise function.\n * Returns noise(x, y) → float in approximately [-1, 1].\n */\nexport function createSimplexNoise(rng: () => number): (x: number, y: number) => number {\n // Build a deterministic permutation table (256 entries, doubled)\n const perm = new Uint8Array(512);\n const p = new Uint8Array(256);\n for (let i = 0; i < 256; i++) p[i] = i;\n // Fisher-Yates shuffle with our seeded RNG\n for (let i = 255; i > 0; i--) {\n const j = Math.floor(rng() * (i + 1));\n const tmp = p[i]; p[i] = p[j]; p[j] = tmp;\n }\n for (let i = 0; i < 512; i++) perm[i] = p[i & 255];\n\n // 12 gradient vectors for 2D simplex\n const GRAD2 = [\n [1,1],[-1,1],[1,-1],[-1,-1],\n [1,0],[-1,0],[0,1],[0,-1],\n [1,1],[-1,1],[1,-1],[-1,-1],\n ];\n\n const F2 = 0.5 * (Math.sqrt(3) - 1);\n const G2 = (3 - Math.sqrt(3)) / 6;\n\n function dot2(g: number[], x: number, y: number): number {\n return g[0] * x + g[1] * y;\n }\n\n return function noise2D(xin: number, yin: number): number {\n const s = (xin + yin) * F2;\n const i = Math.floor(xin + s);\n const j = Math.floor(yin + s);\n const t = (i + j) * G2;\n const X0 = i - t;\n const Y0 = j - t;\n const x0 = xin - X0;\n const y0 = yin - Y0;\n\n let i1: number, j1: number;\n if (x0 > y0) { i1 = 1; j1 = 0; }\n else { i1 = 0; j1 = 1; }\n\n const x1 = x0 - i1 + G2;\n const y1 = y0 - j1 + G2;\n const x2 = x0 - 1 + 2 * G2;\n const y2 = y0 - 1 + 2 * G2;\n\n const ii = i & 255;\n const jj = j & 255;\n\n let n0 = 0, n1 = 0, n2 = 0;\n\n let t0 = 0.5 - x0 * x0 - y0 * y0;\n if (t0 >= 0) {\n t0 *= t0;\n const gi0 = perm[ii + perm[jj]] % 12;\n n0 = t0 * t0 * dot2(GRAD2[gi0], x0, y0);\n }\n\n let t1 = 0.5 - x1 * x1 - y1 * y1;\n if (t1 >= 0) {\n t1 *= t1;\n const gi1 = perm[ii + i1 + perm[jj + j1]] % 12;\n n1 = t1 * t1 * dot2(GRAD2[gi1], x1, y1);\n }\n\n let t2 = 0.5 - x2 * x2 - y2 * y2;\n if (t2 >= 0) {\n t2 *= t2;\n const gi2 = perm[ii + 1 + perm[jj + 1]] % 12;\n n2 = t2 * t2 * dot2(GRAD2[gi2], x2, y2);\n }\n\n // Scale to approximately [-1, 1]\n return 70 * (n0 + n1 + n2);\n };\n}\n\n/**\n * Fractal Brownian Motion — layer multiple octaves of noise for richer fields.\n * Returns a function (x, y) → float in approximately [-1, 1].\n */\nexport function createFBM(\n noise: (x: number, y: number) => number,\n octaves = 4,\n lacunarity = 2.0,\n gain = 0.5,\n): (x: number, y: number) => number {\n return function fbm(x: number, y: number): number {\n let value = 0;\n let amplitude = 1;\n let frequency = 1;\n let maxAmp = 0;\n for (let i = 0; i < octaves; i++) {\n value += noise(x * frequency, y * frequency) * amplitude;\n maxAmp += amplitude;\n amplitude *= gain;\n frequency *= lacunarity;\n }\n return value / maxAmp;\n };\n}\n\ninterface Pattern {\n type: string;\n config: any;\n}\n\ninterface LayerConfig {\n baseSize: number;\n baseOpacity?: number;\n opacityReduction?: number;\n rotationOffset?: number;\n proportionType?: ProportionType;\n}\n\n// Pattern combination utilities\nexport class PatternCombiner {\n static getProportionalSize(baseSize: number, proportion: number): number {\n return baseSize * proportion;\n }\n\n static centerPattern(\n ctx: CanvasRenderingContext2D,\n width: number,\n height: number,\n ): void {\n ctx.translate(width / 2, height / 2);\n }\n\n // Combines sacred geometry patterns with proper proportions\n static layerPatterns(\n ctx: CanvasRenderingContext2D,\n patterns: Pattern[],\n config: LayerConfig,\n ): void {\n const {\n baseSize,\n baseOpacity = 0.6,\n opacityReduction = 0.1,\n rotationOffset = 0,\n proportionType = \"GOLDEN_RATIO\",\n } = config;\n\n patterns.forEach((pattern, index) => {\n const size = this.getProportionalSize(\n baseSize,\n Math.pow(Proportions[proportionType], index),\n );\n const opacity = Math.max(0.1, baseOpacity - index * opacityReduction);\n const rotation = rotationOffset * index;\n\n ctx.save();\n ctx.globalAlpha = opacity;\n ctx.rotate((rotation * Math.PI) / 180);\n\n shapes[pattern.type](ctx, size, pattern.config);\n ctx.restore();\n });\n }\n}\n","import { PatternCombiner, ProportionType } from \"../utils\";\nimport { shapes } from \"./shapes\";\n\n// ── Blend modes for layer-level compositing (Feature B) ─────────────\n// These are all standard Canvas 2D globalCompositeOperation values,\n// safe in both Node (@napi-rs/canvas) and browsers.\n\nexport const BLEND_MODES: GlobalCompositeOperation[] = [\n \"source-over\", // default — safe fallback\n \"screen\",\n \"multiply\",\n \"overlay\",\n \"soft-light\",\n \"color-dodge\",\n \"color-burn\",\n \"lighter\",\n];\n\n/**\n * Pick a blend mode deterministically from the RNG.\n * ~40% chance of default source-over to keep some images clean.\n */\nexport function pickBlendMode(rng: () => number): GlobalCompositeOperation {\n if (rng() < 0.4) return \"source-over\";\n return BLEND_MODES[1 + Math.floor(rng() * (BLEND_MODES.length - 1))];\n}\n\n// ── Shape rendering styles (Feature C) ──────────────────────────────\n\nexport type RenderStyle =\n | \"fill-and-stroke\" // classic (current behavior)\n | \"fill-only\" // soft, no outline\n | \"stroke-only\" // wireframe\n | \"double-stroke\" // inner + outer stroke\n | \"dashed\" // dashed outline\n | \"watercolor\" // multiple offset passes at low opacity\n | \"hatched\" // cross-hatch texture fill\n | \"incomplete\" // draw only 60-85% of the stroke path\n | \"stipple\" // dot-fill texture\n | \"stencil\" // negative-space cutout effect\n | \"noise-grain\" // procedural noise grain texture clipped to shape\n | \"wood-grain\" // parallel wavy lines simulating wood\n | \"marble-vein\" // branching vein lines on a soft fill\n | \"fabric-weave\" // interlocking horizontal/vertical threads\n | \"hand-drawn\"; // wobbly hand-drawn edge treatment\n\nconst RENDER_STYLES: RenderStyle[] = [\n \"fill-and-stroke\",\n \"fill-and-stroke\", // weighted: appears twice for higher probability\n \"fill-only\",\n \"stroke-only\",\n \"double-stroke\",\n \"dashed\",\n \"watercolor\",\n \"hatched\",\n \"incomplete\",\n \"stipple\",\n \"stencil\",\n \"noise-grain\",\n \"wood-grain\",\n \"marble-vein\",\n \"fabric-weave\",\n \"hand-drawn\",\n];\n\nexport function pickRenderStyle(rng: () => number): RenderStyle {\n return RENDER_STYLES[Math.floor(rng() * RENDER_STYLES.length)];\n}\n\n// ── Config interfaces ───────────────────────────────────────────────\n\ninterface DrawShapeConfig {\n fillColor: string;\n strokeColor: string;\n strokeWidth: number;\n size: number;\n rotation: number;\n}\n\ninterface EnhanceShapeConfig extends DrawShapeConfig {\n patterns?: Array<{ type: string; config: any }>;\n proportionType?: ProportionType;\n baseOpacity?: number;\n opacityReduction?: number;\n /** If provided, applies a glow (shadowBlur) effect. */\n glowRadius?: number;\n glowColor?: string;\n /** If provided, fills with a radial gradient between two colors. */\n gradientFillEnd?: string;\n /** Rendering style — controls fill/stroke treatment. */\n renderStyle?: RenderStyle;\n /** RNG for watercolor jitter (required for \"watercolor\" style). */\n rng?: () => number;\n /** Light direction angle in radians — used for shadow & highlight. */\n lightAngle?: number;\n /** Scale factor for resolution-independent sizing. */\n scaleFactor?: number;\n}\n\nexport function drawShape(\n ctx: CanvasRenderingContext2D,\n shape: string,\n x: number,\n y: number,\n config: DrawShapeConfig,\n) {\n const { fillColor, strokeColor, strokeWidth, size, rotation } = config;\n ctx.save();\n ctx.translate(x, y);\n ctx.rotate((rotation * Math.PI) / 180);\n ctx.fillStyle = fillColor;\n ctx.strokeStyle = strokeColor;\n ctx.lineWidth = strokeWidth;\n\n const drawFunction = shapes[shape];\n if (drawFunction) {\n drawFunction(ctx, size);\n ctx.fill();\n ctx.stroke();\n }\n\n ctx.restore();\n}\n\n/**\n * Apply the chosen render style to the current path.\n */\nfunction applyRenderStyle(\n ctx: CanvasRenderingContext2D,\n style: RenderStyle,\n fillColor: string,\n strokeColor: string,\n strokeWidth: number,\n size: number,\n rng?: () => number,\n): void {\n switch (style) {\n case \"fill-only\":\n ctx.fill();\n break;\n\n case \"stroke-only\":\n ctx.fill(); // transparent fill to define the path\n ctx.globalAlpha *= 0.3; // ghost fill\n ctx.fill();\n ctx.globalAlpha /= 0.3;\n ctx.stroke();\n break;\n\n case \"double-stroke\": {\n ctx.fill();\n // Outer stroke\n ctx.lineWidth = strokeWidth * 2;\n ctx.globalAlpha *= 0.5;\n ctx.stroke();\n ctx.globalAlpha /= 0.5;\n // Inner stroke\n ctx.lineWidth = strokeWidth * 0.5;\n ctx.strokeStyle = fillColor;\n ctx.stroke();\n break;\n }\n\n case \"dashed\":\n ctx.fill();\n ctx.setLineDash([size * 0.05, size * 0.03]);\n ctx.stroke();\n ctx.setLineDash([]);\n break;\n\n case \"watercolor\": {\n // Improved watercolor: edge darkening + radial bleed + layered washes\n const passes = 4 + (rng ? Math.floor(rng() * 2) : 0);\n const savedAlpha = ctx.globalAlpha;\n\n // Pass 1: Base wash — large, soft fill at low opacity\n ctx.globalAlpha = savedAlpha * 0.15;\n ctx.save();\n const baseScale = 1.08 + (rng ? rng() * 0.04 : 0);\n ctx.scale(baseScale, baseScale);\n ctx.fill();\n ctx.restore();\n\n // Pass 2: Multiple offset washes with radial displacement\n ctx.globalAlpha = savedAlpha * (0.25 / passes * 2);\n for (let p = 0; p < passes; p++) {\n // Radial outward displacement (not uniform) for organic bleed\n const angle = rng ? rng() * Math.PI * 2 : p * Math.PI / 2;\n const dist = rng ? rng() * size * 0.05 : size * 0.02;\n const jx = Math.cos(angle) * dist;\n const jy = Math.sin(angle) * dist;\n ctx.save();\n ctx.translate(jx, jy);\n ctx.fill();\n ctx.restore();\n }\n\n // Pass 3: Edge darkening — draw a slightly smaller shape with lighter fill\n // to simulate pigment pooling at boundaries\n ctx.globalAlpha = savedAlpha * 0.35;\n ctx.save();\n const innerScale = 0.85 + (rng ? rng() * 0.08 : 0);\n ctx.scale(innerScale, innerScale);\n // Lighten the fill for the inner area\n const origFill = ctx.fillStyle;\n if (typeof fillColor === \"string\") {\n ctx.fillStyle = fillColor.replace(/[\\d.]+\\)$/, (m) => {\n const v = parseFloat(m);\n return Math.min(1, v * 1.4).toFixed(2) + \")\";\n });\n }\n ctx.fill();\n ctx.fillStyle = origFill;\n ctx.restore();\n\n // Pass 4: Organic edge erosion — irregular bites along the boundary\n if (rng && size > 20) {\n const erosionBites = 6 + Math.floor(rng() * 8);\n const edgeRadius = size * 0.45;\n ctx.save();\n ctx.globalCompositeOperation = \"destination-out\";\n ctx.globalAlpha = 0.6 + rng() * 0.3;\n for (let eb = 0; eb < erosionBites; eb++) {\n const biteAngle = rng() * Math.PI * 2;\n const biteDist = edgeRadius * (0.85 + rng() * 0.25);\n const biteR = size * (0.02 + rng() * 0.04);\n ctx.beginPath();\n ctx.arc(\n Math.cos(biteAngle) * biteDist,\n Math.sin(biteAngle) * biteDist,\n biteR, 0, Math.PI * 2,\n );\n ctx.fill();\n }\n ctx.restore();\n }\n\n ctx.globalAlpha = savedAlpha;\n // Soft stroke on top — thinner than normal for delicacy\n ctx.globalAlpha *= 0.25;\n ctx.lineWidth = strokeWidth * 0.6;\n ctx.stroke();\n ctx.globalAlpha /= 0.25;\n break;\n }\n\n case \"hatched\": {\n // Fill normally at reduced opacity, then overlay cross-hatch lines\n const savedAlphaH = ctx.globalAlpha;\n ctx.globalAlpha = savedAlphaH * 0.3;\n ctx.fill();\n ctx.globalAlpha = savedAlphaH;\n\n // Clip to shape, then draw hatch lines\n ctx.save();\n ctx.clip();\n const hatchSpacing = Math.max(3, size * 0.06);\n const hatchAngle = rng ? rng() * Math.PI : Math.PI / 4;\n ctx.lineWidth = Math.max(0.5, strokeWidth * 0.4);\n ctx.globalAlpha = savedAlphaH * 0.6;\n\n // Draw parallel lines across the bounding box\n const extent = size * 0.8;\n const cos = Math.cos(hatchAngle);\n const sin = Math.sin(hatchAngle);\n for (let d = -extent; d <= extent; d += hatchSpacing) {\n ctx.beginPath();\n ctx.moveTo(d * cos - extent * sin, d * sin + extent * cos);\n ctx.lineTo(d * cos + extent * sin, d * sin - extent * cos);\n ctx.stroke();\n }\n // Second pass at perpendicular angle for cross-hatch (~50% chance)\n if (!rng || rng() < 0.5) {\n const crossAngle = hatchAngle + Math.PI / 2;\n const cos2 = Math.cos(crossAngle);\n const sin2 = Math.sin(crossAngle);\n ctx.globalAlpha = savedAlphaH * 0.35;\n for (let d = -extent; d <= extent; d += hatchSpacing * 1.4) {\n ctx.beginPath();\n ctx.moveTo(d * cos2 - extent * sin2, d * sin2 + extent * cos2);\n ctx.lineTo(d * cos2 + extent * sin2, d * sin2 - extent * cos2);\n ctx.stroke();\n }\n }\n ctx.restore();\n ctx.globalAlpha = savedAlphaH;\n // Outline stroke\n ctx.globalAlpha *= 0.5;\n ctx.stroke();\n ctx.globalAlpha /= 0.5;\n break;\n }\n\n case \"incomplete\": {\n // Draw the fill at low opacity, then a dashed stroke that\n // simulates drawing only part of the outline\n const savedAlphaI = ctx.globalAlpha;\n ctx.globalAlpha = savedAlphaI * 0.25;\n ctx.fill();\n ctx.globalAlpha = savedAlphaI;\n\n // Use a long dash pattern where gaps create the \"incomplete\" look\n const completeness = rng ? 0.6 + rng() * 0.25 : 0.7; // 60-85%\n const segLen = size * 0.12;\n const gapLen = segLen * ((1 - completeness) / completeness);\n ctx.setLineDash([segLen, gapLen]);\n // Offset the dash so each shape starts at a different point\n ctx.lineDashOffset = rng ? rng() * segLen * 4 : 0;\n // Slightly thicker stroke for hand-drawn feel\n ctx.lineWidth = strokeWidth * 1.3;\n ctx.stroke();\n ctx.setLineDash([]);\n ctx.lineDashOffset = 0;\n break;\n }\n\n case \"stipple\": {\n // Dot-fill texture — clip to shape, then scatter dots\n const savedAlphaS = ctx.globalAlpha;\n ctx.globalAlpha = savedAlphaS * 0.15;\n ctx.fill(); // ghost fill\n ctx.globalAlpha = savedAlphaS;\n\n ctx.save();\n ctx.clip();\n const dotSpacing = Math.max(2, size * 0.03);\n const extent = size * 0.55;\n ctx.globalAlpha = savedAlphaS * 0.7;\n for (let dx = -extent; dx <= extent; dx += dotSpacing) {\n for (let dy = -extent; dy <= extent; dy += dotSpacing) {\n // Jitter each dot position for organic feel\n const jx = rng ? (rng() - 0.5) * dotSpacing * 0.6 : 0;\n const jy = rng ? (rng() - 0.5) * dotSpacing * 0.6 : 0;\n const dotR = rng ? dotSpacing * (0.15 + rng() * 0.2) : dotSpacing * 0.2;\n ctx.beginPath();\n ctx.arc(dx + jx, dy + jy, dotR, 0, Math.PI * 2);\n ctx.fill();\n }\n }\n ctx.restore();\n ctx.globalAlpha = savedAlphaS;\n // Outline\n ctx.globalAlpha *= 0.4;\n ctx.stroke();\n ctx.globalAlpha /= 0.4;\n break;\n }\n\n case \"stencil\": {\n // Negative-space cutout — fill a rectangle, then erase the shape\n const savedAlphaSt = ctx.globalAlpha;\n // Fill a bounding area with the stroke color\n ctx.globalAlpha = savedAlphaSt * 0.5;\n ctx.fillStyle = strokeColor;\n ctx.fillRect(-size * 0.6, -size * 0.6, size * 1.2, size * 1.2);\n // Cut out the shape using destination-out\n ctx.globalCompositeOperation = \"destination-out\";\n ctx.globalAlpha = 1;\n ctx.fill();\n ctx.globalCompositeOperation = \"source-over\";\n ctx.globalAlpha = savedAlphaSt;\n // Subtle outline of the cutout\n ctx.globalAlpha *= 0.3;\n ctx.stroke();\n ctx.globalAlpha /= 0.3;\n break;\n }\n\n case \"noise-grain\": {\n // Procedural noise grain texture clipped to shape boundary\n const savedAlphaN = ctx.globalAlpha;\n ctx.globalAlpha = savedAlphaN * 0.25;\n ctx.fill(); // base tint\n ctx.globalAlpha = savedAlphaN;\n\n ctx.save();\n ctx.clip();\n const grainSpacing = Math.max(1.5, size * 0.015);\n const extentN = size * 0.55;\n ctx.globalAlpha = savedAlphaN * 0.6;\n for (let gx = -extentN; gx <= extentN; gx += grainSpacing) {\n for (let gy = -extentN; gy <= extentN; gy += grainSpacing) {\n if (!rng) break;\n const jx = (rng() - 0.5) * grainSpacing * 1.2;\n const jy = (rng() - 0.5) * grainSpacing * 1.2;\n const brightness = rng() > 0.5 ? 255 : 0;\n const dotAlpha = 0.15 + rng() * 0.35;\n ctx.globalAlpha = savedAlphaN * dotAlpha;\n ctx.fillStyle = `rgba(${brightness},${brightness},${brightness},1)`;\n const dotSize = grainSpacing * (0.3 + rng() * 0.5);\n ctx.fillRect(gx + jx, gy + jy, dotSize, dotSize);\n }\n }\n ctx.restore();\n ctx.fillStyle = fillColor;\n ctx.globalAlpha = savedAlphaN;\n ctx.globalAlpha *= 0.4;\n ctx.stroke();\n ctx.globalAlpha /= 0.4;\n break;\n }\n\n case \"wood-grain\": {\n // Parallel wavy lines simulating wood grain, clipped to shape\n const savedAlphaW = ctx.globalAlpha;\n ctx.globalAlpha = savedAlphaW * 0.2;\n ctx.fill(); // base tint\n ctx.globalAlpha = savedAlphaW;\n\n ctx.save();\n ctx.clip();\n const grainLineSpacing = Math.max(2, size * 0.035);\n const extentW = size * 0.55;\n const waveFreq = rng ? 3 + rng() * 5 : 5;\n const waveAmp = rng ? size * (0.01 + rng() * 0.03) : size * 0.02;\n const grainAngle = rng ? rng() * Math.PI : Math.PI * 0.25;\n ctx.lineWidth = Math.max(0.5, strokeWidth * 0.3);\n ctx.globalAlpha = savedAlphaW * 0.5;\n\n const cosG = Math.cos(grainAngle);\n const sinG = Math.sin(grainAngle);\n for (let d = -extentW; d <= extentW; d += grainLineSpacing) {\n ctx.beginPath();\n for (let t = -extentW; t <= extentW; t += 2) {\n const wave = Math.sin((t / extentW) * waveFreq * Math.PI) * waveAmp;\n const px = t * cosG - (d + wave) * sinG;\n const py = t * sinG + (d + wave) * cosG;\n if (t === -extentW) ctx.moveTo(px, py);\n else ctx.lineTo(px, py);\n }\n ctx.stroke();\n }\n ctx.restore();\n ctx.globalAlpha = savedAlphaW;\n ctx.globalAlpha *= 0.35;\n ctx.stroke();\n ctx.globalAlpha /= 0.35;\n break;\n }\n\n case \"marble-vein\": {\n // Branching vein lines on a soft fill, clipped to shape\n const savedAlphaM = ctx.globalAlpha;\n ctx.globalAlpha = savedAlphaM * 0.35;\n ctx.fill(); // soft base\n ctx.globalAlpha = savedAlphaM;\n\n ctx.save();\n ctx.clip();\n const veinCount = rng ? 2 + Math.floor(rng() * 3) : 3;\n const extentM = size * 0.45;\n ctx.lineWidth = Math.max(0.5, strokeWidth * 0.5);\n ctx.globalAlpha = savedAlphaM * 0.4;\n\n for (let v = 0; v < veinCount; v++) {\n const startX = rng ? (rng() - 0.5) * extentM * 2 : 0;\n const startY = rng ? -extentM + rng() * extentM * 0.5 : -extentM;\n let vx = startX;\n let vy = startY;\n const steps = 15 + (rng ? Math.floor(rng() * 15) : 10);\n const stepLen = size * 0.04;\n\n ctx.beginPath();\n ctx.moveTo(vx, vy);\n for (let s = 0; s < steps; s++) {\n const drift = rng ? (rng() - 0.5) * stepLen * 1.5 : 0;\n vx += drift;\n vy += stepLen;\n ctx.lineTo(vx, vy);\n // Branch ~20% of the time\n if (rng && rng() < 0.2 && s > 2 && s < steps - 3) {\n const branchDir = rng() < 0.5 ? -1 : 1;\n let bx = vx;\n let by = vy;\n const bSteps = 3 + Math.floor(rng() * 5);\n ctx.moveTo(bx, by);\n for (let bs = 0; bs < bSteps; bs++) {\n bx += branchDir * stepLen * (0.5 + rng() * 0.5);\n by += stepLen * 0.6;\n ctx.lineTo(bx, by);\n }\n ctx.moveTo(vx, vy); // return to main vein\n }\n }\n ctx.stroke();\n }\n ctx.restore();\n ctx.globalAlpha = savedAlphaM;\n ctx.globalAlpha *= 0.3;\n ctx.stroke();\n ctx.globalAlpha /= 0.3;\n break;\n }\n\n case \"fabric-weave\": {\n // Interlocking horizontal/vertical threads clipped to shape\n const savedAlphaF = ctx.globalAlpha;\n ctx.globalAlpha = savedAlphaF * 0.15;\n ctx.fill(); // ghost base\n ctx.globalAlpha = savedAlphaF;\n\n ctx.save();\n ctx.clip();\n const threadSpacing = Math.max(2, size * 0.04);\n const extentF = size * 0.55;\n ctx.lineWidth = Math.max(0.8, threadSpacing * 0.5);\n ctx.globalAlpha = savedAlphaF * 0.55;\n\n // Horizontal threads\n for (let y = -extentF; y <= extentF; y += threadSpacing * 2) {\n ctx.beginPath();\n ctx.moveTo(-extentF, y);\n ctx.lineTo(extentF, y);\n ctx.stroke();\n }\n // Vertical threads (offset by half spacing for weave effect)\n ctx.globalAlpha = savedAlphaF * 0.45;\n ctx.strokeStyle = fillColor;\n for (let x = -extentF; x <= extentF; x += threadSpacing * 2) {\n ctx.beginPath();\n for (let y = -extentF; y <= extentF; y += threadSpacing * 2) {\n // Over-under: draw segment, skip segment\n ctx.moveTo(x, y);\n ctx.lineTo(x, y + threadSpacing);\n }\n ctx.stroke();\n }\n ctx.strokeStyle = strokeColor;\n ctx.restore();\n ctx.globalAlpha = savedAlphaF;\n ctx.globalAlpha *= 0.3;\n ctx.stroke();\n ctx.globalAlpha /= 0.3;\n break;\n }\n\n case \"hand-drawn\": {\n // Wobbly hand-drawn edge treatment — fill normally, then redraw\n // the outline with perturbed control points for a sketchy feel\n const savedAlphaHD = ctx.globalAlpha;\n ctx.globalAlpha = savedAlphaHD * 0.85;\n ctx.fill();\n ctx.globalAlpha = savedAlphaHD;\n\n // Draw 2-3 slightly offset wobbly strokes for a sketchy look\n const wobblePasses = 2 + (rng ? Math.floor(rng() * 2) : 0);\n ctx.lineWidth = strokeWidth * 0.8;\n for (let wp = 0; wp < wobblePasses; wp++) {\n ctx.globalAlpha = savedAlphaHD * (0.4 - wp * 0.1);\n ctx.save();\n // Slight random offset per pass\n const wobbleX = rng ? (rng() - 0.5) * size * 0.02 : 0;\n const wobbleY = rng ? (rng() - 0.5) * size * 0.02 : 0;\n ctx.translate(wobbleX, wobbleY);\n // Slightly different scale per pass for edge variation\n const wobbleScale = 1 + (rng ? (rng() - 0.5) * 0.03 : 0);\n ctx.scale(wobbleScale, wobbleScale);\n ctx.stroke();\n ctx.restore();\n }\n\n // Organic edge erosion — small irregular bites for rough paper feel\n if (rng && size > 20) {\n const erosionBites = 4 + Math.floor(rng() * 6);\n const edgeRadius = size * 0.42;\n ctx.save();\n ctx.globalCompositeOperation = \"destination-out\";\n ctx.globalAlpha = 0.5 + rng() * 0.3;\n for (let eb = 0; eb < erosionBites; eb++) {\n const biteAngle = rng() * Math.PI * 2;\n const biteDist = edgeRadius * (0.9 + rng() * 0.2);\n const biteR = size * (0.015 + rng() * 0.03);\n ctx.beginPath();\n ctx.arc(\n Math.cos(biteAngle) * biteDist,\n Math.sin(biteAngle) * biteDist,\n biteR, 0, Math.PI * 2,\n );\n ctx.fill();\n }\n ctx.restore();\n }\n\n ctx.globalAlpha = savedAlphaHD;\n break;\n }\n\n case \"fill-and-stroke\":\n default:\n ctx.fill();\n ctx.stroke();\n break;\n }\n}\n\n/**\n * Enhanced shape drawing with glow, gradient fills, blend modes,\n * render style variety, and pattern layering.\n */\nexport function enhanceShapeGeneration(\n ctx: CanvasRenderingContext2D,\n shape: string,\n x: number,\n y: number,\n config: EnhanceShapeConfig,\n) {\n const {\n fillColor,\n strokeColor,\n strokeWidth,\n size,\n rotation,\n patterns = [],\n proportionType = \"GOLDEN_RATIO\",\n baseOpacity = 0.6,\n opacityReduction = 0.1,\n glowRadius = 0,\n glowColor,\n gradientFillEnd,\n renderStyle = \"fill-and-stroke\",\n rng,\n lightAngle,\n scaleFactor = 1,\n } = config;\n\n ctx.save();\n ctx.translate(x, y);\n ctx.rotate((rotation * Math.PI) / 180);\n\n // ── Drop shadow — soft colored shadow offset along light direction ──\n if (lightAngle !== undefined && size > 10) {\n const shadowDist = size * 0.035;\n const shadowBlurR = size * 0.06;\n ctx.shadowOffsetX = Math.cos(lightAngle + Math.PI) * shadowDist;\n ctx.shadowOffsetY = Math.sin(lightAngle + Math.PI) * shadowDist;\n ctx.shadowBlur = shadowBlurR;\n ctx.shadowColor = \"rgba(0,0,0,0.12)\";\n } else if (glowRadius > 0) {\n // Glow / shadow effect (legacy path)\n ctx.shadowBlur = glowRadius;\n ctx.shadowColor = glowColor || fillColor;\n ctx.shadowOffsetX = 0;\n ctx.shadowOffsetY = 0;\n }\n\n // Gradient fill or flat fill\n if (gradientFillEnd) {\n const grad = ctx.createRadialGradient(0, 0, 0, 0, 0, size / 2);\n grad.addColorStop(0, fillColor);\n grad.addColorStop(1, gradientFillEnd);\n ctx.fillStyle = grad;\n } else {\n ctx.fillStyle = fillColor;\n }\n\n ctx.strokeStyle = strokeColor;\n ctx.lineWidth = strokeWidth;\n\n const drawFunction = shapes[shape];\n if (drawFunction) {\n drawFunction(ctx, size, { rng });\n applyRenderStyle(ctx, renderStyle, fillColor, strokeColor, strokeWidth, size, rng);\n }\n\n // Reset shadow so patterns and highlight aren't double-shadowed\n ctx.shadowBlur = 0;\n ctx.shadowOffsetX = 0;\n ctx.shadowOffsetY = 0;\n ctx.shadowColor = \"transparent\";\n\n // ── Specular highlight — tinted arc on the light-facing side ──\n if (lightAngle !== undefined && size > 15 && rng) {\n const hlRadius = size * 0.35;\n const hlDist = size * 0.15;\n const hlX = Math.cos(lightAngle) * hlDist;\n const hlY = Math.sin(lightAngle) * hlDist;\n const hlGrad = ctx.createRadialGradient(hlX, hlY, 0, hlX, hlY, hlRadius);\n // Tint highlight warm/cool based on fill color for cohesion\n // Parse fill to detect warmth — fallback to white for non-parseable\n let hlBase = \"255,255,255\";\n if (typeof fillColor === \"string\" && fillColor.startsWith(\"#\") && fillColor.length >= 7) {\n const r = parseInt(fillColor.slice(1, 3), 16);\n const g = parseInt(fillColor.slice(3, 5), 16);\n const b = parseInt(fillColor.slice(5, 7), 16);\n // Blend toward white but keep a hint of the fill's warmth\n hlBase = `${Math.round(r * 0.15 + 255 * 0.85)},${Math.round(g * 0.15 + 255 * 0.85)},${Math.round(b * 0.15 + 255 * 0.85)}`;\n }\n hlGrad.addColorStop(0, `rgba(${hlBase},0.18)`);\n hlGrad.addColorStop(0.5, `rgba(${hlBase},0.05)`);\n hlGrad.addColorStop(1, `rgba(${hlBase},0)`);\n const savedOp = ctx.globalCompositeOperation;\n ctx.globalCompositeOperation = \"soft-light\";\n ctx.fillStyle = hlGrad;\n ctx.beginPath();\n ctx.arc(hlX, hlY, hlRadius, 0, Math.PI * 2);\n ctx.fill();\n ctx.globalCompositeOperation = savedOp;\n }\n\n // Layer additional patterns if specified\n if (patterns.length > 0) {\n PatternCombiner.layerPatterns(ctx, patterns, {\n baseSize: size,\n baseOpacity,\n opacityReduction,\n proportionType,\n });\n }\n\n ctx.restore();\n}\n\n// ── Shape mirroring effect ──────────────────────────────────────────\n// Draws a shape and its mirror (reflected across an axis) for visual\n// symmetry. Works especially well with basic shapes like triangles,\n// crescents, and penrose tiles.\n\nexport type MirrorAxis = \"horizontal\" | \"vertical\" | \"diagonal\" | \"radial-4\";\n\n/**\n * Draw a shape with a mirrored reflection.\n * The mirror is drawn at reduced opacity with optional offset.\n */\nexport function drawMirroredShape(\n ctx: CanvasRenderingContext2D,\n shape: string,\n x: number,\n y: number,\n config: EnhanceShapeConfig & { mirrorAxis?: MirrorAxis; mirrorGap?: number },\n): void {\n const { mirrorAxis = \"horizontal\", mirrorGap = 0 } = config;\n\n // Draw the primary shape\n enhanceShapeGeneration(ctx, shape, x, y, config);\n\n // Draw the mirrored copy\n ctx.save();\n const savedAlpha = ctx.globalAlpha;\n ctx.globalAlpha = savedAlpha * 0.7; // mirror is slightly softer\n\n switch (mirrorAxis) {\n case \"horizontal\":\n // Reflect across vertical axis at shape position\n enhanceShapeGeneration(ctx, shape, x, y + mirrorGap, {\n ...config,\n rotation: -(config.rotation || 0),\n size: config.size * 0.95,\n });\n break;\n case \"vertical\":\n enhanceShapeGeneration(ctx, shape, x + mirrorGap, y, {\n ...config,\n rotation: 180 - (config.rotation || 0),\n size: config.size * 0.95,\n });\n break;\n case \"diagonal\":\n // Reflect across 45° axis\n enhanceShapeGeneration(ctx, shape, x + mirrorGap * 0.7, y + mirrorGap * 0.7, {\n ...config,\n rotation: 90 - (config.rotation || 0),\n size: config.size * 0.9,\n });\n break;\n case \"radial-4\":\n // Four-way radial mirror\n for (let i = 1; i < 4; i++) {\n const angle = (i / 4) * Math.PI * 2;\n const mx = x + Math.cos(angle) * mirrorGap;\n const my = y + Math.sin(angle) * mirrorGap;\n ctx.globalAlpha = savedAlpha * (0.7 - i * 0.1);\n enhanceShapeGeneration(ctx, shape, mx, my, {\n ...config,\n rotation: (config.rotation || 0) + i * 90,\n size: config.size * (0.95 - i * 0.05),\n });\n }\n break;\n }\n\n ctx.globalAlpha = savedAlpha;\n ctx.restore();\n}\n\n/**\n * Pick a mirror axis deterministically.\n * Returns null ~60% of the time (no mirroring).\n */\nexport function pickMirrorAxis(rng: () => number): MirrorAxis | null {\n const roll = rng();\n if (roll < 0.60) return null;\n if (roll < 0.75) return \"horizontal\";\n if (roll < 0.87) return \"vertical\";\n if (roll < 0.95) return \"diagonal\";\n return \"radial-4\";\n}\n","import { basicShapes } from \"./basic\";\nimport { complexShapes } from \"./complex\";\nimport { sacredShapes } from \"./sacred\";\nimport { proceduralShapes } from \"./procedural\";\n\ntype DrawFunction = (\n ctx: CanvasRenderingContext2D,\n size: number,\n config?: any,\n) => void;\n\nexport const shapes: Record<string, DrawFunction> = {\n ...basicShapes,\n ...complexShapes,\n ...sacredShapes,\n ...proceduralShapes,\n};\n","type DrawFunction = (ctx: CanvasRenderingContext2D, size: number) => void;\n\nexport const drawCircle: DrawFunction = (ctx, size) => {\n ctx.beginPath();\n ctx.arc(0, 0, size / 2, 0, Math.PI * 2);\n};\n\nexport const drawSquare: DrawFunction = (ctx, size) => {\n ctx.beginPath();\n ctx.rect(-size / 2, -size / 2, size, size);\n};\n\nexport const drawTriangle: DrawFunction = (ctx, size) => {\n ctx.beginPath();\n ctx.moveTo(0, -size / 2);\n ctx.lineTo(-size / 2, size / 2);\n ctx.lineTo(size / 2, size / 2);\n ctx.closePath();\n};\n\nexport const drawHexagon: DrawFunction = (ctx, size) => {\n ctx.beginPath();\n for (let i = 0; i < 6; i++) {\n const angle = ((Math.PI * 2) / 6) * i;\n const x = (size / 2) * Math.cos(angle);\n const y = (size / 2) * Math.sin(angle);\n if (i === 0) ctx.moveTo(x, y);\n else ctx.lineTo(x, y);\n }\n ctx.closePath();\n};\n\nexport const drawStar: DrawFunction = (ctx, size) => {\n ctx.beginPath();\n for (let i = 0; i < 10; i++) {\n const angle = Math.PI / 5 + (Math.PI / 5) * i * 3;\n const radius = i % 2 === 0 ? size / 2 : size / 4;\n const x = radius * Math.cos(angle);\n const y = radius * Math.sin(angle);\n if (i === 0) ctx.moveTo(x, y);\n else ctx.lineTo(x, y);\n }\n ctx.closePath();\n};\n\nexport const drawJackedStar: DrawFunction = (ctx, size) => {\n ctx.beginPath();\n for (let i = 0; i < 10; i++) {\n const angle = Math.PI / 30 + (Math.PI / 30) * i * 8;\n const radius = i % 2 === 0 ? size / 2 : size / 8;\n const x = radius * Math.cos(angle);\n const y = radius * Math.sin(angle);\n if (i === 0) ctx.moveTo(x, y);\n else ctx.lineTo(x, y);\n }\n ctx.closePath();\n};\n\nexport const drawHeart: DrawFunction = (ctx, size) => {\n ctx.beginPath();\n ctx.moveTo(0, size / 4);\n ctx.quadraticCurveTo(size / 2, size / 4, 0, -size / 4);\n ctx.quadraticCurveTo(-size / 2, size / 4, 0, size / 4);\n};\n\nexport const drawDiamond: DrawFunction = (ctx, size) => {\n ctx.beginPath();\n ctx.moveTo(0, -size / 2);\n ctx.lineTo(size / 2, 0);\n ctx.lineTo(0, size / 2);\n ctx.lineTo(-size / 2, 0);\n ctx.closePath();\n};\n\nexport const drawCube: DrawFunction = (ctx, size) => {\n ctx.beginPath();\n ctx.moveTo(-size / 2, -size / 2);\n ctx.lineTo(size / 2, -size / 2);\n ctx.lineTo(size / 2, size / 2);\n ctx.lineTo(-size / 2, size / 2);\n ctx.closePath();\n};\n\n// Optional: Create a shape map for easier lookup\nexport const basicShapes: Record<string, DrawFunction> = {\n circle: drawCircle,\n square: drawSquare,\n triangle: drawTriangle,\n hexagon: drawHexagon,\n star: drawStar,\n \"jacked-star\": drawJackedStar,\n heart: drawHeart,\n diamond: drawDiamond,\n cube: drawCube,\n};\n","import { defaultShapeConfig } from \"../../constants\";\nimport { applyTransforms, createCirclePoints, restoreContext } from \"./utils\";\n\ninterface PlatonicSolidConfig {\n vertices: number;\n faces: number;\n}\n\ninterface FibonacciConfig {\n iterations: number;\n growthFactor: number;\n}\n\ninterface GoldenRatioConfig {\n iterations: number;\n ratio: number;\n}\n\nexport const ShapeConfigs = {\n platonic: {\n tetrahedron: { vertices: 4, faces: 4 },\n cube: { vertices: 8, faces: 6 },\n octahedron: { vertices: 6, faces: 8 },\n dodecahedron: { vertices: 20, faces: 12 },\n icosahedron: { vertices: 12, faces: 20 },\n } as Record<string, PlatonicSolidConfig>,\n fibonacci: {\n iterations: 13,\n growthFactor: 1.618034, // Golden ratio\n } as FibonacciConfig,\n goldenRatio: {\n iterations: 8,\n ratio: 1.618034,\n } as GoldenRatioConfig,\n};\n\ninterface ShapeConfig {\n fillStyle?: string;\n strokeStyle?: string;\n lineWidth?: number;\n rotation?: number;\n iterations?: number;\n animate?: boolean;\n type?: string;\n}\n\ntype DrawFunction = (\n ctx: CanvasRenderingContext2D,\n size: number,\n config?: ShapeConfig,\n) => void;\n\nexport const drawPlatonicSolid: DrawFunction = (ctx, size, config = {}) => {\n const finalConfig = { ...defaultShapeConfig, ...config };\n applyTransforms(ctx, size, finalConfig);\n\n const solidType = config.type as keyof typeof ShapeConfigs.platonic;\n const solidConfig =\n ShapeConfigs.platonic[solidType] ?? ShapeConfigs.platonic.icosahedron;\n const {\n vertices,\n // faces\n } = solidConfig;\n const radius = size / 2;\n\n // Calculate vertices based on platonic solid type\n const points = createCirclePoints(0, 0, radius, vertices);\n\n ctx.beginPath();\n // Draw edges between vertices\n points.forEach((p1, i) => {\n points.slice(i + 1).forEach((p2) => {\n ctx.moveTo(p1.x, p1.y);\n ctx.lineTo(p2.x, p2.y);\n });\n });\n\n if (finalConfig.fillStyle !== \"transparent\") {\n ctx.fill();\n }\n ctx.stroke();\n restoreContext(ctx);\n};\n\nexport const drawFibonacciSpiral: DrawFunction = (ctx, size, config = {}) => {\n const finalConfig = {\n ...defaultShapeConfig,\n ...ShapeConfigs.fibonacci,\n ...config,\n };\n applyTransforms(ctx, size, finalConfig);\n\n let current = 1;\n let previous = 1;\n let scale = size / Math.pow(finalConfig.growthFactor, finalConfig.iterations);\n\n ctx.beginPath();\n for (let i = 0; i < finalConfig.iterations; i++) {\n const radius = scale * current;\n const centerX = radius / 2;\n const centerY = radius / 2;\n\n ctx.arc(centerX, centerY, radius, Math.PI, Math.PI * 1.5);\n\n // Calculate next Fibonacci number\n const next = current + previous;\n previous = current;\n current = next;\n\n // Transform for next iteration\n ctx.translate(radius, 0);\n ctx.rotate(Math.PI / 2);\n }\n\n ctx.stroke();\n restoreContext(ctx);\n};\n\nexport const drawIslamicPattern: DrawFunction = (ctx, size, config = {}) => {\n const finalConfig = { ...defaultShapeConfig, ...config };\n applyTransforms(ctx, size, finalConfig);\n\n const gridSize = 8;\n const unit = size / gridSize;\n\n ctx.beginPath();\n // Create base grid\n for (let i = 0; i <= gridSize; i++) {\n for (let j = 0; j <= gridSize; j++) {\n const x = (i - gridSize / 2) * unit;\n const y = (j - gridSize / 2) * unit;\n\n // Draw star pattern at each intersection\n const radius = unit / 2;\n for (let k = 0; k < 8; k++) {\n const angle = (Math.PI / 4) * k;\n const x1 = x + radius * Math.cos(angle);\n const y1 = y + radius * Math.sin(angle);\n const x2 = x + radius * Math.cos(angle + Math.PI / 4);\n const y2 = y + radius * Math.sin(angle + Math.PI / 4);\n ctx.moveTo(x1, y1);\n ctx.lineTo(x2, y2);\n }\n }\n }\n\n ctx.stroke();\n restoreContext(ctx);\n};\n\nexport const drawCelticKnot: DrawFunction = (ctx, size, config = {}) => {\n const finalConfig = { ...defaultShapeConfig, ...config };\n applyTransforms(ctx, size, finalConfig);\n\n const gridSize = 4;\n const unit = size / gridSize;\n\n const drawKnotSegment = (x: number, y: number, type: string) => {\n ctx.beginPath();\n switch (type) {\n case \"over\":\n ctx.moveTo(x, y);\n ctx.bezierCurveTo(\n x + unit / 2,\n y,\n x + unit / 2,\n y + unit,\n x + unit,\n y + unit,\n );\n break;\n case \"under\":\n ctx.moveTo(x, y + unit);\n ctx.bezierCurveTo(x + unit / 2, y + unit, x + unit / 2, y, x + unit, y);\n break;\n }\n ctx.stroke();\n };\n\n // Create knot pattern\n for (let i = 0; i < gridSize; i++) {\n for (let j = 0; j < gridSize; j++) {\n const x = (i - gridSize / 2) * unit;\n const y = (j - gridSize / 2) * unit;\n drawKnotSegment(x, y, (i + j) % 2 === 0 ? \"over\" : \"under\");\n }\n }\n\n restoreContext(ctx);\n};\n\nexport const drawMerkaba: DrawFunction = (ctx, size, config = {}) => {\n const finalConfig = { ...defaultShapeConfig, ...config };\n applyTransforms(ctx, size, finalConfig);\n\n const radius = size / 2;\n\n // Draw two intersecting tetrahedra\n ctx.beginPath();\n // First tetrahedron\n const points1 = createCirclePoints(0, 0, radius, 3);\n points1.forEach((p1, i) => {\n points1.slice(i + 1).forEach((p2) => {\n ctx.moveTo(p1.x, p1.y);\n ctx.lineTo(p2.x, p2.y);\n });\n });\n\n // Second tetrahedron (rotated)\n ctx.rotate(Math.PI / 6);\n const points2 = createCirclePoints(0, 0, radius, 3);\n points2.forEach((p1, i) => {\n points2.slice(i + 1).forEach((p2) => {\n ctx.moveTo(p1.x, p1.y);\n ctx.lineTo(p2.x, p2.y);\n });\n });\n\n if (finalConfig.fillStyle !== \"transparent\") {\n ctx.fill();\n }\n ctx.stroke();\n restoreContext(ctx);\n};\n\nexport const drawMandala: DrawFunction = (ctx, size, config = {}) => {\n const finalConfig = { ...defaultShapeConfig, ...config };\n applyTransforms(ctx, size, finalConfig);\n\n const numCircles = 8;\n const numPoints = 16;\n const radius = size / 2;\n\n ctx.beginPath();\n for (let i = 1; i <= numCircles; i++) {\n const circleRadius = (radius / numCircles) * i;\n ctx.moveTo(circleRadius, 0);\n ctx.arc(0, 0, circleRadius, 0, Math.PI * 2);\n\n for (let j = 0; j < numPoints; j++) {\n const angle = (Math.PI * 2 * j) / numPoints;\n const x = circleRadius * Math.cos(angle);\n const y = circleRadius * Math.sin(angle);\n ctx.moveTo(0, 0);\n ctx.lineTo(x, y);\n }\n }\n\n ctx.stroke();\n restoreContext(ctx);\n};\n\nexport const drawFractal: DrawFunction = (ctx, size, config = {}) => {\n const finalConfig = { ...defaultShapeConfig, ...config, iterations: 5 };\n applyTransforms(ctx, size, finalConfig);\n\n const drawBranch = (\n x: number,\n y: number,\n length: number,\n angle: number,\n depth: number,\n ) => {\n if (depth === 0) return;\n\n const endX = x + length * Math.cos(angle);\n const endY = y + length * Math.sin(angle);\n\n ctx.beginPath();\n ctx.moveTo(x, y);\n ctx.lineTo(endX, endY);\n ctx.stroke();\n\n drawBranch(endX, endY, length * 0.7, angle - Math.PI / 6, depth - 1);\n drawBranch(endX, endY, length * 0.7, angle + Math.PI / 6, depth - 1);\n };\n\n drawBranch(0, size / 2, size / 4, -Math.PI / 2, finalConfig.iterations);\n restoreContext(ctx);\n};\n\nexport const complexShapes: Record<string, DrawFunction> = {\n platonicSolid: drawPlatonicSolid,\n fibonacciSpiral: drawFibonacciSpiral,\n islamicPattern: drawIslamicPattern,\n celticKnot: drawCelticKnot,\n merkaba: drawMerkaba,\n mandala: drawMandala,\n fractal: drawFractal,\n};\n","// Define interfaces for our configurations\ninterface PresetConfig {\n hash: string;\n width: number;\n height: number;\n gridSize?: number;\n shapesPerLayer?: number;\n layers?: number;\n baseOpacity?: number;\n minShapeSize?: number;\n maxShapeSize?: number;\n}\n\ninterface ShapeConfig {\n strokeStyle: string;\n fillStyle: string;\n lineWidth: number;\n rotation: number;\n iterations: number;\n animate: boolean;\n}\n\n// Define the type for PRESETS\ntype Presets = {\n [key: string]: PresetConfig;\n};\n\nexport const PRESETS: Presets = {\n // Standard sizes with different hashes\n react: {\n hash: \"46192e59d42f741c761cbea79462a8b3815dd905\",\n width: 1024,\n height: 1024,\n },\n angular: {\n hash: \"f31a6c3e94420f43c0cd323a5a6a99376ee59ff8\",\n width: 1024,\n height: 1024,\n gridSize: 6, // Higher density grid\n },\n // Wide format variations\n banner: {\n hash: \"d847ffd4269b22c54d6e85ad3c1892a298e961fb\",\n width: 1920,\n height: 480,\n gridSize: 8, // More horizontal cells for wide format\n shapesPerLayer: 40,\n },\n ultrawide: {\n hash: \"a3e126e537ed2cd11ddf3a96c37066e97c7afee6\",\n width: 3440,\n height: 1440,\n gridSize: 12, // Extra wide needs more cells\n shapesPerLayer: 60,\n },\n // Social media sizes\n \"instagram-square\": {\n hash: \"ff00ff00ff00ff00ff00ff00ff00ff00ff00ff0\",\n width: 1080,\n height: 1080,\n },\n \"instagram-story\": {\n hash: \"abc123def456abc123def456abc123def456abc1\",\n width: 1080,\n height: 1920,\n gridSize: 6,\n layers: 6,\n },\n \"twitter-header\": {\n hash: \"7777777777777777777777777777777777777777\",\n width: 1500,\n height: 500,\n gridSize: 8,\n shapesPerLayer: 35,\n },\n \"linkedin-banner\": {\n hash: \"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\",\n width: 1584,\n height: 396,\n gridSize: 8,\n shapesPerLayer: 35,\n },\n // Mobile sizes\n \"phone-wallpaper\": {\n hash: \"ffffffffffffffffffffffffffffffffaaaaaaaa\",\n width: 1170,\n height: 2532, // iPhone 13 Pro size\n gridSize: 5,\n layers: 6,\n },\n \"tablet-wallpaper\": {\n hash: \"123456789abcdef0123456789abcdef012345678\",\n width: 2048,\n height: 2732, // iPad Pro size\n gridSize: 7,\n layers: 6,\n },\n // Special configurations\n minimal: {\n hash: \"000000000000000000000000000000000fffffff\",\n width: 1024,\n height: 1024,\n layers: 3,\n baseOpacity: 0.8,\n shapesPerLayer: 15,\n },\n complex: {\n hash: \"deadbeefdeadbeefdeadbeefdeadbeefdeadbeef\",\n width: 2048,\n height: 2048,\n gridSize: 8,\n layers: 7,\n shapesPerLayer: 50,\n minShapeSize: 30,\n maxShapeSize: 250,\n },\n};\n\n// Basic configuration that applies to all shapes\nexport const defaultShapeConfig: ShapeConfig = {\n strokeStyle: \"#000000\",\n fillStyle: \"transparent\",\n lineWidth: 1,\n rotation: 0,\n iterations: 1,\n animate: false, // For future use\n};\n\n// Base configuration types that can be extended per shape\nexport const ShapeConfigTypes = {\n BASIC: \"basic\",\n DETAILED: \"detailed\",\n ANIMATED: \"animated\",\n};\n\n// Golden ratio and other important proportions\nexport const Proportions = {\n GOLDEN_RATIO: 1.618034,\n SQUARE_ROOT_2: Math.sqrt(2),\n SQUARE_ROOT_3: Math.sqrt(3),\n SQUARE_ROOT_5: Math.sqrt(5),\n PI: Math.PI,\n PHI: (1 + Math.sqrt(5)) / 2,\n};\n\n// Helper for creating common sacred geometry combinations\nexport const PatternPresets = {\n flowerOfLifeMandala: (size: number) => [\n // { type: \"flowerOfLife\", config: { size } },\n { type: \"merkaba\", config: { size: size * 0.8 } },\n { type: \"sriYantra\", config: { size: size * 0.5 } },\n ],\n\n platonicProgression: (size: number) => [\n { type: \"platonicSolid\", config: { size, type: \"tetrahedron\" } },\n { type: \"platonicSolid\", config: { size: size * 0.8, type: \"cube\" } },\n { type: \"platonicSolid\", config: { size: size * 0.6, type: \"octahedron\" } },\n ],\n\n cosmicTree: (size: number) => [\n // { type: \"treeOfLife\", config: { size } },\n { type: \"fibonacciSpiral\", config: { size: size * 0.9 } },\n { type: \"metatronsCube\", config: { size: size * 0.7 } },\n ],\n};\n","interface Point {\n x: number;\n y: number;\n}\n\ninterface ShapeConfig {\n rotation?: number;\n lineWidth: number;\n strokeStyle: string;\n fillStyle: string;\n}\n\ninterface AnimationConfig {\n enabled: boolean;\n duration: number;\n easing: string;\n type: string;\n}\n\nexport const degToRad = (degrees: number): number => (degrees * Math.PI) / 180;\n\nexport const applyTransforms = (\n ctx: CanvasRenderingContext2D,\n size: number,\n config: ShapeConfig,\n): void => {\n ctx.save();\n ctx.translate(0, 0);\n if (config.rotation) {\n ctx.rotate(degToRad(config.rotation));\n }\n ctx.lineWidth = config.lineWidth;\n ctx.strokeStyle = config.strokeStyle;\n ctx.fillStyle = config.fillStyle;\n};\n\nexport const restoreContext = (ctx: CanvasRenderingContext2D): void => {\n ctx.restore();\n};\n\n// Animation configuration stub for future use\nexport const createAnimationConfig = (type: string): AnimationConfig => ({\n enabled: false,\n duration: 1000,\n easing: \"linear\",\n type,\n // Add more animation-specific properties as needed\n});\n\nexport const createCirclePoints = (\n cx: number,\n cy: number,\n radius: number,\n segments: number,\n): Point[] => {\n const points: Point[] = [];\n for (let i = 0; i < segments; i++) {\n const angle = (i / segments) * Math.PI * 2;\n points.push({\n x: cx + Math.cos(angle) * radius,\n y: cy + Math.sin(angle) * radius,\n });\n }\n return points;\n};\n","import { createCirclePoints } from \"./utils\";\n\ntype DrawFunction = (ctx: CanvasRenderingContext2D, size: number) => void;\n\ninterface Point {\n x: number;\n y: number;\n}\n\nexport const drawFlowerOfLife: DrawFunction = (ctx, size) => {\n const radius = size / 6;\n const centers: Point[] = [\n { x: 0, y: 0 },\n { x: radius * Math.sqrt(3), y: 0 },\n { x: (radius * Math.sqrt(3)) / 2, y: 1.5 * radius },\n { x: (-radius * Math.sqrt(3)) / 2, y: 1.5 * radius },\n { x: -radius * Math.sqrt(3), y: 0 },\n { x: (-radius * Math.sqrt(3)) / 2, y: -1.5 * radius },\n { x: (radius * Math.sqrt(3)) / 2, y: -1.5 * radius },\n ];\n\n ctx.beginPath();\n centers.forEach((center) => {\n ctx.moveTo(center.x + radius, center.y);\n ctx.arc(center.x, center.y, radius, 0, Math.PI * 2);\n });\n};\n\nexport const drawTreeOfLife: DrawFunction = (ctx, size) => {\n const radius = size / 12;\n const spacing = radius * 2.5;\n\n // Sephirot positions (traditional layout)\n const positions: Point[] = [\n { x: 0, y: -spacing * 2 }, // Kether\n { x: -spacing, y: -spacing }, // Chokmah\n { x: spacing, y: -spacing }, // Binah\n { x: -spacing, y: 0 }, // Chesed\n { x: spacing, y: 0 }, // Geburah\n { x: 0, y: 0 }, // Tiphereth\n { x: -spacing, y: spacing }, // Netzach\n { x: spacing, y: spacing }, // Hod\n { x: 0, y: spacing * 2 }, // Yesod\n { x: 0, y: spacing * 3 }, // Malkuth\n ];\n\n // Draw circles\n ctx.beginPath();\n positions.forEach((pos) => {\n ctx.moveTo(pos.x + radius, pos.y);\n ctx.arc(pos.x, pos.y, radius, 0, Math.PI * 2);\n });\n\n // Draw connecting lines\n ctx.moveTo(positions[0].x, positions[0].y);\n positions.forEach((pos, i) => {\n if (i > 0) {\n positions.slice(i + 1).forEach((nextPos) => {\n ctx.moveTo(pos.x, pos.y);\n ctx.lineTo(nextPos.x, nextPos.y);\n });\n }\n });\n};\n\nexport const drawMetatronsCube: DrawFunction = (ctx, size) => {\n const radius = size / 3;\n\n // Create 13 points - one center and 12 vertices of an icosahedron\n\n // const phi = (1 + Math.sqrt(5)) / 2; // Golden ratio\n\n const vertices: Point[] = [\n { x: 0, y: 0 }, // Center point\n ...createCirclePoints(0, 0, radius, 6), // Inner hexagon\n ...createCirclePoints(0, 0, radius * 1.5, 6), // Outer hexagon\n ];\n\n ctx.beginPath();\n // Draw all connecting lines\n vertices.forEach((v1, i) => {\n vertices.slice(i + 1).forEach((v2) => {\n ctx.moveTo(v1.x, v1.y);\n ctx.lineTo(v2.x, v2.y);\n });\n });\n};\n\nexport const drawSriYantra: DrawFunction = (ctx, size) => {\n const radius = size / 2;\n ctx.beginPath();\n\n // Draw outer triangles\n for (let i = 0; i < 9; i++) {\n const angle = (i / 9) * Math.PI * 2;\n const x1 = Math.cos(angle) * radius;\n const y1 = Math.sin(angle) * radius;\n const x2 = Math.cos(angle + Math.PI / 9) * radius;\n const y2 = Math.sin(angle + Math.PI / 9) * radius;\n\n ctx.moveTo(0, 0);\n ctx.lineTo(x1, y1);\n ctx.lineTo(x2, y2);\n ctx.lineTo(0, 0);\n }\n\n // Draw inner triangles\n const innerRadius = radius * 0.6;\n for (let i = 0; i < 9; i++) {\n const angle = (i / 9) * Math.PI * 2 + Math.PI / 18;\n const x1 = Math.cos(angle) * innerRadius;\n const y1 = Math.sin(angle) * innerRadius;\n const x2 = Math.cos(angle + Math.PI / 9) * innerRadius;\n const y2 = Math.sin(angle + Math.PI / 9) * innerRadius;\n\n ctx.moveTo(0, 0);\n ctx.lineTo(x1, y1);\n ctx.lineTo(x2, y2);\n ctx.lineTo(0, 0);\n }\n};\n\nexport const drawSeedOfLife: DrawFunction = (ctx, size) => {\n const radius = size / 6;\n const centers: Point[] = [\n { x: 0, y: 0 },\n { x: radius * Math.sqrt(3), y: 0 },\n { x: (radius * Math.sqrt(3)) / 2, y: 1.5 * radius },\n { x: (-radius * Math.sqrt(3)) / 2, y: 1.5 * radius },\n { x: -radius * Math.sqrt(3), y: 0 },\n { x: (-radius * Math.sqrt(3)) / 2, y: -1.5 * radius },\n { x: (radius * Math.sqrt(3)) / 2, y: -1.5 * radius },\n ];\n\n ctx.beginPath();\n centers.forEach((center) => {\n ctx.moveTo(center.x + radius, center.y);\n ctx.arc(center.x, center.y, radius, 0, Math.PI * 2);\n });\n};\n\nexport const drawVesicaPiscis: DrawFunction = (ctx, size) => {\n const radius = size / 4;\n ctx.beginPath();\n ctx.arc(-radius / 2, 0, radius, 0, Math.PI * 2);\n ctx.arc(radius / 2, 0, radius, 0, Math.PI * 2);\n};\n\nexport const drawTorus: DrawFunction = (ctx, size) => {\n const outerRadius = size / 2;\n const innerRadius = size / 4;\n const steps = 36;\n\n ctx.beginPath();\n for (let i = 0; i < steps; i++) {\n const angle1 = (i / steps) * Math.PI * 2;\n // const angle2 = ((i + 1) / steps) * Math.PI * 2;\n\n for (let j = 0; j < steps; j++) {\n const phi1 = (j / steps) * Math.PI * 2;\n const phi2 = ((j + 1) / steps) * Math.PI * 2;\n\n const x1 =\n (outerRadius + innerRadius * Math.cos(phi1)) * Math.cos(angle1);\n const y1 =\n (outerRadius + innerRadius * Math.cos(phi1)) * Math.sin(angle1);\n const x2 =\n (outerRadius + innerRadius * Math.cos(phi2)) * Math.cos(angle1);\n const y2 =\n (outerRadius + innerRadius * Math.cos(phi2)) * Math.sin(angle1);\n\n ctx.moveTo(x1, y1);\n ctx.lineTo(x2, y2);\n }\n }\n};\n\nexport const drawEggOfLife: DrawFunction = (ctx, size) => {\n const radius = size / 8;\n const centers: Point[] = [\n { x: 0, y: 0 },\n { x: radius * 2, y: 0 },\n { x: radius, y: radius * Math.sqrt(3) },\n { x: -radius, y: radius * Math.sqrt(3) },\n { x: -radius * 2, y: 0 },\n { x: -radius, y: -radius * Math.sqrt(3) },\n { x: radius, y: -radius * Math.sqrt(3) },\n ];\n\n ctx.beginPath();\n centers.forEach((center) => {\n ctx.moveTo(center.x + radius, center.y);\n ctx.arc(center.x, center.y, radius, 0, Math.PI * 2);\n });\n};\n\nexport const sacredShapes: Record<string, DrawFunction> = {\n flowerOfLife: drawFlowerOfLife,\n treeOfLife: drawTreeOfLife,\n metatronsCube: drawMetatronsCube,\n sriYantra: drawSriYantra,\n seedOfLife: drawSeedOfLife,\n vesicaPiscis: drawVesicaPiscis,\n torus: drawTorus,\n eggOfLife: drawEggOfLife,\n};\n","/**\n * Procedural shape generators — hash-derived shapes that are unique\n * per generation. Unlike the fixed shape library, these produce geometry\n * that doesn't repeat across hashes.\n *\n * All draw functions accept an RNG via the config parameter so the\n * shapes are deterministic from the hash.\n */\n\ntype DrawFunction = (\n ctx: CanvasRenderingContext2D,\n size: number,\n config?: any,\n) => void;\n\n// ── Blob: organic closed curve via cubic bezier ─────────────────────\n\nexport const drawBlob: DrawFunction = (ctx, size, config) => {\n const rng: () => number = config?.rng ?? Math.random;\n const r = size / 2;\n const numPoints = 5 + Math.floor(rng() * 5);\n const points: Array<{ x: number; y: number }> = [];\n\n for (let i = 0; i < numPoints; i++) {\n const angle = (i / numPoints) * Math.PI * 2;\n const jitter = 0.5 + rng() * 0.5;\n points.push({\n x: Math.cos(angle) * r * jitter,\n y: Math.sin(angle) * r * jitter,\n });\n }\n\n ctx.beginPath();\n const last = points[points.length - 1];\n const first = points[0];\n ctx.moveTo((last.x + first.x) / 2, (last.y + first.y) / 2);\n\n for (let i = 0; i < numPoints; i++) {\n const curr = points[i];\n const next = points[(i + 1) % numPoints];\n ctx.quadraticCurveTo(curr.x, curr.y, (curr.x + next.x) / 2, (curr.y + next.y) / 2);\n }\n ctx.closePath();\n};\n\n// ── Ngon: irregular polygon with hash-controlled vertices ───────────\n\nexport const drawNgon: DrawFunction = (ctx, size, config) => {\n const rng: () => number = config?.rng ?? Math.random;\n const r = size / 2;\n const sides = 3 + Math.floor(rng() * 10);\n const jitterAmount = 0.1 + rng() * 0.4;\n\n ctx.beginPath();\n for (let i = 0; i < sides; i++) {\n const angle = (i / sides) * Math.PI * 2 - Math.PI / 2;\n const radiusJitter = 1 - jitterAmount + rng() * jitterAmount * 2;\n const x = Math.cos(angle) * r * radiusJitter;\n const y = Math.sin(angle) * r * radiusJitter;\n if (i === 0) ctx.moveTo(x, y);\n else ctx.lineTo(x, y);\n }\n ctx.closePath();\n};\n\n// ── Lissajous: parametric curves with hash-derived frequency ratios ─\n\nexport const drawLissajous: DrawFunction = (ctx, size, config) => {\n const rng: () => number = config?.rng ?? Math.random;\n const r = size / 2;\n const freqA = 1 + Math.floor(rng() * 5);\n const freqB = 1 + Math.floor(rng() * 5);\n const phase = rng() * Math.PI;\n const steps = 120;\n\n ctx.beginPath();\n for (let i = 0; i <= steps; i++) {\n const t = (i / steps) * Math.PI * 2;\n const x = Math.sin(freqA * t + phase) * r;\n const y = Math.sin(freqB * t) * r;\n if (i === 0) ctx.moveTo(x, y);\n else ctx.lineTo(x, y);\n }\n ctx.closePath();\n};\n\n// ── Superellipse: |x|^n + |y|^n = 1 with hash-derived exponent ─────\n\nexport const drawSuperellipse: DrawFunction = (ctx, size, config) => {\n const rng: () => number = config?.rng ?? Math.random;\n const r = size / 2;\n const n = 0.3 + rng() * 4.7;\n const steps = 120;\n\n ctx.beginPath();\n for (let i = 0; i <= steps; i++) {\n const t = (i / steps) * Math.PI * 2;\n const cosT = Math.cos(t);\n const sinT = Math.sin(t);\n const x = Math.sign(cosT) * Math.pow(Math.abs(cosT), 2 / n) * r;\n const y = Math.sign(sinT) * Math.pow(Math.abs(sinT), 2 / n) * r;\n if (i === 0) ctx.moveTo(x, y);\n else ctx.lineTo(x, y);\n }\n ctx.closePath();\n};\n\n// ── Spirograph: hypotrochoid curves ─────────────────────────────────\n\nexport const drawSpirograph: DrawFunction = (ctx, size, config) => {\n const rng: () => number = config?.rng ?? Math.random;\n const scale = size / 2;\n const R = 1;\n const r = 0.2 + rng() * 0.6;\n const d = 0.3 + rng() * 0.7;\n const gcd = (a: number, b: number): number => {\n const ai = Math.round(a * 1000);\n const bi = Math.round(b * 1000);\n const g = (x: number, y: number): number => (y === 0 ? x : g(y, x % y));\n return g(ai, bi) / 1000;\n };\n const period = r / gcd(R, r);\n const maxT = Math.min(period, 10) * Math.PI * 2;\n const steps = Math.min(600, Math.floor(maxT * 20));\n\n ctx.beginPath();\n for (let i = 0; i <= steps; i++) {\n const t = (i / steps) * maxT;\n const x = ((R - r) * Math.cos(t) + d * Math.cos(((R - r) / r) * t)) * scale / (1 + d);\n const y = ((R - r) * Math.sin(t) - d * Math.sin(((R - r) / r) * t)) * scale / (1 + d);\n if (i === 0) ctx.moveTo(x, y);\n else ctx.lineTo(x, y);\n }\n ctx.closePath();\n};\n\n// ── Wave ring: concentric ring with sinusoidal displacement ─────────\n\nexport const drawWaveRing: DrawFunction = (ctx, size, config) => {\n const rng: () => number = config?.rng ?? Math.random;\n const r = size / 2;\n const rings = 2 + Math.floor(rng() * 4);\n const freq = 3 + Math.floor(rng() * 12);\n const amp = 0.05 + rng() * 0.15;\n\n ctx.beginPath();\n for (let ring = 0; ring < rings; ring++) {\n const baseR = r * (0.3 + (ring / rings) * 0.7);\n const steps = 80;\n for (let i = 0; i <= steps; i++) {\n const t = (i / steps) * Math.PI * 2;\n const wave = Math.sin(t * freq + ring * 1.5) * baseR * amp;\n const x = Math.cos(t) * (baseR + wave);\n const y = Math.sin(t) * (baseR + wave);\n if (i === 0) ctx.moveTo(x, y);\n else ctx.lineTo(x, y);\n }\n }\n};\n\n// ── Rose curve: polar rose r = cos(k*theta) ────────────────────────\n\nexport const drawRose: DrawFunction = (ctx, size, config) => {\n const rng: () => number = config?.rng ?? Math.random;\n const r = size / 2;\n const k = 2 + Math.floor(rng() * 6);\n const steps = 200;\n\n ctx.beginPath();\n for (let i = 0; i <= steps; i++) {\n const theta = (i / steps) * Math.PI * 2 * (k % 2 === 0 ? 1 : 2);\n const rr = Math.cos(k * theta) * r;\n const x = rr * Math.cos(theta);\n const y = rr * Math.sin(theta);\n if (i === 0) ctx.moveTo(x, y);\n else ctx.lineTo(x, y);\n }\n ctx.closePath();\n};\n\n// ═══════════════════════════════════════════════════════════════════\n// NEW PROCEDURAL SHAPES\n// ═══════════════════════════════════════════════════════════════════\n\n// ── ShardField: cluster of angular shards (broken glass / crystals) ─\n// Generates 4-8 convex polygonal shards radiating from center.\n\nexport const drawShardField: DrawFunction = (ctx, size, config) => {\n const rng: () => number = config?.rng ?? Math.random;\n const r = size / 2;\n const shardCount = 4 + Math.floor(rng() * 5); // 4-8 shards\n\n ctx.beginPath();\n for (let s = 0; s < shardCount; s++) {\n const baseAngle = (s / shardCount) * Math.PI * 2 + (rng() - 0.5) * 0.3;\n const dist = r * (0.15 + rng() * 0.35);\n const cx = Math.cos(baseAngle) * dist;\n const cy = Math.sin(baseAngle) * dist;\n const shardSize = r * (0.2 + rng() * 0.4);\n const verts = 3 + Math.floor(rng() * 3); // 3-5 vertices per shard\n const shardAngleOffset = rng() * Math.PI * 2;\n\n for (let v = 0; v < verts; v++) {\n const angle = shardAngleOffset + (v / verts) * Math.PI * 2;\n // Elongate shards along their radial direction\n const stretch = v % 2 === 0 ? 1.0 : 0.3 + rng() * 0.4;\n const px = cx + Math.cos(angle) * shardSize * stretch;\n const py = cy + Math.sin(angle) * shardSize * stretch;\n if (v === 0) ctx.moveTo(px, py);\n else ctx.lineTo(px, py);\n }\n ctx.closePath();\n }\n};\n\n// ── VoronoiCell: single organic cell with straight edges ────────────\n// Simulates a Voronoi cell by generating a convex hull around\n// a jittered set of midpoints between center and random neighbors.\n\nexport const drawVoronoiCell: DrawFunction = (ctx, size, config) => {\n const rng: () => number = config?.rng ?? Math.random;\n const r = size / 2;\n const edgeCount = 5 + Math.floor(rng() * 4); // 5-8 edges\n const points: Array<{ angle: number; x: number; y: number }> = [];\n\n // Generate edge midpoints at varying distances\n for (let i = 0; i < edgeCount; i++) {\n const angle = (i / edgeCount) * Math.PI * 2 + (rng() - 0.5) * 0.4;\n const dist = r * (0.6 + rng() * 0.4);\n points.push({\n angle,\n x: Math.cos(angle) * dist,\n y: Math.sin(angle) * dist,\n });\n }\n // Sort by angle for proper winding\n points.sort((a, b) => a.angle - b.angle);\n\n ctx.beginPath();\n ctx.moveTo(points[0].x, points[0].y);\n for (let i = 1; i < points.length; i++) {\n ctx.lineTo(points[i].x, points[i].y);\n }\n ctx.closePath();\n};\n\n// ── Crescent: two overlapping circles subtracted ────────────────────\n// Hash controls bite size and angle of the crescent.\n\nexport const drawCrescent: DrawFunction = (ctx, size, config) => {\n const rng: () => number = config?.rng ?? Math.random;\n const r = size / 2;\n const biteSize = 0.6 + rng() * 0.3; // 60-90% of radius\n const biteOffset = r * (0.3 + rng() * 0.4);\n const biteAngle = rng() * Math.PI * 2;\n\n // Outer circle\n ctx.beginPath();\n ctx.arc(0, 0, r, 0, Math.PI * 2);\n\n // Subtract inner circle using even-odd rule\n const bx = Math.cos(biteAngle) * biteOffset;\n const by = Math.sin(biteAngle) * biteOffset;\n // Draw inner circle counter-clockwise for subtraction\n ctx.moveTo(bx + r * biteSize, by);\n ctx.arc(bx, by, r * biteSize, 0, Math.PI * 2, true);\n};\n\n// ── Tendril: tapered curving stroke that branches ───────────────────\n// Like a vine or neural dendrite. Draws as a filled tapered path.\n\nexport const drawTendril: DrawFunction = (ctx, size, config) => {\n const rng: () => number = config?.rng ?? Math.random;\n const r = size / 2;\n const segments = 12 + Math.floor(rng() * 8);\n const startAngle = rng() * Math.PI * 2;\n const curvature = (rng() - 0.5) * 0.4;\n\n // Build spine points\n const spine: Array<{ x: number; y: number }> = [];\n let angle = startAngle;\n let px = 0, py = 0;\n for (let i = 0; i <= segments; i++) {\n spine.push({ x: px, y: py });\n const stepLen = (r / segments) * (1.5 + rng() * 0.5);\n angle += curvature + (rng() - 0.5) * 0.6;\n px += Math.cos(angle) * stepLen;\n py += Math.sin(angle) * stepLen;\n }\n\n // Build tapered outline by offsetting perpendicular to spine\n ctx.beginPath();\n const leftSide: Array<{ x: number; y: number }> = [];\n const rightSide: Array<{ x: number; y: number }> = [];\n\n for (let i = 0; i < spine.length; i++) {\n const t = i / (spine.length - 1);\n const width = r * 0.12 * (1 - t * 0.9); // taper from thick to thin\n const next = spine[Math.min(i + 1, spine.length - 1)];\n const dx = next.x - spine[i].x;\n const dy = next.y - spine[i].y;\n const len = Math.hypot(dx, dy) || 1;\n const nx = -dy / len;\n const ny = dx / len;\n leftSide.push({ x: spine[i].x + nx * width, y: spine[i].y + ny * width });\n rightSide.push({ x: spine[i].x - nx * width, y: spine[i].y - ny * width });\n }\n\n ctx.moveTo(leftSide[0].x, leftSide[0].y);\n for (let i = 1; i < leftSide.length; i++) {\n ctx.lineTo(leftSide[i].x, leftSide[i].y);\n }\n for (let i = rightSide.length - 1; i >= 0; i--) {\n ctx.lineTo(rightSide[i].x, rightSide[i].y);\n }\n ctx.closePath();\n};\n\n// ── CloudForm: overlapping circles along a curved spine ─────────────\n// Like cumulus clouds — soft, billowy, organic.\n\nexport const drawCloudForm: DrawFunction = (ctx, size, config) => {\n const rng: () => number = config?.rng ?? Math.random;\n const r = size / 2;\n const lobeCount = 4 + Math.floor(rng() * 4); // 4-7 lobes\n const spineAngle = rng() * Math.PI * 2;\n const spineLen = r * 0.6;\n\n ctx.beginPath();\n for (let i = 0; i < lobeCount; i++) {\n const t = (i / (lobeCount - 1)) - 0.5; // -0.5 to 0.5\n const sx = Math.cos(spineAngle) * spineLen * t;\n const sy = Math.sin(spineAngle) * spineLen * t;\n // Offset perpendicular for cloud shape\n const perpAngle = spineAngle + Math.PI / 2;\n const perpOff = (rng() - 0.3) * r * 0.3;\n const cx = sx + Math.cos(perpAngle) * perpOff;\n const cy = sy + Math.sin(perpAngle) * perpOff;\n const lobeR = r * (0.25 + rng() * 0.2);\n ctx.moveTo(cx + lobeR, cy);\n ctx.arc(cx, cy, lobeR, 0, Math.PI * 2);\n }\n};\n\n// ── InkSplat: radial spikes with bezier curves between them ─────────\n// Like an ink drop hitting paper — organic, explosive.\n\nexport const drawInkSplat: DrawFunction = (ctx, size, config) => {\n const rng: () => number = config?.rng ?? Math.random;\n const r = size / 2;\n const spikeCount = 8 + Math.floor(rng() * 8); // 8-15 spikes\n const points: Array<{ x: number; y: number }> = [];\n\n for (let i = 0; i < spikeCount; i++) {\n const angle = (i / spikeCount) * Math.PI * 2;\n const isSpike = i % 2 === 0;\n const dist = isSpike\n ? r * (0.5 + rng() * 0.5) // spikes reach 50-100% of radius\n : r * (0.15 + rng() * 0.2); // valleys at 15-35%\n points.push({\n x: Math.cos(angle) * dist,\n y: Math.sin(angle) * dist,\n });\n }\n\n ctx.beginPath();\n ctx.moveTo(points[0].x, points[0].y);\n for (let i = 0; i < points.length; i++) {\n const curr = points[i];\n const next = points[(i + 1) % points.length];\n const cpx = (curr.x + next.x) / 2 + (rng() - 0.5) * r * 0.15;\n const cpy = (curr.y + next.y) / 2 + (rng() - 0.5) * r * 0.15;\n ctx.quadraticCurveTo(cpx, cpy, next.x, next.y);\n }\n ctx.closePath();\n};\n\n// ── GeodesicDome: subdivided icosahedron projection ─────────────────\n// Hash controls subdivision level (1-3). Projected to 2D.\n\nexport const drawGeodesicDome: DrawFunction = (ctx, size, config) => {\n const rng: () => number = config?.rng ?? Math.random;\n const r = size / 2;\n const subdivisions = 1 + Math.floor(rng() * 3); // 1-3\n\n // Start with icosahedron vertices projected to 2D\n const baseVerts = 6 + subdivisions * 4;\n const points: Array<{ x: number; y: number }> = [];\n for (let i = 0; i < baseVerts; i++) {\n const angle = (i / baseVerts) * Math.PI * 2;\n const ring = i % 2 === 0 ? 1.0 : 0.5 + rng() * 0.3;\n points.push({\n x: Math.cos(angle) * r * ring,\n y: Math.sin(angle) * r * ring,\n });\n }\n\n ctx.beginPath();\n // Draw triangulated mesh — connect each point to neighbors and center\n for (let i = 0; i < points.length; i++) {\n const next = points[(i + 1) % points.length];\n ctx.moveTo(points[i].x, points[i].y);\n ctx.lineTo(next.x, next.y);\n // Connect to center\n ctx.moveTo(points[i].x, points[i].y);\n ctx.lineTo(0, 0);\n // Cross-connect to create triangulation\n if (i % 2 === 0 && i + 2 < points.length) {\n ctx.moveTo(points[i].x, points[i].y);\n ctx.lineTo(points[i + 2].x, points[i + 2].y);\n }\n }\n // Outer ring\n ctx.moveTo(points[0].x, points[0].y);\n for (let i = 1; i < points.length; i++) {\n ctx.lineTo(points[i].x, points[i].y);\n }\n ctx.closePath();\n};\n\n// ── PenroseTile: kite or dart shape from Penrose tiling ─────────────\n// Hash selects kite vs dart and rotation.\n\nexport const drawPenroseTile: DrawFunction = (ctx, size, config) => {\n const rng: () => number = config?.rng ?? Math.random;\n const r = size / 2;\n const phi = (1 + Math.sqrt(5)) / 2; // golden ratio\n const isKite = rng() < 0.5;\n\n ctx.beginPath();\n if (isKite) {\n // Kite: two golden triangles joined at base\n const topY = -r;\n const bottomY = r * (1 / phi);\n const midY = r * (1 / phi - 1) * 0.3;\n const wingX = r * 0.6;\n ctx.moveTo(0, topY);\n ctx.lineTo(wingX, midY);\n ctx.lineTo(0, bottomY);\n ctx.lineTo(-wingX, midY);\n } else {\n // Dart: concave quadrilateral\n const topY = -r;\n const bottomY = r * 0.3;\n const midY = -r * 0.1;\n const wingX = r * 0.5;\n ctx.moveTo(0, topY);\n ctx.lineTo(wingX, midY);\n ctx.lineTo(0, bottomY);\n ctx.lineTo(-wingX, midY);\n }\n ctx.closePath();\n};\n\n// ── ReuleauxTriangle: constant-width curve ──────────────────────────\n// Three circular arcs connecting the vertices of an equilateral triangle.\n\nexport const drawReuleauxTriangle: DrawFunction = (ctx, size, config) => {\n const r = size / 2;\n // Vertices of equilateral triangle\n const verts = [];\n for (let i = 0; i < 3; i++) {\n const angle = (i / 3) * Math.PI * 2 - Math.PI / 2;\n verts.push({ x: Math.cos(angle) * r * 0.7, y: Math.sin(angle) * r * 0.7 });\n }\n // Side length = distance between vertices\n const sideLen = Math.hypot(verts[1].x - verts[0].x, verts[1].y - verts[0].y);\n\n ctx.beginPath();\n for (let i = 0; i < 3; i++) {\n const from = verts[(i + 1) % 3];\n const to = verts[(i + 2) % 3];\n const center = verts[i];\n const startAngle = Math.atan2(from.y - center.y, from.x - center.x);\n const endAngle = Math.atan2(to.y - center.y, to.x - center.x);\n if (i === 0) ctx.moveTo(from.x, from.y);\n ctx.arc(center.x, center.y, sideLen, startAngle, endAngle);\n }\n ctx.closePath();\n};\n\n// ── DotCluster: cloud of dots in a bounded region ───────────────────\n// Hash controls density, spread, and clustering.\n\nexport const drawDotCluster: DrawFunction = (ctx, size, config) => {\n const rng: () => number = config?.rng ?? Math.random;\n const r = size / 2;\n const dotCount = 15 + Math.floor(rng() * 25); // 15-39 dots\n const clusterTightness = 0.3 + rng() * 0.5;\n\n ctx.beginPath();\n for (let i = 0; i < dotCount; i++) {\n // Gaussian-ish distribution via Box-Muller approximation\n const u1 = Math.max(0.001, rng());\n const u2 = rng();\n const mag = Math.sqrt(-2 * Math.log(u1)) * clusterTightness;\n const angle = u2 * Math.PI * 2;\n const dx = Math.cos(angle) * mag * r;\n const dy = Math.sin(angle) * mag * r;\n const dotR = r * (0.02 + rng() * 0.04);\n ctx.moveTo(dx + dotR, dy);\n ctx.arc(dx, dy, dotR, 0, Math.PI * 2);\n }\n};\n\n// ── CrosshatchPatch: bounded region filled with directional lines ───\n// Like an engraving or etching mark.\n\nexport const drawCrosshatchPatch: DrawFunction = (ctx, size, config) => {\n const rng: () => number = config?.rng ?? Math.random;\n const r = size / 2;\n const angle1 = rng() * Math.PI;\n const angle2 = angle1 + Math.PI / 2 + (rng() - 0.5) * 0.3;\n const spacing = r * (0.08 + rng() * 0.08);\n const hasCross = rng() < 0.6;\n\n // Draw bounding shape (ellipse)\n const rx = r * (0.7 + rng() * 0.3);\n const ry = r * (0.5 + rng() * 0.3);\n\n // Outer boundary\n ctx.beginPath();\n ctx.ellipse(0, 0, rx, ry, 0, 0, Math.PI * 2);\n\n // Hatch lines clipped to the ellipse\n const cos1 = Math.cos(angle1);\n const sin1 = Math.sin(angle1);\n for (let d = -r; d <= r; d += spacing) {\n const lx1 = d * cos1 - r * sin1;\n const ly1 = d * sin1 + r * cos1;\n const lx2 = d * cos1 + r * sin1;\n const ly2 = d * sin1 - r * cos1;\n ctx.moveTo(lx1, ly1);\n ctx.lineTo(lx2, ly2);\n }\n\n if (hasCross) {\n const cos2 = Math.cos(angle2);\n const sin2 = Math.sin(angle2);\n for (let d = -r; d <= r; d += spacing * 1.3) {\n const lx1 = d * cos2 - r * sin2;\n const ly1 = d * sin2 + r * cos2;\n const lx2 = d * cos2 + r * sin2;\n const ly2 = d * sin2 - r * cos2;\n ctx.moveTo(lx1, ly1);\n ctx.lineTo(lx2, ly2);\n }\n }\n};\n\n// ── Shape registry ──────────────────────────────────────────────────\n\nexport const proceduralShapes: Record<string, DrawFunction> = {\n blob: drawBlob,\n ngon: drawNgon,\n lissajous: drawLissajous,\n superellipse: drawSuperellipse,\n spirograph: drawSpirograph,\n waveRing: drawWaveRing,\n rose: drawRose,\n shardField: drawShardField,\n voronoiCell: drawVoronoiCell,\n crescent: drawCrescent,\n tendril: drawTendril,\n cloudForm: drawCloudForm,\n inkSplat: drawInkSplat,\n geodesicDome: drawGeodesicDome,\n penroseTile: drawPenroseTile,\n reuleauxTriangle: drawReuleauxTriangle,\n dotCluster: drawDotCluster,\n crosshatchPatch: drawCrosshatchPatch,\n};\n","/**\n * Shape affinity system — controls which shapes look good together,\n * quality tiers for different rendering contexts, and size preferences.\n *\n * This replaces the naive \"pick any shape\" approach with intentional\n * curation that produces more cohesive compositions.\n */\n\n// ── Quality tiers ───────────────────────────────────────────────────\n// Not all shapes render equally well at all sizes or in all contexts.\n// Tier 1 shapes are visually strong at any size; Tier 3 shapes need\n// specific conditions to look good.\n\nexport type ShapeTier = 1 | 2 | 3;\n\nexport interface ShapeProfile {\n /** Visual quality tier (1 = always good, 3 = situational) */\n tier: ShapeTier;\n /** Minimum size (as fraction of maxShapeSize) before shape looks bad */\n minSizeFraction: number;\n /** Maximum size fraction — some shapes look bad when huge */\n maxSizeFraction: number;\n /** Which shapes this one composes well with */\n affinities: string[];\n /** Category for grouping */\n category: \"basic\" | \"complex\" | \"sacred\" | \"procedural\";\n /** Whether this shape works well as a hero/focal element */\n heroCandidate: boolean;\n /** Best render styles for this shape */\n bestStyles: string[];\n}\n\nexport const SHAPE_PROFILES: Record<string, ShapeProfile> = {\n // ── Basic shapes ──────────────────────────────────────────────\n circle: {\n tier: 1,\n minSizeFraction: 0.05,\n maxSizeFraction: 1.0,\n affinities: [\"circle\", \"blob\", \"hexagon\", \"flowerOfLife\", \"seedOfLife\"],\n category: \"basic\",\n heroCandidate: false,\n bestStyles: [\"fill-only\", \"watercolor\", \"fill-and-stroke\", \"hand-drawn\"],\n },\n square: {\n tier: 2,\n minSizeFraction: 0.08,\n maxSizeFraction: 0.7,\n affinities: [\"square\", \"diamond\", \"superellipse\", \"islamicPattern\"],\n category: \"basic\",\n heroCandidate: false,\n bestStyles: [\"fill-and-stroke\", \"stroke-only\", \"hatched\"],\n },\n triangle: {\n tier: 1,\n minSizeFraction: 0.06,\n maxSizeFraction: 0.9,\n affinities: [\"triangle\", \"diamond\", \"hexagon\", \"merkaba\", \"sriYantra\"],\n category: \"basic\",\n heroCandidate: false,\n bestStyles: [\"fill-and-stroke\", \"fill-only\", \"watercolor\", \"hand-drawn\"],\n },\n hexagon: {\n tier: 1,\n minSizeFraction: 0.05,\n maxSizeFraction: 1.0,\n affinities: [\"hexagon\", \"circle\", \"flowerOfLife\", \"metatronsCube\", \"triangle\"],\n category: \"basic\",\n heroCandidate: false,\n bestStyles: [\"fill-only\", \"fill-and-stroke\", \"watercolor\"],\n },\n star: {\n tier: 2,\n minSizeFraction: 0.08,\n maxSizeFraction: 0.6,\n affinities: [\"star\", \"circle\", \"mandala\", \"spirograph\"],\n category: \"basic\",\n heroCandidate: false,\n bestStyles: [\"fill-and-stroke\", \"stroke-only\", \"dashed\"],\n },\n \"jacked-star\": {\n tier: 3,\n minSizeFraction: 0.1,\n maxSizeFraction: 0.4,\n affinities: [\"star\", \"circle\"],\n category: \"basic\",\n heroCandidate: false,\n bestStyles: [\"stroke-only\", \"dashed\"],\n },\n heart: {\n tier: 3,\n minSizeFraction: 0.1,\n maxSizeFraction: 0.5,\n affinities: [\"circle\", \"blob\"],\n category: \"basic\",\n heroCandidate: false,\n bestStyles: [\"fill-only\", \"watercolor\"],\n },\n diamond: {\n tier: 2,\n minSizeFraction: 0.06,\n maxSizeFraction: 0.8,\n affinities: [\"diamond\", \"triangle\", \"square\", \"merkaba\"],\n category: \"basic\",\n heroCandidate: false,\n bestStyles: [\"fill-and-stroke\", \"fill-only\", \"double-stroke\"],\n },\n cube: {\n tier: 3,\n minSizeFraction: 0.08,\n maxSizeFraction: 0.5,\n affinities: [\"square\", \"diamond\"],\n category: \"basic\",\n heroCandidate: false,\n bestStyles: [\"stroke-only\", \"fill-and-stroke\"],\n },\n\n // ── Complex shapes ────────────────────────────────────────────\n platonicSolid: {\n tier: 2,\n minSizeFraction: 0.15,\n maxSizeFraction: 0.8,\n affinities: [\"metatronsCube\", \"merkaba\", \"hexagon\", \"triangle\"],\n category: \"complex\",\n heroCandidate: true,\n bestStyles: [\"stroke-only\", \"double-stroke\", \"dashed\"],\n },\n fibonacciSpiral: {\n tier: 1,\n minSizeFraction: 0.2,\n maxSizeFraction: 1.0,\n affinities: [\"circle\", \"rose\", \"spirograph\", \"flowerOfLife\"],\n category: \"complex\",\n heroCandidate: true,\n bestStyles: [\"stroke-only\", \"incomplete\", \"watercolor\"],\n },\n islamicPattern: {\n tier: 2,\n minSizeFraction: 0.25,\n maxSizeFraction: 0.9,\n affinities: [\"square\", \"hexagon\", \"star\", \"mandala\"],\n category: \"complex\",\n heroCandidate: true,\n bestStyles: [\"stroke-only\", \"dashed\", \"hatched\"],\n },\n celticKnot: {\n tier: 2,\n minSizeFraction: 0.2,\n maxSizeFraction: 0.7,\n affinities: [\"circle\", \"lissajous\", \"spirograph\"],\n category: \"complex\",\n heroCandidate: true,\n bestStyles: [\"stroke-only\", \"double-stroke\"],\n },\n merkaba: {\n tier: 1,\n minSizeFraction: 0.15,\n maxSizeFraction: 1.0,\n affinities: [\"triangle\", \"diamond\", \"sriYantra\", \"metatronsCube\"],\n category: \"complex\",\n heroCandidate: true,\n bestStyles: [\"stroke-only\", \"fill-and-stroke\", \"double-stroke\"],\n },\n mandala: {\n tier: 1,\n minSizeFraction: 0.2,\n maxSizeFraction: 1.0,\n affinities: [\"circle\", \"flowerOfLife\", \"spirograph\", \"rose\"],\n category: \"complex\",\n heroCandidate: true,\n bestStyles: [\"stroke-only\", \"dashed\", \"incomplete\"],\n },\n fractal: {\n tier: 2,\n minSizeFraction: 0.2,\n maxSizeFraction: 0.8,\n affinities: [\"blob\", \"lissajous\", \"circle\"],\n category: \"complex\",\n heroCandidate: true,\n bestStyles: [\"stroke-only\", \"incomplete\"],\n },\n\n // ── Sacred shapes ─────────────────────────────────────────────\n flowerOfLife: {\n tier: 1,\n minSizeFraction: 0.2,\n maxSizeFraction: 1.0,\n affinities: [\"circle\", \"hexagon\", \"seedOfLife\", \"eggOfLife\", \"metatronsCube\"],\n category: \"sacred\",\n heroCandidate: true,\n bestStyles: [\"stroke-only\", \"watercolor\", \"incomplete\"],\n },\n treeOfLife: {\n tier: 2,\n minSizeFraction: 0.25,\n maxSizeFraction: 0.9,\n affinities: [\"circle\", \"flowerOfLife\", \"metatronsCube\"],\n category: \"sacred\",\n heroCandidate: true,\n bestStyles: [\"stroke-only\", \"double-stroke\"],\n },\n metatronsCube: {\n tier: 1,\n minSizeFraction: 0.2,\n maxSizeFraction: 1.0,\n affinities: [\"hexagon\", \"flowerOfLife\", \"platonicSolid\", \"merkaba\"],\n category: \"sacred\",\n heroCandidate: true,\n bestStyles: [\"stroke-only\", \"dashed\", \"incomplete\"],\n },\n sriYantra: {\n tier: 1,\n minSizeFraction: 0.2,\n maxSizeFraction: 1.0,\n affinities: [\"triangle\", \"merkaba\", \"mandala\", \"diamond\"],\n category: \"sacred\",\n heroCandidate: true,\n bestStyles: [\"stroke-only\", \"fill-and-stroke\", \"double-stroke\"],\n },\n seedOfLife: {\n tier: 1,\n minSizeFraction: 0.15,\n maxSizeFraction: 0.9,\n affinities: [\"circle\", \"flowerOfLife\", \"eggOfLife\", \"hexagon\"],\n category: \"sacred\",\n heroCandidate: true,\n bestStyles: [\"stroke-only\", \"watercolor\", \"fill-only\"],\n },\n vesicaPiscis: {\n tier: 2,\n minSizeFraction: 0.15,\n maxSizeFraction: 0.7,\n affinities: [\"circle\", \"seedOfLife\", \"flowerOfLife\"],\n category: \"sacred\",\n heroCandidate: false,\n bestStyles: [\"stroke-only\", \"watercolor\"],\n },\n torus: {\n tier: 3,\n minSizeFraction: 0.2,\n maxSizeFraction: 0.6,\n affinities: [\"circle\", \"spirograph\", \"waveRing\"],\n category: \"sacred\",\n heroCandidate: false,\n bestStyles: [\"stroke-only\", \"dashed\"],\n },\n eggOfLife: {\n tier: 2,\n minSizeFraction: 0.15,\n maxSizeFraction: 0.8,\n affinities: [\"circle\", \"seedOfLife\", \"flowerOfLife\"],\n category: \"sacred\",\n heroCandidate: true,\n bestStyles: [\"stroke-only\", \"watercolor\"],\n },\n\n // ── Procedural shapes ─────────────────────────────────────────\n blob: {\n tier: 1,\n minSizeFraction: 0.05,\n maxSizeFraction: 1.0,\n affinities: [\"blob\", \"circle\", \"superellipse\", \"waveRing\"],\n category: \"procedural\",\n heroCandidate: false,\n bestStyles: [\"fill-only\", \"watercolor\", \"fill-and-stroke\", \"hand-drawn\"],\n },\n ngon: {\n tier: 2,\n minSizeFraction: 0.06,\n maxSizeFraction: 0.8,\n affinities: [\"hexagon\", \"triangle\", \"diamond\", \"superellipse\"],\n category: \"procedural\",\n heroCandidate: false,\n bestStyles: [\"fill-and-stroke\", \"fill-only\", \"hatched\"],\n },\n lissajous: {\n tier: 2,\n minSizeFraction: 0.15,\n maxSizeFraction: 0.8,\n affinities: [\"spirograph\", \"rose\", \"celticKnot\", \"fibonacciSpiral\"],\n category: \"procedural\",\n heroCandidate: false,\n bestStyles: [\"stroke-only\", \"incomplete\", \"dashed\"],\n },\n superellipse: {\n tier: 1,\n minSizeFraction: 0.05,\n maxSizeFraction: 1.0,\n affinities: [\"circle\", \"square\", \"blob\", \"hexagon\"],\n category: \"procedural\",\n heroCandidate: false,\n bestStyles: [\"fill-only\", \"watercolor\", \"fill-and-stroke\", \"wood-grain\"],\n },\n spirograph: {\n tier: 1,\n minSizeFraction: 0.15,\n maxSizeFraction: 0.9,\n affinities: [\"rose\", \"lissajous\", \"mandala\", \"flowerOfLife\"],\n category: \"procedural\",\n heroCandidate: true,\n bestStyles: [\"stroke-only\", \"incomplete\", \"dashed\"],\n },\n waveRing: {\n tier: 2,\n minSizeFraction: 0.1,\n maxSizeFraction: 0.8,\n affinities: [\"circle\", \"blob\", \"torus\", \"spirograph\"],\n category: \"procedural\",\n heroCandidate: false,\n bestStyles: [\"stroke-only\", \"dashed\", \"incomplete\"],\n },\n rose: {\n tier: 1,\n minSizeFraction: 0.1,\n maxSizeFraction: 0.9,\n affinities: [\"spirograph\", \"mandala\", \"flowerOfLife\", \"circle\"],\n category: \"procedural\",\n heroCandidate: true,\n bestStyles: [\"stroke-only\", \"fill-only\", \"watercolor\"],\n },\n\n // ── New procedural shapes ─────────────────────────────────────\n shardField: {\n tier: 2,\n minSizeFraction: 0.1,\n maxSizeFraction: 0.7,\n affinities: [\"voronoiCell\", \"diamond\", \"triangle\", \"penroseTile\"],\n category: \"procedural\",\n heroCandidate: false,\n bestStyles: [\"fill-and-stroke\", \"stroke-only\", \"fill-only\"],\n },\n voronoiCell: {\n tier: 1,\n minSizeFraction: 0.08,\n maxSizeFraction: 0.9,\n affinities: [\"shardField\", \"ngon\", \"superellipse\", \"blob\"],\n category: \"procedural\",\n heroCandidate: false,\n bestStyles: [\"fill-and-stroke\", \"fill-only\", \"watercolor\", \"marble-vein\"],\n },\n crescent: {\n tier: 1,\n minSizeFraction: 0.1,\n maxSizeFraction: 1.0,\n affinities: [\"circle\", \"blob\", \"cloudForm\", \"vesicaPiscis\"],\n category: \"procedural\",\n heroCandidate: true,\n bestStyles: [\"fill-only\", \"watercolor\", \"fill-and-stroke\"],\n },\n tendril: {\n tier: 2,\n minSizeFraction: 0.1,\n maxSizeFraction: 0.8,\n affinities: [\"blob\", \"inkSplat\", \"lissajous\", \"fibonacciSpiral\"],\n category: \"procedural\",\n heroCandidate: false,\n bestStyles: [\"fill-only\", \"watercolor\", \"fill-and-stroke\"],\n },\n cloudForm: {\n tier: 1,\n minSizeFraction: 0.15,\n maxSizeFraction: 1.0,\n affinities: [\"blob\", \"circle\", \"crescent\", \"superellipse\"],\n category: \"procedural\",\n heroCandidate: false,\n bestStyles: [\"fill-only\", \"watercolor\"],\n },\n inkSplat: {\n tier: 2,\n minSizeFraction: 0.1,\n maxSizeFraction: 0.8,\n affinities: [\"blob\", \"tendril\", \"shardField\", \"star\"],\n category: \"procedural\",\n heroCandidate: false,\n bestStyles: [\"fill-only\", \"watercolor\", \"fill-and-stroke\"],\n },\n geodesicDome: {\n tier: 2,\n minSizeFraction: 0.2,\n maxSizeFraction: 0.9,\n affinities: [\"metatronsCube\", \"platonicSolid\", \"hexagon\", \"triangle\"],\n category: \"procedural\",\n heroCandidate: true,\n bestStyles: [\"stroke-only\", \"dashed\", \"double-stroke\"],\n },\n penroseTile: {\n tier: 2,\n minSizeFraction: 0.06,\n maxSizeFraction: 0.6,\n affinities: [\"diamond\", \"triangle\", \"shardField\", \"voronoiCell\"],\n category: \"procedural\",\n heroCandidate: false,\n bestStyles: [\"fill-and-stroke\", \"fill-only\", \"double-stroke\"],\n },\n reuleauxTriangle: {\n tier: 1,\n minSizeFraction: 0.08,\n maxSizeFraction: 1.0,\n affinities: [\"triangle\", \"circle\", \"superellipse\", \"vesicaPiscis\"],\n category: \"procedural\",\n heroCandidate: true,\n bestStyles: [\"fill-and-stroke\", \"fill-only\", \"watercolor\"],\n },\n dotCluster: {\n tier: 3,\n minSizeFraction: 0.05,\n maxSizeFraction: 0.5,\n affinities: [\"cloudForm\", \"inkSplat\", \"blob\"],\n category: \"procedural\",\n heroCandidate: false,\n bestStyles: [\"fill-only\", \"stipple\"],\n },\n crosshatchPatch: {\n tier: 3,\n minSizeFraction: 0.1,\n maxSizeFraction: 0.6,\n affinities: [\"voronoiCell\", \"ngon\", \"superellipse\"],\n category: \"procedural\",\n heroCandidate: false,\n bestStyles: [\"stroke-only\", \"hatched\", \"fabric-weave\"],\n },\n};\n\n// ── Shape palette: curated sets of shapes that work well together ────\n\nexport interface ShapePalette {\n /** Primary shapes — used most often */\n primary: string[];\n /** Supporting shapes — used less frequently */\n supporting: string[];\n /** Accent shapes — rare, for visual punctuation */\n accents: string[];\n}\n\n/**\n * Build a curated shape palette from a seed shape.\n * Uses affinity data to select shapes that compose well together,\n * filtering out low-tier shapes that don't work at the current scale.\n */\nexport function buildShapePalette(\n rng: () => number,\n shapeNames: string[],\n archetypeName: string,\n): ShapePalette {\n const available = shapeNames.filter((s) => SHAPE_PROFILES[s]);\n\n // Pick a seed shape — tier 1 shapes that are hero candidates\n const heroPool = available.filter(\n (s) => SHAPE_PROFILES[s].tier === 1 && SHAPE_PROFILES[s].heroCandidate,\n );\n const seedShape = heroPool.length > 0\n ? heroPool[Math.floor(rng() * heroPool.length)]\n : available[Math.floor(rng() * available.length)];\n\n const seedProfile = SHAPE_PROFILES[seedShape];\n\n // Primary: seed shape + its direct affinities (tier 1-2 only)\n const primaryCandidates = [seedShape, ...seedProfile.affinities]\n .filter((s) => available.includes(s))\n .filter((s) => SHAPE_PROFILES[s].tier <= 2);\n const primary = [...new Set(primaryCandidates)].slice(0, 5);\n\n // Supporting: affinities of affinities, plus same-category shapes\n const supportingSet = new Set<string>();\n for (const p of primary) {\n const profile = SHAPE_PROFILES[p];\n if (!profile) continue;\n for (const aff of profile.affinities) {\n if (available.includes(aff) && !primary.includes(aff)) {\n supportingSet.add(aff);\n }\n }\n }\n // Add same-category tier 1-2 shapes\n for (const s of available) {\n const p = SHAPE_PROFILES[s];\n if (p.category === seedProfile.category && p.tier <= 2 && !primary.includes(s)) {\n supportingSet.add(s);\n }\n }\n const supporting = [...supportingSet].slice(0, 6);\n\n // Accents: tier 1 shapes from other categories for contrast\n const usedCategories = new Set(\n [...primary, ...supporting].map((s) => SHAPE_PROFILES[s]?.category),\n );\n const accentCandidates = available.filter(\n (s) =>\n !primary.includes(s) &&\n !supporting.includes(s) &&\n SHAPE_PROFILES[s].tier <= 2 &&\n !usedCategories.has(SHAPE_PROFILES[s].category),\n );\n // Shuffle and take a few\n const accents: string[] = [];\n const shuffled = [...accentCandidates];\n for (let i = shuffled.length - 1; i > 0; i--) {\n const j = Math.floor(rng() * (i + 1));\n [shuffled[i], shuffled[j]] = [shuffled[j], shuffled[i]];\n }\n accents.push(...shuffled.slice(0, 3));\n\n // For certain archetypes, bias the palette\n if (archetypeName === \"geometric-precision\") {\n // Remove blobs and organic shapes from primary\n return {\n primary: primary.filter((s) => SHAPE_PROFILES[s]?.category !== \"procedural\" || s === \"ngon\"),\n supporting: supporting.filter((s) => s !== \"blob\"),\n accents,\n };\n }\n if (archetypeName === \"organic-flow\") {\n // Boost procedural/organic shapes\n const organicBoost = available.filter(\n (s) => [\"blob\", \"superellipse\", \"waveRing\", \"rose\"].includes(s) && !primary.includes(s),\n );\n return {\n primary: [...primary, ...organicBoost.slice(0, 2)],\n supporting,\n accents,\n };\n }\n if (archetypeName === \"shattered-glass\") {\n // Favor angular, fragmented shapes\n const shardBoost = available.filter(\n (s) => [\"shardField\", \"voronoiCell\", \"penroseTile\", \"diamond\", \"triangle\", \"ngon\"].includes(s) && !primary.includes(s),\n );\n return {\n primary: [...primary.filter((s) => s !== \"blob\" && s !== \"cloudForm\"), ...shardBoost.slice(0, 3)],\n supporting: supporting.filter((s) => s !== \"blob\" && s !== \"cloudForm\"),\n accents,\n };\n }\n if (archetypeName === \"botanical\") {\n // Favor organic, flowing shapes\n const botanicalBoost = available.filter(\n (s) => [\"tendril\", \"cloudForm\", \"blob\", \"crescent\", \"rose\", \"inkSplat\"].includes(s) && !primary.includes(s),\n );\n return {\n primary: [...primary, ...botanicalBoost.slice(0, 3)],\n supporting,\n accents,\n };\n }\n if (archetypeName === \"stipple-portrait\") {\n // Favor small, dot-friendly shapes\n const stippleBoost = available.filter(\n (s) => [\"dotCluster\", \"circle\", \"crosshatchPatch\", \"voronoiCell\", \"blob\"].includes(s) && !primary.includes(s),\n );\n return {\n primary: [...primary, ...stippleBoost.slice(0, 3)],\n supporting,\n accents,\n };\n }\n if (archetypeName === \"celestial\") {\n // Favor sacred geometry and cosmic shapes\n const celestialBoost = available.filter(\n (s) => [\"crescent\", \"geodesicDome\", \"mandala\", \"flowerOfLife\", \"spirograph\", \"fibonacciSpiral\"].includes(s) && !primary.includes(s),\n );\n return {\n primary: [...primary, ...celestialBoost.slice(0, 3)],\n supporting,\n accents,\n };\n }\n\n return { primary, supporting, accents };\n}\n\n/**\n * Pick a shape from the palette with weighted probability.\n * Primary: ~60%, Supporting: ~30%, Accent: ~10%.\n * Also respects size constraints from the shape profile.\n */\nexport function pickShapeFromPalette(\n palette: ShapePalette,\n rng: () => number,\n sizeFraction: number,\n): string {\n // Filter each tier by size constraints\n const validPrimary = palette.primary.filter((s) => {\n const p = SHAPE_PROFILES[s];\n return p && sizeFraction >= p.minSizeFraction && sizeFraction <= p.maxSizeFraction;\n });\n const validSupporting = palette.supporting.filter((s) => {\n const p = SHAPE_PROFILES[s];\n return p && sizeFraction >= p.minSizeFraction && sizeFraction <= p.maxSizeFraction;\n });\n const validAccents = palette.accents.filter((s) => {\n const p = SHAPE_PROFILES[s];\n return p && sizeFraction >= p.minSizeFraction && sizeFraction <= p.maxSizeFraction;\n });\n\n const roll = rng();\n if (roll < 0.60 && validPrimary.length > 0) {\n return validPrimary[Math.floor(rng() * validPrimary.length)];\n }\n if (roll < 0.90 && validSupporting.length > 0) {\n return validSupporting[Math.floor(rng() * validSupporting.length)];\n }\n if (validAccents.length > 0) {\n return validAccents[Math.floor(rng() * validAccents.length)];\n }\n // Fallback: any valid primary or supporting\n const fallback = [...validPrimary, ...validSupporting];\n if (fallback.length > 0) return fallback[Math.floor(rng() * fallback.length)];\n // Ultimate fallback\n return palette.primary[0] || \"circle\";\n}\n\n/**\n * Get the best render style for a shape, with some randomness.\n * 70% chance of using one of the shape's best styles,\n * 30% chance of using the layer's style.\n */\nexport function pickStyleForShape(\n shapeName: string,\n layerStyle: string,\n rng: () => number,\n): string {\n const profile = SHAPE_PROFILES[shapeName];\n if (!profile || rng() > 0.7) return layerStyle;\n return profile.bestStyles[Math.floor(rng() * profile.bestStyles.length)];\n}\n","/**\n * Configuration options for image generation.\n */\nexport interface GenerationConfig {\n /** Canvas width in pixels (default: 2048) */\n width: number;\n /** Canvas height in pixels (default: 2048) */\n height: number;\n /** Controls base shape count per layer — gridSize² × 1.5 (default: 5) */\n gridSize: number;\n /** Number of layers to generate (default: 4) */\n layers: number;\n /** Minimum shape size in pixels, scaled to canvas (default: 30) */\n minShapeSize: number;\n /** Maximum shape size in pixels, scaled to canvas (default: 400) */\n maxShapeSize: number;\n /** Starting opacity for the first layer (default: 0.7) */\n baseOpacity: number;\n /** Opacity reduction per layer (default: 0.12) */\n opacityReduction: number;\n /** Base shapes per layer — defaults to gridSize² × 1.5 when 0 */\n shapesPerLayer: number;\n}\n\nexport const DEFAULT_CONFIG: GenerationConfig = {\n width: 2048,\n height: 2048,\n gridSize: 5,\n layers: 4,\n minShapeSize: 30,\n maxShapeSize: 400,\n baseOpacity: 0.7,\n opacityReduction: 0.12,\n shapesPerLayer: 0,\n};\n","/**\n * Visual archetypes — fundamentally different rendering personalities\n * selected deterministically from the hash.\n *\n * Each archetype overrides key rendering parameters to produce images\n * that look like they came from different generators entirely.\n */\nimport type { RenderStyle } from \"./canvas/draw\";\n\n// ── Background types ────────────────────────────────────────────────\n\nexport type BackgroundStyle =\n | \"radial-dark\" // current default: dark radial gradient\n | \"radial-light\" // light center, medium edges\n | \"linear-horizontal\" // left-to-right gradient\n | \"linear-diagonal\" // corner-to-corner gradient\n | \"solid-dark\" // flat dark color\n | \"solid-light\" // flat light/white color\n | \"multi-stop\"; // 3-4 color gradient\n\n// ── Palette modes ───────────────────────────────────────────────────\n\nexport type PaletteMode =\n | \"harmonious\" // current default: full palette\n | \"monochrome\" // single hue, varying lightness\n | \"duotone\" // two colors only\n | \"neon\" // high saturation on dark\n | \"pastel-light\" // soft pastels on light background\n | \"earth\" // muted warm naturals\n | \"high-contrast\" // black + white + one accent\n | \"split-complementary\" // base hue + two flanking complements\n | \"analogous-accent\" // tight analogous cluster + one distant accent\n | \"limited-palette\"; // 3 colors only, risograph-print feel\n\n// ── Archetype definition ────────────────────────────────────────────\n\nexport type CompositionMode =\n | \"radial\"\n | \"flow-field\"\n | \"spiral\"\n | \"grid-subdivision\"\n | \"clustered\"\n | \"golden-spiral\";\n\nexport interface Archetype {\n name: string;\n /** Override gridSize (controls shape count) */\n gridSize: number;\n /** Override layer count */\n layers: number;\n /** Override base opacity */\n baseOpacity: number;\n /** Override opacity reduction per layer */\n opacityReduction: number;\n /** Override min shape size */\n minShapeSize: number;\n /** Override max shape size */\n maxShapeSize: number;\n /** Background rendering style */\n backgroundStyle: BackgroundStyle;\n /** Color palette mode */\n paletteMode: PaletteMode;\n /** Preferred render styles (weighted toward these) */\n preferredStyles: RenderStyle[];\n /** Preferred composition modes (70% chance of using one of these) */\n preferredCompositions: CompositionMode[];\n /** Flow line count multiplier (1 = default) */\n flowLineMultiplier: number;\n /** Whether to draw the hero shape */\n heroShape: boolean;\n /** Glow probability multiplier */\n glowMultiplier: number;\n /** Shape size power curve exponent (higher = more small shapes) */\n sizePower: number;\n /** Whether to invert colors (light shapes on dark, or dark on light) */\n invertForeground: boolean;\n}\n\n// ── Archetype definitions ───────────────────────────────────────────\n\nconst ARCHETYPES: Archetype[] = [\n {\n name: \"dense-chaotic\",\n gridSize: 9,\n layers: 5,\n baseOpacity: 0.5,\n opacityReduction: 0.06,\n minShapeSize: 10,\n maxShapeSize: 200,\n backgroundStyle: \"radial-dark\",\n paletteMode: \"harmonious\",\n preferredStyles: [\"fill-and-stroke\", \"watercolor\", \"fill-only\"],\n preferredCompositions: [\"clustered\", \"flow-field\", \"radial\"],\n flowLineMultiplier: 2.5,\n heroShape: false,\n glowMultiplier: 0.5,\n sizePower: 1.2,\n invertForeground: false,\n },\n {\n name: \"minimal-spacious\",\n gridSize: 2,\n layers: 2,\n baseOpacity: 0.85,\n opacityReduction: 0.05,\n minShapeSize: 150,\n maxShapeSize: 600,\n backgroundStyle: \"solid-light\",\n paletteMode: \"duotone\",\n preferredStyles: [\"fill-and-stroke\", \"stroke-only\", \"incomplete\"],\n preferredCompositions: [\"golden-spiral\", \"grid-subdivision\"],\n flowLineMultiplier: 0.3,\n heroShape: true,\n glowMultiplier: 0,\n sizePower: 0.8,\n invertForeground: false,\n },\n {\n name: \"organic-flow\",\n gridSize: 4,\n layers: 3,\n baseOpacity: 0.4,\n opacityReduction: 0.08,\n minShapeSize: 20,\n maxShapeSize: 250,\n backgroundStyle: \"radial-dark\",\n paletteMode: \"earth\",\n preferredStyles: [\"watercolor\", \"fill-only\", \"incomplete\"],\n preferredCompositions: [\"flow-field\", \"golden-spiral\", \"spiral\"],\n flowLineMultiplier: 4,\n heroShape: false,\n glowMultiplier: 0.3,\n sizePower: 1.5,\n invertForeground: false,\n },\n {\n name: \"geometric-precision\",\n gridSize: 6,\n layers: 3,\n baseOpacity: 0.9,\n opacityReduction: 0.15,\n minShapeSize: 40,\n maxShapeSize: 300,\n backgroundStyle: \"solid-dark\",\n paletteMode: \"high-contrast\",\n preferredStyles: [\"stroke-only\", \"dashed\", \"double-stroke\", \"hatched\"],\n preferredCompositions: [\"grid-subdivision\", \"radial\"],\n flowLineMultiplier: 0,\n heroShape: false,\n glowMultiplier: 0,\n sizePower: 1.0,\n invertForeground: false,\n },\n {\n name: \"ethereal\",\n gridSize: 7,\n layers: 5,\n baseOpacity: 0.3,\n opacityReduction: 0.03,\n minShapeSize: 50,\n maxShapeSize: 500,\n backgroundStyle: \"radial-light\",\n paletteMode: \"pastel-light\",\n preferredStyles: [\"watercolor\", \"incomplete\", \"fill-only\"],\n preferredCompositions: [\"golden-spiral\", \"radial\", \"spiral\"],\n flowLineMultiplier: 1.5,\n heroShape: true,\n glowMultiplier: 2,\n sizePower: 1.4,\n invertForeground: false,\n },\n {\n name: \"bold-graphic\",\n gridSize: 2,\n layers: 2,\n baseOpacity: 0.95,\n opacityReduction: 0.1,\n minShapeSize: 200,\n maxShapeSize: 800,\n backgroundStyle: \"linear-diagonal\",\n paletteMode: \"duotone\",\n preferredStyles: [\"fill-and-stroke\", \"double-stroke\"],\n preferredCompositions: [\"grid-subdivision\", \"golden-spiral\"],\n flowLineMultiplier: 0,\n heroShape: true,\n glowMultiplier: 0,\n sizePower: 0.5,\n invertForeground: false,\n },\n {\n name: \"neon-glow\",\n gridSize: 5,\n layers: 4,\n baseOpacity: 0.6,\n opacityReduction: 0.1,\n minShapeSize: 20,\n maxShapeSize: 350,\n backgroundStyle: \"solid-dark\",\n paletteMode: \"neon\",\n preferredStyles: [\"stroke-only\", \"double-stroke\", \"dashed\"],\n preferredCompositions: [\"radial\", \"spiral\", \"clustered\"],\n flowLineMultiplier: 2,\n heroShape: true,\n glowMultiplier: 3,\n sizePower: 1.6,\n invertForeground: false,\n },\n {\n name: \"monochrome-ink\",\n gridSize: 6,\n layers: 3,\n baseOpacity: 0.7,\n opacityReduction: 0.15,\n minShapeSize: 15,\n maxShapeSize: 350,\n backgroundStyle: \"solid-light\",\n paletteMode: \"monochrome\",\n preferredStyles: [\"hatched\", \"incomplete\", \"stroke-only\", \"dashed\"],\n preferredCompositions: [\"flow-field\", \"grid-subdivision\", \"clustered\"],\n flowLineMultiplier: 1.5,\n heroShape: false,\n glowMultiplier: 0,\n sizePower: 1.8,\n invertForeground: false,\n },\n {\n name: \"cosmic\",\n gridSize: 8,\n layers: 5,\n baseOpacity: 0.5,\n opacityReduction: 0.06,\n minShapeSize: 5,\n maxShapeSize: 300,\n backgroundStyle: \"radial-dark\",\n paletteMode: \"neon\",\n preferredStyles: [\"fill-only\", \"watercolor\", \"fill-and-stroke\"],\n preferredCompositions: [\"radial\", \"spiral\", \"golden-spiral\"],\n flowLineMultiplier: 3,\n heroShape: true,\n glowMultiplier: 2.5,\n sizePower: 2.5,\n invertForeground: false,\n },\n {\n name: \"watercolor-wash\",\n gridSize: 3,\n layers: 3,\n baseOpacity: 0.25,\n opacityReduction: 0.03,\n minShapeSize: 200,\n maxShapeSize: 700,\n backgroundStyle: \"radial-light\",\n paletteMode: \"harmonious\",\n preferredStyles: [\"watercolor\", \"fill-only\", \"incomplete\"],\n preferredCompositions: [\"golden-spiral\", \"flow-field\", \"radial\"],\n flowLineMultiplier: 0.5,\n heroShape: false,\n glowMultiplier: 0.3,\n sizePower: 0.6,\n invertForeground: false,\n },\n {\n name: \"op-art\",\n gridSize: 8,\n layers: 2,\n baseOpacity: 0.95,\n opacityReduction: 0.05,\n minShapeSize: 20,\n maxShapeSize: 200,\n backgroundStyle: \"solid-light\",\n paletteMode: \"high-contrast\",\n preferredStyles: [\"fill-and-stroke\", \"stroke-only\", \"dashed\"],\n preferredCompositions: [\"grid-subdivision\", \"radial\"],\n flowLineMultiplier: 0,\n heroShape: false,\n glowMultiplier: 0,\n sizePower: 0.4,\n invertForeground: false,\n },\n {\n name: \"collage\",\n gridSize: 4,\n layers: 3,\n baseOpacity: 0.9,\n opacityReduction: 0.08,\n minShapeSize: 80,\n maxShapeSize: 500,\n backgroundStyle: \"solid-light\",\n paletteMode: \"duotone\",\n preferredStyles: [\"fill-and-stroke\", \"fill-only\", \"double-stroke\"],\n preferredCompositions: [\"grid-subdivision\", \"clustered\"],\n flowLineMultiplier: 0,\n heroShape: true,\n glowMultiplier: 0,\n sizePower: 0.7,\n invertForeground: false,\n },\n {\n name: \"classic\",\n gridSize: 5,\n layers: 4,\n baseOpacity: 0.7,\n opacityReduction: 0.12,\n minShapeSize: 30,\n maxShapeSize: 400,\n backgroundStyle: \"radial-dark\",\n paletteMode: \"harmonious\",\n preferredStyles: [\"fill-and-stroke\", \"watercolor\", \"fill-only\"],\n preferredCompositions: [\"radial\", \"golden-spiral\", \"flow-field\"],\n flowLineMultiplier: 1,\n heroShape: true,\n glowMultiplier: 1,\n sizePower: 1.8,\n invertForeground: false,\n },\n {\n name: \"shattered-glass\",\n gridSize: 8,\n layers: 3,\n baseOpacity: 0.85,\n opacityReduction: 0.1,\n minShapeSize: 15,\n maxShapeSize: 250,\n backgroundStyle: \"solid-dark\",\n paletteMode: \"high-contrast\",\n preferredStyles: [\"fill-and-stroke\", \"stroke-only\", \"fill-only\"],\n preferredCompositions: [\"clustered\", \"grid-subdivision\", \"radial\"],\n flowLineMultiplier: 0,\n heroShape: false,\n glowMultiplier: 0.3,\n sizePower: 1.0,\n invertForeground: false,\n },\n {\n name: \"botanical\",\n gridSize: 4,\n layers: 4,\n baseOpacity: 0.5,\n opacityReduction: 0.06,\n minShapeSize: 30,\n maxShapeSize: 400,\n backgroundStyle: \"radial-light\",\n paletteMode: \"earth\",\n preferredStyles: [\"watercolor\", \"fill-only\", \"incomplete\"],\n preferredCompositions: [\"flow-field\", \"golden-spiral\", \"spiral\"],\n flowLineMultiplier: 3,\n heroShape: true,\n glowMultiplier: 0.2,\n sizePower: 1.6,\n invertForeground: false,\n },\n {\n name: \"stipple-portrait\",\n gridSize: 9,\n layers: 2,\n baseOpacity: 0.8,\n opacityReduction: 0.05,\n minShapeSize: 5,\n maxShapeSize: 120,\n backgroundStyle: \"solid-light\",\n paletteMode: \"monochrome\",\n preferredStyles: [\"stipple\", \"fill-only\", \"hatched\"],\n preferredCompositions: [\"radial\", \"clustered\", \"flow-field\"],\n flowLineMultiplier: 0,\n heroShape: false,\n glowMultiplier: 0,\n sizePower: 2.8,\n invertForeground: false,\n },\n {\n name: \"celestial\",\n gridSize: 7,\n layers: 5,\n baseOpacity: 0.45,\n opacityReduction: 0.04,\n minShapeSize: 8,\n maxShapeSize: 450,\n backgroundStyle: \"radial-dark\",\n paletteMode: \"neon\",\n preferredStyles: [\"fill-only\", \"watercolor\", \"stroke-only\", \"incomplete\"],\n preferredCompositions: [\"spiral\", \"radial\", \"golden-spiral\"],\n flowLineMultiplier: 2,\n heroShape: true,\n glowMultiplier: 2.5,\n sizePower: 2.2,\n invertForeground: false,\n },\n];\n\n/**\n * Linearly interpolate between two archetype numeric parameters.\n */\nfunction lerpNum(a: number, b: number, t: number): number {\n return a + (b - a) * t;\n}\n\n/**\n * Blend two archetypes by interpolating their numeric parameters\n * and merging their style arrays.\n */\nfunction blendArchetypes(a: Archetype, b: Archetype, t: number): Archetype {\n // Merge preferred styles — unique union, primary archetype first\n const mergedStyles = [...new Set([...a.preferredStyles, ...b.preferredStyles])] as RenderStyle[];\n const mergedCompositions = [...new Set([...a.preferredCompositions, ...b.preferredCompositions])] as CompositionMode[];\n\n return {\n name: `${a.name}+${b.name}`,\n gridSize: Math.round(lerpNum(a.gridSize, b.gridSize, t)),\n layers: Math.round(lerpNum(a.layers, b.layers, t)),\n baseOpacity: lerpNum(a.baseOpacity, b.baseOpacity, t),\n opacityReduction: lerpNum(a.opacityReduction, b.opacityReduction, t),\n minShapeSize: Math.round(lerpNum(a.minShapeSize, b.minShapeSize, t)),\n maxShapeSize: Math.round(lerpNum(a.maxShapeSize, b.maxShapeSize, t)),\n backgroundStyle: t < 0.5 ? a.backgroundStyle : b.backgroundStyle,\n paletteMode: t < 0.5 ? a.paletteMode : b.paletteMode,\n preferredStyles: mergedStyles,\n preferredCompositions: mergedCompositions,\n flowLineMultiplier: lerpNum(a.flowLineMultiplier, b.flowLineMultiplier, t),\n heroShape: t < 0.5 ? a.heroShape : b.heroShape,\n glowMultiplier: lerpNum(a.glowMultiplier, b.glowMultiplier, t),\n sizePower: lerpNum(a.sizePower, b.sizePower, t),\n invertForeground: t < 0.5 ? a.invertForeground : b.invertForeground,\n };\n}\n\n/**\n * Select an archetype deterministically from the hash.\n * ~15% of hashes produce a blended archetype (interpolation of two).\n */\nexport function selectArchetype(rng: () => number): Archetype {\n const primary = ARCHETYPES[Math.floor(rng() * ARCHETYPES.length)];\n\n // ~15% chance of blending with a second archetype\n if (rng() < 0.15) {\n const secondary = ARCHETYPES[Math.floor(rng() * ARCHETYPES.length)];\n if (secondary.name !== primary.name) {\n const blendT = 0.25 + rng() * 0.25; // 25-50% blend toward secondary\n return blendArchetypes(primary, secondary, blendT);\n }\n }\n\n return primary;\n}\n"],"names":[],"version":3,"file":"main.js.map","sourceRoot":"../"}
|