@pixodesk/svg-animator-web 1.0.6

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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/PxAnimatorUtil.ts","../src/PxAnimatorDOM.ts","../src/PxAnimatorTriggers.ts","../src/PxAnimatorTypes.ts","../src/PxDefinitions.ts","../src/PxAnimatorFrameLoop.ts","../src/PxAnimatorWebApi.ts","../src/PxAnimator.ts"],"sourcesContent":["/*---------------------------------------------------------------------------------------\n * Copyright (c) Pixodesk LTD.\n * Licensed under the MIT License. See the LICENSE file in the project root for details.\n *---------------------------------------------------------------------------------------*/\n\nimport type { PxBezierPath } from './PxAnimatorTypes';\n\n\n/**\n * Converts a PxBezierPath to an SVG path string.\n * Control points (i, o) are treated as ABSOLUTE coordinates.\n * @param {PxBezierPath} path\n * @returns {string}\n */\nexport function bezierToSvgPath(path: PxBezierPath): string {\n const v = path.v;\n const i = path.i;\n const o = path.o;\n const c = path.c;\n\n if (!v.length) return \"\";\n\n const d: Array<string> = [];\n const len = v.length;\n d.push(\"M\" + v[0][0] + \",\" + v[0][1]);\n\n for (let idx = 1; idx < len; idx++) {\n const prevV = v[idx - 1];\n const prevO = o?.[idx - 1] ?? prevV;\n const currI = i?.[idx] ?? v[idx];\n const currV = v[idx];\n\n // Check if it's a straight line (control points coincide with vertices)\n const isLine = (prevO[0] === prevV[0] && prevO[1] === prevV[1]) &&\n (currI[0] === currV[0] && currI[1] === currV[1]);\n\n if (isLine) {\n d.push(\"L\" + currV[0] + \",\" + currV[1]);\n } else {\n // Control points are absolute coordinates\n d.push(\"C\" + prevO[0] + \",\" + prevO[1] + \",\" + currI[0] + \",\" + currI[1] + \",\" + currV[0] + \",\" + currV[1]);\n }\n }\n\n if (c && len > 0) {\n const lastV = v[len - 1];\n const lastO = o?.[len - 1] ?? lastV;\n const firstI = i?.[0] ?? v[0];\n const firstV = v[0];\n\n // Check if closing segment is a straight line\n const isLine = (lastO[0] === lastV[0] && lastO[1] === lastV[1]) &&\n (firstI[0] === firstV[0] && firstI[1] === firstV[1]);\n\n if (!isLine) {\n d.push(\"C\" + lastO[0] + \",\" + lastO[1] + \",\" + firstI[0] + \",\" + firstI[1] + \",\" + firstV[0] + \",\" + firstV[1]);\n }\n\n d.push(\"z\");\n }\n\n return d.join(\"\");\n}\n\n/**\n * @param {number} a \n * @param {number} b \n * @param {number} t \n * @returns {number}\n */\nexport function interpolateNum(a: number, b: number, t: number): number {\n return a + (b - a) * t;\n}\n\n\n/**\n * @param {Array<number>} a \n * @param {Array<number>} b \n * @param {number} t \n * @returns {Array<number>}\n */\nexport function interpolateVec(a: Array<number>, b: Array<number>, t: number): Array<number> {\n const res: Array<number> = [];\n const count = Math.max(a.length, b.length);\n for (let i = 0; i < count; i++) {\n res[i] = interpolateNum(a[i] || 0, b[i] || 0, t);\n }\n return res;\n}\n\n/**\n * Interpolates between two color arrays [r, g, b] or [r, g, b, a].\n * Normalizes both colors to 4 elements, defaulting alpha to 1 if missing.\n */\nexport function interpolateColor(a: Array<number>, b: Array<number>, t: number): Array<number> {\n return [\n interpolateNum(a[0] || 0, b[0] || 0, t),\n interpolateNum(a[1] || 0, b[1] || 0, t),\n interpolateNum(a[2] || 0, b[2] || 0, t),\n interpolateNum(a[3] === undefined ? 1 : a[3], b[3] === undefined ? 1 : b[3], t)\n ];\n}\n\n/**\n * Interpolates between two arrays of bezier paths.\n * @param paths1 The starting array of paths.\n * @param paths2 The ending array of paths.\n * @param progress The interpolation progress from 0.0 to 1.0.\n */\nexport function interpolateBeziers(\n paths1: Array<PxBezierPath>,\n paths2: Array<PxBezierPath>,\n progress: number\n): Array<PxBezierPath> {\n const count = Math.max(paths1.length, paths2.length);\n const res: Array<PxBezierPath> = [];\n for (let i = 0; i < count; i++) {\n res.push(interpolateBezier(paths1[i], paths2[i], progress));\n }\n return res;\n}\n\n/**\n * Interpolates between two bezier paths.\n * Control points (i, o) are treated as ABSOLUTE coordinates.\n * When control points are missing, they default to the vertex position.\n * @param {PxBezierPath} path1\n * @param {PxBezierPath} path2\n * @param {number} progress\n * @returns {PxBezierPath}\n */\nexport function interpolateBezier(\n path1: PxBezierPath | undefined,\n path2: PxBezierPath | undefined,\n progress: number\n): PxBezierPath {\n if (!path1 || !path2) return path1 || path2 || { v: [] };\n\n const t = Math.min(Math.max(progress, 0), 1);\n const len = Math.min(path1.v.length, path2.v.length);\n\n const v: Array<Array<number>> = [];\n const i: Array<Array<number>> = [];\n const o: Array<Array<number>> = [];\n\n for (let idx = 0; idx < len; idx++) {\n const v1 = path1.v[idx];\n const v2 = path2.v[idx];\n v.push(interpolateVec(v1, v2, t));\n\n // For absolute control points, default to vertex position (straight line)\n const i1 = path1.i?.[idx] ?? v1;\n const i2 = path2.i?.[idx] ?? v2;\n i.push(interpolateVec(i1, i2, t));\n\n const o1 = path1.o?.[idx] ?? v1;\n const o2 = path2.o?.[idx] ?? v2;\n o.push(interpolateVec(o1, o2, t));\n }\n\n return { v, i: i.length ? i : undefined, o: o.length ? o : undefined, c: path1.c ?? path2.c };\n}\n\n\n/**\n * Remap a number from one range to another.\n *\n * @param {number} value - The input value.\n * @param {number} inMin - Lower bound of the input range.\n * @param {number} inMax - Upper bound of the input range.\n * @param {number} outMin - Lower bound of the output range.\n * @param {number} outMax - Upper bound of the output range.\n * @returns The remapped value.\n */\nexport function remap(\n value: number,\n inMin: number,\n inMax: number,\n outMin: number,\n outMax: number\n): number {\n if (inMax === inMin) return outMin; // avoid divide-by-zero\n const t = (value - inMin) / (inMax - inMin);\n return outMin + t * (outMax - outMin);\n}\n\n/**\n * Creates a cubic-bezier easing function.\n * @param easing An array of four numbers [x1, y1, x2, y2] defining the bezier curve.\n * @returns A function that takes a progress value (0-1) and returns an eased value.\n */\nexport function cubicBezier(easing: [number, number, number, number]) {\n const [p1x, p1y, p2x, p2y] = easing;\n\n const cx = 3 * p1x;\n const bx = 3 * (p2x - p1x) - cx;\n const ax = 1 - cx - bx;\n const cy = 3 * p1y;\n const by = 3 * (p2y - p1y) - cy;\n const ay = 1 - cy - by;\n\n function sampleCurveX(t: number) { return ((ax * t + bx) * t + cx) * t; }\n function sampleCurveY(t: number) { return ((ay * t + by) * t + cy) * t; }\n function sampleCurveDerivativeX(t: number) { return (3 * ax * t + 2 * bx) * t + cx; }\n\n function solveCurveX(x: number) {\n // Handle edge cases\n if (x <= 0) return 0;\n if (x >= 1) return 1;\n\n // Use binary search as fallback when derivative is too small\n let t2 = x;\n let t0 = 0;\n let t1 = 1;\n\n // Try Newton-Raphson first\n for (let i = 0; i < 8; i++) {\n const x2 = sampleCurveX(t2) - x;\n if (Math.abs(x2) < 1e-6) return t2;\n\n const d2 = sampleCurveDerivativeX(t2);\n if (Math.abs(d2) < 1e-6) break; // Derivative too small, switch to bisection\n\n t2 -= x2 / d2;\n }\n\n // Fallback to binary search, e.g. solves such easings as [0, 0, 0, 1]\n t2 = x;\n while (t0 < t1) {\n const x2 = sampleCurveX(t2);\n if (Math.abs(x2 - x) < 1e-6) return t2;\n if (x > x2) t0 = t2;\n else t1 = t2;\n t2 = (t1 + t0) / 2;\n }\n\n return t2;\n }\n\n return function (x: number) {\n return sampleCurveY(solveCurveX(x));\n };\n}\n\n/**\n * Converts a color from a [r, g, b, a] array (where values are 0-1) to an rgba() or rgb() CSS string.\n * @param color The color array.\n */\nexport function toRGBA(color: Array<number>): string {\n const r = Math.round(color[0] * 255);\n const g = Math.round(color[1] * 255);\n const b = Math.round(color[2] * 255);\n return color.length === 4 ?\n 'rgba(' + r + ',' + g + ',' + b + ',' + color[3] + ')' :\n 'rgb(' + r + ',' + g + ',' + b + ')';\n}\n\n/** Parse rgb/rgba string to normalized array */\nexport function parseRgba(s: string): number[] {\n const inner = s.match(/rgba?\\((.*)\\)/)?.[1];\n if (!inner) throw new Error('Invalid rgb/rgba format');\n const parts = inner.split(',').map(v => +v.trim());\n return [parts[0] / 255, parts[1] / 255, parts[2] / 255, ...(parts[3] !== undefined ? [parts[3]] : [])];\n}\n\n/** Parse hex string to normalized array (#RGB, #RGBA, #RRGGBB, #RRGGBBAA) */\nfunction parseHex(s: string): number[] {\n const hex = s.slice(1); // Remove '#'\n const isShort = hex.length <= 4; // #RGB or #RGBA vs #RRGGBB or #RRGGBBAA\n\n const r = isShort ? hex[0] + hex[0] : hex.slice(0, 2);\n const g = isShort ? hex[1] + hex[1] : hex.slice(2, 4);\n const b = isShort ? hex[2] + hex[2] : hex.slice(4, 6);\n const a = hex.length === 4 ? hex[3] + hex[3] : hex.length === 8 ? hex.slice(6, 8) : null;\n\n const result = [\n parseInt(r, 16) / 255,\n parseInt(g, 16) / 255,\n parseInt(b, 16) / 255\n ];\n\n if (a !== null) {\n result.push(parseInt(a, 16) / 255);\n }\n\n return result;\n}\n\n//// FIXME - support normalisation of config from different formats\n/** Parse color string (hex or rgb/rgba) to normalized [r, g, b] or [r, g, b, a] array (0-1 range) */\nexport function parseColor(s: any): number[] | undefined {\n if (!s) return undefined;\n if (Array.isArray(s)) return s;\n if (typeof s !== 'string') return undefined;\n if (s.startsWith('#')) {\n return parseHex(s);\n } else if (s.startsWith('rgb')) {\n return parseRgba(s);\n } else {\n // FIXME - come up with some solution how to report errors...\n console.warn('Unsupported color format: ' + s);\n }\n return undefined;\n}\n\nexport const COLOUR_ATTR_NAMES = new Set([\"color\", \"fill\", \"flood-color\", \"lighting-color\", \"stop-color\", \"stroke\"]);\nexport const TRANSFORM_FN_NAMES = new Set([\"translate\", \"rotate\", \"scale\", \"skew\"]);\nexport const PCT_BASED_ATTR_NAMES = new Set([\"offset-distance\", \"offsetDistance\"]);\nexport const STYLE_ATTR_NAMES = new Set([\"offset-distance\", \"offsetDistance\"]); // Props that need to go to style\nexport const DEFAULT_DURATION_MS = 1000;\n\n/**\n * Converts a kebab-case string to camelCase.\n * @param kebab The kebab-case string.\n */\nexport function kebabToCamelCaseWord(kebab: string): string {\n return kebab.includes('-') ? kebab.replace(/-([a-z])/g, (_, letter) => letter.toUpperCase()) : kebab;\n}\n\n/**\n * Checks if a string is in camelCase.\n * @param word The string to check.\n */\nexport function isCamelCaseWord(word: string): boolean {\n return !word.includes('-') && /[a-z][A-Z]/.test(word);\n}\n\n// FIXME - docs, rename?\nconst SVG_CAMEL_CASE_ATTRS = new Set([\n // Transform/positioning\n 'viewBox',\n 'preserveAspectRatio',\n\n // Gradient\n 'gradientUnits',\n 'gradientTransform',\n 'spreadMethod',\n\n // Pattern\n 'patternUnits',\n 'patternContentUnits',\n 'patternTransform',\n\n // Clipping/masking\n 'clipPathUnits',\n 'maskUnits',\n 'maskContentUnits',\n\n // Text\n 'textLength',\n 'lengthAdjust',\n 'startOffset',\n\n // Filter\n 'filterUnits',\n 'primitiveUnits',\n 'stdDeviation',\n 'baseFrequency',\n 'numOctaves',\n 'surfaceScale',\n 'diffuseConstant',\n 'specularConstant',\n 'specularExponent',\n 'kernelMatrix',\n 'kernelUnitLength',\n 'edgeMode',\n 'preserveAlpha',\n 'targetX',\n 'targetY',\n\n // // Animation\n // 'attributeName',\n // 'attributeType',\n // 'calcMode',\n // 'keyTimes',\n // 'keySplines',\n // 'repeatCount',\n // 'repeatDur' \n]);\n\n/**\n * Converts a camelCase string to kebab-case.\n * @param camel The camelCase string.\n */\nexport function camelCaseToKebabWordIfNeeded(camel: string): string { // FIXME - docs, rename function?\n return SVG_CAMEL_CASE_ATTRS.has(camel) ?\n camel :\n camel.replace(/([a-z0-9])([A-Z])/g, '$1-$2').toLowerCase();\n}\n\n/**\n * Checks if a CSS property is set inline on an element's style.\n * \n * @param {!CSSStyleDeclaration} style - element.style (CSSStyleDeclaration)\n * @param {string} propName - property name (camelCase or kebab-case)\n * @return {boolean}\n */\nexport function hasStyleProp(\n style: CSSStyleDeclaration,\n propName: string\n): boolean {\n return style.getPropertyValue(propName) !== '';\n}\n\n/**\n * Clamps a number between a minimum and maximum value.\n * @param value The number to clamp.\n * @param min The minimum value.\n * @param max The maximum value.\n */\nexport function clamp(value: number, min: number, max: number): number {\n return Math.max(min, Math.min(value, max));\n}","/*---------------------------------------------------------------------------------------\n * Copyright (c) Pixodesk LTD.\n * Licensed under the MIT License. See the LICENSE file in the project root for details.\n *---------------------------------------------------------------------------------------*/\n\nimport type { PxDefs, PxNode } from './PxAnimatorTypes';\nimport { camelCaseToKebabWordIfNeeded, COLOUR_ATTR_NAMES, toRGBA, TRANSFORM_FN_NAMES } from './PxAnimatorUtil';\n\n\nconst SVG_NS = 'http://www.w3.org/2000/svg';\n\n// FIXME - do we need this?\n// Attributes that should not be set on DOM elements (internal use only)\nconst INTERNAL_ATTRS = new Set(['type', 'children', 'animate', 'style', 'animator', 'defs', 'bindings']);\n\nfunction createElement(\n tagName: string,\n props: { [k: string]: string },\n style?: Record<string, string | number>,\n children?: Array<Element>\n) {\n const element = document.createElementNS(SVG_NS, tagName);\n\n for (const propName in props) {\n element.setAttribute(camelCaseToKebabWordIfNeeded(propName), props[propName]);\n }\n\n // Apply style properties directly (avoids kebab-case issues)\n if (style) {\n for (const styleProp in style) {\n (element as any).style[styleProp] = String(style[styleProp]);\n }\n }\n\n if (children) {\n for (const child of children) {\n element.appendChild(child);\n }\n }\n\n return element;\n}\n\n\n/** FIXME - do we need this?\n * Resolves a style reference to an actual style object.\n */\nfunction resolveStyle(\n style: string | Record<string, string | number> | undefined,\n defs?: PxDefs\n): Record<string, string | number> | undefined {\n if (!style) return undefined;\n\n if (typeof style === 'string') {\n // Look up named style in defs\n return defs?.styles?.[style];\n }\n\n return style;\n}\n\n\nexport function getNormalizedProps(props: Record<string, any>) {\n const propsCopy: Record<string, any> = {};\n\n // Process regular attributes\n for (const key of Object.keys(props)) {\n if (INTERNAL_ATTRS.has(key)) continue;\n\n let value = props[key];\n\n if (COLOUR_ATTR_NAMES.has(key) && Array.isArray(value)) {\n propsCopy[key] = toRGBA(value);\n } else if (TRANSFORM_FN_NAMES.has(key)) {\n if (Array.isArray(value)) {\n if (key === 'translate') value = value.map((v: number) => v + 'px');\n value = value.join(',');\n }\n if (key === 'rotate') value = value + 'deg';\n propsCopy['transform'] = key + '(' + value + ')';\n } else if (value !== undefined && value !== null) {\n propsCopy[key] = String(value);\n }\n }\n\n return propsCopy;\n}\n\n/**\n * Renders a PxNode tree to DOM elements.\n */\nexport function renderNode(node: PxNode, defs?: PxDefs): Element | null {\n if (!node) return null;\n\n const { type, children, animate, style, ...props } = node;\n\n // Extract defs from root svg node\n const nodeDefs = (node as any).defs || defs;\n\n // Resolve style reference\n const resolvedStyle = resolveStyle(style, nodeDefs);\n\n // Process children\n let childElements: Array<Element> | undefined;\n if (children) {\n for (const ch of children) {\n const child = renderNode(ch, nodeDefs);\n if (child) {\n if (!childElements) childElements = [];\n childElements.push(child);\n }\n }\n }\n\n return createElement(\n type || 'g',\n getNormalizedProps(props),\n resolvedStyle,\n childElements\n );\n}\n","/*---------------------------------------------------------------------------------------\n * Copyright (c) Pixodesk LTD.\n * Licensed under the MIT License. See the LICENSE file in the project root for details.\n *---------------------------------------------------------------------------------------*/\n\nimport type { PxAnimatorAPI, PxTrigger } from './PxAnimatorTypes';\n\n\n/**\n * Sets up event-based triggers for an animation.\n *\n * This function attaches event listeners to the animation's root element based on the\n * provided configuration, allowing animations to be started by user interactions\n * or visibility changes.\n *\n * ### Trigger Options (startOn):\n * - 'load': Starts after the page loads.\n * - 'mouseOver': Starts on mouse enter.\n * - 'click': Toggles play/end action on click.\n * - 'scrollIntoView': Starts when the element scrolls into the viewport.\n * - 'programmatic': No automatic start. Must be controlled via the API.\n *\n * ### End Action Options (outAction):\n * Defines behavior when the trigger condition ends (e.g., mouse leave).\n * - 'continue': Animation continues playing.\n * - 'pause': Pauses the animation.\n * - 'reset': Cancels the animation, resetting it to the start.\n * - 'reverse': Reverses the animation playback.\n *\n * @param {!PxAnimatorAPI} api The animator API instance to control.\n * @param {!PxTrigger} config The trigger configuration object.\n * @returns {!PxAnimatorAPI} The same animator API instance, for chaining.\n */\nexport function setupAnimationTriggers(\n api: PxAnimatorAPI,\n config: PxTrigger\n): PxAnimatorAPI {\n const { startOn, outAction = 'continue', scrollIntoViewThreshold = 0.5 } = config;\n\n const root = api.getRootElement();\n\n if (!root) {\n console.warn('setupAnimationTriggers: No root element found for animation.');\n return api;\n }\n\n /** Ensures forward playback and starts or resumes the animation. */\n const start = () => {\n api.play();\n };\n\n /** Handles what to do when the element leaves the active trigger condition. */\n const handleEndAction = () => {\n switch (outAction) {\n case 'pause':\n api.pause();\n break;\n case 'reset':\n api.cancel();\n break;\n case 'reverse':\n // If reverse playback is implemented, this would set a negative playback rate.\n // For now we just call play() for compatibility.\n // api.setPlaybackRate(-1);\n api.play();\n break;\n case 'continue':\n default:\n // Do nothing\n break;\n }\n };\n\n // ---- Setup event-based start logic ----\n switch (startOn) {\n case 'load': {\n const startHandler = () => start();\n if (document.readyState === 'complete') {\n startHandler();\n } else {\n window.addEventListener('load', startHandler, { once: true });\n }\n break;\n }\n\n case 'mouseOver': {\n const mouseOverHandler = () => start();\n const mouseOutHandler = () => handleEndAction();\n\n root.addEventListener('mouseenter', mouseOverHandler);\n root.addEventListener('mouseleave', mouseOutHandler);\n break;\n }\n\n case 'click': {\n const clickHandler = () => {\n if (api.isPlaying()) {\n handleEndAction();\n } else {\n start();\n }\n };\n root.addEventListener('click', clickHandler);\n break;\n }\n\n case 'scrollIntoView': {\n const observer = new IntersectionObserver(\n entries => {\n entries.forEach(entry => {\n // If the element is at least partially visible\n if (entry.isIntersecting && entry.intersectionRatio >= scrollIntoViewThreshold) {\n start();\n } else {\n // Element scrolled off screen -> trigger handleEndAction\n handleEndAction();\n }\n });\n },\n { threshold: scrollIntoViewThreshold }\n );\n observer.observe(root);\n break;\n }\n\n case 'programmatic':\n // No auto-start; external code must call play()\n break;\n }\n\n return api;\n}\n","/*---------------------------------------------------------------------------------------\n * Copyright (c) Pixodesk LTD.\n * Licensed under the MIT License. See the LICENSE file in the project root for details.\n *---------------------------------------------------------------------------------------*/\n\nexport type FillMode = 'forwards' | 'backwards' | 'both' | 'none';\n\nexport type PlaybackDirection = 'normal' | 'reverse' | 'alternate' | 'alternate-reverse';\n\nexport const PX_ANIM_SRC_ATTR_NAME = 'data-px-animation-src';\n\nexport const PX_ANIM_ATTR_NAME = '_px_animator';\n\n\n/**\n * Easing function definition.\n * Can be a named reference to a predefined easing or a cubic-bezier array [x1, y1, x2, y2].\n *\n * @example \"ease-in\" | \"easeOut\" | [0.68, -0.55, 0.265, 1.55]\n */\nexport type PxEasingOrRef = string | [number, number, number, number];\n\n/**\n * A single animation keyframe defining the state at a specific point in time.\n * Supports both full property names and short aliases for compact notation.\n */\nexport interface PxKeyframe {\n /** Timestamp in milliseconds from animation start */\n time?: number;\n\n /** Short alias for \"time\" */\n t?: number;\n\n /** The value of the animated property at this keyframe */\n value?: any;\n\n /** Short alias for \"value\" */\n v?: any;\n\n /** Easing function to use when transitioning to this keyframe from the previous one */\n easing?: PxEasingOrRef;\n\n /** Short alias for \"easing\" */\n e?: PxEasingOrRef;\n}\n\n/**\n * Animation definition for a single CSS/SVG property.\n * Contains an array of keyframes that define how the property changes over time.\n */\nexport interface PxPropertyAnimation {\n /** Array of keyframes defining the animation timeline */\n keyframes?: PxKeyframe[];\n\n /** Short alias for \"keyframes\" */\n kfs?: PxKeyframe[];\n}\n\n/**\n * Complete animation definition containing one or more property animations.\n * Each key is a CSS/SVG property name (e.g., \"opacity\", \"scale\", \"rotate\").\n *\n * @example\n * {\n * \"opacity\": { keyframes: [...] },\n * \"scale\": { keyframes: [...] }\n * }\n */\nexport interface PxAnimationDefinition {\n [property: string]: PxPropertyAnimation;\n}\n\n/**\n * Defines when and how an animation should be triggered.\n */\nexport interface PxTrigger {\n /** Event that starts the animation */\n startOn?: 'load' | 'mouseOver' | 'click' | 'scrollIntoView' | 'programmatic';\n\n /** Action to take when the trigger condition is no longer met (e.g., mouse leaves) */\n outAction?: 'continue' | 'pause' | 'reset' | 'reverse';\n\n /** Percentage of element visibility required to trigger (0-1). Only applies to scrollIntoView. */\n scrollIntoViewThreshold?: number;\n}\n\n/**\n * Global animation configuration that applies to all animations in the document.\n * Defines timing, playback behavior, and rendering strategy.\n */\nexport interface PxAnimatorConfig {\n /** JavaScript animation implementation strategy */\n mode?: \"auto\" | \"webapi\" | \"frames\";\n\n /** Total animation duration in milliseconds */\n duration?: number;\n\n /** Delay before animation starts in milliseconds */\n delay?: number;\n\n /** Number of times to repeat the animation. Use \"infinite\" for endless loop. */\n iterations?: number | \"infinite\";\n\n /** Defines which values are applied before/after the animation */\n fill?: FillMode;\n\n /** Direction of animation playback */\n direction?: PlaybackDirection;\n\n /** Target frame rate for frame-based animations (only applicable when mode=\"frames\") */\n frameRate?: number;\n\n /** Trigger configuration for when animation should start */\n trigger?: PxTrigger;\n\n debug?: boolean; // FIXME - implement\n\n debugInstName?: string; // FIXME - implement\n}\n\n/**\n * Reusable definitions library for easings, animations, and styles.\n * Allows to define once and referencing by name.\n */\nexport interface PxDefs {\n /** Named cubic-bezier easing functions */\n easings?: {\n [name: string]: [number, number, number, number];\n };\n\n /** Named animation definitions that can be referenced by elements */\n animations?: {\n [name: string]: PxAnimationDefinition;\n };\n\n /** \n * FIXME - do we need it?\n * Named style presets for common styling patterns \n */\n styles?: {\n [name: string]: Record<string, string | number>;\n };\n}\n\n/**\n * Element animation specification.\n * Can be:\n * - A string referencing a named animation from defs\n * - An array of named animation references\n * - An inline PxAnimationDefinition object\n * - A mixed array of references and inline definitions\n *\n * @example\n * \"fadeIn\"\n * [\"fadeIn\", \"spin\"]\n * { opacity: { keyframes: [...] } }\n * [\"fadeIn\", { scale: { keyframes: [...] } }]\n */\nexport type PxElementAnimation =\n | string\n | string[]\n | PxAnimationDefinition\n | (string | PxAnimationDefinition)[];\n\n/**\n * Base interface for all SVG elements.\n * Represents a node in the SVG tree with optional animations and children.\n */\nexport interface PxNode {\n /** SVG element type (e.g., \"circle\", \"rect\", \"path\", \"g\") */\n type: string;\n\n /** Child elements (for container elements like <g>) */\n children?: PxNode[];\n\n /** Animation applied to this element */\n animate?: PxElementAnimation;\n\n /** \n * FIXME - do we need it?\n * Style applied to this element (named reference or inline object) \n */\n style?: string | Record<string, string | number>;\n\n /** All other SVG attributes (cx, cy, r, fill, stroke, etc.) */\n [key: string]: any;\n}\n\n/**\n * Binds animations to existing DOM elements via CSS selectors.\n * Used when the SVG tree is pre-rendered and animations are applied separately.\n */\nexport interface PxBinding {\n /** ID targeting elements in the DOM (data-px-id=\"...\") */\n id: string;\n\n /** Animation to apply to matched elements */\n animate: PxElementAnimation;\n}\n\n/**\n * Root SVG element containing the entire animated graphic.\n * Extends PxNode with SVG-specific properties and global configuration.\n */\nexport interface PxSvgNode extends PxNode {\n\n /** FIXME - do we need it? \n * SVG viewport width */\n width?: number;\n\n /** FIXME - do we need it? \n * SVG viewport height */\n height?: number;\n\n /** FIXME - do we need it? \n * SVG viewBox attribute defining coordinate system */\n viewBox?: string;\n\n /** Global animation configuration */\n animator?: PxAnimatorConfig;\n\n /** Reusable definitions library */\n defs?: PxDefs;\n\n /** Animation bindings for pre-rendered DOM elements */\n bindings?: PxBinding[];\n\n design?: PxNode;\n}\n\n/**\n * The complete animated SVG document.\n * This is the root type for the entire file format.\n */\nexport interface PxAnimatedSvgDocument extends PxSvgNode {\n}\n\n// ============================================================================\n// API INTERFACES\n// ============================================================================\n\n/** A configuration object for animation lifecycle callbacks. */\nexport interface PxAnimatorCallbacksConfig {\n\n /** Callback executed when the animation starts or resumes. */\n onPlay?: () => void;\n\n /** Callback executed when the animation is paused. */\n onPause?: () => void;\n\n /** Callback executed when the animation is cancelled. */\n onCancel?: () => void;\n\n /** Callback executed when the animation finishes naturally. */\n onFinish?: () => void;\n\n /** Callback executed when the animation is removed. */\n onRemove?: () => void;\n}\n\n\nexport type PxPoint2D = Array<number>;\n\n/** Represents a vector path for SVG shape animations. */\nexport interface PxBezierPath {\n\n /** An array of vertex points [[x, y], ...]. */\n v: Array<PxPoint2D>;\n\n /** An array of 'in' tangent handles for each vertex [[x, y], ...]. */\n i?: Array<PxPoint2D>;\n\n /** An array of 'out' tangent handles for each vertex [[x, y], ...]. */\n o?: Array<PxPoint2D>;\n\n /** A boolean indicating if the path is closed. */\n c?: boolean;\n}\n\n/** Basic animation controls common to all animator types. */\nexport interface PxBasicAnimatorAPI {\n\n isReady(): boolean;\n\n /** Returns the root HTML element for the animation. */\n getRootElement(): Element | null;\n\n /** Returns true if the animation is currently running. */\n isPlaying(): boolean;\n\n /** Starts or resumes the animation. */\n play(): void;\n\n /** Pauses the animation at its current state. */\n pause(): void;\n\n /** Stops the animation and resets it to its initial state. */\n cancel(): void;\n\n}\n\n/** The full programmatic control interface for an animation. */\nexport interface PxAnimatorAPI extends PxBasicAnimatorAPI {\n\n /** Jumps to the end of the animation and holds the final state. */\n finish(): void;\n\n /** Changes the speed of the animation. 1 is normal, 2 is double, -1 is reverse. */\n setPlaybackRate(rate: number): void;\n\n /** Returns the current playback time in milliseconds. */\n getCurrentTime(): number | null;\n\n /** Jumps to a specific time (in milliseconds) in the animation. */\n setCurrentTime(time: number): void;\n\n /** Stops the animation and cleans up all associated resources. */\n destroy(): void;\n}\n\n\n// ============================================================================\n// HELPER FUNCTIONS\n// ============================================================================\n\nexport function isPxElementFileFormat(fileJson: any): fileJson is PxAnimatedSvgDocument {\n if (!(\n fileJson &&\n typeof fileJson === 'object' &&\n !Array.isArray(fileJson)\n )) {\n return false;\n }\n\n return fileJson['type'] === 'svg' || fileJson['tagName'] === 'svg';\n}\n\n\n// ============================================================================\n// DEEP VALIDATION\n// ============================================================================\n\nexport interface PxValidationResult {\n valid: boolean;\n errors: string[];\n}\n\nfunction isObject(v: any): v is Record<string, any> {\n return v && typeof v === 'object' && !Array.isArray(v);\n}\n\nfunction validateFillMode(v: any, path: string, errors: string[]): boolean {\n if (v === 'forwards' || v === 'backwards' || v === 'both' || v === 'none') return true;\n errors.push(path + ': invalid FillMode \"' + v + '\", expected \\'forwards\\'|\\'backwards\\'|\\'both\\'|\\'none\\'');\n return false;\n}\n\nfunction validatePlaybackDirection(v: any, path: string, errors: string[]): boolean {\n if (v === 'normal' || v === 'reverse' || v === 'alternate' || v === 'alternate-reverse') return true;\n errors.push(path + ': invalid PlaybackDirection \"' + v + '\", expected \\'normal\\'|\\'reverse\\'|\\'alternate\\'|\\'alternate-reverse\\'');\n return false;\n}\n\nfunction validatePxEasingOrRef(v: any, path: string, errors: string[]): boolean {\n if (typeof v === 'string') return true;\n if (Array.isArray(v) && v.length === 4 && v.every(n => typeof n === 'number')) return true;\n errors.push(path + ': invalid easing, expected string or [number, number, number, number]');\n return false;\n}\n\nfunction validatePxKeyframe(v: any, path: string, errors: string[]): boolean {\n if (!isObject(v)) {\n errors.push(path + ': expected object');\n return false;\n }\n let valid = true;\n if (v.time !== undefined && typeof v.time !== 'number') {\n errors.push(path + '.time: expected number, got ' + typeof v.time);\n valid = false;\n }\n if (v.t !== undefined && typeof v.t !== 'number') {\n errors.push(path + '.t: expected number, got ' + typeof v.t);\n valid = false;\n }\n if (v.easing !== undefined && !validatePxEasingOrRef(v.easing, path + '.easing', errors)) valid = false;\n if (v.e !== undefined && !validatePxEasingOrRef(v.e, path + '.e', errors)) valid = false;\n return valid;\n}\n\nfunction validatePxPropertyAnimation(v: any, path: string, errors: string[]): boolean {\n if (!isObject(v)) {\n errors.push(path + ': expected object');\n return false;\n }\n let valid = true;\n if (v.keyframes !== undefined) {\n if (!Array.isArray(v.keyframes)) {\n errors.push(path + '.keyframes: expected array');\n valid = false;\n } else {\n v.keyframes.forEach((kf: any, i: number) => {\n if (!validatePxKeyframe(kf, path + '.keyframes[' + i + ']', errors)) valid = false;\n });\n }\n }\n if (v.kfs !== undefined) {\n if (!Array.isArray(v.kfs)) {\n errors.push(path + '.kfs: expected array');\n valid = false;\n } else {\n v.kfs.forEach((kf: any, i: number) => {\n if (!validatePxKeyframe(kf, path + '.kfs[' + i + ']', errors)) valid = false;\n });\n }\n }\n return valid;\n}\n\nfunction validatePxAnimationDefinition(v: any, path: string, errors: string[]): boolean {\n if (!isObject(v)) {\n errors.push(path + ': expected object');\n return false;\n }\n let valid = true;\n for (const key of Object.keys(v)) {\n if (!validatePxPropertyAnimation(v[key], path + '.' + key, errors)) valid = false;\n }\n return valid;\n}\n\nfunction validatePxElementAnimation(v: any, path: string, errors: string[]): boolean {\n if (typeof v === 'string') return true;\n if (Array.isArray(v)) {\n let valid = true;\n v.forEach((item, i) => {\n if (typeof item !== 'string' && !validatePxAnimationDefinition(item, path + '[' + i + ']', errors)) {\n valid = false;\n }\n });\n return valid;\n }\n if (isObject(v)) return validatePxAnimationDefinition(v, path, errors);\n errors.push(path + ': expected string, array, or PxAnimationDefinition object');\n return false;\n}\n\nfunction validatePxTrigger(v: any, path: string, errors: string[]): boolean {\n if (!isObject(v)) {\n errors.push(path + ': expected object');\n return false;\n }\n let valid = true;\n const validStartOn = ['load', 'mouseOver', 'click', 'scrollIntoView', 'programmatic'];\n if (!validStartOn.includes(v.startOn)) {\n errors.push(path + '.startOn: invalid value \"' + v.startOn + '\", expected ' + validStartOn.join('|'));\n valid = false;\n }\n if (v.outAction !== undefined) {\n const validOutAction = ['continue', 'pause', 'reset', 'reverse'];\n if (!validOutAction.includes(v.outAction)) {\n errors.push(path + '.outAction: invalid value \"' + v.outAction + '\", expected ' + validOutAction.join('|'));\n valid = false;\n }\n }\n if (v.scrollIntoViewThreshold !== undefined && typeof v.scrollIntoViewThreshold !== 'number') {\n errors.push(path + '.scrollIntoViewThreshold: expected number, got ' + typeof v.scrollIntoViewThreshold);\n valid = false;\n }\n return valid;\n}\n\nfunction validatePxAnimatorConfig(v: any, path: string, errors: string[]): boolean {\n if (!isObject(v)) {\n errors.push(path + ': expected object');\n return false;\n }\n let valid = true;\n if (v.mode !== undefined && !['auto', 'webapi', 'frames'].includes(v.mode)) {\n errors.push(path + '.mode: invalid value \"' + v.mode + '\", expected \\'auto\\'|\\'webapi\\'|\\'frames\\'');\n valid = false;\n }\n if (v.duration !== undefined && typeof v.duration !== 'number') {\n errors.push(path + '.duration: expected number, got ' + typeof v.duration);\n valid = false;\n }\n if (v.delay !== undefined && typeof v.delay !== 'number') {\n errors.push(path + '.delay: expected number, got ' + typeof v.delay);\n valid = false;\n }\n if (v.iterations !== undefined && typeof v.iterations !== 'number' && v.iterations !== 'infinite') {\n errors.push(path + '.iterations: expected number or \\'infinite\\', got ' + typeof v.iterations);\n valid = false;\n }\n if (v.fill !== undefined && !validateFillMode(v.fill, path + '.fill', errors)) valid = false;\n if (v.direction !== undefined && !validatePlaybackDirection(v.direction, path + '.direction', errors)) valid = false;\n if (v.frameRate !== undefined && typeof v.frameRate !== 'number') {\n errors.push(path + '.frameRate: expected number, got ' + typeof v.frameRate);\n valid = false;\n }\n if (v.trigger !== undefined && !validatePxTrigger(v.trigger, path + '.trigger', errors)) valid = false;\n return valid;\n}\n\nfunction validatePxDefs(v: any, path: string, errors: string[]): boolean {\n if (!isObject(v)) {\n errors.push(path + ': expected object');\n return false;\n }\n let valid = true;\n if (v.easings !== undefined) {\n if (!isObject(v.easings)) {\n errors.push(path + '.easings: expected object');\n valid = false;\n } else {\n for (const key of Object.keys(v.easings)) {\n if (!validatePxEasingOrRef(v.easings[key], path + '.easings.' + key, errors)) valid = false;\n }\n }\n }\n if (v.animations !== undefined) {\n if (!isObject(v.animations)) {\n errors.push(path + '.animations: expected object');\n valid = false;\n } else {\n for (const key of Object.keys(v.animations)) {\n if (!validatePxAnimationDefinition(v.animations[key], path + '.animations.' + key, errors)) valid = false;\n }\n }\n }\n if (v.styles !== undefined && !isObject(v.styles)) {\n errors.push(path + '.styles: expected object');\n valid = false;\n }\n return valid;\n}\n\nfunction validatePxBinding(v: any, path: string, errors: string[]): boolean {\n if (!isObject(v)) {\n errors.push(path + ': expected object');\n return false;\n }\n let valid = true;\n if (typeof v.id !== 'string') {\n errors.push(path + '.id: expected string, got ' + typeof v.id);\n valid = false;\n }\n if (!validatePxElementAnimation(v.animate, path + '.animate', errors)) valid = false;\n return valid;\n}\n\nfunction validatePxNode(v: any, path: string, errors: string[]): boolean {\n if (!isObject(v)) {\n errors.push(path + ': expected object');\n return false;\n }\n let valid = true;\n if (typeof v.type !== 'string') {\n errors.push(path + '.type: expected string, got ' + typeof v.type);\n valid = false;\n }\n if (v.children !== undefined) {\n if (!Array.isArray(v.children)) {\n errors.push(path + '.children: expected array');\n valid = false;\n } else {\n v.children.forEach((child: any, i: number) => {\n if (!validatePxNode(child, path + '.children[' + i + ']', errors)) valid = false;\n });\n }\n }\n if (v.animate !== undefined && !validatePxElementAnimation(v.animate, path + '.animate', errors)) valid = false;\n return valid;\n}\n\nfunction validatePxSvgNode(v: any, path: string, errors: string[]): boolean {\n if (!validatePxNode(v, path, errors)) return false;\n let valid = true;\n if (v.type !== 'svg') {\n errors.push(path + '.type: expected \\'svg\\', got \\'' + v.type + '\\'');\n valid = false;\n }\n if (v.width !== undefined && typeof v.width !== 'number') {\n errors.push(path + '.width: expected number, got ' + typeof v.width);\n valid = false;\n }\n if (v.height !== undefined && typeof v.height !== 'number') {\n errors.push(path + '.height: expected number, got ' + typeof v.height);\n valid = false;\n }\n if (v.viewBox !== undefined && typeof v.viewBox !== 'string') {\n errors.push(path + '.viewBox: expected string, got ' + typeof v.viewBox);\n valid = false;\n }\n if (v.animator !== undefined && !validatePxAnimatorConfig(v.animator, path + '.animator', errors)) valid = false;\n if (v.defs !== undefined && !validatePxDefs(v.defs, path + '.defs', errors)) valid = false;\n if (v.bindings !== undefined) {\n if (!Array.isArray(v.bindings)) {\n errors.push(path + '.bindings: expected array');\n valid = false;\n } else {\n v.bindings.forEach((binding: any, i: number) => {\n if (!validatePxBinding(binding, path + '.bindings[' + i + ']', errors)) valid = false;\n });\n }\n }\n if (v.design !== undefined && !validatePxNode(v.design, path + '.design', errors)) valid = false;\n return valid;\n}\n\n/**\n * Deep validation of PxAnimatedSvgDocument.\n * Validates all nested properties against their type definitions.\n * @returns PxValidationResult with valid flag and array of error messages\n */\nexport function isPxElementFileFormatDeep(fileJson: any): PxValidationResult {\n const errors: string[] = [];\n const valid = validatePxSvgNode(fileJson, 'root', errors);\n return { valid, errors };\n}\n\nexport function getAnimatorConfig(doc: PxAnimatedSvgDocument): PxAnimatorConfig | undefined {\n return (\n doc?.animator || doc?.meta?.animator || \n doc?.animation || doc?.meta?.animation // FIXME - decide on the name\n );\n}\n\nexport function getDefs(doc: PxAnimatedSvgDocument): PxDefs | undefined {\n if (!doc) return undefined;\n return doc.defs || doc.meta?.defs;\n}\n\nexport function getBindings(doc: PxAnimatedSvgDocument): PxBinding[] | undefined {\n if (!doc) return undefined;\n return doc.bindings || doc.meta?.bindings;\n}\n\n// FIXME - do we need it?\nexport function getChildren(doc: PxAnimatedSvgDocument): PxNode[] | undefined {\n return doc?.children;\n}\n","/*---------------------------------------------------------------------------------------\n * Copyright (c) Pixodesk LTD.\n * Licensed under the MIT License. See the LICENSE file in the project root for details.\n *---------------------------------------------------------------------------------------*/\n\nimport {\n getAnimatorConfig,\n getBindings,\n getDefs,\n type PxAnimatedSvgDocument,\n type PxAnimationDefinition,\n type PxBezierPath,\n type PxBinding,\n type PxDefs,\n type PxElementAnimation,\n type PxKeyframe,\n type PxNode,\n type PxPropertyAnimation\n} from './PxAnimatorTypes';\nimport { bezierToSvgPath, camelCaseToKebabWordIfNeeded, clamp, COLOUR_ATTR_NAMES, cubicBezier, interpolateBeziers, interpolateColor, interpolateNum, interpolateVec, isCamelCaseWord, parseColor, PCT_BASED_ATTR_NAMES, remap, toRGBA } from './PxAnimatorUtil';\n\n\n// ============================================================================\n// PATH PARSING: Convert \"path(...)\" strings to PxBezierPath format\n// ============================================================================\n\ninterface PathCommand {\n type: string;\n values: Array<number>;\n}\n\n/**\n * Parses an SVG path string into command tokens.\n * Supports M, L, C, Z commands (case-insensitive).\n */\nfunction parsePathCommands(d: string): Array<PathCommand> {\n const tokens = d.split(/([MLCZmlcz]|[\\s,]+)/).map(t => t.trim()).filter(t => t && t !== ',');\n\n const commands: Array<PathCommand> = [];\n let currentCommand: PathCommand | null = null;\n\n for (const token of tokens) {\n if (/[MLCZmlcz]/.test(token)) {\n currentCommand = { type: token, values: [] };\n commands.push(currentCommand);\n } else if (currentCommand) {\n const value = +token;\n currentCommand.values.push(Number.isNaN(value) ? 0 : value);\n }\n }\n\n return commands;\n}\n\n/**\n * Parses an internal SVG path string into PxBezierPath array.\n * Handles M (moveto), L (lineto), C (curveto), Z (close) commands.\n */\nfunction parseSvgPathToBezier(d: string): Array<PxBezierPath> {\n const res: Array<PxBezierPath> = [];\n let currentPath: PxBezierPath | undefined;\n\n const commands = parsePathCommands(d);\n\n for (const command of commands) {\n const type = command.type;\n const values = command.values;\n\n if (type === 'M' || type === 'm') {\n const x = values[0] || 0;\n const y = values[1] || 0;\n currentPath = {\n v: [[x, y]],\n i: [[x, y]],\n o: [[x, y]],\n c: false\n };\n res.push(currentPath);\n continue;\n }\n\n // Ensure we have a current path\n if (!currentPath) {\n currentPath = {\n v: [[0, 0]],\n i: [[0, 0]],\n o: [[0, 0]],\n c: false\n };\n res.push(currentPath);\n }\n\n if (type === 'L') {\n const x = values[0] || 0;\n const y = values[1] || 0;\n currentPath.v.push([x, y]);\n currentPath.i!.push([x, y]);\n currentPath.o!.push([x, y]);\n\n } else if (type === 'C') {\n const outX = values[0] || 0;\n const outY = values[1] || 0;\n const inX2 = values[2] || 0;\n const inY2 = values[3] || 0;\n const x2 = values[4] || 0;\n const y2 = values[5] || 0;\n\n // Update out-point of previous vertex\n currentPath.o![currentPath.o!.length - 1] = [outX, outY];\n\n // Add new vertex with its in-point\n currentPath.v.push([x2, y2]);\n currentPath.i!.push([inX2, inY2]);\n currentPath.o!.push([x2, y2]);\n\n } else if (type === 'Z' || type === 'z') {\n currentPath.c = true;\n }\n }\n\n return res;\n}\n\n/**\n * Extracts SVG path data from a string.\n * Handles both \"path(M...)\" wrapper format and raw \"M...\" format.\n * @returns The path data string, or undefined if not a valid path string\n */\nfunction extractPathData(str: string): string | undefined {\n if (str.startsWith('path(') && str.endsWith(')')) {\n return str.slice(5, -1); // Remove \"path(\" and \")\"\n }\n // Raw path string starting with a path command (M, m, or other commands)\n if (/^[MmZzLlHhVvCcSsQqTtAa]/.test(str)) {\n return str;\n }\n return undefined;\n}\n\n/**\n * Checks if the value is a path string (either \"path(...)\" or raw \"M...\").\n */\nfunction isPathString(value: any): value is string {\n return typeof value === 'string' && extractPathData(value) !== undefined;\n}\n\n/**\n * Normalizes a 'd' attribute value to { paths: PxBezierPath[] } format.\n * Handles:\n * - { paths: [\"path(...)\"] } -> { paths: [PxBezierPath] }\n * - { paths: [\"M...\"] } -> { paths: [PxBezierPath] }\n * - [\"path(...)\"] -> { paths: [PxBezierPath] }\n * - [\"M...\"] -> { paths: [PxBezierPath] }\n * - \"path(...)\" -> { paths: [PxBezierPath] }\n * - \"M...\" -> { paths: [PxBezierPath] }\n * - { paths: [PxBezierPath] } -> as-is\n */\nfunction normalizePathValue(value: any): { paths: Array<PxBezierPath> } | any {\n // If already in { paths: [...] } format\n if (value && typeof value === 'object' && 'paths' in value) {\n const pathsArray = value.paths;\n if (Array.isArray(pathsArray) && pathsArray.length > 0) {\n // Check if paths contain path strings that need parsing\n if (isPathString(pathsArray[0])) {\n const paths: Array<PxBezierPath> = [];\n for (const pathStr of pathsArray) {\n const d = extractPathData(pathStr);\n if (d) {\n paths.push(...parseSvgPathToBezier(d));\n }\n }\n return { paths };\n }\n }\n // Already in correct format\n return value;\n }\n\n // If it's an array of path strings\n if (Array.isArray(value)) {\n if (value.length > 0 && isPathString(value[0])) {\n const paths: Array<PxBezierPath> = [];\n for (const pathStr of value) {\n const d = extractPathData(pathStr);\n if (d) {\n paths.push(...parseSvgPathToBezier(d));\n }\n }\n return { paths };\n }\n // Already an array of PxBezierPath - wrap in { paths: }\n return { paths: value };\n }\n\n // If it's a single path string\n if (isPathString(value)) {\n const d = extractPathData(value)!;\n return { paths: parseSvgPathToBezier(d) };\n }\n\n return value;\n}\n\n\n// ============================================================================\n// NORMALIZATION: Convert new API format to internal normalized format\n// ============================================================================\n\n/**\n * Resolves an easing reference to a cubic-bezier array.\n * @param easing The easing reference (string name or bezier array)\n * @param defs The definitions containing named easings\n * @returns The resolved cubic-bezier array or undefined\n */\nfunction resolveEasing(\n easing: string | [number, number, number, number] | undefined,\n defs?: PxDefs\n): [number, number, number, number] | undefined {\n if (!easing) return undefined;\n\n if (Array.isArray(easing)) {\n return easing;\n }\n\n // Look up named easing in defs\n if (defs?.easings?.[easing]) {\n return defs.easings[easing];\n }\n\n // Unknown easing name - return undefined\n console.warn('Unknown easing name: ' + easing);\n return undefined;\n}\n\n/**\n * Resolves an animation reference to an AnimationDefinition.\n * @param animRef The animation reference (string name or inline definition)\n * @param defs The definitions containing named animations\n * @returns The resolved animation definition\n */\nfunction resolveAnimation(\n animRef: string | PxAnimationDefinition,\n defs?: PxDefs\n): PxAnimationDefinition | undefined {\n if (typeof animRef === 'string') {\n // Look up named animation in defs\n const resolved = defs?.animations?.[animRef];\n if (!resolved) {\n console.warn('Unknown animation name: ' + animRef);\n }\n return resolved;\n }\n\n // It's an inline definition\n return animRef;\n}\n\n/**\n * Resolves an element animation (which can be string, array, or inline) to an array of AnimationDefinitions.\n * @param animate The element animation specification\n * @param defs The definitions containing named animations\n * @returns Array of resolved animation definitions\n */\nfunction resolveElementAnimation(\n animate: PxElementAnimation | undefined,\n defs?: PxDefs\n): PxAnimationDefinition[] {\n if (!animate) return [];\n\n const results: PxAnimationDefinition[] = [];\n\n if (typeof animate === 'string') {\n const resolved = resolveAnimation(animate, defs);\n if (resolved) results.push(resolved);\n } else if (Array.isArray(animate)) {\n for (const item of animate) {\n const resolved = resolveAnimation(item, defs);\n if (resolved) results.push(resolved);\n }\n } else {\n // It's an inline AnimationDefinition\n results.push(animate);\n }\n\n return results;\n}\n\n/**\n * Normalizes keyframes from the new API format (time in ms) to internal format (time as 0-1 fraction).\n * Resolves easing references, normalizes times, and converts path strings for 'd' attribute.\n * @param propName The property name (e.g., 'd' for path)\n * @param propAnim The property animation with keyframes\n * @param duration The total animation duration in ms\n * @param defs The definitions containing named easings\n * @returns Array of normalized keyframes (same structure, resolved refs, normalized times)\n */\nfunction normalizeKeyframes(\n propName: string,\n propAnim: PxPropertyAnimation,\n duration: number,\n defs?: PxDefs\n): PxKeyframe[] {\n const keyframes = propAnim.keyframes || propAnim.kfs || [];\n const normalized: PxKeyframe[] = [];\n\n for (const kf of keyframes) {\n const timePct = kf.time ?? kf.t ?? 0;\n let value = kf.value ?? kf.v;\n const easing = kf.easing ?? kf.e;\n\n // Normalize path values for 'd' attribute\n if (propName === 'd') {\n value = normalizePathValue(value);\n }\n\n // Normalize color values (hex/rgb/rgba strings to [0-1] vectors)\n if (COLOUR_ATTR_NAMES.has(propName)) {\n value = parseColor(value) ?? value;\n }\n\n normalized.push({\n t: timePct,\n v: value,\n e: resolveEasing(easing, defs)\n });\n }\n\n // Sort by time\n normalized.sort((a, b) => (a.t ?? 0) - (b.t ?? 0));\n\n return normalized;\n}\n\n/**\n * Merges multiple animation definitions into a single combined definition.\n * Later definitions override earlier ones for the same property.\n */\nfunction mergeAnimationDefinitions(\n animations: PxAnimationDefinition[]\n): PxAnimationDefinition {\n const merged: PxAnimationDefinition = {};\n\n for (const anim of animations) {\n for (const [prop, propAnim] of Object.entries(anim)) {\n merged[prop] = propAnim;\n }\n }\n\n return merged;\n}\n\n/**\n * Generates a unique element ID for internal tracking during DOM rendering.\n */\nlet _elementIdCounter = 0;\nexport function generateElementId(): string {\n return '_px_el_' + (++_elementIdCounter);\n}\n\n/**\n * Resets the element ID counter (useful for testing).\n */\nexport function resetElementIdCounter(): void {\n _elementIdCounter = 0;\n}\n\n/**\n * Normalizes an animation definition by resolving easing references and normalizing keyframe times.\n * Keeps the key/value mapping structure.\n */\nfunction normalizeAnimationDefinition(\n animDef: PxAnimationDefinition,\n duration: number,\n defs?: PxDefs\n): PxAnimationDefinition {\n const normalized: PxAnimationDefinition = {};\n\n for (const [propName, propAnim] of Object.entries(animDef)) {\n const normalizedKfs = normalizeKeyframes(propName, propAnim, duration, defs);\n if (normalizedKfs.length > 0) {\n normalized[propName] = { kfs: normalizedKfs };\n }\n }\n\n return normalized;\n}\n\n/**\n * Normalizes a PxAnimatedSvgDocument to a PxAnimatorConfig for the animation engines.\n * This is the main entry point for converting the new API format to internal format.\n * Resolves animation/easing references.\n */\nexport function getNormalisedBindings(doc: PxAnimatedSvgDocument): PxBinding[] {\n const animatorConfig = getAnimatorConfig(doc) || {};\n const defs = getDefs(doc);\n const duration = animatorConfig.duration || 1000; // FIXME - get rid of 1000 here\n\n const bindings: PxBinding[] = [];\n\n // Helper to resolve and normalize animation for a binding\n const processAnimation = (\n id: string,\n animate: PxElementAnimation | undefined\n ): PxBinding | null => {\n if (!animate) return null;\n\n const animDefs = resolveElementAnimation(animate, defs);\n if (animDefs.length === 0) return null;\n\n const merged = mergeAnimationDefinitions(animDefs);\n const normalizedAnim = normalizeAnimationDefinition(merged, duration, defs);\n\n if (Object.keys(normalizedAnim).length === 0) return null;\n\n return {\n id,\n animate: normalizedAnim\n };\n };\n\n // Process bindings (for pre-rendered DOM)\n const docBindings = getBindings(doc);\n if (docBindings) {\n for (const binding of docBindings) {\n const normalized = processAnimation(binding.id, binding.animate);\n if (normalized) bindings.push(normalized);\n }\n }\n\n // Process children (for rendered DOM)\n const processNode = (node: PxNode) => {\n // Generate a selector for this node based on id\n if (node.animate) {\n const nodeId = node.id || generateElementId(); // FIXME - make sure that it wasn't in the config already\n node.id = nodeId; // Ensure the node has an ID\n const normalized = processAnimation(nodeId, node.animate);\n if (normalized) bindings.push(normalized);\n }\n\n // Process children\n if (node.children) {\n for (let i = 0; i < node.children.length; i++) {\n processNode(node.children[i]);\n }\n }\n };\n\n // Process children of the root\n if (doc.children) {\n for (let i = 0; i < doc.children.length; i++) {\n processNode(doc.children[i]);\n }\n }\n\n return bindings;\n}\n\n\n// ============================================================================\n// ATTRIBUTE VALUE CALCULATION (used by frame loop animator)\n// ============================================================================\n\n/**\n * Finds prev/next keyframes for a given progress.\n */\nfunction getKeyframesPair(keyframes: PxKeyframe[], progress: number) {\n let prevKf = keyframes[0];\n let nextKf = keyframes[keyframes.length - 1];\n\n for (let j = 0; j < keyframes.length - 1; j++) {\n const aOff = (keyframes[j].t ?? 0);\n const bOff = (keyframes[j + 1].t ?? 0);\n if (aOff <= progress && progress <= bOff) {\n prevKf = keyframes[j];\n nextKf = keyframes[j + 1];\n break;\n }\n }\n return { prevKf, nextKf };\n}\n\n/**\n * Calculates interpolated value for a single property animation.\n */\nfunction calcPropertyValue(\n propName: string,\n propAnim: PxPropertyAnimation,\n progress: number\n): { k: string, v: string } | null {\n const keyframes = propAnim.kfs || propAnim.keyframes || [];\n if (keyframes.length === 0) return null;\n\n const { prevKf, nextKf } = getKeyframesPair(keyframes, progress);\n\n // remap to local 0..1 within prevKf..nextKf\n let localProgress = (prevKf === nextKf) ? 0 : remap(progress, prevKf.t ?? 0, nextKf.t ?? 0, 0, 1);\n localProgress = clamp(localProgress, 0, 1);\n const easing = prevKf.e ?? prevKf.easing;\n if (easing && Array.isArray(easing)) {\n try {\n localProgress = cubicBezier(easing as [number, number, number, number])(localProgress);\n } catch (e) {\n // fallback: ignore easing if parsing fails\n }\n }\n\n let cssAttrName = isCamelCaseWord(propName) ? camelCaseToKebabWordIfNeeded(propName) : propName;\n let cssValue: string | number | null = null;\n\n const prevV = prevKf?.v ?? prevKf?.value;\n const nextV = nextKf?.v ?? nextKf?.value;\n\n if (cssAttrName === 'd') {\n // Extract paths from { paths: [...] } format\n const prevPaths = prevV?.paths ?? (Array.isArray(prevV) ? prevV : []);\n const nextPaths = nextV?.paths ?? (Array.isArray(nextV) ? nextV : []);\n cssValue = interpolateBeziers(\n prevPaths,\n nextPaths,\n localProgress\n ).map(bz => bezierToSvgPath(bz)).join('');\n } else if (COLOUR_ATTR_NAMES.has(cssAttrName)) {\n cssValue = toRGBA(interpolateColor(\n prevV || [0, 0, 0, 1],\n nextV || [0, 0, 0, 1],\n localProgress\n ));\n cssAttrName = propName;\n } else if (cssAttrName === 'stroke-dasharray') {\n cssValue = interpolateVec(\n prevV || [],\n nextV || [],\n localProgress\n ).join(' ');\n cssAttrName = propName;\n } else if (cssAttrName === 'translate') {\n const v = interpolateVec(\n prevV || [0, 0],\n nextV || [0, 0],\n localProgress\n );\n cssValue = 'translate(' + v.join(',') + ')';\n cssAttrName = 'transform';\n } else if (cssAttrName === 'rotate') {\n const v = interpolateNum(\n +(prevV || 0),\n +(nextV || 0),\n localProgress\n );\n cssValue = 'rotate(' + v + ')';\n cssAttrName = 'transform';\n } else if (cssAttrName === 'scale') {\n const v = interpolateVec(\n prevV || [1, 1],\n nextV || [1, 1],\n localProgress\n );\n cssValue = 'scale(' + v.join(',') + ')';\n cssAttrName = 'transform';\n } else {\n // numeric attr\n const num = interpolateNum(\n +(prevV || 0),\n +(nextV || 0),\n localProgress\n );\n cssValue = num;\n }\n\n if (PCT_BASED_ATTR_NAMES.has(cssAttrName) && typeof cssValue === 'number') {\n cssValue = (cssValue * 100) + '%';\n }\n\n return { k: cssAttrName, v: cssValue === null ? '' : '' + cssValue };\n}\n\n/**\n * Calculates interpolated attribute values for an animation definition.\n * @param animDef The animation definition (with resolved refs and normalized times)\n * @param progress The current animation progress (0-1)\n * @returns Object with computed attribute name/value pairs\n */\nexport function calcAnimationValues(\n animDef: PxAnimationDefinition,\n progress: number\n): Record<string, string> {\n const result: Record<string, string> = {};\n\n for (const [propName, propAnim] of Object.entries(animDef)) { \n const computed = calcPropertyValue(propName, propAnim, progress);\n if (computed) {\n result[computed.k] = computed.v;\n }\n }\n\n return result;\n}\n","/*---------------------------------------------------------------------------------------\n * Copyright (c) Pixodesk LTD.\n * Licensed under the MIT License. See the LICENSE file in the project root for details.\n *---------------------------------------------------------------------------------------*/\n\nimport { setupAnimationTriggers } from './PxAnimatorTriggers';\nimport { getAnimatorConfig, type PxAnimatedSvgDocument, type PxAnimatorAPI, type PxAnimatorCallbacksConfig } from './PxAnimatorTypes';\nimport { camelCaseToKebabWordIfNeeded, clamp, DEFAULT_DURATION_MS, STYLE_ATTR_NAMES } from './PxAnimatorUtil';\nimport { calcAnimationValues, getNormalisedBindings } from './PxDefinitions';\n\n\n/**\n * Platform adapter interface for abstracting DOM-specific operations.\n */\nexport interface PxPlatformAdapter {\n\n /** Check if the root element is still connected/mounted */\n isConnected(): boolean;\n\n /** Set an attribute on an element by id */\n setAttribute(id: string, attrName: string, value: string): void;\n}\n\nexport function getSelector(id: string) {\n // return `[data-px-id=\"${id}\"]`; FIXME\n return '#' + id;\n}\n\n\n/**\n * Creates an animator instance that uses a frame loop for animations.\n * This is the abstract/platform-agnostic version.\n *\n * @param adapter Platform adapter for DOM/environment operations.\n * @param callbacks Optional lifecycle callbacks.\n * @returns A PxAnimatorAPI instance.\n */\nexport function createBasicFrameLoopAnimator(\n doc: PxAnimatedSvgDocument,\n adapter: PxPlatformAdapter,\n callbacks?: PxAnimatorCallbacksConfig\n): PxAnimatorAPI {\n\n const config = getAnimatorConfig(doc) || {};\n\n const bindings = getNormalisedBindings(doc);\n\n // iterations: either number or Infinity\n const _iterations = config.iterations;\n let iterations: number = 1;\n if (typeof _iterations === 'number') iterations = _iterations || 1;\n if (_iterations === 'infinite') iterations = Infinity;\n if (iterations < 1) iterations = 1;\n\n const duration = +(config.duration || DEFAULT_DURATION_MS); // per-iteration duration (ms), cannot be 0!\n const totalDuration = duration && iterations ?\n duration * (iterations === Infinity ? Infinity : iterations) :\n (duration ? (iterations ?? 1) * duration : 0);\n\n // direction handling\n const direction = config.direction || 'normal'; // 'normal' | 'reverse' | 'alternate' | 'alternate-reverse'\n\n ////////////////////////////////////////////////////////////////\n\n let timerId: number | null = null;\n let playing = false;\n\n let timeBeforeLastStartMs = (config.delay || 0); // accumulated time before current run (ms)\n let lastStartedTs = 0; // timestamp when last started/resumed\n let playbackRate = 1;\n\n let finishCalled = false; // ensures onFinish called once\n\n // Frame rate throttling\n const frameRate = config.frameRate;\n const minFrameIntervalMs = frameRate && frameRate > 0 ? 1000 / frameRate : 0;\n let lastRenderTs = 0; // timestamp of last render\n\n const getAnimCurrentTime = () => {\n // compute effective elapsed time (ms), taking playbackRate into account\n const runningElapsed = lastStartedTs ? (Date.now() - lastStartedTs) * playbackRate : 0;\n let time = timeBeforeLastStartMs + runningElapsed;\n\n // clamp to totalDuration if finite\n if (Number.isFinite(totalDuration) && time > (totalDuration as number)) time = totalDuration as number;\n if (time < 0) time = 0;\n return time;\n };\n\n\n ////////////////////////////////////////////////////////////////\n\n\n // separate render function that uses a given currentTime (ms)\n function renderFrame(currentTimeMs: number) {\n\n function getEffectiveProgress() {\n // If no duration or duration === 0, set iteration/progress accordingly\n const safeDuration = duration > 0 ? duration : 1; // avoid division by zero\n\n let rawProgress = 0;\n let iteration = 0;\n if (duration > 0) {\n\n // rawProgress is normalized progress within the current iteration:\n // - first iteration: [0 .. 1]\n // - following iterations: (0 .. 1]\n //\n // iteration is the zero-based iteration index\n //\n // Examples (safeDuration = 3):\n // currentTimeMs = 0 → rawProgress = 0 , iteration = 0\n // currentTimeMs = 3 → rawProgress = 1 , iteration = 0\n // currentTimeMs = 3.0001 → rawProgress = 0.0001 , iteration = 1\n\n currentTimeMs = clamp(currentTimeMs, 0, iterations * safeDuration);\n\n iteration = Math.max(0, Math.ceil(currentTimeMs / safeDuration) - 1);\n iteration = Math.min(iteration, iterations - 1);\n\n // Time elapsed since the start of the current iteration\n const iterationTime = currentTimeMs - iteration * safeDuration;\n\n // Normalized progress (preserves fractional overflow after boundaries)\n rawProgress = clamp(iterationTime / safeDuration, 0, 1);\n } else {\n rawProgress = currentTimeMs; // We shouldn't be here\n }\n\n\n // compute per-iteration directional progress\n // start with baseProgress = rawProgress in [0,1)\n\n let baseProgress = rawProgress;\n // apply direction rules:\n // - normal: as is\n // - reverse: progress = 1 - baseProgress\n // - alternate: reverse on odd iterations\n // - alternate-reverse: reverse on even iterations\n const dir = direction || 'normal';\n let effectiveProgress = baseProgress;\n if (dir === 'reverse') {\n effectiveProgress = 1 - baseProgress;\n } else if (dir === 'alternate') {\n if (iteration % 2 === 1) effectiveProgress = 1 - baseProgress;\n } else if (dir === 'alternate-reverse') {\n // alternate-reverse: start reversed on iteration 0\n if (iteration % 2 === 0) effectiveProgress = 1 - baseProgress;\n } // else 'normal' -> keep\n return effectiveProgress;\n }\n let effectiveProgress = getEffectiveProgress(); // else 'normal' -> keep\n\n ////////////////////////////////////////////////////////////////\n\n // FIXME - pre-calc defs, then use\n\n for (const binding of bindings || []) {\n const animDef = binding.animate;\n if (!animDef || typeof animDef !== 'object' || Array.isArray(animDef)) {\n console.warn('Empty or unresolved binding', binding);\n continue;\n }\n\n // Calculate interpolated values for this binding's animation\n const computedValues = calcAnimationValues(animDef, effectiveProgress * duration);\n\n // Apply each computed attribute\n for (const [attrName, value] of Object.entries(computedValues)) {\n adapter.setAttribute(binding.id, attrName, value);\n }\n }\n }\n\n\n ////////////////////////////////////////////////////////////////\n\n const tick = () => {\n\n // if root element provided and detached, stop\n if (!adapter.isConnected()) {\n // stop animation loop (we'll let external code call play/resume)\n // do not call onFinish here. It's a detach situation.\n pauseAnim();\n return;\n }\n\n const currentTime = getAnimCurrentTime();\n\n // Frame rate throttling: skip render if not enough time has passed\n if (minFrameIntervalMs > 0) {\n const now = Date.now();\n if (lastRenderTs && (now - lastRenderTs) < minFrameIntervalMs) {\n // Not enough time elapsed, skip this frame but continue the loop\n return;\n }\n lastRenderTs = now;\n }\n\n // If animation duration is zero or iterations zero, apply final or initial frames depending\n // duration=0 handling: treat as progress 0 and iteration 0, but if totalDuration === 0 and iterations>0, consider finished.\n if (duration <= 0) {\n // Apply initial keyframe or final depending on configuration.\n // We'll treat it as single-frame animation: apply keyframes with progress 0, then finish.\n // loop through animations and apply first keyframe (progress=0)\n }\n\n // Detect finished (natural end)\n if (totalDuration && Number.isFinite(totalDuration) && currentTime >= (totalDuration as number)) {\n // render final frame at the very end and then stop\n renderFrame(totalDuration);\n // call onFinish once\n if (!finishCalled) {\n finishCalled = true;\n callbacks?.onFinish?.();\n }\n pauseAnim();\n return;\n }\n\n // Otherwise render normal frame\n renderFrame(currentTime);\n };\n\n\n ////////////////////////////////////////////////////////////////\n\n\n if (config.delay) {\n // If startTime provided, we start paused but with that offset; render first frame.\n renderFrame(getAnimCurrentTime());\n }\n\n ////////////////////////////////////////////////////////////////\n\n const _isPlaying = () => {\n if (!playing) return false;\n if (!adapter.isConnected()) { return false; }\n if (Number.isFinite(totalDuration) && getAnimCurrentTime() >= (totalDuration as number)) return false;\n return true;\n };\n\n const loopAnim = (isFirst?: boolean) => {\n if (timerId !== null) {\n cancelAnimationFrame(timerId);\n timerId = null;\n }\n\n if (!(isFirst || _isPlaying())) {\n // finished or not playing\n return;\n }\n\n timerId = requestAnimationFrame(() => {\n timerId = null;\n tick();\n loopAnim();\n });\n };\n\n const startAnim = () => {\n if (playing) return;\n playing = true;\n lastStartedTs = Date.now();\n loopAnim(true);\n };\n\n const pauseAnim = () => {\n if (!playing) return;\n // capture current time\n timeBeforeLastStartMs = getAnimCurrentTime();\n lastStartedTs = 0;\n playing = false;\n\n if (timerId !== null) {\n cancelAnimationFrame(timerId);\n timerId = null;\n }\n // render a final frame at the paused time to ensure DOM consistent\n renderFrame(timeBeforeLastStartMs);\n };\n\n const cancelAnim = () => {\n pauseAnim();\n\n timeBeforeLastStartMs = 0;\n lastStartedTs = 0;\n playing = false;\n finishCalled = false;\n\n renderFrame(timeBeforeLastStartMs);\n\n callbacks?.onCancel?.();\n };\n\n const finishAnim = (callOnFinish = true) => {\n // jump to the end\n if (Number.isFinite(totalDuration)) {\n timeBeforeLastStartMs = totalDuration as number;\n } else {\n // infinity animations: set to current time (no-op)\n timeBeforeLastStartMs = getAnimCurrentTime();\n }\n lastStartedTs = 0;\n playing = false;\n // render final frame\n renderFrame(timeBeforeLastStartMs);\n\n if (callOnFinish && !finishCalled) {\n finishCalled = true;\n callbacks?.onFinish?.();\n }\n };\n\n ////////////////////////////////////////////////////////////////\n\n const api: PxAnimatorAPI = {\n\n \"isReady\": () => true,\n\n \"getRootElement\": () => null,\n\n \"isPlaying\": (): boolean => { return _isPlaying(); },\n\n \"play\": () => {\n startAnim();\n callbacks?.onPlay?.();\n },\n \"pause\": () => {\n pauseAnim();\n callbacks?.onPause?.();\n },\n \"cancel\": () => {\n cancelAnim();\n // onCancel already called in cancelAnim\n },\n \"finish\": () => {\n finishAnim(true);\n },\n\n \"setPlaybackRate\": (rate: number) => {\n if (!isFinite(rate) || rate === 0) {\n console.warn('setPlaybackRate: rate must be finite and non-zero');\n return;\n }\n // preserve current logical time when changing rate\n const current = getAnimCurrentTime();\n playbackRate = rate;\n timeBeforeLastStartMs = current;\n if (playing) lastStartedTs = Date.now();\n },\n\n \"getCurrentTime\": (): number | null => { return getAnimCurrentTime(); },\n\n \"setCurrentTime\": (newTime: number) => {\n // clamp newTime\n if (newTime < 0) newTime = 0;\n if (Number.isFinite(totalDuration) && newTime > (totalDuration as number)) newTime = totalDuration as number;\n\n timeBeforeLastStartMs = newTime;\n if (playing) lastStartedTs = Date.now();\n // render immediately to reflect the change\n renderFrame(getAnimCurrentTime());\n },\n\n \"destroy\": () => { api.cancel(); }\n };\n\n ////////////////////////////////////////////////////////////////\n\n return api;\n}\n\n\n////////////////////////////////////////////////////////////////\n// Browser DOM implementation\n////////////////////////////////////////////////////////////////\n\n\n\n/**\n * Creates an animator instance that uses a requestAnimationFrame loop for animations.\n * This is the browser DOM-specific version.\n *\n * @param {PxAnimatorCallbacksConfig=} callbacks Optional lifecycle callbacks.\n * @param {Element=} rootElement Optional pre-rendered root element.\n * @returns {PxAnimatorAPI} A PxAnimatorAPI instance.\n */\nexport function createFrameLoopAnimator(\n doc: PxAnimatedSvgDocument,\n adapter?: PxPlatformAdapter,\n callbacks?: PxAnimatorCallbacksConfig,\n rootElement?: Element | null\n): PxAnimatorAPI {\n\n const config = getAnimatorConfig(doc) || {};\n\n // Use provided root element or try to find by selector\n if (!rootElement) {\n if (doc.id) {\n const rootSelector = getSelector(doc.id);\n rootElement = document.querySelector(rootSelector);\n if (!rootElement) console.warn(\"createFrameLoopAnimator: No root element found for selector: \", rootSelector);\n } else {\n console.warn(\"createFrameLoopAnimator: No root element provided\");\n }\n }\n\n let api = createBasicFrameLoopAnimator(\n doc, \n adapter || createDomAdapter(rootElement), \n callbacks\n );\n\n api = {\n ...api,\n \"getRootElement\": () => rootElement || null\n };\n if (config.trigger) setupAnimationTriggers(api, config.trigger);\n return api;\n}\n\nexport function createDomAdapter(rootElement?: Element | null) {\n // Track warnings to avoid spamming console\n const warnedSelectors = new Set<string>();\n\n const adapter: PxPlatformAdapter = {\n isConnected: () => {\n if (!rootElement) return true; // No root element means we're always \"connected\"\n return rootElement.isConnected;\n },\n setAttribute: (id, attrName, value) => {\n\n attrName = camelCaseToKebabWordIfNeeded(attrName);\n\n const selector = getSelector(id);\n\n // Query elements by selector within root (or document if no root)\n const elements = rootElement?.querySelectorAll(selector) || document.querySelectorAll(selector);\n\n if (elements.length === 0 && !warnedSelectors.has(selector)) {\n warnedSelectors.add(selector);\n console.warn('setAttribute: No elements found for selector \"' + selector + '\"');\n }\n\n for (let i = 0; i < elements.length; i++) {\n const element = elements[i];\n element.setAttribute(attrName, value);\n if (STYLE_ATTR_NAMES.has(attrName)) {\n (element as HTMLElement).style[attrName as any] = value;\n }\n }\n },\n };\n return adapter;\n}","/*---------------------------------------------------------------------------------------\n * Copyright (c) Pixodesk LTD.\n * Licensed under the MIT License. See the LICENSE file in the project root for details.\n *---------------------------------------------------------------------------------------*/\n\nimport { getSelector } from './PxAnimatorFrameLoop';\nimport { setupAnimationTriggers } from './PxAnimatorTriggers';\nimport { getAnimatorConfig, PxAnimatedSvgDocument, PxAnimatorConfig, type PxAnimationDefinition, type PxAnimatorAPI, type PxAnimatorCallbacksConfig } from './PxAnimatorTypes';\nimport { clamp, COLOUR_ATTR_NAMES, kebabToCamelCaseWord, toRGBA, TRANSFORM_FN_NAMES } from './PxAnimatorUtil';\nimport { getNormalisedBindings } from './PxDefinitions';\n\n\n/**\n * Converts an animation definition to Web Animation API keyframes.\n * Returns an array of keyframes for each property.\n */\nfunction convertToWebApiKeyframes(\n animDef: PxAnimationDefinition,\n unsupportedSet: Set<string>,\n config: PxAnimatorConfig\n): Map<string, Keyframe[]> {\n const result = new Map<string, Keyframe[]>();\n\n for (const [propName, propAnim] of Object.entries(animDef)) {\n const keyframes = propAnim.kfs || propAnim.keyframes || [];\n const cssKeyframes: Keyframe[] = [];\n\n for (const kf of keyframes) {\n let t = kf.t ?? kf.time ?? 0;\n t = clamp(t / (config.duration || 1), 0, 1);\n let value = kf.v ?? kf.value;\n const e = kf.e ?? kf.easing;\n\n const cssKf: Keyframe = {\n offset: t,\n easing: e && Array.isArray(e) ? \"cubic-bezier(\" + e.join(',') + \")\" : undefined\n };\n\n let cssValue: any;\n let cssKey = propName;\n\n if (COLOUR_ATTR_NAMES.has(propName) && Array.isArray(value)) {\n cssValue = toRGBA(value);\n } else if (TRANSFORM_FN_NAMES.has(propName)) {\n if (Array.isArray(value)) {\n if (propName === 'translate') value = value.map(v => v + 'px');\n value = value.join(',');\n }\n if (propName === 'rotate') value = value + 'deg';\n cssValue = propName + '(' + value + ')';\n cssKey = 'transform';\n } else {\n cssValue = '' + value;\n }\n\n if (!CSS.supports(cssKey, cssValue)) unsupportedSet.add(cssKey);\n\n cssKey = kebabToCamelCaseWord(cssKey);\n cssKf[cssKey] = cssValue;\n cssKeyframes.push(cssKf);\n }\n\n if (cssKeyframes.length > 0) {\n result.set(propName, cssKeyframes);\n }\n }\n\n return result;\n}\n\n\n/**\n * Creates an animator instance that uses the native Web Animations API.\n *\n * This is the preferred, more performant animator. It will return null if the\n * animation configuration contains properties not supported by the browser's\n * Web Animations API implementation, unless forceEvenIfHasUnsupportedAttrs is true.\n *\n * @param callbacks Optional lifecycle callbacks.\n * @param rootElement Root element.\n * @param forceEvenIfHasUnsupportedAttrs If true, an animator will be created even if some CSS properties are not supported.\n * @returns An PxAnimatorAPI instance, or null if unsupported features are used and not forced.\n */\nexport function createWebApiAnimator(\n doc: PxAnimatedSvgDocument,\n callbacks?: PxAnimatorCallbacksConfig,\n rootElement?: Element | null,\n forceEvenIfHasUnsupportedAttrs?: boolean\n): PxAnimatorAPI | null {\n\n const config = getAnimatorConfig(doc) || {};\n\n const bindings = getNormalisedBindings(doc);\n\n // Use provided root element or try to find by selector\n if (!rootElement) {\n if (doc.id) {\n const rootSelector = getSelector(doc.id);\n rootElement = document.querySelector(rootSelector);\n if (!rootElement) console.warn(\"createFrameLoopAnimator: No root element found for selector: \", rootSelector);\n } else {\n console.warn(\"createFrameLoopAnimator: No root element provided\");\n }\n }\n\n const animations: Array<Animation> = [];\n\n const _iterations = config.iterations;\n let iterations: number | undefined;\n if (typeof _iterations === 'number') iterations = _iterations;\n if (_iterations === 'infinite') iterations = Infinity;\n\n const unsupportedSet = new Set<string>();\n\n ////////////////////////////////////////////////////////////////\n\n // Warn if no bindings defined\n if (!bindings?.length) {\n console.warn('createWebApiAnimator: No animation bindings defined');\n }\n\n for (const binding of bindings || []) {\n const animDef = binding.animate;\n if (!animDef || typeof animDef !== 'object' || Array.isArray(animDef)) {\n console.warn('createWebApiAnimator: Empty or unresolved binding', binding);\n continue;\n }\n\n const selector = getSelector(binding.id);\n\n // Use CSS selector to find elements\n const elements = rootElement?.querySelectorAll(selector) || document.querySelectorAll(selector);\n\n if (elements.length === 0) {\n console.warn('createWebApiAnimator: No elements found for selector \"' + selector + '\"');\n }\n\n // Convert animation definition to Web API keyframes\n const keyframesMap = convertToWebApiKeyframes(animDef, unsupportedSet, config);\n\n for (let i = 0; i < elements.length; i++) {\n const element = elements[i];\n\n // Delay handling:\n // - Positive delay (e.g., 500): Wait before starting → use `delay` option\n // - Negative delay (e.g., -500): Start mid-animation → use `currentTime` to seek\n // (Web Animations API doesn't reliably support negative delay values)\n // - Negative delay is wrapped to duration (e.g., -5000 with duration 2000 → seek to 1000)\n const positiveDelay = config.delay && config.delay > 0 ? config.delay : undefined;\n const seekPosition = config.delay && config.delay < 0 && config.duration\n ? (-config.delay) % config.duration\n : undefined;\n\n const effectOptions: KeyframeEffectOptions = {\n duration: config.duration,\n delay: positiveDelay,\n fill: config.fill,\n direction: config.direction,\n iterations: iterations\n };\n\n for (const [, keyframes] of keyframesMap) {\n if (keyframes.length > 0) {\n try {\n const effect = new KeyframeEffect(element, keyframes, effectOptions);\n const anim = new Animation(effect, document.timeline);\n\n if (callbacks?.onFinish) anim.onfinish = () => callbacks.onFinish?.();\n if (callbacks?.onRemove) anim.onremove = () => callbacks.onRemove?.();\n\n // Seek forward for negative delay (e.g., delay=-500 → seek to 500ms)\n if (seekPosition) {\n anim.currentTime = seekPosition;\n }\n\n animations.push(anim);\n } catch (e) {\n console.warn(e);\n }\n }\n }\n }\n }\n\n ////////////////////////////////////////////////////////////////\n\n if (!forceEvenIfHasUnsupportedAttrs && unsupportedSet.size) {\n console.warn('Unsupported CSS attrs: ' + [...unsupportedSet].join(', '));\n return null;\n }\n\n ////////////////////////////////////////////////////////////////\n\n const api: PxAnimatorAPI = {\n\n \"isReady\": () => true,\n\n \"getRootElement\": () => rootElement || null,\n\n \"isPlaying\": (): boolean => { return animations[0]?.playState === 'running'; },\n\n \"play\": () => {\n animations.forEach(a => a.play());\n callbacks?.onPlay?.();\n },\n \"pause\": () => {\n animations.forEach(a => a.pause());\n callbacks?.onPause?.();\n },\n \"cancel\": () => {\n animations.forEach(a => a.cancel());\n callbacks?.onCancel?.(); // FIXME onFinished needs to be called when animation finishes, e.g. from animations, and some flag that it was triggered by user\n },\n \"finish\": () => {\n animations.forEach(a => a.finish()); // FIXME onFinished needs to be called when animation finishes, e.g. from animations, not only when you call finish manually\n },\n\n \"setPlaybackRate\": (rate: number) => {\n animations.forEach(a => (a.playbackRate = rate));\n return api;\n },\n \"getCurrentTime\": (): number | null => {\n const res = animations[0]?.currentTime ?? null;\n return res !== null ? +res : null;\n },\n \"setCurrentTime\": (time: number) => {\n animations.forEach(a => {\n a.currentTime = time;\n });\n },\n\n \"destroy\": () => {\n api.cancel();\n animations.splice(0, animations.length);\n }\n };\n\n ////////////////////////////////////////////////////////////////\n\n if (config.trigger) {\n setupAnimationTriggers(api, config.trigger);\n }\n\n return api;\n}\n","/*---------------------------------------------------------------------------------------\n * Copyright (c) Pixodesk LTD.\n * Licensed under the MIT License. See the LICENSE file in the project root for details.\n *---------------------------------------------------------------------------------------*/\n\nimport { renderNode } from './PxAnimatorDOM';\nimport { createFrameLoopAnimator, PxPlatformAdapter } from './PxAnimatorFrameLoop';\nimport { setupAnimationTriggers } from './PxAnimatorTriggers';\nimport { getAnimatorConfig, isPxElementFileFormat, PX_ANIM_ATTR_NAME, PX_ANIM_SRC_ATTR_NAME, type PxAnimatedSvgDocument, type PxAnimatorAPI, type PxAnimatorCallbacksConfig } from './PxAnimatorTypes';\nimport { createWebApiAnimator } from './PxAnimatorWebApi';\n\n\n/**\n * Creates an animator instance from a normalized player config.\n * This is the internal implementation that both engines use.\n */\nfunction createAnimatorFromConfig(\n doc: PxAnimatedSvgDocument,\n adapter?: PxPlatformAdapter,\n callbacks?: PxAnimatorCallbacksConfig,\n rootElement?: Element | null\n): PxAnimatorAPI {\n\n const animatorConfig = getAnimatorConfig(doc) || {};\n\n let res: PxAnimatorAPI;\n if (animatorConfig.mode === 'frames') {\n // Forcing \"frames\", even if \"webapi\" can be used\n res = createFrameLoopAnimator(doc, adapter, callbacks, rootElement);\n } else {\n // Trying \"webapi\" first\n res = (\n createWebApiAnimator(doc, callbacks, rootElement,\n animatorConfig.mode === 'webapi' // Forcing \"webapi\"\n ) ||\n createFrameLoopAnimator(doc, adapter, callbacks, rootElement) // \"webapi\" has unsupported attrs and wasn't forced, returned null, fallback to \"frames\"\n );\n }\n\n if (animatorConfig.debugInstName) {\n (window as any)[animatorConfig.debugInstName] = res; // Exposing as global variable for debug\n }\n\n return res;\n}\n\n\n/**\n * Generates a unique ID with a random suffix.\n * Format: _px_{random base36 string}\n */\nlet _idCounter = 0;\nfunction generateUniqueId(): string {\n const timestamp = Date.now().toString(36);\n const counter = (++_idCounter).toString(36);\n const random = Math.random().toString(36).substring(2, 6);\n return '_px_' + timestamp + counter + random;\n}\n\n/**\n * Deep clones a JSON-like value (objects, arrays, primitives).\n * Does not handle special types like Date, Map, Set, functions, etc.\n */\nfunction deepClone<T>(value: T): T {\n if (value === null || typeof value !== 'object') return value;\n if (Array.isArray(value)) return value.map(item => deepClone(item)) as T;\n\n const obj = value as Record<string, unknown>;\n\n const cloned: Record<string, unknown> = {};\n for (const key of Object.keys(obj)) {\n cloned[key] = deepClone(obj[key]);\n }\n return cloned as T;\n}\n\n/**\n * Regenerates all IDs in the document and updates references.\n *\n * This function:\n * 1. Deep clones the document to avoid mutating the original\n * 2. Traverses all nodes and regenerates IDs, keeping a mapping of old → new\n * 3. Updates all references to old IDs in attributes:\n * - Hash references: \"#old-id\" → \"#new-id\" (href, xlink:href)\n * - URL references: \"url(#old-id)\" → \"url(#new-id)\" (fill, clip-path, mask, marker, etc.)\n * - Style URL references: { offsetPath: \"url(#old-id)\" }\n *\n * @param doc - The animated SVG document to process\n * @returns A new document with regenerated IDs\n */\nexport function generateNewIds(doc: PxAnimatedSvgDocument): PxAnimatedSvgDocument {\n // Deep clone the document\n const cloned: PxAnimatedSvgDocument = deepClone(doc);\n\n // Map of old ID → new ID\n const idMap = new Map<string, string>();\n\n // Attributes that contain hash references (#id)\n const hashRefAttrs = new Set(['href', 'xlink:href']);\n\n // Attributes that contain url(#id) references\n const urlRefAttrs = new Set([\n 'fill', 'stroke', 'clip-path', 'clipPath', 'mask',\n 'marker', 'marker-start', 'marker-mid', 'marker-end',\n 'filter', 'flood-color', 'lighting-color'\n ]);\n\n // Attributes that contain direct ID references (no # or url())\n const directIdRefAttrs = new Set(['baseId', 'targetId', 'boundElementId']);\n\n // Phase 1: Collect all IDs and generate new ones\n function collectIds(node: any): void {\n if (!node || typeof node !== 'object') return;\n\n if (node.id && typeof node.id === 'string') {\n const oldId = node.id;\n const newId = generateUniqueId();\n idMap.set(oldId, newId);\n node.id = newId;\n }\n\n // Process children\n if (Array.isArray(node.children)) {\n for (const child of node.children) {\n collectIds(child);\n }\n }\n }\n\n // Phase 2: Update all references to old IDs\n function updateRefs(node: any): void {\n if (!node || typeof node !== 'object') return;\n\n for (const [key, value] of Object.entries(node)) {\n if (key === 'children') {\n if (Array.isArray(value)) {\n for (const child of value) {\n updateRefs(child);\n }\n }\n continue;\n }\n\n if (typeof value === 'string') {\n // Check for hash references: href=\"#old-id\"\n if (hashRefAttrs.has(key) && value.startsWith('#')) {\n const oldId = value.slice(1);\n const newId = idMap.get(oldId);\n if (newId) {\n node[key] = '#' + newId;\n }\n }\n // Check for url() references: fill=\"url(#old-id)\"\n else if (urlRefAttrs.has(key)) {\n node[key] = replaceUrlRefs(value, idMap);\n }\n // Check for direct ID references: baseId=\"_px_xxx\"\n else if (directIdRefAttrs.has(key)) {\n const newId = idMap.get(value);\n if (newId) {\n node[key] = newId;\n }\n }\n // Check for url() in any string value (e.g., in style strings)\n else if (value.includes('url(#')) {\n node[key] = replaceUrlRefs(value, idMap);\n }\n }\n // Check style object for url() references\n else if (key === 'style' && typeof value === 'object' && value !== null) {\n for (const [styleProp, styleValue] of Object.entries(value)) {\n if (typeof styleValue === 'string') {\n (value as any)[styleProp] = replaceUrlRefs(styleValue, idMap);\n }\n }\n }\n // Recursively process nested objects (meta contains baseId/targetId refs)\n // Skip 'animate' as it contains animation data, not ID references\n else if (typeof value === 'object' && value !== null && key !== 'animate') {\n updateRefs(value);\n }\n }\n }\n\n collectIds(cloned);\n updateRefs(cloned);\n\n // Update IDs in bindings\n const docBindings = cloned.bindings;\n if (Array.isArray(docBindings)) {\n for (const binding of docBindings) {\n if (binding.id) {\n const newId = idMap.get(binding.id);\n if (newId) {\n binding.id = newId;\n }\n }\n }\n }\n\n return cloned;\n}\n\n/**\n * Replaces url(#old-id) references in a string with new IDs from the map.\n */\nfunction replaceUrlRefs(value: string, idMap: Map<string, string>): string {\n return value.replace(/url\\(#([^)]+)\\)/g, (match, oldId) => {\n const newId = idMap.get(oldId);\n return newId ? 'url(#' + newId + ')' : match;\n });\n}\n\n/**\n * Creates an animator instance from an AnimatedSvgDocument.\n *\n * This function serves as the main entry point for the animation library. It automatically\n * chooses the best animation engine available ('webapi' or 'frames') or can be\n * forced to use a specific one.\n *\n * @param doc The animated SVG document.\n * @param callbacks Optional object with callback functions for animation lifecycle events (play, pause, finish, etc.).\n * @param containerElement Optional selector or element to render the SVG into.\n * @returns An PxAnimatorAPI instance to programmatically control the animation.\n */\nexport function createAnimatorImpl(\n doc: PxAnimatedSvgDocument,\n adapter?: PxPlatformAdapter,\n callbacks?: PxAnimatorCallbacksConfig,\n containerElement?: string | Element\n): PxAnimatorAPI {\n\n // Normalize the document to internal format\n const animatorConfig = getAnimatorConfig(doc) || {};\n\n animatorConfig.debug = true; // FIXME\n\n let rootElement: Element | null = null;\n\n // Render the SVG content if we have a container and children\n if (containerElement && doc.children) {\n\n doc = generateNewIds(doc); // Regenerate IDs so repeated calls to createAnimator(...) produce different ids in elements\n\n const containerEl = typeof containerElement === 'string' ?\n document.querySelector(containerElement) : containerElement;\n\n if (containerEl) {\n rootElement = renderNode(doc);\n if (rootElement) {\n containerEl.replaceChildren(rootElement);\n }\n }\n }\n\n return createAnimatorFromConfig(doc, adapter, callbacks, rootElement);\n}\n\n/**\n * Creates an animator instance to control SVG animations.\n * Accepts either a document object or a URL to fetch.\n *\n * @param docOrUrl The animated SVG document or URL to fetch it from.\n * @param callbacks Optional object with callback functions for animation lifecycle events.\n * @param containerElement Optional selector or element to render the SVG into.\n * @returns An PxAnimatorAPI instance to programmatically control the animation.\n */\nexport function createAnimator(\n docOrUrl: PxAnimatedSvgDocument | string,\n adapter?: PxPlatformAdapter,\n callbacks?: PxAnimatorCallbacksConfig,\n containerElement?: string | Element\n): PxAnimatorAPI {\n\n if (typeof docOrUrl === 'object') {\n return createAnimatorImpl(docOrUrl, adapter, callbacks, containerElement);\n }\n\n // URL provided - fetch and create animator\n let animator: PxAnimatorAPI | null = null;\n\n fetch(docOrUrl).then(res => res.json()).then(json => {\n if (isPxElementFileFormat(json)) {\n animator = createAnimatorImpl(json, adapter, callbacks, containerElement);\n } else {\n console.error('Invalid animation document format');\n }\n });\n\n // Return a proxy that forwards calls once loaded\n return {\n \"isReady\": () => !!animator,\n \"getRootElement\": () => animator ? animator.getRootElement() : null,\n \"isPlaying\": () => animator?.isPlaying() || false,\n \"play\": () => { animator?.play(); },\n \"pause\": () => { animator?.pause(); },\n \"cancel\": () => { animator?.cancel(); },\n \"finish\": () => { animator?.finish(); },\n \"setPlaybackRate\": (rate: number) => { animator?.setPlaybackRate(rate); },\n \"getCurrentTime\": () => animator?.getCurrentTime() || 0,\n \"setCurrentTime\": (time: number) => { animator?.setCurrentTime(time); },\n \"destroy\": () => { animator?.destroy(); }\n };\n}\n\n/**\n * Scan and load for tags, e.g.\n * <div data-px-animation-src=\"animation.json\"></div>\n */\nexport function loadTagAnimators() {\n const elements = document.querySelectorAll('[' + PX_ANIM_SRC_ATTR_NAME + ']');\n for (let i = 0; i < elements.length; i++) {\n const element = elements[i];\n if (!(element as any)[PX_ANIM_ATTR_NAME]) {\n const src = element.getAttribute(PX_ANIM_SRC_ATTR_NAME);\n if (src) {\n (element as any)[PX_ANIM_ATTR_NAME] = createAnimator(src, undefined, undefined, element);\n }\n }\n }\n}\n\nif (typeof window !== 'undefined') {\n (window as any)[\"loadTagAnimators\"] = loadTagAnimators;\n (window as any)[\"createAnimator\"] = createAnimator;\n (window as any)[\"setupAnimationTriggers\"] = setupAnimationTriggers;\n}"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAcO,SAAS,gBAAgB,MAA4B;AAd5D;AAeI,QAAM,IAAI,KAAK;AACf,QAAM,IAAI,KAAK;AACf,QAAM,IAAI,KAAK;AACf,QAAM,IAAI,KAAK;AAEf,MAAI,CAAC,EAAE,OAAQ,QAAO;AAEtB,QAAM,IAAmB,CAAC;AAC1B,QAAM,MAAM,EAAE;AACd,IAAE,KAAK,MAAM,EAAE,CAAC,EAAE,CAAC,IAAI,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;AAEpC,WAAS,MAAM,GAAG,MAAM,KAAK,OAAO;AAChC,UAAM,QAAQ,EAAE,MAAM,CAAC;AACvB,UAAM,SAAQ,4BAAI,MAAM,OAAV,YAAgB;AAC9B,UAAM,SAAQ,4BAAI,SAAJ,YAAY,EAAE,GAAG;AAC/B,UAAM,QAAQ,EAAE,GAAG;AAGnB,UAAM,SAAU,MAAM,CAAC,MAAM,MAAM,CAAC,KAAK,MAAM,CAAC,MAAM,MAAM,CAAC,MACxD,MAAM,CAAC,MAAM,MAAM,CAAC,KAAK,MAAM,CAAC,MAAM,MAAM,CAAC;AAElD,QAAI,QAAQ;AACR,QAAE,KAAK,MAAM,MAAM,CAAC,IAAI,MAAM,MAAM,CAAC,CAAC;AAAA,IAC1C,OAAO;AAEH,QAAE,KAAK,MAAM,MAAM,CAAC,IAAI,MAAM,MAAM,CAAC,IAAI,MAAM,MAAM,CAAC,IAAI,MAAM,MAAM,CAAC,IAAI,MAAM,MAAM,CAAC,IAAI,MAAM,MAAM,CAAC,CAAC;AAAA,IAC9G;AAAA,EACJ;AAEA,MAAI,KAAK,MAAM,GAAG;AACd,UAAM,QAAQ,EAAE,MAAM,CAAC;AACvB,UAAM,SAAQ,4BAAI,MAAM,OAAV,YAAgB;AAC9B,UAAM,UAAS,4BAAI,OAAJ,YAAU,EAAE,CAAC;AAC5B,UAAM,SAAS,EAAE,CAAC;AAGlB,UAAM,SAAU,MAAM,CAAC,MAAM,MAAM,CAAC,KAAK,MAAM,CAAC,MAAM,MAAM,CAAC,MACxD,OAAO,CAAC,MAAM,OAAO,CAAC,KAAK,OAAO,CAAC,MAAM,OAAO,CAAC;AAEtD,QAAI,CAAC,QAAQ;AACT,QAAE,KAAK,MAAM,MAAM,CAAC,IAAI,MAAM,MAAM,CAAC,IAAI,MAAM,OAAO,CAAC,IAAI,MAAM,OAAO,CAAC,IAAI,MAAM,OAAO,CAAC,IAAI,MAAM,OAAO,CAAC,CAAC;AAAA,IAClH;AAEA,MAAE,KAAK,GAAG;AAAA,EACd;AAEA,SAAO,EAAE,KAAK,EAAE;AACpB;AAQO,SAAS,eAAe,GAAW,GAAW,GAAmB;AACpE,SAAO,KAAK,IAAI,KAAK;AACzB;AASO,SAAS,eAAe,GAAkB,GAAkB,GAA0B;AACzF,QAAM,MAAqB,CAAC;AAC5B,QAAM,QAAQ,KAAK,IAAI,EAAE,QAAQ,EAAE,MAAM;AACzC,WAAS,IAAI,GAAG,IAAI,OAAO,KAAK;AAC5B,QAAI,CAAC,IAAI,eAAe,EAAE,CAAC,KAAK,GAAG,EAAE,CAAC,KAAK,GAAG,CAAC;AAAA,EACnD;AACA,SAAO;AACX;AAMO,SAAS,iBAAiB,GAAkB,GAAkB,GAA0B;AAC3F,SAAO;AAAA,IACH,eAAe,EAAE,CAAC,KAAK,GAAG,EAAE,CAAC,KAAK,GAAG,CAAC;AAAA,IACtC,eAAe,EAAE,CAAC,KAAK,GAAG,EAAE,CAAC,KAAK,GAAG,CAAC;AAAA,IACtC,eAAe,EAAE,CAAC,KAAK,GAAG,EAAE,CAAC,KAAK,GAAG,CAAC;AAAA,IACtC,eAAe,EAAE,CAAC,MAAM,SAAY,IAAI,EAAE,CAAC,GAAG,EAAE,CAAC,MAAM,SAAY,IAAI,EAAE,CAAC,GAAG,CAAC;AAAA,EAClF;AACJ;AAQO,SAAS,mBACZ,QACA,QACA,UACmB;AACnB,QAAM,QAAQ,KAAK,IAAI,OAAO,QAAQ,OAAO,MAAM;AACnD,QAAM,MAA2B,CAAC;AAClC,WAAS,IAAI,GAAG,IAAI,OAAO,KAAK;AAC5B,QAAI,KAAK,kBAAkB,OAAO,CAAC,GAAG,OAAO,CAAC,GAAG,QAAQ,CAAC;AAAA,EAC9D;AACA,SAAO;AACX;AAWO,SAAS,kBACZ,OACA,OACA,UACY;AAvIhB;AAwII,MAAI,CAAC,SAAS,CAAC,MAAO,QAAO,SAAS,SAAS,EAAE,GAAG,CAAC,EAAE;AAEvD,QAAM,IAAI,KAAK,IAAI,KAAK,IAAI,UAAU,CAAC,GAAG,CAAC;AAC3C,QAAM,MAAM,KAAK,IAAI,MAAM,EAAE,QAAQ,MAAM,EAAE,MAAM;AAEnD,QAAM,IAA0B,CAAC;AACjC,QAAM,IAA0B,CAAC;AACjC,QAAM,IAA0B,CAAC;AAEjC,WAAS,MAAM,GAAG,MAAM,KAAK,OAAO;AAChC,UAAM,KAAK,MAAM,EAAE,GAAG;AACtB,UAAM,KAAK,MAAM,EAAE,GAAG;AACtB,MAAE,KAAK,eAAe,IAAI,IAAI,CAAC,CAAC;AAGhC,UAAM,MAAK,iBAAM,MAAN,mBAAU,SAAV,YAAkB;AAC7B,UAAM,MAAK,iBAAM,MAAN,mBAAU,SAAV,YAAkB;AAC7B,MAAE,KAAK,eAAe,IAAI,IAAI,CAAC,CAAC;AAEhC,UAAM,MAAK,iBAAM,MAAN,mBAAU,SAAV,YAAkB;AAC7B,UAAM,MAAK,iBAAM,MAAN,mBAAU,SAAV,YAAkB;AAC7B,MAAE,KAAK,eAAe,IAAI,IAAI,CAAC,CAAC;AAAA,EACpC;AAEA,SAAO,EAAE,GAAG,GAAG,EAAE,SAAS,IAAI,QAAW,GAAG,EAAE,SAAS,IAAI,QAAW,IAAG,WAAM,MAAN,YAAW,MAAM,EAAE;AAChG;AAaO,SAAS,MACZ,OACA,OACA,OACA,QACA,QACM;AACN,MAAI,UAAU,MAAO,QAAO;AAC5B,QAAM,KAAK,QAAQ,UAAU,QAAQ;AACrC,SAAO,SAAS,KAAK,SAAS;AAClC;AAOO,SAAS,YAAY,QAA0C;AAClE,QAAM,CAAC,KAAK,KAAK,KAAK,GAAG,IAAI;AAE7B,QAAM,KAAK,IAAI;AACf,QAAM,KAAK,KAAK,MAAM,OAAO;AAC7B,QAAM,KAAK,IAAI,KAAK;AACpB,QAAM,KAAK,IAAI;AACf,QAAM,KAAK,KAAK,MAAM,OAAO;AAC7B,QAAM,KAAK,IAAI,KAAK;AAEpB,WAAS,aAAa,GAAW;AAAE,aAAS,KAAK,IAAI,MAAM,IAAI,MAAM;AAAA,EAAG;AACxE,WAAS,aAAa,GAAW;AAAE,aAAS,KAAK,IAAI,MAAM,IAAI,MAAM;AAAA,EAAG;AACxE,WAAS,uBAAuB,GAAW;AAAE,YAAQ,IAAI,KAAK,IAAI,IAAI,MAAM,IAAI;AAAA,EAAI;AAEpF,WAAS,YAAY,GAAW;AAE5B,QAAI,KAAK,EAAG,QAAO;AACnB,QAAI,KAAK,EAAG,QAAO;AAGnB,QAAI,KAAK;AACT,QAAI,KAAK;AACT,QAAI,KAAK;AAGT,aAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AACxB,YAAM,KAAK,aAAa,EAAE,IAAI;AAC9B,UAAI,KAAK,IAAI,EAAE,IAAI,KAAM,QAAO;AAEhC,YAAM,KAAK,uBAAuB,EAAE;AACpC,UAAI,KAAK,IAAI,EAAE,IAAI,KAAM;AAEzB,YAAM,KAAK;AAAA,IACf;AAGA,SAAK;AACL,WAAO,KAAK,IAAI;AACZ,YAAM,KAAK,aAAa,EAAE;AAC1B,UAAI,KAAK,IAAI,KAAK,CAAC,IAAI,KAAM,QAAO;AACpC,UAAI,IAAI,GAAI,MAAK;AAAA,UACZ,MAAK;AACV,YAAM,KAAK,MAAM;AAAA,IACrB;AAEA,WAAO;AAAA,EACX;AAEA,SAAO,SAAU,GAAW;AACxB,WAAO,aAAa,YAAY,CAAC,CAAC;AAAA,EACtC;AACJ;AAMO,SAAS,OAAO,OAA8B;AACjD,QAAM,IAAI,KAAK,MAAM,MAAM,CAAC,IAAI,GAAG;AACnC,QAAM,IAAI,KAAK,MAAM,MAAM,CAAC,IAAI,GAAG;AACnC,QAAM,IAAI,KAAK,MAAM,MAAM,CAAC,IAAI,GAAG;AACnC,SAAO,MAAM,WAAW,IACpB,UAAU,IAAI,MAAM,IAAI,MAAM,IAAI,MAAM,MAAM,CAAC,IAAI,MACnD,SAAS,IAAI,MAAM,IAAI,MAAM,IAAI;AACzC;AAGO,SAAS,UAAU,GAAqB;AAlQ/C;AAmQI,QAAM,SAAQ,OAAE,MAAM,eAAe,MAAvB,mBAA2B;AACzC,MAAI,CAAC,MAAO,OAAM,IAAI,MAAM,yBAAyB;AACrD,QAAM,QAAQ,MAAM,MAAM,GAAG,EAAE,IAAI,OAAK,CAAC,EAAE,KAAK,CAAC;AACjD,SAAO,CAAC,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC,IAAI,KAAK,GAAI,MAAM,CAAC,MAAM,SAAY,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAE;AACzG;AAGA,SAAS,SAAS,GAAqB;AACnC,QAAM,MAAM,EAAE,MAAM,CAAC;AACrB,QAAM,UAAU,IAAI,UAAU;AAE9B,QAAM,IAAI,UAAU,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,IAAI,MAAM,GAAG,CAAC;AACpD,QAAM,IAAI,UAAU,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,IAAI,MAAM,GAAG,CAAC;AACpD,QAAM,IAAI,UAAU,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,IAAI,MAAM,GAAG,CAAC;AACpD,QAAM,IAAI,IAAI,WAAW,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,IAAI,WAAW,IAAI,IAAI,MAAM,GAAG,CAAC,IAAI;AAEpF,QAAM,SAAS;AAAA,IACX,SAAS,GAAG,EAAE,IAAI;AAAA,IAClB,SAAS,GAAG,EAAE,IAAI;AAAA,IAClB,SAAS,GAAG,EAAE,IAAI;AAAA,EACtB;AAEA,MAAI,MAAM,MAAM;AACZ,WAAO,KAAK,SAAS,GAAG,EAAE,IAAI,GAAG;AAAA,EACrC;AAEA,SAAO;AACX;AAIO,SAAS,WAAW,GAA8B;AACrD,MAAI,CAAC,EAAG,QAAO;AACf,MAAI,MAAM,QAAQ,CAAC,EAAG,QAAO;AAC7B,MAAI,OAAO,MAAM,SAAU,QAAO;AAClC,MAAI,EAAE,WAAW,GAAG,GAAG;AACnB,WAAO,SAAS,CAAC;AAAA,EACrB,WAAW,EAAE,WAAW,KAAK,GAAG;AAC5B,WAAO,UAAU,CAAC;AAAA,EACtB,OAAO;AAEH,YAAQ,KAAK,+BAA+B,CAAC;AAAA,EACjD;AACA,SAAO;AACX;AAEO,IAAM,oBAAoB,oBAAI,IAAI,CAAC,SAAS,QAAQ,eAAe,kBAAkB,cAAc,QAAQ,CAAC;AAC5G,IAAM,qBAAqB,oBAAI,IAAI,CAAC,aAAa,UAAU,SAAS,MAAM,CAAC;AAC3E,IAAM,uBAAuB,oBAAI,IAAI,CAAC,mBAAmB,gBAAgB,CAAC;AAC1E,IAAM,mBAAmB,oBAAI,IAAI,CAAC,mBAAmB,gBAAgB,CAAC;AACtE,IAAM,sBAAsB;AAM5B,SAAS,qBAAqB,OAAuB;AACxD,SAAO,MAAM,SAAS,GAAG,IAAI,MAAM,QAAQ,aAAa,CAAC,GAAG,WAAW,OAAO,YAAY,CAAC,IAAI;AACnG;AAMO,SAAS,gBAAgB,MAAuB;AACnD,SAAO,CAAC,KAAK,SAAS,GAAG,KAAK,aAAa,KAAK,IAAI;AACxD;AAGA,IAAM,uBAAuB,oBAAI,IAAI;AAAA;AAAA,EAEjC;AAAA,EACA;AAAA;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAUJ,CAAC;AAMM,SAAS,6BAA6B,OAAuB;AAChE,SAAO,qBAAqB,IAAI,KAAK,IACjC,QACA,MAAM,QAAQ,sBAAsB,OAAO,EAAE,YAAY;AACjE;AAsBO,SAAS,MAAM,OAAe,KAAa,KAAqB;AACnE,SAAO,KAAK,IAAI,KAAK,KAAK,IAAI,OAAO,GAAG,CAAC;AAC7C;;;ACnZA,IAAM,SAAS;AAIf,IAAM,iBAAiB,oBAAI,IAAI,CAAC,QAAQ,YAAY,WAAW,SAAS,YAAY,QAAQ,UAAU,CAAC;AAEvG,SAAS,cACL,SACA,OACA,OACA,UACF;AACE,QAAM,UAAU,SAAS,gBAAgB,QAAQ,OAAO;AAExD,aAAW,YAAY,OAAO;AAC1B,YAAQ,aAAa,6BAA6B,QAAQ,GAAG,MAAM,QAAQ,CAAC;AAAA,EAChF;AAGA,MAAI,OAAO;AACP,eAAW,aAAa,OAAO;AAC3B,MAAC,QAAgB,MAAM,SAAS,IAAI,OAAO,MAAM,SAAS,CAAC;AAAA,IAC/D;AAAA,EACJ;AAEA,MAAI,UAAU;AACV,eAAW,SAAS,UAAU;AAC1B,cAAQ,YAAY,KAAK;AAAA,IAC7B;AAAA,EACJ;AAEA,SAAO;AACX;AAMA,SAAS,aACL,OACA,MAC2C;AAlD/C;AAmDI,MAAI,CAAC,MAAO,QAAO;AAEnB,MAAI,OAAO,UAAU,UAAU;AAE3B,YAAO,kCAAM,WAAN,mBAAe;AAAA,EAC1B;AAEA,SAAO;AACX;AAGO,SAAS,mBAAmB,OAA4B;AAC3D,QAAM,YAAiC,CAAC;AAGxC,aAAW,OAAO,OAAO,KAAK,KAAK,GAAG;AAClC,QAAI,eAAe,IAAI,GAAG,EAAG;AAE7B,QAAI,QAAQ,MAAM,GAAG;AAErB,QAAI,kBAAkB,IAAI,GAAG,KAAK,MAAM,QAAQ,KAAK,GAAG;AACpD,gBAAU,GAAG,IAAI,OAAO,KAAK;AAAA,IACjC,WAAW,mBAAmB,IAAI,GAAG,GAAG;AACpC,UAAI,MAAM,QAAQ,KAAK,GAAG;AACtB,YAAI,QAAQ,YAAa,SAAQ,MAAM,IAAI,CAAC,MAAc,IAAI,IAAI;AAClE,gBAAQ,MAAM,KAAK,GAAG;AAAA,MAC1B;AACA,UAAI,QAAQ,SAAU,SAAQ,QAAQ;AACtC,gBAAU,WAAW,IAAI,MAAM,MAAM,QAAQ;AAAA,IACjD,WAAW,UAAU,UAAa,UAAU,MAAM;AAC9C,gBAAU,GAAG,IAAI,OAAO,KAAK;AAAA,IACjC;AAAA,EACJ;AAEA,SAAO;AACX;AAKO,SAAS,WAAW,MAAc,MAA+B;AACpE,MAAI,CAAC,KAAM,QAAO;AAElB,QAAqD,WAA7C,QAAM,UAAU,SAAS,MA9FrC,IA8FyD,IAAV,kBAAU,IAAV,CAAnC,QAAM,YAAU,WAAS;AAGjC,QAAM,WAAY,KAAa,QAAQ;AAGvC,QAAM,gBAAgB,aAAa,OAAO,QAAQ;AAGlD,MAAI;AACJ,MAAI,UAAU;AACV,eAAW,MAAM,UAAU;AACvB,YAAM,QAAQ,WAAW,IAAI,QAAQ;AACrC,UAAI,OAAO;AACP,YAAI,CAAC,cAAe,iBAAgB,CAAC;AACrC,sBAAc,KAAK,KAAK;AAAA,MAC5B;AAAA,IACJ;AAAA,EACJ;AAEA,SAAO;AAAA,IACH,QAAQ;AAAA,IACR,mBAAmB,KAAK;AAAA,IACxB;AAAA,IACA;AAAA,EACJ;AACJ;;;ACvFO,SAAS,uBACZ,KACA,QACa;AACb,QAAM,EAAE,SAAS,YAAY,YAAY,0BAA0B,IAAI,IAAI;AAE3E,QAAM,OAAO,IAAI,eAAe;AAEhC,MAAI,CAAC,MAAM;AACP,YAAQ,KAAK,8DAA8D;AAC3E,WAAO;AAAA,EACX;AAGA,QAAM,QAAQ,MAAM;AAChB,QAAI,KAAK;AAAA,EACb;AAGA,QAAM,kBAAkB,MAAM;AAC1B,YAAQ,WAAW;AAAA,MACf,KAAK;AACD,YAAI,MAAM;AACV;AAAA,MACJ,KAAK;AACD,YAAI,OAAO;AACX;AAAA,MACJ,KAAK;AAID,YAAI,KAAK;AACT;AAAA,MACJ,KAAK;AAAA,MACL;AAEI;AAAA,IACR;AAAA,EACJ;AAGA,UAAQ,SAAS;AAAA,IACb,KAAK,QAAQ;AACT,YAAM,eAAe,MAAM,MAAM;AACjC,UAAI,SAAS,eAAe,YAAY;AACpC,qBAAa;AAAA,MACjB,OAAO;AACH,eAAO,iBAAiB,QAAQ,cAAc,EAAE,MAAM,KAAK,CAAC;AAAA,MAChE;AACA;AAAA,IACJ;AAAA,IAEA,KAAK,aAAa;AACd,YAAM,mBAAmB,MAAM,MAAM;AACrC,YAAM,kBAAkB,MAAM,gBAAgB;AAE9C,WAAK,iBAAiB,cAAc,gBAAgB;AACpD,WAAK,iBAAiB,cAAc,eAAe;AACnD;AAAA,IACJ;AAAA,IAEA,KAAK,SAAS;AACV,YAAM,eAAe,MAAM;AACvB,YAAI,IAAI,UAAU,GAAG;AACjB,0BAAgB;AAAA,QACpB,OAAO;AACH,gBAAM;AAAA,QACV;AAAA,MACJ;AACA,WAAK,iBAAiB,SAAS,YAAY;AAC3C;AAAA,IACJ;AAAA,IAEA,KAAK,kBAAkB;AACnB,YAAM,WAAW,IAAI;AAAA,QACjB,aAAW;AACP,kBAAQ,QAAQ,WAAS;AAErB,gBAAI,MAAM,kBAAkB,MAAM,qBAAqB,yBAAyB;AAC5E,oBAAM;AAAA,YACV,OAAO;AAEH,8BAAgB;AAAA,YACpB;AAAA,UACJ,CAAC;AAAA,QACL;AAAA,QACA,EAAE,WAAW,wBAAwB;AAAA,MACzC;AACA,eAAS,QAAQ,IAAI;AACrB;AAAA,IACJ;AAAA,IAEA,KAAK;AAED;AAAA,EACR;AAEA,SAAO;AACX;;;AC1HO,IAAM,wBAAwB;AAE9B,IAAM,oBAAoB;AA0T1B,SAAS,sBAAsB,UAAkD;AACpF,MAAI,EACA,YACA,OAAO,aAAa,YACpB,CAAC,MAAM,QAAQ,QAAQ,IACxB;AACC,WAAO;AAAA,EACX;AAEA,SAAO,SAAS,MAAM,MAAM,SAAS,SAAS,SAAS,MAAM;AACjE;AAYA,SAAS,SAAS,GAAkC;AAChD,SAAO,KAAK,OAAO,MAAM,YAAY,CAAC,MAAM,QAAQ,CAAC;AACzD;AAEA,SAAS,iBAAiB,GAAQ,MAAc,QAA2B;AACvE,MAAI,MAAM,cAAc,MAAM,eAAe,MAAM,UAAU,MAAM,OAAQ,QAAO;AAClF,SAAO,KAAK,OAAO,yBAAyB,IAAI,kDAA0D;AAC1G,SAAO;AACX;AAEA,SAAS,0BAA0B,GAAQ,MAAc,QAA2B;AAChF,MAAI,MAAM,YAAY,MAAM,aAAa,MAAM,eAAe,MAAM,oBAAqB,QAAO;AAChG,SAAO,KAAK,OAAO,kCAAkC,IAAI,gEAAwE;AACjI,SAAO;AACX;AAEA,SAAS,sBAAsB,GAAQ,MAAc,QAA2B;AAC5E,MAAI,OAAO,MAAM,SAAU,QAAO;AAClC,MAAI,MAAM,QAAQ,CAAC,KAAK,EAAE,WAAW,KAAK,EAAE,MAAM,OAAK,OAAO,MAAM,QAAQ,EAAG,QAAO;AACtF,SAAO,KAAK,OAAO,uEAAuE;AAC1F,SAAO;AACX;AAEA,SAAS,mBAAmB,GAAQ,MAAc,QAA2B;AACzE,MAAI,CAAC,SAAS,CAAC,GAAG;AACd,WAAO,KAAK,OAAO,mBAAmB;AACtC,WAAO;AAAA,EACX;AACA,MAAI,QAAQ;AACZ,MAAI,EAAE,SAAS,UAAa,OAAO,EAAE,SAAS,UAAU;AACpD,WAAO,KAAK,OAAO,iCAAiC,OAAO,EAAE,IAAI;AACjE,YAAQ;AAAA,EACZ;AACA,MAAI,EAAE,MAAM,UAAa,OAAO,EAAE,MAAM,UAAU;AAC9C,WAAO,KAAK,OAAO,8BAA8B,OAAO,EAAE,CAAC;AAC3D,YAAQ;AAAA,EACZ;AACA,MAAI,EAAE,WAAW,UAAa,CAAC,sBAAsB,EAAE,QAAQ,OAAO,WAAW,MAAM,EAAG,SAAQ;AAClG,MAAI,EAAE,MAAM,UAAa,CAAC,sBAAsB,EAAE,GAAG,OAAO,MAAM,MAAM,EAAG,SAAQ;AACnF,SAAO;AACX;AAEA,SAAS,4BAA4B,GAAQ,MAAc,QAA2B;AAClF,MAAI,CAAC,SAAS,CAAC,GAAG;AACd,WAAO,KAAK,OAAO,mBAAmB;AACtC,WAAO;AAAA,EACX;AACA,MAAI,QAAQ;AACZ,MAAI,EAAE,cAAc,QAAW;AAC3B,QAAI,CAAC,MAAM,QAAQ,EAAE,SAAS,GAAG;AAC7B,aAAO,KAAK,OAAO,4BAA4B;AAC/C,cAAQ;AAAA,IACZ,OAAO;AACH,QAAE,UAAU,QAAQ,CAAC,IAAS,MAAc;AACxC,YAAI,CAAC,mBAAmB,IAAI,OAAO,gBAAgB,IAAI,KAAK,MAAM,EAAG,SAAQ;AAAA,MACjF,CAAC;AAAA,IACL;AAAA,EACJ;AACA,MAAI,EAAE,QAAQ,QAAW;AACrB,QAAI,CAAC,MAAM,QAAQ,EAAE,GAAG,GAAG;AACvB,aAAO,KAAK,OAAO,sBAAsB;AACzC,cAAQ;AAAA,IACZ,OAAO;AACH,QAAE,IAAI,QAAQ,CAAC,IAAS,MAAc;AAClC,YAAI,CAAC,mBAAmB,IAAI,OAAO,UAAU,IAAI,KAAK,MAAM,EAAG,SAAQ;AAAA,MAC3E,CAAC;AAAA,IACL;AAAA,EACJ;AACA,SAAO;AACX;AAEA,SAAS,8BAA8B,GAAQ,MAAc,QAA2B;AACpF,MAAI,CAAC,SAAS,CAAC,GAAG;AACd,WAAO,KAAK,OAAO,mBAAmB;AACtC,WAAO;AAAA,EACX;AACA,MAAI,QAAQ;AACZ,aAAW,OAAO,OAAO,KAAK,CAAC,GAAG;AAC9B,QAAI,CAAC,4BAA4B,EAAE,GAAG,GAAG,OAAO,MAAM,KAAK,MAAM,EAAG,SAAQ;AAAA,EAChF;AACA,SAAO;AACX;AAEA,SAAS,2BAA2B,GAAQ,MAAc,QAA2B;AACjF,MAAI,OAAO,MAAM,SAAU,QAAO;AAClC,MAAI,MAAM,QAAQ,CAAC,GAAG;AAClB,QAAI,QAAQ;AACZ,MAAE,QAAQ,CAAC,MAAM,MAAM;AACnB,UAAI,OAAO,SAAS,YAAY,CAAC,8BAA8B,MAAM,OAAO,MAAM,IAAI,KAAK,MAAM,GAAG;AAChG,gBAAQ;AAAA,MACZ;AAAA,IACJ,CAAC;AACD,WAAO;AAAA,EACX;AACA,MAAI,SAAS,CAAC,EAAG,QAAO,8BAA8B,GAAG,MAAM,MAAM;AACrE,SAAO,KAAK,OAAO,2DAA2D;AAC9E,SAAO;AACX;AAEA,SAAS,kBAAkB,GAAQ,MAAc,QAA2B;AACxE,MAAI,CAAC,SAAS,CAAC,GAAG;AACd,WAAO,KAAK,OAAO,mBAAmB;AACtC,WAAO;AAAA,EACX;AACA,MAAI,QAAQ;AACZ,QAAM,eAAe,CAAC,QAAQ,aAAa,SAAS,kBAAkB,cAAc;AACpF,MAAI,CAAC,aAAa,SAAS,EAAE,OAAO,GAAG;AACnC,WAAO,KAAK,OAAO,8BAA8B,EAAE,UAAU,iBAAiB,aAAa,KAAK,GAAG,CAAC;AACpG,YAAQ;AAAA,EACZ;AACA,MAAI,EAAE,cAAc,QAAW;AAC3B,UAAM,iBAAiB,CAAC,YAAY,SAAS,SAAS,SAAS;AAC/D,QAAI,CAAC,eAAe,SAAS,EAAE,SAAS,GAAG;AACvC,aAAO,KAAK,OAAO,gCAAgC,EAAE,YAAY,iBAAiB,eAAe,KAAK,GAAG,CAAC;AAC1G,cAAQ;AAAA,IACZ;AAAA,EACJ;AACA,MAAI,EAAE,4BAA4B,UAAa,OAAO,EAAE,4BAA4B,UAAU;AAC1F,WAAO,KAAK,OAAO,oDAAoD,OAAO,EAAE,uBAAuB;AACvG,YAAQ;AAAA,EACZ;AACA,SAAO;AACX;AAEA,SAAS,yBAAyB,GAAQ,MAAc,QAA2B;AAC/E,MAAI,CAAC,SAAS,CAAC,GAAG;AACd,WAAO,KAAK,OAAO,mBAAmB;AACtC,WAAO;AAAA,EACX;AACA,MAAI,QAAQ;AACZ,MAAI,EAAE,SAAS,UAAa,CAAC,CAAC,QAAQ,UAAU,QAAQ,EAAE,SAAS,EAAE,IAAI,GAAG;AACxE,WAAO,KAAK,OAAO,2BAA2B,EAAE,OAAO,sCAA4C;AACnG,YAAQ;AAAA,EACZ;AACA,MAAI,EAAE,aAAa,UAAa,OAAO,EAAE,aAAa,UAAU;AAC5D,WAAO,KAAK,OAAO,qCAAqC,OAAO,EAAE,QAAQ;AACzE,YAAQ;AAAA,EACZ;AACA,MAAI,EAAE,UAAU,UAAa,OAAO,EAAE,UAAU,UAAU;AACtD,WAAO,KAAK,OAAO,kCAAkC,OAAO,EAAE,KAAK;AACnE,YAAQ;AAAA,EACZ;AACA,MAAI,EAAE,eAAe,UAAa,OAAO,EAAE,eAAe,YAAY,EAAE,eAAe,YAAY;AAC/F,WAAO,KAAK,OAAO,qDAAuD,OAAO,EAAE,UAAU;AAC7F,YAAQ;AAAA,EACZ;AACA,MAAI,EAAE,SAAS,UAAa,CAAC,iBAAiB,EAAE,MAAM,OAAO,SAAS,MAAM,EAAG,SAAQ;AACvF,MAAI,EAAE,cAAc,UAAa,CAAC,0BAA0B,EAAE,WAAW,OAAO,cAAc,MAAM,EAAG,SAAQ;AAC/G,MAAI,EAAE,cAAc,UAAa,OAAO,EAAE,cAAc,UAAU;AAC9D,WAAO,KAAK,OAAO,sCAAsC,OAAO,EAAE,SAAS;AAC3E,YAAQ;AAAA,EACZ;AACA,MAAI,EAAE,YAAY,UAAa,CAAC,kBAAkB,EAAE,SAAS,OAAO,YAAY,MAAM,EAAG,SAAQ;AACjG,SAAO;AACX;AAEA,SAAS,eAAe,GAAQ,MAAc,QAA2B;AACrE,MAAI,CAAC,SAAS,CAAC,GAAG;AACd,WAAO,KAAK,OAAO,mBAAmB;AACtC,WAAO;AAAA,EACX;AACA,MAAI,QAAQ;AACZ,MAAI,EAAE,YAAY,QAAW;AACzB,QAAI,CAAC,SAAS,EAAE,OAAO,GAAG;AACtB,aAAO,KAAK,OAAO,2BAA2B;AAC9C,cAAQ;AAAA,IACZ,OAAO;AACH,iBAAW,OAAO,OAAO,KAAK,EAAE,OAAO,GAAG;AACtC,YAAI,CAAC,sBAAsB,EAAE,QAAQ,GAAG,GAAG,OAAO,cAAc,KAAK,MAAM,EAAG,SAAQ;AAAA,MAC1F;AAAA,IACJ;AAAA,EACJ;AACA,MAAI,EAAE,eAAe,QAAW;AAC5B,QAAI,CAAC,SAAS,EAAE,UAAU,GAAG;AACzB,aAAO,KAAK,OAAO,8BAA8B;AACjD,cAAQ;AAAA,IACZ,OAAO;AACH,iBAAW,OAAO,OAAO,KAAK,EAAE,UAAU,GAAG;AACzC,YAAI,CAAC,8BAA8B,EAAE,WAAW,GAAG,GAAG,OAAO,iBAAiB,KAAK,MAAM,EAAG,SAAQ;AAAA,MACxG;AAAA,IACJ;AAAA,EACJ;AACA,MAAI,EAAE,WAAW,UAAa,CAAC,SAAS,EAAE,MAAM,GAAG;AAC/C,WAAO,KAAK,OAAO,0BAA0B;AAC7C,YAAQ;AAAA,EACZ;AACA,SAAO;AACX;AAEA,SAAS,kBAAkB,GAAQ,MAAc,QAA2B;AACxE,MAAI,CAAC,SAAS,CAAC,GAAG;AACd,WAAO,KAAK,OAAO,mBAAmB;AACtC,WAAO;AAAA,EACX;AACA,MAAI,QAAQ;AACZ,MAAI,OAAO,EAAE,OAAO,UAAU;AAC1B,WAAO,KAAK,OAAO,+BAA+B,OAAO,EAAE,EAAE;AAC7D,YAAQ;AAAA,EACZ;AACA,MAAI,CAAC,2BAA2B,EAAE,SAAS,OAAO,YAAY,MAAM,EAAG,SAAQ;AAC/E,SAAO;AACX;AAEA,SAAS,eAAe,GAAQ,MAAc,QAA2B;AACrE,MAAI,CAAC,SAAS,CAAC,GAAG;AACd,WAAO,KAAK,OAAO,mBAAmB;AACtC,WAAO;AAAA,EACX;AACA,MAAI,QAAQ;AACZ,MAAI,OAAO,EAAE,SAAS,UAAU;AAC5B,WAAO,KAAK,OAAO,iCAAiC,OAAO,EAAE,IAAI;AACjE,YAAQ;AAAA,EACZ;AACA,MAAI,EAAE,aAAa,QAAW;AAC1B,QAAI,CAAC,MAAM,QAAQ,EAAE,QAAQ,GAAG;AAC5B,aAAO,KAAK,OAAO,2BAA2B;AAC9C,cAAQ;AAAA,IACZ,OAAO;AACH,QAAE,SAAS,QAAQ,CAAC,OAAY,MAAc;AAC1C,YAAI,CAAC,eAAe,OAAO,OAAO,eAAe,IAAI,KAAK,MAAM,EAAG,SAAQ;AAAA,MAC/E,CAAC;AAAA,IACL;AAAA,EACJ;AACA,MAAI,EAAE,YAAY,UAAa,CAAC,2BAA2B,EAAE,SAAS,OAAO,YAAY,MAAM,EAAG,SAAQ;AAC1G,SAAO;AACX;AAEA,SAAS,kBAAkB,GAAQ,MAAc,QAA2B;AACxE,MAAI,CAAC,eAAe,GAAG,MAAM,MAAM,EAAG,QAAO;AAC7C,MAAI,QAAQ;AACZ,MAAI,EAAE,SAAS,OAAO;AAClB,WAAO,KAAK,OAAO,iCAAoC,EAAE,OAAO,GAAI;AACpE,YAAQ;AAAA,EACZ;AACA,MAAI,EAAE,UAAU,UAAa,OAAO,EAAE,UAAU,UAAU;AACtD,WAAO,KAAK,OAAO,kCAAkC,OAAO,EAAE,KAAK;AACnE,YAAQ;AAAA,EACZ;AACA,MAAI,EAAE,WAAW,UAAa,OAAO,EAAE,WAAW,UAAU;AACxD,WAAO,KAAK,OAAO,mCAAmC,OAAO,EAAE,MAAM;AACrE,YAAQ;AAAA,EACZ;AACA,MAAI,EAAE,YAAY,UAAa,OAAO,EAAE,YAAY,UAAU;AAC1D,WAAO,KAAK,OAAO,oCAAoC,OAAO,EAAE,OAAO;AACvE,YAAQ;AAAA,EACZ;AACA,MAAI,EAAE,aAAa,UAAa,CAAC,yBAAyB,EAAE,UAAU,OAAO,aAAa,MAAM,EAAG,SAAQ;AAC3G,MAAI,EAAE,SAAS,UAAa,CAAC,eAAe,EAAE,MAAM,OAAO,SAAS,MAAM,EAAG,SAAQ;AACrF,MAAI,EAAE,aAAa,QAAW;AAC1B,QAAI,CAAC,MAAM,QAAQ,EAAE,QAAQ,GAAG;AAC5B,aAAO,KAAK,OAAO,2BAA2B;AAC9C,cAAQ;AAAA,IACZ,OAAO;AACH,QAAE,SAAS,QAAQ,CAAC,SAAc,MAAc;AAC5C,YAAI,CAAC,kBAAkB,SAAS,OAAO,eAAe,IAAI,KAAK,MAAM,EAAG,SAAQ;AAAA,MACpF,CAAC;AAAA,IACL;AAAA,EACJ;AACA,MAAI,EAAE,WAAW,UAAa,CAAC,eAAe,EAAE,QAAQ,OAAO,WAAW,MAAM,EAAG,SAAQ;AAC3F,SAAO;AACX;AAOO,SAAS,0BAA0B,UAAmC;AACzE,QAAM,SAAmB,CAAC;AAC1B,QAAM,QAAQ,kBAAkB,UAAU,QAAQ,MAAM;AACxD,SAAO,EAAE,OAAO,OAAO;AAC3B;AAEO,SAAS,kBAAkB,KAA0D;AA5mB5F;AA6mBI,UACI,2BAAK,eAAY,gCAAK,SAAL,mBAAW,cAC5B,2BAAK,gBAAa,gCAAK,SAAL,mBAAW;AAErC;AAEO,SAAS,QAAQ,KAAgD;AAnnBxE;AAonBI,MAAI,CAAC,IAAK,QAAO;AACjB,SAAO,IAAI,UAAQ,SAAI,SAAJ,mBAAU;AACjC;AAEO,SAAS,YAAY,KAAqD;AAxnBjF;AAynBI,MAAI,CAAC,IAAK,QAAO;AACjB,SAAO,IAAI,cAAY,SAAI,SAAJ,mBAAU;AACrC;AAGO,SAAS,YAAY,KAAkD;AAC1E,SAAO,2BAAK;AAChB;;;AC7lBA,SAAS,kBAAkB,GAA+B;AACtD,QAAM,SAAS,EAAE,MAAM,qBAAqB,EAAE,IAAI,OAAK,EAAE,KAAK,CAAC,EAAE,OAAO,OAAK,KAAK,MAAM,GAAG;AAE3F,QAAM,WAA+B,CAAC;AACtC,MAAI,iBAAqC;AAEzC,aAAW,SAAS,QAAQ;AACxB,QAAI,aAAa,KAAK,KAAK,GAAG;AAC1B,uBAAiB,EAAE,MAAM,OAAO,QAAQ,CAAC,EAAE;AAC3C,eAAS,KAAK,cAAc;AAAA,IAChC,WAAW,gBAAgB;AACvB,YAAM,QAAQ,CAAC;AACf,qBAAe,OAAO,KAAK,OAAO,MAAM,KAAK,IAAI,IAAI,KAAK;AAAA,IAC9D;AAAA,EACJ;AAEA,SAAO;AACX;AAMA,SAAS,qBAAqB,GAAgC;AAC1D,QAAM,MAA2B,CAAC;AAClC,MAAI;AAEJ,QAAM,WAAW,kBAAkB,CAAC;AAEpC,aAAW,WAAW,UAAU;AAC5B,UAAM,OAAO,QAAQ;AACrB,UAAM,SAAS,QAAQ;AAEvB,QAAI,SAAS,OAAO,SAAS,KAAK;AAC9B,YAAM,IAAI,OAAO,CAAC,KAAK;AACvB,YAAM,IAAI,OAAO,CAAC,KAAK;AACvB,oBAAc;AAAA,QACV,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;AAAA,QACV,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;AAAA,QACV,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;AAAA,QACV,GAAG;AAAA,MACP;AACA,UAAI,KAAK,WAAW;AACpB;AAAA,IACJ;AAGA,QAAI,CAAC,aAAa;AACd,oBAAc;AAAA,QACV,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;AAAA,QACV,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;AAAA,QACV,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;AAAA,QACV,GAAG;AAAA,MACP;AACA,UAAI,KAAK,WAAW;AAAA,IACxB;AAEA,QAAI,SAAS,KAAK;AACd,YAAM,IAAI,OAAO,CAAC,KAAK;AACvB,YAAM,IAAI,OAAO,CAAC,KAAK;AACvB,kBAAY,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;AACzB,kBAAY,EAAG,KAAK,CAAC,GAAG,CAAC,CAAC;AAC1B,kBAAY,EAAG,KAAK,CAAC,GAAG,CAAC,CAAC;AAAA,IAE9B,WAAW,SAAS,KAAK;AACrB,YAAM,OAAO,OAAO,CAAC,KAAK;AAC1B,YAAM,OAAO,OAAO,CAAC,KAAK;AAC1B,YAAM,OAAO,OAAO,CAAC,KAAK;AAC1B,YAAM,OAAO,OAAO,CAAC,KAAK;AAC1B,YAAM,KAAK,OAAO,CAAC,KAAK;AACxB,YAAM,KAAK,OAAO,CAAC,KAAK;AAGxB,kBAAY,EAAG,YAAY,EAAG,SAAS,CAAC,IAAI,CAAC,MAAM,IAAI;AAGvD,kBAAY,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC;AAC3B,kBAAY,EAAG,KAAK,CAAC,MAAM,IAAI,CAAC;AAChC,kBAAY,EAAG,KAAK,CAAC,IAAI,EAAE,CAAC;AAAA,IAEhC,WAAW,SAAS,OAAO,SAAS,KAAK;AACrC,kBAAY,IAAI;AAAA,IACpB;AAAA,EACJ;AAEA,SAAO;AACX;AAOA,SAAS,gBAAgB,KAAiC;AACtD,MAAI,IAAI,WAAW,OAAO,KAAK,IAAI,SAAS,GAAG,GAAG;AAC9C,WAAO,IAAI,MAAM,GAAG,EAAE;AAAA,EAC1B;AAEA,MAAI,0BAA0B,KAAK,GAAG,GAAG;AACrC,WAAO;AAAA,EACX;AACA,SAAO;AACX;AAKA,SAAS,aAAa,OAA6B;AAC/C,SAAO,OAAO,UAAU,YAAY,gBAAgB,KAAK,MAAM;AACnE;AAaA,SAAS,mBAAmB,OAAkD;AAE1E,MAAI,SAAS,OAAO,UAAU,YAAY,WAAW,OAAO;AACxD,UAAM,aAAa,MAAM;AACzB,QAAI,MAAM,QAAQ,UAAU,KAAK,WAAW,SAAS,GAAG;AAEpD,UAAI,aAAa,WAAW,CAAC,CAAC,GAAG;AAC7B,cAAM,QAA6B,CAAC;AACpC,mBAAW,WAAW,YAAY;AAC9B,gBAAM,IAAI,gBAAgB,OAAO;AACjC,cAAI,GAAG;AACH,kBAAM,KAAK,GAAG,qBAAqB,CAAC,CAAC;AAAA,UACzC;AAAA,QACJ;AACA,eAAO,EAAE,MAAM;AAAA,MACnB;AAAA,IACJ;AAEA,WAAO;AAAA,EACX;AAGA,MAAI,MAAM,QAAQ,KAAK,GAAG;AACtB,QAAI,MAAM,SAAS,KAAK,aAAa,MAAM,CAAC,CAAC,GAAG;AAC5C,YAAM,QAA6B,CAAC;AACpC,iBAAW,WAAW,OAAO;AACzB,cAAM,IAAI,gBAAgB,OAAO;AACjC,YAAI,GAAG;AACH,gBAAM,KAAK,GAAG,qBAAqB,CAAC,CAAC;AAAA,QACzC;AAAA,MACJ;AACA,aAAO,EAAE,MAAM;AAAA,IACnB;AAEA,WAAO,EAAE,OAAO,MAAM;AAAA,EAC1B;AAGA,MAAI,aAAa,KAAK,GAAG;AACrB,UAAM,IAAI,gBAAgB,KAAK;AAC/B,WAAO,EAAE,OAAO,qBAAqB,CAAC,EAAE;AAAA,EAC5C;AAEA,SAAO;AACX;AAaA,SAAS,cACL,QACA,MAC4C;AAzNhD;AA0NI,MAAI,CAAC,OAAQ,QAAO;AAEpB,MAAI,MAAM,QAAQ,MAAM,GAAG;AACvB,WAAO;AAAA,EACX;AAGA,OAAI,kCAAM,YAAN,mBAAgB,SAAS;AACzB,WAAO,KAAK,QAAQ,MAAM;AAAA,EAC9B;AAGA,UAAQ,KAAK,0BAA0B,MAAM;AAC7C,SAAO;AACX;AAQA,SAAS,iBACL,SACA,MACiC;AAnPrC;AAoPI,MAAI,OAAO,YAAY,UAAU;AAE7B,UAAM,YAAW,kCAAM,eAAN,mBAAmB;AACpC,QAAI,CAAC,UAAU;AACX,cAAQ,KAAK,6BAA6B,OAAO;AAAA,IACrD;AACA,WAAO;AAAA,EACX;AAGA,SAAO;AACX;AAQA,SAAS,wBACL,SACA,MACuB;AACvB,MAAI,CAAC,QAAS,QAAO,CAAC;AAEtB,QAAM,UAAmC,CAAC;AAE1C,MAAI,OAAO,YAAY,UAAU;AAC7B,UAAM,WAAW,iBAAiB,SAAS,IAAI;AAC/C,QAAI,SAAU,SAAQ,KAAK,QAAQ;AAAA,EACvC,WAAW,MAAM,QAAQ,OAAO,GAAG;AAC/B,eAAW,QAAQ,SAAS;AACxB,YAAM,WAAW,iBAAiB,MAAM,IAAI;AAC5C,UAAI,SAAU,SAAQ,KAAK,QAAQ;AAAA,IACvC;AAAA,EACJ,OAAO;AAEH,YAAQ,KAAK,OAAO;AAAA,EACxB;AAEA,SAAO;AACX;AAWA,SAAS,mBACL,UACA,UACA,UACA,MACY;AA7ShB;AA8SI,QAAM,YAAY,SAAS,aAAa,SAAS,OAAO,CAAC;AACzD,QAAM,aAA2B,CAAC;AAElC,aAAW,MAAM,WAAW;AACxB,UAAM,WAAU,cAAG,SAAH,YAAW,GAAG,MAAd,YAAmB;AACnC,QAAI,SAAQ,QAAG,UAAH,YAAY,GAAG;AAC3B,UAAM,UAAS,QAAG,WAAH,YAAa,GAAG;AAG/B,QAAI,aAAa,KAAK;AAClB,cAAQ,mBAAmB,KAAK;AAAA,IACpC;AAGA,QAAI,kBAAkB,IAAI,QAAQ,GAAG;AACjC,eAAQ,gBAAW,KAAK,MAAhB,YAAqB;AAAA,IACjC;AAEA,eAAW,KAAK;AAAA,MACZ,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG,cAAc,QAAQ,IAAI;AAAA,IACjC,CAAC;AAAA,EACL;AAGA,aAAW,KAAK,CAAC,GAAG,MAAG;AAxU3B,QAAAA,KAAAC;AAwU+B,aAAAD,MAAA,EAAE,MAAF,OAAAA,MAAO,OAAMC,MAAA,EAAE,MAAF,OAAAA,MAAO;AAAA,GAAE;AAEjD,SAAO;AACX;AAMA,SAAS,0BACL,YACqB;AACrB,QAAM,SAAgC,CAAC;AAEvC,aAAW,QAAQ,YAAY;AAC3B,eAAW,CAAC,MAAM,QAAQ,KAAK,OAAO,QAAQ,IAAI,GAAG;AACjD,aAAO,IAAI,IAAI;AAAA,IACnB;AAAA,EACJ;AAEA,SAAO;AACX;AAKA,IAAI,oBAAoB;AACjB,SAAS,oBAA4B;AACxC,SAAO,YAAa,EAAE;AAC1B;AAaA,SAAS,6BACL,SACA,UACA,MACqB;AACrB,QAAM,aAAoC,CAAC;AAE3C,aAAW,CAAC,UAAU,QAAQ,KAAK,OAAO,QAAQ,OAAO,GAAG;AACxD,UAAM,gBAAgB,mBAAmB,UAAU,UAAU,UAAU,IAAI;AAC3E,QAAI,cAAc,SAAS,GAAG;AAC1B,iBAAW,QAAQ,IAAI,EAAE,KAAK,cAAc;AAAA,IAChD;AAAA,EACJ;AAEA,SAAO;AACX;AAOO,SAAS,sBAAsB,KAAyC;AAC3E,QAAM,iBAAiB,kBAAkB,GAAG,KAAK,CAAC;AAClD,QAAM,OAAO,QAAQ,GAAG;AACxB,QAAM,WAAW,eAAe,YAAY;AAE5C,QAAM,WAAwB,CAAC;AAG/B,QAAM,mBAAmB,CACrB,IACA,YACmB;AACnB,QAAI,CAAC,QAAS,QAAO;AAErB,UAAM,WAAW,wBAAwB,SAAS,IAAI;AACtD,QAAI,SAAS,WAAW,EAAG,QAAO;AAElC,UAAM,SAAS,0BAA0B,QAAQ;AACjD,UAAM,iBAAiB,6BAA6B,QAAQ,UAAU,IAAI;AAE1E,QAAI,OAAO,KAAK,cAAc,EAAE,WAAW,EAAG,QAAO;AAErD,WAAO;AAAA,MACH;AAAA,MACA,SAAS;AAAA,IACb;AAAA,EACJ;AAGA,QAAM,cAAc,YAAY,GAAG;AACnC,MAAI,aAAa;AACb,eAAW,WAAW,aAAa;AAC/B,YAAM,aAAa,iBAAiB,QAAQ,IAAI,QAAQ,OAAO;AAC/D,UAAI,WAAY,UAAS,KAAK,UAAU;AAAA,IAC5C;AAAA,EACJ;AAGA,QAAM,cAAc,CAAC,SAAiB;AAElC,QAAI,KAAK,SAAS;AACd,YAAM,SAAS,KAAK,MAAM,kBAAkB;AAC5C,WAAK,KAAK;AACV,YAAM,aAAa,iBAAiB,QAAQ,KAAK,OAAO;AACxD,UAAI,WAAY,UAAS,KAAK,UAAU;AAAA,IAC5C;AAGA,QAAI,KAAK,UAAU;AACf,eAAS,IAAI,GAAG,IAAI,KAAK,SAAS,QAAQ,KAAK;AAC3C,oBAAY,KAAK,SAAS,CAAC,CAAC;AAAA,MAChC;AAAA,IACJ;AAAA,EACJ;AAGA,MAAI,IAAI,UAAU;AACd,aAAS,IAAI,GAAG,IAAI,IAAI,SAAS,QAAQ,KAAK;AAC1C,kBAAY,IAAI,SAAS,CAAC,CAAC;AAAA,IAC/B;AAAA,EACJ;AAEA,SAAO;AACX;AAUA,SAAS,iBAAiB,WAAyB,UAAkB;AAjdrE;AAkdI,MAAI,SAAS,UAAU,CAAC;AACxB,MAAI,SAAS,UAAU,UAAU,SAAS,CAAC;AAE3C,WAAS,IAAI,GAAG,IAAI,UAAU,SAAS,GAAG,KAAK;AAC3C,UAAM,QAAQ,eAAU,CAAC,EAAE,MAAb,YAAkB;AAChC,UAAM,QAAQ,eAAU,IAAI,CAAC,EAAE,MAAjB,YAAsB;AACpC,QAAI,QAAQ,YAAY,YAAY,MAAM;AACtC,eAAS,UAAU,CAAC;AACpB,eAAS,UAAU,IAAI,CAAC;AACxB;AAAA,IACJ;AAAA,EACJ;AACA,SAAO,EAAE,QAAQ,OAAO;AAC5B;AAKA,SAAS,kBACL,UACA,UACA,UAC+B;AAxenC;AAyeI,QAAM,YAAY,SAAS,OAAO,SAAS,aAAa,CAAC;AACzD,MAAI,UAAU,WAAW,EAAG,QAAO;AAEnC,QAAM,EAAE,QAAQ,OAAO,IAAI,iBAAiB,WAAW,QAAQ;AAG/D,MAAI,gBAAiB,WAAW,SAAU,IAAI,MAAM,WAAU,YAAO,MAAP,YAAY,IAAG,YAAO,MAAP,YAAY,GAAG,GAAG,CAAC;AAChG,kBAAgB,MAAM,eAAe,GAAG,CAAC;AACzC,QAAM,UAAS,YAAO,MAAP,YAAY,OAAO;AAClC,MAAI,UAAU,MAAM,QAAQ,MAAM,GAAG;AACjC,QAAI;AACA,sBAAgB,YAAY,MAA0C,EAAE,aAAa;AAAA,IACzF,SAAS,GAAG;AAAA,IAEZ;AAAA,EACJ;AAEA,MAAI,cAAc,gBAAgB,QAAQ,IAAI,6BAA6B,QAAQ,IAAI;AACvF,MAAI,WAAmC;AAEvC,QAAM,SAAQ,sCAAQ,MAAR,YAAa,iCAAQ;AACnC,QAAM,SAAQ,sCAAQ,MAAR,YAAa,iCAAQ;AAEnC,MAAI,gBAAgB,KAAK;AAErB,UAAM,aAAY,oCAAO,UAAP,YAAiB,MAAM,QAAQ,KAAK,IAAI,QAAQ,CAAC;AACnE,UAAM,aAAY,oCAAO,UAAP,YAAiB,MAAM,QAAQ,KAAK,IAAI,QAAQ,CAAC;AACnE,eAAW;AAAA,MACP;AAAA,MACA;AAAA,MACA;AAAA,IACJ,EAAE,IAAI,QAAM,gBAAgB,EAAE,CAAC,EAAE,KAAK,EAAE;AAAA,EAC5C,WAAW,kBAAkB,IAAI,WAAW,GAAG;AAC3C,eAAW,OAAO;AAAA,MACd,SAAS,CAAC,GAAG,GAAG,GAAG,CAAC;AAAA,MACpB,SAAS,CAAC,GAAG,GAAG,GAAG,CAAC;AAAA,MACpB;AAAA,IACJ,CAAC;AACD,kBAAc;AAAA,EAClB,WAAW,gBAAgB,oBAAoB;AAC3C,eAAW;AAAA,MACP,SAAS,CAAC;AAAA,MACV,SAAS,CAAC;AAAA,MACV;AAAA,IACJ,EAAE,KAAK,GAAG;AACV,kBAAc;AAAA,EAClB,WAAW,gBAAgB,aAAa;AACpC,UAAM,IAAI;AAAA,MACN,SAAS,CAAC,GAAG,CAAC;AAAA,MACd,SAAS,CAAC,GAAG,CAAC;AAAA,MACd;AAAA,IACJ;AACA,eAAW,eAAe,EAAE,KAAK,GAAG,IAAI;AACxC,kBAAc;AAAA,EAClB,WAAW,gBAAgB,UAAU;AACjC,UAAM,IAAI;AAAA,MACN,EAAE,SAAS;AAAA,MACX,EAAE,SAAS;AAAA,MACX;AAAA,IACJ;AACA,eAAW,YAAY,IAAI;AAC3B,kBAAc;AAAA,EAClB,WAAW,gBAAgB,SAAS;AAChC,UAAM,IAAI;AAAA,MACN,SAAS,CAAC,GAAG,CAAC;AAAA,MACd,SAAS,CAAC,GAAG,CAAC;AAAA,MACd;AAAA,IACJ;AACA,eAAW,WAAW,EAAE,KAAK,GAAG,IAAI;AACpC,kBAAc;AAAA,EAClB,OAAO;AAEH,UAAM,MAAM;AAAA,MACR,EAAE,SAAS;AAAA,MACX,EAAE,SAAS;AAAA,MACX;AAAA,IACJ;AACA,eAAW;AAAA,EACf;AAEA,MAAI,qBAAqB,IAAI,WAAW,KAAK,OAAO,aAAa,UAAU;AACvE,eAAY,WAAW,MAAO;AAAA,EAClC;AAEA,SAAO,EAAE,GAAG,aAAa,GAAG,aAAa,OAAO,KAAK,KAAK,SAAS;AACvE;AAQO,SAAS,oBACZ,SACA,UACsB;AACtB,QAAM,SAAiC,CAAC;AAExC,aAAW,CAAC,UAAU,QAAQ,KAAK,OAAO,QAAQ,OAAO,GAAG;AACxD,UAAM,WAAW,kBAAkB,UAAU,UAAU,QAAQ;AAC/D,QAAI,UAAU;AACV,aAAO,SAAS,CAAC,IAAI,SAAS;AAAA,IAClC;AAAA,EACJ;AAEA,SAAO;AACX;;;AC7jBO,SAAS,YAAY,IAAY;AAEpC,SAAO,MAAM;AACjB;AAWO,SAAS,6BACZ,KACA,SACA,WACa;AAEb,QAAM,SAAS,kBAAkB,GAAG,KAAK,CAAC;AAE1C,QAAM,WAAW,sBAAsB,GAAG;AAG1C,QAAM,cAAc,OAAO;AAC3B,MAAI,aAAqB;AACzB,MAAI,OAAO,gBAAgB,SAAU,cAAa,eAAe;AACjE,MAAI,gBAAgB,WAAY,cAAa;AAC7C,MAAI,aAAa,EAAG,cAAa;AAEjC,QAAM,WAAW,EAAE,OAAO,YAAY;AACtC,QAAM,gBAAgB,YAAY,aAC9B,YAAY,eAAe,WAAW,WAAW,cAChD,YAAY,kCAAc,KAAK,WAAW;AAG/C,QAAM,YAAY,OAAO,aAAa;AAItC,MAAI,UAAyB;AAC7B,MAAI,UAAU;AAEd,MAAI,wBAAyB,OAAO,SAAS;AAC7C,MAAI,gBAAgB;AACpB,MAAI,eAAe;AAEnB,MAAI,eAAe;AAGnB,QAAM,YAAY,OAAO;AACzB,QAAM,qBAAqB,aAAa,YAAY,IAAI,MAAO,YAAY;AAC3E,MAAI,eAAe;AAEnB,QAAM,qBAAqB,MAAM;AAE7B,UAAM,iBAAiB,iBAAiB,KAAK,IAAI,IAAI,iBAAiB,eAAe;AACrF,QAAI,OAAO,wBAAwB;AAGnC,QAAI,OAAO,SAAS,aAAa,KAAK,OAAQ,cAA0B,QAAO;AAC/E,QAAI,OAAO,EAAG,QAAO;AACrB,WAAO;AAAA,EACX;AAOA,WAAS,YAAY,eAAuB;AAExC,aAAS,uBAAuB;AAE5B,YAAM,eAAe,WAAW,IAAI,WAAW;AAE/C,UAAI,cAAc;AAClB,UAAI,YAAY;AAChB,UAAI,WAAW,GAAG;AAad,wBAAgB,MAAM,eAAe,GAAG,aAAa,YAAY;AAEjE,oBAAY,KAAK,IAAI,GAAG,KAAK,KAAK,gBAAgB,YAAY,IAAI,CAAC;AACnE,oBAAY,KAAK,IAAI,WAAW,aAAa,CAAC;AAG9C,cAAM,gBAAgB,gBAAgB,YAAY;AAGlD,sBAAc,MAAM,gBAAgB,cAAc,GAAG,CAAC;AAAA,MAC1D,OAAO;AACH,sBAAc;AAAA,MAClB;AAMA,UAAI,eAAe;AAMnB,YAAM,MAAM,aAAa;AACzB,UAAIC,qBAAoB;AACxB,UAAI,QAAQ,WAAW;AACnB,QAAAA,qBAAoB,IAAI;AAAA,MAC5B,WAAW,QAAQ,aAAa;AAC5B,YAAI,YAAY,MAAM,EAAG,CAAAA,qBAAoB,IAAI;AAAA,MACrD,WAAW,QAAQ,qBAAqB;AAEpC,YAAI,YAAY,MAAM,EAAG,CAAAA,qBAAoB,IAAI;AAAA,MACrD;AACA,aAAOA;AAAA,IACX;AACA,QAAI,oBAAoB,qBAAqB;AAM7C,eAAW,WAAW,YAAY,CAAC,GAAG;AAClC,YAAM,UAAU,QAAQ;AACxB,UAAI,CAAC,WAAW,OAAO,YAAY,YAAY,MAAM,QAAQ,OAAO,GAAG;AACnE,gBAAQ,KAAK,+BAA+B,OAAO;AACnD;AAAA,MACJ;AAGA,YAAM,iBAAiB,oBAAoB,SAAS,oBAAoB,QAAQ;AAGhF,iBAAW,CAAC,UAAU,KAAK,KAAK,OAAO,QAAQ,cAAc,GAAG;AAC5D,gBAAQ,aAAa,QAAQ,IAAI,UAAU,KAAK;AAAA,MACpD;AAAA,IACJ;AAAA,EACJ;AAKA,QAAM,OAAO,MAAM;AAjLvB;AAoLQ,QAAI,CAAC,QAAQ,YAAY,GAAG;AAGxB,gBAAU;AACV;AAAA,IACJ;AAEA,UAAM,cAAc,mBAAmB;AAGvC,QAAI,qBAAqB,GAAG;AACxB,YAAM,MAAM,KAAK,IAAI;AACrB,UAAI,gBAAiB,MAAM,eAAgB,oBAAoB;AAE3D;AAAA,MACJ;AACA,qBAAe;AAAA,IACnB;AAIA,QAAI,YAAY,GAAG;AAAA,IAInB;AAGA,QAAI,iBAAiB,OAAO,SAAS,aAAa,KAAK,eAAgB,eAA0B;AAE7F,kBAAY,aAAa;AAEzB,UAAI,CAAC,cAAc;AACf,uBAAe;AACf,qDAAW,aAAX;AAAA,MACJ;AACA,gBAAU;AACV;AAAA,IACJ;AAGA,gBAAY,WAAW;AAAA,EAC3B;AAMA,MAAI,OAAO,OAAO;AAEd,gBAAY,mBAAmB,CAAC;AAAA,EACpC;AAIA,QAAM,aAAa,MAAM;AACrB,QAAI,CAAC,QAAS,QAAO;AACrB,QAAI,CAAC,QAAQ,YAAY,GAAG;AAAE,aAAO;AAAA,IAAO;AAC5C,QAAI,OAAO,SAAS,aAAa,KAAK,mBAAmB,KAAM,cAA0B,QAAO;AAChG,WAAO;AAAA,EACX;AAEA,QAAM,WAAW,CAAC,YAAsB;AACpC,QAAI,YAAY,MAAM;AAClB,2BAAqB,OAAO;AAC5B,gBAAU;AAAA,IACd;AAEA,QAAI,EAAE,WAAW,WAAW,IAAI;AAE5B;AAAA,IACJ;AAEA,cAAU,sBAAsB,MAAM;AAClC,gBAAU;AACV,WAAK;AACL,eAAS;AAAA,IACb,CAAC;AAAA,EACL;AAEA,QAAM,YAAY,MAAM;AACpB,QAAI,QAAS;AACb,cAAU;AACV,oBAAgB,KAAK,IAAI;AACzB,aAAS,IAAI;AAAA,EACjB;AAEA,QAAM,YAAY,MAAM;AACpB,QAAI,CAAC,QAAS;AAEd,4BAAwB,mBAAmB;AAC3C,oBAAgB;AAChB,cAAU;AAEV,QAAI,YAAY,MAAM;AAClB,2BAAqB,OAAO;AAC5B,gBAAU;AAAA,IACd;AAEA,gBAAY,qBAAqB;AAAA,EACrC;AAEA,QAAM,aAAa,MAAM;AA1R7B;AA2RQ,cAAU;AAEV,4BAAwB;AACxB,oBAAgB;AAChB,cAAU;AACV,mBAAe;AAEf,gBAAY,qBAAqB;AAEjC,iDAAW,aAAX;AAAA,EACJ;AAEA,QAAM,aAAa,CAAC,eAAe,SAAS;AAvShD;AAySQ,QAAI,OAAO,SAAS,aAAa,GAAG;AAChC,8BAAwB;AAAA,IAC5B,OAAO;AAEH,8BAAwB,mBAAmB;AAAA,IAC/C;AACA,oBAAgB;AAChB,cAAU;AAEV,gBAAY,qBAAqB;AAEjC,QAAI,gBAAgB,CAAC,cAAc;AAC/B,qBAAe;AACf,mDAAW,aAAX;AAAA,IACJ;AAAA,EACJ;AAIA,QAAM,MAAqB;AAAA,IAEvB,WAAW,MAAM;AAAA,IAEjB,kBAAkB,MAAM;AAAA,IAExB,aAAa,MAAe;AAAE,aAAO,WAAW;AAAA,IAAG;AAAA,IAEnD,QAAQ,MAAM;AApUtB;AAqUY,gBAAU;AACV,mDAAW,WAAX;AAAA,IACJ;AAAA,IACA,SAAS,MAAM;AAxUvB;AAyUY,gBAAU;AACV,mDAAW,YAAX;AAAA,IACJ;AAAA,IACA,UAAU,MAAM;AACZ,iBAAW;AAAA,IAEf;AAAA,IACA,UAAU,MAAM;AACZ,iBAAW,IAAI;AAAA,IACnB;AAAA,IAEA,mBAAmB,CAAC,SAAiB;AACjC,UAAI,CAAC,SAAS,IAAI,KAAK,SAAS,GAAG;AAC/B,gBAAQ,KAAK,mDAAmD;AAChE;AAAA,MACJ;AAEA,YAAM,UAAU,mBAAmB;AACnC,qBAAe;AACf,8BAAwB;AACxB,UAAI,QAAS,iBAAgB,KAAK,IAAI;AAAA,IAC1C;AAAA,IAEA,kBAAkB,MAAqB;AAAE,aAAO,mBAAmB;AAAA,IAAG;AAAA,IAEtE,kBAAkB,CAAC,YAAoB;AAEnC,UAAI,UAAU,EAAG,WAAU;AAC3B,UAAI,OAAO,SAAS,aAAa,KAAK,UAAW,cAA0B,WAAU;AAErF,8BAAwB;AACxB,UAAI,QAAS,iBAAgB,KAAK,IAAI;AAEtC,kBAAY,mBAAmB,CAAC;AAAA,IACpC;AAAA,IAEA,WAAW,MAAM;AAAE,UAAI,OAAO;AAAA,IAAG;AAAA,EACrC;AAIA,SAAO;AACX;AAiBO,SAAS,wBACZ,KACA,SACA,WACA,aACa;AAEb,QAAM,SAAS,kBAAkB,GAAG,KAAK,CAAC;AAG1C,MAAI,CAAC,aAAa;AACd,QAAI,IAAI,IAAI;AACR,YAAM,eAAe,YAAY,IAAI,EAAE;AACvC,oBAAc,SAAS,cAAc,YAAY;AACjD,UAAI,CAAC,YAAa,SAAQ,KAAK,iEAAiE,YAAY;AAAA,IAChH,OAAO;AACH,cAAQ,KAAK,mDAAmD;AAAA,IACpE;AAAA,EACJ;AAEA,MAAI,MAAM;AAAA,IACN;AAAA,IACA,WAAW,iBAAiB,WAAW;AAAA,IACvC;AAAA,EACJ;AAEA,QAAM,iCACC,MADD;AAAA,IAEF,kBAAkB,MAAM,eAAe;AAAA,EAC3C;AACA,MAAI,OAAO,QAAS,wBAAuB,KAAK,OAAO,OAAO;AAC9D,SAAO;AACX;AAEO,SAAS,iBAAiB,aAA8B;AAE3D,QAAM,kBAAkB,oBAAI,IAAY;AAExC,QAAM,UAA6B;AAAA,IAC/B,aAAa,MAAM;AACf,UAAI,CAAC,YAAa,QAAO;AACzB,aAAO,YAAY;AAAA,IACvB;AAAA,IACA,cAAc,CAAC,IAAI,UAAU,UAAU;AAEnC,iBAAW,6BAA6B,QAAQ;AAEhD,YAAM,WAAW,YAAY,EAAE;AAG/B,YAAM,YAAW,2CAAa,iBAAiB,cAAa,SAAS,iBAAiB,QAAQ;AAE9F,UAAI,SAAS,WAAW,KAAK,CAAC,gBAAgB,IAAI,QAAQ,GAAG;AACzD,wBAAgB,IAAI,QAAQ;AAC5B,gBAAQ,KAAK,mDAAmD,WAAW,GAAG;AAAA,MAClF;AAEA,eAAS,IAAI,GAAG,IAAI,SAAS,QAAQ,KAAK;AACtC,cAAM,UAAU,SAAS,CAAC;AAC1B,gBAAQ,aAAa,UAAU,KAAK;AACpC,YAAI,iBAAiB,IAAI,QAAQ,GAAG;AAChC,UAAC,QAAwB,MAAM,QAAe,IAAI;AAAA,QACtD;AAAA,MACJ;AAAA,IACJ;AAAA,EACJ;AACA,SAAO;AACX;;;ACvbA,SAAS,yBACL,SACA,gBACA,QACuB;AApB3B;AAqBI,QAAM,SAAS,oBAAI,IAAwB;AAE3C,aAAW,CAAC,UAAU,QAAQ,KAAK,OAAO,QAAQ,OAAO,GAAG;AACxD,UAAM,YAAY,SAAS,OAAO,SAAS,aAAa,CAAC;AACzD,UAAM,eAA2B,CAAC;AAElC,eAAW,MAAM,WAAW;AACxB,UAAI,KAAI,cAAG,MAAH,YAAQ,GAAG,SAAX,YAAmB;AAC3B,UAAI,MAAM,KAAK,OAAO,YAAY,IAAI,GAAG,CAAC;AAC1C,UAAI,SAAQ,QAAG,MAAH,YAAQ,GAAG;AACvB,YAAM,KAAI,QAAG,MAAH,YAAQ,GAAG;AAErB,YAAM,QAAkB;AAAA,QACpB,QAAQ;AAAA,QACR,QAAQ,KAAK,MAAM,QAAQ,CAAC,IAAI,kBAAkB,EAAE,KAAK,GAAG,IAAI,MAAM;AAAA,MAC1E;AAEA,UAAI;AACJ,UAAI,SAAS;AAEb,UAAI,kBAAkB,IAAI,QAAQ,KAAK,MAAM,QAAQ,KAAK,GAAG;AACzD,mBAAW,OAAO,KAAK;AAAA,MAC3B,WAAW,mBAAmB,IAAI,QAAQ,GAAG;AACzC,YAAI,MAAM,QAAQ,KAAK,GAAG;AACtB,cAAI,aAAa,YAAa,SAAQ,MAAM,IAAI,OAAK,IAAI,IAAI;AAC7D,kBAAQ,MAAM,KAAK,GAAG;AAAA,QAC1B;AACA,YAAI,aAAa,SAAU,SAAQ,QAAQ;AAC3C,mBAAW,WAAW,MAAM,QAAQ;AACpC,iBAAS;AAAA,MACb,OAAO;AACH,mBAAW,KAAK;AAAA,MACpB;AAEA,UAAI,CAAC,IAAI,SAAS,QAAQ,QAAQ,EAAG,gBAAe,IAAI,MAAM;AAE9D,eAAS,qBAAqB,MAAM;AACpC,YAAM,MAAM,IAAI;AAChB,mBAAa,KAAK,KAAK;AAAA,IAC3B;AAEA,QAAI,aAAa,SAAS,GAAG;AACzB,aAAO,IAAI,UAAU,YAAY;AAAA,IACrC;AAAA,EACJ;AAEA,SAAO;AACX;AAeO,SAAS,qBACZ,KACA,WACA,aACA,gCACoB;AAEpB,QAAM,SAAS,kBAAkB,GAAG,KAAK,CAAC;AAE1C,QAAM,WAAW,sBAAsB,GAAG;AAG1C,MAAI,CAAC,aAAa;AACd,QAAI,IAAI,IAAI;AACR,YAAM,eAAe,YAAY,IAAI,EAAE;AACvC,oBAAc,SAAS,cAAc,YAAY;AACjD,UAAI,CAAC,YAAa,SAAQ,KAAK,iEAAiE,YAAY;AAAA,IAChH,OAAO;AACH,cAAQ,KAAK,mDAAmD;AAAA,IACpE;AAAA,EACJ;AAEA,QAAM,aAA+B,CAAC;AAEtC,QAAM,cAAc,OAAO;AAC3B,MAAI;AACJ,MAAI,OAAO,gBAAgB,SAAU,cAAa;AAClD,MAAI,gBAAgB,WAAY,cAAa;AAE7C,QAAM,iBAAiB,oBAAI,IAAY;AAKvC,MAAI,EAAC,qCAAU,SAAQ;AACnB,YAAQ,KAAK,qDAAqD;AAAA,EACtE;AAEA,aAAW,WAAW,YAAY,CAAC,GAAG;AAClC,UAAM,UAAU,QAAQ;AACxB,QAAI,CAAC,WAAW,OAAO,YAAY,YAAY,MAAM,QAAQ,OAAO,GAAG;AACnE,cAAQ,KAAK,qDAAqD,OAAO;AACzE;AAAA,IACJ;AAEA,UAAM,WAAW,YAAY,QAAQ,EAAE;AAGvC,UAAM,YAAW,2CAAa,iBAAiB,cAAa,SAAS,iBAAiB,QAAQ;AAE9F,QAAI,SAAS,WAAW,GAAG;AACvB,cAAQ,KAAK,2DAA2D,WAAW,GAAG;AAAA,IAC1F;AAGA,UAAM,eAAe,yBAAyB,SAAS,gBAAgB,MAAM;AAE7E,aAAS,IAAI,GAAG,IAAI,SAAS,QAAQ,KAAK;AACtC,YAAM,UAAU,SAAS,CAAC;AAO1B,YAAM,gBAAgB,OAAO,SAAS,OAAO,QAAQ,IAAI,OAAO,QAAQ;AACxE,YAAM,eAAe,OAAO,SAAS,OAAO,QAAQ,KAAK,OAAO,WACzD,CAAC,OAAO,QAAS,OAAO,WACzB;AAEN,YAAM,gBAAuC;AAAA,QACzC,UAAU,OAAO;AAAA,QACjB,OAAO;AAAA,QACP,MAAM,OAAO;AAAA,QACb,WAAW,OAAO;AAAA,QAClB;AAAA,MACJ;AAEA,iBAAW,CAAC,EAAE,SAAS,KAAK,cAAc;AACtC,YAAI,UAAU,SAAS,GAAG;AACtB,cAAI;AACA,kBAAM,SAAS,IAAI,eAAe,SAAS,WAAW,aAAa;AACnE,kBAAM,OAAO,IAAI,UAAU,QAAQ,SAAS,QAAQ;AAEpD,gBAAI,uCAAW,SAAU,MAAK,WAAW,MAAG;AAvKpE;AAuKuE,qCAAU,aAAV;AAAA;AAC/C,gBAAI,uCAAW,SAAU,MAAK,WAAW,MAAG;AAxKpE;AAwKuE,qCAAU,aAAV;AAAA;AAG/C,gBAAI,cAAc;AACd,mBAAK,cAAc;AAAA,YACvB;AAEA,uBAAW,KAAK,IAAI;AAAA,UACxB,SAAS,GAAG;AACR,oBAAQ,KAAK,CAAC;AAAA,UAClB;AAAA,QACJ;AAAA,MACJ;AAAA,IACJ;AAAA,EACJ;AAIA,MAAI,CAAC,kCAAkC,eAAe,MAAM;AACxD,YAAQ,KAAK,4BAA4B,CAAC,GAAG,cAAc,EAAE,KAAK,IAAI,CAAC;AACvE,WAAO;AAAA,EACX;AAIA,QAAM,MAAqB;AAAA,IAEvB,WAAW,MAAM;AAAA,IAEjB,kBAAkB,MAAM,eAAe;AAAA,IAEvC,aAAa,MAAe;AAvMpC;AAuMsC,eAAO,gBAAW,CAAC,MAAZ,mBAAe,eAAc;AAAA,IAAW;AAAA,IAE7E,QAAQ,MAAM;AAzMtB;AA0MY,iBAAW,QAAQ,OAAK,EAAE,KAAK,CAAC;AAChC,mDAAW,WAAX;AAAA,IACJ;AAAA,IACA,SAAS,MAAM;AA7MvB;AA8MY,iBAAW,QAAQ,OAAK,EAAE,MAAM,CAAC;AACjC,mDAAW,YAAX;AAAA,IACJ;AAAA,IACA,UAAU,MAAM;AAjNxB;AAkNY,iBAAW,QAAQ,OAAK,EAAE,OAAO,CAAC;AAClC,mDAAW,aAAX;AAAA,IACJ;AAAA,IACA,UAAU,MAAM;AACZ,iBAAW,QAAQ,OAAK,EAAE,OAAO,CAAC;AAAA,IACtC;AAAA,IAEA,mBAAmB,CAAC,SAAiB;AACjC,iBAAW,QAAQ,OAAM,EAAE,eAAe,IAAK;AAC/C,aAAO;AAAA,IACX;AAAA,IACA,kBAAkB,MAAqB;AA7N/C;AA8NY,YAAM,OAAM,sBAAW,CAAC,MAAZ,mBAAe,gBAAf,YAA8B;AAC1C,aAAO,QAAQ,OAAO,CAAC,MAAM;AAAA,IACjC;AAAA,IACA,kBAAkB,CAAC,SAAiB;AAChC,iBAAW,QAAQ,OAAK;AACpB,UAAE,cAAc;AAAA,MACpB,CAAC;AAAA,IACL;AAAA,IAEA,WAAW,MAAM;AACb,UAAI,OAAO;AACX,iBAAW,OAAO,GAAG,WAAW,MAAM;AAAA,IAC1C;AAAA,EACJ;AAIA,MAAI,OAAO,SAAS;AAChB,2BAAuB,KAAK,OAAO,OAAO;AAAA,EAC9C;AAEA,SAAO;AACX;;;ACpOA,SAAS,yBACL,KACA,SACA,WACA,aACa;AAEb,QAAM,iBAAiB,kBAAkB,GAAG,KAAK,CAAC;AAElD,MAAI;AACJ,MAAI,eAAe,SAAS,UAAU;AAElC,UAAM,wBAAwB,KAAK,SAAS,WAAW,WAAW;AAAA,EACtE,OAAO;AAEH,UACI;AAAA,MAAqB;AAAA,MAAK;AAAA,MAAW;AAAA,MACjC,eAAe,SAAS;AAAA;AAAA,IAC5B,KACA,wBAAwB,KAAK,SAAS,WAAW,WAAW;AAAA,EAEpE;AAEA,MAAI,eAAe,eAAe;AAC9B,IAAC,OAAe,eAAe,aAAa,IAAI;AAAA,EACpD;AAEA,SAAO;AACX;AAOA,IAAI,aAAa;AACjB,SAAS,mBAA2B;AAChC,QAAM,YAAY,KAAK,IAAI,EAAE,SAAS,EAAE;AACxC,QAAM,WAAW,EAAE,YAAY,SAAS,EAAE;AAC1C,QAAM,SAAS,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,UAAU,GAAG,CAAC;AACxD,SAAO,SAAS,YAAY,UAAU;AAC1C;AAMA,SAAS,UAAa,OAAa;AAC/B,MAAI,UAAU,QAAQ,OAAO,UAAU,SAAU,QAAO;AACxD,MAAI,MAAM,QAAQ,KAAK,EAAG,QAAO,MAAM,IAAI,UAAQ,UAAU,IAAI,CAAC;AAElE,QAAM,MAAM;AAEZ,QAAM,SAAkC,CAAC;AACzC,aAAW,OAAO,OAAO,KAAK,GAAG,GAAG;AAChC,WAAO,GAAG,IAAI,UAAU,IAAI,GAAG,CAAC;AAAA,EACpC;AACA,SAAO;AACX;AAgBO,SAAS,eAAe,KAAmD;AAE9E,QAAM,SAAgC,UAAU,GAAG;AAGnD,QAAM,QAAQ,oBAAI,IAAoB;AAGtC,QAAM,eAAe,oBAAI,IAAI,CAAC,QAAQ,YAAY,CAAC;AAGnD,QAAM,cAAc,oBAAI,IAAI;AAAA,IACxB;AAAA,IAAQ;AAAA,IAAU;AAAA,IAAa;AAAA,IAAY;AAAA,IAC3C;AAAA,IAAU;AAAA,IAAgB;AAAA,IAAc;AAAA,IACxC;AAAA,IAAU;AAAA,IAAe;AAAA,EAC7B,CAAC;AAGD,QAAM,mBAAmB,oBAAI,IAAI,CAAC,UAAU,YAAY,gBAAgB,CAAC;AAGzE,WAAS,WAAW,MAAiB;AACjC,QAAI,CAAC,QAAQ,OAAO,SAAS,SAAU;AAEvC,QAAI,KAAK,MAAM,OAAO,KAAK,OAAO,UAAU;AACxC,YAAM,QAAQ,KAAK;AACnB,YAAM,QAAQ,iBAAiB;AAC/B,YAAM,IAAI,OAAO,KAAK;AACtB,WAAK,KAAK;AAAA,IACd;AAGA,QAAI,MAAM,QAAQ,KAAK,QAAQ,GAAG;AAC9B,iBAAW,SAAS,KAAK,UAAU;AAC/B,mBAAW,KAAK;AAAA,MACpB;AAAA,IACJ;AAAA,EACJ;AAGA,WAAS,WAAW,MAAiB;AACjC,QAAI,CAAC,QAAQ,OAAO,SAAS,SAAU;AAEvC,eAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,IAAI,GAAG;AAC7C,UAAI,QAAQ,YAAY;AACpB,YAAI,MAAM,QAAQ,KAAK,GAAG;AACtB,qBAAW,SAAS,OAAO;AACvB,uBAAW,KAAK;AAAA,UACpB;AAAA,QACJ;AACA;AAAA,MACJ;AAEA,UAAI,OAAO,UAAU,UAAU;AAE3B,YAAI,aAAa,IAAI,GAAG,KAAK,MAAM,WAAW,GAAG,GAAG;AAChD,gBAAM,QAAQ,MAAM,MAAM,CAAC;AAC3B,gBAAM,QAAQ,MAAM,IAAI,KAAK;AAC7B,cAAI,OAAO;AACP,iBAAK,GAAG,IAAI,MAAM;AAAA,UACtB;AAAA,QACJ,WAES,YAAY,IAAI,GAAG,GAAG;AAC3B,eAAK,GAAG,IAAI,eAAe,OAAO,KAAK;AAAA,QAC3C,WAES,iBAAiB,IAAI,GAAG,GAAG;AAChC,gBAAM,QAAQ,MAAM,IAAI,KAAK;AAC7B,cAAI,OAAO;AACP,iBAAK,GAAG,IAAI;AAAA,UAChB;AAAA,QACJ,WAES,MAAM,SAAS,OAAO,GAAG;AAC9B,eAAK,GAAG,IAAI,eAAe,OAAO,KAAK;AAAA,QAC3C;AAAA,MACJ,WAES,QAAQ,WAAW,OAAO,UAAU,YAAY,UAAU,MAAM;AACrE,mBAAW,CAAC,WAAW,UAAU,KAAK,OAAO,QAAQ,KAAK,GAAG;AACzD,cAAI,OAAO,eAAe,UAAU;AAChC,YAAC,MAAc,SAAS,IAAI,eAAe,YAAY,KAAK;AAAA,UAChE;AAAA,QACJ;AAAA,MACJ,WAGS,OAAO,UAAU,YAAY,UAAU,QAAQ,QAAQ,WAAW;AACvE,mBAAW,KAAK;AAAA,MACpB;AAAA,IACJ;AAAA,EACJ;AAEA,aAAW,MAAM;AACjB,aAAW,MAAM;AAGjB,QAAM,cAAc,OAAO;AAC3B,MAAI,MAAM,QAAQ,WAAW,GAAG;AAC5B,eAAW,WAAW,aAAa;AAC/B,UAAI,QAAQ,IAAI;AACZ,cAAM,QAAQ,MAAM,IAAI,QAAQ,EAAE;AAClC,YAAI,OAAO;AACP,kBAAQ,KAAK;AAAA,QACjB;AAAA,MACJ;AAAA,IACJ;AAAA,EACJ;AAEA,SAAO;AACX;AAKA,SAAS,eAAe,OAAe,OAAoC;AACvE,SAAO,MAAM,QAAQ,oBAAoB,CAAC,OAAO,UAAU;AACvD,UAAM,QAAQ,MAAM,IAAI,KAAK;AAC7B,WAAO,QAAQ,UAAU,QAAQ,MAAM;AAAA,EAC3C,CAAC;AACL;AAcO,SAAS,mBACZ,KACA,SACA,WACA,kBACa;AAGb,QAAM,iBAAiB,kBAAkB,GAAG,KAAK,CAAC;AAElD,iBAAe,QAAQ;AAEvB,MAAI,cAA8B;AAGlC,MAAI,oBAAoB,IAAI,UAAU;AAElC,UAAM,eAAe,GAAG;AAExB,UAAM,cAAc,OAAO,qBAAqB,WAC5C,SAAS,cAAc,gBAAgB,IAAI;AAE/C,QAAI,aAAa;AACb,oBAAc,WAAW,GAAG;AAC5B,UAAI,aAAa;AACb,oBAAY,gBAAgB,WAAW;AAAA,MAC3C;AAAA,IACJ;AAAA,EACJ;AAEA,SAAO,yBAAyB,KAAK,SAAS,WAAW,WAAW;AACxE;AAWO,SAAS,eACZ,UACA,SACA,WACA,kBACa;AAEb,MAAI,OAAO,aAAa,UAAU;AAC9B,WAAO,mBAAmB,UAAU,SAAS,WAAW,gBAAgB;AAAA,EAC5E;AAGA,MAAI,WAAiC;AAErC,QAAM,QAAQ,EAAE,KAAK,SAAO,IAAI,KAAK,CAAC,EAAE,KAAK,UAAQ;AACjD,QAAI,sBAAsB,IAAI,GAAG;AAC7B,iBAAW,mBAAmB,MAAM,SAAS,WAAW,gBAAgB;AAAA,IAC5E,OAAO;AACH,cAAQ,MAAM,mCAAmC;AAAA,IACrD;AAAA,EACJ,CAAC;AAGD,SAAO;AAAA,IACH,WAAW,MAAM,CAAC,CAAC;AAAA,IACnB,kBAAkB,MAAM,WAAW,SAAS,eAAe,IAAI;AAAA,IAC/D,aAAa,OAAM,qCAAU,gBAAe;AAAA,IAC5C,QAAQ,MAAM;AAAE,2CAAU;AAAA,IAAQ;AAAA,IAClC,SAAS,MAAM;AAAE,2CAAU;AAAA,IAAS;AAAA,IACpC,UAAU,MAAM;AAAE,2CAAU;AAAA,IAAU;AAAA,IACtC,UAAU,MAAM;AAAE,2CAAU;AAAA,IAAU;AAAA,IACtC,mBAAmB,CAAC,SAAiB;AAAE,2CAAU,gBAAgB;AAAA,IAAO;AAAA,IACxE,kBAAkB,OAAM,qCAAU,qBAAoB;AAAA,IACtD,kBAAkB,CAAC,SAAiB;AAAE,2CAAU,eAAe;AAAA,IAAO;AAAA,IACtE,WAAW,MAAM;AAAE,2CAAU;AAAA,IAAW;AAAA,EAC5C;AACJ;AAMO,SAAS,mBAAmB;AAC/B,QAAM,WAAW,SAAS,iBAAiB,MAAM,wBAAwB,GAAG;AAC5E,WAAS,IAAI,GAAG,IAAI,SAAS,QAAQ,KAAK;AACtC,UAAM,UAAU,SAAS,CAAC;AAC1B,QAAI,CAAE,QAAgB,iBAAiB,GAAG;AACtC,YAAM,MAAM,QAAQ,aAAa,qBAAqB;AACtD,UAAI,KAAK;AACL,QAAC,QAAgB,iBAAiB,IAAI,eAAe,KAAK,QAAW,QAAW,OAAO;AAAA,MAC3F;AAAA,IACJ;AAAA,EACJ;AACJ;AAEA,IAAI,OAAO,WAAW,aAAa;AAC/B,EAAC,OAAe,kBAAkB,IAAI;AACtC,EAAC,OAAe,gBAAgB,IAAI;AACpC,EAAC,OAAe,wBAAwB,IAAI;AAChD;","names":["_a","_b","effectiveProgress"]}
@@ -0,0 +1 @@
1
+ "use strict";var e,t=Object.defineProperty,n=Object.defineProperties,r=Object.getOwnPropertyDescriptor,o=Object.getOwnPropertyDescriptors,i=Object.getOwnPropertyNames,s=Object.getOwnPropertySymbols,a=Object.prototype.hasOwnProperty,l=Object.prototype.propertyIsEnumerable,u=(e,n,r)=>n in e?t(e,n,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[n]=r,c={};function f(e,t,n){return e+(t-e)*n}function d(e,t,n){const r=[],o=Math.max(e.length,t.length);for(let i=0;i<o;i++)r[i]=f(e[i]||0,t[i]||0,n);return r}function p(e,t,n){var r,o,i,s,a,l,u,c,f;if(!e||!t)return e||t||{v:[]};const p=Math.min(Math.max(n,0),1),m=Math.min(e.v.length,t.v.length),h=[],v=[],y=[];for(let n=0;n<m;n++){const f=e.v[n],m=t.v[n];h.push(d(f,m,p));const g=null!=(o=null==(r=e.i)?void 0:r[n])?o:f,b=null!=(s=null==(i=t.i)?void 0:i[n])?s:m;v.push(d(g,b,p));const A=null!=(l=null==(a=e.o)?void 0:a[n])?l:f,w=null!=(c=null==(u=t.o)?void 0:u[n])?c:m;y.push(d(A,w,p))}return{v:h,i:v.length?v:void 0,o:y.length?y:void 0,c:null!=(f=e.c)?f:t.c}}function m(e){const[t,n,r,o]=e,i=3*t,s=3*(r-t)-i,a=1-i-s,l=3*n,u=3*(o-n)-l,c=1-l-u;function f(e){return((a*e+s)*e+i)*e}function d(e){return(3*a*e+2*s)*e+i}return function(e){return t=function(e){if(e<=0)return 0;if(e>=1)return 1;let t=e,n=0,r=1;for(let n=0;n<8;n++){const n=f(t)-e;if(Math.abs(n)<1e-6)return t;const r=d(t);if(Math.abs(r)<1e-6)break;t-=n/r}for(t=e;n<r;){const o=f(t);if(Math.abs(o-e)<1e-6)return t;e>o?n=t:r=t,t=(r+n)/2}return t}(e),((c*t+u)*t+l)*t;var t}}function h(e){const t=Math.round(255*e[0]),n=Math.round(255*e[1]),r=Math.round(255*e[2]);return 4===e.length?"rgba("+t+","+n+","+r+","+e[3]+")":"rgb("+t+","+n+","+r+")"}function v(e){if(e){if(Array.isArray(e))return e;if("string"==typeof e)return e.startsWith("#")?function(e){const t=e.slice(1),n=t.length<=4,r=n?t[0]+t[0]:t.slice(0,2),o=n?t[1]+t[1]:t.slice(2,4),i=n?t[2]+t[2]:t.slice(4,6),s=4===t.length?t[3]+t[3]:8===t.length?t.slice(6,8):null,a=[parseInt(r,16)/255,parseInt(o,16)/255,parseInt(i,16)/255];return null!==s&&a.push(parseInt(s,16)/255),a}(e):e.startsWith("rgb")?function(e){var t;const n=null==(t=e.match(/rgba?\((.*)\)/))?void 0:t[1];if(!n)throw new Error("Invalid rgb/rgba format");const r=n.split(",").map(e=>+e.trim());return[r[0]/255,r[1]/255,r[2]/255,...void 0!==r[3]?[r[3]]:[]]}(e):void console.warn("Unsupported color format: "+e)}}((e,n)=>{for(var r in n)t(e,r,{get:n[r],enumerable:!0})})(c,{COLOUR_ATTR_NAMES:()=>y,PX_ANIM_ATTR_NAME:()=>R,PX_ANIM_SRC_ATTR_NAME:()=>N,STYLE_ATTR_NAMES:()=>A,TRANSFORM_FN_NAMES:()=>g,calcAnimationValues:()=>oe,camelCaseToKebabWordIfNeeded:()=>j,createAnimator:()=>he,createAnimatorImpl:()=>me,createBasicFrameLoopAnimator:()=>se,createFrameLoopAnimator:()=>ae,createWebApiAnimator:()=>ue,generateNewIds:()=>de,getAnimatorConfig:()=>B,getBindings:()=>Z,getChildren:()=>X,getDefs:()=>K,getNormalizedProps:()=>M,isPxElementFileFormat:()=>P,isPxElementFileFormatDeep:()=>V,loadTagAnimators:()=>ve,normalizeDocument:()=>ne,renderNode:()=>C,setupAnimationTriggers:()=>T,toRGBA:()=>h}),module.exports=(e=c,((e,n,o,s)=>{if(n&&"object"==typeof n||"function"==typeof n)for(let l of i(n))a.call(e,l)||l===o||t(e,l,{get:()=>n[l],enumerable:!(s=r(n,l))||s.enumerable});return e})(t({},"__esModule",{value:!0}),e));var y=new Set(["color","fill","flood-color","lighting-color","stop-color","stroke"]),g=new Set(["translate","rotate","scale","skew"]),b=new Set(["offset-distance","offsetDistance"]),A=new Set(["offset-distance","offsetDistance"]),w=1e3;function x(e){return e.includes("-")?e.replace(/-([a-z])/g,(e,t)=>t.toUpperCase()):e}var k=new Set(["viewBox","preserveAspectRatio","gradientUnits","gradientTransform","spreadMethod","patternUnits","patternContentUnits","patternTransform","clipPathUnits","maskUnits","maskContentUnits","textLength","lengthAdjust","startOffset","filterUnits","primitiveUnits","stdDeviation","baseFrequency","numOctaves","surfaceScale","diffuseConstant","specularConstant","specularExponent","kernelMatrix","kernelUnitLength","edgeMode","preserveAlpha","targetX","targetY"]);function j(e){return k.has(e)?e:e.replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase()}function O(e,t,n){return Math.max(t,Math.min(e,n))}var S="http://www.w3.org/2000/svg",E=new Set(["type","children","animate","style","animator","defs","bindings"]);function M(e){const t={};for(const n of Object.keys(e)){if(E.has(n))continue;let r=e[n];y.has(n)&&Array.isArray(r)?t[n]=h(r):g.has(n)?(Array.isArray(r)&&("translate"===n&&(r=r.map(e=>e+"px")),r=r.join(",")),"rotate"===n&&(r+="deg"),t.transform=n+"("+r+")"):null!=r&&(t[n]=String(r))}return t}function C(e,t){if(!e)return null;const n=e,{type:r,children:o,animate:i,style:u}=n,c=((e,t)=>{var n={};for(var r in e)a.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&s)for(var r of s(e))t.indexOf(r)<0&&l.call(e,r)&&(n[r]=e[r]);return n})(n,["type","children","animate","style"]),f=e.defs||t,d=function(e,t){var n;if(e)return"string"==typeof e?null==(n=null==t?void 0:t.styles)?void 0:n[e]:e}(u,f);let p;if(o)for(const e of o){const t=C(e,f);t&&(p||(p=[]),p.push(t))}return function(e,t,n,r){const o=document.createElementNS(S,e);for(const e in t)o.setAttribute(j(e),t[e]);if(n)for(const e in n)o.style[e]=String(n[e]);if(r)for(const e of r)o.appendChild(e);return o}(r||"g",M(c),d,p)}function T(e,t){const{startOn:n,outAction:r="continue",scrollIntoViewThreshold:o=.5}=t,i=e.getRootElement();if(!i)return console.warn("setupAnimationTriggers: No root element found for animation."),e;const s=()=>{e.play()},a=()=>{switch(r){case"pause":e.pause();break;case"reset":e.cancel();break;case"reverse":e.play()}};switch(n){case"load":{const e=()=>s();"complete"===document.readyState?e():window.addEventListener("load",e,{once:!0});break}case"mouseOver":{const e=()=>s(),t=()=>a();i.addEventListener("mouseenter",e),i.addEventListener("mouseleave",t);break}case"click":{const t=()=>{e.isPlaying()?a():s()};i.addEventListener("click",t);break}case"scrollIntoView":new IntersectionObserver(e=>{e.forEach(e=>{e.isIntersecting&&e.intersectionRatio>=o?s():a()})},{threshold:o}).observe(i);break}return e}var N="data-px-animation-src",R="_px_animator";function P(e){return!(!e||"object"!=typeof e||Array.isArray(e))&&("svg"===e.type||"svg"===e.tagName)}function F(e){return e&&"object"==typeof e&&!Array.isArray(e)}function I(e,t,n){return"string"==typeof e||(!(!Array.isArray(e)||4!==e.length||!e.every(e=>"number"==typeof e))||(n.push(t+": invalid easing, expected string or [number, number, number, number]"),!1))}function _(e,t,n){if(!F(e))return n.push(t+": expected object"),!1;let r=!0;return void 0!==e.time&&"number"!=typeof e.time&&(n.push(t+".time: expected number, got "+typeof e.time),r=!1),void 0!==e.t&&"number"!=typeof e.t&&(n.push(t+".t: expected number, got "+typeof e.t),r=!1),void 0===e.easing||I(e.easing,t+".easing",n)||(r=!1),void 0===e.e||I(e.e,t+".e",n)||(r=!1),r}function L(e,t,n){if(!F(e))return n.push(t+": expected object"),!1;let r=!0;return void 0!==e.keyframes&&(Array.isArray(e.keyframes)?e.keyframes.forEach((e,o)=>{_(e,t+".keyframes["+o+"]",n)||(r=!1)}):(n.push(t+".keyframes: expected array"),r=!1)),void 0!==e.kfs&&(Array.isArray(e.kfs)?e.kfs.forEach((e,o)=>{_(e,t+".kfs["+o+"]",n)||(r=!1)}):(n.push(t+".kfs: expected array"),r=!1)),r}function D(e,t,n){if(!F(e))return n.push(t+": expected object"),!1;let r=!0;for(const o of Object.keys(e))L(e[o],t+"."+o,n)||(r=!1);return r}function U(e,t,n){if("string"==typeof e)return!0;if(Array.isArray(e)){let r=!0;return e.forEach((e,o)=>{"string"==typeof e||D(e,t+"["+o+"]",n)||(r=!1)}),r}return F(e)?D(e,t,n):(n.push(t+": expected string, array, or PxAnimationDefinition object"),!1)}function z(e,t,n){if(!F(e))return n.push(t+": expected object"),!1;let r=!0;return void 0===e.mode||["auto","webapi","frames"].includes(e.mode)||(n.push(t+'.mode: invalid value "'+e.mode+"\", expected 'auto'|'webapi'|'frames'"),r=!1),void 0!==e.duration&&"number"!=typeof e.duration&&(n.push(t+".duration: expected number, got "+typeof e.duration),r=!1),void 0!==e.delay&&"number"!=typeof e.delay&&(n.push(t+".delay: expected number, got "+typeof e.delay),r=!1),void 0!==e.iterations&&"number"!=typeof e.iterations&&"infinite"!==e.iterations&&(n.push(t+".iterations: expected number or 'infinite', got "+typeof e.iterations),r=!1),void 0===e.fill||function(e,t,n){return"forwards"===e||"backwards"===e||"both"===e||"none"===e||(n.push(t+': invalid FillMode "'+e+"\", expected 'forwards'|'backwards'|'both'|'none'"),!1)}(e.fill,t+".fill",n)||(r=!1),void 0===e.direction||function(e,t,n){return"normal"===e||"reverse"===e||"alternate"===e||"alternate-reverse"===e||(n.push(t+': invalid PlaybackDirection "'+e+"\", expected 'normal'|'reverse'|'alternate'|'alternate-reverse'"),!1)}(e.direction,t+".direction",n)||(r=!1),void 0!==e.frameRate&&"number"!=typeof e.frameRate&&(n.push(t+".frameRate: expected number, got "+typeof e.frameRate),r=!1),void 0===e.trigger||function(e,t,n){if(!F(e))return n.push(t+": expected object"),!1;let r=!0;const o=["load","mouseOver","click","scrollIntoView","programmatic"];if(o.includes(e.startOn)||(n.push(t+'.startOn: invalid value "'+e.startOn+'", expected '+o.join("|")),r=!1),void 0!==e.outAction){const o=["continue","pause","reset","reverse"];o.includes(e.outAction)||(n.push(t+'.outAction: invalid value "'+e.outAction+'", expected '+o.join("|")),r=!1)}return void 0!==e.scrollIntoViewThreshold&&"number"!=typeof e.scrollIntoViewThreshold&&(n.push(t+".scrollIntoViewThreshold: expected number, got "+typeof e.scrollIntoViewThreshold),r=!1),r}(e.trigger,t+".trigger",n)||(r=!1),r}function q(e,t,n){if(!F(e))return n.push(t+": expected object"),!1;let r=!0;return"string"!=typeof e.type&&(n.push(t+".type: expected string, got "+typeof e.type),r=!1),void 0!==e.children&&(Array.isArray(e.children)?e.children.forEach((e,o)=>{q(e,t+".children["+o+"]",n)||(r=!1)}):(n.push(t+".children: expected array"),r=!1)),void 0===e.animate||U(e.animate,t+".animate",n)||(r=!1),r}function W(e,t,n){if(!q(e,t,n))return!1;let r=!0;return"svg"!==e.type&&(n.push(t+".type: expected 'svg', got '"+e.type+"'"),r=!1),void 0!==e.width&&"number"!=typeof e.width&&(n.push(t+".width: expected number, got "+typeof e.width),r=!1),void 0!==e.height&&"number"!=typeof e.height&&(n.push(t+".height: expected number, got "+typeof e.height),r=!1),void 0!==e.viewBox&&"string"!=typeof e.viewBox&&(n.push(t+".viewBox: expected string, got "+typeof e.viewBox),r=!1),void 0===e.animator||z(e.animator,t+".animator",n)||(r=!1),void 0===e.defs||function(e,t,n){if(!F(e))return n.push(t+": expected object"),!1;let r=!0;if(void 0!==e.easings)if(F(e.easings))for(const o of Object.keys(e.easings))I(e.easings[o],t+".easings."+o,n)||(r=!1);else n.push(t+".easings: expected object"),r=!1;if(void 0!==e.animations)if(F(e.animations))for(const o of Object.keys(e.animations))D(e.animations[o],t+".animations."+o,n)||(r=!1);else n.push(t+".animations: expected object"),r=!1;return void 0===e.styles||F(e.styles)||(n.push(t+".styles: expected object"),r=!1),r}(e.defs,t+".defs",n)||(r=!1),void 0!==e.bindings&&(Array.isArray(e.bindings)?e.bindings.forEach((e,o)=>{(function(e,t,n){if(!F(e))return n.push(t+": expected object"),!1;let r=!0;return"string"!=typeof e.id&&(n.push(t+".id: expected string, got "+typeof e.id),r=!1),U(e.animate,t+".animate",n)||(r=!1),r})(e,t+".bindings["+o+"]",n)||(r=!1)}):(n.push(t+".bindings: expected array"),r=!1)),void 0===e.design||q(e.design,t+".design",n)||(r=!1),r}function V(e){const t=[];return{valid:W(e,"root",t),errors:t}}function B(e){var t,n;return(null==e?void 0:e.animator)||(null==(t=null==e?void 0:e.meta)?void 0:t.animator)||(null==e?void 0:e.animation)||(null==(n=null==e?void 0:e.meta)?void 0:n.animation)}function K(e){var t;if(e)return e.defs||(null==(t=e.meta)?void 0:t.defs)}function Z(e){var t;if(e)return e.bindings||(null==(t=e.meta)?void 0:t.bindings)}function X(e){return null==e?void 0:e.children}function Y(e){const t=[];let n;const r=function(e){const t=e.split(/([MLCZmlcz]|[\s,]+)/).map(e=>e.trim()).filter(e=>e&&","!==e),n=[];let r=null;for(const e of t)if(/[MLCZmlcz]/.test(e))r={type:e,values:[]},n.push(r);else if(r){const t=+e;r.values.push(Number.isNaN(t)?0:t)}return n}(e);for(const e of r){const r=e.type,o=e.values;if("M"===r||"m"===r){const e=o[0]||0,r=o[1]||0;n={v:[[e,r]],i:[[e,r]],o:[[e,r]],c:!1},t.push(n);continue}if(n||(n={v:[[0,0]],i:[[0,0]],o:[[0,0]],c:!1},t.push(n)),"L"===r){const e=o[0]||0,t=o[1]||0;n.v.push([e,t]),n.i.push([e,t]),n.o.push([e,t])}else if("C"===r){const e=o[0]||0,t=o[1]||0,r=o[2]||0,i=o[3]||0,s=o[4]||0,a=o[5]||0;n.o[n.o.length-1]=[e,t],n.v.push([s,a]),n.i.push([r,i]),n.o.push([s,a])}else"Z"!==r&&"z"!==r||(n.c=!0)}return t}function $(e){return e.startsWith("path(")&&e.endsWith(")")?e.slice(5,-1):/^[MmZzLlHhVvCcSsQqTtAa]/.test(e)?e:void 0}function G(e){return"string"==typeof e&&void 0!==$(e)}function H(e){if(e&&"object"==typeof e&&"paths"in e){const t=e.paths;if(Array.isArray(t)&&t.length>0&&G(t[0])){const e=[];for(const n of t){const t=$(n);t&&e.push(...Y(t))}return{paths:e}}return e}if(Array.isArray(e)){if(e.length>0&&G(e[0])){const t=[];for(const n of e){const e=$(n);e&&t.push(...Y(e))}return{paths:t}}return{paths:e}}if(G(e)){return{paths:Y($(e))}}return e}function Q(e,t){var n;if(e)return Array.isArray(e)?e:(null==(n=null==t?void 0:t.easings)?void 0:n[e])?t.easings[e]:void console.warn("Unknown easing name: "+e)}function J(e,t){var n;if("string"==typeof e){const r=null==(n=null==t?void 0:t.animations)?void 0:n[e];return r||console.warn("Unknown animation name: "+e),r}return e}function ee(e,t,n,r){var o,i,s,a,l;const u=t.keyframes||t.kfs||[],c=[];for(const t of u){const n=null!=(i=null!=(o=t.time)?o:t.t)?i:0;let u=null!=(s=t.value)?s:t.v;const f=null!=(a=t.easing)?a:t.e;"d"===e&&(u=H(u)),y.has(e)&&(u=null!=(l=v(u))?l:u),c.push({t:n,v:u,e:Q(f,r)})}return c.sort((e,t)=>{var n,r;return(null!=(n=e.t)?n:0)-(null!=(r=t.t)?r:0)}),c}var te=0;function ne(e){const t=B(e)||{},n=K(e),r=(t.duration,[]),o=(e,t)=>{if(!t)return null;const r=function(e,t){if(!e)return[];const n=[];if("string"==typeof e){const r=J(e,t);r&&n.push(r)}else if(Array.isArray(e))for(const r of e){const e=J(r,t);e&&n.push(e)}else n.push(e);return n}(t,n);if(0===r.length)return null;const o=function(e,t,n){const r={};for(const[t,o]of Object.entries(e)){const e=ee(t,o,0,n);e.length>0&&(r[t]={kfs:e})}return r}(function(e){const t={};for(const n of e)for(const[e,r]of Object.entries(n))t[e]=r;return t}(r),0,n);return 0===Object.keys(o).length?null:{id:e,animate:o}},i=Z(e);if(i)for(const e of i){const t=o(e.id,e.animate);t&&r.push(t)}const s=e=>{if(e.animate){const t=e.id||"_px_el_"+ ++te;e.id=t;const n=o(t,e.animate);n&&r.push(n)}if(e.children)for(let t=0;t<e.children.length;t++)s(e.children[t])};if(e.children)for(let t=0;t<e.children.length;t++)s(e.children[t]);return r}function re(e,t,n){var r,o,i,s,a,l,u;const c=t.kfs||t.keyframes||[];if(0===c.length)return null;const{prevKf:v,nextKf:g}=function(e,t){var n,r;let o=e[0],i=e[e.length-1];for(let s=0;s<e.length-1;s++){const a=null!=(n=e[s].t)?n:0,l=null!=(r=e[s+1].t)?r:0;if(a<=t&&t<=l){o=e[s],i=e[s+1];break}}return{prevKf:o,nextKf:i}}(c,n);let A=v===g?0:(w=n,x=null!=(r=v.t)?r:0,k=null!=(o=g.t)?o:0,S=0,E=1,k===x?S:S+(w-x)/(k-x)*(E-S));var w,x,k,S,E;A=O(A,0,1);const M=null!=(i=v.e)?i:v.easing;if(M&&Array.isArray(M))try{A=m(M)(A)}catch(e){}let C=!(T=e).includes("-")&&/[a-z][A-Z]/.test(T)?j(e):e;var T;let N=null;const R=null!=(s=null==v?void 0:v.v)?s:null==v?void 0:v.value,P=null!=(a=null==g?void 0:g.v)?a:null==g?void 0:g.value;if("d"===C){N=function(e,t,n){const r=Math.max(e.length,t.length),o=[];for(let i=0;i<r;i++)o.push(p(e[i],t[i],n));return o}(null!=(l=null==R?void 0:R.paths)?l:Array.isArray(R)?R:[],null!=(u=null==P?void 0:P.paths)?u:Array.isArray(P)?P:[],A).map(e=>function(e){var t,n,r,o;const i=e.v,s=e.i,a=e.o,l=e.c;if(!i.length)return"";const u=[],c=i.length;u.push("M"+i[0][0]+","+i[0][1]);for(let e=1;e<c;e++){const r=i[e-1],o=null!=(t=null==a?void 0:a[e-1])?t:r,l=null!=(n=null==s?void 0:s[e])?n:i[e],c=i[e];o[0]===r[0]&&o[1]===r[1]&&l[0]===c[0]&&l[1]===c[1]?u.push("L"+c[0]+","+c[1]):u.push("C"+o[0]+","+o[1]+","+l[0]+","+l[1]+","+c[0]+","+c[1])}if(l&&c>0){const e=i[c-1],t=null!=(r=null==a?void 0:a[c-1])?r:e,n=null!=(o=null==s?void 0:s[0])?o:i[0],l=i[0];t[0]===e[0]&&t[1]===e[1]&&n[0]===l[0]&&n[1]===l[1]||u.push("C"+t[0]+","+t[1]+","+n[0]+","+n[1]+","+l[0]+","+l[1]),u.push("z")}return u.join("")}(e)).join("")}else if(y.has(C))N=h((I=P||[0,0,0,1],_=A,[f((F=R||[0,0,0,1])[0]||0,I[0]||0,_),f(F[1]||0,I[1]||0,_),f(F[2]||0,I[2]||0,_),f(void 0===F[3]?1:F[3],void 0===I[3]?1:I[3],_)])),C=e;else if("stroke-dasharray"===C)N=d(R||[],P||[],A).join(" "),C=e;else if("translate"===C){N="translate("+d(R||[0,0],P||[0,0],A).join(",")+")",C="transform"}else if("rotate"===C){N="rotate("+f(+(R||0),+(P||0),A)+")",C="transform"}else if("scale"===C){N="scale("+d(R||[1,1],P||[1,1],A).join(",")+")",C="transform"}else{N=f(+(R||0),+(P||0),A)}var F,I,_;return b.has(C)&&"number"==typeof N&&(N=100*N+"%"),{k:C,v:null===N?"":""+N}}function oe(e,t){const n={};for(const[r,o]of Object.entries(e)){const e=re(r,o,t);e&&(n[e.k]=e.v)}return n}function ie(e){return"#"+e}function se(e,t,n){const r=B(e)||{},o=ne(e),i=r.iterations;let s=1;"number"==typeof i&&(s=i||1),"infinite"===i&&(s=1/0),s<1&&(s=1);const a=+(r.duration||w),l=a&&s?a*(s===1/0?1/0:s):a?(null!=s?s:1)*a:0,u=r.direction||"normal";let c=null,f=!1,d=r.delay||0,p=0,m=1,h=!1;const v=r.frameRate,y=v&&v>0?1e3/v:0;let g=0;const b=()=>{const e=p?(Date.now()-p)*m:0;let t=d+e;return Number.isFinite(l)&&t>l&&(t=l),t<0&&(t=0),t};function A(e){let n=function(){const t=a>0?a:1;let n=0,r=0;if(a>0){e=O(e,0,s*t),r=Math.max(0,Math.ceil(e/t)-1),r=Math.min(r,s-1);n=O((e-r*t)/t,0,1)}else n=e;const o=u||"normal";let i=n;return"reverse"===o?i=1-n:"alternate"===o?r%2==1&&(i=1-n):"alternate-reverse"===o&&r%2==0&&(i=1-n),i}();for(const e of o||[]){const r=e.animate;if(!r||"object"!=typeof r||Array.isArray(r)){console.warn("Empty or unresolved binding",e);continue}const o=oe(r,n*a);for(const[n,r]of Object.entries(o))t.setAttribute(e.id,n,r)}}r.delay&&A(b());const x=()=>!!f&&(!!t.isConnected()&&!(Number.isFinite(l)&&b()>=l)),k=e=>{null!==c&&(cancelAnimationFrame(c),c=null),(e||x())&&(c=requestAnimationFrame(()=>{c=null,(()=>{var e;if(!t.isConnected())return void j();const r=b();if(y>0){const e=Date.now();if(g&&e-g<y)return;g=e}if(l&&Number.isFinite(l)&&r>=l)return A(l),h||(h=!0,null==(e=null==n?void 0:n.onFinish)||e.call(n)),void j();A(r)})(),k()}))},j=()=>{f&&(d=b(),p=0,f=!1,null!==c&&(cancelAnimationFrame(c),c=null),A(d))},S={isReady:()=>!0,getRootElement:()=>null,isPlaying:()=>x(),play:()=>{var e;f||(f=!0,p=Date.now(),k(!0)),null==(e=null==n?void 0:n.onPlay)||e.call(n)},pause:()=>{var e;j(),null==(e=null==n?void 0:n.onPause)||e.call(n)},cancel:()=>{var e;j(),d=0,p=0,f=!1,h=!1,A(d),null==(e=null==n?void 0:n.onCancel)||e.call(n)},finish:()=>{((e=!0)=>{var t;d=Number.isFinite(l)?l:b(),p=0,f=!1,A(d),e&&!h&&(h=!0,null==(t=null==n?void 0:n.onFinish)||t.call(n))})(!0)},setPlaybackRate:e=>{if(!isFinite(e)||0===e)return void console.warn("setPlaybackRate: rate must be finite and non-zero");const t=b();m=e,d=t,f&&(p=Date.now())},getCurrentTime:()=>b(),setCurrentTime:e=>{e<0&&(e=0),Number.isFinite(l)&&e>l&&(e=l),d=e,f&&(p=Date.now()),A(b())},destroy:()=>{S.cancel()}};return S}function ae(e,t,r,i){const c=B(e)||{};if(!i)if(e.id){const t=ie(e.id);(i=document.querySelector(t))||console.warn("createFrameLoopAnimator: No root element found for selector: ",t)}else console.warn("createFrameLoopAnimator: No root element provided");let f=se(e,t||function(e){const t=new Set,n={isConnected:()=>!e||e.isConnected,setAttribute:(n,r,o)=>{r=j(r);const i=ie(n),s=(null==e?void 0:e.querySelectorAll(i))||document.querySelectorAll(i);0!==s.length||t.has(i)||(t.add(i),console.warn('setAttribute: No elements found for selector "'+i+'"'));for(let e=0;e<s.length;e++){const t=s[e];t.setAttribute(r,o),A.has(r)&&(t.style[r]=o)}}};return n}(i),r);var d;return d=((e,t)=>{for(var n in t||(t={}))a.call(t,n)&&u(e,n,t[n]);if(s)for(var n of s(t))l.call(t,n)&&u(e,n,t[n]);return e})({},f),f=n(d,o({getRootElement:()=>i||null})),c.trigger&&T(f,c.trigger),f}function le(e,t,n){var r,o,i,s;const a=new Map;for(const[l,u]of Object.entries(e)){const e=u.kfs||u.keyframes||[],c=[];for(const a of e){let e=null!=(o=null!=(r=a.t)?r:a.time)?o:0;e=O(e/(n.duration||1),0,1);let u=null!=(i=a.v)?i:a.value;const f=null!=(s=a.e)?s:a.easing,d={offset:e,easing:f&&Array.isArray(f)?"cubic-bezier("+f.join(",")+")":void 0};let p,m=l;y.has(l)&&Array.isArray(u)?p=h(u):g.has(l)?(Array.isArray(u)&&("translate"===l&&(u=u.map(e=>e+"px")),u=u.join(",")),"rotate"===l&&(u+="deg"),p=l+"("+u+")",m="transform"):p=""+u,CSS.supports(m,p)||t.add(m),m=x(m),d[m]=p,c.push(d)}c.length>0&&a.set(l,c)}return a}function ue(e,t,n,r){const o=B(e)||{},i=ne(e);if(!n)if(e.id){const t=ie(e.id);(n=document.querySelector(t))||console.warn("createFrameLoopAnimator: No root element found for selector: ",t)}else console.warn("createFrameLoopAnimator: No root element provided");const s=[],a=o.iterations;let l;"number"==typeof a&&(l=a),"infinite"===a&&(l=1/0);const u=new Set;(null==i?void 0:i.length)||console.warn("createWebApiAnimator: No animation bindings defined");for(const e of i||[]){const r=e.animate;if(!r||"object"!=typeof r||Array.isArray(r)){console.warn("createWebApiAnimator: Empty or unresolved binding",e);continue}const i=ie(e.id),a=(null==n?void 0:n.querySelectorAll(i))||document.querySelectorAll(i);0===a.length&&console.warn('createWebApiAnimator: No elements found for selector "'+i+'"');const c=le(r,u,o);for(let e=0;e<a.length;e++){const n=a[e],r=o.delay&&o.delay>0?o.delay:void 0,i=o.delay&&o.delay<0&&o.duration?-o.delay%o.duration:void 0,u={duration:o.duration,delay:r,fill:o.fill,direction:o.direction,iterations:l};for(const[,e]of c)if(e.length>0)try{const r=new KeyframeEffect(n,e,u),o=new Animation(r,document.timeline);(null==t?void 0:t.onFinish)&&(o.onfinish=()=>{var e;return null==(e=t.onFinish)?void 0:e.call(t)}),(null==t?void 0:t.onRemove)&&(o.onremove=()=>{var e;return null==(e=t.onRemove)?void 0:e.call(t)}),i&&(o.currentTime=i),s.push(o)}catch(e){console.warn(e)}}}if(!r&&u.size)return console.warn("Unsupported CSS attrs: "+[...u].join(", ")),null;const c={isReady:()=>!0,getRootElement:()=>n||null,isPlaying:()=>{var e;return"running"===(null==(e=s[0])?void 0:e.playState)},play:()=>{var e;s.forEach(e=>e.play()),null==(e=null==t?void 0:t.onPlay)||e.call(t)},pause:()=>{var e;s.forEach(e=>e.pause()),null==(e=null==t?void 0:t.onPause)||e.call(t)},cancel:()=>{var e;s.forEach(e=>e.cancel()),null==(e=null==t?void 0:t.onCancel)||e.call(t)},finish:()=>{s.forEach(e=>e.finish())},setPlaybackRate:e=>(s.forEach(t=>t.playbackRate=e),c),getCurrentTime:()=>{var e,t;const n=null!=(t=null==(e=s[0])?void 0:e.currentTime)?t:null;return null!==n?+n:null},setCurrentTime:e=>{s.forEach(t=>{t.currentTime=e})},destroy:()=>{c.cancel(),s.splice(0,s.length)}};return o.trigger&&T(c,o.trigger),c}var ce=0;function fe(e){if(null===e||"object"!=typeof e)return e;if(Array.isArray(e))return e.map(e=>fe(e));const t=e,n={};for(const e of Object.keys(t))n[e]=fe(t[e]);return n}function de(e){const t=fe(e),n=new Map,r=new Set(["href","xlink:href"]),o=new Set(["fill","stroke","clip-path","clipPath","mask","marker","marker-start","marker-mid","marker-end","filter","flood-color","lighting-color"]),i=new Set(["baseId","targetId","boundElementId"]);!function e(t){if(t&&"object"==typeof t){if(t.id&&"string"==typeof t.id){const e=t.id,r="_px_"+Date.now().toString(36)+(++ce).toString(36)+Math.random().toString(36).substring(2,6);n.set(e,r),t.id=r}if(Array.isArray(t.children))for(const n of t.children)e(n)}}(t),function e(t){if(t&&"object"==typeof t)for(const[s,a]of Object.entries(t))if("children"!==s)if("string"==typeof a)if(r.has(s)&&a.startsWith("#")){const e=a.slice(1),r=n.get(e);r&&(t[s]="#"+r)}else if(o.has(s))t[s]=pe(a,n);else if(i.has(s)){const e=n.get(a);e&&(t[s]=e)}else a.includes("url(#")&&(t[s]=pe(a,n));else if("style"===s&&"object"==typeof a&&null!==a)for(const[e,t]of Object.entries(a))"string"==typeof t&&(a[e]=pe(t,n));else"object"==typeof a&&null!==a&&"animate"!==s&&e(a);else if(Array.isArray(a))for(const t of a)e(t)}(t);const s=t.bindings;if(Array.isArray(s))for(const e of s)if(e.id){const t=n.get(e.id);t&&(e.id=t)}return t}function pe(e,t){return e.replace(/url\(#([^)]+)\)/g,(e,n)=>{const r=t.get(n);return r?"url(#"+r+")":e})}function me(e,t,n,r){(B(e)||{}).debug=!0;let o=null;if(r&&e.children){e=de(e);const t="string"==typeof r?document.querySelector(r):r;t&&(o=C(e),o&&t.replaceChildren(o))}return function(e,t,n,r){const o=B(e)||{};let i;return i="frames"===o.mode?ae(e,t,n,r):ue(e,n,r,"webapi"===o.mode)||ae(e,t,n,r),o.debugInstName&&(window[o.debugInstName]=i),i}(e,t,n,o)}function he(e,t,n,r){if("object"==typeof e)return me(e,t,n,r);let o=null;return fetch(e).then(e=>e.json()).then(e=>{P(e)?o=me(e,t,n,r):console.error("Invalid animation document format")}),{isReady:()=>!!o,getRootElement:()=>o?o.getRootElement():null,isPlaying:()=>(null==o?void 0:o.isPlaying())||!1,play:()=>{null==o||o.play()},pause:()=>{null==o||o.pause()},cancel:()=>{null==o||o.cancel()},finish:()=>{null==o||o.finish()},setPlaybackRate:e=>{null==o||o.setPlaybackRate(e)},getCurrentTime:()=>(null==o?void 0:o.getCurrentTime())||0,setCurrentTime:e=>{null==o||o.setCurrentTime(e)},destroy:()=>{null==o||o.destroy()}}}function ve(){const e=document.querySelectorAll("["+N+"]");for(let t=0;t<e.length;t++){const n=e[t];if(!n[R]){const e=n.getAttribute(N);e&&(n[R]=he(e,void 0,void 0,n))}}}"undefined"!=typeof window&&(window.loadTagAnimators=ve,window.createAnimator=he,window.setupAnimationTriggers=T);
@@ -0,0 +1 @@
1
+ var e=Object.defineProperty,t=Object.defineProperties,n=Object.getOwnPropertyDescriptors,r=Object.getOwnPropertySymbols,o=Object.prototype.hasOwnProperty,i=Object.prototype.propertyIsEnumerable,s=(t,n,r)=>n in t?e(t,n,{enumerable:!0,configurable:!0,writable:!0,value:r}):t[n]=r;function l(e,t,n){return e+(t-e)*n}function a(e,t,n){const r=[],o=Math.max(e.length,t.length);for(let i=0;i<o;i++)r[i]=l(e[i]||0,t[i]||0,n);return r}function u(e,t,n){var r,o,i,s,l,u,c,f,d;if(!e||!t)return e||t||{v:[]};const p=Math.min(Math.max(n,0),1),h=Math.min(e.v.length,t.v.length),m=[],v=[],y=[];for(let n=0;n<h;n++){const d=e.v[n],h=t.v[n];m.push(a(d,h,p));const g=null!=(o=null==(r=e.i)?void 0:r[n])?o:d,b=null!=(s=null==(i=t.i)?void 0:i[n])?s:h;v.push(a(g,b,p));const A=null!=(u=null==(l=e.o)?void 0:l[n])?u:d,w=null!=(f=null==(c=t.o)?void 0:c[n])?f:h;y.push(a(A,w,p))}return{v:m,i:v.length?v:void 0,o:y.length?y:void 0,c:null!=(d=e.c)?d:t.c}}function c(e){const[t,n,r,o]=e,i=3*t,s=3*(r-t)-i,l=1-i-s,a=3*n,u=3*(o-n)-a,c=1-a-u;function f(e){return((l*e+s)*e+i)*e}function d(e){return(3*l*e+2*s)*e+i}return function(e){return t=function(e){if(e<=0)return 0;if(e>=1)return 1;let t=e,n=0,r=1;for(let n=0;n<8;n++){const n=f(t)-e;if(Math.abs(n)<1e-6)return t;const r=d(t);if(Math.abs(r)<1e-6)break;t-=n/r}for(t=e;n<r;){const o=f(t);if(Math.abs(o-e)<1e-6)return t;e>o?n=t:r=t,t=(r+n)/2}return t}(e),((c*t+u)*t+a)*t;var t}}function f(e){const t=Math.round(255*e[0]),n=Math.round(255*e[1]),r=Math.round(255*e[2]);return 4===e.length?"rgba("+t+","+n+","+r+","+e[3]+")":"rgb("+t+","+n+","+r+")"}function d(e){if(e){if(Array.isArray(e))return e;if("string"==typeof e)return e.startsWith("#")?function(e){const t=e.slice(1),n=t.length<=4,r=n?t[0]+t[0]:t.slice(0,2),o=n?t[1]+t[1]:t.slice(2,4),i=n?t[2]+t[2]:t.slice(4,6),s=4===t.length?t[3]+t[3]:8===t.length?t.slice(6,8):null,l=[parseInt(r,16)/255,parseInt(o,16)/255,parseInt(i,16)/255];return null!==s&&l.push(parseInt(s,16)/255),l}(e):e.startsWith("rgb")?function(e){var t;const n=null==(t=e.match(/rgba?\((.*)\)/))?void 0:t[1];if(!n)throw new Error("Invalid rgb/rgba format");const r=n.split(",").map(e=>+e.trim());return[r[0]/255,r[1]/255,r[2]/255,...void 0!==r[3]?[r[3]]:[]]}(e):void console.warn("Unsupported color format: "+e)}}var p=new Set(["color","fill","flood-color","lighting-color","stop-color","stroke"]),h=new Set(["translate","rotate","scale","skew"]),m=new Set(["offset-distance","offsetDistance"]),v=new Set(["offset-distance","offsetDistance"]);function y(e){return e.includes("-")?e.replace(/-([a-z])/g,(e,t)=>t.toUpperCase()):e}var g=new Set(["viewBox","preserveAspectRatio","gradientUnits","gradientTransform","spreadMethod","patternUnits","patternContentUnits","patternTransform","clipPathUnits","maskUnits","maskContentUnits","textLength","lengthAdjust","startOffset","filterUnits","primitiveUnits","stdDeviation","baseFrequency","numOctaves","surfaceScale","diffuseConstant","specularConstant","specularExponent","kernelMatrix","kernelUnitLength","edgeMode","preserveAlpha","targetX","targetY"]);function b(e){return g.has(e)?e:e.replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase()}function A(e,t,n){return Math.max(t,Math.min(e,n))}var w=new Set(["type","children","animate","style","animator","defs","bindings"]);function k(e){const t={};for(const n of Object.keys(e)){if(w.has(n))continue;let r=e[n];p.has(n)&&Array.isArray(r)?t[n]=f(r):h.has(n)?(Array.isArray(r)&&("translate"===n&&(r=r.map(e=>e+"px")),r=r.join(",")),"rotate"===n&&(r+="deg"),t.transform=n+"("+r+")"):null!=r&&(t[n]=String(r))}return t}function x(e,t){if(!e)return null;const n=e,{type:s,children:l,animate:a,style:u}=n,c=((e,t)=>{var n={};for(var s in e)o.call(e,s)&&t.indexOf(s)<0&&(n[s]=e[s]);if(null!=e&&r)for(var s of r(e))t.indexOf(s)<0&&i.call(e,s)&&(n[s]=e[s]);return n})(n,["type","children","animate","style"]),f=e.defs||t,d=function(e,t){var n;if(e)return"string"==typeof e?null==(n=null==t?void 0:t.styles)?void 0:n[e]:e}(u,f);let p;if(l)for(const e of l){const t=x(e,f);t&&(p||(p=[]),p.push(t))}return function(e,t,n,r){const o=document.createElementNS("http://www.w3.org/2000/svg",e);for(const e in t)o.setAttribute(b(e),t[e]);if(n)for(const e in n)o.style[e]=String(n[e]);if(r)for(const e of r)o.appendChild(e);return o}(s||"g",k(c),d,p)}function j(e,t){const{startOn:n,outAction:r="continue",scrollIntoViewThreshold:o=.5}=t,i=e.getRootElement();if(!i)return console.warn("setupAnimationTriggers: No root element found for animation."),e;const s=()=>{e.play()},l=()=>{switch(r){case"pause":e.pause();break;case"reset":e.cancel();break;case"reverse":e.play()}};switch(n){case"load":{const e=()=>s();"complete"===document.readyState?e():window.addEventListener("load",e,{once:!0});break}case"mouseOver":{const e=()=>s(),t=()=>l();i.addEventListener("mouseenter",e),i.addEventListener("mouseleave",t);break}case"click":{const t=()=>{e.isPlaying()?l():s()};i.addEventListener("click",t);break}case"scrollIntoView":new IntersectionObserver(e=>{e.forEach(e=>{e.isIntersecting&&e.intersectionRatio>=o?s():l()})},{threshold:o}).observe(i);break}return e}var S="data-px-animation-src",O="_px_animator";function C(e){return!(!e||"object"!=typeof e||Array.isArray(e))&&("svg"===e.type||"svg"===e.tagName)}function E(e){return e&&"object"==typeof e&&!Array.isArray(e)}function M(e,t,n){return"string"==typeof e||(!(!Array.isArray(e)||4!==e.length||!e.every(e=>"number"==typeof e))||(n.push(t+": invalid easing, expected string or [number, number, number, number]"),!1))}function R(e,t,n){if(!E(e))return n.push(t+": expected object"),!1;let r=!0;return void 0!==e.time&&"number"!=typeof e.time&&(n.push(t+".time: expected number, got "+typeof e.time),r=!1),void 0!==e.t&&"number"!=typeof e.t&&(n.push(t+".t: expected number, got "+typeof e.t),r=!1),void 0===e.easing||M(e.easing,t+".easing",n)||(r=!1),void 0===e.e||M(e.e,t+".e",n)||(r=!1),r}function P(e,t,n){if(!E(e))return n.push(t+": expected object"),!1;let r=!0;return void 0!==e.keyframes&&(Array.isArray(e.keyframes)?e.keyframes.forEach((e,o)=>{R(e,t+".keyframes["+o+"]",n)||(r=!1)}):(n.push(t+".keyframes: expected array"),r=!1)),void 0!==e.kfs&&(Array.isArray(e.kfs)?e.kfs.forEach((e,o)=>{R(e,t+".kfs["+o+"]",n)||(r=!1)}):(n.push(t+".kfs: expected array"),r=!1)),r}function T(e,t,n){if(!E(e))return n.push(t+": expected object"),!1;let r=!0;for(const o of Object.keys(e))P(e[o],t+"."+o,n)||(r=!1);return r}function I(e,t,n){if("string"==typeof e)return!0;if(Array.isArray(e)){let r=!0;return e.forEach((e,o)=>{"string"==typeof e||T(e,t+"["+o+"]",n)||(r=!1)}),r}return E(e)?T(e,t,n):(n.push(t+": expected string, array, or PxAnimationDefinition object"),!1)}function N(e,t,n){if(!E(e))return n.push(t+": expected object"),!1;let r=!0;return void 0===e.mode||["auto","webapi","frames"].includes(e.mode)||(n.push(t+'.mode: invalid value "'+e.mode+"\", expected 'auto'|'webapi'|'frames'"),r=!1),void 0!==e.duration&&"number"!=typeof e.duration&&(n.push(t+".duration: expected number, got "+typeof e.duration),r=!1),void 0!==e.delay&&"number"!=typeof e.delay&&(n.push(t+".delay: expected number, got "+typeof e.delay),r=!1),void 0!==e.iterations&&"number"!=typeof e.iterations&&"infinite"!==e.iterations&&(n.push(t+".iterations: expected number or 'infinite', got "+typeof e.iterations),r=!1),void 0===e.fill||function(e,t,n){return"forwards"===e||"backwards"===e||"both"===e||"none"===e||(n.push(t+': invalid FillMode "'+e+"\", expected 'forwards'|'backwards'|'both'|'none'"),!1)}(e.fill,t+".fill",n)||(r=!1),void 0===e.direction||function(e,t,n){return"normal"===e||"reverse"===e||"alternate"===e||"alternate-reverse"===e||(n.push(t+': invalid PlaybackDirection "'+e+"\", expected 'normal'|'reverse'|'alternate'|'alternate-reverse'"),!1)}(e.direction,t+".direction",n)||(r=!1),void 0!==e.frameRate&&"number"!=typeof e.frameRate&&(n.push(t+".frameRate: expected number, got "+typeof e.frameRate),r=!1),void 0===e.trigger||function(e,t,n){if(!E(e))return n.push(t+": expected object"),!1;let r=!0;const o=["load","mouseOver","click","scrollIntoView","programmatic"];if(o.includes(e.startOn)||(n.push(t+'.startOn: invalid value "'+e.startOn+'", expected '+o.join("|")),r=!1),void 0!==e.outAction){const o=["continue","pause","reset","reverse"];o.includes(e.outAction)||(n.push(t+'.outAction: invalid value "'+e.outAction+'", expected '+o.join("|")),r=!1)}return void 0!==e.scrollIntoViewThreshold&&"number"!=typeof e.scrollIntoViewThreshold&&(n.push(t+".scrollIntoViewThreshold: expected number, got "+typeof e.scrollIntoViewThreshold),r=!1),r}(e.trigger,t+".trigger",n)||(r=!1),r}function F(e,t,n){if(!E(e))return n.push(t+": expected object"),!1;let r=!0;return"string"!=typeof e.type&&(n.push(t+".type: expected string, got "+typeof e.type),r=!1),void 0!==e.children&&(Array.isArray(e.children)?e.children.forEach((e,o)=>{F(e,t+".children["+o+"]",n)||(r=!1)}):(n.push(t+".children: expected array"),r=!1)),void 0===e.animate||I(e.animate,t+".animate",n)||(r=!1),r}function L(e,t,n){if(!F(e,t,n))return!1;let r=!0;return"svg"!==e.type&&(n.push(t+".type: expected 'svg', got '"+e.type+"'"),r=!1),void 0!==e.width&&"number"!=typeof e.width&&(n.push(t+".width: expected number, got "+typeof e.width),r=!1),void 0!==e.height&&"number"!=typeof e.height&&(n.push(t+".height: expected number, got "+typeof e.height),r=!1),void 0!==e.viewBox&&"string"!=typeof e.viewBox&&(n.push(t+".viewBox: expected string, got "+typeof e.viewBox),r=!1),void 0===e.animator||N(e.animator,t+".animator",n)||(r=!1),void 0===e.defs||function(e,t,n){if(!E(e))return n.push(t+": expected object"),!1;let r=!0;if(void 0!==e.easings)if(E(e.easings))for(const o of Object.keys(e.easings))M(e.easings[o],t+".easings."+o,n)||(r=!1);else n.push(t+".easings: expected object"),r=!1;if(void 0!==e.animations)if(E(e.animations))for(const o of Object.keys(e.animations))T(e.animations[o],t+".animations."+o,n)||(r=!1);else n.push(t+".animations: expected object"),r=!1;return void 0===e.styles||E(e.styles)||(n.push(t+".styles: expected object"),r=!1),r}(e.defs,t+".defs",n)||(r=!1),void 0!==e.bindings&&(Array.isArray(e.bindings)?e.bindings.forEach((e,o)=>{(function(e,t,n){if(!E(e))return n.push(t+": expected object"),!1;let r=!0;return"string"!=typeof e.id&&(n.push(t+".id: expected string, got "+typeof e.id),r=!1),I(e.animate,t+".animate",n)||(r=!1),r})(e,t+".bindings["+o+"]",n)||(r=!1)}):(n.push(t+".bindings: expected array"),r=!1)),void 0===e.design||F(e.design,t+".design",n)||(r=!1),r}function U(e){const t=[];return{valid:L(e,"root",t),errors:t}}function D(e){var t,n;return(null==e?void 0:e.animator)||(null==(t=null==e?void 0:e.meta)?void 0:t.animator)||(null==e?void 0:e.animation)||(null==(n=null==e?void 0:e.meta)?void 0:n.animation)}function z(e){var t;if(e)return e.defs||(null==(t=e.meta)?void 0:t.defs)}function q(e){var t;if(e)return e.bindings||(null==(t=e.meta)?void 0:t.bindings)}function V(e){return null==e?void 0:e.children}function W(e){const t=[];let n;const r=function(e){const t=e.split(/([MLCZmlcz]|[\s,]+)/).map(e=>e.trim()).filter(e=>e&&","!==e),n=[];let r=null;for(const e of t)if(/[MLCZmlcz]/.test(e))r={type:e,values:[]},n.push(r);else if(r){const t=+e;r.values.push(Number.isNaN(t)?0:t)}return n}(e);for(const e of r){const r=e.type,o=e.values;if("M"===r||"m"===r){const e=o[0]||0,r=o[1]||0;n={v:[[e,r]],i:[[e,r]],o:[[e,r]],c:!1},t.push(n);continue}if(n||(n={v:[[0,0]],i:[[0,0]],o:[[0,0]],c:!1},t.push(n)),"L"===r){const e=o[0]||0,t=o[1]||0;n.v.push([e,t]),n.i.push([e,t]),n.o.push([e,t])}else if("C"===r){const e=o[0]||0,t=o[1]||0,r=o[2]||0,i=o[3]||0,s=o[4]||0,l=o[5]||0;n.o[n.o.length-1]=[e,t],n.v.push([s,l]),n.i.push([r,i]),n.o.push([s,l])}else"Z"!==r&&"z"!==r||(n.c=!0)}return t}function _(e){return e.startsWith("path(")&&e.endsWith(")")?e.slice(5,-1):/^[MmZzLlHhVvCcSsQqTtAa]/.test(e)?e:void 0}function Z(e){return"string"==typeof e&&void 0!==_(e)}function B(e){if(e&&"object"==typeof e&&"paths"in e){const t=e.paths;if(Array.isArray(t)&&t.length>0&&Z(t[0])){const e=[];for(const n of t){const t=_(n);t&&e.push(...W(t))}return{paths:e}}return e}if(Array.isArray(e)){if(e.length>0&&Z(e[0])){const t=[];for(const n of e){const e=_(n);e&&t.push(...W(e))}return{paths:t}}return{paths:e}}if(Z(e)){return{paths:W(_(e))}}return e}function K(e,t){var n;if(e)return Array.isArray(e)?e:(null==(n=null==t?void 0:t.easings)?void 0:n[e])?t.easings[e]:void console.warn("Unknown easing name: "+e)}function $(e,t){var n;if("string"==typeof e){const r=null==(n=null==t?void 0:t.animations)?void 0:n[e];return r||console.warn("Unknown animation name: "+e),r}return e}function H(e,t,n,r){var o,i,s,l,a;const u=t.keyframes||t.kfs||[],c=[];for(const t of u){const n=null!=(i=null!=(o=t.time)?o:t.t)?i:0;let u=null!=(s=t.value)?s:t.v;const f=null!=(l=t.easing)?l:t.e;"d"===e&&(u=B(u)),p.has(e)&&(u=null!=(a=d(u))?a:u),c.push({t:n,v:u,e:K(f,r)})}return c.sort((e,t)=>{var n,r;return(null!=(n=e.t)?n:0)-(null!=(r=t.t)?r:0)}),c}var Q=0;function X(e){const t=D(e)||{},n=z(e),r=(t.duration,[]),o=(e,t)=>{if(!t)return null;const r=function(e,t){if(!e)return[];const n=[];if("string"==typeof e){const r=$(e,t);r&&n.push(r)}else if(Array.isArray(e))for(const r of e){const e=$(r,t);e&&n.push(e)}else n.push(e);return n}(t,n);if(0===r.length)return null;const o=function(e,t,n){const r={};for(const[t,o]of Object.entries(e)){const e=H(t,o,0,n);e.length>0&&(r[t]={kfs:e})}return r}(function(e){const t={};for(const n of e)for(const[e,r]of Object.entries(n))t[e]=r;return t}(r),0,n);return 0===Object.keys(o).length?null:{id:e,animate:o}},i=q(e);if(i)for(const e of i){const t=o(e.id,e.animate);t&&r.push(t)}const s=e=>{if(e.animate){const t=e.id||"_px_el_"+ ++Q;e.id=t;const n=o(t,e.animate);n&&r.push(n)}if(e.children)for(let t=0;t<e.children.length;t++)s(e.children[t])};if(e.children)for(let t=0;t<e.children.length;t++)s(e.children[t]);return r}function Y(e,t,n){var r,o,i,s,d,h,v;const y=t.kfs||t.keyframes||[];if(0===y.length)return null;const{prevKf:g,nextKf:w}=function(e,t){var n,r;let o=e[0],i=e[e.length-1];for(let s=0;s<e.length-1;s++){const l=null!=(n=e[s].t)?n:0,a=null!=(r=e[s+1].t)?r:0;if(l<=t&&t<=a){o=e[s],i=e[s+1];break}}return{prevKf:o,nextKf:i}}(y,n);let k=g===w?0:(x=n,j=null!=(r=g.t)?r:0,S=null!=(o=w.t)?o:0,O=0,C=1,S===j?O:O+(x-j)/(S-j)*(C-O));var x,j,S,O,C;k=A(k,0,1);const E=null!=(i=g.e)?i:g.easing;if(E&&Array.isArray(E))try{k=c(E)(k)}catch(e){}let M=!(R=e).includes("-")&&/[a-z][A-Z]/.test(R)?b(e):e;var R;let P=null;const T=null!=(s=null==g?void 0:g.v)?s:null==g?void 0:g.value,I=null!=(d=null==w?void 0:w.v)?d:null==w?void 0:w.value;if("d"===M){P=function(e,t,n){const r=Math.max(e.length,t.length),o=[];for(let i=0;i<r;i++)o.push(u(e[i],t[i],n));return o}(null!=(h=null==T?void 0:T.paths)?h:Array.isArray(T)?T:[],null!=(v=null==I?void 0:I.paths)?v:Array.isArray(I)?I:[],k).map(e=>function(e){var t,n,r,o;const i=e.v,s=e.i,l=e.o,a=e.c;if(!i.length)return"";const u=[],c=i.length;u.push("M"+i[0][0]+","+i[0][1]);for(let e=1;e<c;e++){const r=i[e-1],o=null!=(t=null==l?void 0:l[e-1])?t:r,a=null!=(n=null==s?void 0:s[e])?n:i[e],c=i[e];o[0]===r[0]&&o[1]===r[1]&&a[0]===c[0]&&a[1]===c[1]?u.push("L"+c[0]+","+c[1]):u.push("C"+o[0]+","+o[1]+","+a[0]+","+a[1]+","+c[0]+","+c[1])}if(a&&c>0){const e=i[c-1],t=null!=(r=null==l?void 0:l[c-1])?r:e,n=null!=(o=null==s?void 0:s[0])?o:i[0],a=i[0];t[0]===e[0]&&t[1]===e[1]&&n[0]===a[0]&&n[1]===a[1]||u.push("C"+t[0]+","+t[1]+","+n[0]+","+n[1]+","+a[0]+","+a[1]),u.push("z")}return u.join("")}(e)).join("")}else if(p.has(M))P=f((F=I||[0,0,0,1],L=k,[l((N=T||[0,0,0,1])[0]||0,F[0]||0,L),l(N[1]||0,F[1]||0,L),l(N[2]||0,F[2]||0,L),l(void 0===N[3]?1:N[3],void 0===F[3]?1:F[3],L)])),M=e;else if("stroke-dasharray"===M)P=a(T||[],I||[],k).join(" "),M=e;else if("translate"===M){P="translate("+a(T||[0,0],I||[0,0],k).join(",")+")",M="transform"}else if("rotate"===M){P="rotate("+l(+(T||0),+(I||0),k)+")",M="transform"}else if("scale"===M){P="scale("+a(T||[1,1],I||[1,1],k).join(",")+")",M="transform"}else{P=l(+(T||0),+(I||0),k)}var N,F,L;return m.has(M)&&"number"==typeof P&&(P=100*P+"%"),{k:M,v:null===P?"":""+P}}function G(e,t){const n={};for(const[r,o]of Object.entries(e)){const e=Y(r,o,t);e&&(n[e.k]=e.v)}return n}function J(e){return"#"+e}function ee(e,t,n){const r=D(e)||{},o=X(e),i=r.iterations;let s=1;"number"==typeof i&&(s=i||1),"infinite"===i&&(s=1/0),s<1&&(s=1);const l=+(r.duration||1e3),a=l&&s?l*(s===1/0?1/0:s):l?(null!=s?s:1)*l:0,u=r.direction||"normal";let c=null,f=!1,d=r.delay||0,p=0,h=1,m=!1;const v=r.frameRate,y=v&&v>0?1e3/v:0;let g=0;const b=()=>{const e=p?(Date.now()-p)*h:0;let t=d+e;return Number.isFinite(a)&&t>a&&(t=a),t<0&&(t=0),t};function w(e){let n=function(){const t=l>0?l:1;let n=0,r=0;if(l>0){e=A(e,0,s*t),r=Math.max(0,Math.ceil(e/t)-1),r=Math.min(r,s-1);n=A((e-r*t)/t,0,1)}else n=e;const o=u||"normal";let i=n;return"reverse"===o?i=1-n:"alternate"===o?r%2==1&&(i=1-n):"alternate-reverse"===o&&r%2==0&&(i=1-n),i}();for(const e of o||[]){const r=e.animate;if(!r||"object"!=typeof r||Array.isArray(r)){console.warn("Empty or unresolved binding",e);continue}const o=G(r,n*l);for(const[n,r]of Object.entries(o))t.setAttribute(e.id,n,r)}}r.delay&&w(b());const k=()=>!!f&&(!!t.isConnected()&&!(Number.isFinite(a)&&b()>=a)),x=e=>{null!==c&&(cancelAnimationFrame(c),c=null),(e||k())&&(c=requestAnimationFrame(()=>{c=null,(()=>{var e;if(!t.isConnected())return void j();const r=b();if(y>0){const e=Date.now();if(g&&e-g<y)return;g=e}if(a&&Number.isFinite(a)&&r>=a)return w(a),m||(m=!0,null==(e=null==n?void 0:n.onFinish)||e.call(n)),void j();w(r)})(),x()}))},j=()=>{f&&(d=b(),p=0,f=!1,null!==c&&(cancelAnimationFrame(c),c=null),w(d))},S={isReady:()=>!0,getRootElement:()=>null,isPlaying:()=>k(),play:()=>{var e;f||(f=!0,p=Date.now(),x(!0)),null==(e=null==n?void 0:n.onPlay)||e.call(n)},pause:()=>{var e;j(),null==(e=null==n?void 0:n.onPause)||e.call(n)},cancel:()=>{var e;j(),d=0,p=0,f=!1,m=!1,w(d),null==(e=null==n?void 0:n.onCancel)||e.call(n)},finish:()=>{((e=!0)=>{var t;d=Number.isFinite(a)?a:b(),p=0,f=!1,w(d),e&&!m&&(m=!0,null==(t=null==n?void 0:n.onFinish)||t.call(n))})(!0)},setPlaybackRate:e=>{if(!isFinite(e)||0===e)return void console.warn("setPlaybackRate: rate must be finite and non-zero");const t=b();h=e,d=t,f&&(p=Date.now())},getCurrentTime:()=>b(),setCurrentTime:e=>{e<0&&(e=0),Number.isFinite(a)&&e>a&&(e=a),d=e,f&&(p=Date.now()),w(b())},destroy:()=>{S.cancel()}};return S}function te(e,l,a,u){const c=D(e)||{};if(!u)if(e.id){const t=J(e.id);(u=document.querySelector(t))||console.warn("createFrameLoopAnimator: No root element found for selector: ",t)}else console.warn("createFrameLoopAnimator: No root element provided");let f=ee(e,l||function(e){const t=new Set,n={isConnected:()=>!e||e.isConnected,setAttribute:(n,r,o)=>{r=b(r);const i=J(n),s=(null==e?void 0:e.querySelectorAll(i))||document.querySelectorAll(i);0!==s.length||t.has(i)||(t.add(i),console.warn('setAttribute: No elements found for selector "'+i+'"'));for(let e=0;e<s.length;e++){const t=s[e];t.setAttribute(r,o),v.has(r)&&(t.style[r]=o)}}};return n}(u),a);var d;return d=((e,t)=>{for(var n in t||(t={}))o.call(t,n)&&s(e,n,t[n]);if(r)for(var n of r(t))i.call(t,n)&&s(e,n,t[n]);return e})({},f),f=t(d,n({getRootElement:()=>u||null})),c.trigger&&j(f,c.trigger),f}function ne(e,t,n){var r,o,i,s;const l=new Map;for(const[a,u]of Object.entries(e)){const e=u.kfs||u.keyframes||[],c=[];for(const l of e){let e=null!=(o=null!=(r=l.t)?r:l.time)?o:0;e=A(e/(n.duration||1),0,1);let u=null!=(i=l.v)?i:l.value;const d=null!=(s=l.e)?s:l.easing,m={offset:e,easing:d&&Array.isArray(d)?"cubic-bezier("+d.join(",")+")":void 0};let v,g=a;p.has(a)&&Array.isArray(u)?v=f(u):h.has(a)?(Array.isArray(u)&&("translate"===a&&(u=u.map(e=>e+"px")),u=u.join(",")),"rotate"===a&&(u+="deg"),v=a+"("+u+")",g="transform"):v=""+u,CSS.supports(g,v)||t.add(g),g=y(g),m[g]=v,c.push(m)}c.length>0&&l.set(a,c)}return l}function re(e,t,n,r){const o=D(e)||{},i=X(e);if(!n)if(e.id){const t=J(e.id);(n=document.querySelector(t))||console.warn("createFrameLoopAnimator: No root element found for selector: ",t)}else console.warn("createFrameLoopAnimator: No root element provided");const s=[],l=o.iterations;let a;"number"==typeof l&&(a=l),"infinite"===l&&(a=1/0);const u=new Set;(null==i?void 0:i.length)||console.warn("createWebApiAnimator: No animation bindings defined");for(const e of i||[]){const r=e.animate;if(!r||"object"!=typeof r||Array.isArray(r)){console.warn("createWebApiAnimator: Empty or unresolved binding",e);continue}const i=J(e.id),l=(null==n?void 0:n.querySelectorAll(i))||document.querySelectorAll(i);0===l.length&&console.warn('createWebApiAnimator: No elements found for selector "'+i+'"');const c=ne(r,u,o);for(let e=0;e<l.length;e++){const n=l[e],r=o.delay&&o.delay>0?o.delay:void 0,i=o.delay&&o.delay<0&&o.duration?-o.delay%o.duration:void 0,u={duration:o.duration,delay:r,fill:o.fill,direction:o.direction,iterations:a};for(const[,e]of c)if(e.length>0)try{const r=new KeyframeEffect(n,e,u),o=new Animation(r,document.timeline);(null==t?void 0:t.onFinish)&&(o.onfinish=()=>{var e;return null==(e=t.onFinish)?void 0:e.call(t)}),(null==t?void 0:t.onRemove)&&(o.onremove=()=>{var e;return null==(e=t.onRemove)?void 0:e.call(t)}),i&&(o.currentTime=i),s.push(o)}catch(e){console.warn(e)}}}if(!r&&u.size)return console.warn("Unsupported CSS attrs: "+[...u].join(", ")),null;const c={isReady:()=>!0,getRootElement:()=>n||null,isPlaying:()=>{var e;return"running"===(null==(e=s[0])?void 0:e.playState)},play:()=>{var e;s.forEach(e=>e.play()),null==(e=null==t?void 0:t.onPlay)||e.call(t)},pause:()=>{var e;s.forEach(e=>e.pause()),null==(e=null==t?void 0:t.onPause)||e.call(t)},cancel:()=>{var e;s.forEach(e=>e.cancel()),null==(e=null==t?void 0:t.onCancel)||e.call(t)},finish:()=>{s.forEach(e=>e.finish())},setPlaybackRate:e=>(s.forEach(t=>t.playbackRate=e),c),getCurrentTime:()=>{var e,t;const n=null!=(t=null==(e=s[0])?void 0:e.currentTime)?t:null;return null!==n?+n:null},setCurrentTime:e=>{s.forEach(t=>{t.currentTime=e})},destroy:()=>{c.cancel(),s.splice(0,s.length)}};return o.trigger&&j(c,o.trigger),c}var oe=0;function ie(e){if(null===e||"object"!=typeof e)return e;if(Array.isArray(e))return e.map(e=>ie(e));const t=e,n={};for(const e of Object.keys(t))n[e]=ie(t[e]);return n}function se(e){const t=ie(e),n=new Map,r=new Set(["href","xlink:href"]),o=new Set(["fill","stroke","clip-path","clipPath","mask","marker","marker-start","marker-mid","marker-end","filter","flood-color","lighting-color"]),i=new Set(["baseId","targetId","boundElementId"]);!function e(t){if(t&&"object"==typeof t){if(t.id&&"string"==typeof t.id){const e=t.id,r="_px_"+Date.now().toString(36)+(++oe).toString(36)+Math.random().toString(36).substring(2,6);n.set(e,r),t.id=r}if(Array.isArray(t.children))for(const n of t.children)e(n)}}(t),function e(t){if(t&&"object"==typeof t)for(const[s,l]of Object.entries(t))if("children"!==s)if("string"==typeof l)if(r.has(s)&&l.startsWith("#")){const e=l.slice(1),r=n.get(e);r&&(t[s]="#"+r)}else if(o.has(s))t[s]=le(l,n);else if(i.has(s)){const e=n.get(l);e&&(t[s]=e)}else l.includes("url(#")&&(t[s]=le(l,n));else if("style"===s&&"object"==typeof l&&null!==l)for(const[e,t]of Object.entries(l))"string"==typeof t&&(l[e]=le(t,n));else"object"==typeof l&&null!==l&&"animate"!==s&&e(l);else if(Array.isArray(l))for(const t of l)e(t)}(t);const s=t.bindings;if(Array.isArray(s))for(const e of s)if(e.id){const t=n.get(e.id);t&&(e.id=t)}return t}function le(e,t){return e.replace(/url\(#([^)]+)\)/g,(e,n)=>{const r=t.get(n);return r?"url(#"+r+")":e})}function ae(e,t,n,r){(D(e)||{}).debug=!0;let o=null;if(r&&e.children){e=se(e);const t="string"==typeof r?document.querySelector(r):r;t&&(o=x(e),o&&t.replaceChildren(o))}return function(e,t,n,r){const o=D(e)||{};let i;return i="frames"===o.mode?te(e,t,n,r):re(e,n,r,"webapi"===o.mode)||te(e,t,n,r),o.debugInstName&&(window[o.debugInstName]=i),i}(e,t,n,o)}function ue(e,t,n,r){if("object"==typeof e)return ae(e,t,n,r);let o=null;return fetch(e).then(e=>e.json()).then(e=>{C(e)?o=ae(e,t,n,r):console.error("Invalid animation document format")}),{isReady:()=>!!o,getRootElement:()=>o?o.getRootElement():null,isPlaying:()=>(null==o?void 0:o.isPlaying())||!1,play:()=>{null==o||o.play()},pause:()=>{null==o||o.pause()},cancel:()=>{null==o||o.cancel()},finish:()=>{null==o||o.finish()},setPlaybackRate:e=>{null==o||o.setPlaybackRate(e)},getCurrentTime:()=>(null==o?void 0:o.getCurrentTime())||0,setCurrentTime:e=>{null==o||o.setCurrentTime(e)},destroy:()=>{null==o||o.destroy()}}}function ce(){const e=document.querySelectorAll("["+S+"]");for(let t=0;t<e.length;t++){const n=e[t];if(!n[O]){const e=n.getAttribute(S);e&&(n[O]=ue(e,void 0,void 0,n))}}}"undefined"!=typeof window&&(window.loadTagAnimators=ce,window.createAnimator=ue,window.setupAnimationTriggers=j);export{p as COLOUR_ATTR_NAMES,O as PX_ANIM_ATTR_NAME,S as PX_ANIM_SRC_ATTR_NAME,v as STYLE_ATTR_NAMES,h as TRANSFORM_FN_NAMES,G as calcAnimationValues,b as camelCaseToKebabWordIfNeeded,ue as createAnimator,ae as createAnimatorImpl,ee as createBasicFrameLoopAnimator,te as createFrameLoopAnimator,re as createWebApiAnimator,se as generateNewIds,D as getAnimatorConfig,q as getBindings,V as getChildren,z as getDefs,k as getNormalizedProps,C as isPxElementFileFormat,U as isPxElementFileFormatDeep,ce as loadTagAnimators,X as normalizeDocument,x as renderNode,j as setupAnimationTriggers,f as toRGBA};