@jigonzalez930209/scichart-engine 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"scichart-engine.umd.js","sources":["../src/core/EventEmitter.ts","../src/core/Series.ts","../src/renderer/NativeWebGLRenderer.ts","../src/scales/index.ts","../src/theme/index.ts","../src/core/OverlayRenderer.ts","../src/core/InteractionManager.ts","../src/core/ChartControls.ts","../src/core/ChartLegend.ts","../src/core/Chart.ts","../src/renderer/RendererInterface.ts","../src/workers/downsample.ts","../src/analysis/utils.ts","../node_modules/.pnpm/react@19.2.3/node_modules/react/cjs/react-jsx-runtime.production.js","../node_modules/.pnpm/react@19.2.3/node_modules/react/cjs/react-jsx-runtime.development.js","../node_modules/.pnpm/react@19.2.3/node_modules/react/jsx-runtime.js","../src/react/useSciChart.ts","../src/react/SciChart.tsx"],"sourcesContent":["/**\n * Type-safe event emitter for chart events\n */\n\nexport class EventEmitter<EventMap extends object> {\n private listeners: Map<keyof EventMap, Set<(data: unknown) => void>> =\n new Map();\n\n /**\n * Subscribe to an event\n */\n on<K extends keyof EventMap>(\n event: K,\n handler: (data: EventMap[K]) => void\n ): void {\n if (!this.listeners.has(event)) {\n this.listeners.set(event, new Set());\n }\n this.listeners.get(event)!.add(handler as (data: unknown) => void);\n }\n\n /**\n * Unsubscribe from an event\n */\n off<K extends keyof EventMap>(\n event: K,\n handler: (data: EventMap[K]) => void\n ): void {\n const handlers = this.listeners.get(event);\n if (handlers) {\n handlers.delete(handler as (data: unknown) => void);\n }\n }\n\n /**\n * Emit an event with data\n */\n emit<K extends keyof EventMap>(event: K, data: EventMap[K]): void {\n const handlers = this.listeners.get(event);\n if (handlers) {\n handlers.forEach((handler) => {\n try {\n handler(data);\n } catch (error) {\n console.error(`[EventEmitter] Error in handler for \"${String(event)}\":`, error);\n }\n });\n }\n }\n\n /**\n * Subscribe to an event once\n */\n once<K extends keyof EventMap>(\n event: K,\n handler: (data: EventMap[K]) => void\n ): void {\n const wrappedHandler = (data: EventMap[K]) => {\n this.off(event, wrappedHandler);\n handler(data);\n };\n this.on(event, wrappedHandler);\n }\n\n /**\n * Remove all listeners\n */\n clear(): void {\n this.listeners.clear();\n }\n\n /**\n * Get listener count for an event\n */\n listenerCount(event: keyof EventMap): number {\n return this.listeners.get(event)?.size ?? 0;\n }\n}\n","/**\n * Series - Represents a single data series in the chart\n *\n * Manages data arrays, styling, and GPU buffer lifecycle.\n */\n\nimport type {\n SeriesOptions,\n SeriesData,\n SeriesStyle,\n SeriesUpdateData,\n Bounds,\n SeriesType,\n} from \"../types\";\n\nconst DEFAULT_STYLE: SeriesStyle = {\n color: \"#ff0055\",\n width: 1.5,\n opacity: 1,\n pointSize: 4,\n};\n\nfunction ensureTypedArray(\n data: Float32Array | Float64Array | number[] | undefined\n): Float32Array | Float64Array {\n if (!data) return new Float32Array(0);\n if (data instanceof Float32Array || data instanceof Float64Array) return data;\n return new Float32Array(data);\n}\n\nexport class Series {\n private id: string;\n private type: SeriesType;\n private data: SeriesData;\n private style: SeriesStyle;\n private visible: boolean;\n private cycle?: number;\n\n // Cached bounds for performance\n private cachedBounds: Bounds | null = null;\n private boundsNeedsUpdate = true;\n\n // Track if GPU buffer needs update\n private _needsBufferUpdate = true;\n\n // Smoothed data cache\n private smoothedData: SeriesData | null = null;\n private smoothingNeedsUpdate = true;\n\n constructor(options: SeriesOptions) {\n if (!options) throw new Error(\"[Series] Options are required\");\n this.id = options.id;\n this.type = options.type;\n\n this.data = {\n x: ensureTypedArray(options.data?.x),\n y: ensureTypedArray(options.data?.y),\n };\n\n // Support both style object and top-level style properties for convenience\n this.style = {\n ...DEFAULT_STYLE,\n ...options.style,\n };\n\n // Fallback for top-level style properties often used in examples\n if ((options as any).color) this.style.color = (options as any).color;\n if ((options as any).width) this.style.width = (options as any).width;\n if ((options as any).pointSize)\n this.style.pointSize = (options as any).pointSize;\n\n this.visible = options.visible ?? true;\n this.cycle = options.cycle;\n\n // Validate data\n if (this.data.x.length !== this.data.y.length) {\n console.warn(\n `[Series \"${this.id}\"] X and Y arrays have different lengths:`,\n this.data.x.length,\n \"vs\",\n this.data.y.length\n );\n }\n }\n\n // ----------------------------------------\n // Getters\n // ----------------------------------------\n\n getId(): string {\n return this.id;\n }\n\n getType(): SeriesType {\n return this.type;\n }\n\n getData(): SeriesData {\n if (this.style.smoothing && this.style.smoothing > 0) {\n return this.getSmoothedData();\n }\n return this.data;\n }\n\n private getSmoothedData(): SeriesData {\n if (this.smoothingNeedsUpdate || !this.smoothedData) {\n this.smoothedData = this.applySmoothing(this.data, 5); // Window size 5\n this.smoothingNeedsUpdate = false;\n }\n return this.smoothedData;\n }\n\n private applySmoothing(data: SeriesData, windowSize: number): SeriesData {\n const { x, y } = data;\n const len = x.length;\n if (len < windowSize) return { ...data };\n\n const smoothedY = new Float32Array(len);\n const halfWindow = Math.floor(windowSize / 2);\n\n for (let i = 0; i < len; i++) {\n let sum = 0;\n let count = 0;\n for (let j = i - halfWindow; j <= i + halfWindow; j++) {\n if (j >= 0 && j < len) {\n sum += y[j];\n count++;\n }\n }\n smoothedY[i] = sum / count;\n }\n\n return { x, y: smoothedY };\n }\n\n getStyle(): SeriesStyle {\n return this.style;\n }\n\n isVisible(): boolean {\n return this.visible;\n }\n\n getCycle(): number | undefined {\n return this.cycle;\n }\n\n getPointCount(): number {\n return this.data.x.length;\n }\n\n // ----------------------------------------\n // Bounds Calculation\n // ----------------------------------------\n\n getBounds(): Bounds | null {\n if (this.data.x.length === 0) {\n return null;\n }\n\n if (this.boundsNeedsUpdate || this.cachedBounds === null) {\n this.cachedBounds = this.calculateBounds();\n this.boundsNeedsUpdate = false;\n }\n\n return this.cachedBounds;\n }\n\n private calculateBounds(): Bounds {\n const { x, y } = this.data;\n\n let xMin = Infinity;\n let xMax = -Infinity;\n let yMin = Infinity;\n let yMax = -Infinity;\n\n // Single pass through data\n for (let i = 0; i < x.length; i++) {\n const xVal = x[i];\n const yVal = y[i];\n\n // Skip NaN/Infinity\n if (!isFinite(xVal) || !isFinite(yVal)) continue;\n\n if (xVal < xMin) xMin = xVal;\n if (xVal > xMax) xMax = xVal;\n if (yVal < yMin) yMin = yVal;\n if (yVal > yMax) yMax = yVal;\n }\n\n const bounds = { xMin, xMax, yMin, yMax };\n return bounds;\n }\n\n // ----------------------------------------\n // Data Updates\n // ----------------------------------------\n\n /**\n * Update series data\n *\n * For streaming data, use append=true to avoid recreating buffers.\n */\n updateData(update: SeriesUpdateData): void {\n if (!update) return;\n\n if (update.append) {\n const newX = ensureTypedArray(update.x);\n const newY = ensureTypedArray(update.y);\n\n if (newX.length > 0 && newY.length > 0) {\n this.data = {\n x: this.appendArray(this.data.x, newX),\n y: this.appendArray(this.data.y, newY),\n };\n }\n } else {\n // Replace mode\n if (update.x) this.data.x = ensureTypedArray(update.x);\n if (update.y) this.data.y = ensureTypedArray(update.y);\n }\n\n // Invalidate bounds cache\n this.boundsNeedsUpdate = true;\n this.smoothingNeedsUpdate = true;\n this._needsBufferUpdate = true;\n }\n\n private appendArray(\n existing: Float32Array | Float64Array,\n newData: Float32Array | Float64Array\n ): Float32Array | Float64Array {\n // Create new array with combined length\n const combined = new (existing.constructor as\n | Float32ArrayConstructor\n | Float64ArrayConstructor)(existing.length + newData.length);\n combined.set(existing, 0);\n combined.set(newData, existing.length);\n return combined;\n }\n\n /**\n * Replace all data at once\n */\n setData(\n x: Float32Array | Float64Array,\n y: Float32Array | Float64Array\n ): void {\n this.data = { x, y };\n this.boundsNeedsUpdate = true;\n this.smoothingNeedsUpdate = true;\n this._needsBufferUpdate = true;\n }\n\n // ----------------------------------------\n // Style Updates\n // ----------------------------------------\n\n setStyle(style: Partial<SeriesStyle>): void {\n const oldSmoothing = this.style.smoothing;\n this.style = { ...this.style, ...style };\n if (this.style.smoothing !== oldSmoothing) {\n this.smoothingNeedsUpdate = true;\n this._needsBufferUpdate = true;\n }\n }\n\n get needsBufferUpdate(): boolean {\n return this._needsBufferUpdate;\n }\n set needsBufferUpdate(val: boolean) {\n this._needsBufferUpdate = val;\n }\n\n setVisible(visible: boolean): void {\n this.visible = visible;\n }\n\n setType(type: SeriesType): void {\n this.type = type;\n }\n\n // ----------------------------------------\n // Cleanup\n // ----------------------------------------\n\n destroy(): void {\n // Clear data references\n this.data = {\n x: new Float32Array(0),\n y: new Float32Array(0),\n };\n this.cachedBounds = null;\n }\n}\n","/**\n * NativeWebGLRenderer - Zero-dependency WebGL renderer\n *\n * This renderer uses raw WebGL APIs without any external libraries.\n * Performance is identical (or slightly better) than regl since\n * we eliminate the abstraction layer overhead.\n *\n * Key optimizations:\n * - Pre-compiled shaders (compiled once, reused)\n * - Uniform updates via GPU (no buffer recreation for zoom/pan)\n * - Buffer pooling for dynamic data\n * - Minimal state changes per frame\n */\n\nimport type { Bounds, SeriesStyle } from \"../types\";\n\n// ============================================\n// Types\n// ============================================\n\nexport interface NativeSeriesRenderData {\n id: string;\n buffer: WebGLBuffer;\n count: number;\n style: SeriesStyle;\n visible: boolean;\n type: \"line\" | \"scatter\" | \"line+scatter\";\n}\n\nexport interface NativeRenderOptions {\n bounds: Bounds;\n backgroundColor?: [number, number, number, number];\n}\n\ninterface ShaderProgram {\n program: WebGLProgram;\n attributes: { position: number };\n uniforms: {\n uScale: WebGLUniformLocation;\n uTranslate: WebGLUniformLocation;\n uColor: WebGLUniformLocation;\n uPointSize?: WebGLUniformLocation;\n };\n}\n\n// ============================================\n// Shader Sources\n// ============================================\n\nconst LINE_VERT = `\nprecision highp float;\nattribute vec2 position;\nuniform vec2 uScale;\nuniform vec2 uTranslate;\n\nvoid main() {\n vec2 pos = position * uScale + uTranslate;\n gl_Position = vec4(pos, 0.0, 1.0);\n}\n`;\n\nconst LINE_FRAG = `\nprecision highp float;\nuniform vec4 uColor;\n\nvoid main() {\n gl_FragColor = uColor;\n}\n`;\n\nconst POINT_VERT = `\nprecision highp float;\nattribute vec2 position;\nuniform vec2 uScale;\nuniform vec2 uTranslate;\nuniform float uPointSize;\n\nvoid main() {\n vec2 pos = position * uScale + uTranslate;\n gl_Position = vec4(pos, 0.0, 1.0);\n gl_PointSize = uPointSize;\n}\n`;\n\nconst POINT_FRAG = `\nprecision highp float;\nuniform vec4 uColor;\n\nvoid main() {\n vec2 coord = gl_PointCoord - vec2(0.5);\n float dist = length(coord);\n if (dist > 0.5) discard;\n float alpha = 1.0 - smoothstep(0.4, 0.5, dist);\n gl_FragColor = vec4(uColor.rgb, uColor.a * alpha);\n}\n`;\n\n// ============================================\n// NativeWebGLRenderer Class\n// ============================================\n\nexport class NativeWebGLRenderer {\n private canvas: HTMLCanvasElement;\n private gl: WebGLRenderingContext;\n private dpr: number;\n\n // Compiled shader programs\n private lineProgram: ShaderProgram;\n private pointProgram: ShaderProgram;\n\n // Buffer cache\n private buffers: Map<string, WebGLBuffer> = new Map();\n private bufferSizes: Map<string, number> = new Map();\n\n // State\n private isInitialized = false;\n\n constructor(canvas: HTMLCanvasElement) {\n this.canvas = canvas;\n this.dpr = window.devicePixelRatio || 1;\n\n // Get WebGL context\n const gl = canvas.getContext(\"webgl\", {\n alpha: true,\n antialias: true,\n preserveDrawingBuffer: true, // Essential for on-demand rendering\n powerPreference: \"high-performance\",\n });\n\n if (!gl) {\n throw new Error(\"WebGL not supported\");\n }\n\n this.gl = gl;\n\n // Compile shaders\n this.lineProgram = this.createProgram(LINE_VERT, LINE_FRAG, false);\n this.pointProgram = this.createProgram(POINT_VERT, POINT_FRAG, true);\n\n // Enable blending for transparency\n gl.enable(gl.BLEND);\n gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);\n\n this.isInitialized = true;\n console.log(\"[NativeWebGL] Initialized successfully\");\n }\n\n // ----------------------------------------\n // Shader Compilation\n // ----------------------------------------\n\n private createShader(source: string, type: number): WebGLShader {\n const { gl } = this;\n const shader = gl.createShader(type);\n if (!shader) throw new Error(\"Failed to create shader\");\n\n gl.shaderSource(shader, source);\n gl.compileShader(shader);\n\n if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {\n const error = gl.getShaderInfoLog(shader);\n gl.deleteShader(shader);\n throw new Error(`Shader compilation error: ${error}`);\n }\n\n return shader;\n }\n\n private createProgram(\n vertSource: string,\n fragSource: string,\n hasPointSize: boolean\n ): ShaderProgram {\n const { gl } = this;\n\n const vertShader = this.createShader(vertSource, gl.VERTEX_SHADER);\n const fragShader = this.createShader(fragSource, gl.FRAGMENT_SHADER);\n\n const program = gl.createProgram();\n if (!program) throw new Error(\"Failed to create program\");\n\n gl.attachShader(program, vertShader);\n gl.attachShader(program, fragShader);\n gl.linkProgram(program);\n\n if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {\n const error = gl.getProgramInfoLog(program);\n throw new Error(`Program link error: ${error}`);\n }\n\n // Clean up shaders (they're now part of the program)\n gl.deleteShader(vertShader);\n gl.deleteShader(fragShader);\n\n // Get attribute and uniform locations\n const positionAttr = gl.getAttribLocation(program, \"position\");\n const scaleUniform = gl.getUniformLocation(program, \"uScale\");\n const translateUniform = gl.getUniformLocation(program, \"uTranslate\");\n const colorUniform = gl.getUniformLocation(program, \"uColor\");\n\n if (\n scaleUniform === null ||\n translateUniform === null ||\n colorUniform === null\n ) {\n throw new Error(\"Failed to get uniform locations\");\n }\n\n const result: ShaderProgram = {\n program,\n attributes: { position: positionAttr },\n uniforms: {\n uScale: scaleUniform,\n uTranslate: translateUniform,\n uColor: colorUniform,\n },\n };\n\n if (hasPointSize) {\n result.uniforms.uPointSize =\n gl.getUniformLocation(program, \"uPointSize\") ?? undefined;\n }\n\n return result;\n }\n\n // ----------------------------------------\n // Buffer Management\n // ----------------------------------------\n\n get available(): boolean {\n return this.isInitialized;\n }\n\n /**\n * Create or update a buffer with interleaved X,Y data\n */\n createBuffer(id: string, data: Float32Array): void {\n const { gl } = this;\n let buffer = this.buffers.get(id);\n const currentSize = this.bufferSizes.get(id) || 0;\n\n if (buffer && data.byteLength <= currentSize) {\n // Update existing buffer with subdata (faster)\n gl.bindBuffer(gl.ARRAY_BUFFER, buffer);\n gl.bufferSubData(gl.ARRAY_BUFFER, 0, data);\n } else {\n // Create new buffer or recreate if size increased\n if (buffer) {\n gl.deleteBuffer(buffer);\n }\n buffer = gl.createBuffer();\n if (!buffer) throw new Error(\"Failed to create buffer\");\n\n gl.bindBuffer(gl.ARRAY_BUFFER, buffer);\n gl.bufferData(gl.ARRAY_BUFFER, data, gl.DYNAMIC_DRAW);\n\n this.buffers.set(id, buffer);\n this.bufferSizes.set(id, data.byteLength);\n }\n }\n\n /**\n * Get a buffer by ID\n */\n getBuffer(id: string): WebGLBuffer | undefined {\n return this.buffers.get(id);\n }\n\n /**\n * Delete a buffer\n */\n deleteBuffer(id: string): void {\n const buffer = this.buffers.get(id);\n if (buffer) {\n this.gl.deleteBuffer(buffer);\n this.buffers.delete(id);\n this.bufferSizes.delete(id);\n }\n }\n\n // ----------------------------------------\n // Rendering\n // ----------------------------------------\n\n /**\n * Calculate uniforms for the current viewport\n */\n private calculateUniforms(bounds: Bounds): {\n scale: [number, number];\n translate: [number, number];\n } {\n const dataWidth = bounds.xMax - bounds.xMin;\n const dataHeight = bounds.yMax - bounds.yMin;\n\n const scaleX = dataWidth > 0 ? 2 / dataWidth : 1;\n const scaleY = dataHeight > 0 ? 2 / dataHeight : 1;\n\n const translateX = -1 - bounds.xMin * scaleX;\n const translateY = -1 - bounds.yMin * scaleY;\n\n return {\n scale: [scaleX, scaleY],\n translate: [translateX, translateY],\n };\n }\n\n /**\n * Render a frame\n */\n render(series: NativeSeriesRenderData[], options: NativeRenderOptions): void {\n if (!this.isInitialized) return;\n\n const { gl } = this;\n const { bounds, backgroundColor = [0.1, 0.1, 0.18, 1] } = options;\n const uniforms = this.calculateUniforms(bounds);\n\n // Clear with background color\n gl.clearColor(\n backgroundColor[0],\n backgroundColor[1],\n backgroundColor[2],\n backgroundColor[3]\n );\n gl.clear(gl.COLOR_BUFFER_BIT);\n\n // Render each series\n for (const s of series) {\n if (!s.visible || s.count === 0) continue;\n\n const color = parseColor(s.style.color ?? \"#ff0055\");\n color[3] = s.style.opacity ?? 1;\n\n if (s.type === \"scatter\") {\n this.renderPoints(\n s.buffer,\n s.count,\n uniforms,\n color,\n (s.style.pointSize ?? 4) * this.dpr\n );\n } else if (s.type === \"line\") {\n this.renderLine(s.buffer, s.count, uniforms, color);\n } else if (s.type === \"line+scatter\") {\n this.renderLine(s.buffer, s.count, uniforms, color);\n this.renderPoints(\n s.buffer,\n s.count,\n uniforms,\n color,\n (s.style.pointSize ?? 4) * this.dpr\n );\n }\n }\n }\n\n private renderLine(\n buffer: WebGLBuffer,\n count: number,\n uniforms: { scale: [number, number]; translate: [number, number] },\n color: [number, number, number, number]\n ): void {\n const { gl } = this;\n const prog = this.lineProgram;\n\n gl.useProgram(prog.program);\n\n // Bind buffer\n gl.bindBuffer(gl.ARRAY_BUFFER, buffer);\n gl.enableVertexAttribArray(prog.attributes.position);\n gl.vertexAttribPointer(prog.attributes.position, 2, gl.FLOAT, false, 0, 0);\n\n // Set uniforms\n gl.uniform2f(prog.uniforms.uScale, uniforms.scale[0], uniforms.scale[1]);\n gl.uniform2f(\n prog.uniforms.uTranslate,\n uniforms.translate[0],\n uniforms.translate[1]\n );\n gl.uniform4f(prog.uniforms.uColor, color[0], color[1], color[2], color[3]);\n\n // Draw\n gl.drawArrays(gl.LINE_STRIP, 0, count);\n\n gl.disableVertexAttribArray(prog.attributes.position);\n }\n\n private renderPoints(\n buffer: WebGLBuffer,\n count: number,\n uniforms: { scale: [number, number]; translate: [number, number] },\n color: [number, number, number, number],\n pointSize: number\n ): void {\n const { gl } = this;\n const prog = this.pointProgram;\n\n gl.useProgram(prog.program);\n\n // Bind buffer\n gl.bindBuffer(gl.ARRAY_BUFFER, buffer);\n gl.enableVertexAttribArray(prog.attributes.position);\n gl.vertexAttribPointer(prog.attributes.position, 2, gl.FLOAT, false, 0, 0);\n\n // Set uniforms\n gl.uniform2f(prog.uniforms.uScale, uniforms.scale[0], uniforms.scale[1]);\n gl.uniform2f(\n prog.uniforms.uTranslate,\n uniforms.translate[0],\n uniforms.translate[1]\n );\n gl.uniform4f(prog.uniforms.uColor, color[0], color[1], color[2], color[3]);\n if (prog.uniforms.uPointSize) {\n gl.uniform1f(prog.uniforms.uPointSize, pointSize);\n }\n\n // Draw\n gl.drawArrays(gl.POINTS, 0, count);\n\n gl.disableVertexAttribArray(prog.attributes.position);\n }\n\n /**\n * Handle resize\n */\n resize(): void {\n const rect = this.canvas.getBoundingClientRect();\n const width = rect.width * this.dpr;\n const height = rect.height * this.dpr;\n\n if (this.canvas.width !== width || this.canvas.height !== height) {\n this.canvas.width = width;\n this.canvas.height = height;\n this.gl.viewport(0, 0, width, height);\n }\n }\n\n /**\n * Get WebGL limits (for debugging)\n */\n getLimits() {\n const { gl } = this;\n return {\n maxTextureSize: gl.getParameter(gl.MAX_TEXTURE_SIZE),\n maxViewportDims: gl.getParameter(gl.MAX_VIEWPORT_DIMS),\n renderer: gl.getParameter(gl.RENDERER),\n vendor: gl.getParameter(gl.VENDOR),\n };\n }\n\n /**\n * Destroy and cleanup\n */\n destroy(): void {\n const { gl } = this;\n\n // Destroy all buffers\n this.buffers.forEach((buffer) => gl.deleteBuffer(buffer));\n this.buffers.clear();\n this.bufferSizes.clear();\n\n // Destroy programs\n gl.deleteProgram(this.lineProgram.program);\n gl.deleteProgram(this.pointProgram.program);\n\n this.isInitialized = false;\n console.log(\"[NativeWebGL] Destroyed\");\n }\n}\n\n// ============================================\n// Utility: Parse Color\n// ============================================\n\nexport function parseColor(color: string): [number, number, number, number] {\n if (color.startsWith(\"#\")) {\n const hex = color.slice(1);\n if (hex.length === 3) {\n const r = parseInt(hex[0] + hex[0], 16) / 255;\n const g = parseInt(hex[1] + hex[1], 16) / 255;\n const b = parseInt(hex[2] + hex[2], 16) / 255;\n return [r, g, b, 1];\n } else if (hex.length === 6) {\n const r = parseInt(hex.slice(0, 2), 16) / 255;\n const g = parseInt(hex.slice(2, 4), 16) / 255;\n const b = parseInt(hex.slice(4, 6), 16) / 255;\n return [r, g, b, 1];\n } else if (hex.length === 8) {\n const r = parseInt(hex.slice(0, 2), 16) / 255;\n const g = parseInt(hex.slice(2, 4), 16) / 255;\n const b = parseInt(hex.slice(4, 6), 16) / 255;\n const a = parseInt(hex.slice(6, 8), 16) / 255;\n return [r, g, b, a];\n }\n }\n\n // Default: magenta for visibility\n return [1, 0, 1, 1];\n}\n\n// ============================================\n// Utility: Interleave Data\n// ============================================\n\nexport function interleaveData(\n x: Float32Array | Float64Array | number[],\n y: Float32Array | Float64Array | number[]\n): Float32Array {\n const length = Math.min(x.length, y.length);\n const result = new Float32Array(length * 2);\n\n for (let i = 0; i < length; i++) {\n result[i * 2] = x[i];\n result[i * 2 + 1] = y[i];\n }\n\n return result;\n}\n","/**\n * Scale interface and implementations\n *\n * Scales transform data values to pixel coordinates and vice versa.\n */\n\nexport interface Scale {\n /** Data domain [min, max] */\n domain: [number, number];\n /** Pixel range [min, max] */\n range: [number, number];\n /** Scale type identifier */\n type: \"linear\" | \"log\";\n\n /** Set the domain */\n setDomain(min: number, max: number): void;\n /** Set the range */\n setRange(min: number, max: number): void;\n\n /** Transform data value to pixel */\n transform(value: number): number;\n /** Transform pixel to data value */\n invert(pixel: number): number;\n\n /** Generate nice tick values */\n ticks(count?: number): number[];\n}\n\n/**\n * Linear scale - proportional mapping\n */\nexport class LinearScale implements Scale {\n public domain: [number, number] = [0, 1];\n public range: [number, number] = [0, 100];\n public readonly type = \"linear\" as const;\n\n setDomain(min: number, max: number): void {\n // Ensure we have a valid, non-zero range\n if (!isFinite(min) || !isFinite(max)) {\n this.domain = [0, 1];\n return;\n }\n if (min === max) {\n this.domain = [min - 0.5, max + 0.5];\n return;\n }\n this.domain = [min, max];\n }\n\n setRange(min: number, max: number): void {\n this.range = [min, max];\n }\n\n transform(value: number): number {\n const [d0, d1] = this.domain;\n const [r0, r1] = this.range;\n const normalized = (value - d0) / (d1 - d0);\n return r0 + normalized * (r1 - r0);\n }\n\n invert(pixel: number): number {\n const [d0, d1] = this.domain;\n const [r0, r1] = this.range;\n const normalized = (pixel - r0) / (r1 - r0);\n return d0 + normalized * (d1 - d0);\n }\n\n ticks(count = 10): number[] {\n const [min, max] = this.domain;\n if (!isFinite(min) || !isFinite(max) || min === max) return [];\n\n const step = niceStep(min, max, count);\n const start = Math.ceil(min / step) * step;\n const ticks: number[] = [];\n\n // Limit ticks to prevent infinite loops or performance issues\n const maxTicks = 100;\n let t = start;\n while (t <= max + step * 0.5 && ticks.length < maxTicks) {\n ticks.push(Math.round(t * 1e12) / 1e12); // Fix floating point\n t += step;\n }\n\n return ticks;\n }\n}\n\n/**\n * Logarithmic scale - for exponential data\n */\nexport class LogScale implements Scale {\n public domain: [number, number] = [1, 1000];\n public range: [number, number] = [0, 100];\n public readonly type = \"log\" as const;\n\n private base = 10;\n\n setDomain(min: number, max: number): void {\n // Log scale requires positive values and non-zero range\n const safeMin = Math.max(min, 1e-12);\n const safeMax = Math.max(max, 1e-12 * 10);\n\n if (safeMin === safeMax) {\n this.domain = [safeMin / 10, safeMax * 10];\n return;\n }\n this.domain = [safeMin, safeMax];\n }\n\n setRange(min: number, max: number): void {\n this.range = [min, max];\n }\n\n transform(value: number): number {\n const [d0, d1] = this.domain;\n const [r0, r1] = this.range;\n\n if (value <= 0) return r0; // Handle invalid values\n\n const logMin = Math.log(d0) / Math.log(this.base);\n const logMax = Math.log(d1) / Math.log(this.base);\n const logVal = Math.log(value) / Math.log(this.base);\n\n const normalized = (logVal - logMin) / (logMax - logMin);\n return r0 + normalized * (r1 - r0);\n }\n\n invert(pixel: number): number {\n const [d0, d1] = this.domain;\n const [r0, r1] = this.range;\n\n const logMin = Math.log(d0) / Math.log(this.base);\n const logMax = Math.log(d1) / Math.log(this.base);\n\n const normalized = (pixel - r0) / (r1 - r0);\n const logVal = logMin + normalized * (logMax - logMin);\n\n return Math.pow(this.base, logVal);\n }\n\n ticks(count = 10): number[] {\n const [min, max] = this.domain;\n const logMin = Math.floor(Math.log10(min));\n const logMax = Math.ceil(Math.log10(max));\n const ticks: number[] = [];\n\n for (let p = logMin; p <= logMax && ticks.length < count; p++) {\n const value = Math.pow(10, p);\n if (value >= min && value <= max) {\n ticks.push(value);\n }\n }\n\n return ticks;\n }\n}\n\n// ============================================\n// Helpers\n// ============================================\n\n/**\n * Calculate a \"nice\" step size for tick marks\n */\nfunction niceStep(min: number, max: number, count: number): number {\n const range = max - min;\n if (range <= 0 || !isFinite(range)) return 1;\n\n const rawStep = range / count;\n const magnitude = Math.pow(10, Math.floor(Math.log10(rawStep)));\n const normalized = rawStep / magnitude;\n\n let niceNormalized: number;\n if (normalized < 1.5) {\n niceNormalized = 1;\n } else if (normalized < 3) {\n niceNormalized = 2;\n } else if (normalized < 7) {\n niceNormalized = 5;\n } else {\n niceNormalized = 10;\n }\n\n return niceNormalized * magnitude;\n}\n\n/**\n * Factory function to create scale by type\n */\nexport function createScale(type: \"linear\" | \"log\"): Scale {\n return type === \"log\" ? new LogScale() : new LinearScale();\n}\n","/**\n * Theme - Visual styling configuration for SciChart\n *\n * Provides customizable themes for the chart including:\n * - Grid styling\n * - Axis styling\n * - Legend styling\n * - Cursor styling\n */\n\n// ============================================\n// Theme Types\n// ============================================\n\nexport interface GridTheme {\n /** Grid visibility */\n visible: boolean;\n /** Major grid line color */\n majorColor: string;\n /** Minor grid line color */\n minorColor: string;\n /** Major grid line width */\n majorWidth: number;\n /** Minor grid line width */\n minorWidth: number;\n /** Line dash pattern for major lines [dash, gap] */\n majorDash: number[];\n /** Line dash pattern for minor lines [dash, gap] */\n minorDash: number[];\n /** Show minor grid lines */\n showMinor: boolean;\n /** Number of minor divisions between major lines */\n minorDivisions: number;\n}\n\nexport interface AxisTheme {\n /** Axis line color */\n lineColor: string;\n /** Axis line width */\n lineWidth: number;\n /** Tick mark color */\n tickColor: string;\n /** Tick mark length */\n tickLength: number;\n /** Label color */\n labelColor: string;\n /** Label font size */\n labelSize: number;\n /** Axis title color */\n titleColor: string;\n /** Axis title font size */\n titleSize: number;\n /** Font family */\n fontFamily: string;\n}\n\nexport interface LegendTheme {\n /** Legend visibility */\n visible: boolean;\n /** Position */\n position: \"top-left\" | \"top-right\" | \"bottom-left\" | \"bottom-right\";\n /** Background color */\n backgroundColor: string;\n /** Border color */\n borderColor: string;\n /** Border radius */\n borderRadius: number;\n /** Text color */\n textColor: string;\n /** Font size */\n fontSize: number;\n /** Font family */\n fontFamily: string;\n /** Padding inside legend */\n padding: number;\n /** Gap between items */\n itemGap: number;\n /** Color swatch size */\n swatchSize: number;\n}\n\nexport interface CursorTheme {\n /** Cursor line color */\n lineColor: string;\n /** Cursor line width */\n lineWidth: number;\n /** Cursor line dash pattern */\n lineDash: number[];\n /** Tooltip background color */\n tooltipBackground: string;\n /** Tooltip border color */\n tooltipBorder: string;\n /** Tooltip text color */\n tooltipColor: string;\n /** Tooltip font size */\n tooltipSize: number;\n}\n\nexport interface ChartTheme {\n /** Theme name */\n name: string;\n /** Background color */\n backgroundColor: string;\n /** Plot area border color */\n plotBorderColor: string;\n /** Grid theme */\n grid: GridTheme;\n /** X-axis theme */\n xAxis: AxisTheme;\n /** Y-axis theme */\n yAxis: AxisTheme;\n /** Legend theme */\n legend: LegendTheme;\n /** Cursor theme */\n cursor: CursorTheme;\n}\n\n// ============================================\n// Default Themes\n// ============================================\n\nconst DEFAULT_AXIS_THEME: AxisTheme = {\n lineColor: \"#666666\", // Brighter\n lineWidth: 1,\n tickColor: \"#888888\", // Brighter\n tickLength: 6,\n labelColor: \"#cccccc\", // Brighter\n labelSize: 12, // Larger\n titleColor: \"#ffffff\", // Brighter\n titleSize: 14, // Larger\n fontFamily: \"Inter, system-ui, sans-serif\",\n};\n\nconst DEFAULT_GRID_THEME: GridTheme = {\n visible: true,\n majorColor: \"rgba(255, 255, 255, 0.12)\", // Higher opacity\n minorColor: \"rgba(255, 255, 255, 0.05)\",\n majorWidth: 1,\n minorWidth: 0.5,\n majorDash: [4, 4],\n minorDash: [2, 4],\n showMinor: true, // Default to show minor\n minorDivisions: 5,\n};\n\nconst DEFAULT_LEGEND_THEME: LegendTheme = {\n visible: true,\n position: \"top-right\",\n backgroundColor: \"rgba(20, 20, 30, 0.9)\",\n borderColor: \"rgba(255, 255, 255, 0.15)\",\n borderRadius: 6,\n textColor: \"#ffffff\",\n fontSize: 11,\n fontFamily: \"Inter, system-ui, sans-serif\",\n padding: 10,\n itemGap: 6,\n swatchSize: 12,\n};\n\nconst DEFAULT_CURSOR_THEME: CursorTheme = {\n lineColor: \"rgba(255, 255, 255, 0.5)\",\n lineWidth: 1,\n lineDash: [5, 5],\n tooltipBackground: \"rgba(20, 20, 30, 0.95)\",\n tooltipBorder: \"rgba(255, 255, 255, 0.2)\",\n tooltipColor: \"#ffffff\",\n tooltipSize: 11,\n};\n\n// ============================================\n// Preset Themes\n// ============================================\n\nexport const DARK_THEME: ChartTheme = {\n name: \"dark\",\n backgroundColor: \"#0b0e14\",\n plotBorderColor: \"#444c56\",\n grid: {\n ...DEFAULT_GRID_THEME,\n majorColor: \"rgba(255, 255, 255, 0.12)\",\n minorColor: \"rgba(255, 255, 255, 0.04)\",\n },\n xAxis: {\n ...DEFAULT_AXIS_THEME,\n labelColor: \"#adbac7\",\n titleColor: \"#cdd9e5\",\n lineColor: \"#444c56\",\n tickColor: \"#444c56\",\n },\n yAxis: {\n ...DEFAULT_AXIS_THEME,\n labelColor: \"#adbac7\",\n titleColor: \"#cdd9e5\",\n lineColor: \"#444c56\",\n tickColor: \"#444c56\",\n },\n legend: DEFAULT_LEGEND_THEME,\n cursor: DEFAULT_CURSOR_THEME,\n};\n\nexport const MIDNIGHT_THEME: ChartTheme = {\n name: \"midnight\",\n backgroundColor: \"#05050a\",\n plotBorderColor: \"#3a3a5a\",\n grid: {\n ...DEFAULT_GRID_THEME,\n majorColor: \"rgba(150, 150, 255, 0.2)\",\n minorColor: \"rgba(150, 150, 255, 0.08)\",\n },\n xAxis: {\n ...DEFAULT_AXIS_THEME,\n lineColor: \"#5a5a8a\",\n labelColor: \"#b0b0e0\",\n titleColor: \"#d0d0f0\",\n tickColor: \"#5a5a8a\",\n },\n yAxis: {\n ...DEFAULT_AXIS_THEME,\n lineColor: \"#5a5a8a\",\n labelColor: \"#b0b0e0\",\n titleColor: \"#d0d0f0\",\n tickColor: \"#5a5a8a\",\n },\n legend: {\n ...DEFAULT_LEGEND_THEME,\n backgroundColor: \"rgba(15, 15, 30, 0.95)\",\n borderColor: \"rgba(100, 100, 255, 0.4)\",\n },\n cursor: {\n ...DEFAULT_CURSOR_THEME,\n lineColor: \"rgba(150, 150, 255, 0.7)\",\n },\n};\n\n/** Light theme - Clean white background */\nexport const LIGHT_THEME: ChartTheme = {\n name: \"light\",\n backgroundColor: \"#ffffff\",\n plotBorderColor: \"#cccccc\",\n grid: {\n ...DEFAULT_GRID_THEME,\n majorColor: \"rgba(0, 0, 0, 0.1)\",\n minorColor: \"rgba(0, 0, 0, 0.04)\",\n },\n xAxis: {\n ...DEFAULT_AXIS_THEME,\n lineColor: \"#888888\",\n tickColor: \"#888888\",\n labelColor: \"#444444\",\n titleColor: \"#222222\",\n },\n yAxis: {\n ...DEFAULT_AXIS_THEME,\n lineColor: \"#888888\",\n tickColor: \"#888888\",\n labelColor: \"#444444\",\n titleColor: \"#222222\",\n },\n legend: {\n ...DEFAULT_LEGEND_THEME,\n backgroundColor: \"rgba(255, 255, 255, 0.95)\",\n borderColor: \"rgba(0, 0, 0, 0.15)\",\n textColor: \"#222222\",\n },\n cursor: {\n ...DEFAULT_CURSOR_THEME,\n lineColor: \"rgba(0, 0, 0, 0.4)\",\n tooltipBackground: \"rgba(50, 50, 60, 0.95)\",\n },\n};\n\n/** Electrochemistry theme - Professional blue tones */\nexport const ELECTROCHEM_THEME: ChartTheme = {\n name: \"electrochemistry\",\n backgroundColor: \"#0a1628\",\n plotBorderColor: \"#1e3a5f\",\n grid: {\n ...DEFAULT_GRID_THEME,\n majorColor: \"rgba(30, 136, 229, 0.15)\",\n minorColor: \"rgba(30, 136, 229, 0.06)\",\n showMinor: true,\n minorDivisions: 2,\n },\n xAxis: {\n ...DEFAULT_AXIS_THEME,\n lineColor: \"#1e88e5\",\n tickColor: \"#42a5f5\",\n labelColor: \"#90caf9\",\n titleColor: \"#bbdefb\",\n },\n yAxis: {\n ...DEFAULT_AXIS_THEME,\n lineColor: \"#1e88e5\",\n tickColor: \"#42a5f5\",\n labelColor: \"#90caf9\",\n titleColor: \"#bbdefb\",\n },\n legend: {\n ...DEFAULT_LEGEND_THEME,\n backgroundColor: \"rgba(10, 22, 40, 0.95)\",\n borderColor: \"rgba(30, 136, 229, 0.3)\",\n },\n cursor: {\n ...DEFAULT_CURSOR_THEME,\n lineColor: \"rgba(100, 180, 255, 0.6)\",\n },\n};\n\n// ============================================\n// Theme Utilities\n// ============================================\n\n/**\n * Create a custom theme by merging with base theme\n */\nexport function createTheme(\n base: ChartTheme,\n overrides: Partial<ChartTheme>\n): ChartTheme {\n return {\n ...base,\n ...overrides,\n grid: { ...base.grid, ...overrides.grid },\n xAxis: { ...base.xAxis, ...overrides.xAxis },\n yAxis: { ...base.yAxis, ...overrides.yAxis },\n legend: { ...base.legend, ...overrides.legend },\n cursor: { ...base.cursor, ...overrides.cursor },\n };\n}\n\n/**\n * Get a theme by name\n */\nexport function getThemeByName(name: string): ChartTheme {\n switch (name) {\n case \"dark\":\n return DARK_THEME;\n case \"midnight\":\n return MIDNIGHT_THEME;\n case \"light\":\n return LIGHT_THEME;\n case \"electrochemistry\":\n case \"electrochem\":\n return ELECTROCHEM_THEME;\n default:\n console.warn(`[Theme] Unknown theme \"${name}\", using dark`);\n return DARK_THEME;\n }\n}\n\n/** Default theme export */\nexport const DEFAULT_THEME = DARK_THEME;\n","/**\n * OverlayRenderer - Canvas 2D rendering for axes, grid, legend, and cursor\n *\n * This module handles all 2D overlay rendering on top of the WebGL canvas.\n * It uses the theme system for consistent styling.\n */\n\nimport type { Scale } from \"../scales\";\nimport type { ChartTheme } from \"../theme\";\nimport type { Series } from \"./Series\";\n\n// ============================================\n// Types\n// ============================================\n\nexport interface PlotArea {\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\nexport interface AxisLabels {\n x?: string;\n y?: string;\n}\n\nexport interface CursorState {\n enabled: boolean;\n x: number;\n y: number;\n crosshair: boolean;\n tooltipText?: string;\n}\n\n// ============================================\n// Overlay Renderer Class\n// ============================================\n\nexport class OverlayRenderer {\n private ctx: CanvasRenderingContext2D;\n private theme: ChartTheme;\n\n constructor(ctx: CanvasRenderingContext2D, theme: ChartTheme) {\n this.ctx = ctx;\n this.theme = theme;\n }\n\n /**\n * Update the theme\n */\n setTheme(theme: ChartTheme): void {\n this.theme = theme;\n }\n\n /**\n * Clear the overlay\n */\n clear(width: number, height: number): void {\n this.ctx.clearRect(0, 0, width, height);\n }\n\n /**\n * Draw the grid\n */\n drawGrid(plotArea: PlotArea, xScale: Scale, yScale: Scale): void {\n if (!this.theme.grid.visible) return;\n\n const { ctx } = this;\n const grid = this.theme.grid;\n\n const xTicks = xScale.ticks(8);\n const yTicks = yScale.ticks(6);\n\n // Major grid lines\n ctx.strokeStyle = grid.majorColor;\n ctx.lineWidth = grid.majorWidth;\n ctx.setLineDash(grid.majorDash);\n\n // Vertical lines (X ticks)\n xTicks.forEach((tick) => {\n const x = xScale.transform(tick);\n if (x >= plotArea.x && x <= plotArea.x + plotArea.width) {\n ctx.beginPath();\n ctx.moveTo(x, plotArea.y);\n ctx.lineTo(x, plotArea.y + plotArea.height);\n ctx.stroke();\n }\n });\n\n // Horizontal lines (Y ticks)\n yTicks.forEach((tick) => {\n const y = yScale.transform(tick);\n if (y >= plotArea.y && y <= plotArea.y + plotArea.height) {\n ctx.beginPath();\n ctx.moveTo(plotArea.x, y);\n ctx.lineTo(plotArea.x + plotArea.width, y);\n ctx.stroke();\n }\n });\n\n // Minor grid lines (if enabled)\n if (grid.showMinor) {\n ctx.strokeStyle = grid.minorColor;\n ctx.lineWidth = grid.minorWidth;\n ctx.setLineDash(grid.minorDash);\n\n // Generate minor ticks between major ticks\n const minorXTicks = this.generateMinorTicks(xTicks, grid.minorDivisions);\n const minorYTicks = this.generateMinorTicks(yTicks, grid.minorDivisions);\n\n minorXTicks.forEach((tick) => {\n const x = xScale.transform(tick);\n if (x >= plotArea.x && x <= plotArea.x + plotArea.width) {\n ctx.beginPath();\n ctx.moveTo(x, plotArea.y);\n ctx.lineTo(x, plotArea.y + plotArea.height);\n ctx.stroke();\n }\n });\n\n minorYTicks.forEach((tick) => {\n const y = yScale.transform(tick);\n if (y >= plotArea.y && y <= plotArea.y + plotArea.height) {\n ctx.beginPath();\n ctx.moveTo(plotArea.x, y);\n ctx.lineTo(plotArea.x + plotArea.width, y);\n ctx.stroke();\n }\n });\n }\n\n ctx.setLineDash([]);\n }\n\n /**\n * Draw X axis with ticks and labels\n */\n drawXAxis(plotArea: PlotArea, xScale: Scale, label?: string): void {\n const { ctx } = this;\n const axis = this.theme.xAxis;\n const xTicks = xScale.ticks(8);\n const axisY = plotArea.y + plotArea.height;\n\n // Axis line\n ctx.strokeStyle = axis.lineColor;\n ctx.lineWidth = axis.lineWidth;\n ctx.beginPath();\n ctx.moveTo(plotArea.x, axisY);\n ctx.lineTo(plotArea.x + plotArea.width, axisY);\n ctx.stroke();\n\n // Ticks and labels\n ctx.fillStyle = axis.labelColor;\n ctx.font = `${axis.labelSize}px ${axis.fontFamily}`;\n ctx.textAlign = \"center\";\n ctx.textBaseline = \"top\";\n\n xTicks.forEach((tick) => {\n const x = xScale.transform(tick);\n\n if (x >= plotArea.x && x <= plotArea.x + plotArea.width) {\n // Tick mark\n ctx.strokeStyle = axis.tickColor;\n ctx.beginPath();\n ctx.moveTo(x, axisY);\n ctx.lineTo(x, axisY + axis.tickLength);\n ctx.stroke();\n\n // Label\n ctx.fillText(this.formatXTick(tick), x, axisY + axis.tickLength + 3);\n }\n });\n\n // Axis title\n if (label) {\n ctx.fillStyle = axis.titleColor;\n ctx.font = `${axis.titleSize}px ${axis.fontFamily}`;\n ctx.textAlign = \"center\";\n ctx.textBaseline = \"bottom\";\n ctx.fillText(\n label,\n plotArea.x + plotArea.width / 2,\n plotArea.y + plotArea.height + 45\n );\n }\n }\n\n /**\n * Draw Y axis with ticks and labels\n */\n drawYAxis(plotArea: PlotArea, yScale: Scale, label?: string): void {\n const { ctx } = this;\n const axis = this.theme.yAxis;\n const yTicks = yScale.ticks(6);\n const axisX = plotArea.x;\n\n // Axis line\n ctx.strokeStyle = axis.lineColor;\n ctx.lineWidth = axis.lineWidth;\n ctx.beginPath();\n ctx.moveTo(axisX, plotArea.y);\n ctx.lineTo(axisX, plotArea.y + plotArea.height);\n ctx.stroke();\n\n // Ticks and labels\n ctx.fillStyle = axis.labelColor;\n ctx.font = `${axis.labelSize}px ${axis.fontFamily}`;\n ctx.textAlign = \"right\";\n ctx.textBaseline = \"middle\";\n\n yTicks.forEach((tick) => {\n const y = yScale.transform(tick);\n\n if (y >= plotArea.y && y <= plotArea.y + plotArea.height) {\n // Tick mark\n ctx.strokeStyle = axis.tickColor;\n ctx.beginPath();\n ctx.moveTo(axisX, y);\n ctx.lineTo(axisX - axis.tickLength, y);\n ctx.stroke();\n\n // Label\n ctx.fillText(this.formatYTick(tick), axisX - axis.tickLength - 3, y);\n }\n });\n\n // Axis title\n if (label) {\n ctx.save();\n ctx.fillStyle = axis.titleColor;\n ctx.font = `${axis.titleSize}px ${axis.fontFamily}`;\n ctx.textAlign = \"center\";\n ctx.textBaseline = \"top\";\n ctx.translate(15, plotArea.y + plotArea.height / 2);\n ctx.rotate(-Math.PI / 2);\n ctx.fillText(label, 0, 0);\n ctx.restore();\n }\n }\n\n /**\n * Draw plot area border\n */\n drawPlotBorder(plotArea: PlotArea): void {\n const { ctx } = this;\n ctx.strokeStyle = this.theme.plotBorderColor;\n ctx.lineWidth = 1;\n ctx.strokeRect(plotArea.x, plotArea.y, plotArea.width, plotArea.height);\n }\n\n /**\n * Draw legend\n */\n drawLegend(plotArea: PlotArea, series: Series[]): void {\n if (series.length === 0) return;\n\n const { ctx } = this;\n const legend = this.theme.legend;\n\n // Calculate legend dimensions\n ctx.font = `${legend.fontSize}px ${legend.fontFamily}`;\n let maxWidth = 0;\n const items = series.map((s) => {\n const label = s.getId();\n const width = ctx.measureText(label).width;\n maxWidth = Math.max(maxWidth, width);\n return { id: s.getId(), color: s.getStyle().color ?? \"#ff0055\", label };\n });\n\n const boxWidth = legend.swatchSize + 8 + maxWidth + legend.padding * 2;\n const boxHeight =\n items.length * (legend.swatchSize + legend.itemGap) -\n legend.itemGap +\n legend.padding * 2;\n\n // Calculate position\n let x: number, y: number;\n switch (legend.position) {\n case \"top-left\":\n x = plotArea.x + 10;\n y = plotArea.y + 10;\n break;\n case \"bottom-left\":\n x = plotArea.x + 10;\n y = plotArea.y + 10;\n break;\n case \"bottom-right\":\n x = plotArea.x + plotArea.width - boxWidth - 10;\n y = plotArea.y + plotArea.height - boxHeight - 10;\n break;\n case \"top-right\":\n default:\n x = plotArea.x + plotArea.width - boxWidth - 10;\n y = plotArea.y + 10;\n break;\n }\n\n // Draw background\n ctx.fillStyle = legend.backgroundColor;\n ctx.strokeStyle = legend.borderColor;\n ctx.lineWidth = 1;\n ctx.beginPath();\n const r = legend.borderRadius;\n ctx.moveTo(x + r, y);\n ctx.lineTo(x + boxWidth - r, y);\n ctx.arcTo(x + boxWidth, y, x + boxWidth, y + r, r);\n ctx.lineTo(x + boxWidth, y + boxHeight - r);\n ctx.arcTo(x + boxWidth, y + boxHeight, x + boxWidth - r, y + boxHeight, r);\n ctx.lineTo(x + r, y + boxHeight);\n ctx.arcTo(x, y + boxHeight, x, y + boxHeight - r, r);\n ctx.lineTo(x, y + r);\n ctx.arcTo(x, y, x + r, y, r);\n ctx.closePath();\n ctx.fill();\n ctx.stroke();\n\n // Draw items\n ctx.textAlign = \"left\";\n ctx.textBaseline = \"middle\";\n\n items.forEach((item, i) => {\n const itemY =\n y + legend.padding + i * (legend.swatchSize + legend.itemGap);\n\n // Color swatch\n ctx.fillStyle = item.color;\n ctx.fillRect(\n x + legend.padding,\n itemY,\n legend.swatchSize,\n legend.swatchSize\n );\n\n // Label\n ctx.fillStyle = legend.textColor;\n ctx.fillText(\n item.label,\n x + legend.padding + legend.swatchSize + 8,\n itemY + legend.swatchSize / 2\n );\n });\n }\n\n /**\n * Draw cursor/crosshair\n */\n drawCursor(plotArea: PlotArea, cursor: CursorState): void {\n if (!cursor.enabled) return;\n\n const { ctx } = this;\n const cursorTheme = this.theme.cursor;\n\n // Check if cursor is in plot area\n if (\n cursor.x < plotArea.x ||\n cursor.x > plotArea.x + plotArea.width ||\n cursor.y < plotArea.y ||\n cursor.y > plotArea.y + plotArea.height\n ) {\n return;\n }\n\n ctx.save();\n\n // Clip to plot area\n ctx.beginPath();\n ctx.rect(plotArea.x, plotArea.y, plotArea.width, plotArea.height);\n ctx.clip();\n\n // Crosshair style\n ctx.strokeStyle = cursorTheme.lineColor;\n ctx.lineWidth = cursorTheme.lineWidth;\n ctx.setLineDash(cursorTheme.lineDash);\n\n if (cursor.crosshair) {\n // Vertical line\n ctx.beginPath();\n ctx.moveTo(cursor.x, plotArea.y);\n ctx.lineTo(cursor.x, plotArea.y + plotArea.height);\n ctx.stroke();\n\n // Horizontal line\n ctx.beginPath();\n ctx.moveTo(plotArea.x, cursor.y);\n ctx.lineTo(plotArea.x + plotArea.width, cursor.y);\n ctx.stroke();\n } else {\n // Just vertical line\n ctx.beginPath();\n ctx.moveTo(cursor.x, plotArea.y);\n ctx.lineTo(cursor.x, plotArea.y + plotArea.height);\n ctx.stroke();\n }\n\n ctx.restore();\n\n // Draw tooltip\n if (cursor.tooltipText) {\n this.drawTooltip(cursor.x, cursor.y, cursor.tooltipText, plotArea);\n }\n }\n\n /**\n * Draw tooltip\n */\n private drawTooltip(\n x: number,\n y: number,\n text: string,\n plotArea: PlotArea\n ): void {\n const { ctx } = this;\n const cursor = this.theme.cursor;\n const lines = text.split(\"\\n\");\n const lineHeight = cursor.tooltipSize + 5;\n const padding = 8;\n\n ctx.font = `${cursor.tooltipSize}px ${this.theme.xAxis.fontFamily}`;\n let maxWidth = 0;\n lines.forEach((line) => {\n maxWidth = Math.max(maxWidth, ctx.measureText(line).width);\n });\n\n const boxWidth = maxWidth + padding * 2;\n const boxHeight = lines.length * lineHeight + padding * 2 - 5;\n\n // Position tooltip\n let tooltipX = x + 15;\n let tooltipY = y - boxHeight - 10;\n\n if (tooltipX + boxWidth > plotArea.x + plotArea.width) {\n tooltipX = x - boxWidth - 15;\n }\n if (tooltipY < plotArea.y) {\n tooltipY = y + 15;\n }\n\n // Background\n ctx.fillStyle = cursor.tooltipBackground;\n ctx.strokeStyle = cursor.tooltipBorder;\n ctx.lineWidth = 1;\n ctx.beginPath();\n const r = 4;\n ctx.moveTo(tooltipX + r, tooltipY);\n ctx.lineTo(tooltipX + boxWidth - r, tooltipY);\n ctx.arcTo(tooltipX + boxWidth, tooltipY, tooltipX + boxWidth, tooltipY + r, r);\n ctx.lineTo(tooltipX + boxWidth, tooltipY + boxHeight - r);\n ctx.arcTo(tooltipX + boxWidth, tooltipY + boxHeight, tooltipX + boxWidth - r, tooltipY + boxHeight, r);\n ctx.lineTo(tooltipX + r, tooltipY + boxHeight);\n ctx.arcTo(tooltipX, tooltipY + boxHeight, tooltipX, tooltipY + boxHeight - r, r);\n ctx.lineTo(tooltipX, tooltipY + r);\n ctx.arcTo(tooltipX, tooltipY, tooltipX + r, tooltipY, r);\n ctx.closePath();\n ctx.fill();\n ctx.stroke();\n\n // Text\n ctx.fillStyle = cursor.tooltipColor;\n ctx.textAlign = \"left\";\n ctx.textBaseline = \"top\";\n lines.forEach((line, i) => {\n ctx.fillText(\n line,\n tooltipX + padding,\n tooltipY + padding + i * lineHeight\n );\n });\n }\n\n /**\n * Draw selection rectangle (Box Zoom)\n */\n drawSelectionRect(rect: {\n x: number;\n y: number;\n width: number;\n height: number;\n }): void {\n const { ctx } = this;\n const isDark =\n this.theme.name.toLowerCase().includes(\"dark\") ||\n this.theme.name.toLowerCase().includes(\"midnight\");\n\n ctx.save();\n ctx.fillStyle = isDark\n ? \"rgba(0, 170, 255, 0.15)\"\n : \"rgba(0, 100, 255, 0.1)\";\n ctx.strokeStyle = \"#00aaff\";\n ctx.lineWidth = 1;\n ctx.setLineDash([5, 5]);\n\n ctx.beginPath();\n ctx.rect(rect.x, rect.y, rect.width, rect.height);\n ctx.fill();\n ctx.stroke();\n ctx.restore();\n }\n\n // ----------------------------------------\n // Helper Methods\n // ----------------------------------------\n\n private generateMinorTicks(\n majorTicks: number[],\n divisions: number\n ): number[] {\n if (majorTicks.length < 2) return [];\n\n const minor: number[] = [];\n for (let i = 0; i < majorTicks.length - 1; i++) {\n const step = (majorTicks[i + 1] - majorTicks[i]) / divisions;\n for (let j = 1; j < divisions; j++) {\n minor.push(majorTicks[i] + step * j);\n }\n }\n return minor;\n }\n\n private formatXTick(value: number): string {\n if (Math.abs(value) < 0.001 && value !== 0) {\n return this.toScientificUnicode(value, 1);\n }\n return value.toFixed(3).replace(/\\.?0+$/, \"\");\n }\n\n private formatYTick(value: number): string {\n if (value === 0) return \"0\";\n const absVal = Math.abs(value);\n if (absVal < 0.0001 || absVal >= 10000) {\n return this.toScientificUnicode(value, 1);\n }\n return value.toPrecision(3);\n }\n\n private toScientificUnicode(value: number, precision: number): string {\n const str = value.toExponential(precision);\n const [mantissa, exponent] = str.split(\"e\");\n\n // Convert exponent to unicode superscripts\n const superscriptMap: Record<string, string> = {\n \"0\": \"⁰\",\n \"1\": \"¹\",\n \"2\": \"²\",\n \"3\": \"³\",\n \"4\": \"⁴\",\n \"5\": \"⁵\",\n \"6\": \"⁶\",\n \"7\": \"⁷\",\n \"8\": \"⁸\",\n \"9\": \"⁹\",\n \"-\": \"⁻\",\n \"+\": \"⁺\",\n };\n\n const unicodeExp = exponent.replace(\n /[0-9\\-+]/g,\n (char) => superscriptMap[char] || char\n );\n\n // Return \"1.2 × 10⁻⁵\" format\n return `${mantissa} × 10${unicodeExp}`;\n }\n}\n","/**\n * InteractionManager - Handles mouse, touch, and keyboard interactions\n *\n * This module manages all user interactions with the chart including:\n * - Zoom (mouse wheel)\n * - Pan (mouse drag, touch drag)\n * - Cursor tracking\n */\n\nimport type { Bounds } from \"../types\";\n\n// ============================================\n// Types\n// ============================================\n\nexport interface InteractionCallbacks {\n onZoom: (bounds: Bounds) => void;\n onPan: (deltaX: number, deltaY: number) => void;\n onBoxZoom: (\n rect: { x: number; y: number; width: number; height: number } | null\n ) => void;\n onCursorMove: (x: number, y: number) => void;\n onCursorLeave: () => void;\n}\n\nexport interface PlotAreaGetter {\n (): { x: number; y: number; width: number; height: number };\n}\n\nexport interface BoundsGetter {\n (): Bounds;\n}\n\n// ============================================\n// Interaction Manager Class\n// ============================================\n\nexport class InteractionManager {\n private container: HTMLElement;\n private callbacks: InteractionCallbacks;\n private getPlotArea: PlotAreaGetter;\n private getBounds: BoundsGetter;\n\n private isDragging = false;\n private isBoxSelecting = false;\n private selectionStart = { x: 0, y: 0 };\n private lastMousePos = { x: 0, y: 0 };\n private isPanMode = true;\n\n // Bound handlers for cleanup\n private boundWheel: (e: WheelEvent) => void;\n private boundMouseDown: (e: MouseEvent) => void;\n private boundMouseMove: (e: MouseEvent) => void;\n private boundMouseUp: (e: MouseEvent) => void;\n private boundMouseLeave: (e: MouseEvent) => void;\n private boundTouchStart: (e: TouchEvent) => void;\n private boundTouchMove: (e: TouchEvent) => void;\n private boundTouchEnd: (e: TouchEvent) => void;\n\n constructor(\n container: HTMLElement,\n callbacks: InteractionCallbacks,\n getPlotArea: PlotAreaGetter,\n getBounds: BoundsGetter\n ) {\n this.container = container;\n this.callbacks = callbacks;\n this.getPlotArea = getPlotArea;\n this.getBounds = getBounds;\n\n // Bind handlers\n this.boundWheel = this.handleWheel.bind(this);\n this.boundMouseDown = this.handleMouseDown.bind(this);\n this.boundMouseMove = this.handleMouseMove.bind(this);\n this.boundMouseUp = this.handleMouseUp.bind(this);\n this.boundMouseLeave = this.handleMouseLeave.bind(this);\n this.boundTouchStart = this.handleTouchStart.bind(this);\n this.boundTouchMove = this.handleTouchMove.bind(this);\n this.boundTouchEnd = this.handleTouchEnd.bind(this);\n\n this.attachListeners();\n }\n\n private attachListeners(): void {\n this.container.addEventListener(\"wheel\", this.boundWheel, {\n passive: false,\n });\n this.container.addEventListener(\"mousedown\", this.boundMouseDown);\n this.container.addEventListener(\"mousemove\", this.boundMouseMove);\n this.container.addEventListener(\"mouseup\", this.boundMouseUp);\n this.container.addEventListener(\"mouseleave\", this.boundMouseLeave);\n this.container.addEventListener(\"touchstart\", this.boundTouchStart);\n this.container.addEventListener(\"touchmove\", this.boundTouchMove);\n this.container.addEventListener(\"touchend\", this.boundTouchEnd);\n }\n\n private detachListeners(): void {\n this.container.removeEventListener(\"wheel\", this.boundWheel);\n this.container.removeEventListener(\"mousedown\", this.boundMouseDown);\n this.container.removeEventListener(\"mousemove\", this.boundMouseMove);\n this.container.removeEventListener(\"mouseup\", this.boundMouseUp);\n this.container.removeEventListener(\"mouseleave\", this.boundMouseLeave);\n this.container.removeEventListener(\"touchstart\", this.boundTouchStart);\n this.container.removeEventListener(\"touchmove\", this.boundTouchMove);\n this.container.removeEventListener(\"touchend\", this.boundTouchEnd);\n }\n\n public setPanMode(enabled: boolean): void {\n this.isPanMode = enabled;\n }\n\n // ----------------------------------------\n // Mouse Handlers\n // ----------------------------------------\n\n private handleWheel(e: WheelEvent): void {\n const plotArea = this.getPlotArea();\n if (plotArea.width <= 1 || plotArea.height <= 1) return;\n\n e.preventDefault();\n const rect = this.container.getBoundingClientRect();\n const mouseX = e.clientX - rect.left;\n const mouseY = e.clientY - rect.top;\n\n const bounds = this.getBounds();\n\n // Determine zoom targets\n let zoomX = false;\n let zoomY = false;\n\n // Y Axis area (left)\n if (\n mouseX < plotArea.x &&\n mouseY >= plotArea.y &&\n mouseY <= plotArea.y + plotArea.height\n ) {\n zoomY = true;\n }\n // X Axis area (bottom)\n else if (\n mouseY > plotArea.y + plotArea.height &&\n mouseX >= plotArea.x &&\n mouseX <= plotArea.x + plotArea.width\n ) {\n zoomX = true;\n }\n // Plot area (both)\n else if (\n mouseX >= plotArea.x &&\n mouseX <= plotArea.x + plotArea.width &&\n mouseY >= plotArea.y &&\n mouseY <= plotArea.y + plotArea.height\n ) {\n zoomX = true;\n zoomY = true;\n } else {\n return; // Outside interactive areas\n }\n\n const zoomFactor = e.deltaY > 0 ? 1.1 : 0.9;\n\n // Calculate zoom center in data coordinates\n const normalizedX = (mouseX - plotArea.x) / plotArea.width;\n const normalizedY = 1 - (mouseY - plotArea.y) / plotArea.height;\n\n const dataX = bounds.xMin + normalizedX * (bounds.xMax - bounds.xMin);\n const dataY = bounds.yMin + normalizedY * (bounds.yMax - bounds.yMin);\n\n // Safeguard: Prevent zooming out too far or in too deep\n // Limits\n const MIN_RANGE = 1e-12;\n const MAX_RANGE = 1e15;\n\n let nextXMin = zoomX\n ? dataX - (dataX - bounds.xMin) * zoomFactor\n : bounds.xMin;\n let nextXMax = zoomX\n ? dataX + (bounds.xMax - dataX) * zoomFactor\n : bounds.xMax;\n let nextYMin = zoomY\n ? dataY - (dataY - bounds.yMin) * zoomFactor\n : bounds.yMin;\n let nextYMax = zoomY\n ? dataY + (bounds.yMax - dataY) * zoomFactor\n : bounds.yMax;\n\n const nextXRange = nextXMax - nextXMin;\n const nextYRange = nextYMax - nextYMin;\n\n if (nextXRange < MIN_RANGE || nextXRange > MAX_RANGE) {\n nextXMin = bounds.xMin;\n nextXMax = bounds.xMax;\n }\n if (nextYRange < MIN_RANGE || nextYRange > MAX_RANGE) {\n nextYMin = bounds.yMin;\n nextYMax = bounds.yMax;\n }\n\n const newBounds: Bounds = {\n xMin: nextXMin,\n xMax: nextXMax,\n yMin: nextYMin,\n yMax: nextYMax,\n };\n\n this.callbacks.onZoom(newBounds);\n }\n\n private handleMouseDown(e: MouseEvent): void {\n const plotArea = this.getPlotArea();\n if (plotArea.width <= 1 || plotArea.height <= 1) return;\n\n const rect = this.container.getBoundingClientRect();\n const mouseX = e.clientX - rect.left;\n const mouseY = e.clientY - rect.top;\n\n // Check if mouse is in plot area\n if (\n mouseX >= plotArea.x &&\n mouseX <= plotArea.x + plotArea.width &&\n mouseY >= plotArea.y &&\n mouseY <= plotArea.y + plotArea.height\n ) {\n if (this.isPanMode) {\n this.isDragging = true;\n this.lastMousePos = { x: e.clientX, y: e.clientY };\n this.container.style.cursor = \"grabbing\";\n } else {\n this.isBoxSelecting = true;\n this.selectionStart = { x: mouseX, y: mouseY };\n this.container.style.cursor = \"crosshair\";\n }\n }\n }\n\n private handleMouseMove(e: MouseEvent): void {\n const rect = this.container.getBoundingClientRect();\n const mouseX = e.clientX - rect.left;\n const mouseY = e.clientY - rect.top;\n\n // Update cursor position\n this.callbacks.onCursorMove(mouseX, mouseY);\n\n if (this.isDragging) {\n const deltaX = e.clientX - this.lastMousePos.x;\n const deltaY = e.clientY - this.lastMousePos.y;\n this.callbacks.onPan(deltaX, deltaY);\n this.lastMousePos = { x: e.clientX, y: e.clientY };\n } else if (this.isBoxSelecting) {\n const x = Math.min(this.selectionStart.x, mouseX);\n const y = Math.min(this.selectionStart.y, mouseY);\n const width = Math.abs(mouseX - this.selectionStart.x);\n const height = Math.abs(mouseY - this.selectionStart.y);\n this.callbacks.onBoxZoom({ x, y, width, height });\n }\n }\n\n private handleMouseUp(): void {\n if (this.isBoxSelecting) {\n this.callbacks.onBoxZoom(null); // Signal to apply\n }\n this.isDragging = false;\n this.isBoxSelecting = false;\n this.container.style.cursor = \"\";\n }\n\n private handleMouseLeave(): void {\n this.isDragging = false;\n this.container.style.cursor = \"\";\n this.callbacks.onCursorLeave();\n }\n\n // ----------------------------------------\n // Touch Handlers\n // ----------------------------------------\n\n private handleTouchStart(e: TouchEvent): void {\n if (e.touches.length === 1) {\n const touch = e.touches[0];\n this.isDragging = true;\n this.lastMousePos = { x: touch.clientX, y: touch.clientY };\n }\n }\n\n private handleTouchMove(e: TouchEvent): void {\n if (!this.isDragging || e.touches.length !== 1) return;\n\n e.preventDefault();\n\n const touch = e.touches[0];\n const deltaX = touch.clientX - this.lastMousePos.x;\n const deltaY = touch.clientY - this.lastMousePos.y;\n\n this.callbacks.onPan(deltaX, deltaY);\n\n this.lastMousePos = { x: touch.clientX, y: touch.clientY };\n }\n\n private handleTouchEnd(): void {\n this.isDragging = false;\n }\n\n // ----------------------------------------\n // Cleanup\n // ----------------------------------------\n\n destroy(): void {\n this.detachListeners();\n }\n}\n","/**\n * ChartControls - In-chart control buttons (Plotly-style)\n *\n * Provides a floating glassmorphism toolbar for chart controls:\n * - Pan/Zoom mode toggle\n * - Reset Zoom\n * - Display Mode (Line, Scatter, Both)\n * - Smoothing toggle\n */\n\nimport { ChartTheme } from \"../theme\";\n\nexport interface ChartControlsCallbacks {\n onResetZoom: () => void;\n onSetType: (type: \"line\" | \"scatter\" | \"line+scatter\") => void;\n onToggleSmoothing: () => void;\n onTogglePan: (active: boolean) => void;\n onExport: () => void;\n onAutoScale: () => void;\n}\n\n// ============================================\n// SVG Icons (Plotly-inspired)\n// ============================================\n\nconst ICONS = {\n PAN: `<svg viewBox=\"0 0 24 24\" width=\"14\" height=\"14\" stroke=\"currentColor\" stroke-width=\"2\" fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M18 11V6a2 2 0 0 0-2-2v0a2 2 0 0 0-2 2v0\"></path><path d=\"M14 10V4a2 2 0 0 0-2-2v0a2 2 0 0 0-2 2v0\"></path><path d=\"M10 10.5V6a2 2 0 0 0-2-2v0a2 2 0 0 0-2 2v0\"></path><path d=\"M18 8a2 2 0 1 1 4 0v6a8 8 0 0 1-8 8h-2c-2.8 0-4.5-.86-5.99-2.34l-3.6-3.6a2 2 0 0 1 2.83-2.82L7 15\"></path></svg>`,\n RESET: `<svg viewBox=\"0 0 24 24\" width=\"14\" height=\"14\" stroke=\"currentColor\" stroke-width=\"2\" fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"23 4 23 10 17 10\"></polyline><polyline points=\"1 20 1 14 7 14\"></polyline><path d=\"M3.51 9a9 9 0 0 1 14.85-3.36L23 10M1 14l4.64 4.36A9 9 0 0 0 20.49 15\"></path></svg>`,\n LINE: `<svg viewBox=\"0 0 24 24\" width=\"14\" height=\"14\" stroke=\"currentColor\" stroke-width=\"2\" fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M3 3v18h18\"></path><path d=\"M18.7 8l-5.1 5.2-2.8-2.7L7 14.3\"></path></svg>`,\n SCATTER: `<svg viewBox=\"0 0 24 24\" width=\"14\" height=\"14\" fill=\"currentColor\"><circle cx=\"7\" cy=\"14\" r=\"2\"></circle><circle cx=\"11\" cy=\"10\" r=\"2\"></circle><circle cx=\"15\" cy=\"13\" r=\"2\"></circle><circle cx=\"19\" cy=\"8\" r=\"2\"></circle><path d=\"M3 3v18h18\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></path></svg>`,\n BOTH: `<svg viewBox=\"0 0 24 24\" width=\"14\" height=\"14\" stroke=\"currentColor\" stroke-width=\"2\" fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M3 3v18h18\"></path><path d=\"M18.7 8l-5.1 5.2-2.8-2.7L7 14.3\"></path><circle cx=\"7\" cy=\"14.3\" r=\"1\" fill=\"currentColor\"></circle><circle cx=\"10.8\" cy=\"10.5\" r=\"1\" fill=\"currentColor\"></circle><circle cx=\"13.6\" cy=\"13.2\" r=\"1\" fill=\"currentColor\"></circle><circle cx=\"18.7\" cy=\"8\" r=\"1\" fill=\"currentColor\"></circle></svg>`,\n SMOOTH: `<svg viewBox=\"0 0 24 24\" width=\"14\" height=\"14\" stroke=\"currentColor\" stroke-width=\"2\" fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M2 12c.5 0 .9-.3 1.2-.7l1.6-2.6c.3-.4.7-.7 1.2-.7h2c.5 0 .9.3 1.2.7l1.6 2.6c.3.4.7.7 1.2.7h2c.5 0 .9-.3 1.2-.7l1.6-2.6c.3-.4.7-.7 1.2-.7h2\"></path></svg>`,\n AUTOSCALE: `<svg viewBox=\"0 0 24 24\" width=\"14\" height=\"14\" stroke=\"currentColor\" stroke-width=\"2\" fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"15 3 21 3 21 9\"></polyline><polyline points=\"9 21 3 21 3 15\"></polyline><line x1=\"21\" y1=\"3\" x2=\"14\" y2=\"10\"></line><line x1=\"3\" y1=\"21\" x2=\"10\" y2=\"14\"></line></svg>`,\n EXPORT: `<svg viewBox=\"0 0 24 24\" width=\"14\" height=\"14\" stroke=\"currentColor\" stroke-width=\"2\" fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\"></path><polyline points=\"7 10 12 15 17 10\"></polyline><line x1=\"12\" y1=\"15\" x2=\"12\" y2=\"3\"></line></svg>`,\n};\n\nexport class ChartControls {\n private container: HTMLDivElement;\n private toolbar: HTMLDivElement;\n private callbacks: ChartControlsCallbacks;\n private theme: ChartTheme;\n\n private isSmoothing = false;\n private isPanMode = true;\n private currentType: \"line\" | \"scatter\" | \"line+scatter\" = \"line\";\n\n constructor(\n parent: HTMLElement,\n theme: ChartTheme,\n callbacks: ChartControlsCallbacks\n ) {\n this.callbacks = callbacks;\n this.theme = theme;\n\n this.container = document.createElement(\"div\");\n this.container.style.cssText = `\n position: absolute;\n top: 8px;\n right: 8px;\n z-index: 100;\n pointer-events: auto;\n display: flex;\n flex-direction: column;\n align-items: flex-end;\n gap: 8px;\n `;\n\n this.toolbar = document.createElement(\"div\");\n this.toolbar.className = \"scichart-modebar\";\n this.updateToolbarStyle();\n\n this.createButtons();\n this.container.appendChild(this.toolbar);\n parent.appendChild(this.container);\n }\n\n private isDarkTheme(): boolean {\n const name = this.theme.name.toLowerCase();\n return (\n name.includes(\"dark\") ||\n name.includes(\"midnight\") ||\n name.includes(\"electro\")\n );\n }\n\n private updateToolbarStyle(): void {\n const isDark = this.isDarkTheme();\n\n const bg = isDark ? \"rgba(15, 23, 42, 0.85)\" : \"rgba(255, 255, 255, 0.95)\";\n const borderColor = isDark\n ? \"rgba(255, 255, 255, 0.2)\"\n : \"rgba(0, 0, 0, 0.15)\";\n const shadow = isDark\n ? \"0 4px 12px rgba(0, 0, 0, 0.6), 0 0 0 1px rgba(255, 255, 255, 0.1)\"\n : \"0 4px 12px rgba(0, 0, 0, 0.15)\";\n\n this.toolbar.style.cssText = `\n display: flex;\n align-items: center;\n gap: 4px;\n padding: 4px;\n background: ${bg};\n backdrop-filter: blur(12px) saturate(180%);\n -webkit-backdrop-filter: blur(12px) saturate(180%);\n border: 1px solid ${borderColor};\n border-radius: 8px;\n box-shadow: ${shadow};\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n `;\n }\n\n private createButtons(): void {\n // Pan Mode\n this.createButton(\n ICONS.PAN,\n \"Pan Mode\",\n () => {\n this.isPanMode = !this.isPanMode;\n this.updateButtonStates();\n this.callbacks.onTogglePan(this.isPanMode);\n },\n \"pan\"\n );\n\n // Reset Zoom\n this.createButton(\n ICONS.RESET,\n \"Reset Zoom\",\n () => this.callbacks.onResetZoom(),\n \"reset\"\n );\n\n // Auto Scale\n this.createButton(\n ICONS.AUTOSCALE,\n \"Auto Scale\",\n () => this.callbacks.onAutoScale(),\n \"autoscale\"\n );\n\n // Separator\n const sep = document.createElement(\"div\");\n const isDark = this.isDarkTheme();\n sep.style.cssText = `width: 1px; height: 20px; background: ${\n isDark ? \"rgba(255,255,255,0.25)\" : \"rgba(0,0,0,0.2)\"\n }; margin: 0 6px;`;\n this.toolbar.appendChild(sep);\n\n // Type Switcher\n this.createButton(\n ICONS.LINE,\n \"Toggle Line/Scatter/Both\",\n () => {\n const types: (\"line\" | \"scatter\" | \"line+scatter\")[] = [\n \"line\",\n \"scatter\",\n \"line+scatter\",\n ];\n const nextIdx = (types.indexOf(this.currentType) + 1) % types.length;\n this.currentType = types[nextIdx];\n this.callbacks.onSetType(this.currentType);\n this.updateButtonStates();\n },\n \"type\"\n );\n\n // Smoothing\n this.createButton(\n ICONS.SMOOTH,\n \"Automated Smoothing\",\n () => {\n this.isSmoothing = !this.isSmoothing;\n this.updateButtonStates();\n this.callbacks.onToggleSmoothing();\n },\n \"smooth\"\n );\n\n // Separator\n const sep2 = document.createElement(\"div\");\n sep2.style.cssText = `width: 1px; height: 20px; background: ${\n isDark ? \"rgba(255,255,255,0.25)\" : \"rgba(0,0,0,0.2)\"\n }; margin: 0 6px;`;\n this.toolbar.appendChild(sep2);\n\n // Export Image\n this.createButton(\n ICONS.EXPORT,\n \"Export as PNG\",\n () => this.callbacks.onExport(),\n \"export\"\n );\n\n this.updateButtonStates();\n }\n\n private enforceSVGVisibility(btn: HTMLButtonElement): void {\n // Force SVG visibility and make sure currentColor is applied even under aggressive page CSS\n const icon = btn.querySelector<HTMLElement>(\".scichart-control-icon\");\n if (icon) {\n icon.style.display = \"flex\";\n icon.style.alignItems = \"center\";\n icon.style.justifyContent = \"center\";\n icon.style.width = \"100%\";\n icon.style.height = \"100%\";\n icon.style.pointerEvents = \"none\";\n }\n\n const svgEl = btn.querySelector<SVGElement>(\"svg\");\n if (svgEl) {\n svgEl.setAttribute(\"width\", \"14\");\n svgEl.setAttribute(\"height\", \"14\");\n (svgEl as any).style.display = \"block\";\n (svgEl as any).style.overflow = \"visible\";\n (svgEl as any).style.color = \"inherit\";\n (svgEl as any).style.stroke = \"currentColor\";\n if (!svgEl.getAttribute(\"fill\")) {\n (svgEl as any).style.fill = \"none\";\n }\n }\n }\n\n private createButton(\n svg: string,\n title: string,\n onClick: () => void,\n id: string\n ): HTMLButtonElement {\n const btn = document.createElement(\"button\");\n btn.innerHTML = `<span class=\"scichart-control-icon\">${svg}</span>`;\n btn.title = title;\n btn.dataset.id = id;\n\n const isDark = this.isDarkTheme();\n const color = isDark ? \"#ffffff\" : \"#1e293b\";\n\n btn.style.cssText = `\n width: 24px;\n height: 24px;\n display: flex;\n align-items: center;\n justify-content: center;\n border: none;\n background: transparent;\n color: ${color};\n cursor: pointer;\n border-radius: 6px;\n transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n opacity: 0.9;\n `;\n\n btn.onmouseenter = () => {\n btn.style.opacity = \"1\";\n btn.style.background = isDark\n ? \"rgba(255, 255, 255, 0.15)\"\n : \"rgba(0, 0, 0, 0.1)\";\n btn.style.transform = \"translateY(-1px)\";\n btn.style.boxShadow = isDark\n ? \"0 2px 4px rgba(0,0,0,0.4)\"\n : \"0 2px 4px rgba(0,0,0,0.1)\";\n };\n btn.onmouseleave = () => {\n btn.style.transform = \"none\";\n btn.style.boxShadow = \"none\";\n this.updateButtonStates();\n };\n btn.onclick = onClick;\n\n // Force SVG visibility\n this.enforceSVGVisibility(btn);\n\n this.toolbar.appendChild(btn);\n return btn;\n }\n\n private updateButtonStates(): void {\n const buttons = this.toolbar.querySelectorAll(\"button\");\n const isDark = this.isDarkTheme();\n\n const activeColor = \"#38bdf8\"; // Brighter blue\n const smoothActiveColor = \"#fb7185\"; // Brighter pink\n const normalColor = isDark ? \"#f1f5f9\" : \"#334155\"; // High contrast\n\n buttons.forEach((btn: HTMLButtonElement) => {\n const id = btn.dataset.id;\n const isHover = btn.matches(\":hover\");\n\n if (id === \"pan\") {\n btn.style.color = this.isPanMode ? activeColor : normalColor;\n btn.style.opacity = isHover || this.isPanMode ? \"1\" : \"0.8\";\n if (this.isPanMode) {\n btn.style.background = isDark\n ? \"rgba(56, 189, 248, 0.15)\"\n : \"rgba(56, 189, 248, 0.1)\";\n }\n } else if (id === \"smooth\") {\n btn.style.color = this.isSmoothing ? smoothActiveColor : normalColor;\n btn.style.opacity = isHover || this.isSmoothing ? \"1\" : \"0.8\";\n if (this.isSmoothing) {\n btn.style.background = isDark\n ? \"rgba(251, 113, 133, 0.15)\"\n : \"rgba(251, 113, 133, 0.1)\";\n }\n } else if (id === \"type\") {\n btn.innerHTML =\n this.currentType === \"line\"\n ? ICONS.LINE\n : this.currentType === \"scatter\"\n ? ICONS.SCATTER\n : ICONS.BOTH;\n // Reapply SVG visibility styles after changing innerHTML\n this.enforceSVGVisibility(btn);\n btn.style.color = normalColor;\n btn.style.opacity = isHover ? \"1\" : \"0.8\";\n } else if (id === \"reset\" || id === \"autoscale\" || id === \"export\") {\n btn.style.color = normalColor;\n btn.style.opacity = isHover ? \"1\" : \"0.8\";\n }\n\n if (\n !isHover &&\n !(\n (id === \"pan\" && this.isPanMode) ||\n (id === \"smooth\" && this.isSmoothing)\n )\n ) {\n btn.style.background = \"transparent\";\n }\n });\n }\n\n public updateTheme(theme: ChartTheme): void {\n this.theme = theme;\n this.updateToolbarStyle();\n this.updateButtonStates();\n }\n\n public destroy(): void {\n this.container.remove();\n }\n}\n","/**\n * ChartLegend - In-chart draggable legend component\n */\n\nimport { ChartTheme } from \"../theme\";\nimport { Series } from \"./Series\";\n\nexport interface ChartLegendCallbacks {\n onMove: (x: number, y: number) => void;\n}\n\nexport class ChartLegend {\n private container: HTMLDivElement;\n private header: HTMLDivElement;\n private content: HTMLDivElement;\n private theme: ChartTheme;\n private series: Series[] = [];\n private callbacks: ChartLegendCallbacks;\n\n private isDragging = false;\n private startX = 0;\n private startY = 0;\n private initialX = 0;\n private initialY = 0;\n\n constructor(\n parent: HTMLElement,\n theme: ChartTheme,\n options: { x?: number; y?: number },\n callbacks: ChartLegendCallbacks\n ) {\n this.theme = theme;\n this.callbacks = callbacks;\n\n this.container = document.createElement(\"div\");\n this.container.className = \"scichart-legend\";\n\n // Default position (top-right, below controls toolbar)\n // Controls toolbar height is ~32px (24px buttons + 4px padding*2 + borders) + 8px top margin = ~40px\n // Add extra margin to ensure no overlap\n const x = options.x ?? parent.clientWidth - 150;\n const y = options.y ?? 55;\n\n this.container.style.cssText = `\n position: absolute;\n left: ${x}px;\n top: ${y}px;\n z-index: 90;\n pointer-events: auto;\n min-width: 120px;\n border-radius: ${theme.legend.borderRadius}px;\n overflow: hidden;\n box-shadow: 0 4px 12px rgba(0,0,0,0.15);\n user-select: none;\n transition: box-shadow 0.2s ease;\n `;\n\n this.updateStyle();\n\n // Draggable header\n this.header = document.createElement(\"div\");\n this.header.style.cssText = `\n height: 8px;\n cursor: move;\n background: rgba(255,255,255,0.05);\n border-bottom: 1px solid rgba(255,255,255,0.05);\n `;\n\n this.content = document.createElement(\"div\");\n this.content.style.padding = `${theme.legend.padding}px`;\n\n this.container.appendChild(this.header);\n this.container.appendChild(this.content);\n parent.appendChild(this.container);\n\n this.initDragging();\n }\n\n private updateStyle(): void {\n const isDark =\n this.theme.name.toLowerCase().includes(\"dark\") ||\n this.theme.name.toLowerCase().includes(\"midnight\") ||\n this.theme.name.toLowerCase().includes(\"electro\");\n\n const bg = isDark ? \"rgba(15, 23, 42, 0.85)\" : \"rgba(255, 255, 255, 0.95)\";\n const borderColor = isDark\n ? \"rgba(255, 255, 255, 0.15)\"\n : \"rgba(0, 0, 0, 0.1)\";\n const shadow = isDark\n ? \"0 4px 12px rgba(0, 0, 0, 0.6)\"\n : \"0 4px 12px rgba(0, 0, 0, 0.15)\";\n\n this.container.style.background = bg;\n this.container.style.backdropFilter = \"blur(12px) saturate(180%)\";\n (this.container.style as any).webkitBackdropFilter =\n \"blur(12px) saturate(180%)\";\n this.container.style.border = `1px solid ${borderColor}`;\n this.container.style.boxShadow = shadow;\n }\n\n private initDragging(): void {\n let rafId: number | null = null;\n\n const onMouseDown = (e: MouseEvent) => {\n // Only handle left click\n if (e.button !== 0) return;\n\n e.stopPropagation();\n e.preventDefault();\n\n this.isDragging = true;\n this.startX = e.clientX;\n this.startY = e.clientY;\n this.initialX = this.container.offsetLeft;\n this.initialY = this.container.offsetTop;\n\n this.container.style.transition = \"none\";\n this.container.style.willChange = \"transform\";\n this.container.style.boxShadow = \"0 8px 24px rgba(0,0,0,0.3)\";\n this.container.style.cursor = \"grabbing\";\n\n document.addEventListener(\"mousemove\", onMouseMove);\n document.addEventListener(\"mouseup\", onMouseUp);\n };\n\n const updatePosition = (clientX: number, clientY: number) => {\n const dx = clientX - this.startX;\n const dy = clientY - this.startY;\n\n let newX = this.initialX + dx;\n let newY = this.initialY + dy;\n\n const parent = this.container.parentElement;\n if (parent) {\n newX = Math.max(\n 0,\n Math.min(newX, parent.clientWidth - this.container.clientWidth)\n );\n newY = Math.max(\n 0,\n Math.min(newY, parent.clientHeight - this.container.clientHeight)\n );\n }\n\n // Use transform for better performance (no layout recalc)\n const tx = newX - this.initialX;\n const ty = newY - this.initialY;\n this.container.style.transform = `translate3d(${tx}px, ${ty}px, 0)`;\n };\n\n const onMouseMove = (e: MouseEvent) => {\n if (!this.isDragging) return;\n if (rafId) cancelAnimationFrame(rafId);\n rafId = requestAnimationFrame(() => updatePosition(e.clientX, e.clientY));\n };\n\n const onMouseUp = () => {\n if (this.isDragging) {\n this.isDragging = false;\n if (rafId) cancelAnimationFrame(rafId);\n\n // Finalize position and commit to left/top (to keep it there)\n const rect = this.container.getBoundingClientRect();\n const parentRect =\n this.container.parentElement?.getBoundingClientRect();\n if (parentRect) {\n const finalX = rect.left - parentRect.left;\n const finalY = rect.top - parentRect.top;\n\n this.container.style.transform = \"none\";\n this.container.style.left = `${finalX}px`;\n this.container.style.top = `${finalY}px`;\n\n this.callbacks.onMove(finalX, finalY);\n }\n\n this.container.style.willChange = \"auto\";\n this.container.style.transition = \"box-shadow 0.2s ease\";\n this.container.style.boxShadow = \"0 4px 12px rgba(0,0,0,0.15)\";\n this.container.style.cursor = \"auto\";\n }\n document.removeEventListener(\"mousemove\", onMouseMove);\n document.removeEventListener(\"mouseup\", onMouseUp);\n };\n\n this.container.addEventListener(\"mousedown\", onMouseDown);\n\n // Block events from reaching the chart while over the legend\n this.container.addEventListener(\"wheel\", (e) => e.stopPropagation());\n this.container.addEventListener(\"click\", (e) => e.stopPropagation());\n this.container.addEventListener(\"dblclick\", (e) => e.stopPropagation());\n // Note: mousemove/mouseup on container MUST bubble to document during drag\n }\n\n public update(series: Series[]): void {\n this.series = series;\n this.render();\n }\n\n private render(): void {\n this.content.innerHTML = \"\";\n const legend = this.theme.legend;\n\n this.series.forEach((s) => {\n const item = document.createElement(\"div\");\n item.style.cssText = `\n display: flex;\n align-items: center;\n gap: 8px;\n margin-bottom: ${legend.itemGap}px;\n font-family: ${legend.fontFamily};\n font-size: ${legend.fontSize}px;\n color: ${legend.textColor};\n `;\n\n const swatch = document.createElement(\"div\");\n swatch.style.cssText = `\n width: ${legend.swatchSize}px;\n height: ${legend.swatchSize}px;\n background: ${s.getStyle().color || \"#ff0055\"};\n border-radius: 2px;\n `;\n\n const label = document.createElement(\"span\");\n label.textContent = s.getId();\n\n item.appendChild(swatch);\n item.appendChild(label);\n this.content.appendChild(item);\n });\n }\n\n public draw(ctx: CanvasRenderingContext2D, dpr: number): void {\n if (this.series.length === 0) return;\n\n const legend = this.theme.legend;\n const padding = legend.padding * dpr;\n const itemGap = legend.itemGap * dpr;\n const swatchSize = legend.swatchSize * dpr;\n const headerHeight = 8 * dpr; // Matching the 8px header in constructor\n\n // Get current position in pixels\n const x = this.container.offsetLeft * dpr;\n const y = this.container.offsetTop * dpr;\n const width = this.container.clientWidth * dpr;\n const height = this.container.clientHeight * dpr;\n\n ctx.save();\n\n // 1. Draw background\n const isDark =\n this.theme.name.toLowerCase().includes(\"dark\") ||\n this.theme.name.toLowerCase().includes(\"midnight\");\n ctx.fillStyle = isDark\n ? legend.backgroundColor\n : \"rgba(255, 255, 255, 0.85)\";\n ctx.strokeStyle = legend.borderColor;\n ctx.lineWidth = 1 * dpr;\n\n const r = legend.borderRadius * dpr;\n ctx.beginPath();\n ctx.moveTo(x + r, y);\n ctx.lineTo(x + width - r, y);\n ctx.arcTo(x + width, y, x + width, y + r, r);\n ctx.lineTo(x + width, y + height - r);\n ctx.arcTo(x + width, y + height, x + width - r, y + height, r);\n ctx.lineTo(x + r, y + height);\n ctx.arcTo(x, y + height, x, y + height - r, r);\n ctx.lineTo(x, y + r);\n ctx.arcTo(x, y, x + r, y, r);\n ctx.closePath();\n ctx.fill();\n ctx.stroke();\n\n // 2. Draw Items\n ctx.textAlign = \"left\";\n ctx.textBaseline = \"middle\";\n ctx.font = `${legend.fontSize * dpr}px ${legend.fontFamily}`;\n\n this.series.forEach((s, i) => {\n // Offset by headerHeight and padding\n const itemY =\n y +\n headerHeight +\n padding +\n i * (swatchSize + itemGap) +\n swatchSize / 2;\n\n // Swatch\n ctx.fillStyle = s.getStyle().color || \"#ff0055\";\n ctx.fillRect(x + padding, itemY - swatchSize / 2, swatchSize, swatchSize);\n\n // Label\n ctx.fillStyle = legend.textColor;\n ctx.fillText(s.getId(), x + padding + swatchSize + 8 * dpr, itemY);\n });\n\n ctx.restore();\n }\n\n public updateTheme(theme: ChartTheme): void {\n this.theme = theme;\n this.updateStyle();\n this.render();\n }\n\n public destroy(): void {\n this.container.remove();\n }\n}\n","/**\n * Chart - Main SciChart Engine orchestrator\n *\n * Coordinates WebGL rendering, overlay, interactions, and data management.\n * This is the public API for creating and controlling charts.\n */\n\nimport type {\n ChartOptions,\n AxisOptions,\n SeriesOptions,\n SeriesUpdateData,\n ZoomOptions,\n CursorOptions,\n ChartEventMap,\n Bounds,\n} from \"../types\";\nimport { EventEmitter } from \"./EventEmitter\";\nimport { Series } from \"./Series\";\nimport {\n NativeWebGLRenderer,\n interleaveData,\n parseColor,\n type NativeSeriesRenderData as SeriesRenderData,\n} from \"../renderer/NativeWebGLRenderer\";\nimport { LinearScale, LogScale, type Scale } from \"../scales\";\nimport { DEFAULT_THEME, getThemeByName, type ChartTheme } from \"../theme\";\nimport { OverlayRenderer, type CursorState } from \"./OverlayRenderer\";\nimport { InteractionManager } from \"./InteractionManager\";\nimport { ChartControls } from \"./ChartControls\";\nimport { ChartLegend } from \"./ChartLegend\";\n\n// ============================================\n// Layout Constants\n// ============================================\n\nconst MARGINS = { top: 20, right: 30, bottom: 55, left: 75 };\n\n// ============================================\n// Chart Interface\n// ============================================\n\nexport interface Chart {\n addSeries(options: SeriesOptions): void;\n removeSeries(id: string): void;\n updateSeries(id: string, data: SeriesUpdateData): void;\n getSeries(id: string): Series | undefined;\n getAllSeries(): Series[];\n zoom(options: ZoomOptions): void;\n pan(deltaX: number, deltaY: number): void;\n resetZoom(): void;\n getViewBounds(): Bounds;\n enableCursor(options: CursorOptions): void;\n disableCursor(): void;\n resize(width?: number, height?: number): void;\n render(): void;\n on<K extends keyof ChartEventMap>(\n event: K,\n handler: (data: ChartEventMap[K]) => void\n ): void;\n off<K extends keyof ChartEventMap>(\n event: K,\n handler: (data: ChartEventMap[K]) => void\n ): void;\n destroy(): void;\n exportImage(type?: \"png\" | \"jpeg\"): string;\n autoScale(): void;\n setTheme(theme: string | object): void;\n}\n\n// ============================================\n// Chart Implementation\n// ============================================\n\nclass ChartImpl implements Chart {\n private container: HTMLDivElement;\n private webglCanvas: HTMLCanvasElement;\n private overlayCanvas: HTMLCanvasElement;\n private overlayCtx: CanvasRenderingContext2D;\n\n private series: Map<string, Series> = new Map();\n private events = new EventEmitter<ChartEventMap>();\n private viewBounds: Bounds = {\n xMin: -0.5,\n xMax: 0.5,\n yMin: -1e-5,\n yMax: 1e-5,\n };\n\n private xAxisOptions: AxisOptions;\n private yAxisOptions: AxisOptions;\n private dpr: number;\n private backgroundColor: [number, number, number, number];\n\n private renderer: NativeWebGLRenderer;\n private overlay: OverlayRenderer;\n private interaction: InteractionManager;\n private xScale: Scale;\n private yScale: Scale;\n private theme: ChartTheme;\n\n private cursorOptions: CursorOptions | null = null;\n private cursorPosition: { x: number; y: number } | null = null;\n private showLegend: boolean;\n private legend: ChartLegend | null = null;\n private showControls: boolean;\n private controls: ChartControls | null = null;\n private animationFrameId: number | null = null;\n private needsRender = false;\n private isDestroyed = false;\n private selectionRect: {\n x: number;\n y: number;\n width: number;\n height: number;\n } | null = null;\n\n constructor(options: ChartOptions) {\n const container = options.container;\n if (!container) throw new Error(\"[SciChart] Container element is required\");\n this.container = container;\n\n this.dpr = options.devicePixelRatio ?? window.devicePixelRatio;\n\n // Initialize theme\n this.theme =\n typeof options.theme === \"string\"\n ? getThemeByName(options.theme)\n : (options.theme as ChartTheme) ?? DEFAULT_THEME;\n\n const bgColor = parseColor(\n options.background ?? this.theme.backgroundColor\n );\n this.backgroundColor = [bgColor[0], bgColor[1], bgColor[2], bgColor[3]];\n this.showLegend = options.showLegend ?? this.theme.legend.visible;\n this.showControls = options.showControls ?? false;\n\n this.xAxisOptions = { scale: \"linear\", auto: true, ...options.xAxis };\n this.yAxisOptions = { scale: \"linear\", auto: true, ...options.yAxis };\n this.xScale =\n this.xAxisOptions.scale === \"log\" ? new LogScale() : new LinearScale();\n this.yScale =\n this.yAxisOptions.scale === \"log\" ? new LogScale() : new LinearScale();\n\n // Create DOM structure\n this.container.style.position = \"relative\";\n this.container.style.overflow = \"hidden\";\n this.container.style.backgroundColor =\n options.background ?? this.theme.backgroundColor;\n\n this.webglCanvas = this.createCanvas(\"webgl\");\n this.overlayCanvas = this.createCanvas(\"overlay\");\n\n // Clear container before adding our canvases (especially for React)\n while (this.container.firstChild) {\n this.container.removeChild(this.container.firstChild);\n }\n\n this.container.appendChild(this.webglCanvas);\n this.container.appendChild(this.overlayCanvas);\n\n const ctx = this.overlayCanvas.getContext(\"2d\");\n if (!ctx) throw new Error(\"Failed to get 2D context\");\n this.overlayCtx = ctx;\n\n // Initialize subsystems\n this.renderer = new NativeWebGLRenderer(this.webglCanvas);\n this.overlay = new OverlayRenderer(this.overlayCtx, this.theme);\n this.interaction = new InteractionManager(\n this.container,\n {\n onZoom: (b) => this.zoom({ x: [b.xMin, b.xMax], y: [b.yMin, b.yMax] }),\n onPan: (dx, dy) => this.pan(dx, dy),\n onBoxZoom: (rect) => this.handleBoxZoom(rect),\n onCursorMove: (x, y) => {\n this.cursorPosition = { x, y };\n this.requestRender();\n },\n onCursorLeave: () => {\n this.cursorPosition = null;\n this.requestRender();\n },\n },\n () => this.getPlotArea(),\n () => this.viewBounds\n );\n\n // Setup resize observer\n new ResizeObserver(() => !this.isDestroyed && this.resize()).observe(\n this.container\n );\n\n // Initialize controls if enabled\n if (this.showControls) {\n this.controls = new ChartControls(this.container, this.theme, {\n onResetZoom: () => this.resetZoom(),\n onSetType: (type) => {\n this.series.forEach((s) => s.setType(type));\n this.requestRender();\n },\n onToggleSmoothing: () => {\n this.series.forEach((s) => {\n const style = s.getStyle();\n s.setStyle({ smoothing: (style.smoothing || 0) === 0 ? 0.5 : 0 });\n });\n this.requestRender();\n },\n onTogglePan: (active: boolean) => {\n this.interaction.setPanMode(active);\n },\n onExport: () => {\n const dataUrl = this.exportImage();\n const link = document.createElement(\"a\");\n link.download = `scichart-export-${Date.now()}.png`;\n link.href = dataUrl;\n link.click();\n },\n onAutoScale: () => {\n this.autoScale();\n this.requestRender();\n this.events.emit(\"autoScale\", undefined);\n },\n });\n }\n\n // Initialize legend if enabled\n if (this.showLegend) {\n this.legend = new ChartLegend(\n this.container,\n this.theme,\n options.legendPosition || {},\n {\n onMove: (x, y) => this.events.emit(\"legendMove\", { x, y }),\n }\n );\n this.legend.update(this.getAllSeries());\n }\n\n this.resize();\n this.startRenderLoop();\n\n // Safety resize after a short delay to handle cases where the container\n // might not have been fully sized during construction (e.g. in some frameworks)\n setTimeout(() => !this.isDestroyed && this.resize(), 100);\n\n console.log(\"[SciChart] Initialized\", {\n dpr: this.dpr,\n theme: this.theme.name,\n });\n }\n\n public setTheme(theme: string | ChartTheme): void {\n if (this.isDestroyed) return;\n\n this.theme =\n typeof theme === \"string\"\n ? getThemeByName(theme)\n : (theme as ChartTheme) ?? DEFAULT_THEME;\n\n const bgColor = parseColor(this.theme.backgroundColor);\n this.backgroundColor = [bgColor[0], bgColor[1], bgColor[2], bgColor[3]];\n this.container.style.backgroundColor = this.theme.backgroundColor;\n\n this.overlay.setTheme(this.theme);\n\n if (this.controls) {\n this.controls.updateTheme(this.theme);\n }\n\n if (this.legend) {\n this.legend.updateTheme(this.theme);\n }\n\n // Explicitly update WebGL renderer state if needed\n // The background color is passed during each render() call, so it's already covered.\n\n this.resize();\n this.requestRender();\n\n // Safety second render to ensure everything is flushed\n setTimeout(() => {\n if (!this.isDestroyed) {\n this.resize();\n this.render();\n }\n }, 50);\n }\n\n // ----------------------------------------\n // DOM Setup\n // ----------------------------------------\n\n private createCanvas(type: \"webgl\" | \"overlay\"): HTMLCanvasElement {\n const c = document.createElement(\"canvas\");\n c.style.cssText =\n type === \"webgl\"\n ? `position:absolute;top:${MARGINS.top}px;left:${\n MARGINS.left\n }px;width:calc(100% - ${\n MARGINS.left + MARGINS.right\n }px);height:calc(100% - ${MARGINS.top + MARGINS.bottom}px)`\n : `position:absolute;top:0;left:0;width:100%;height:100%;pointer-events:none`;\n return c;\n }\n\n private getPlotArea() {\n const rect = this.container.getBoundingClientRect();\n const width = Math.max(10, rect.width - MARGINS.left - MARGINS.right);\n const height = Math.max(10, rect.height - MARGINS.top - MARGINS.bottom);\n return {\n x: MARGINS.left,\n y: MARGINS.top,\n width,\n height,\n };\n }\n\n exportImage(type: \"png\" | \"jpeg\" = \"png\"): string {\n const finalCanvas = document.createElement(\"canvas\");\n finalCanvas.width = this.overlayCanvas.width;\n finalCanvas.height = this.overlayCanvas.height;\n const ctx = finalCanvas.getContext(\"2d\");\n if (!ctx) return \"\";\n\n // 1. Fill background\n const bg = this.backgroundColor;\n ctx.fillStyle = `rgba(${Math.round(bg[0] * 255)}, ${Math.round(\n bg[1] * 255\n )}, ${Math.round(bg[2] * 255)}, ${bg[3]})`;\n ctx.fillRect(0, 0, finalCanvas.width, finalCanvas.height);\n\n // 2. Draw WebGL plot area\n const plotX = MARGINS.left * this.dpr;\n const plotY = MARGINS.top * this.dpr;\n ctx.drawImage(this.webglCanvas, plotX, plotY);\n\n // 3. Draw Overlay (Axes, Grid, Labels)\n ctx.drawImage(this.overlayCanvas, 0, 0);\n\n // 4. Draw Legend (if exists and visible)\n if (this.legend && this.showLegend) {\n this.legend.draw(ctx, this.dpr);\n }\n\n return finalCanvas.toDataURL(`image/${type}`);\n }\n\n // ----------------------------------------\n // Series Management\n // ----------------------------------------\n\n addSeries(options: SeriesOptions): void {\n if (this.series.has(options.id)) this.removeSeries(options.id);\n const s = new Series(options);\n this.series.set(options.id, s);\n this.updateSeriesBuffer(s);\n if (this.xAxisOptions.auto || this.yAxisOptions.auto) this.autoScale();\n if (this.legend) this.legend.update(this.getAllSeries());\n this.requestRender();\n }\n\n removeSeries(id: string): void {\n const s = this.series.get(id);\n if (s) {\n this.renderer.deleteBuffer(id);\n s.destroy();\n this.series.delete(id);\n if (this.legend) this.legend.update(this.getAllSeries());\n this.requestRender();\n }\n }\n\n updateSeries(id: string, data: SeriesUpdateData): void {\n const s = this.series.get(id);\n if (!s) return;\n s.updateData(data);\n this.updateSeriesBuffer(s);\n if (this.xAxisOptions.auto || this.yAxisOptions.auto) {\n this.autoScale();\n }\n this.requestRender();\n }\n\n private updateSeriesBuffer(s: Series): void {\n const d = s.getData();\n if (!d || d.x.length === 0) return;\n this.renderer.createBuffer(s.getId(), interleaveData(d.x, d.y));\n }\n\n getSeries(id: string): Series | undefined {\n return this.series.get(id);\n }\n getAllSeries(): Series[] {\n return Array.from(this.series.values());\n }\n\n // ----------------------------------------\n // View Management\n // ----------------------------------------\n\n zoom(options: ZoomOptions): void {\n if (options.x) {\n this.viewBounds.xMin = options.x[0];\n this.viewBounds.xMax = options.x[1];\n }\n if (options.y) {\n this.viewBounds.yMin = options.y[0];\n this.viewBounds.yMax = options.y[1];\n }\n this.events.emit(\"zoom\", {\n x: [this.viewBounds.xMin, this.viewBounds.xMax],\n y: [this.viewBounds.yMin, this.viewBounds.yMax],\n });\n this.requestRender();\n }\n\n pan(deltaX: number, deltaY: number): void {\n const pa = this.getPlotArea();\n const dx =\n (deltaX / pa.width) * (this.viewBounds.xMax - this.viewBounds.xMin);\n const dy =\n (deltaY / pa.height) * (this.viewBounds.yMax - this.viewBounds.yMin);\n this.viewBounds.xMin -= dx;\n this.viewBounds.xMax -= dx;\n this.viewBounds.yMin += dy;\n this.viewBounds.yMax += dy;\n this.events.emit(\"pan\", { deltaX: dx, deltaY: dy });\n this.requestRender();\n }\n\n resetZoom(): void {\n this.autoScale();\n this.events.emit(\"zoom\", {\n x: [this.viewBounds.xMin, this.viewBounds.xMax],\n y: [this.viewBounds.yMin, this.viewBounds.yMax],\n });\n this.requestRender();\n }\n\n getViewBounds(): Bounds {\n return { ...this.viewBounds };\n }\n\n public autoScale(): void {\n if (this.series.size === 0) return;\n\n let xMin = Infinity,\n xMax = -Infinity,\n yMin = Infinity,\n yMax = -Infinity;\n let hasValidData = false;\n\n this.series.forEach((s) => {\n const b = s.getBounds();\n if (\n b &&\n isFinite(b.xMin) &&\n isFinite(b.xMax) &&\n isFinite(b.yMin) &&\n isFinite(b.yMax)\n ) {\n xMin = Math.min(xMin, b.xMin);\n xMax = Math.max(xMax, b.xMax);\n yMin = Math.min(yMin, b.yMin);\n yMax = Math.max(yMax, b.yMax);\n hasValidData = true;\n }\n });\n\n if (!hasValidData) {\n console.warn(\"[SciChart] No valid data bounds found for autoScale\");\n return;\n }\n\n // Add 5% padding\n let xRange = xMax - xMin;\n let yRange = yMax - yMin;\n\n // Fallback for zero range (single point or identical points)\n if (xRange <= 0 || !isFinite(xRange)) xRange = Math.abs(xMin) * 0.1 || 1;\n if (yRange <= 0 || !isFinite(yRange)) yRange = Math.abs(yMin) * 0.1 || 1;\n\n // Ensure we don't have extreme values that could break rendering\n const MAX_VALUE = 1e15;\n const MIN_VALUE = -1e15;\n\n xMin = Math.max(MIN_VALUE, Math.min(MAX_VALUE, xMin));\n xMax = Math.max(MIN_VALUE, Math.min(MAX_VALUE, xMax));\n yMin = Math.max(MIN_VALUE, Math.min(MAX_VALUE, yMin));\n yMax = Math.max(MIN_VALUE, Math.min(MAX_VALUE, yMax));\n\n const xPad = Math.min(xRange * 0.05, 1e10);\n const yPad = Math.min(yRange * 0.05, 1e10);\n\n const newBounds = {\n xMin: Math.max(MIN_VALUE, xMin - xPad),\n xMax: Math.min(MAX_VALUE, xMax + xPad),\n yMin: Math.max(MIN_VALUE, yMin - yPad),\n yMax: Math.min(MAX_VALUE, yMax + yPad),\n };\n\n if (this.xAxisOptions.auto) {\n this.viewBounds.xMin = newBounds.xMin;\n this.viewBounds.xMax = newBounds.xMax;\n }\n if (this.yAxisOptions.auto) {\n this.viewBounds.yMin = newBounds.yMin;\n this.viewBounds.yMax = newBounds.yMax;\n }\n\n this.requestRender();\n }\n\n // ----------------------------------------\n // Cursor\n // ----------------------------------------\n\n enableCursor(options: CursorOptions): void {\n this.cursorOptions = { enabled: true, ...options };\n }\n disableCursor(): void {\n this.cursorOptions = null;\n this.cursorPosition = null;\n }\n\n // ----------------------------------------\n // Rendering\n // ----------------------------------------\n\n resize(): void {\n const rect = this.container.getBoundingClientRect();\n if (rect.width === 0 || rect.height === 0) return;\n\n this.overlayCanvas.width = rect.width * this.dpr;\n this.overlayCanvas.height = rect.height * this.dpr;\n\n // Reset transform before scaling to avoid cumulative effects\n this.overlayCtx.setTransform(1, 0, 0, 1, 0, 0);\n this.overlayCtx.scale(this.dpr, this.dpr);\n\n this.renderer.resize();\n this.events.emit(\"resize\", { width: rect.width, height: rect.height });\n this.requestRender();\n }\n\n private requestRender(): void {\n this.needsRender = true;\n }\n\n render(): void {\n if (this.isDestroyed) return;\n const start = performance.now();\n\n this.xScale.setDomain(this.viewBounds.xMin, this.viewBounds.xMax);\n this.yScale.setDomain(this.viewBounds.yMin, this.viewBounds.yMax);\n\n // WebGL render\n const seriesData: SeriesRenderData[] = [];\n const plotArea = this.getPlotArea();\n\n if (this.webglCanvas.width === 0 || this.webglCanvas.height === 0) {\n console.warn(\"[SciChart] Canvas has zero size, skipping render\");\n return;\n }\n\n // Update scales with current range\n this.xScale.setRange(plotArea.x, plotArea.x + plotArea.width);\n this.yScale.setRange(plotArea.y + plotArea.height, plotArea.y); // Y is inverted in pixels\n\n this.series.forEach((s) => {\n if (s.needsBufferUpdate) {\n this.updateSeriesBuffer(s);\n s.needsBufferUpdate = false;\n }\n\n const buf = this.renderer.getBuffer(s.getId());\n if (buf)\n seriesData.push({\n id: s.getId(),\n buffer: buf,\n count: s.getPointCount(),\n style: s.getStyle(),\n visible: s.isVisible(),\n type: s.getType(),\n });\n });\n\n if (seriesData.length === 0 && this.series.size > 0) {\n console.warn(\n \"[SciChart] No series data to render despite having series\",\n {\n count: this.series.size,\n rendererAvailable: this.renderer.available,\n }\n );\n }\n\n this.renderer.render(seriesData, {\n bounds: this.viewBounds,\n backgroundColor: this.backgroundColor,\n });\n\n // Overlay render\n const rect = this.container.getBoundingClientRect();\n if (rect.width === 0 || rect.height === 0) {\n console.warn(\n \"[SciChart] Container has zero size in render, skipping overlay\"\n );\n return;\n }\n\n this.overlay.clear(rect.width, rect.height);\n this.overlay.drawGrid(plotArea, this.xScale, this.yScale);\n this.overlay.drawXAxis(plotArea, this.xScale, this.xAxisOptions.label);\n this.overlay.drawYAxis(plotArea, this.yScale, this.yAxisOptions.label);\n this.overlay.drawPlotBorder(plotArea);\n\n // Draw Selection Box\n if (this.selectionRect) {\n this.overlay.drawSelectionRect(this.selectionRect);\n }\n\n // Legend is now handled by ChartLegend component (HTML)\n\n if (this.cursorOptions?.enabled && this.cursorPosition) {\n const cursor: CursorState = {\n enabled: true,\n x: this.cursorPosition.x,\n y: this.cursorPosition.y,\n crosshair: this.cursorOptions.crosshair ?? false,\n tooltipText: this.cursorOptions.formatter\n ? this.cursorOptions.formatter(\n this.pixelToDataX(this.cursorPosition.x),\n this.pixelToDataY(this.cursorPosition.y),\n \"\"\n )\n : `X: ${this.pixelToDataX(this.cursorPosition.x).toFixed(\n 3\n )}\\nY: ${this.pixelToDataY(this.cursorPosition.y).toExponential(\n 2\n )}`,\n };\n this.overlay.drawCursor(plotArea, cursor);\n }\n\n const frameTime = performance.now() - start;\n this.events.emit(\"render\", {\n fps: frameTime > 0 ? 1000 / frameTime : 999,\n frameTime,\n });\n }\n\n private pixelToDataX(px: number): number {\n const pa = this.getPlotArea();\n return (\n this.viewBounds.xMin +\n ((px - pa.x) / pa.width) * (this.viewBounds.xMax - this.viewBounds.xMin)\n );\n }\n\n private pixelToDataY(py: number): number {\n const pa = this.getPlotArea();\n return (\n this.viewBounds.yMin +\n (1 - (py - pa.y) / pa.height) *\n (this.viewBounds.yMax - this.viewBounds.yMin)\n );\n }\n\n private startRenderLoop(): void {\n const loop = () => {\n if (this.isDestroyed) return;\n if (this.needsRender) {\n this.render();\n this.needsRender = false;\n }\n this.animationFrameId = requestAnimationFrame(loop);\n };\n this.animationFrameId = requestAnimationFrame(loop);\n }\n\n // ----------------------------------------\n // Events & Cleanup\n // ----------------------------------------\n\n on<K extends keyof ChartEventMap>(\n e: K,\n h: (d: ChartEventMap[K]) => void\n ): void {\n this.events.on(e, h);\n }\n off<K extends keyof ChartEventMap>(\n e: K,\n h: (d: ChartEventMap[K]) => void\n ): void {\n this.events.off(e, h);\n }\n\n destroy(): void {\n this.isDestroyed = true;\n if (this.animationFrameId) cancelAnimationFrame(this.animationFrameId);\n this.interaction.destroy();\n this.series.forEach((s) => {\n this.renderer.deleteBuffer(s.getId());\n s.destroy();\n });\n this.series.clear();\n this.renderer.destroy();\n if (this.controls) this.controls.destroy();\n if (this.legend) this.legend.destroy();\n\n // Remove our canvases and UI elements, but NOT the container itself\n // as it belongs to the caller (e.g. React/Vue ref)\n while (this.container.firstChild) {\n this.container.removeChild(this.container.firstChild);\n }\n\n console.log(\"[SciChart] Destroyed\");\n }\n\n private handleBoxZoom(\n rect: { x: number; y: number; width: number; height: number } | null\n ): void {\n if (rect === null) {\n if (\n this.selectionRect &&\n this.selectionRect.width > 5 &&\n this.selectionRect.height > 5\n ) {\n const plotArea = this.getPlotArea();\n const bounds = this.viewBounds;\n\n const xMinNorm = (this.selectionRect.x - plotArea.x) / plotArea.width;\n const xMaxNorm =\n (this.selectionRect.x + this.selectionRect.width - plotArea.x) /\n plotArea.width;\n const yMaxNorm =\n 1 - (this.selectionRect.y - plotArea.y) / plotArea.height;\n const yMinNorm =\n 1 -\n (this.selectionRect.y + this.selectionRect.height - plotArea.y) /\n plotArea.height;\n\n const newXMin = bounds.xMin + xMinNorm * (bounds.xMax - bounds.xMin);\n const newXMax = bounds.xMin + xMaxNorm * (bounds.xMax - bounds.xMin);\n const newYMin = bounds.yMin + yMinNorm * (bounds.yMax - bounds.yMin);\n const newYMax = bounds.yMin + yMaxNorm * (bounds.yMax - bounds.yMin);\n\n this.zoom({\n x: [newXMin, newXMax],\n y: [newYMin, newYMax],\n });\n }\n this.selectionRect = null;\n } else {\n this.selectionRect = rect;\n }\n this.requestRender();\n }\n}\n\n// ============================================\n// Factory\n// ============================================\n\nexport function createChart(options: ChartOptions): Chart {\n return new ChartImpl(options);\n}\nexport { ChartOptions };\n","/**\n * WebGL Renderer Interface & Factory\n *\n * This module provides a common interface for WebGL rendering.\n * Currently optimized for NativeWebGLRenderer (zero dependencies).\n */\n\nimport type { Bounds, SeriesStyle } from '../types';\nimport { NativeWebGLRenderer } from './NativeWebGLRenderer';\n\n// ============================================\n// Common Types\n// ============================================\n\nexport interface SeriesRenderData {\n id: string;\n buffer: WebGLBuffer;\n count: number;\n style: SeriesStyle;\n visible: boolean;\n type: 'line' | 'scatter';\n}\n\nexport interface RenderOptions {\n bounds: Bounds;\n backgroundColor?: [number, number, number, number];\n}\n\n// ============================================\n// Renderer Interface\n// ============================================\n\n/**\n * Common interface for all WebGL renderer implementations\n */\nexport interface IWebGLRenderer {\n /** Check if WebGL is available and initialized */\n readonly available: boolean;\n\n /**\n * Create or update a GPU buffer with interleaved X,Y data\n * @param id - Unique buffer identifier\n * @param data - Interleaved Float32Array [x0, y0, x1, y1, ...]\n */\n createBuffer(id: string, data: Float32Array): void;\n\n /**\n * Get a buffer by ID\n */\n getBuffer(id: string): WebGLBuffer | undefined;\n\n /**\n * Delete a buffer and free GPU memory\n */\n deleteBuffer(id: string): void;\n\n /**\n * Render a frame with all visible series\n */\n render(series: SeriesRenderData[], options: RenderOptions): void;\n\n /**\n * Handle canvas resize\n */\n resize(): void;\n\n /**\n * Get WebGL capabilities/limits\n */\n getLimits(): Record<string, unknown>;\n\n /**\n * Cleanup and destroy all GPU resources\n */\n destroy(): void;\n}\n\n// ============================================\n// Factory Functions\n// ============================================\n\n/**\n * Create a WebGL renderer (Native WebGL)\n *\n * @param canvas - Target canvas element\n */\nexport function createRenderer(canvas: HTMLCanvasElement): IWebGLRenderer {\n return new NativeWebGLRenderer(canvas);\n}\n\n/**\n * Create a renderer synchronously (native only)\n */\nexport { NativeWebGLRenderer as createNativeRenderer } from './NativeWebGLRenderer';\n","/**\n * LTTB (Largest-Triangle-Three-Buckets) Downsampling Algorithm\n *\n * This algorithm downsamples time-series data while preserving visual features.\n * It's much better than naive sampling for preserving peaks and valleys.\n *\n * Reference: https://skemman.is/bitstream/1946/15343/3/SS_MSthesis.pdf\n */\n\nexport interface DownsampleResult {\n x: Float32Array;\n y: Float32Array;\n /** Original indices of selected points */\n indices: Uint32Array;\n}\n\n/**\n * Downsample data using LTTB algorithm\n *\n * @param x - X values (e.g., potential)\n * @param y - Y values (e.g., current)\n * @param targetPoints - Number of output points\n * @returns Downsampled data\n */\nexport function lttbDownsample(\n x: Float32Array | Float64Array,\n y: Float32Array | Float64Array,\n targetPoints: number\n): DownsampleResult {\n const length = x.length;\n\n // No need to downsample\n if (targetPoints >= length || targetPoints <= 2) {\n return {\n x: new Float32Array(x),\n y: new Float32Array(y),\n indices: new Uint32Array(Array.from({ length }, (_, i) => i)),\n };\n }\n\n const outX = new Float32Array(targetPoints);\n const outY = new Float32Array(targetPoints);\n const outIndices = new Uint32Array(targetPoints);\n\n // Always include first point\n outX[0] = x[0];\n outY[0] = y[0];\n outIndices[0] = 0;\n\n // Bucket size\n const bucketSize = (length - 2) / (targetPoints - 2);\n\n let a = 0; // Previous selected point index\n let outIdx = 1;\n\n for (let i = 0; i < targetPoints - 2; i++) {\n // Calculate bucket boundaries\n const bucketStart = Math.floor((i + 1) * bucketSize) + 1;\n const bucketEnd = Math.floor((i + 2) * bucketSize) + 1;\n\n // Calculate average point of next bucket\n const nextBucketStart = Math.min(bucketEnd, length - 1);\n const nextBucketEnd = Math.min(\n Math.floor((i + 3) * bucketSize) + 1,\n length\n );\n\n let avgX = 0;\n let avgY = 0;\n let avgCount = 0;\n\n for (let j = nextBucketStart; j < nextBucketEnd; j++) {\n avgX += x[j];\n avgY += y[j];\n avgCount++;\n }\n\n if (avgCount > 0) {\n avgX /= avgCount;\n avgY /= avgCount;\n }\n\n // Find point in current bucket with largest triangle area\n let maxArea = -1;\n let maxIndex = bucketStart;\n\n const aX = x[a];\n const aY = y[a];\n\n for (let j = bucketStart; j < bucketEnd && j < length; j++) {\n // Calculate triangle area (simplified: |x1(y2-y3) + x2(y3-y1) + x3(y1-y2)| / 2)\n const area = Math.abs(\n (aX - avgX) * (y[j] - aY) - (aX - x[j]) * (avgY - aY)\n );\n\n if (area > maxArea) {\n maxArea = area;\n maxIndex = j;\n }\n }\n\n // Store selected point\n outX[outIdx] = x[maxIndex];\n outY[outIdx] = y[maxIndex];\n outIndices[outIdx] = maxIndex;\n\n a = maxIndex;\n outIdx++;\n }\n\n // Always include last point\n outX[targetPoints - 1] = x[length - 1];\n outY[targetPoints - 1] = y[length - 1];\n outIndices[targetPoints - 1] = length - 1;\n\n return { x: outX, y: outY, indices: outIndices };\n}\n\n/**\n * Min-Max per bucket downsampling\n *\n * Simpler alternative to LTTB that preserves extremes in each bucket.\n * Uses 2 points per bucket (min and max), so output is ~2x target.\n */\nexport function minMaxDownsample(\n x: Float32Array | Float64Array,\n y: Float32Array | Float64Array,\n bucketCount: number\n): DownsampleResult {\n const length = x.length;\n\n if (bucketCount >= length / 2) {\n return {\n x: new Float32Array(x),\n y: new Float32Array(y),\n indices: new Uint32Array(Array.from({ length }, (_, i) => i)),\n };\n }\n\n const bucketSize = length / bucketCount;\n const outX: number[] = [];\n const outY: number[] = [];\n const outIndices: number[] = [];\n\n for (let b = 0; b < bucketCount; b++) {\n const start = Math.floor(b * bucketSize);\n const end = Math.floor((b + 1) * bucketSize);\n\n let minY = Infinity;\n let maxY = -Infinity;\n let minIdx = start;\n let maxIdx = start;\n\n for (let i = start; i < end && i < length; i++) {\n if (y[i] < minY) {\n minY = y[i];\n minIdx = i;\n }\n if (y[i] > maxY) {\n maxY = y[i];\n maxIdx = i;\n }\n }\n\n // Add points in order (min first if it comes before max)\n if (minIdx <= maxIdx) {\n outX.push(x[minIdx], x[maxIdx]);\n outY.push(y[minIdx], y[maxIdx]);\n outIndices.push(minIdx, maxIdx);\n } else {\n outX.push(x[maxIdx], x[minIdx]);\n outY.push(y[maxIdx], y[minIdx]);\n outIndices.push(maxIdx, minIdx);\n }\n }\n\n return {\n x: new Float32Array(outX),\n y: new Float32Array(outY),\n indices: new Uint32Array(outIndices),\n };\n}\n\n/**\n * Calculate optimal target points based on canvas width\n */\nexport function calculateTargetPoints(\n dataLength: number,\n canvasWidth: number,\n pointsPerPixel = 2\n): number {\n // Never draw more than pointsPerPixel per pixel\n const maxPoints = canvasWidth * pointsPerPixel;\n return Math.min(dataLength, maxPoints);\n}\n","/**\n * Data Analysis Utilities\n *\n * General-purpose utilities for scientific data formatting,\n * cycle detection, peak detection, and data validation.\n */\n\n// ============================================\n// Unit Prefixes\n// ============================================\n\ntype SIPrefix = 'p' | 'n' | 'µ' | 'm' | '' | 'k' | 'M' | 'G';\n\nexport interface PrefixInfo {\n symbol: SIPrefix;\n factor: number;\n}\n\nconst SI_PREFIXES: PrefixInfo[] = [\n { symbol: 'p', factor: 1e-12 },\n { symbol: 'n', factor: 1e-9 },\n { symbol: 'µ', factor: 1e-6 },\n { symbol: 'm', factor: 1e-3 },\n { symbol: '', factor: 1 },\n { symbol: 'k', factor: 1e3 },\n { symbol: 'M', factor: 1e6 },\n { symbol: 'G', factor: 1e9 },\n];\n\n/**\n * Find the best SI prefix for a value\n */\nexport function getBestPrefix(value: number): PrefixInfo {\n const absValue = Math.abs(value);\n\n if (absValue === 0) {\n return { symbol: '', factor: 1 };\n }\n\n // Find prefix where value becomes 1-999\n for (let i = SI_PREFIXES.length - 1; i >= 0; i--) {\n const prefix = SI_PREFIXES[i];\n const scaled = absValue / prefix.factor;\n if (scaled >= 1 && scaled < 1000) {\n return prefix;\n }\n }\n\n // Default to base unit\n return { symbol: '', factor: 1 };\n}\n\n/**\n * Format a value with automatic SI prefix\n *\n * @example\n * formatWithPrefix(0.000001, 'A') // \"1.00 µA\"\n * formatWithPrefix(0.5, 'V') // \"500 mV\"\n * formatWithPrefix(1500, 'm') // \"1.50 km\"\n */\nexport function formatWithPrefix(\n value: number,\n unit: string,\n decimals = 2\n): string {\n const prefix = getBestPrefix(value);\n const scaled = value / prefix.factor;\n return `${scaled.toFixed(decimals)} ${prefix.symbol}${unit}`;\n}\n\n/**\n * Format a numeric value with specified decimals\n * Automatically switches to scientific notation for very large/small values\n */\nexport function formatValue(value: number, decimals = 3): string {\n if (Math.abs(value) < 0.001 || Math.abs(value) >= 1e6) {\n return value.toExponential(decimals);\n }\n return value.toFixed(decimals);\n}\n\n/**\n * Format value in scientific notation\n */\nexport function formatScientific(value: number, decimals = 2): string {\n return value.toExponential(decimals);\n}\n\n// ============================================\n// Cycle Detection\n// ============================================\n\nexport interface CycleInfo {\n /** Cycle number (1-indexed) */\n number: number;\n /** Start index in data array */\n startIndex: number;\n /** End index in data array */\n endIndex: number;\n /** Direction at start: 1 = forward, -1 = reverse */\n direction: 1 | -1;\n}\n\n/**\n * Detect cycles in oscillating data\n *\n * A cycle is complete when the signal returns to its starting value\n * after going through both sweep directions. Useful for:\n * - Cyclic voltammetry data\n * - Periodic signals\n * - Oscillation analysis\n *\n * @param signal - The signal data (e.g., potential, position, etc.)\n * @param tolerance - How close to starting value to consider a cycle complete\n */\nexport function detectCycles(\n signal: Float32Array | Float64Array | number[],\n tolerance = 0.001\n): CycleInfo[] {\n const data = signal instanceof Array ? new Float32Array(signal) : signal;\n \n if (data.length < 3) return [];\n\n const cycles: CycleInfo[] = [];\n let cycleStart = 0;\n let cycleNumber = 1;\n\n // Determine initial direction\n let prevDirection = Math.sign(data[1] - data[0]);\n let directionChanges = 0;\n\n for (let i = 2; i < data.length; i++) {\n const direction = Math.sign(data[i] - data[i - 1]);\n\n // Skip if no movement\n if (direction === 0) continue;\n\n // Direction change detected\n if (direction !== prevDirection) {\n directionChanges++;\n\n // After 2 direction changes, check if we're back at start\n if (directionChanges >= 2) {\n const startValue = data[cycleStart];\n const currentValue = data[i];\n\n if (Math.abs(currentValue - startValue) < tolerance) {\n cycles.push({\n number: cycleNumber,\n startIndex: cycleStart,\n endIndex: i,\n direction: data[cycleStart + 1] > data[cycleStart] ? 1 : -1,\n });\n\n cycleNumber++;\n cycleStart = i;\n directionChanges = 0;\n }\n }\n\n prevDirection = direction;\n }\n }\n\n // Handle last incomplete cycle\n if (cycleStart < data.length - 1) {\n cycles.push({\n number: cycleNumber,\n startIndex: cycleStart,\n endIndex: data.length - 1,\n direction: data[cycleStart + 1] > data[cycleStart] ? 1 : -1,\n });\n }\n\n return cycles;\n}\n\n/**\n * Generate distinct colors for cycles/series\n *\n * Uses HSL color space to generate evenly distributed hues\n */\nexport function generateCycleColors(count: number): string[] {\n const colors: string[] = [];\n const hueStep = 360 / Math.max(count, 1);\n\n for (let i = 0; i < count; i++) {\n const hue = (i * hueStep) % 360;\n colors.push(`hsl(${hue}, 70%, 55%)`);\n }\n\n return colors;\n}\n\n// ============================================\n// Peak Detection\n// ============================================\n\nexport interface Peak {\n /** Index in data array */\n index: number;\n /** X value at peak */\n x: number;\n /** Y value at peak */\n y: number;\n /** Peak type */\n type: 'max' | 'min';\n /** Prominence of the peak */\n prominence: number;\n}\n\n/**\n * Detect peaks (local maxima and minima) in data\n *\n * Uses simple local extrema detection with optional prominence filtering.\n * Useful for:\n * - Signal peak detection\n * - Finding local maxima/minima\n * - Feature extraction\n *\n * @param x - X values (independent variable)\n * @param y - Y values (dependent variable)\n * @param options - Detection options\n */\nexport function detectPeaks(\n x: Float32Array | Float64Array | number[],\n y: Float32Array | Float64Array | number[],\n options: {\n /** Minimum prominence to be considered a peak */\n minProminence?: number;\n /** Only return 'max' or 'min' peaks */\n type?: 'max' | 'min' | 'both';\n } = {}\n): Peak[] {\n const { minProminence = 0, type = 'both' } = options;\n const peaks: Peak[] = [];\n\n const xData = x instanceof Array ? new Float32Array(x) : x;\n const yData = y instanceof Array ? new Float32Array(y) : y;\n\n for (let i = 1; i < yData.length - 1; i++) {\n const prev = yData[i - 1];\n const curr = yData[i];\n const next = yData[i + 1];\n\n // Local maximum\n if (curr > prev && curr > next) {\n const prominence = Math.min(curr - prev, curr - next);\n if (prominence >= minProminence && (type === 'both' || type === 'max')) {\n peaks.push({ index: i, x: xData[i], y: curr, type: 'max', prominence });\n }\n }\n\n // Local minimum\n if (curr < prev && curr < next) {\n const prominence = Math.min(prev - curr, next - curr);\n if (prominence >= minProminence && (type === 'both' || type === 'min')) {\n peaks.push({ index: i, x: xData[i], y: curr, type: 'min', prominence });\n }\n }\n }\n\n return peaks;\n}\n\n// ============================================\n// Data Validation\n// ============================================\n\nexport interface ValidationResult {\n /** Whether all data is valid */\n valid: boolean;\n /** Number of invalid values (NaN, Infinity, etc.) */\n invalidCount: number;\n /** Index of first invalid value (-1 if all valid) */\n firstInvalidIndex: number;\n}\n\n/**\n * Validate that data contains only finite numbers\n *\n * Checks for NaN, Infinity, and -Infinity values.\n * Useful for data quality checks before rendering.\n */\nexport function validateData(\n data: Float32Array | Float64Array | number[]\n): ValidationResult {\n let invalidCount = 0;\n let firstInvalidIndex = -1;\n\n const arr = data instanceof Array ? data : Array.from(data);\n\n for (let i = 0; i < arr.length; i++) {\n if (!isFinite(arr[i])) {\n invalidCount++;\n if (firstInvalidIndex === -1) {\n firstInvalidIndex = i;\n }\n }\n }\n\n return {\n valid: invalidCount === 0,\n invalidCount,\n firstInvalidIndex,\n };\n}\n\n// ============================================\n// Data Statistics\n// ============================================\n\nexport interface DataStats {\n min: number;\n max: number;\n mean: number;\n stdDev: number;\n count: number;\n}\n\n/**\n * Calculate basic statistics for a dataset\n */\nexport function calculateStats(\n data: Float32Array | Float64Array | number[]\n): DataStats {\n const arr = data instanceof Array ? data : Array.from(data);\n const count = arr.length;\n\n if (count === 0) {\n return { min: 0, max: 0, mean: 0, stdDev: 0, count: 0 };\n }\n\n let min = arr[0];\n let max = arr[0];\n let sum = 0;\n\n for (let i = 0; i < count; i++) {\n const val = arr[i];\n if (val < min) min = val;\n if (val > max) max = val;\n sum += val;\n }\n\n const mean = sum / count;\n\n // Calculate standard deviation\n let sumSquaredDiff = 0;\n for (let i = 0; i < count; i++) {\n const diff = arr[i] - mean;\n sumSquaredDiff += diff * diff;\n }\n const stdDev = Math.sqrt(sumSquaredDiff / count);\n\n return { min, max, mean, stdDev, count };\n}\n\n// ============================================\n// Data Smoothing\n// ============================================\n\n/**\n * Apply moving average smoothing to data\n *\n * @param data - Input data array\n * @param windowSize - Number of points to average (must be odd)\n */\nexport function movingAverage(\n data: Float32Array | Float64Array | number[],\n windowSize: number\n): Float32Array {\n const arr = data instanceof Array ? new Float32Array(data) : data;\n const result = new Float32Array(arr.length);\n const halfWindow = Math.floor(windowSize / 2);\n\n for (let i = 0; i < arr.length; i++) {\n let sum = 0;\n let count = 0;\n\n for (let j = Math.max(0, i - halfWindow); j <= Math.min(arr.length - 1, i + halfWindow); j++) {\n sum += arr[j];\n count++;\n }\n\n result[i] = sum / count;\n }\n\n return result;\n}\n\n/**\n * Downsample data using LTTB (Largest Triangle Three Buckets) algorithm\n *\n * Preserves visual characteristics while reducing point count.\n * Ideal for rendering large datasets efficiently.\n *\n * @param x - X values\n * @param y - Y values\n * @param targetPoints - Desired number of output points\n */\nexport function downsampleLTTB(\n x: Float32Array | Float64Array,\n y: Float32Array | Float64Array,\n targetPoints: number\n): { x: Float32Array; y: Float32Array } {\n const dataLength = x.length;\n\n if (targetPoints >= dataLength || targetPoints < 3) {\n return { x: new Float32Array(x), y: new Float32Array(y) };\n }\n\n const sampledX = new Float32Array(targetPoints);\n const sampledY = new Float32Array(targetPoints);\n\n // Always include first point\n sampledX[0] = x[0];\n sampledY[0] = y[0];\n\n const bucketSize = (dataLength - 2) / (targetPoints - 2);\n\n let a = 0; // Previous selected point index\n let sampledIndex = 1;\n\n for (let i = 0; i < targetPoints - 2; i++) {\n // Calculate bucket range\n const bucketStart = Math.floor((i + 1) * bucketSize) + 1;\n const bucketEnd = Math.floor((i + 2) * bucketSize) + 1;\n const nextBucketEnd = Math.min(Math.floor((i + 3) * bucketSize) + 1, dataLength);\n\n // Calculate average of next bucket for comparison\n let avgX = 0;\n let avgY = 0;\n let avgCount = 0;\n\n for (let j = bucketEnd; j < nextBucketEnd; j++) {\n avgX += x[j];\n avgY += y[j];\n avgCount++;\n }\n\n if (avgCount > 0) {\n avgX /= avgCount;\n avgY /= avgCount;\n }\n\n // Find point in current bucket with largest triangle area\n let maxArea = -1;\n let maxAreaIndex = bucketStart;\n\n for (let j = bucketStart; j < bucketEnd && j < dataLength; j++) {\n // Triangle area calculation\n const area = Math.abs(\n (x[a] - avgX) * (y[j] - y[a]) - (x[a] - x[j]) * (avgY - y[a])\n );\n\n if (area > maxArea) {\n maxArea = area;\n maxAreaIndex = j;\n }\n }\n\n sampledX[sampledIndex] = x[maxAreaIndex];\n sampledY[sampledIndex] = y[maxAreaIndex];\n sampledIndex++;\n a = maxAreaIndex;\n }\n\n // Always include last point\n sampledX[targetPoints - 1] = x[dataLength - 1];\n sampledY[targetPoints - 1] = y[dataLength - 1];\n\n return { x: sampledX, y: sampledY };\n}\n","/**\n * @license React\n * react-jsx-runtime.production.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\"use strict\";\nvar REACT_ELEMENT_TYPE = Symbol.for(\"react.transitional.element\"),\n REACT_FRAGMENT_TYPE = Symbol.for(\"react.fragment\");\nfunction jsxProd(type, config, maybeKey) {\n var key = null;\n void 0 !== maybeKey && (key = \"\" + maybeKey);\n void 0 !== config.key && (key = \"\" + config.key);\n if (\"key\" in config) {\n maybeKey = {};\n for (var propName in config)\n \"key\" !== propName && (maybeKey[propName] = config[propName]);\n } else maybeKey = config;\n config = maybeKey.ref;\n return {\n $$typeof: REACT_ELEMENT_TYPE,\n type: type,\n key: key,\n ref: void 0 !== config ? config : null,\n props: maybeKey\n };\n}\nexports.Fragment = REACT_FRAGMENT_TYPE;\nexports.jsx = jsxProd;\nexports.jsxs = jsxProd;\n","/**\n * @license React\n * react-jsx-runtime.development.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\"use strict\";\n\"production\" !== process.env.NODE_ENV &&\n (function () {\n function getComponentNameFromType(type) {\n if (null == type) return null;\n if (\"function\" === typeof type)\n return type.$$typeof === REACT_CLIENT_REFERENCE\n ? null\n : type.displayName || type.name || null;\n if (\"string\" === typeof type) return type;\n switch (type) {\n case REACT_FRAGMENT_TYPE:\n return \"Fragment\";\n case REACT_PROFILER_TYPE:\n return \"Profiler\";\n case REACT_STRICT_MODE_TYPE:\n return \"StrictMode\";\n case REACT_SUSPENSE_TYPE:\n return \"Suspense\";\n case REACT_SUSPENSE_LIST_TYPE:\n return \"SuspenseList\";\n case REACT_ACTIVITY_TYPE:\n return \"Activity\";\n }\n if (\"object\" === typeof type)\n switch (\n (\"number\" === typeof type.tag &&\n console.error(\n \"Received an unexpected object in getComponentNameFromType(). This is likely a bug in React. Please file an issue.\"\n ),\n type.$$typeof)\n ) {\n case REACT_PORTAL_TYPE:\n return \"Portal\";\n case REACT_CONTEXT_TYPE:\n return type.displayName || \"Context\";\n case REACT_CONSUMER_TYPE:\n return (type._context.displayName || \"Context\") + \".Consumer\";\n case REACT_FORWARD_REF_TYPE:\n var innerType = type.render;\n type = type.displayName;\n type ||\n ((type = innerType.displayName || innerType.name || \"\"),\n (type = \"\" !== type ? \"ForwardRef(\" + type + \")\" : \"ForwardRef\"));\n return type;\n case REACT_MEMO_TYPE:\n return (\n (innerType = type.displayName || null),\n null !== innerType\n ? innerType\n : getComponentNameFromType(type.type) || \"Memo\"\n );\n case REACT_LAZY_TYPE:\n innerType = type._payload;\n type = type._init;\n try {\n return getComponentNameFromType(type(innerType));\n } catch (x) {}\n }\n return null;\n }\n function testStringCoercion(value) {\n return \"\" + value;\n }\n function checkKeyStringCoercion(value) {\n try {\n testStringCoercion(value);\n var JSCompiler_inline_result = !1;\n } catch (e) {\n JSCompiler_inline_result = !0;\n }\n if (JSCompiler_inline_result) {\n JSCompiler_inline_result = console;\n var JSCompiler_temp_const = JSCompiler_inline_result.error;\n var JSCompiler_inline_result$jscomp$0 =\n (\"function\" === typeof Symbol &&\n Symbol.toStringTag &&\n value[Symbol.toStringTag]) ||\n value.constructor.name ||\n \"Object\";\n JSCompiler_temp_const.call(\n JSCompiler_inline_result,\n \"The provided key is an unsupported type %s. This value must be coerced to a string before using it here.\",\n JSCompiler_inline_result$jscomp$0\n );\n return testStringCoercion(value);\n }\n }\n function getTaskName(type) {\n if (type === REACT_FRAGMENT_TYPE) return \"<>\";\n if (\n \"object\" === typeof type &&\n null !== type &&\n type.$$typeof === REACT_LAZY_TYPE\n )\n return \"<...>\";\n try {\n var name = getComponentNameFromType(type);\n return name ? \"<\" + name + \">\" : \"<...>\";\n } catch (x) {\n return \"<...>\";\n }\n }\n function getOwner() {\n var dispatcher = ReactSharedInternals.A;\n return null === dispatcher ? null : dispatcher.getOwner();\n }\n function UnknownOwner() {\n return Error(\"react-stack-top-frame\");\n }\n function hasValidKey(config) {\n if (hasOwnProperty.call(config, \"key\")) {\n var getter = Object.getOwnPropertyDescriptor(config, \"key\").get;\n if (getter && getter.isReactWarning) return !1;\n }\n return void 0 !== config.key;\n }\n function defineKeyPropWarningGetter(props, displayName) {\n function warnAboutAccessingKey() {\n specialPropKeyWarningShown ||\n ((specialPropKeyWarningShown = !0),\n console.error(\n \"%s: `key` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://react.dev/link/special-props)\",\n displayName\n ));\n }\n warnAboutAccessingKey.isReactWarning = !0;\n Object.defineProperty(props, \"key\", {\n get: warnAboutAccessingKey,\n configurable: !0\n });\n }\n function elementRefGetterWithDeprecationWarning() {\n var componentName = getComponentNameFromType(this.type);\n didWarnAboutElementRef[componentName] ||\n ((didWarnAboutElementRef[componentName] = !0),\n console.error(\n \"Accessing element.ref was removed in React 19. ref is now a regular prop. It will be removed from the JSX Element type in a future release.\"\n ));\n componentName = this.props.ref;\n return void 0 !== componentName ? componentName : null;\n }\n function ReactElement(type, key, props, owner, debugStack, debugTask) {\n var refProp = props.ref;\n type = {\n $$typeof: REACT_ELEMENT_TYPE,\n type: type,\n key: key,\n props: props,\n _owner: owner\n };\n null !== (void 0 !== refProp ? refProp : null)\n ? Object.defineProperty(type, \"ref\", {\n enumerable: !1,\n get: elementRefGetterWithDeprecationWarning\n })\n : Object.defineProperty(type, \"ref\", { enumerable: !1, value: null });\n type._store = {};\n Object.defineProperty(type._store, \"validated\", {\n configurable: !1,\n enumerable: !1,\n writable: !0,\n value: 0\n });\n Object.defineProperty(type, \"_debugInfo\", {\n configurable: !1,\n enumerable: !1,\n writable: !0,\n value: null\n });\n Object.defineProperty(type, \"_debugStack\", {\n configurable: !1,\n enumerable: !1,\n writable: !0,\n value: debugStack\n });\n Object.defineProperty(type, \"_debugTask\", {\n configurable: !1,\n enumerable: !1,\n writable: !0,\n value: debugTask\n });\n Object.freeze && (Object.freeze(type.props), Object.freeze(type));\n return type;\n }\n function jsxDEVImpl(\n type,\n config,\n maybeKey,\n isStaticChildren,\n debugStack,\n debugTask\n ) {\n var children = config.children;\n if (void 0 !== children)\n if (isStaticChildren)\n if (isArrayImpl(children)) {\n for (\n isStaticChildren = 0;\n isStaticChildren < children.length;\n isStaticChildren++\n )\n validateChildKeys(children[isStaticChildren]);\n Object.freeze && Object.freeze(children);\n } else\n console.error(\n \"React.jsx: Static children should always be an array. You are likely explicitly calling React.jsxs or React.jsxDEV. Use the Babel transform instead.\"\n );\n else validateChildKeys(children);\n if (hasOwnProperty.call(config, \"key\")) {\n children = getComponentNameFromType(type);\n var keys = Object.keys(config).filter(function (k) {\n return \"key\" !== k;\n });\n isStaticChildren =\n 0 < keys.length\n ? \"{key: someKey, \" + keys.join(\": ..., \") + \": ...}\"\n : \"{key: someKey}\";\n didWarnAboutKeySpread[children + isStaticChildren] ||\n ((keys =\n 0 < keys.length ? \"{\" + keys.join(\": ..., \") + \": ...}\" : \"{}\"),\n console.error(\n 'A props object containing a \"key\" prop is being spread into JSX:\\n let props = %s;\\n <%s {...props} />\\nReact keys must be passed directly to JSX without using spread:\\n let props = %s;\\n <%s key={someKey} {...props} />',\n isStaticChildren,\n children,\n keys,\n children\n ),\n (didWarnAboutKeySpread[children + isStaticChildren] = !0));\n }\n children = null;\n void 0 !== maybeKey &&\n (checkKeyStringCoercion(maybeKey), (children = \"\" + maybeKey));\n hasValidKey(config) &&\n (checkKeyStringCoercion(config.key), (children = \"\" + config.key));\n if (\"key\" in config) {\n maybeKey = {};\n for (var propName in config)\n \"key\" !== propName && (maybeKey[propName] = config[propName]);\n } else maybeKey = config;\n children &&\n defineKeyPropWarningGetter(\n maybeKey,\n \"function\" === typeof type\n ? type.displayName || type.name || \"Unknown\"\n : type\n );\n return ReactElement(\n type,\n children,\n maybeKey,\n getOwner(),\n debugStack,\n debugTask\n );\n }\n function validateChildKeys(node) {\n isValidElement(node)\n ? node._store && (node._store.validated = 1)\n : \"object\" === typeof node &&\n null !== node &&\n node.$$typeof === REACT_LAZY_TYPE &&\n (\"fulfilled\" === node._payload.status\n ? isValidElement(node._payload.value) &&\n node._payload.value._store &&\n (node._payload.value._store.validated = 1)\n : node._store && (node._store.validated = 1));\n }\n function isValidElement(object) {\n return (\n \"object\" === typeof object &&\n null !== object &&\n object.$$typeof === REACT_ELEMENT_TYPE\n );\n }\n var React = require(\"react\"),\n REACT_ELEMENT_TYPE = Symbol.for(\"react.transitional.element\"),\n REACT_PORTAL_TYPE = Symbol.for(\"react.portal\"),\n REACT_FRAGMENT_TYPE = Symbol.for(\"react.fragment\"),\n REACT_STRICT_MODE_TYPE = Symbol.for(\"react.strict_mode\"),\n REACT_PROFILER_TYPE = Symbol.for(\"react.profiler\"),\n REACT_CONSUMER_TYPE = Symbol.for(\"react.consumer\"),\n REACT_CONTEXT_TYPE = Symbol.for(\"react.context\"),\n REACT_FORWARD_REF_TYPE = Symbol.for(\"react.forward_ref\"),\n REACT_SUSPENSE_TYPE = Symbol.for(\"react.suspense\"),\n REACT_SUSPENSE_LIST_TYPE = Symbol.for(\"react.suspense_list\"),\n REACT_MEMO_TYPE = Symbol.for(\"react.memo\"),\n REACT_LAZY_TYPE = Symbol.for(\"react.lazy\"),\n REACT_ACTIVITY_TYPE = Symbol.for(\"react.activity\"),\n REACT_CLIENT_REFERENCE = Symbol.for(\"react.client.reference\"),\n ReactSharedInternals =\n React.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE,\n hasOwnProperty = Object.prototype.hasOwnProperty,\n isArrayImpl = Array.isArray,\n createTask = console.createTask\n ? console.createTask\n : function () {\n return null;\n };\n React = {\n react_stack_bottom_frame: function (callStackForError) {\n return callStackForError();\n }\n };\n var specialPropKeyWarningShown;\n var didWarnAboutElementRef = {};\n var unknownOwnerDebugStack = React.react_stack_bottom_frame.bind(\n React,\n UnknownOwner\n )();\n var unknownOwnerDebugTask = createTask(getTaskName(UnknownOwner));\n var didWarnAboutKeySpread = {};\n exports.Fragment = REACT_FRAGMENT_TYPE;\n exports.jsx = function (type, config, maybeKey) {\n var trackActualOwner =\n 1e4 > ReactSharedInternals.recentlyCreatedOwnerStacks++;\n return jsxDEVImpl(\n type,\n config,\n maybeKey,\n !1,\n trackActualOwner\n ? Error(\"react-stack-top-frame\")\n : unknownOwnerDebugStack,\n trackActualOwner ? createTask(getTaskName(type)) : unknownOwnerDebugTask\n );\n };\n exports.jsxs = function (type, config, maybeKey) {\n var trackActualOwner =\n 1e4 > ReactSharedInternals.recentlyCreatedOwnerStacks++;\n return jsxDEVImpl(\n type,\n config,\n maybeKey,\n !0,\n trackActualOwner\n ? Error(\"react-stack-top-frame\")\n : unknownOwnerDebugStack,\n trackActualOwner ? createTask(getTaskName(type)) : unknownOwnerDebugTask\n );\n };\n })();\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('./cjs/react-jsx-runtime.production.js');\n} else {\n module.exports = require('./cjs/react-jsx-runtime.development.js');\n}\n","/**\n * useSciChart - React hook for SciChart Engine\n *\n * Manages chart lifecycle and provides a clean React API.\n */\n\nimport {\n useEffect,\n useRef,\n useState,\n useCallback,\n type RefObject,\n} from \"react\";\nimport { createChart, type Chart, type ChartOptions } from \"../core/Chart\";\nimport type {\n SeriesOptions,\n SeriesUpdateData,\n ZoomOptions,\n Bounds,\n} from \"../types\";\n\nexport interface UseSciChartOptions extends Omit<ChartOptions, \"container\"> {\n /** Auto-resize on container changes */\n autoResize?: boolean;\n}\n\nexport interface UseSciChartReturn {\n /** Chart instance (null until initialized) */\n chart: Chart | null;\n /** Whether the chart is ready */\n isReady: boolean;\n /** Error during initialization */\n error: Error | null;\n /** Current view bounds */\n bounds: Bounds | null;\n /** Add a series */\n addSeries: (options: SeriesOptions) => void;\n /** Update series data */\n updateSeries: (id: string, data: SeriesUpdateData) => void;\n /** Remove a series */\n removeSeries: (id: string) => void;\n /** Set zoom range */\n zoom: (options: ZoomOptions) => void;\n /** Reset zoom to show all data */\n resetZoom: () => void;\n}\n\n/**\n * React hook for using SciChart Engine\n *\n * @example\n * ```tsx\n * function MyChart() {\n * const canvasRef = useRef<HTMLCanvasElement>(null);\n * const { chart, isReady, addSeries, zoom } = useSciChart(canvasRef, {\n * xAxis: { label: 'E / V' },\n * yAxis: { label: 'I / A' }\n * });\n *\n * useEffect(() => {\n * if (isReady) {\n * addSeries({\n * id: 'cv-1',\n * type: 'line',\n * data: { x: xData, y: yData },\n * style: { color: '#ff0055' }\n * });\n * }\n * }, [isReady]);\n *\n * return <canvas ref={canvasRef} />;\n * }\n * ```\n */\nexport function useSciChart(\n containerRef: RefObject<HTMLDivElement>,\n options: UseSciChartOptions = {}\n): UseSciChartReturn {\n const [chart, setChart] = useState<Chart | null>(null);\n const [isReady, setIsReady] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const [bounds, setBounds] = useState<Bounds | null>(null);\n\n // Store options in ref to avoid re-creating chart on every render\n const optionsRef = useRef(options);\n optionsRef.current = options;\n\n // Initialize chart\n useEffect(() => {\n const container = containerRef.current;\n if (!container) return;\n\n try {\n const chartInstance = createChart({\n ...optionsRef.current,\n container,\n });\n\n // Listen to zoom events to update bounds\n chartInstance.on(\"zoom\", () => {\n setBounds(chartInstance.getViewBounds());\n });\n\n setChart(chartInstance);\n setIsReady(true);\n setBounds(chartInstance.getViewBounds());\n setError(null);\n\n console.log(\"[useSciChart] Chart initialized\");\n } catch (err) {\n console.error(\"[useSciChart] Failed to initialize chart:\", err);\n setError(err instanceof Error ? err : new Error(String(err)));\n setIsReady(false);\n }\n\n return () => {\n if (chart) {\n chart.destroy();\n setChart(null);\n setIsReady(false);\n }\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [containerRef]);\n\n // Memoized methods\n const addSeries = useCallback(\n (seriesOptions: SeriesOptions) => {\n if (chart) {\n chart.addSeries(seriesOptions);\n setBounds(chart.getViewBounds());\n }\n },\n [chart]\n );\n\n const updateSeries = useCallback(\n (id: string, data: SeriesUpdateData) => {\n if (chart) {\n chart.updateSeries(id, data);\n }\n },\n [chart]\n );\n\n const removeSeries = useCallback(\n (id: string) => {\n if (chart) {\n chart.removeSeries(id);\n }\n },\n [chart]\n );\n\n const zoom = useCallback(\n (zoomOptions: ZoomOptions) => {\n if (chart) {\n chart.zoom(zoomOptions);\n }\n },\n [chart]\n );\n\n const resetZoom = useCallback(() => {\n if (chart) {\n chart.resetZoom();\n setBounds(chart.getViewBounds());\n }\n }, [chart]);\n\n return {\n chart,\n isReady,\n error,\n bounds,\n addSeries,\n updateSeries,\n removeSeries,\n zoom,\n resetZoom,\n };\n}\n","/**\n * SciChart - React Component for Scientific Charts\n *\n * A declarative React component that wraps the SciChart Engine.\n */\n\nimport {\n useRef,\n useEffect,\n useImperativeHandle,\n forwardRef,\n useMemo,\n type CSSProperties,\n} from \"react\";\nimport { useSciChart, type UseSciChartOptions } from \"./useSciChart\";\nimport type {\n SeriesOptions,\n ZoomOptions,\n CursorOptions,\n Bounds,\n} from \"../types\";\nimport type { Chart } from \"../core/Chart\";\n\n// ============================================\n// Types\n// ============================================\n\nexport interface SciChartSeries {\n id: string;\n x: Float32Array | Float64Array;\n y: Float32Array | Float64Array;\n color?: string;\n width?: number;\n visible?: boolean;\n}\n\nexport interface SciChartProps extends UseSciChartOptions {\n /** Series data to display */\n series?: SciChartSeries[];\n /** Zoom state (controlled) */\n zoom?: ZoomOptions;\n /** Callback when zoom changes */\n onZoomChange?: (bounds: Bounds) => void;\n /** Cursor configuration */\n cursor?: CursorOptions;\n /** Container width */\n width?: number | string;\n /** Container height */\n height?: number | string;\n /** Additional class name */\n className?: string;\n /** Additional styles */\n style?: CSSProperties;\n /** Debug mode - shows FPS counter */\n debug?: boolean;\n}\n\nexport interface SciChartRef {\n /** Get the chart instance */\n getChart: () => Chart | null;\n /** Reset zoom to show all data */\n resetZoom: () => void;\n /** Get current bounds */\n getBounds: () => Bounds | null;\n}\n\n// ============================================\n// Component\n// ============================================\n\n/**\n * SciChart React Component\n *\n * @example\n * ```tsx\n * <SciChart\n * series={[\n * { id: 'cv-1', x: potentialData, y: currentData, color: '#ff0055' }\n * ]}\n * xAxis={{ label: 'E / V' }}\n * yAxis={{ label: 'I / A' }}\n * height={400}\n * cursor={{ enabled: true, snap: true }}\n * onZoomChange={(bounds) => console.log('Zoom:', bounds)}\n * />\n * ```\n */\nexport const SciChart = forwardRef<SciChartRef, SciChartProps>(\n function SciChart(\n {\n series = [],\n zoom: zoomProp,\n onZoomChange,\n cursor,\n width = \"100%\",\n height = 400,\n className = \"\",\n style = {},\n debug = false,\n ...chartOptions\n },\n ref\n ) {\n const containerRef = useRef<HTMLDivElement>(null);\n const previousSeriesRef = useRef<Map<string, SciChartSeries>>(new Map());\n\n const {\n chart,\n isReady,\n bounds,\n addSeries,\n updateSeries,\n removeSeries,\n resetZoom,\n } = useSciChart(containerRef, chartOptions);\n\n // Expose methods via ref\n useImperativeHandle(\n ref,\n () => ({\n getChart: () => chart,\n resetZoom,\n getBounds: () => bounds,\n }),\n [chart, resetZoom, bounds]\n );\n\n // Handle series changes\n useEffect(() => {\n if (!isReady || !chart) return;\n\n const currentSeriesMap = new Map(series.map((s) => [s.id, s]));\n const previousSeriesMap = previousSeriesRef.current;\n\n // Remove series that no longer exist\n previousSeriesMap.forEach((_, id) => {\n if (!currentSeriesMap.has(id)) {\n removeSeries(id);\n }\n });\n\n // Add or update series\n currentSeriesMap.forEach((seriesData, id) => {\n const prevSeries = previousSeriesMap.get(id);\n\n if (!prevSeries) {\n // New series - add it\n const options: SeriesOptions = {\n id: seriesData.id,\n type: \"line\",\n data: { x: seriesData.x, y: seriesData.y },\n style: {\n color: seriesData.color ?? \"#ff0055\",\n width: seriesData.width ?? 1.5,\n },\n visible: seriesData.visible ?? true,\n };\n addSeries(options);\n // Force an initial autoscale if it's the first series\n if (currentSeriesMap.size === 1) {\n chart.autoScale();\n }\n } else if (\n prevSeries.x !== seriesData.x ||\n prevSeries.y !== seriesData.y\n ) {\n // Data changed - update\n updateSeries(id, {\n x: seriesData.x,\n y: seriesData.y,\n });\n }\n });\n\n previousSeriesRef.current = currentSeriesMap;\n }, [series, isReady, chart, addSeries, updateSeries, removeSeries]);\n\n // Handle controlled zoom\n useEffect(() => {\n if (!isReady || !chart || !zoomProp) return;\n chart.zoom(zoomProp);\n }, [isReady, chart, zoomProp]);\n\n // Handle zoom change callback\n useEffect(() => {\n if (!isReady || !chart || !onZoomChange) return;\n\n chart.on(\"zoom\", (event) => {\n onZoomChange({\n xMin: event.x[0],\n xMax: event.x[1],\n yMin: event.y[0],\n yMax: event.y[1],\n });\n });\n }, [isReady, chart, onZoomChange]);\n\n // Handle cursor\n useEffect(() => {\n if (!isReady || !chart) return;\n\n if (cursor?.enabled) {\n chart.enableCursor(cursor);\n } else {\n chart.disableCursor();\n }\n }, [isReady, chart, cursor]);\n\n // Container styles\n const containerStyle = useMemo<CSSProperties>(\n () => ({\n position: \"relative\",\n width: typeof width === \"number\" ? `${width}px` : width,\n height: typeof height === \"number\" ? `${height}px` : height,\n ...style,\n }),\n [width, height, style]\n );\n\n return (\n <div\n ref={containerRef}\n className={`scichart-container ${className}`}\n style={containerStyle}\n >\n {/* Debug overlay */}\n {debug && bounds && (\n <div\n style={{\n position: \"absolute\",\n top: 8,\n right: 8,\n background: \"rgba(0,0,0,0.7)\",\n color: \"#0f0\",\n padding: \"4px 8px\",\n borderRadius: 4,\n fontSize: 11,\n fontFamily: \"monospace\",\n }}\n >\n <div>\n X: [{bounds.xMin.toFixed(3)}, {bounds.xMax.toFixed(3)}]\n </div>\n <div>\n Y: [{bounds.yMin.toExponential(2)}, {bounds.yMax.toExponential(2)}\n ]\n </div>\n <div>Series: {series.length}</div>\n </div>\n )}\n </div>\n );\n }\n);\n\nexport default SciChart;\n"],"names":["EventEmitter","__publicField","event","handler","handlers","data","error","wrappedHandler","_a","DEFAULT_STYLE","ensureTypedArray","Series","options","_b","windowSize","x","y","len","smoothedY","halfWindow","i","sum","count","j","xMin","xMax","yMin","yMax","xVal","yVal","update","newX","newY","existing","newData","combined","style","oldSmoothing","val","visible","type","LINE_VERT","LINE_FRAG","POINT_VERT","POINT_FRAG","NativeWebGLRenderer","canvas","gl","source","shader","vertSource","fragSource","hasPointSize","vertShader","fragShader","program","positionAttr","scaleUniform","translateUniform","colorUniform","result","id","buffer","currentSize","bounds","dataWidth","dataHeight","scaleX","scaleY","translateX","translateY","series","backgroundColor","uniforms","s","color","parseColor","prog","pointSize","rect","width","height","hex","r","g","b","a","interleaveData","length","LinearScale","min","max","value","d0","d1","r0","r1","normalized","pixel","step","niceStep","start","ticks","maxTicks","t","LogScale","safeMin","safeMax","logMin","logMax","logVal","p","range","rawStep","magnitude","niceNormalized","createScale","DEFAULT_AXIS_THEME","DEFAULT_GRID_THEME","DEFAULT_LEGEND_THEME","DEFAULT_CURSOR_THEME","DARK_THEME","MIDNIGHT_THEME","LIGHT_THEME","ELECTROCHEM_THEME","createTheme","base","overrides","getThemeByName","name","DEFAULT_THEME","OverlayRenderer","ctx","theme","plotArea","xScale","yScale","grid","xTicks","yTicks","tick","minorXTicks","minorYTicks","label","axis","axisY","axisX","legend","maxWidth","items","boxWidth","boxHeight","item","itemY","cursor","cursorTheme","text","lines","lineHeight","padding","line","tooltipX","tooltipY","isDark","majorTicks","divisions","minor","absVal","precision","str","mantissa","exponent","superscriptMap","unicodeExp","char","InteractionManager","container","callbacks","getPlotArea","getBounds","enabled","mouseX","mouseY","zoomX","zoomY","zoomFactor","normalizedX","normalizedY","dataX","dataY","MIN_RANGE","MAX_RANGE","nextXMin","nextXMax","nextYMin","nextYMax","nextXRange","nextYRange","newBounds","deltaX","deltaY","touch","ICONS","ChartControls","parent","bg","borderColor","shadow","sep","types","nextIdx","sep2","btn","icon","svgEl","svg","title","onClick","buttons","activeColor","smoothActiveColor","normalColor","isHover","ChartLegend","rafId","onMouseDown","e","onMouseMove","onMouseUp","updatePosition","clientX","clientY","dx","dy","tx","ty","parentRect","finalX","finalY","swatch","dpr","itemGap","swatchSize","headerHeight","MARGINS","ChartImpl","bgColor","active","dataUrl","link","c","finalCanvas","plotX","plotY","d","pa","hasValidData","xRange","yRange","MAX_VALUE","MIN_VALUE","xPad","yPad","seriesData","buf","frameTime","px","py","loop","h","xMinNorm","xMaxNorm","yMaxNorm","yMinNorm","newXMin","newXMax","newYMin","newYMax","createChart","createRenderer","lttbDownsample","targetPoints","_","outX","outY","outIndices","bucketSize","outIdx","bucketStart","bucketEnd","nextBucketStart","nextBucketEnd","avgX","avgY","avgCount","maxArea","maxIndex","aX","aY","area","minMaxDownsample","bucketCount","end","minY","maxY","minIdx","maxIdx","calculateTargetPoints","dataLength","canvasWidth","pointsPerPixel","maxPoints","SI_PREFIXES","getBestPrefix","absValue","prefix","scaled","formatWithPrefix","unit","decimals","formatValue","formatScientific","detectCycles","signal","tolerance","cycles","cycleStart","cycleNumber","prevDirection","directionChanges","direction","startValue","currentValue","generateCycleColors","colors","hueStep","hue","detectPeaks","minProminence","peaks","xData","yData","prev","curr","next","prominence","validateData","invalidCount","firstInvalidIndex","arr","calculateStats","mean","sumSquaredDiff","diff","stdDev","movingAverage","downsampleLTTB","sampledX","sampledY","sampledIndex","maxAreaIndex","REACT_ELEMENT_TYPE","REACT_FRAGMENT_TYPE","jsxProd","config","maybeKey","key","propName","reactJsxRuntime_production","getComponentNameFromType","REACT_CLIENT_REFERENCE","REACT_PROFILER_TYPE","REACT_STRICT_MODE_TYPE","REACT_SUSPENSE_TYPE","REACT_SUSPENSE_LIST_TYPE","REACT_ACTIVITY_TYPE","REACT_PORTAL_TYPE","REACT_CONTEXT_TYPE","REACT_CONSUMER_TYPE","REACT_FORWARD_REF_TYPE","innerType","REACT_MEMO_TYPE","REACT_LAZY_TYPE","testStringCoercion","checkKeyStringCoercion","JSCompiler_inline_result","JSCompiler_temp_const","JSCompiler_inline_result$jscomp$0","getTaskName","getOwner","dispatcher","ReactSharedInternals","UnknownOwner","hasValidKey","hasOwnProperty","getter","defineKeyPropWarningGetter","props","displayName","warnAboutAccessingKey","specialPropKeyWarningShown","elementRefGetterWithDeprecationWarning","componentName","didWarnAboutElementRef","ReactElement","owner","debugStack","debugTask","refProp","jsxDEVImpl","isStaticChildren","children","isArrayImpl","validateChildKeys","keys","k","didWarnAboutKeySpread","node","isValidElement","object","React","require$$0","createTask","callStackForError","unknownOwnerDebugStack","unknownOwnerDebugTask","reactJsxRuntime_development","trackActualOwner","jsxRuntimeModule","require$$1","useSciChart","containerRef","chart","setChart","useState","isReady","setIsReady","setError","setBounds","optionsRef","useRef","useEffect","chartInstance","err","addSeries","useCallback","seriesOptions","updateSeries","removeSeries","zoom","zoomOptions","resetZoom","SciChart","forwardRef","zoomProp","onZoomChange","className","debug","chartOptions","ref","previousSeriesRef","useImperativeHandle","currentSeriesMap","previousSeriesMap","prevSeries","containerStyle","useMemo","jsx","jsxs"],"mappings":"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","x_google_ignoreList":[13,14,15]}
1
+ {"version":3,"file":"scichart-engine.umd.js","sources":["../src/core/chart/types.ts","../src/analysis/utils.ts","../src/analysis/math.ts","../src/analysis/fitting.ts","../src/core/EventEmitter.ts","../src/renderer/NativeWebGLRenderer.ts","../src/theme/index.ts","../src/core/OverlayRenderer.ts","../src/core/InteractionManager.ts","../src/core/ChartControls.ts","../src/core/ChartLegend.ts","../src/core/ChartStatistics.ts","../src/core/annotations/AnnotationManager.ts","../src/core/chart/ChartExporter.ts","../src/core/chart/ChartNavigation.ts","../src/core/chart/ChartRenderer.ts","../src/core/Series.ts","../src/core/chart/ChartSeries.ts","../src/scales/index.ts","../src/core/chart/ChartSetup.ts","../src/core/chart/ChartCore.ts","../src/renderer/RendererInterface.ts","../src/workers/downsample.ts","../node_modules/.pnpm/react@19.2.3/node_modules/react/cjs/react-jsx-runtime.production.js","../node_modules/.pnpm/react@19.2.3/node_modules/react/cjs/react-jsx-runtime.development.js","../node_modules/.pnpm/react@19.2.3/node_modules/react/jsx-runtime.js","../src/react/useSciChart.ts","../src/react/SciChart.tsx"],"sourcesContent":["/**\n * Chart Type Definitions\n * \n * Interfaces for the Chart API and export options.\n */\n\nimport type {\n SeriesOptions,\n SeriesUpdateData,\n ZoomOptions,\n CursorOptions,\n ChartEventMap,\n Bounds,\n} from \"../../types\";\nimport type { Series } from \"../Series\";\nimport type { FitType, FitOptions } from \"../../analysis\";\nimport type { Annotation } from \"../annotations\";\nimport * as analysis from \"../../analysis\";\n\n// ============================================\n// Chart Interface\n// ============================================\n\nexport interface Chart {\n addSeries(options: SeriesOptions): void;\n removeSeries(id: string): void;\n updateSeries(id: string, data: SeriesUpdateData): void;\n getSeries(id: string): Series | undefined;\n getAllSeries(): Series[];\n appendData(id: string, x: number[] | Float32Array, y: number[] | Float32Array): void;\n setAutoScroll(enabled: boolean): void;\n setMaxPoints(id: string, maxPoints: number): void;\n addFitLine(seriesId: string, type: FitType, options?: FitOptions): string;\n zoom(options: ZoomOptions): void;\n pan(deltaX: number, deltaY: number): void;\n resetZoom(): void;\n getViewBounds(): Bounds;\n enableCursor(options: CursorOptions): void;\n disableCursor(): void;\n resize(width?: number, height?: number): void;\n render(): void;\n on<K extends keyof ChartEventMap>(\n event: K,\n handler: (data: ChartEventMap[K]) => void\n ): void;\n off<K extends keyof ChartEventMap>(\n event: K,\n handler: (data: ChartEventMap[K]) => void\n ): void;\n destroy(): void;\n exportImage(type?: \"png\" | \"jpeg\"): string;\n autoScale(): void;\n setTheme(theme: string | object): void;\n /** Access to data analysis utilities */\n readonly analysis: typeof analysis;\n // Annotation methods\n addAnnotation(annotation: Annotation): string;\n removeAnnotation(id: string): boolean;\n updateAnnotation(id: string, updates: Partial<Annotation>): void;\n getAnnotation(id: string): Annotation | undefined;\n getAnnotations(): Annotation[];\n clearAnnotations(): void;\n // Export methods\n exportCSV(options?: ExportOptions): string;\n exportJSON(options?: ExportOptions): string;\n}\n\n/** Options for data export */\nexport interface ExportOptions {\n /** Series IDs to export (default: all) */\n seriesIds?: string[];\n /** Include headers in CSV (default: true) */\n includeHeaders?: boolean;\n /** Decimal precision (default: 6) */\n precision?: number;\n /** CSV delimiter (default: ',') */\n delimiter?: string;\n}\n\n// ============================================\n// Layout Constants\n// ============================================\n\nexport const MARGINS = { top: 20, right: 30, bottom: 55, left: 75 };\n","/**\n * Data Analysis Utilities\n *\n * General-purpose utilities for scientific data formatting,\n * cycle detection, peak detection, and data validation.\n */\n\n// ============================================\n// Unit Prefixes\n// ============================================\n\ntype SIPrefix = 'p' | 'n' | 'µ' | 'm' | '' | 'k' | 'M' | 'G';\n\nexport interface PrefixInfo {\n symbol: SIPrefix;\n factor: number;\n}\n\nconst SI_PREFIXES: PrefixInfo[] = [\n { symbol: 'p', factor: 1e-12 },\n { symbol: 'n', factor: 1e-9 },\n { symbol: 'µ', factor: 1e-6 },\n { symbol: 'm', factor: 1e-3 },\n { symbol: '', factor: 1 },\n { symbol: 'k', factor: 1e3 },\n { symbol: 'M', factor: 1e6 },\n { symbol: 'G', factor: 1e9 },\n];\n\n/**\n * Find the best SI prefix for a value\n */\nexport function getBestPrefix(value: number): PrefixInfo {\n const absValue = Math.abs(value);\n\n if (absValue === 0) {\n return { symbol: '', factor: 1 };\n }\n\n // Find prefix where value becomes 1-999\n for (let i = SI_PREFIXES.length - 1; i >= 0; i--) {\n const prefix = SI_PREFIXES[i];\n const scaled = absValue / prefix.factor;\n if (scaled >= 1 && scaled < 1000) {\n return prefix;\n }\n }\n\n // Default to base unit\n return { symbol: '', factor: 1 };\n}\n\n/**\n * Format a value with automatic SI prefix\n *\n * @example\n * formatWithPrefix(0.000001, 'A') // \"1.00 µA\"\n * formatWithPrefix(0.5, 'V') // \"500 mV\"\n * formatWithPrefix(1500, 'm') // \"1.50 km\"\n */\nexport function formatWithPrefix(\n value: number,\n unit: string,\n decimals = 2\n): string {\n const prefix = getBestPrefix(value);\n const scaled = value / prefix.factor;\n return `${scaled.toFixed(decimals)} ${prefix.symbol}${unit}`;\n}\n\n/**\n * Format a numeric value with specified decimals\n * Automatically switches to scientific notation for very large/small values\n */\nexport function formatValue(value: number, decimals = 3): string {\n if (Math.abs(value) < 0.001 || Math.abs(value) >= 1e6) {\n return value.toExponential(decimals);\n }\n return value.toFixed(decimals);\n}\n\n/**\n * Format value in scientific notation\n */\nexport function formatScientific(value: number, decimals = 2): string {\n return value.toExponential(decimals);\n}\n\n// ============================================\n// Cycle Detection\n// ============================================\n\nexport interface CycleInfo {\n /** Cycle number (1-indexed) */\n number: number;\n /** Start index in data array */\n startIndex: number;\n /** End index in data array */\n endIndex: number;\n /** Direction at start: 1 = forward, -1 = reverse */\n direction: 1 | -1;\n}\n\n/**\n * Detect cycles in oscillating data\n *\n * A cycle is complete when the signal returns to its starting value\n * after going through both sweep directions. Useful for:\n * - Cyclic voltammetry data\n * - Periodic signals\n * - Oscillation analysis\n *\n * @param signal - The signal data (e.g., potential, position, etc.)\n * @param tolerance - How close to starting value to consider a cycle complete\n */\nexport function detectCycles(\n signal: Float32Array | Float64Array | number[],\n tolerance = 0.001\n): CycleInfo[] {\n const data = signal instanceof Array ? new Float32Array(signal) : signal;\n \n if (data.length < 3) return [];\n\n const cycles: CycleInfo[] = [];\n let cycleStart = 0;\n let cycleNumber = 1;\n\n // Determine initial direction\n let prevDirection = Math.sign(data[1] - data[0]);\n let directionChanges = 0;\n\n for (let i = 2; i < data.length; i++) {\n const direction = Math.sign(data[i] - data[i - 1]);\n\n // Skip if no movement\n if (direction === 0) continue;\n\n // Direction change detected\n if (direction !== prevDirection) {\n directionChanges++;\n\n // After 2 direction changes, check if we're back at start\n if (directionChanges >= 2) {\n const startValue = data[cycleStart];\n const currentValue = data[i];\n\n if (Math.abs(currentValue - startValue) < tolerance) {\n cycles.push({\n number: cycleNumber,\n startIndex: cycleStart,\n endIndex: i,\n direction: data[cycleStart + 1] > data[cycleStart] ? 1 : -1,\n });\n\n cycleNumber++;\n cycleStart = i;\n directionChanges = 0;\n }\n }\n\n prevDirection = direction;\n }\n }\n\n // Handle last incomplete cycle\n if (cycleStart < data.length - 1) {\n cycles.push({\n number: cycleNumber,\n startIndex: cycleStart,\n endIndex: data.length - 1,\n direction: data[cycleStart + 1] > data[cycleStart] ? 1 : -1,\n });\n }\n\n return cycles;\n}\n\n/**\n * Generate distinct colors for cycles/series\n *\n * Uses HSL color space to generate evenly distributed hues\n */\nexport function generateCycleColors(count: number): string[] {\n const colors: string[] = [];\n const hueStep = 360 / Math.max(count, 1);\n\n for (let i = 0; i < count; i++) {\n const hue = (i * hueStep) % 360;\n colors.push(`hsl(${hue}, 70%, 55%)`);\n }\n\n return colors;\n}\n\n// ============================================\n// Peak Detection\n// ============================================\n\nexport interface Peak {\n /** Index in data array */\n index: number;\n /** X value at peak */\n x: number;\n /** Y value at peak */\n y: number;\n /** Peak type */\n type: 'max' | 'min';\n /** Prominence of the peak */\n prominence: number;\n}\n\n/**\n * Detect peaks (local maxima and minima) in data\n *\n * Uses simple local extrema detection with optional prominence filtering.\n * Useful for:\n * - Signal peak detection\n * - Finding local maxima/minima\n * - Feature extraction\n *\n * @param x - X values (independent variable)\n * @param y - Y values (dependent variable)\n * @param options - Detection options\n */\nexport function detectPeaks(\n x: Float32Array | Float64Array | number[],\n y: Float32Array | Float64Array | number[],\n options: {\n /** Minimum prominence to be considered a peak */\n minProminence?: number;\n /** Only return 'max' or 'min' peaks */\n type?: 'max' | 'min' | 'both';\n } = {}\n): Peak[] {\n const { minProminence = 0, type = 'both' } = options;\n const peaks: Peak[] = [];\n\n const xData = x instanceof Array ? new Float32Array(x) : x;\n const yData = y instanceof Array ? new Float32Array(y) : y;\n\n for (let i = 1; i < yData.length - 1; i++) {\n const prev = yData[i - 1];\n const curr = yData[i];\n const next = yData[i + 1];\n\n // Local maximum\n if (curr > prev && curr > next) {\n const prominence = Math.min(curr - prev, curr - next);\n if (prominence >= minProminence && (type === 'both' || type === 'max')) {\n peaks.push({ index: i, x: xData[i], y: curr, type: 'max', prominence });\n }\n }\n\n // Local minimum\n if (curr < prev && curr < next) {\n const prominence = Math.min(prev - curr, next - curr);\n if (prominence >= minProminence && (type === 'both' || type === 'min')) {\n peaks.push({ index: i, x: xData[i], y: curr, type: 'min', prominence });\n }\n }\n }\n\n return peaks;\n}\n\n// ============================================\n// Data Validation\n// ============================================\n\nexport interface ValidationResult {\n /** Whether all data is valid */\n valid: boolean;\n /** Number of invalid values (NaN, Infinity, etc.) */\n invalidCount: number;\n /** Index of first invalid value (-1 if all valid) */\n firstInvalidIndex: number;\n}\n\n/**\n * Validate that data contains only finite numbers\n *\n * Checks for NaN, Infinity, and -Infinity values.\n * Useful for data quality checks before rendering.\n */\nexport function validateData(\n data: Float32Array | Float64Array | number[]\n): ValidationResult {\n let invalidCount = 0;\n let firstInvalidIndex = -1;\n\n const arr = data instanceof Array ? data : Array.from(data);\n\n for (let i = 0; i < arr.length; i++) {\n if (!isFinite(arr[i])) {\n invalidCount++;\n if (firstInvalidIndex === -1) {\n firstInvalidIndex = i;\n }\n }\n }\n\n return {\n valid: invalidCount === 0,\n invalidCount,\n firstInvalidIndex,\n };\n}\n\n// ============================================\n// Data Statistics\n// ============================================\n\nexport interface DataStats {\n min: number;\n max: number;\n mean: number;\n stdDev: number;\n count: number;\n}\n\n/**\n * Calculate basic statistics for a dataset\n */\nexport function calculateStats(\n data: Float32Array | Float64Array | number[]\n): DataStats {\n const arr = data instanceof Array ? data : Array.from(data);\n const count = arr.length;\n\n if (count === 0) {\n return { min: 0, max: 0, mean: 0, stdDev: 0, count: 0 };\n }\n\n let min = arr[0];\n let max = arr[0];\n let sum = 0;\n\n for (let i = 0; i < count; i++) {\n const val = arr[i];\n if (val < min) min = val;\n if (val > max) max = val;\n sum += val;\n }\n\n const mean = sum / count;\n\n // Calculate standard deviation\n let sumSquaredDiff = 0;\n for (let i = 0; i < count; i++) {\n const diff = arr[i] - mean;\n sumSquaredDiff += diff * diff;\n }\n const stdDev = Math.sqrt(sumSquaredDiff / count);\n\n return { min, max, mean, stdDev, count };\n}\n\n// ============================================\n// Data Smoothing\n// ============================================\n\n/**\n * Apply moving average smoothing to data\n *\n * @param data - Input data array\n * @param windowSize - Number of points to average (must be odd)\n */\nexport function movingAverage(\n data: Float32Array | Float64Array | number[],\n windowSize: number\n): Float32Array {\n const arr = data instanceof Array ? new Float32Array(data) : data;\n const result = new Float32Array(arr.length);\n const halfWindow = Math.floor(windowSize / 2);\n\n for (let i = 0; i < arr.length; i++) {\n let sum = 0;\n let count = 0;\n\n for (let j = Math.max(0, i - halfWindow); j <= Math.min(arr.length - 1, i + halfWindow); j++) {\n sum += arr[j];\n count++;\n }\n\n result[i] = sum / count;\n }\n\n return result;\n}\n\n/**\n * Downsample data using LTTB (Largest Triangle Three Buckets) algorithm\n *\n * Preserves visual characteristics while reducing point count.\n * Ideal for rendering large datasets efficiently.\n *\n * @param x - X values\n * @param y - Y values\n * @param targetPoints - Desired number of output points\n */\nexport function downsampleLTTB(\n x: Float32Array | Float64Array,\n y: Float32Array | Float64Array,\n targetPoints: number\n): { x: Float32Array; y: Float32Array } {\n const dataLength = x.length;\n\n if (targetPoints >= dataLength || targetPoints < 3) {\n return { x: new Float32Array(x), y: new Float32Array(y) };\n }\n\n const sampledX = new Float32Array(targetPoints);\n const sampledY = new Float32Array(targetPoints);\n\n // Always include first point\n sampledX[0] = x[0];\n sampledY[0] = y[0];\n\n const bucketSize = (dataLength - 2) / (targetPoints - 2);\n\n let a = 0; // Previous selected point index\n let sampledIndex = 1;\n\n for (let i = 0; i < targetPoints - 2; i++) {\n // Calculate bucket range\n const bucketStart = Math.floor((i + 1) * bucketSize) + 1;\n const bucketEnd = Math.floor((i + 2) * bucketSize) + 1;\n const nextBucketEnd = Math.min(Math.floor((i + 3) * bucketSize) + 1, dataLength);\n\n // Calculate average of next bucket for comparison\n let avgX = 0;\n let avgY = 0;\n let avgCount = 0;\n\n for (let j = bucketEnd; j < nextBucketEnd; j++) {\n avgX += x[j];\n avgY += y[j];\n avgCount++;\n }\n\n if (avgCount > 0) {\n avgX /= avgCount;\n avgY /= avgCount;\n }\n\n // Find point in current bucket with largest triangle area\n let maxArea = -1;\n let maxAreaIndex = bucketStart;\n\n for (let j = bucketStart; j < bucketEnd && j < dataLength; j++) {\n // Triangle area calculation\n const area = Math.abs(\n (x[a] - avgX) * (y[j] - y[a]) - (x[a] - x[j]) * (avgY - y[a])\n );\n\n if (area > maxArea) {\n maxArea = area;\n maxAreaIndex = j;\n }\n }\n\n sampledX[sampledIndex] = x[maxAreaIndex];\n sampledY[sampledIndex] = y[maxAreaIndex];\n sampledIndex++;\n a = maxAreaIndex;\n }\n\n // Always include last point\n sampledX[targetPoints - 1] = x[dataLength - 1];\n sampledY[targetPoints - 1] = y[dataLength - 1];\n\n return { x: sampledX, y: sampledY };\n}\n\n/**\n * Subtract a linear baseline from data\n * \n * @param x - X data\n * @param y - Y data\n * @param x1 - Start of baseline segment\n * @param x2 - End of baseline segment\n */\nexport function subtractBaseline(\n x: Float32Array | number[],\n y: Float32Array | number[],\n x1: number,\n x2: number\n): Float32Array {\n const n = x.length;\n const result = new Float32Array(n);\n\n // Find points near x1 and x2 to determine baseline\n let i1 = 0, i2 = n - 1;\n let minDist1 = Infinity, minDist2 = Infinity;\n\n for (let i = 0; i < n; i++) {\n const d1 = Math.abs(x[i] - x1);\n const d2 = Math.abs(x[i] - x2);\n if (d1 < minDist1) { minDist1 = d1; i1 = i; }\n if (d2 < minDist2) { minDist2 = d2; i2 = i; }\n }\n\n const y1 = y[i1];\n const y2 = y[i2];\n const slope = (y2 - y1) / (x[i2] - x[i1]);\n const intercept = y1 - slope * x[i1];\n\n for (let i = 0; i < n; i++) {\n result[i] = y[i] - (slope * x[i] + intercept);\n }\n\n return result;\n}\n","/**\n * Mathematical utilities for numerical analysis and regression.\n */\n\n/**\n * Solve a system of linear equations Ax = B using Gaussian elimination with partial pivoting.\n * \n * @param A - Matrix coefficients\n * @param B - Right hand side vector\n * @returns Solution vector x\n */\nexport function solveLinearSystem(A: number[][], B: number[]): number[] {\n const n = B.length;\n const matrix = A.map((row, i) => [...row, B[i]]);\n\n for (let i = 0; i < n; i++) {\n // Partial pivoting\n let maxRow = i;\n for (let k = i + 1; k < n; k++) {\n if (Math.abs(matrix[k][i]) > Math.abs(matrix[maxRow][i])) {\n maxRow = k;\n }\n }\n\n // Swap rows\n const temp = matrix[i];\n matrix[i] = matrix[maxRow];\n matrix[maxRow] = temp;\n\n // Pivot must be non-zero\n const pivot = matrix[i][i];\n if (Math.abs(pivot) < 1e-12) {\n throw new Error(\"Matrix is singular or near-singular\");\n }\n\n // Eliminate below\n for (let k = i + 1; k < n; k++) {\n const factor = matrix[k][i] / pivot;\n for (let j = i; j <= n; j++) {\n matrix[k][j] -= factor * matrix[i][j];\n }\n }\n }\n\n // Back substitution\n const x = new Array(n).fill(0);\n for (let i = n - 1; i >= 0; i--) {\n let sum = 0;\n for (let j = i + 1; j < n; j++) {\n sum += matrix[i][j] * x[j];\n }\n x[i] = (matrix[i][n] - sum) / matrix[i][i];\n }\n\n return x;\n}\n\n/**\n * Calculate R² (coefficient of determination)\n */\nexport function calculateR2(\n x: number[] | Float32Array,\n y: number[] | Float32Array,\n fitFn: (x: number) => number\n): number {\n const n = x.length;\n if (n === 0) return 0;\n\n let sumY = 0;\n for (let i = 0; i < n; i++) sumY += y[i];\n const meanY = sumY / n;\n\n let ssTot = 0; // Total sum of squares\n let ssRes = 0; // Residual sum of squares\n\n for (let i = 0; i < n; i++) {\n const yi = y[i];\n const fi = fitFn(x[i]);\n ssTot += (yi - meanY) * (yi - meanY);\n ssRes += (yi - fi) * (yi - fi);\n }\n\n return ssTot === 0 ? 1 : 1 - ssRes / ssTot;\n}\n\n/**\n * Numerical integration using the trapezoidal rule.\n * \n * @param x - X values (must be sorted)\n * @param y - Y values\n * @param xMin - Optional start of integration range\n * @param xMax - Optional end of integration range\n */\nexport function integrate(\n x: number[] | Float32Array,\n y: number[] | Float32Array,\n xMin?: number,\n xMax?: number\n): number {\n const n = x.length;\n if (n < 2) return 0;\n\n let area = 0;\n const start = xMin !== undefined ? xMin : x[0];\n const end = xMax !== undefined ? xMax : x[n - 1];\n\n for (let i = 0; i < n - 1; i++) {\n const x1 = x[i];\n const x2 = x[i + 1];\n \n // Skip if outside range\n if (x2 < start) continue;\n if (x1 > end) break;\n\n // Handle partial intervals at boundaries\n const ia = Math.max(x1, start);\n const ib = Math.min(x2, end);\n\n if (ia < ib) {\n // Linear interpolation for y values at boundaries if needed\n const y1 = y[i] + (y[i + 1] - y[i]) * ((ia - x1) / (x2 - x1));\n const y2 = y[i] + (y[i + 1] - y[i]) * ((ib - x1) / (x2 - x1));\n \n area += (ib - ia) * (y1 + y2) / 2;\n }\n }\n\n return area;\n}\n\n/**\n * Calculate numerical derivative dy/dx\n */\nexport function derivative(\n x: number[] | Float32Array,\n y: number[] | Float32Array\n): Float32Array {\n const n = x.length;\n if (n < 2) return new Float32Array(0);\n\n const result = new Float32Array(n);\n for (let i = 0; i < n - 1; i++) {\n const dx = x[i + 1] - x[i];\n result[i] = dx !== 0 ? (y[i + 1] - y[i]) / dx : 0;\n }\n // Last point same as previous for length matching\n result[n - 1] = result[n - 2];\n return result;\n}\n\n/**\n * Calculate cumulative integral (area array)\n */\nexport function cumulativeIntegral(\n x: number[] | Float32Array,\n y: number[] | Float32Array\n): Float32Array {\n const n = x.length;\n if (n < 1) return new Float32Array(0);\n\n const result = new Float32Array(n);\n result[0] = 0;\n \n for (let i = 0; i < n - 1; i++) {\n const dx = x[i + 1] - x[i];\n const area = dx * (y[i] + y[i + 1]) / 2;\n result[i + 1] = result[i] + area;\n }\n \n return result;\n}\n","/**\n * Curve Fitting and Regression Analysis\n */\nimport { solveLinearSystem, calculateR2 } from './math';\n\nexport type FitType = 'linear' | 'polynomial' | 'exponential' | 'logarithmic' | 'power';\n\nexport interface FitOptions {\n /** Degree for polynomial fit (default: 2) */\n degree?: number;\n /** Custom label for the equation */\n label?: string;\n /** Number of decimals in equation string */\n precision?: number;\n}\n\nexport interface FitResult {\n type: FitType;\n /** Coefficients (a, b, c...) */\n coefficients: number[];\n /** Formatted equation string */\n equation: string;\n /** Coefficient of determination */\n rSquared: number;\n /** Function to calculate value at X */\n predict: (x: number) => number;\n}\n\n/**\n * Perform regression on a dataset\n */\nexport function fitData(\n x: number[] | Float32Array,\n y: number[] | Float32Array,\n type: FitType,\n options: FitOptions = {}\n): FitResult {\n const n = x.length;\n if (n < 2) throw new Error(\"At least 2 points are required for fitting\");\n\n switch (type) {\n case 'linear':\n return fitLinear(x, y, options);\n case 'polynomial':\n return fitPolynomial(x, y, options.degree ?? 2, options);\n case 'exponential':\n return fitExponential(x, y, options);\n case 'logarithmic':\n return fitLogarithmic(x, y, options);\n case 'power':\n return fitPower(x, y, options);\n default:\n throw new Error(`Unsupported fit type: ${type}`);\n }\n}\n\nfunction fitLinear(x: any, y: any, opts: FitOptions): FitResult {\n const n = x.length;\n let sumX = 0, sumY = 0, sumXY = 0, sumX2 = 0;\n\n for (let i = 0; i < n; i++) {\n sumX += x[i];\n sumY += y[i];\n sumXY += x[i] * y[i];\n sumX2 += x[i] * x[i];\n }\n\n const slope = (n * sumXY - sumX * sumY) / (n * sumX2 - sumX * sumX);\n const intercept = (sumY - slope * sumX) / n;\n\n const predict = (v: number) => slope * v + intercept;\n const prec = opts.precision ?? 4;\n \n return {\n type: 'linear',\n coefficients: [slope, intercept],\n equation: `y = ${slope.toFixed(prec)}x ${intercept >= 0 ? '+' : '-'} ${Math.abs(intercept).toFixed(prec)}`,\n rSquared: calculateR2(x, y, predict),\n predict\n };\n}\n\nfunction fitPolynomial(x: any, y: any, degree: number, opts: FitOptions): FitResult {\n const n = x.length;\n const m = degree + 1;\n const A: number[][] = Array.from({ length: m }, () => new Array(m).fill(0));\n const B: number[] = new Array(m).fill(0);\n\n // Normal equations for least squares polynomial fit\n for (let i = 0; i < m; i++) {\n for (let j = 0; j < m; j++) {\n let sum = 0;\n for (let k = 0; k < n; k++) {\n sum += Math.pow(x[k], i + j);\n }\n A[i][j] = sum;\n }\n\n let sum = 0;\n for (let k = 0; k < n; k++) {\n sum += y[k] * Math.pow(x[k], i);\n }\n B[i] = sum;\n }\n\n const coeffs = solveLinearSystem(A, B); // c0, c1, c2...\n\n const predict = (v: number) => {\n let res = 0;\n for (let i = 0; i < coeffs.length; i++) {\n res += coeffs[i] * Math.pow(v, i);\n }\n return res;\n };\n\n const prec = opts.precision ?? 4;\n let equation = \"y = \";\n for (let i = coeffs.length - 1; i >= 0; i--) {\n const c = coeffs[i];\n if (i < coeffs.length - 1) equation += c >= 0 ? \" + \" : \" - \";\n else if (c < 0) equation += \"-\";\n \n equation += `${Math.abs(c).toFixed(prec)}${i > 0 ? (i > 1 ? `x^${i}` : 'x') : ''}`;\n }\n\n return {\n type: 'polynomial',\n coefficients: coeffs,\n equation,\n rSquared: calculateR2(x, y, predict),\n predict\n };\n}\n\nfunction fitExponential(x: any, y: any, opts: FitOptions): FitResult {\n // y = a * e^(bx) => ln(y) = ln(a) + bx\n // Use linear fit on (x, ln(y))\n const n = x.length;\n const xPrime = [];\n const yPrime = [];\n\n for (let i = 0; i < n; i++) {\n if (y[i] > 0) {\n xPrime.push(x[i]);\n yPrime.push(Math.log(y[i]));\n }\n }\n\n const result = fitLinear(xPrime, yPrime, opts);\n const b = result.coefficients[0];\n const a = Math.exp(result.coefficients[1]);\n\n const predict = (v: number) => a * Math.exp(b * v);\n const prec = opts.precision ?? 4;\n\n return {\n type: 'exponential',\n coefficients: [a, b],\n equation: `y = ${a.toFixed(prec)} * e^(${b.toFixed(prec)}x)`,\n rSquared: calculateR2(x, y, predict),\n predict\n };\n}\n\nfunction fitLogarithmic(x: any, y: any, opts: FitOptions): FitResult {\n // y = a + b * ln(x)\n // Use linear fit on (ln(x), y)\n const n = x.length;\n const xPrime = [];\n const yPrime = [];\n\n for (let i = 0; i < n; i++) {\n if (x[i] > 0) {\n xPrime.push(Math.log(x[i]));\n yPrime.push(y[i]);\n }\n }\n\n const result = fitLinear(xPrime, yPrime, opts);\n const b = result.coefficients[0];\n const a = result.coefficients[1];\n\n const predict = (v: number) => a + b * Math.log(v);\n const prec = opts.precision ?? 4;\n\n return {\n type: 'logarithmic',\n coefficients: [a, b],\n equation: `y = ${a.toFixed(prec)} ${b >= 0 ? '+' : '-'} ${Math.abs(b).toFixed(prec)} * ln(x)`,\n rSquared: calculateR2(x, y, predict),\n predict\n };\n}\n\nfunction fitPower(x: any, y: any, opts: FitOptions): FitResult {\n // y = a * x^b => ln(y) = ln(a) + b * ln(x)\n const n = x.length;\n const xPrime = [];\n const yPrime = [];\n\n for (let i = 0; i < n; i++) {\n if (x[i] > 0 && y[i] > 0) {\n xPrime.push(Math.log(x[i]));\n yPrime.push(Math.log(y[i]));\n }\n }\n\n const result = fitLinear(xPrime, yPrime, opts);\n const b = result.coefficients[0];\n const a = Math.exp(result.coefficients[1]);\n\n const predict = (v: number) => a * Math.pow(v, b);\n const prec = opts.precision ?? 4;\n\n return {\n type: 'power',\n coefficients: [a, b],\n equation: `y = ${a.toFixed(prec)} * x^(${b.toFixed(prec)})`,\n rSquared: calculateR2(x, y, predict),\n predict\n };\n}\n","/**\n * Type-safe event emitter for chart events\n */\n\nexport class EventEmitter<EventMap extends object> {\n private listeners: Map<keyof EventMap, Set<(data: unknown) => void>> =\n new Map();\n\n /**\n * Subscribe to an event\n */\n on<K extends keyof EventMap>(\n event: K,\n handler: (data: EventMap[K]) => void\n ): void {\n if (!this.listeners.has(event)) {\n this.listeners.set(event, new Set());\n }\n this.listeners.get(event)!.add(handler as (data: unknown) => void);\n }\n\n /**\n * Unsubscribe from an event\n */\n off<K extends keyof EventMap>(\n event: K,\n handler: (data: EventMap[K]) => void\n ): void {\n const handlers = this.listeners.get(event);\n if (handlers) {\n handlers.delete(handler as (data: unknown) => void);\n }\n }\n\n /**\n * Emit an event with data\n */\n emit<K extends keyof EventMap>(event: K, data: EventMap[K]): void {\n const handlers = this.listeners.get(event);\n if (handlers) {\n handlers.forEach((handler) => {\n try {\n handler(data);\n } catch (error) {\n console.error(`[EventEmitter] Error in handler for \"${String(event)}\":`, error);\n }\n });\n }\n }\n\n /**\n * Subscribe to an event once\n */\n once<K extends keyof EventMap>(\n event: K,\n handler: (data: EventMap[K]) => void\n ): void {\n const wrappedHandler = (data: EventMap[K]) => {\n this.off(event, wrappedHandler);\n handler(data);\n };\n this.on(event, wrappedHandler);\n }\n\n /**\n * Remove all listeners\n */\n clear(): void {\n this.listeners.clear();\n }\n\n /**\n * Get listener count for an event\n */\n listenerCount(event: keyof EventMap): number {\n return this.listeners.get(event)?.size ?? 0;\n }\n}\n","/**\n * NativeWebGLRenderer - Zero-dependency WebGL renderer\n *\n * This renderer uses raw WebGL APIs without any external libraries.\n * Performance is identical (or slightly better) than regl since\n * we eliminate the abstraction layer overhead.\n *\n * Key optimizations:\n * - Pre-compiled shaders (compiled once, reused)\n * - Uniform updates via GPU (no buffer recreation for zoom/pan)\n * - Buffer pooling for dynamic data\n * - Minimal state changes per frame\n */\n\nimport type { Bounds, SeriesStyle } from \"../types\";\n\n// ============================================\n// Types\n// ============================================\n\nexport interface NativeSeriesRenderData {\n id: string;\n buffer: WebGLBuffer;\n count: number;\n style: SeriesStyle;\n visible: boolean;\n type: \"line\" | \"scatter\" | \"line+scatter\" | \"step\" | \"step+scatter\" | \"band\";\n /** For step types: pre-computed step buffer */\n stepBuffer?: WebGLBuffer;\n stepCount?: number;\n /** Optional specific Y-bounds for this series (overrides global bounds) */\n yBounds?: { min: number; max: number };\n}\n\nexport interface NativeRenderOptions {\n bounds: Bounds;\n backgroundColor?: [number, number, number, number];\n plotArea?: { x: number; y: number; width: number; height: number };\n}\n\ninterface ShaderProgram {\n program: WebGLProgram;\n attributes: { position: number };\n uniforms: {\n uScale: WebGLUniformLocation;\n uTranslate: WebGLUniformLocation;\n uColor: WebGLUniformLocation;\n uPointSize?: WebGLUniformLocation;\n uSymbol?: WebGLUniformLocation;\n };\n}\n\n// ============================================\n// Shader Sources\n// ============================================\n\nconst LINE_VERT = `\nprecision highp float;\nattribute vec2 position;\nuniform vec2 uScale;\nuniform vec2 uTranslate;\n\nvoid main() {\n vec2 pos = position * uScale + uTranslate;\n gl_Position = vec4(pos, 0.0, 1.0);\n}\n`;\n\nconst LINE_FRAG = `\nprecision highp float;\nuniform vec4 uColor;\n\nvoid main() {\n gl_FragColor = uColor;\n}\n`;\n\nconst POINT_VERT = `\nprecision highp float;\nattribute vec2 position;\nuniform vec2 uScale;\nuniform vec2 uTranslate;\nuniform float uPointSize;\n\nvoid main() {\n vec2 pos = position * uScale + uTranslate;\n gl_Position = vec4(pos, 0.0, 1.0);\n gl_PointSize = uPointSize;\n}\n`;\n\nconst POINT_FRAG = `\nprecision highp float;\nuniform vec4 uColor;\nuniform int uSymbol;\n\nfloat sdCircle(vec2 p, float r) {\n return length(p) - r;\n}\n\nfloat sdBox(vec2 p, vec2 b) {\n vec2 d = abs(p) - b;\n return length(max(d, 0.0)) + min(max(d.x, d.y), 0.0);\n}\n\nfloat sdTriangle(vec2 p, float r) {\n const float k = sqrt(3.0);\n p.x = abs(p.x) - r;\n p.y = p.y + r / k;\n if (p.x + k * p.y > 0.0) p = vec2(p.x - k * p.y, -k * p.x - p.y) / 2.0;\n p.x -= clamp(p.x, -2.0 * r, 0.0);\n return -length(p) * sign(p.y);\n}\n\nfloat sdDiamond(vec2 p, float r) {\n return (abs(p.x) + abs(p.y)) - r;\n}\n\nfloat sdCross(vec2 p, float r, float thickness) {\n vec2 d = abs(p);\n float s1 = sdBox(d, vec2(r, thickness));\n float s2 = sdBox(d, vec2(thickness, r));\n return min(s1, s2);\n}\n\nfloat sdX(vec2 p, float r, float thickness) {\n float c = cos(0.785398); // 45 degrees\n float s = sin(0.785398);\n mat2 m = mat2(c, -s, s, c);\n return sdCross(m * p, r, thickness);\n}\n\nfloat sdStar(vec2 p, float r, float rf) {\n const vec2 k1 = vec2(0.80901699, -0.58778525);\n const vec2 k2 = vec2(-k1.x, k1.y);\n p.x = abs(p.x);\n p -= 2.0 * max(dot(k1, p), 0.0) * k1;\n p -= 2.0 * max(dot(k2, p), 0.0) * k2;\n p.x = abs(p.x);\n p.y -= r;\n vec2 ba = rf * vec2(-k1.y, k1.x) - vec2(0, 1);\n float h = clamp(dot(p, ba) / dot(ba, ba), 0.0, r);\n return length(p - ba * h) * sign(p.y * ba.x - p.x * ba.y);\n}\n\nvoid main() {\n vec2 p = gl_PointCoord - vec2(0.5);\n float d = 0.0;\n \n // Symbols: 0:circle, 1:square, 2:diamond, 3:triangle, 4:triangleDown, 5:cross, 6:x, 7:star\n if (uSymbol == 0) {\n d = sdCircle(p, 0.45);\n } else if (uSymbol == 1) {\n d = sdBox(p, vec2(0.35));\n } else if (uSymbol == 2) {\n d = sdDiamond(p, 0.45);\n } else if (uSymbol == 3) {\n d = sdTriangle(vec2(p.x, p.y + 0.1), 0.4);\n } else if (uSymbol == 4) {\n d = sdTriangle(vec2(p.x, -p.y + 0.1), 0.4);\n } else if (uSymbol == 5) {\n d = sdCross(p, 0.45, 0.15);\n } else if (uSymbol == 6) {\n d = sdX(p, 0.45, 0.15);\n } else if (uSymbol == 7) {\n d = sdStar(p, 0.45, 0.4);\n }\n \n if (d > 0.02) discard; // Add small margin for antialiasing\n \n float alpha = 1.0 - smoothstep(0.0, 0.02, d);\n gl_FragColor = vec4(uColor.rgb, uColor.a * alpha);\n}\n`;\n\n// ============================================\n// NativeWebGLRenderer Class\n// ============================================\n\nexport class NativeWebGLRenderer {\n private canvas: HTMLCanvasElement;\n private gl: WebGLRenderingContext;\n private dpr: number;\n\n setDPR(dpr: number): void {\n this.dpr = dpr;\n this.resize();\n }\n\n // Compiled shader programs\n private lineProgram: ShaderProgram;\n private pointProgram: ShaderProgram;\n\n // Buffer cache\n private buffers: Map<string, WebGLBuffer> = new Map();\n private bufferSizes: Map<string, number> = new Map();\n\n // State\n private isInitialized = false;\n\n constructor(canvas: HTMLCanvasElement) {\n this.canvas = canvas;\n this.dpr = window.devicePixelRatio || 1;\n\n // Get WebGL context\n const gl = canvas.getContext(\"webgl\", {\n alpha: true,\n antialias: true,\n preserveDrawingBuffer: true, // Essential for on-demand rendering\n powerPreference: \"high-performance\",\n });\n\n if (!gl) {\n throw new Error(\"WebGL not supported\");\n }\n\n this.gl = gl;\n\n // Compile shaders\n this.lineProgram = this.createProgram(LINE_VERT, LINE_FRAG, false);\n this.pointProgram = this.createProgram(POINT_VERT, POINT_FRAG, true);\n\n // Enable blending for transparency\n gl.enable(gl.BLEND);\n gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);\n\n this.isInitialized = true;\n console.log(\"[NativeWebGL] Initialized successfully\");\n }\n\n // ----------------------------------------\n // Shader Compilation\n // ----------------------------------------\n\n private createShader(source: string, type: number): WebGLShader {\n const { gl } = this;\n const shader = gl.createShader(type);\n if (!shader) throw new Error(\"Failed to create shader\");\n\n gl.shaderSource(shader, source);\n gl.compileShader(shader);\n\n if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {\n const error = gl.getShaderInfoLog(shader);\n gl.deleteShader(shader);\n throw new Error(`Shader compilation error: ${error}`);\n }\n\n return shader;\n }\n\n private createProgram(\n vertSource: string,\n fragSource: string,\n hasPointSize: boolean\n ): ShaderProgram {\n const { gl } = this;\n\n const vertShader = this.createShader(vertSource, gl.VERTEX_SHADER);\n const fragShader = this.createShader(fragSource, gl.FRAGMENT_SHADER);\n\n const program = gl.createProgram();\n if (!program) throw new Error(\"Failed to create program\");\n\n gl.attachShader(program, vertShader);\n gl.attachShader(program, fragShader);\n gl.linkProgram(program);\n\n if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {\n const error = gl.getProgramInfoLog(program);\n throw new Error(`Program link error: ${error}`);\n }\n\n // Clean up shaders (they're now part of the program)\n gl.deleteShader(vertShader);\n gl.deleteShader(fragShader);\n\n // Get attribute and uniform locations\n const positionAttr = gl.getAttribLocation(program, \"position\");\n const scaleUniform = gl.getUniformLocation(program, \"uScale\");\n const translateUniform = gl.getUniformLocation(program, \"uTranslate\");\n const colorUniform = gl.getUniformLocation(program, \"uColor\");\n\n if (\n scaleUniform === null ||\n translateUniform === null ||\n colorUniform === null\n ) {\n throw new Error(\"Failed to get uniform locations\");\n }\n\n const result: ShaderProgram = {\n program,\n attributes: { position: positionAttr },\n uniforms: {\n uScale: scaleUniform,\n uTranslate: translateUniform,\n uColor: colorUniform,\n },\n };\n\n if (hasPointSize) {\n result.uniforms.uPointSize =\n gl.getUniformLocation(program, \"uPointSize\") ?? undefined;\n result.uniforms.uSymbol =\n gl.getUniformLocation(program, \"uSymbol\") ?? undefined;\n }\n\n return result;\n }\n\n // ----------------------------------------\n // Buffer Management\n // ----------------------------------------\n\n get available(): boolean {\n return this.isInitialized;\n }\n\n /**\n * Create or update a buffer with interleaved X,Y data\n */\n createBuffer(id: string, data: Float32Array): void {\n const { gl } = this;\n let buffer = this.buffers.get(id);\n const currentSize = this.bufferSizes.get(id) || 0;\n\n if (buffer && data.byteLength <= currentSize) {\n // Update existing buffer with subdata (faster)\n gl.bindBuffer(gl.ARRAY_BUFFER, buffer);\n gl.bufferSubData(gl.ARRAY_BUFFER, 0, data);\n } else {\n // Create new buffer or recreate if size increased\n if (buffer) {\n gl.deleteBuffer(buffer);\n }\n buffer = gl.createBuffer();\n if (!buffer) throw new Error(\"Failed to create buffer\");\n\n gl.bindBuffer(gl.ARRAY_BUFFER, buffer);\n gl.bufferData(gl.ARRAY_BUFFER, data, gl.DYNAMIC_DRAW);\n\n this.buffers.set(id, buffer);\n this.bufferSizes.set(id, data.byteLength);\n }\n }\n\n /**\n * Update a portion of an existing buffer (compatible with WebGL 1.0)\n * Returns true if successful, false if buffer needs recreation\n */\n updateBuffer(id: string, data: Float32Array, offsetInBytes: number): boolean {\n const { gl } = this;\n const buffer = this.buffers.get(id);\n const currentSize = this.bufferSizes.get(id) || 0;\n\n if (!buffer || offsetInBytes + data.byteLength > currentSize) {\n return false; // Caller should call createBuffer with full data\n }\n\n gl.bindBuffer(gl.ARRAY_BUFFER, buffer);\n gl.bufferSubData(gl.ARRAY_BUFFER, offsetInBytes, data);\n return true;\n }\n\n /**\n * Get a buffer by ID\n */\n getBuffer(id: string): WebGLBuffer | undefined {\n return this.buffers.get(id);\n }\n\n /**\n * Delete a buffer\n */\n deleteBuffer(id: string): void {\n const buffer = this.buffers.get(id);\n if (buffer) {\n this.gl.deleteBuffer(buffer);\n this.buffers.delete(id);\n this.bufferSizes.delete(id);\n }\n }\n\n // ----------------------------------------\n // Rendering\n // ----------------------------------------\n\n /**\n * Calculate uniforms for the current viewport\n */\n private calculateUniforms(bounds: Bounds): {\n scale: [number, number];\n translate: [number, number];\n } {\n const dataWidth = bounds.xMax - bounds.xMin;\n const dataHeight = bounds.yMax - bounds.yMin;\n\n const scaleX = dataWidth > 0 ? 2 / dataWidth : 1;\n const scaleY = dataHeight > 0 ? 2 / dataHeight : 1;\n\n const translateX = -1 - bounds.xMin * scaleX;\n const translateY = -1 - bounds.yMin * scaleY;\n\n return {\n scale: [scaleX, scaleY],\n translate: [translateX, translateY],\n };\n }\n\n /**\n * Render a frame\n */\n render(series: NativeSeriesRenderData[], options: NativeRenderOptions): void {\n if (!this.isInitialized) return;\n\n const { gl } = this;\n const { bounds, backgroundColor = [0.1, 0.1, 0.18, 1], plotArea } = options;\n \n // WebGL viewport uses bottom-left as origin (0,0)\n const canvasHeight = this.canvas.height;\n const canvasWidth = this.canvas.width;\n \n const pa = plotArea ? {\n x: plotArea.x * this.dpr,\n y: canvasHeight - (plotArea.y + plotArea.height) * this.dpr,\n width: plotArea.width * this.dpr,\n height: plotArea.height * this.dpr\n } : {\n x: 0, y: 0, width: canvasWidth, height: canvasHeight\n };\n\n // 1. Clear full canvas\n gl.viewport(0, 0, canvasWidth, canvasHeight);\n gl.disable(gl.SCISSOR_TEST);\n gl.clearColor(\n backgroundColor[0],\n backgroundColor[1],\n backgroundColor[2],\n backgroundColor[3]\n );\n gl.clear(gl.COLOR_BUFFER_BIT);\n\n // 2. Set viewport and scissor for plot area\n gl.viewport(pa.x, pa.y, pa.width, pa.height);\n gl.enable(gl.SCISSOR_TEST);\n gl.scissor(pa.x, pa.y, pa.width, pa.height);\n\n const uniforms = this.calculateUniforms(bounds);\n\n // Render each series\n for (const s of series) {\n if (!s.visible || s.count === 0) continue;\n\n const yMin = s.yBounds ? s.yBounds.min : bounds.yMin;\n const yMax = s.yBounds ? s.yBounds.max : bounds.yMax;\n const yRange = yMax - yMin;\n \n // Map Y to clinical space within plotArea\n const yScale = yRange > 0 ? 2 / yRange : 1;\n const yTrans = -1 - yMin * yScale;\n\n const seriesUniforms = {\n scale: [uniforms.scale[0], yScale] as [number, number],\n translate: [uniforms.translate[0], yTrans] as [number, number]\n };\n\n const color = parseColor(s.style.color ?? \"#ff0055\");\n color[3] = s.style.opacity ?? 1;\n\n if (s.type === \"scatter\") {\n this.renderPoints(\n s.buffer,\n s.count,\n seriesUniforms,\n color,\n (s.style.pointSize ?? 4) * this.dpr,\n s.style.symbol\n );\n } else if (s.type === \"line\") {\n this.renderLine(s.buffer, s.count, seriesUniforms, color);\n } else if (s.type === \"line+scatter\") {\n this.renderLine(s.buffer, s.count, seriesUniforms, color);\n this.renderPoints(\n s.buffer,\n s.count,\n seriesUniforms,\n color,\n (s.style.pointSize ?? 4) * this.dpr,\n s.style.symbol\n );\n } else if (s.type === \"step\" || s.type === \"step+scatter\") {\n // Use step buffer if available, otherwise fall back to line\n if (s.stepBuffer && s.stepCount) {\n this.renderLine(s.stepBuffer, s.stepCount, seriesUniforms, color);\n } else {\n this.renderLine(s.buffer, s.count, seriesUniforms, color);\n }\n // Render points for step+scatter\n if (s.type === \"step+scatter\") {\n this.renderPoints(\n s.buffer,\n s.count,\n seriesUniforms,\n color,\n (s.style.pointSize ?? 4) * this.dpr,\n s.style.symbol\n );\n }\n } else if (s.type === \"band\") {\n this.renderBand(s.buffer, s.count, seriesUniforms, color);\n }\n }\n }\n\n private renderBand(\n buffer: WebGLBuffer,\n count: number,\n uniforms: { scale: [number, number]; translate: [number, number] },\n color: [number, number, number, number]\n ): void {\n const { gl } = this;\n const prog = this.lineProgram; // Reuse line shader (it just outputs color)\n\n gl.useProgram(prog.program);\n gl.bindBuffer(gl.ARRAY_BUFFER, buffer);\n gl.enableVertexAttribArray(prog.attributes.position);\n gl.vertexAttribPointer(prog.attributes.position, 2, gl.FLOAT, false, 0, 0);\n\n gl.uniform2f(prog.uniforms.uScale, uniforms.scale[0], uniforms.scale[1]);\n gl.uniform2f(prog.uniforms.uTranslate, uniforms.translate[0], uniforms.translate[1]);\n \n // Band uses lower opacity by default for nice shading\n const alpha = color[3] * 0.4;\n gl.uniform4f(prog.uniforms.uColor, color[0], color[1], color[2], alpha);\n\n // Band uses TRIANGLE_STRIP for filling area between two curves\n // Vertex 1: (x1, yL), Vertex 2: (x1, yH), Vertex 3: (x2, yL)...\n gl.drawArrays(gl.TRIANGLE_STRIP, 0, count);\n\n gl.disableVertexAttribArray(prog.attributes.position);\n }\n\n private renderLine(\n buffer: WebGLBuffer,\n count: number,\n uniforms: { scale: [number, number]; translate: [number, number] },\n color: [number, number, number, number]\n ): void {\n const { gl } = this;\n const prog = this.lineProgram;\n\n gl.useProgram(prog.program);\n\n // Bind buffer\n gl.bindBuffer(gl.ARRAY_BUFFER, buffer);\n gl.enableVertexAttribArray(prog.attributes.position);\n gl.vertexAttribPointer(prog.attributes.position, 2, gl.FLOAT, false, 0, 0);\n\n // Set uniforms\n gl.uniform2f(prog.uniforms.uScale, uniforms.scale[0], uniforms.scale[1]);\n gl.uniform2f(\n prog.uniforms.uTranslate,\n uniforms.translate[0],\n uniforms.translate[1]\n );\n gl.uniform4f(prog.uniforms.uColor, color[0], color[1], color[2], color[3]);\n\n // Draw\n gl.drawArrays(gl.LINE_STRIP, 0, count);\n\n gl.disableVertexAttribArray(prog.attributes.position);\n }\n\n private renderPoints(\n buffer: WebGLBuffer,\n count: number,\n uniforms: { scale: [number, number]; translate: [number, number] },\n color: [number, number, number, number],\n pointSize: number,\n symbol: string = 'circle'\n ): void {\n const { gl } = this;\n const prog = this.pointProgram;\n\n gl.useProgram(prog.program);\n\n // Bind buffer\n gl.bindBuffer(gl.ARRAY_BUFFER, buffer);\n gl.enableVertexAttribArray(prog.attributes.position);\n gl.vertexAttribPointer(prog.attributes.position, 2, gl.FLOAT, false, 0, 0);\n\n // Set uniforms\n gl.uniform2f(prog.uniforms.uScale, uniforms.scale[0], uniforms.scale[1]);\n gl.uniform2f(\n prog.uniforms.uTranslate,\n uniforms.translate[0],\n uniforms.translate[1]\n );\n gl.uniform4f(prog.uniforms.uColor, color[0], color[1], color[2], color[3]);\n \n if (prog.uniforms.uPointSize) {\n gl.uniform1f(prog.uniforms.uPointSize, pointSize);\n }\n\n if (prog.uniforms.uSymbol) {\n // Symbols: 0:circle, 1:square, 2:diamond, 3:triangle, 4:triangleDown, 5:cross, 6:x, 7:star\n const symbolMap: Record<string, number> = {\n 'circle': 0,\n 'square': 1,\n 'diamond': 2,\n 'triangle': 3,\n 'triangleDown': 4,\n 'cross': 5,\n 'x': 6,\n 'star': 7\n };\n gl.uniform1i(prog.uniforms.uSymbol, symbolMap[symbol] ?? 0);\n }\n\n // Draw\n gl.drawArrays(gl.POINTS, 0, count);\n\n gl.disableVertexAttribArray(prog.attributes.position);\n }\n\n /**\n * Handle resize\n */\n resize(): void {\n const rect = this.canvas.getBoundingClientRect();\n const width = rect.width * this.dpr;\n const height = rect.height * this.dpr;\n\n if (this.canvas.width !== width || this.canvas.height !== height) {\n this.canvas.width = width;\n this.canvas.height = height;\n this.gl.viewport(0, 0, width, height);\n }\n }\n\n /**\n * Get WebGL limits (for debugging)\n */\n getLimits() {\n const { gl } = this;\n return {\n maxTextureSize: gl.getParameter(gl.MAX_TEXTURE_SIZE),\n maxViewportDims: gl.getParameter(gl.MAX_VIEWPORT_DIMS),\n renderer: gl.getParameter(gl.RENDERER),\n vendor: gl.getParameter(gl.VENDOR),\n };\n }\n\n /**\n * Destroy and cleanup\n */\n destroy(): void {\n const { gl } = this;\n\n // Destroy all buffers\n this.buffers.forEach((buffer) => gl.deleteBuffer(buffer));\n this.buffers.clear();\n this.bufferSizes.clear();\n\n // Destroy programs\n gl.deleteProgram(this.lineProgram.program);\n gl.deleteProgram(this.pointProgram.program);\n\n this.isInitialized = false;\n console.log(\"[NativeWebGL] Destroyed\");\n }\n}\n\n// ============================================\n// Utility: Parse Color\n// ============================================\n\nexport function parseColor(color: string): [number, number, number, number] {\n if (color.startsWith(\"#\")) {\n const hex = color.slice(1);\n if (hex.length === 3) {\n const r = parseInt(hex[0] + hex[0], 16) / 255;\n const g = parseInt(hex[1] + hex[1], 16) / 255;\n const b = parseInt(hex[2] + hex[2], 16) / 255;\n return [r, g, b, 1];\n } else if (hex.length === 6) {\n const r = parseInt(hex.slice(0, 2), 16) / 255;\n const g = parseInt(hex.slice(2, 4), 16) / 255;\n const b = parseInt(hex.slice(4, 6), 16) / 255;\n return [r, g, b, 1];\n } else if (hex.length === 8) {\n const r = parseInt(hex.slice(0, 2), 16) / 255;\n const g = parseInt(hex.slice(2, 4), 16) / 255;\n const b = parseInt(hex.slice(4, 6), 16) / 255;\n const a = parseInt(hex.slice(6, 8), 16) / 255;\n return [r, g, b, a];\n }\n }\n\n // Default: magenta for visibility\n return [1, 0, 1, 1];\n}\n\n// ============================================\n// Utility: Interleave Data\n// ============================================\n\nexport function interleaveData(\n x: Float32Array | Float64Array | number[],\n y: Float32Array | Float64Array | number[]\n): Float32Array {\n const length = Math.min(x.length, y.length);\n const result = new Float32Array(length * 2);\n\n for (let i = 0; i < length; i++) {\n result[i * 2] = x[i];\n result[i * 2 + 1] = y[i];\n }\n\n return result;\n}\n\n// ============================================\n// Utility: Interleave Step Data\n// ============================================\n\n/**\n * Create step chart vertices from X,Y data\n * \n * @param x X values\n * @param y Y values\n * @param mode Step mode: 'before', 'after', or 'center'\n * @returns Interleaved Float32Array for step line rendering\n * \n * Step modes:\n * - 'after': Step occurs after the point (horizontal then vertical)\n * - 'before': Step occurs before the point (vertical then horizontal)\n * - 'center': Step occurs at the midpoint between points\n */\nexport function interleaveStepData(\n x: Float32Array | Float64Array | number[],\n y: Float32Array | Float64Array | number[],\n mode: 'before' | 'after' | 'center' = 'after'\n): Float32Array {\n const length = Math.min(x.length, y.length);\n if (length < 2) {\n // Not enough points for step, return regular data\n return interleaveData(x, y);\n }\n\n // For n points, we need 2n-1 vertices (adding intermediate steps)\n const stepCount = length * 2 - 1;\n const result = new Float32Array(stepCount * 2);\n\n let resultIdx = 0;\n\n for (let i = 0; i < length; i++) {\n if (i === 0) {\n // First point\n result[resultIdx++] = x[0];\n result[resultIdx++] = y[0];\n } else {\n const prevX = x[i - 1];\n const prevY = y[i - 1];\n const currX = x[i];\n const currY = y[i];\n\n if (mode === 'after') {\n // Horizontal first, then vertical\n // Intermediate point: (currX, prevY)\n result[resultIdx++] = currX;\n result[resultIdx++] = prevY;\n // Current point\n result[resultIdx++] = currX;\n result[resultIdx++] = currY;\n } else if (mode === 'before') {\n // Vertical first, then horizontal\n // Intermediate point: (prevX, currY)\n result[resultIdx++] = prevX;\n result[resultIdx++] = currY;\n // Current point\n result[resultIdx++] = currX;\n result[resultIdx++] = currY;\n } else {\n // Center mode: step at midpoint\n const midX = (prevX + currX) / 2;\n // First intermediate: (midX, prevY)\n result[resultIdx++] = midX;\n result[resultIdx++] = prevY;\n // Second intermediate: (midX, currY)\n result[resultIdx++] = midX;\n result[resultIdx++] = currY;\n // Current point\n result[resultIdx++] = currX;\n result[resultIdx++] = currY;\n }\n }\n }\n\n // Trim the result if we overallocated (center mode uses more)\n return result.subarray(0, resultIdx);\n}\n\n/**\n * Interleaves data for band rendering\n * Produces [x1, y1, x1, y2, x2, y1, x2, y2, ...]\n * which is ready for gl.TRIANGLE_STRIP\n */\nexport function interleaveBandData(\n x: Float32Array | Float64Array | number[],\n y1: Float32Array | Float64Array | number[],\n y2: Float32Array | Float64Array | number[]\n): Float32Array {\n const n = Math.min(x.length, y1.length, y2.length);\n const result = new Float32Array(n * 2 * 2); // 2 vertices per point, 2 floats per vertex\n \n for (let i = 0; i < n; i++) {\n const idx = i * 4;\n const xi = x[i];\n // Vertex 1 (Curve 1)\n result[idx + 0] = xi;\n result[idx + 1] = y1[i];\n // Vertex 2 (Curve 2 / Baseline)\n result[idx + 2] = xi;\n result[idx + 3] = y2[i];\n }\n return result;\n}\n","/**\n * Theme - Visual styling configuration for SciChart\n *\n * Provides customizable themes for the chart including:\n * - Grid styling\n * - Axis styling\n * - Legend styling\n * - Cursor styling\n */\n\n// ============================================\n// Theme Types\n// ============================================\n\nexport interface GridTheme {\n /** Grid visibility */\n visible: boolean;\n /** Major grid line color */\n majorColor: string;\n /** Minor grid line color */\n minorColor: string;\n /** Major grid line width */\n majorWidth: number;\n /** Minor grid line width */\n minorWidth: number;\n /** Line dash pattern for major lines [dash, gap] */\n majorDash: number[];\n /** Line dash pattern for minor lines [dash, gap] */\n minorDash: number[];\n /** Show minor grid lines */\n showMinor: boolean;\n /** Number of minor divisions between major lines */\n minorDivisions: number;\n}\n\nexport interface AxisTheme {\n /** Axis line color */\n lineColor: string;\n /** Axis line width */\n lineWidth: number;\n /** Tick mark color */\n tickColor: string;\n /** Tick mark length */\n tickLength: number;\n /** Label color */\n labelColor: string;\n /** Label font size */\n labelSize: number;\n /** Axis title color */\n titleColor: string;\n /** Axis title font size */\n titleSize: number;\n /** Font family */\n fontFamily: string;\n}\n\nexport interface LegendTheme {\n /** Legend visibility */\n visible: boolean;\n /** Position */\n position: \"top-left\" | \"top-right\" | \"bottom-left\" | \"bottom-right\";\n /** Background color */\n backgroundColor: string;\n /** Border color */\n borderColor: string;\n /** Border radius */\n borderRadius: number;\n /** Text color */\n textColor: string;\n /** Font size */\n fontSize: number;\n /** Font family */\n fontFamily: string;\n /** Padding inside legend */\n padding: number;\n /** Gap between items */\n itemGap: number;\n /** Color swatch size */\n swatchSize: number;\n}\n\nexport interface CursorTheme {\n /** Cursor line color */\n lineColor: string;\n /** Cursor line width */\n lineWidth: number;\n /** Cursor line dash pattern */\n lineDash: number[];\n /** Tooltip background color */\n tooltipBackground: string;\n /** Tooltip border color */\n tooltipBorder: string;\n /** Tooltip text color */\n tooltipColor: string;\n /** Tooltip font size */\n tooltipSize: number;\n}\n\nexport interface ChartTheme {\n /** Theme name */\n name: string;\n /** Background color */\n backgroundColor: string;\n /** Plot area border color */\n plotBorderColor: string;\n /** Grid theme */\n grid: GridTheme;\n /** X-axis theme */\n xAxis: AxisTheme;\n /** Y-axis theme */\n yAxis: AxisTheme;\n /** Legend theme */\n legend: LegendTheme;\n /** Cursor theme */\n cursor: CursorTheme;\n}\n\n// ============================================\n// Default Themes\n// ============================================\n\nconst DEFAULT_AXIS_THEME: AxisTheme = {\n lineColor: \"#666666\", // Brighter\n lineWidth: 1,\n tickColor: \"#888888\", // Brighter\n tickLength: 6,\n labelColor: \"#cccccc\", // Brighter\n labelSize: 12, // Larger\n titleColor: \"#ffffff\", // Brighter\n titleSize: 14, // Larger\n fontFamily: \"Inter, system-ui, sans-serif\",\n};\n\nconst DEFAULT_GRID_THEME: GridTheme = {\n visible: true,\n majorColor: \"rgba(255, 255, 255, 0.12)\", // Higher opacity\n minorColor: \"rgba(255, 255, 255, 0.05)\",\n majorWidth: 1,\n minorWidth: 0.5,\n majorDash: [4, 4],\n minorDash: [2, 4],\n showMinor: true, // Default to show minor\n minorDivisions: 5,\n};\n\nconst DEFAULT_LEGEND_THEME: LegendTheme = {\n visible: true,\n position: \"top-right\",\n backgroundColor: \"rgba(20, 20, 30, 0.9)\",\n borderColor: \"rgba(255, 255, 255, 0.15)\",\n borderRadius: 6,\n textColor: \"#ffffff\",\n fontSize: 11,\n fontFamily: \"Inter, system-ui, sans-serif\",\n padding: 5,\n itemGap: 3,\n swatchSize: 12,\n};\n\nconst DEFAULT_CURSOR_THEME: CursorTheme = {\n lineColor: \"rgba(255, 255, 255, 0.5)\",\n lineWidth: 1,\n lineDash: [5, 5],\n tooltipBackground: \"rgba(20, 20, 30, 0.95)\",\n tooltipBorder: \"rgba(255, 255, 255, 0.2)\",\n tooltipColor: \"#ffffff\",\n tooltipSize: 11,\n};\n\n// ============================================\n// Preset Themes\n// ============================================\n\nexport const DARK_THEME: ChartTheme = {\n name: \"dark\",\n backgroundColor: \"#0b0e14\",\n plotBorderColor: \"#444c56\",\n grid: {\n ...DEFAULT_GRID_THEME,\n majorColor: \"rgba(255, 255, 255, 0.12)\",\n minorColor: \"rgba(255, 255, 255, 0.04)\",\n },\n xAxis: {\n ...DEFAULT_AXIS_THEME,\n labelColor: \"#adbac7\",\n titleColor: \"#cdd9e5\",\n lineColor: \"#444c56\",\n tickColor: \"#444c56\",\n },\n yAxis: {\n ...DEFAULT_AXIS_THEME,\n labelColor: \"#adbac7\",\n titleColor: \"#cdd9e5\",\n lineColor: \"#444c56\",\n tickColor: \"#444c56\",\n },\n legend: DEFAULT_LEGEND_THEME,\n cursor: DEFAULT_CURSOR_THEME,\n};\n\nexport const MIDNIGHT_THEME: ChartTheme = {\n name: \"midnight\",\n backgroundColor: \"#05050a\",\n plotBorderColor: \"#3a3a5a\",\n grid: {\n ...DEFAULT_GRID_THEME,\n majorColor: \"rgba(150, 150, 255, 0.2)\",\n minorColor: \"rgba(150, 150, 255, 0.08)\",\n },\n xAxis: {\n ...DEFAULT_AXIS_THEME,\n lineColor: \"#5a5a8a\",\n labelColor: \"#b0b0e0\",\n titleColor: \"#d0d0f0\",\n tickColor: \"#5a5a8a\",\n },\n yAxis: {\n ...DEFAULT_AXIS_THEME,\n lineColor: \"#5a5a8a\",\n labelColor: \"#b0b0e0\",\n titleColor: \"#d0d0f0\",\n tickColor: \"#5a5a8a\",\n },\n legend: {\n ...DEFAULT_LEGEND_THEME,\n backgroundColor: \"rgba(15, 15, 30, 0.95)\",\n borderColor: \"rgba(100, 100, 255, 0.4)\",\n },\n cursor: {\n ...DEFAULT_CURSOR_THEME,\n lineColor: \"rgba(150, 150, 255, 0.7)\",\n },\n};\n\n/** Light theme - Clean white background */\nexport const LIGHT_THEME: ChartTheme = {\n name: \"light\",\n backgroundColor: \"#ffffff\",\n plotBorderColor: \"#cccccc\",\n grid: {\n ...DEFAULT_GRID_THEME,\n majorColor: \"rgba(0, 0, 0, 0.1)\",\n minorColor: \"rgba(0, 0, 0, 0.04)\",\n },\n xAxis: {\n ...DEFAULT_AXIS_THEME,\n lineColor: \"#888888\",\n tickColor: \"#888888\",\n labelColor: \"#444444\",\n titleColor: \"#222222\",\n },\n yAxis: {\n ...DEFAULT_AXIS_THEME,\n lineColor: \"#888888\",\n tickColor: \"#888888\",\n labelColor: \"#444444\",\n titleColor: \"#222222\",\n },\n legend: {\n ...DEFAULT_LEGEND_THEME,\n backgroundColor: \"rgba(255, 255, 255, 0.95)\",\n borderColor: \"rgba(0, 0, 0, 0.15)\",\n textColor: \"#222222\",\n },\n cursor: {\n ...DEFAULT_CURSOR_THEME,\n lineColor: \"rgba(0, 0, 0, 0.4)\",\n tooltipBackground: \"rgba(50, 50, 60, 0.95)\",\n },\n};\n\n/** Electrochemistry theme - Professional blue tones */\nexport const ELECTROCHEM_THEME: ChartTheme = {\n name: \"electrochemistry\",\n backgroundColor: \"#0a1628\",\n plotBorderColor: \"#1e3a5f\",\n grid: {\n ...DEFAULT_GRID_THEME,\n majorColor: \"rgba(30, 136, 229, 0.15)\",\n minorColor: \"rgba(30, 136, 229, 0.06)\",\n showMinor: true,\n minorDivisions: 2,\n },\n xAxis: {\n ...DEFAULT_AXIS_THEME,\n lineColor: \"#1e88e5\",\n tickColor: \"#42a5f5\",\n labelColor: \"#90caf9\",\n titleColor: \"#bbdefb\",\n },\n yAxis: {\n ...DEFAULT_AXIS_THEME,\n lineColor: \"#1e88e5\",\n tickColor: \"#42a5f5\",\n labelColor: \"#90caf9\",\n titleColor: \"#bbdefb\",\n },\n legend: {\n ...DEFAULT_LEGEND_THEME,\n backgroundColor: \"rgba(10, 22, 40, 0.95)\",\n borderColor: \"rgba(30, 136, 229, 0.3)\",\n },\n cursor: {\n ...DEFAULT_CURSOR_THEME,\n lineColor: \"rgba(100, 180, 255, 0.6)\",\n },\n};\n\n// ============================================\n// Theme Utilities\n// ============================================\n\n/**\n * Create a custom theme by merging with base theme\n */\nexport function createTheme(\n base: ChartTheme,\n overrides: Partial<ChartTheme>\n): ChartTheme {\n return {\n ...base,\n ...overrides,\n grid: { ...base.grid, ...overrides.grid },\n xAxis: { ...base.xAxis, ...overrides.xAxis },\n yAxis: { ...base.yAxis, ...overrides.yAxis },\n legend: { ...base.legend, ...overrides.legend },\n cursor: { ...base.cursor, ...overrides.cursor },\n };\n}\n\n/**\n * Get a theme by name\n */\nexport function getThemeByName(name: string): ChartTheme {\n switch (name) {\n case \"dark\":\n return DARK_THEME;\n case \"midnight\":\n return MIDNIGHT_THEME;\n case \"light\":\n return LIGHT_THEME;\n case \"electrochemistry\":\n case \"electrochem\":\n return ELECTROCHEM_THEME;\n default:\n console.warn(`[Theme] Unknown theme \"${name}\", using dark`);\n return DARK_THEME;\n }\n}\n\n/** Default theme export */\nexport const DEFAULT_THEME = DARK_THEME;\n","/**\n * OverlayRenderer - Canvas 2D rendering for axes, grid, legend, and cursor\n *\n * This module handles all 2D overlay rendering on top of the WebGL canvas.\n * It uses the theme system for consistent styling.\n */\n\nimport type { Scale } from \"../scales\";\nimport type { ChartTheme } from \"../theme\";\nimport type { Series } from \"./Series\";\n\n// ============================================\n// Types\n// ============================================\n\nexport interface PlotArea {\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\nexport interface AxisLabels {\n x?: string;\n y?: string;\n}\n\nexport interface CursorState {\n enabled: boolean;\n x: number;\n y: number;\n crosshair: boolean;\n tooltipText?: string;\n}\n\n// ============================================\n// Overlay Renderer Class\n// ============================================\n\nexport class OverlayRenderer {\n private ctx: CanvasRenderingContext2D;\n private theme: ChartTheme;\n\n constructor(ctx: CanvasRenderingContext2D, theme: ChartTheme) {\n this.ctx = ctx;\n this.theme = theme;\n }\n\n /**\n * Update the theme\n */\n setTheme(theme: ChartTheme): void {\n this.theme = theme;\n }\n\n /**\n * Clear the overlay\n */\n clear(width: number, height: number): void {\n this.ctx.clearRect(0, 0, width, height);\n }\n\n /**\n * Draw the grid\n */\n drawGrid(plotArea: PlotArea, xScale: Scale, yScale: Scale): void {\n if (!this.theme.grid.visible) return;\n\n const { ctx } = this;\n const grid = this.theme.grid;\n\n const xTicks = xScale.ticks(8);\n const yTicks = yScale.ticks(6);\n\n // Major grid lines\n ctx.strokeStyle = grid.majorColor;\n ctx.lineWidth = grid.majorWidth;\n ctx.setLineDash(grid.majorDash);\n\n // Vertical lines (X ticks)\n xTicks.forEach((tick) => {\n const x = xScale.transform(tick);\n if (x >= plotArea.x && x <= plotArea.x + plotArea.width) {\n ctx.beginPath();\n ctx.moveTo(x, plotArea.y);\n ctx.lineTo(x, plotArea.y + plotArea.height);\n ctx.stroke();\n }\n });\n\n // Horizontal lines (Y ticks)\n yTicks.forEach((tick) => {\n const y = yScale.transform(tick);\n if (y >= plotArea.y && y <= plotArea.y + plotArea.height) {\n ctx.beginPath();\n ctx.moveTo(plotArea.x, y);\n ctx.lineTo(plotArea.x + plotArea.width, y);\n ctx.stroke();\n }\n });\n\n // Minor grid lines (if enabled)\n if (grid.showMinor) {\n ctx.strokeStyle = grid.minorColor;\n ctx.lineWidth = grid.minorWidth;\n ctx.setLineDash(grid.minorDash);\n\n // Generate minor ticks between major ticks\n const minorXTicks = this.generateMinorTicks(xTicks, grid.minorDivisions);\n const minorYTicks = this.generateMinorTicks(yTicks, grid.minorDivisions);\n\n minorXTicks.forEach((tick) => {\n const x = xScale.transform(tick);\n if (x >= plotArea.x && x <= plotArea.x + plotArea.width) {\n ctx.beginPath();\n ctx.moveTo(x, plotArea.y);\n ctx.lineTo(x, plotArea.y + plotArea.height);\n ctx.stroke();\n }\n });\n\n minorYTicks.forEach((tick) => {\n const y = yScale.transform(tick);\n if (y >= plotArea.y && y <= plotArea.y + plotArea.height) {\n ctx.beginPath();\n ctx.moveTo(plotArea.x, y);\n ctx.lineTo(plotArea.x + plotArea.width, y);\n ctx.stroke();\n }\n });\n }\n\n ctx.setLineDash([]);\n }\n\n /**\n * Draw X axis with ticks and labels\n */\n drawXAxis(plotArea: PlotArea, xScale: Scale, label?: string): void {\n const { ctx } = this;\n const axis = this.theme.xAxis;\n const xTicks = xScale.ticks(8);\n const axisY = plotArea.y + plotArea.height;\n\n // Axis line\n ctx.strokeStyle = axis.lineColor;\n ctx.lineWidth = axis.lineWidth;\n ctx.beginPath();\n ctx.moveTo(plotArea.x, axisY);\n ctx.lineTo(plotArea.x + plotArea.width, axisY);\n ctx.stroke();\n\n // Ticks and labels\n ctx.fillStyle = axis.labelColor;\n ctx.font = `${axis.labelSize}px ${axis.fontFamily}`;\n ctx.textAlign = \"center\";\n ctx.textBaseline = \"top\";\n\n xTicks.forEach((tick) => {\n const x = xScale.transform(tick);\n\n if (x >= plotArea.x && x <= plotArea.x + plotArea.width) {\n // Tick mark\n ctx.strokeStyle = axis.tickColor;\n ctx.beginPath();\n ctx.moveTo(x, axisY);\n ctx.lineTo(x, axisY + axis.tickLength);\n ctx.stroke();\n\n // Label\n ctx.fillText(this.formatXTick(tick), x, axisY + axis.tickLength + 3);\n }\n });\n\n // Axis title\n if (label) {\n ctx.fillStyle = axis.titleColor;\n ctx.font = `${axis.titleSize}px ${axis.fontFamily}`;\n ctx.textAlign = \"center\";\n ctx.textBaseline = \"bottom\";\n ctx.fillText(\n label,\n plotArea.x + plotArea.width / 2,\n plotArea.y + plotArea.height + 45\n );\n }\n }\n\n /**\n * Draw Y axis with ticks and labels\n */\n drawYAxis(\n plotArea: PlotArea, \n yScale: Scale, \n label?: string, \n position: \"left\" | \"right\" = \"left\",\n offset: number = 0\n ): void {\n const { ctx } = this;\n const axis = this.theme.yAxis;\n const yTicks = yScale.ticks(6);\n // Calculate X coordinate for axis line based on position and offset\n const axisX = position === 'left' ? plotArea.x - offset : plotArea.x + plotArea.width + offset;\n const tickDir = position === 'left' ? -1 : 1; // Left points left, right points right\n\n // Axis line\n ctx.strokeStyle = axis.lineColor;\n ctx.lineWidth = axis.lineWidth;\n ctx.beginPath();\n ctx.moveTo(axisX, plotArea.y);\n ctx.lineTo(axisX, plotArea.y + plotArea.height);\n ctx.stroke();\n\n // Ticks and labels\n ctx.fillStyle = axis.labelColor;\n ctx.font = `${axis.labelSize}px ${axis.fontFamily}`;\n ctx.textAlign = position === 'left' ? \"right\" : \"left\";\n ctx.textBaseline = \"middle\";\n\n yTicks.forEach((tick) => {\n const y = yScale.transform(tick);\n\n if (y >= plotArea.y && y <= plotArea.y + plotArea.height) {\n // Tick mark\n ctx.strokeStyle = axis.tickColor;\n ctx.beginPath();\n ctx.moveTo(axisX, y);\n ctx.lineTo(axisX + axis.tickLength * tickDir, y);\n ctx.stroke();\n\n // Label\n const labelX = axisX + (axis.tickLength + 3) * tickDir;\n ctx.fillText(this.formatYTick(tick), labelX, y);\n }\n });\n\n // Axis title\n if (label) {\n ctx.save();\n ctx.fillStyle = axis.titleColor;\n ctx.font = `${axis.titleSize}px ${axis.fontFamily}`;\n ctx.textAlign = \"center\";\n ctx.textBaseline = \"top\";\n \n const titleX = position === 'left' \n ? axisX - 40 // Ajustar padding para título izquierdo\n : axisX + 40; // Ajustar padding para título derecho\n \n const titleY = plotArea.y + plotArea.height / 2;\n \n ctx.translate(titleX, titleY);\n ctx.rotate(position === 'left' ? -Math.PI / 2 : Math.PI / 2);\n ctx.fillText(label, 0, 0);\n ctx.restore();\n }\n }\n\n /**\n * Draw plot area border\n */\n drawPlotBorder(plotArea: PlotArea): void {\n const { ctx } = this;\n ctx.strokeStyle = this.theme.plotBorderColor;\n ctx.lineWidth = 1;\n ctx.strokeRect(plotArea.x, plotArea.y, plotArea.width, plotArea.height);\n }\n\n /**\n * Draw legend\n */\n drawLegend(plotArea: PlotArea, series: Series[]): void {\n if (series.length === 0) return;\n\n const { ctx } = this;\n const legend = this.theme.legend;\n\n // Calculate legend dimensions\n ctx.font = `${legend.fontSize}px ${legend.fontFamily}`;\n let maxWidth = 0;\n const items = series.map((s) => {\n const label = s.getId();\n const style = s.getStyle();\n const width = ctx.measureText(label).width;\n maxWidth = Math.max(maxWidth, width);\n return { \n id: s.getId(), \n color: style.color ?? \"#ff0055\", \n label,\n type: s.getType(),\n symbol: style.symbol,\n opacity: style.opacity ?? 1\n };\n });\n\n const boxWidth = legend.swatchSize + 8 + maxWidth + legend.padding * 2;\n const boxHeight =\n items.length * (legend.swatchSize + legend.itemGap) -\n legend.itemGap +\n legend.padding * 2;\n\n // Calculate position\n let x: number, y: number;\n switch (legend.position) {\n case \"top-left\":\n x = plotArea.x + 10;\n y = plotArea.y + 10;\n break;\n case \"bottom-left\":\n x = plotArea.x + 10;\n y = plotArea.y + 10;\n break;\n case \"bottom-right\":\n x = plotArea.x + plotArea.width - boxWidth - 10;\n y = plotArea.y + plotArea.height - boxHeight - 10;\n break;\n case \"top-right\":\n default:\n x = plotArea.x + plotArea.width - boxWidth - 10;\n y = plotArea.y + 10;\n break;\n }\n\n // Draw background\n ctx.fillStyle = legend.backgroundColor;\n ctx.strokeStyle = legend.borderColor;\n ctx.lineWidth = 1;\n ctx.beginPath();\n const r = legend.borderRadius;\n ctx.moveTo(x + r, y);\n ctx.lineTo(x + boxWidth - r, y);\n ctx.arcTo(x + boxWidth, y, x + boxWidth, y + r, r);\n ctx.lineTo(x + boxWidth, y + boxHeight - r);\n ctx.arcTo(x + boxWidth, y + boxHeight, x + boxWidth - r, y + boxHeight, r);\n ctx.lineTo(x + r, y + boxHeight);\n ctx.arcTo(x, y + boxHeight, x, y + boxHeight - r, r);\n ctx.lineTo(x, y + r);\n ctx.arcTo(x, y, x + r, y, r);\n ctx.closePath();\n ctx.fill();\n ctx.stroke();\n\n // Draw items\n ctx.textAlign = \"left\";\n ctx.textBaseline = \"middle\";\n\n items.forEach((item, i) => {\n const itemY =\n y + legend.padding + i * (legend.swatchSize + legend.itemGap);\n const swatchX = x + legend.padding;\n const centerY = itemY + legend.swatchSize / 2;\n const centerX = swatchX + legend.swatchSize / 2;\n\n // Draw swatch (symbol or line)\n ctx.save();\n ctx.globalAlpha = item.opacity;\n ctx.fillStyle = item.color;\n ctx.strokeStyle = item.color;\n ctx.lineWidth = 2;\n\n const size = legend.swatchSize;\n\n // EXTREME FALLBACK DETECTION\n const typeStr = String(item.type).toLowerCase();\n const hasSymbol = !!item.symbol && item.symbol !== 'circle';\n \n const isScatter = typeStr === 'scatter' || typeStr === '1' || (typeStr === 'line' && hasSymbol);\n const isLineScatter = typeStr.includes('scatter') || typeStr === '2';\n\n if (isScatter) {\n this.drawLegendSymbol(ctx, item.symbol ?? 'circle', centerX, centerY, size * 0.9);\n } else if (isLineScatter) {\n // Line + Scatter\n ctx.beginPath();\n ctx.moveTo(swatchX, centerY);\n ctx.lineTo(swatchX + size, centerY);\n ctx.stroke();\n \n this.drawLegendSymbol(ctx, item.symbol ?? 'circle', centerX, centerY, size * 0.6);\n } else {\n // Pure line or step\n ctx.beginPath();\n ctx.moveTo(swatchX, centerY);\n ctx.lineTo(swatchX + size, centerY);\n ctx.stroke();\n }\n ctx.restore();\n\n // Label\n ctx.fillStyle = legend.textColor;\n ctx.fillText(\n item.label,\n x + legend.padding + legend.swatchSize + 8,\n centerY\n );\n });\n }\n\n /**\n * Helper to draw a symbol in the legend\n */\n private drawLegendSymbol(\n ctx: CanvasRenderingContext2D,\n symbol: string,\n x: number,\n y: number,\n size: number\n ): void {\n const r = size / 2;\n ctx.beginPath();\n\n switch (symbol) {\n case 'circle':\n ctx.arc(x, y, r, 0, Math.PI * 2);\n ctx.fill();\n break;\n case 'square':\n ctx.rect(x - r, y - r, size, size);\n ctx.fill();\n break;\n case 'diamond':\n ctx.moveTo(x, y - r);\n ctx.lineTo(x + r, y);\n ctx.lineTo(x, y + r);\n ctx.lineTo(x - r, y);\n ctx.closePath();\n ctx.fill();\n break;\n case 'triangle':\n ctx.moveTo(x, y - r);\n ctx.lineTo(x + r, y + r);\n ctx.lineTo(x - r, y + r);\n ctx.closePath();\n ctx.fill();\n break;\n case 'triangleDown':\n ctx.moveTo(x, y + r);\n ctx.lineTo(x + r, y - r);\n ctx.lineTo(x - r, y - r);\n ctx.closePath();\n ctx.fill();\n break;\n case 'cross':\n ctx.moveTo(x - r, y);\n ctx.lineTo(x + r, y);\n ctx.moveTo(x, y - r);\n ctx.lineTo(x, y + r);\n ctx.stroke();\n break;\n case 'x':\n const d = r * 0.707; // sin(45)\n ctx.moveTo(x - d, y - d);\n ctx.lineTo(x + d, y + d);\n ctx.moveTo(x + d, y - d);\n ctx.lineTo(x - d, y + d);\n ctx.stroke();\n break;\n case 'star':\n for (let i = 0; i < 5; i++) {\n ctx.lineTo(\n x + r * Math.cos(((18 + i * 72) / 180) * Math.PI),\n y - r * Math.sin(((18 + i * 72) / 180) * Math.PI)\n );\n ctx.lineTo(\n x + (r / 2) * Math.cos(((54 + i * 72) / 180) * Math.PI),\n y - (r / 2) * Math.sin(((54 + i * 72) / 180) * Math.PI)\n );\n }\n ctx.closePath();\n ctx.fill();\n break;\n }\n }\n\n /**\n * Draw cursor/crosshair\n */\n drawCursor(plotArea: PlotArea, cursor: CursorState): void {\n if (!cursor.enabled) return;\n\n const { ctx } = this;\n const cursorTheme = this.theme.cursor;\n\n // Check if cursor is in plot area\n if (\n cursor.x < plotArea.x ||\n cursor.x > plotArea.x + plotArea.width ||\n cursor.y < plotArea.y ||\n cursor.y > plotArea.y + plotArea.height\n ) {\n return;\n }\n\n ctx.save();\n\n // Clip to plot area\n ctx.beginPath();\n ctx.rect(plotArea.x, plotArea.y, plotArea.width, plotArea.height);\n ctx.clip();\n\n // Crosshair style\n ctx.strokeStyle = cursorTheme.lineColor;\n ctx.lineWidth = cursorTheme.lineWidth;\n ctx.setLineDash(cursorTheme.lineDash);\n\n if (cursor.crosshair) {\n // Vertical line\n ctx.beginPath();\n ctx.moveTo(cursor.x, plotArea.y);\n ctx.lineTo(cursor.x, plotArea.y + plotArea.height);\n ctx.stroke();\n\n // Horizontal line\n ctx.beginPath();\n ctx.moveTo(plotArea.x, cursor.y);\n ctx.lineTo(plotArea.x + plotArea.width, cursor.y);\n ctx.stroke();\n } else {\n // Just vertical line\n ctx.beginPath();\n ctx.moveTo(cursor.x, plotArea.y);\n ctx.lineTo(cursor.x, plotArea.y + plotArea.height);\n ctx.stroke();\n }\n\n ctx.restore();\n\n // Draw tooltip\n if (cursor.tooltipText) {\n this.drawTooltip(cursor.x, cursor.y, cursor.tooltipText, plotArea);\n }\n }\n\n /**\n * Draw tooltip\n */\n private drawTooltip(\n x: number,\n y: number,\n text: string,\n plotArea: PlotArea\n ): void {\n const { ctx } = this;\n const cursor = this.theme.cursor;\n const lines = text.split(\"\\n\");\n const lineHeight = cursor.tooltipSize + 5;\n const padding = 8;\n\n ctx.font = `${cursor.tooltipSize}px ${this.theme.xAxis.fontFamily}`;\n let maxWidth = 0;\n lines.forEach((line) => {\n maxWidth = Math.max(maxWidth, ctx.measureText(line).width);\n });\n\n const boxWidth = maxWidth + padding * 2;\n const boxHeight = lines.length * lineHeight + padding * 2 - 5;\n\n // Position tooltip\n let tooltipX = x + 15;\n let tooltipY = y - boxHeight - 10;\n\n if (tooltipX + boxWidth > plotArea.x + plotArea.width) {\n tooltipX = x - boxWidth - 15;\n }\n if (tooltipY < plotArea.y) {\n tooltipY = y + 15;\n }\n\n // Background\n ctx.fillStyle = cursor.tooltipBackground;\n ctx.strokeStyle = cursor.tooltipBorder;\n ctx.lineWidth = 1;\n ctx.beginPath();\n const r = 4;\n ctx.moveTo(tooltipX + r, tooltipY);\n ctx.lineTo(tooltipX + boxWidth - r, tooltipY);\n ctx.arcTo(tooltipX + boxWidth, tooltipY, tooltipX + boxWidth, tooltipY + r, r);\n ctx.lineTo(tooltipX + boxWidth, tooltipY + boxHeight - r);\n ctx.arcTo(tooltipX + boxWidth, tooltipY + boxHeight, tooltipX + boxWidth - r, tooltipY + boxHeight, r);\n ctx.lineTo(tooltipX + r, tooltipY + boxHeight);\n ctx.arcTo(tooltipX, tooltipY + boxHeight, tooltipX, tooltipY + boxHeight - r, r);\n ctx.lineTo(tooltipX, tooltipY + r);\n ctx.arcTo(tooltipX, tooltipY, tooltipX + r, tooltipY, r);\n ctx.closePath();\n ctx.fill();\n ctx.stroke();\n\n // Text\n ctx.fillStyle = cursor.tooltipColor;\n ctx.textAlign = \"left\";\n ctx.textBaseline = \"top\";\n lines.forEach((line, i) => {\n ctx.fillText(\n line,\n tooltipX + padding,\n tooltipY + padding + i * lineHeight\n );\n });\n }\n\n /**\n * Draw selection rectangle (Box Zoom)\n */\n drawSelectionRect(rect: {\n x: number;\n y: number;\n width: number;\n height: number;\n }): void {\n const { ctx } = this;\n const isDark =\n this.theme.name.toLowerCase().includes(\"dark\") ||\n this.theme.name.toLowerCase().includes(\"midnight\");\n\n ctx.save();\n ctx.fillStyle = isDark\n ? \"rgba(0, 170, 255, 0.15)\"\n : \"rgba(0, 100, 255, 0.1)\";\n ctx.strokeStyle = \"#00aaff\";\n ctx.lineWidth = 1;\n ctx.setLineDash([5, 5]);\n\n ctx.beginPath();\n ctx.rect(rect.x, rect.y, rect.width, rect.height);\n ctx.fill();\n ctx.stroke();\n ctx.restore();\n }\n\n /**\n * Draw error bars for a series\n */\n drawErrorBars(\n plotArea: PlotArea,\n series: Series,\n xScale: Scale,\n yScale: Scale\n ): void {\n if (!series.hasErrorData()) return;\n\n const { ctx } = this;\n const data = series.getData();\n const style = series.getStyle();\n const errorStyle = style.errorBars ?? {};\n\n // Skip if explicitly hidden\n if (errorStyle.visible === false) return;\n\n // Error bar styling\n const color = errorStyle.color ?? style.color ?? '#ff0055';\n const lineWidth = errorStyle.width ?? 1;\n const capWidth = errorStyle.capWidth ?? 6;\n const showCaps = errorStyle.showCaps !== false;\n const opacity = errorStyle.opacity ?? 0.7;\n const direction = errorStyle.direction ?? 'both';\n\n ctx.save();\n\n // Clip to plot area\n ctx.beginPath();\n ctx.rect(plotArea.x, plotArea.y, plotArea.width, plotArea.height);\n ctx.clip();\n\n ctx.strokeStyle = color;\n ctx.lineWidth = lineWidth;\n ctx.globalAlpha = opacity;\n\n // Draw error bars for each point\n for (let i = 0; i < data.x.length; i++) {\n const x = xScale.transform(data.x[i]);\n const y = yScale.transform(data.y[i]);\n\n // Skip points outside plot area\n if (x < plotArea.x || x > plotArea.x + plotArea.width) continue;\n if (y < plotArea.y || y > plotArea.y + plotArea.height) continue;\n\n // Y error bars (vertical)\n const yError = series.getYError(i);\n if (yError) {\n const [errorMinus, errorPlus] = yError;\n const yBase = data.y[i];\n\n // Convert error values to pixel positions\n const yTop = yScale.transform(yBase + errorPlus);\n const yBottom = yScale.transform(yBase - errorMinus);\n\n ctx.beginPath();\n\n // Draw based on direction\n if (direction === 'both' || direction === 'positive') {\n // Upper error bar\n ctx.moveTo(x, y);\n ctx.lineTo(x, yTop);\n // Top cap\n if (showCaps) {\n ctx.moveTo(x - capWidth / 2, yTop);\n ctx.lineTo(x + capWidth / 2, yTop);\n }\n }\n\n if (direction === 'both' || direction === 'negative') {\n // Lower error bar\n ctx.moveTo(x, y);\n ctx.lineTo(x, yBottom);\n // Bottom cap\n if (showCaps) {\n ctx.moveTo(x - capWidth / 2, yBottom);\n ctx.lineTo(x + capWidth / 2, yBottom);\n }\n }\n\n ctx.stroke();\n }\n\n // X error bars (horizontal)\n const xError = series.getXError(i);\n if (xError) {\n const [errorMinus, errorPlus] = xError;\n const xBase = data.x[i];\n\n // Convert error values to pixel positions\n const xRight = xScale.transform(xBase + errorPlus);\n const xLeft = xScale.transform(xBase - errorMinus);\n\n ctx.beginPath();\n\n if (direction === 'both' || direction === 'positive') {\n // Right error bar\n ctx.moveTo(x, y);\n ctx.lineTo(xRight, y);\n // Right cap\n if (showCaps) {\n ctx.moveTo(xRight, y - capWidth / 2);\n ctx.lineTo(xRight, y + capWidth / 2);\n }\n }\n\n if (direction === 'both' || direction === 'negative') {\n // Left error bar\n ctx.moveTo(x, y);\n ctx.lineTo(xLeft, y);\n // Left cap\n if (showCaps) {\n ctx.moveTo(xLeft, y - capWidth / 2);\n ctx.lineTo(xLeft, y + capWidth / 2);\n }\n }\n\n ctx.stroke();\n }\n }\n\n ctx.restore();\n }\n\n // ----------------------------------------\n // Helper Methods\n // ----------------------------------------\n\n private generateMinorTicks(\n majorTicks: number[],\n divisions: number\n ): number[] {\n if (majorTicks.length < 2) return [];\n\n const minor: number[] = [];\n for (let i = 0; i < majorTicks.length - 1; i++) {\n const step = (majorTicks[i + 1] - majorTicks[i]) / divisions;\n for (let j = 1; j < divisions; j++) {\n minor.push(majorTicks[i] + step * j);\n }\n }\n return minor;\n }\n\n private formatXTick(value: number): string {\n if (Math.abs(value) < 0.001 && value !== 0) {\n return this.toScientificUnicode(value, 1);\n }\n return value.toFixed(3).replace(/\\.?0+$/, \"\");\n }\n\n private formatYTick(value: number): string {\n if (value === 0) return \"0\";\n const absVal = Math.abs(value);\n if (absVal < 0.0001 || absVal >= 10000) {\n return this.toScientificUnicode(value, 1);\n }\n return value.toPrecision(3);\n }\n\n private toScientificUnicode(value: number, precision: number): string {\n const str = value.toExponential(precision);\n const [mantissa, exponent] = str.split(\"e\");\n\n // Convert exponent to unicode superscripts\n const superscriptMap: Record<string, string> = {\n \"0\": \"⁰\",\n \"1\": \"¹\",\n \"2\": \"²\",\n \"3\": \"³\",\n \"4\": \"⁴\",\n \"5\": \"⁵\",\n \"6\": \"⁶\",\n \"7\": \"⁷\",\n \"8\": \"⁸\",\n \"9\": \"⁹\",\n \"-\": \"⁻\",\n \"+\": \"⁺\",\n };\n\n const unicodeExp = exponent.replace(\n /[0-9\\-+]/g,\n (char) => superscriptMap[char] || char\n );\n\n // Return \"1.2 × 10⁻⁵\" format\n return `${mantissa} × 10${unicodeExp}`;\n }\n}\n","/**\n * InteractionManager - Handles mouse, touch, and keyboard interactions\n *\n * This module manages all user interactions with the chart including:\n * - Zoom (mouse wheel)\n * - Pan (mouse drag, touch drag)\n * - Cursor tracking\n */\n\nimport type { Bounds } from \"../types\";\n\n// ============================================\n// Types\n// ============================================\n\nexport interface AxisLayout {\n id: string;\n position: 'left' | 'right';\n offset: number;\n}\n\nexport interface InteractionCallbacks {\n onZoom: (bounds: Bounds, axisId?: string) => void;\n onPan: (deltaX: number, deltaY: number, axisId?: string) => void;\n onBoxZoom: (\n rect: { x: number; y: number; width: number; height: number } | null\n ) => void;\n onCursorMove: (x: number, y: number) => void;\n onCursorLeave: () => void;\n}\n\nexport interface PlotAreaGetter {\n (): { x: number; y: number; width: number; height: number };\n}\n\nexport interface BoundsGetter {\n (axisId?: string): Bounds;\n}\n\nexport interface AxisLayoutGetter {\n (): AxisLayout[];\n}\n\n// ============================================\n// Interaction Manager Class\n// ============================================\n\nexport class InteractionManager {\n private container: HTMLElement;\n private callbacks: InteractionCallbacks;\n private getPlotArea: PlotAreaGetter;\n private getBounds: BoundsGetter;\n private getAxesLayout: AxisLayoutGetter;\n\n private isDragging = false;\n private panningAxisId?: string;\n private isBoxSelecting = false;\n private selectionStart = { x: 0, y: 0 };\n private lastMousePos = { x: 0, y: 0 };\n private isPanMode = true;\n\n // Bound handlers for cleanup\n private boundWheel: (e: WheelEvent) => void;\n private boundMouseDown: (e: MouseEvent) => void;\n private boundMouseMove: (e: MouseEvent) => void;\n private boundMouseUp: (e: MouseEvent) => void;\n private boundMouseLeave: (e: MouseEvent) => void;\n private boundTouchStart: (e: TouchEvent) => void;\n private boundTouchMove: (e: TouchEvent) => void;\n private boundTouchEnd: (e: TouchEvent) => void;\n\n constructor(\n container: HTMLElement,\n callbacks: InteractionCallbacks,\n getPlotArea: PlotAreaGetter,\n getBounds: BoundsGetter,\n getAxesLayout: AxisLayoutGetter\n ) {\n this.container = container;\n this.callbacks = callbacks;\n this.getPlotArea = getPlotArea;\n this.getBounds = getBounds;\n this.getAxesLayout = getAxesLayout;\n\n // Bind handlers\n this.boundWheel = this.handleWheel.bind(this);\n this.boundMouseDown = this.handleMouseDown.bind(this);\n this.boundMouseMove = this.handleMouseMove.bind(this);\n this.boundMouseUp = this.handleMouseUp.bind(this);\n this.boundMouseLeave = this.handleMouseLeave.bind(this);\n this.boundTouchStart = this.handleTouchStart.bind(this);\n this.boundTouchMove = this.handleTouchMove.bind(this);\n this.boundTouchEnd = this.handleTouchEnd.bind(this);\n\n this.attachListeners();\n }\n\n private attachListeners(): void {\n this.container.addEventListener(\"wheel\", this.boundWheel, {\n passive: false,\n });\n this.container.addEventListener(\"mousedown\", this.boundMouseDown);\n this.container.addEventListener(\"mousemove\", this.boundMouseMove);\n this.container.addEventListener(\"mouseup\", this.boundMouseUp);\n this.container.addEventListener(\"mouseleave\", this.boundMouseLeave);\n this.container.addEventListener(\"touchstart\", this.boundTouchStart);\n this.container.addEventListener(\"touchmove\", this.boundTouchMove);\n this.container.addEventListener(\"touchend\", this.boundTouchEnd);\n }\n\n private detachListeners(): void {\n this.container.removeEventListener(\"wheel\", this.boundWheel);\n this.container.removeEventListener(\"mousedown\", this.boundMouseDown);\n this.container.removeEventListener(\"mousemove\", this.boundMouseMove);\n this.container.removeEventListener(\"mouseup\", this.boundMouseUp);\n this.container.removeEventListener(\"mouseleave\", this.boundMouseLeave);\n this.container.removeEventListener(\"touchstart\", this.boundTouchStart);\n this.container.removeEventListener(\"touchmove\", this.boundTouchMove);\n this.container.removeEventListener(\"touchend\", this.boundTouchEnd);\n }\n\n public setPanMode(enabled: boolean): void {\n this.isPanMode = enabled;\n }\n\n // ----------------------------------------\n // Mouse Handlers\n // ----------------------------------------\n\n private handleWheel(e: WheelEvent): void {\n const plotArea = this.getPlotArea();\n if (plotArea.width <= 1 || plotArea.height <= 1) return;\n\n e.preventDefault();\n const rect = this.container.getBoundingClientRect();\n const mouseX = e.clientX - rect.left;\n const mouseY = e.clientY - rect.top;\n\n // Determine zoom targets\n const axes = this.getAxesLayout();\n let zoomX = false;\n let zoomY = false;\n let targetAxisId: string | undefined = undefined;\n\n // Hit test Y axes\n for (const axis of axes) {\n const axisX = axis.position === 'left' \n ? plotArea.x - axis.offset \n : plotArea.x + plotArea.width + axis.offset;\n \n const hitWidth = 65; // Matches axis spacing\n const hitX = axis.position === 'left' ? axisX - hitWidth : axisX;\n\n if (\n mouseX >= hitX &&\n mouseX <= hitX + hitWidth &&\n mouseY >= plotArea.y &&\n mouseY <= plotArea.y + plotArea.height\n ) {\n targetAxisId = axis.id;\n zoomY = true;\n zoomX = false;\n break;\n }\n }\n\n if (!targetAxisId) {\n // X Axis area (bottom)\n if (\n mouseY > plotArea.y + plotArea.height &&\n mouseX >= plotArea.x &&\n mouseX <= plotArea.x + plotArea.width\n ) {\n zoomX = true;\n }\n // Plot area (both)\n else if (\n mouseX >= plotArea.x &&\n mouseX <= plotArea.x + plotArea.width &&\n mouseY >= plotArea.y &&\n mouseY <= plotArea.y + plotArea.height\n ) {\n zoomX = true;\n zoomY = true;\n } else {\n return; // Outside interactive areas\n }\n }\n\n const bounds = this.getBounds(targetAxisId);\n const zoomFactor = e.deltaY > 0 ? 1.1 : 0.9;\n\n // Calculate zoom center in data coordinates\n const normalizedX = (mouseX - plotArea.x) / plotArea.width;\n const normalizedY = 1 - (mouseY - plotArea.y) / plotArea.height;\n\n const dataX = bounds.xMin + normalizedX * (bounds.xMax - bounds.xMin);\n const dataY = bounds.yMin + normalizedY * (bounds.yMax - bounds.yMin);\n\n // Limits\n const MIN_RANGE = 1e-12;\n const MAX_RANGE = 1e15;\n\n let nextXMin = zoomX\n ? dataX - (dataX - bounds.xMin) * zoomFactor\n : bounds.xMin;\n let nextXMax = zoomX\n ? dataX + (bounds.xMax - dataX) * zoomFactor\n : bounds.xMax;\n let nextYMin = zoomY\n ? dataY - (dataY - bounds.yMin) * zoomFactor\n : bounds.yMin;\n let nextYMax = zoomY\n ? dataY + (bounds.yMax - dataY) * zoomFactor\n : bounds.yMax;\n\n const nextXRange = nextXMax - nextXMin;\n const nextYRange = nextYMax - nextYMin;\n\n if (nextXRange < MIN_RANGE || nextXRange > MAX_RANGE) {\n nextXMin = bounds.xMin;\n nextXMax = bounds.xMax;\n }\n if (nextYRange < MIN_RANGE || nextYRange > MAX_RANGE) {\n nextYMin = bounds.yMin;\n nextYMax = bounds.yMax;\n }\n\n const newBounds: Bounds = {\n xMin: nextXMin,\n xMax: nextXMax,\n yMin: nextYMin,\n yMax: nextYMax,\n };\n\n this.callbacks.onZoom(newBounds, targetAxisId);\n }\n\n private handleMouseDown(e: MouseEvent): void {\n const plotArea = this.getPlotArea();\n if (plotArea.width <= 1 || plotArea.height <= 1) return;\n\n const rect = this.container.getBoundingClientRect();\n const mouseX = e.clientX - rect.left;\n const mouseY = e.clientY - rect.top;\n\n // Check if mouse is in axis area for dragging\n const axes = this.getAxesLayout();\n for (const axis of axes) {\n const axisX = axis.position === 'left' \n ? plotArea.x - axis.offset \n : plotArea.x + plotArea.width + axis.offset;\n \n const hitWidth = 65;\n const hitX = axis.position === 'left' ? axisX - hitWidth : axisX;\n\n if (\n mouseX >= hitX &&\n mouseX <= hitX + hitWidth &&\n mouseY >= plotArea.y &&\n mouseY <= plotArea.y + plotArea.height\n ) {\n this.isDragging = true;\n this.panningAxisId = axis.id;\n this.lastMousePos = { x: e.clientX, y: e.clientY };\n this.container.style.cursor = \"ns-resize\";\n return;\n }\n }\n\n // Check if mouse is in plot area\n if (\n mouseX >= plotArea.x &&\n mouseX <= plotArea.x + plotArea.width &&\n mouseY >= plotArea.y &&\n mouseY <= plotArea.y + plotArea.height\n ) {\n if (this.isPanMode) {\n this.isDragging = true;\n this.panningAxisId = undefined;\n this.lastMousePos = { x: e.clientX, y: e.clientY };\n this.container.style.cursor = \"grabbing\";\n } else {\n this.isBoxSelecting = true;\n this.selectionStart = { x: mouseX, y: mouseY };\n this.container.style.cursor = \"crosshair\";\n }\n }\n }\n\n private handleMouseMove(e: MouseEvent): void {\n const rect = this.container.getBoundingClientRect();\n const mouseX = e.clientX - rect.left;\n const mouseY = e.clientY - rect.top;\n\n // Update cursor position\n this.callbacks.onCursorMove(mouseX, mouseY);\n\n if (this.isDragging) {\n const deltaX = e.clientX - this.lastMousePos.x;\n const deltaY = e.clientY - this.lastMousePos.y;\n this.callbacks.onPan(deltaX, deltaY, this.panningAxisId);\n this.lastMousePos = { x: e.clientX, y: e.clientY };\n } else if (this.isBoxSelecting) {\n const x = Math.min(this.selectionStart.x, mouseX);\n const y = Math.min(this.selectionStart.y, mouseY);\n const width = Math.abs(mouseX - this.selectionStart.x);\n const height = Math.abs(mouseY - this.selectionStart.y);\n this.callbacks.onBoxZoom({ x, y, width, height });\n }\n }\n\n private handleMouseUp(): void {\n if (this.isBoxSelecting) {\n this.callbacks.onBoxZoom(null); // Signal to apply\n }\n this.isDragging = false;\n this.panningAxisId = undefined;\n this.isBoxSelecting = false;\n this.container.style.cursor = \"\";\n }\n\n private handleMouseLeave(): void {\n this.isDragging = false;\n this.panningAxisId = undefined;\n this.container.style.cursor = \"\";\n this.callbacks.onCursorLeave();\n }\n\n // ----------------------------------------\n // Touch Handlers\n // ----------------------------------------\n\n private handleTouchStart(e: TouchEvent): void {\n if (e.touches.length === 1) {\n const touch = e.touches[0];\n this.isDragging = true;\n this.panningAxisId = undefined;\n this.lastMousePos = { x: touch.clientX, y: touch.clientY };\n }\n }\n\n private handleTouchMove(e: TouchEvent): void {\n if (!this.isDragging || e.touches.length !== 1) return;\n\n e.preventDefault();\n\n const touch = e.touches[0];\n const deltaX = touch.clientX - this.lastMousePos.x;\n const deltaY = touch.clientY - this.lastMousePos.y;\n\n this.callbacks.onPan(deltaX, deltaY, this.panningAxisId);\n\n this.lastMousePos = { x: touch.clientX, y: touch.clientY };\n }\n\n private handleTouchEnd(): void {\n this.isDragging = false;\n this.panningAxisId = undefined;\n }\n\n // ----------------------------------------\n // Cleanup\n // ----------------------------------------\n\n destroy(): void {\n this.detachListeners();\n }\n}\n","/**\n * ChartControls - In-chart control buttons (Plotly-style)\n *\n * Provides a floating glassmorphism toolbar for chart controls:\n * - Pan/Zoom mode toggle\n * - Reset Zoom\n * - Display Mode (Line, Scatter, Both)\n * - Smoothing toggle\n */\n\nimport { ChartTheme } from \"../theme\";\n\nexport interface ChartControlsCallbacks {\n onResetZoom: () => void;\n onSetType: (type: \"line\" | \"scatter\" | \"line+scatter\") => void;\n onToggleSmoothing: () => void;\n onTogglePan: (active: boolean) => void;\n onExport: () => void;\n onAutoScale: () => void;\n onToggleLegend: (visible: boolean) => void;\n}\n\n// ============================================\n// SVG Icons (Plotly-inspired)\n// ============================================\n\nconst ICONS = {\n PAN: `<svg viewBox=\"0 0 24 24\" width=\"14\" height=\"14\" stroke=\"currentColor\" stroke-width=\"2\" fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M18 11V6a2 2 0 0 0-2-2v0a2 2 0 0 0-2 2v0\"></path><path d=\"M14 10V4a2 2 0 0 0-2-2v0a2 2 0 0 0-2 2v0\"></path><path d=\"M10 10.5V6a2 2 0 0 0-2-2v0a2 2 0 0 0-2 2v0\"></path><path d=\"M18 8a2 2 0 1 1 4 0v6a8 8 0 0 1-8 8h-2c-2.8 0-4.5-.86-5.99-2.34l-3.6-3.6a2 2 0 0 1 2.83-2.82L7 15\"></path></svg>`,\n RESET: `<svg viewBox=\"0 0 24 24\" width=\"14\" height=\"14\" stroke=\"currentColor\" stroke-width=\"2\" fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"23 4 23 10 17 10\"></polyline><polyline points=\"1 20 1 14 7 14\"></polyline><path d=\"M3.51 9a9 9 0 0 1 14.85-3.36L23 10M1 14l4.64 4.36A9 9 0 0 0 20.49 15\"></path></svg>`,\n LINE: `<svg viewBox=\"0 0 24 24\" width=\"14\" height=\"14\" stroke=\"currentColor\" stroke-width=\"2\" fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M3 3v18h18\"></path><path d=\"M18.7 8l-5.1 5.2-2.8-2.7L7 14.3\"></path></svg>`,\n SCATTER: `<svg viewBox=\"0 0 24 24\" width=\"14\" height=\"14\" fill=\"currentColor\"><circle cx=\"7\" cy=\"14\" r=\"2\"></circle><circle cx=\"11\" cy=\"10\" r=\"2\"></circle><circle cx=\"15\" cy=\"13\" r=\"2\"></circle><circle cx=\"19\" cy=\"8\" r=\"2\"></circle><path d=\"M3 3v18h18\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></path></svg>`,\n BOTH: `<svg viewBox=\"0 0 24 24\" width=\"14\" height=\"14\" stroke=\"currentColor\" stroke-width=\"2\" fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M3 3v18h18\"></path><path d=\"M18.7 8l-5.1 5.2-2.8-2.7L7 14.3\"></path><circle cx=\"7\" cy=\"14.3\" r=\"1\" fill=\"currentColor\"></circle><circle cx=\"10.8\" cy=\"10.5\" r=\"1\" fill=\"currentColor\"></circle><circle cx=\"13.6\" cy=\"13.2\" r=\"1\" fill=\"currentColor\"></circle><circle cx=\"18.7\" cy=\"8\" r=\"1\" fill=\"currentColor\"></circle></svg>`,\n SMOOTH: `<svg viewBox=\"0 0 24 24\" width=\"14\" height=\"14\" stroke=\"currentColor\" stroke-width=\"2\" fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M2 12c.5 0 .9-.3 1.2-.7l1.6-2.6c.3-.4.7-.7 1.2-.7h2c.5 0 .9.3 1.2.7l1.6 2.6c.3.4.7.7 1.2.7h2c.5 0 .9-.3 1.2-.7l1.6-2.6c.3-.4.7-.7 1.2-.7h2\"></path></svg>`,\n AUTOSCALE: `<svg viewBox=\"0 0 24 24\" width=\"14\" height=\"14\" stroke=\"currentColor\" stroke-width=\"2\" fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"15 3 21 3 21 9\"></polyline><polyline points=\"9 21 3 21 3 15\"></polyline><line x1=\"21\" y1=\"3\" x2=\"14\" y2=\"10\"></line><line x1=\"3\" y1=\"21\" x2=\"10\" y2=\"14\"></line></svg>`,\n EXPORT: `<svg viewBox=\"0 0 24 24\" width=\"14\" height=\"14\" stroke=\"currentColor\" stroke-width=\"2\" fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\"></path><polyline points=\"7 10 12 15 17 10\"></polyline><line x1=\"12\" y1=\"15\" x2=\"12\" y2=\"3\"></line></svg>`,\n LEGEND: `<svg viewBox=\"0 0 24 24\" width=\"14\" height=\"14\" stroke=\"currentColor\" stroke-width=\"2\" fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M4 6h16M4 12h16M4 18h7\"></path></svg>`\n};\n\nexport class ChartControls {\n private container: HTMLDivElement;\n private toolbar: HTMLDivElement;\n private callbacks: ChartControlsCallbacks;\n private theme: ChartTheme;\n\n private isSmoothing = false;\n private isPanMode = true;\n private isLegendVisible = true;\n private currentType: \"line\" | \"scatter\" | \"line+scatter\" = \"line\";\n\n constructor(\n parent: HTMLElement,\n theme: ChartTheme,\n callbacks: ChartControlsCallbacks\n ) {\n this.callbacks = callbacks;\n this.theme = theme;\n\n this.container = document.createElement(\"div\");\n this.container.style.cssText = `\n position: absolute;\n top: 8px;\n right: 8px;\n z-index: 100;\n pointer-events: auto;\n display: flex;\n flex-direction: column;\n align-items: flex-end;\n gap: 8px;\n `;\n\n this.toolbar = document.createElement(\"div\");\n this.toolbar.className = \"scichart-modebar\";\n this.updateToolbarStyle();\n\n this.createButtons();\n this.container.appendChild(this.toolbar);\n parent.appendChild(this.container);\n }\n\n private isDarkTheme(): boolean {\n const name = this.theme.name.toLowerCase();\n return (\n name.includes(\"dark\") ||\n name.includes(\"midnight\") ||\n name.includes(\"electro\")\n );\n }\n\n private updateToolbarStyle(): void {\n const isDark = this.isDarkTheme();\n\n const bg = isDark ? \"rgba(15, 23, 42, 0.85)\" : \"rgba(255, 255, 255, 0.95)\";\n const borderColor = isDark\n ? \"rgba(255, 255, 255, 0.2)\"\n : \"rgba(0, 0, 0, 0.15)\";\n const shadow = isDark\n ? \"0 4px 12px rgba(0, 0, 0, 0.6), 0 0 0 1px rgba(255, 255, 255, 0.1)\"\n : \"0 4px 12px rgba(0, 0, 0, 0.15)\";\n\n this.toolbar.style.cssText = `\n display: flex;\n align-items: center;\n gap: 4px;\n padding: 4px;\n background: ${bg};\n backdrop-filter: blur(12px) saturate(180%);\n -webkit-backdrop-filter: blur(12px) saturate(180%);\n border: 1px solid ${borderColor};\n border-radius: 8px;\n box-shadow: ${shadow};\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n `;\n }\n\n private createButtons(): void {\n // Pan Mode\n this.createButton(\n ICONS.PAN,\n \"Pan Mode\",\n () => {\n this.isPanMode = !this.isPanMode;\n this.updateButtonStates();\n this.callbacks.onTogglePan(this.isPanMode);\n },\n \"pan\"\n );\n\n // Reset Zoom\n this.createButton(\n ICONS.RESET,\n \"Reset Zoom\",\n () => this.callbacks.onResetZoom(),\n \"reset\"\n );\n\n // Auto Scale\n this.createButton(\n ICONS.AUTOSCALE,\n \"Auto Scale\",\n () => this.callbacks.onAutoScale(),\n \"autoscale\"\n );\n\n // Separator\n const sep = document.createElement(\"div\");\n const isDark = this.isDarkTheme();\n sep.style.cssText = `width: 1px; height: 20px; background: ${\n isDark ? \"rgba(255,255,255,0.25)\" : \"rgba(0,0,0,0.2)\"\n }; margin: 0 6px;`;\n this.toolbar.appendChild(sep);\n\n // Type Switcher\n this.createButton(\n ICONS.LINE,\n \"Toggle Line/Scatter/Both\",\n () => {\n const types: (\"line\" | \"scatter\" | \"line+scatter\")[] = [\n \"line\",\n \"scatter\",\n \"line+scatter\",\n ];\n const nextIdx = (types.indexOf(this.currentType) + 1) % types.length;\n this.currentType = types[nextIdx];\n this.callbacks.onSetType(this.currentType);\n this.updateButtonStates();\n },\n \"type\"\n );\n\n // Smoothing\n this.createButton(\n ICONS.SMOOTH,\n \"Automated Smoothing\",\n () => {\n this.isSmoothing = !this.isSmoothing;\n this.updateButtonStates();\n this.callbacks.onToggleSmoothing();\n },\n \"smooth\"\n );\n\n // Separator\n const sep2 = document.createElement(\"div\");\n sep2.style.cssText = `width: 1px; height: 20px; background: ${\n isDark ? \"rgba(255,255,255,0.25)\" : \"rgba(0,0,0,0.2)\"\n }; margin: 0 6px;`;\n this.toolbar.appendChild(sep2);\n\n // Export Image\n this.createButton(\n ICONS.EXPORT,\n \"Export as PNG\",\n () => this.callbacks.onExport(),\n \"export\"\n );\n\n // Separator\n const sep3 = document.createElement(\"div\");\n sep3.style.cssText = `width: 1px; height: 20px; background: ${\n this.isDarkTheme() ? \"rgba(255,255,255,0.25)\" : \"rgba(0,0,0,0.2)\"\n }; margin: 0 6px;`;\n this.toolbar.appendChild(sep3);\n\n // Toggle Legend\n this.createButton(\n ICONS.LEGEND,\n \"Toggle Legend\",\n () => {\n this.isLegendVisible = !this.isLegendVisible;\n this.updateButtonStates();\n this.callbacks.onToggleLegend(this.isLegendVisible);\n },\n \"legend\"\n );\n\n this.updateButtonStates();\n }\n\n private enforceSVGVisibility(btn: HTMLButtonElement): void {\n // Force SVG visibility and make sure currentColor is applied even under aggressive page CSS\n const icon = btn.querySelector<HTMLElement>(\".scichart-control-icon\");\n if (icon) {\n icon.style.display = \"flex\";\n icon.style.alignItems = \"center\";\n icon.style.justifyContent = \"center\";\n icon.style.width = \"100%\";\n icon.style.height = \"100%\";\n icon.style.pointerEvents = \"none\";\n }\n\n const svgEl = btn.querySelector<SVGElement>(\"svg\");\n if (svgEl) {\n svgEl.setAttribute(\"width\", \"14\");\n svgEl.setAttribute(\"height\", \"14\");\n (svgEl as any).style.display = \"block\";\n (svgEl as any).style.overflow = \"visible\";\n (svgEl as any).style.color = \"inherit\";\n (svgEl as any).style.stroke = \"currentColor\";\n if (!svgEl.getAttribute(\"fill\")) {\n (svgEl as any).style.fill = \"none\";\n }\n }\n }\n\n private createButton(\n svg: string,\n title: string,\n onClick: () => void,\n id: string\n ): HTMLButtonElement {\n const btn = document.createElement(\"button\");\n btn.innerHTML = `<span class=\"scichart-control-icon\">${svg}</span>`;\n btn.title = title;\n btn.dataset.id = id;\n\n const isDark = this.isDarkTheme();\n const color = isDark ? \"#ffffff\" : \"#1e293b\";\n\n btn.style.cssText = `\n width: 24px;\n height: 24px;\n display: flex;\n align-items: center;\n justify-content: center;\n border: none;\n background: transparent;\n color: ${color};\n cursor: pointer;\n border-radius: 6px;\n transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n opacity: 0.9;\n `;\n\n btn.onmouseenter = () => {\n btn.style.opacity = \"1\";\n btn.style.background = isDark\n ? \"rgba(255, 255, 255, 0.15)\"\n : \"rgba(0, 0, 0, 0.1)\";\n btn.style.transform = \"translateY(-1px)\";\n btn.style.boxShadow = isDark\n ? \"0 2px 4px rgba(0,0,0,0.4)\"\n : \"0 2px 4px rgba(0,0,0,0.1)\";\n };\n btn.onmouseleave = () => {\n btn.style.transform = \"none\";\n btn.style.boxShadow = \"none\";\n this.updateButtonStates();\n };\n btn.onclick = onClick;\n\n // Force SVG visibility\n this.enforceSVGVisibility(btn);\n\n this.toolbar.appendChild(btn);\n return btn;\n }\n\n private updateButtonStates(): void {\n const buttons = this.toolbar.querySelectorAll(\"button\");\n const isDark = this.isDarkTheme();\n\n const activeColor = \"#38bdf8\"; // Brighter blue\n const smoothActiveColor = \"#fb7185\"; // Brighter pink\n const legendActiveColor = \"#4ade80\"; // Brighter green\n const normalColor = isDark ? \"#f1f5f9\" : \"#334155\"; // High contrast\n\n buttons.forEach((btn: HTMLButtonElement) => {\n const id = btn.dataset.id;\n const isHover = btn.matches(\":hover\");\n\n if (id === \"pan\") {\n btn.style.color = this.isPanMode ? activeColor : normalColor;\n btn.style.opacity = isHover || this.isPanMode ? \"1\" : \"0.8\";\n if (this.isPanMode) {\n btn.style.background = isDark\n ? \"rgba(56, 189, 248, 0.15)\"\n : \"rgba(56, 189, 248, 0.1)\";\n }\n } else if (id === \"smooth\") {\n btn.style.color = this.isSmoothing ? smoothActiveColor : normalColor;\n btn.style.opacity = isHover || this.isSmoothing ? \"1\" : \"0.8\";\n if (this.isSmoothing) {\n btn.style.background = isDark\n ? \"rgba(251, 113, 133, 0.15)\"\n : \"rgba(251, 113, 133, 0.1)\";\n }\n } else if (id === \"legend\") {\n btn.style.color = this.isLegendVisible ? legendActiveColor : normalColor;\n btn.style.opacity = isHover || this.isLegendVisible ? \"1\" : \"0.8\";\n if (this.isLegendVisible) {\n btn.style.background = isDark\n ? \"rgba(74, 222, 128, 0.15)\"\n : \"rgba(74, 222, 128, 0.1)\";\n }\n } else if (id === \"type\") {\n btn.innerHTML =\n this.currentType === \"line\"\n ? ICONS.LINE\n : this.currentType === \"scatter\"\n ? ICONS.SCATTER\n : ICONS.BOTH;\n // Reapply SVG visibility styles after changing innerHTML\n this.enforceSVGVisibility(btn);\n btn.style.color = normalColor;\n btn.style.opacity = isHover ? \"1\" : \"0.8\";\n } else if (id === \"reset\" || id === \"autoscale\" || id === \"export\") {\n btn.style.color = normalColor;\n btn.style.opacity = isHover ? \"1\" : \"0.8\";\n }\n\n if (\n !isHover &&\n !(\n (id === \"pan\" && this.isPanMode) ||\n (id === \"smooth\" && this.isSmoothing) ||\n (id === \"legend\" && this.isLegendVisible)\n )\n ) {\n btn.style.background = \"transparent\";\n }\n });\n }\n\n public updateTheme(theme: ChartTheme): void {\n this.theme = theme;\n this.updateToolbarStyle();\n this.updateButtonStates();\n }\n\n public destroy(): void {\n this.container.remove();\n }\n}\n","/**\n * ChartLegend - In-chart draggable legend component\n */\n\nimport { ChartTheme } from \"../theme\";\nimport { Series } from \"./Series\";\n\nexport interface ChartLegendCallbacks {\n onMove: (x: number, y: number) => void;\n}\n\nexport class ChartLegend {\n private container: HTMLDivElement;\n private header: HTMLDivElement;\n private content: HTMLDivElement;\n private theme: ChartTheme;\n private series: Series[] = [];\n private callbacks: ChartLegendCallbacks;\n\n private isDragging = false;\n private startX = 0;\n private startY = 0;\n private initialX = 0;\n private initialY = 0;\n\n constructor(\n parent: HTMLElement,\n theme: ChartTheme,\n options: { x?: number; y?: number },\n callbacks: ChartLegendCallbacks\n ) {\n this.theme = theme;\n this.callbacks = callbacks;\n\n this.container = document.createElement(\"div\");\n this.container.className = \"scichart-legend\";\n\n // Default position (top-right, below controls toolbar)\n // Controls toolbar height is ~32px (24px buttons + 4px padding*2 + borders) + 8px top margin = ~40px\n // Add extra margin to ensure no overlap\n const x = options.x ?? parent.clientWidth - 150;\n const y = options.y ?? 55;\n\n this.container.style.cssText = `\n position: absolute;\n left: ${x}px;\n top: ${y}px;\n z-index: 90;\n pointer-events: auto;\n min-width: 120px;\n border-radius: ${theme.legend.borderRadius}px;\n overflow: hidden;\n box-shadow: 0 4px 12px rgba(0,0,0,0.15);\n user-select: none;\n transition: box-shadow 0.2s ease;\n `;\n\n this.updateStyle();\n\n // Draggable header\n this.header = document.createElement(\"div\");\n this.header.style.cssText = `\n height: 8px;\n cursor: move;\n background: rgba(255,255,255,0.05);\n border-bottom: 1px solid rgba(255,255,255,0.05);\n `;\n\n this.content = document.createElement(\"div\");\n this.content.style.padding = `${theme.legend.padding}px`;\n\n this.container.appendChild(this.header);\n this.container.appendChild(this.content);\n parent.appendChild(this.container);\n\n this.initDragging();\n }\n\n private updateStyle(): void {\n const isDark =\n this.theme.name.toLowerCase().includes(\"dark\") ||\n this.theme.name.toLowerCase().includes(\"midnight\") ||\n this.theme.name.toLowerCase().includes(\"electro\");\n\n const bg = isDark ? \"rgba(15, 23, 42, 0.85)\" : \"rgba(255, 255, 255, 0.95)\";\n const borderColor = isDark\n ? \"rgba(255, 255, 255, 0.15)\"\n : \"rgba(0, 0, 0, 0.1)\";\n const shadow = isDark\n ? \"0 4px 12px rgba(0, 0, 0, 0.6)\"\n : \"0 4px 12px rgba(0, 0, 0, 0.15)\";\n\n this.container.style.background = bg;\n this.container.style.backdropFilter = \"blur(12px) saturate(180%)\";\n (this.container.style as any).webkitBackdropFilter =\n \"blur(12px) saturate(180%)\";\n this.container.style.border = `1px solid ${borderColor}`;\n this.container.style.boxShadow = shadow;\n }\n\n private initDragging(): void {\n let rafId: number | null = null;\n\n const onMouseDown = (e: MouseEvent) => {\n // Only handle left click\n if (e.button !== 0) return;\n\n e.stopPropagation();\n e.preventDefault();\n\n this.isDragging = true;\n this.startX = e.clientX;\n this.startY = e.clientY;\n this.initialX = this.container.offsetLeft;\n this.initialY = this.container.offsetTop;\n\n this.container.style.transition = \"none\";\n this.container.style.willChange = \"transform\";\n this.container.style.boxShadow = \"0 8px 24px rgba(0,0,0,0.3)\";\n this.container.style.cursor = \"grabbing\";\n\n document.addEventListener(\"mousemove\", onMouseMove);\n document.addEventListener(\"mouseup\", onMouseUp);\n };\n\n const updatePosition = (clientX: number, clientY: number) => {\n const dx = clientX - this.startX;\n const dy = clientY - this.startY;\n\n let newX = this.initialX + dx;\n let newY = this.initialY + dy;\n\n const parent = this.container.parentElement;\n if (parent) {\n newX = Math.max(\n 0,\n Math.min(newX, parent.clientWidth - this.container.clientWidth)\n );\n newY = Math.max(\n 0,\n Math.min(newY, parent.clientHeight - this.container.clientHeight)\n );\n }\n\n // Use transform for better performance (no layout recalc)\n const tx = newX - this.initialX;\n const ty = newY - this.initialY;\n this.container.style.transform = `translate3d(${tx}px, ${ty}px, 0)`;\n };\n\n const onMouseMove = (e: MouseEvent) => {\n if (!this.isDragging) return;\n if (rafId) cancelAnimationFrame(rafId);\n rafId = requestAnimationFrame(() => updatePosition(e.clientX, e.clientY));\n };\n\n const onMouseUp = () => {\n if (this.isDragging) {\n this.isDragging = false;\n if (rafId) cancelAnimationFrame(rafId);\n\n // Finalize position and commit to left/top (to keep it there)\n const rect = this.container.getBoundingClientRect();\n const parentRect =\n this.container.parentElement?.getBoundingClientRect();\n if (parentRect) {\n const finalX = rect.left - parentRect.left;\n const finalY = rect.top - parentRect.top;\n\n this.container.style.transform = \"none\";\n this.container.style.left = `${finalX}px`;\n this.container.style.top = `${finalY}px`;\n\n this.callbacks.onMove(finalX, finalY);\n }\n\n this.container.style.willChange = \"auto\";\n this.container.style.transition = \"box-shadow 0.2s ease\";\n this.container.style.boxShadow = \"0 4px 12px rgba(0,0,0,0.15)\";\n this.container.style.cursor = \"auto\";\n }\n document.removeEventListener(\"mousemove\", onMouseMove);\n document.removeEventListener(\"mouseup\", onMouseUp);\n };\n\n this.container.addEventListener(\"mousedown\", onMouseDown);\n\n // Block events from reaching the chart while over the legend\n this.container.addEventListener(\"wheel\", (e) => e.stopPropagation());\n this.container.addEventListener(\"click\", (e) => e.stopPropagation());\n this.container.addEventListener(\"dblclick\", (e) => e.stopPropagation());\n // Note: mousemove/mouseup on container MUST bubble to document during drag\n }\n\n public update(series: Series[]): void {\n this.series = series;\n this.render();\n }\n\n private render(): void {\n this.content.innerHTML = \"\";\n const legend = this.theme.legend;\n const dpr = window.devicePixelRatio || 1;\n\n this.series.forEach((s) => {\n const item = document.createElement(\"div\");\n item.style.cssText = `\n display: flex;\n align-items: center;\n gap: 8px;\n margin-bottom: ${legend.itemGap}px;\n font-family: ${legend.fontFamily};\n font-size: ${legend.fontSize}px;\n color: ${legend.textColor};\n `;\n\n // Use a canvas for the swatch to support symbols\n const swatch = document.createElement(\"canvas\");\n const size = legend.swatchSize;\n swatch.width = size * dpr;\n swatch.height = size * dpr;\n swatch.style.width = `${size}px`;\n swatch.style.height = `${size}px`;\n\n const ctx = swatch.getContext('2d');\n if (ctx) {\n ctx.scale(dpr, dpr);\n const style = s.getStyle();\n const color = style.color || \"#ff0055\";\n const type = s.getType();\n const symbol = style.symbol || 'circle';\n \n ctx.fillStyle = color;\n ctx.strokeStyle = color;\n ctx.lineWidth = 2;\n \n const centerX = size / 2;\n const centerY = size / 2;\n\n const typeStr = String(type).toLowerCase();\n const isScatter = typeStr === 'scatter' || typeStr === '1' || (typeStr === 'line' && !!style.symbol);\n const isLineScatter = typeStr.includes('scatter') || typeStr === '2';\n\n if (isScatter) {\n this.drawSymbol(ctx, symbol, centerX, centerY, size * 0.8);\n } else if (isLineScatter) {\n ctx.beginPath();\n ctx.moveTo(0, centerY);\n ctx.lineTo(size, centerY);\n ctx.stroke();\n this.drawSymbol(ctx, symbol, centerX, centerY, size * 0.6);\n } else {\n ctx.beginPath();\n ctx.moveTo(0, centerY);\n ctx.lineTo(size, centerY);\n ctx.stroke();\n }\n }\n\n const label = document.createElement(\"span\");\n label.textContent = s.getId();\n\n item.appendChild(swatch);\n item.appendChild(label);\n this.content.appendChild(item);\n });\n }\n\n /**\n * Internal symbol drawing logic (shared with canvas export)\n */\n private drawSymbol(\n ctx: CanvasRenderingContext2D,\n symbol: string,\n x: number,\n y: number,\n size: number\n ): void {\n const r = size / 2;\n ctx.beginPath();\n\n switch (symbol) {\n case 'circle':\n ctx.arc(x, y, r, 0, Math.PI * 2);\n ctx.fill();\n break;\n case 'square':\n ctx.rect(x - r, y - r, size, size);\n ctx.fill();\n break;\n case 'diamond':\n ctx.moveTo(x, y - r);\n ctx.lineTo(x + r, y);\n ctx.lineTo(x, y + r);\n ctx.lineTo(x - r, y);\n ctx.closePath();\n ctx.fill();\n break;\n case 'triangle':\n ctx.moveTo(x, y - r);\n ctx.lineTo(x + r, y + r);\n ctx.lineTo(x - r, y + r);\n ctx.closePath();\n ctx.fill();\n break;\n case 'triangleDown':\n ctx.moveTo(x, y + r);\n ctx.lineTo(x + r, y - r);\n ctx.lineTo(x - r, y - r);\n ctx.closePath();\n ctx.fill();\n break;\n case 'cross':\n ctx.moveTo(x - r, y);\n ctx.lineTo(x + r, y);\n ctx.moveTo(x, y - r);\n ctx.lineTo(x, y + r);\n ctx.stroke();\n break;\n case 'x':\n const d = r * 0.707;\n ctx.moveTo(x - d, y - d);\n ctx.lineTo(x + d, y + d);\n ctx.moveTo(x + d, y - d);\n ctx.lineTo(x - d, y + d);\n ctx.stroke();\n break;\n case 'star':\n for (let i = 0; i < 5; i++) {\n ctx.lineTo(\n x + r * Math.cos(((18 + i * 72) / 180) * Math.PI),\n y - r * Math.sin(((18 + i * 72) / 180) * Math.PI)\n );\n ctx.lineTo(\n x + (r / 2) * Math.cos(((54 + i * 72) / 180) * Math.PI),\n y - (r / 2) * Math.sin(((54 + i * 72) / 180) * Math.PI)\n );\n }\n ctx.closePath();\n ctx.fill();\n break;\n }\n }\n\n public draw(ctx: CanvasRenderingContext2D, dpr: number): void {\n if (this.series.length === 0) return;\n\n const legend = this.theme.legend;\n const padding = legend.padding * dpr;\n const itemGap = legend.itemGap * dpr;\n const swatchSize = legend.swatchSize * dpr;\n const headerHeight = 8 * dpr;\n\n const x = this.container.offsetLeft * dpr;\n const y = this.container.offsetTop * dpr;\n const width = this.container.clientWidth * dpr;\n const height = this.container.clientHeight * dpr;\n\n ctx.save();\n\n // 1. Draw background\n const isDark =\n this.theme.name.toLowerCase().includes(\"dark\") ||\n this.theme.name.toLowerCase().includes(\"midnight\");\n ctx.fillStyle = isDark\n ? legend.backgroundColor\n : \"rgba(255, 255, 255, 0.85)\";\n ctx.strokeStyle = legend.borderColor;\n ctx.lineWidth = 1 * dpr;\n\n const r = legend.borderRadius * dpr;\n ctx.beginPath();\n ctx.moveTo(x + r, y);\n ctx.lineTo(x + width - r, y);\n ctx.arcTo(x + width, y, x + width, y + r, r);\n ctx.lineTo(x + width, y + height - r);\n ctx.arcTo(x + width, y + height, x + width - r, y + height, r);\n ctx.lineTo(x + r, y + height);\n ctx.arcTo(x, y + height, x, y + height - r, r);\n ctx.lineTo(x, y + r);\n ctx.arcTo(x, y, x + r, y, r);\n ctx.closePath();\n ctx.fill();\n ctx.stroke();\n\n // 2. Draw Items\n ctx.textAlign = \"left\";\n ctx.textBaseline = \"middle\";\n ctx.font = `${legend.fontSize * dpr}px ${legend.fontFamily}`;\n\n this.series.forEach((s, i) => {\n const itemY =\n y +\n headerHeight +\n padding +\n i * (swatchSize + itemGap) +\n swatchSize / 2;\n \n const centerX = x + padding + swatchSize / 2;\n const centerY = itemY;\n const style = s.getStyle();\n const type = s.getType();\n const symbol = style.symbol || 'circle';\n\n ctx.fillStyle = style.color || \"#ff0055\";\n ctx.strokeStyle = style.color || \"#ff0055\";\n ctx.lineWidth = 2 * dpr;\n\n const typeStr = String(type).toLowerCase();\n const isScatter = typeStr === 'scatter' || typeStr === '1' || (typeStr === 'line' && !!style.symbol);\n const isLineScatter = typeStr.includes('scatter') || typeStr === '2';\n\n if (isScatter) {\n this.drawSymbol(ctx, symbol, centerX, centerY, swatchSize * 0.9);\n } else if (isLineScatter) {\n ctx.beginPath();\n ctx.moveTo(x + padding, centerY);\n ctx.lineTo(x + padding + swatchSize, centerY);\n ctx.stroke();\n this.drawSymbol(ctx, symbol, centerX, centerY, swatchSize * 0.6);\n } else {\n ctx.beginPath();\n ctx.moveTo(x + padding, centerY);\n ctx.lineTo(x + padding + swatchSize, centerY);\n ctx.stroke();\n }\n\n ctx.fillStyle = legend.textColor;\n ctx.fillText(s.getId(), x + padding + swatchSize + 8 * dpr, itemY);\n });\n\n ctx.restore();\n }\n\n public updateTheme(theme: ChartTheme): void {\n this.theme = theme;\n this.updateStyle();\n this.render();\n }\n\n public setVisible(visible: boolean): void {\n this.container.style.display = visible ? \"block\" : \"none\";\n }\n\n public destroy(): void {\n this.container.remove();\n }\n}\n","/**\n * ChartStatistics - In-chart statistics panel\n * \n * Displays real-time statistics (Min, Max, Mean, StdDev, Area) \n * for the visible data range of active series.\n */\n\nimport { ChartTheme } from \"../theme\";\nimport { Series } from \"./Series\";\nimport { calculateStats, integrate } from \"../analysis\";\nimport { Bounds } from \"../types\";\n\nexport class ChartStatistics {\n private container: HTMLDivElement;\n private content: HTMLDivElement;\n private theme: ChartTheme;\n private series: Map<string, Series>;\n private isExpanded = false;\n\n constructor(\n parent: HTMLElement,\n theme: ChartTheme,\n series: Map<string, Series>\n ) {\n this.theme = theme;\n this.series = series;\n\n this.container = document.createElement(\"div\");\n this.container.className = \"scichart-stats-panel\";\n this.updateContainerStyle();\n\n const title = document.createElement(\"div\");\n title.innerHTML = \"📊 Statistics\";\n title.style.cssText = `\n font-weight: 600;\n font-size: 11px;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n margin-bottom: 8px;\n display: flex;\n justify-content: space-between;\n align-items: center;\n cursor: pointer;\n `;\n title.onclick = () => this.toggle();\n\n this.content = document.createElement(\"div\");\n this.content.style.display = \"none\";\n \n this.container.appendChild(title);\n this.container.appendChild(this.content);\n parent.appendChild(this.container);\n }\n\n private isDarkTheme(): boolean {\n const name = this.theme.name.toLowerCase();\n return name.includes(\"dark\") || name.includes(\"midnight\") || name.includes(\"electro\");\n }\n\n private updateContainerStyle(): void {\n const isDark = this.isDarkTheme();\n const bg = isDark ? \"rgba(15, 23, 42, 0.85)\" : \"rgba(255, 255, 255, 0.95)\";\n const color = isDark ? \"#f1f5f9\" : \"#1e293b\";\n const borderColor = isDark ? \"rgba(255, 255, 255, 0.1)\" : \"rgba(0, 0, 0, 0.1)\";\n const shadow = isDark ? \"0 4px 12px rgba(0, 0, 0, 0.5)\" : \"0 4px 12px rgba(0, 0, 0, 0.1)\";\n\n this.container.style.cssText = `\n position: absolute;\n bottom: 8px;\n right: 8px;\n width: 240px;\n background: ${bg};\n backdrop-filter: blur(8px);\n -webkit-backdrop-filter: blur(8px);\n border: 1px solid ${borderColor};\n border-radius: 8px;\n box-shadow: ${shadow};\n color: ${color};\n font-family: system-ui, -apple-system, sans-serif;\n padding: 8px 12px;\n z-index: 90;\n transition: all 0.3s ease;\n font-size: 12px;\n pointer-events: auto;\n `;\n }\n\n public update(viewBounds: Bounds): void {\n if (!this.isExpanded) return;\n\n this.content.innerHTML = \"\";\n \n this.series.forEach((s) => {\n if (!s.getVisible()) return;\n\n const data = s.getData();\n if (!data) return;\n\n // Filter data in visible range\n const visibleY: number[] = [];\n const visibleX: number[] = [];\n for (let i = 0; i < data.x.length; i++) {\n if (data.x[i] >= viewBounds.xMin && data.x[i] <= viewBounds.xMax) {\n visibleX.push(data.x[i]);\n visibleY.push(data.y[i]);\n }\n }\n\n if (visibleY.length === 0) return;\n\n const stats = calculateStats(visibleY);\n const area = integrate(visibleX as any, visibleY as any);\n const style = s.getStyle();\n\n const item = document.createElement(\"div\");\n item.style.cssText = `\n padding: 8px 0;\n border-top: 1px solid ${this.isDarkTheme() ? \"rgba(255,255,255,0.05)\" : \"rgba(0,0,0,0.05)\"};\n `;\n\n item.innerHTML = `\n <div style=\"display: flex; align-items: center; gap: 6px; margin-bottom: 4px; font-weight: 600;\">\n <div style=\"width: 8px; height: 8px; border-radius: 2px; background: ${style.color}\"></div>\n ${s.getId()}\n </div>\n <div style=\"display: grid; grid-template-columns: 1fr 1fr; gap: 4px; opacity: 0.9; font-size: 11px;\">\n <span>Min: ${stats.min.toExponential(3)}</span>\n <span>Max: ${stats.max.toExponential(3)}</span>\n <span>Mean: ${stats.mean.toExponential(3)}</span>\n <span>Count: ${stats.count}</span>\n <span style=\"grid-column: span 2;\">Area: ${area.toExponential(4)}</span>\n </div>\n `;\n\n this.content.appendChild(item);\n });\n\n if (this.content.innerHTML === \"\") {\n this.content.innerHTML = \"<div style='opacity: 0.5; font-style: italic;'>No series visible in range</div>\";\n }\n }\n\n public toggle(): void {\n this.isExpanded = !this.isExpanded;\n this.content.style.display = this.isExpanded ? \"block\" : \"none\";\n if (this.isExpanded) {\n // Redraw immediately will be handled by the chart's next render\n }\n }\n\n public updateTheme(theme: ChartTheme): void {\n this.theme = theme;\n this.updateContainerStyle();\n }\n\n public destroy(): void {\n this.container.remove();\n }\n}\n","/**\n * AnnotationManager - Manages chart annotations\n * \n * Handles creation, update, removal, and rendering of all annotation types.\n */\n\nimport type { Bounds } from '../../types';\nimport type {\n Annotation,\n HorizontalLineAnnotation,\n VerticalLineAnnotation,\n RectangleAnnotation,\n BandAnnotation,\n TextAnnotation,\n ArrowAnnotation,\n} from './types';\n\n// ============================================\n// Default Styles\n// ============================================\n\nconst DEFAULT_STYLES = {\n line: {\n color: 'rgba(255, 255, 255, 0.7)',\n lineWidth: 1,\n lineDash: [] as number[],\n },\n rectangle: {\n fillColor: 'rgba(100, 100, 255, 0.2)',\n strokeColor: 'rgba(100, 100, 255, 0.5)',\n strokeWidth: 1,\n },\n text: {\n fontSize: 12,\n fontFamily: 'Inter, system-ui, sans-serif',\n color: '#ffffff',\n backgroundColor: 'rgba(0, 0, 0, 0.7)',\n padding: 4,\n },\n arrow: {\n color: 'rgba(255, 255, 255, 0.7)',\n lineWidth: 2,\n headSize: 10,\n },\n};\n\n// ============================================\n// Plot Area Type\n// ============================================\n\nexport interface PlotArea {\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\n// ============================================\n// AnnotationManager Class\n// ============================================\n\nexport class AnnotationManager {\n private annotations: Map<string, Annotation> = new Map();\n private idCounter = 0;\n \n // ----------------------------------------\n // CRUD Operations\n // ----------------------------------------\n \n /**\n * Add a new annotation\n * @returns The annotation ID\n */\n add(annotation: Annotation): string {\n const id = annotation.id ?? `annotation-${++this.idCounter}`;\n const resolved: Annotation = {\n ...annotation,\n id,\n visible: annotation.visible ?? true,\n interactive: annotation.interactive ?? false,\n zIndex: annotation.zIndex ?? 0,\n };\n \n this.annotations.set(id, resolved);\n return id;\n }\n \n /**\n * Remove an annotation by ID\n */\n remove(id: string): boolean {\n return this.annotations.delete(id);\n }\n \n /**\n * Update an annotation\n */\n update(id: string, updates: Partial<Annotation>): void {\n const existing = this.annotations.get(id);\n if (existing) {\n this.annotations.set(id, { ...existing, ...updates } as Annotation);\n }\n }\n \n /**\n * Get an annotation by ID\n */\n get(id: string): Annotation | undefined {\n return this.annotations.get(id);\n }\n \n /**\n * Get all annotations\n */\n getAll(): Annotation[] {\n return Array.from(this.annotations.values());\n }\n \n /**\n * Clear all annotations\n */\n clear(): void {\n this.annotations.clear();\n }\n \n /**\n * Get count of annotations\n */\n get count(): number {\n return this.annotations.size;\n }\n \n // ----------------------------------------\n // Rendering\n // ----------------------------------------\n \n /**\n * Render all annotations\n */\n render(\n ctx: CanvasRenderingContext2D,\n plotArea: PlotArea,\n bounds: Bounds\n ): void {\n // Sort by zIndex\n const sorted = this.getAll()\n .filter(a => a.visible !== false)\n .sort((a, b) => (a.zIndex ?? 0) - (b.zIndex ?? 0));\n \n ctx.save();\n \n // Clip to plot area\n ctx.beginPath();\n ctx.rect(plotArea.x, plotArea.y, plotArea.width, plotArea.height);\n ctx.clip();\n \n for (const annotation of sorted) {\n this.renderAnnotation(ctx, annotation, plotArea, bounds);\n }\n \n ctx.restore();\n }\n \n private renderAnnotation(\n ctx: CanvasRenderingContext2D,\n annotation: Annotation,\n plotArea: PlotArea,\n bounds: Bounds\n ): void {\n switch (annotation.type) {\n case 'horizontal-line':\n this.renderHorizontalLine(ctx, annotation, plotArea, bounds);\n break;\n case 'vertical-line':\n this.renderVerticalLine(ctx, annotation, plotArea, bounds);\n break;\n case 'rectangle':\n this.renderRectangle(ctx, annotation, plotArea, bounds);\n break;\n case 'band':\n this.renderBand(ctx, annotation, plotArea, bounds);\n break;\n case 'text':\n this.renderText(ctx, annotation, plotArea, bounds);\n break;\n case 'arrow':\n this.renderArrow(ctx, annotation, plotArea, bounds);\n break;\n }\n }\n \n // ----------------------------------------\n // Coordinate Conversion\n // ----------------------------------------\n \n private dataToPixelX(value: number, bounds: Bounds, plotArea: PlotArea): number {\n const normalized = (value - bounds.xMin) / (bounds.xMax - bounds.xMin);\n return plotArea.x + normalized * plotArea.width;\n }\n \n private dataToPixelY(value: number, bounds: Bounds, plotArea: PlotArea): number {\n const normalized = (value - bounds.yMin) / (bounds.yMax - bounds.yMin);\n return plotArea.y + plotArea.height * (1 - normalized);\n }\n \n // ----------------------------------------\n // Render: Horizontal Line\n // ----------------------------------------\n \n private renderHorizontalLine(\n ctx: CanvasRenderingContext2D,\n annotation: HorizontalLineAnnotation,\n plotArea: PlotArea,\n bounds: Bounds\n ): void {\n const y = this.dataToPixelY(annotation.y, bounds, plotArea);\n \n // Skip if outside visible area\n if (y < plotArea.y || y > plotArea.y + plotArea.height) return;\n \n const xStart = annotation.xMin !== undefined \n ? Math.max(this.dataToPixelX(annotation.xMin, bounds, plotArea), plotArea.x)\n : plotArea.x;\n const xEnd = annotation.xMax !== undefined\n ? Math.min(this.dataToPixelX(annotation.xMax, bounds, plotArea), plotArea.x + plotArea.width)\n : plotArea.x + plotArea.width;\n \n ctx.save();\n ctx.strokeStyle = annotation.color ?? DEFAULT_STYLES.line.color;\n ctx.lineWidth = annotation.lineWidth ?? DEFAULT_STYLES.line.lineWidth;\n ctx.setLineDash(annotation.lineDash ?? DEFAULT_STYLES.line.lineDash);\n \n ctx.beginPath();\n ctx.moveTo(xStart, y);\n ctx.lineTo(xEnd, y);\n ctx.stroke();\n \n // Render label if present\n if (annotation.label) {\n this.renderLineLabel(\n ctx, \n annotation.label, \n xStart, xEnd, y, \n annotation.labelPosition ?? 'right',\n 'horizontal',\n annotation.labelBackground\n );\n }\n \n ctx.restore();\n }\n \n // ----------------------------------------\n // Render: Vertical Line\n // ----------------------------------------\n \n private renderVerticalLine(\n ctx: CanvasRenderingContext2D,\n annotation: VerticalLineAnnotation,\n plotArea: PlotArea,\n bounds: Bounds\n ): void {\n const x = this.dataToPixelX(annotation.x, bounds, plotArea);\n \n // Skip if outside visible area\n if (x < plotArea.x || x > plotArea.x + plotArea.width) return;\n \n const yStart = annotation.yMin !== undefined\n ? Math.min(this.dataToPixelY(annotation.yMin, bounds, plotArea), plotArea.y + plotArea.height)\n : plotArea.y;\n const yEnd = annotation.yMax !== undefined\n ? Math.max(this.dataToPixelY(annotation.yMax, bounds, plotArea), plotArea.y)\n : plotArea.y + plotArea.height;\n \n ctx.save();\n ctx.strokeStyle = annotation.color ?? DEFAULT_STYLES.line.color;\n ctx.lineWidth = annotation.lineWidth ?? DEFAULT_STYLES.line.lineWidth;\n ctx.setLineDash(annotation.lineDash ?? DEFAULT_STYLES.line.lineDash);\n \n ctx.beginPath();\n ctx.moveTo(x, yStart);\n ctx.lineTo(x, yEnd);\n ctx.stroke();\n \n // Render label if present\n if (annotation.label) {\n this.renderLineLabel(\n ctx,\n annotation.label,\n yStart, yEnd, x,\n annotation.labelPosition ?? 'top',\n 'vertical',\n annotation.labelBackground\n );\n }\n \n ctx.restore();\n }\n \n // ----------------------------------------\n // Render: Rectangle\n // ----------------------------------------\n \n private renderRectangle(\n ctx: CanvasRenderingContext2D,\n annotation: RectangleAnnotation,\n plotArea: PlotArea,\n bounds: Bounds\n ): void {\n const x1 = this.dataToPixelX(annotation.xMin, bounds, plotArea);\n const x2 = this.dataToPixelX(annotation.xMax, bounds, plotArea);\n const y1 = this.dataToPixelY(annotation.yMax, bounds, plotArea); // Note: Y is inverted\n const y2 = this.dataToPixelY(annotation.yMin, bounds, plotArea);\n \n const x = Math.min(x1, x2);\n const y = Math.min(y1, y2);\n const width = Math.abs(x2 - x1);\n const height = Math.abs(y2 - y1);\n \n ctx.save();\n \n // Fill\n if (annotation.fillColor) {\n ctx.fillStyle = annotation.fillColor;\n ctx.fillRect(x, y, width, height);\n }\n \n // Stroke\n if (annotation.strokeColor) {\n ctx.strokeStyle = annotation.strokeColor;\n ctx.lineWidth = annotation.strokeWidth ?? DEFAULT_STYLES.rectangle.strokeWidth;\n ctx.setLineDash(annotation.strokeDash ?? []);\n ctx.strokeRect(x, y, width, height);\n }\n \n // Label\n if (annotation.label) {\n this.renderCenteredLabel(ctx, annotation.label, x + width / 2, y + height / 2);\n }\n \n ctx.restore();\n }\n \n // ----------------------------------------\n // Render: Band\n // ----------------------------------------\n \n private renderBand(\n ctx: CanvasRenderingContext2D,\n annotation: BandAnnotation,\n plotArea: PlotArea,\n bounds: Bounds\n ): void {\n // Determine band type and calculate bounds\n let x: number, y: number, width: number, height: number;\n \n if (annotation.xMin !== undefined && annotation.xMax !== undefined) {\n // Vertical band (spans full Y)\n const x1 = this.dataToPixelX(annotation.xMin, bounds, plotArea);\n const x2 = this.dataToPixelX(annotation.xMax, bounds, plotArea);\n x = Math.min(x1, x2);\n width = Math.abs(x2 - x1);\n y = plotArea.y;\n height = plotArea.height;\n \n if (annotation.yMin !== undefined) {\n const yPixel = this.dataToPixelY(annotation.yMin, bounds, plotArea);\n height = yPixel - y;\n }\n if (annotation.yMax !== undefined) {\n const yPixel = this.dataToPixelY(annotation.yMax, bounds, plotArea);\n y = yPixel;\n height = plotArea.y + plotArea.height - y;\n }\n } else if (annotation.yMin !== undefined && annotation.yMax !== undefined) {\n // Horizontal band (spans full X)\n const y1 = this.dataToPixelY(annotation.yMax, bounds, plotArea);\n const y2 = this.dataToPixelY(annotation.yMin, bounds, plotArea);\n y = Math.min(y1, y2);\n height = Math.abs(y2 - y1);\n x = plotArea.x;\n width = plotArea.width;\n } else {\n // Invalid band configuration\n return;\n }\n \n ctx.save();\n \n // Fill\n ctx.fillStyle = annotation.fillColor ?? DEFAULT_STYLES.rectangle.fillColor;\n ctx.fillRect(x, y, width, height);\n \n // Stroke\n if (annotation.strokeColor) {\n ctx.strokeStyle = annotation.strokeColor;\n ctx.lineWidth = annotation.strokeWidth ?? 1;\n ctx.strokeRect(x, y, width, height);\n }\n \n // Label\n if (annotation.label) {\n let labelX = x + width / 2;\n let labelY = y + height / 2;\n \n switch (annotation.labelPosition) {\n case 'top':\n labelY = y + 15;\n break;\n case 'bottom':\n labelY = y + height - 5;\n break;\n case 'left':\n labelX = x + 10;\n break;\n case 'right':\n labelX = x + width - 10;\n break;\n }\n \n this.renderCenteredLabel(ctx, annotation.label, labelX, labelY);\n }\n \n ctx.restore();\n }\n \n // ----------------------------------------\n // Render: Text\n // ----------------------------------------\n \n private renderText(\n ctx: CanvasRenderingContext2D,\n annotation: TextAnnotation,\n plotArea: PlotArea,\n bounds: Bounds\n ): void {\n const x = this.dataToPixelX(annotation.x, bounds, plotArea);\n const y = this.dataToPixelY(annotation.y, bounds, plotArea);\n \n ctx.save();\n \n // Apply rotation if specified\n if (annotation.rotation) {\n ctx.translate(x, y);\n ctx.rotate((annotation.rotation * Math.PI) / 180);\n ctx.translate(-x, -y);\n }\n \n const fontSize = annotation.fontSize ?? DEFAULT_STYLES.text.fontSize;\n const fontFamily = annotation.fontFamily ?? DEFAULT_STYLES.text.fontFamily;\n const fontWeight = annotation.fontWeight ?? 'normal';\n \n ctx.font = `${fontWeight} ${fontSize}px ${fontFamily}`;\n ctx.textAlign = 'center';\n ctx.textBaseline = 'middle';\n \n // Measure text for background\n const metrics = ctx.measureText(annotation.text);\n const padding = annotation.padding ?? DEFAULT_STYLES.text.padding;\n const textWidth = metrics.width + padding * 2;\n const textHeight = fontSize + padding * 2;\n \n // Calculate position based on anchor\n let drawX = x;\n let drawY = y;\n \n switch (annotation.anchor) {\n case 'top-left':\n drawX += textWidth / 2;\n drawY += textHeight / 2;\n break;\n case 'top-right':\n drawX -= textWidth / 2;\n drawY += textHeight / 2;\n break;\n case 'bottom-left':\n drawX += textWidth / 2;\n drawY -= textHeight / 2;\n break;\n case 'bottom-right':\n drawX -= textWidth / 2;\n drawY -= textHeight / 2;\n break;\n case 'top-center':\n drawY += textHeight / 2;\n break;\n case 'bottom-center':\n drawY -= textHeight / 2;\n break;\n case 'left-center':\n drawX += textWidth / 2;\n break;\n case 'right-center':\n drawX -= textWidth / 2;\n break;\n }\n \n // Draw background\n if (annotation.backgroundColor) {\n ctx.fillStyle = annotation.backgroundColor;\n ctx.beginPath();\n ctx.roundRect(\n drawX - textWidth / 2,\n drawY - textHeight / 2,\n textWidth,\n textHeight,\n 4\n );\n ctx.fill();\n }\n \n // Draw text\n ctx.fillStyle = annotation.color ?? DEFAULT_STYLES.text.color;\n ctx.fillText(annotation.text, drawX, drawY);\n \n ctx.restore();\n }\n \n // ----------------------------------------\n // Render: Arrow\n // ----------------------------------------\n \n private renderArrow(\n ctx: CanvasRenderingContext2D,\n annotation: ArrowAnnotation,\n plotArea: PlotArea,\n bounds: Bounds\n ): void {\n const x1 = this.dataToPixelX(annotation.x1, bounds, plotArea);\n const y1 = this.dataToPixelY(annotation.y1, bounds, plotArea);\n const x2 = this.dataToPixelX(annotation.x2, bounds, plotArea);\n const y2 = this.dataToPixelY(annotation.y2, bounds, plotArea);\n \n ctx.save();\n ctx.strokeStyle = annotation.color ?? DEFAULT_STYLES.arrow.color;\n ctx.fillStyle = annotation.color ?? DEFAULT_STYLES.arrow.color;\n ctx.lineWidth = annotation.lineWidth ?? DEFAULT_STYLES.arrow.lineWidth;\n \n // Draw line\n ctx.beginPath();\n ctx.moveTo(x1, y1);\n ctx.lineTo(x2, y2);\n ctx.stroke();\n \n // Draw arrow head\n const headSize = annotation.headSize ?? DEFAULT_STYLES.arrow.headSize;\n const angle = Math.atan2(y2 - y1, x2 - x1);\n \n const headStyle = annotation.headStyle ?? 'filled';\n \n if (headStyle !== 'none') {\n ctx.beginPath();\n ctx.moveTo(x2, y2);\n ctx.lineTo(\n x2 - headSize * Math.cos(angle - Math.PI / 6),\n y2 - headSize * Math.sin(angle - Math.PI / 6)\n );\n \n if (headStyle === 'filled') {\n ctx.lineTo(\n x2 - headSize * Math.cos(angle + Math.PI / 6),\n y2 - headSize * Math.sin(angle + Math.PI / 6)\n );\n ctx.closePath();\n ctx.fill();\n } else {\n ctx.moveTo(x2, y2);\n ctx.lineTo(\n x2 - headSize * Math.cos(angle + Math.PI / 6),\n y2 - headSize * Math.sin(angle + Math.PI / 6)\n );\n ctx.stroke();\n }\n }\n \n // Draw tail arrow if specified\n if (annotation.showTail) {\n const tailAngle = angle + Math.PI;\n ctx.beginPath();\n ctx.moveTo(x1, y1);\n ctx.lineTo(\n x1 - headSize * Math.cos(tailAngle - Math.PI / 6),\n y1 - headSize * Math.sin(tailAngle - Math.PI / 6)\n );\n ctx.lineTo(\n x1 - headSize * Math.cos(tailAngle + Math.PI / 6),\n y1 - headSize * Math.sin(tailAngle + Math.PI / 6)\n );\n ctx.closePath();\n ctx.fill();\n }\n \n // Draw label if present\n if (annotation.label) {\n const midX = (x1 + x2) / 2;\n const midY = (y1 + y2) / 2;\n this.renderCenteredLabel(ctx, annotation.label, midX, midY - 10);\n }\n \n ctx.restore();\n }\n \n // ----------------------------------------\n // Helper: Render Labels\n // ----------------------------------------\n \n private renderLineLabel(\n ctx: CanvasRenderingContext2D,\n label: string,\n start: number,\n end: number,\n cross: number,\n position: string,\n orientation: 'horizontal' | 'vertical',\n backgroundColor?: string\n ): void {\n ctx.save();\n \n ctx.font = `${DEFAULT_STYLES.text.fontSize}px ${DEFAULT_STYLES.text.fontFamily}`;\n const metrics = ctx.measureText(label);\n const padding = 4;\n const textWidth = metrics.width + padding * 2;\n const textHeight = DEFAULT_STYLES.text.fontSize + padding * 2;\n \n let x: number, y: number;\n \n if (orientation === 'horizontal') {\n y = cross;\n \n switch (position) {\n case 'left':\n x = start + 5;\n ctx.textAlign = 'left';\n break;\n case 'right':\n x = end - 5;\n ctx.textAlign = 'right';\n break;\n default:\n x = (start + end) / 2;\n ctx.textAlign = 'center';\n }\n \n ctx.textBaseline = 'bottom';\n y -= 4;\n } else {\n x = cross;\n \n switch (position) {\n case 'top':\n y = start + textHeight;\n break;\n case 'bottom':\n y = end - 5;\n break;\n default:\n y = (start + end) / 2;\n }\n \n ctx.textAlign = 'center';\n ctx.textBaseline = 'middle';\n }\n \n // Background\n if (backgroundColor ?? true) {\n ctx.fillStyle = backgroundColor ?? 'rgba(0, 0, 0, 0.7)';\n const bgX = ctx.textAlign === 'left' ? x - padding \n : ctx.textAlign === 'right' ? x - textWidth + padding\n : x - textWidth / 2;\n ctx.fillRect(bgX, y - textHeight + padding, textWidth, textHeight);\n }\n \n // Text\n ctx.fillStyle = DEFAULT_STYLES.text.color;\n ctx.fillText(label, x, y);\n \n ctx.restore();\n }\n \n private renderCenteredLabel(\n ctx: CanvasRenderingContext2D,\n label: string,\n x: number,\n y: number\n ): void {\n ctx.save();\n \n ctx.font = `${DEFAULT_STYLES.text.fontSize}px ${DEFAULT_STYLES.text.fontFamily}`;\n const metrics = ctx.measureText(label);\n const padding = 4;\n const textWidth = metrics.width + padding * 2;\n const textHeight = DEFAULT_STYLES.text.fontSize + padding * 2;\n \n // Background\n ctx.fillStyle = 'rgba(0, 0, 0, 0.7)';\n ctx.beginPath();\n ctx.roundRect(x - textWidth / 2, y - textHeight / 2, textWidth, textHeight, 3);\n ctx.fill();\n \n // Text\n ctx.fillStyle = DEFAULT_STYLES.text.color;\n ctx.textAlign = 'center';\n ctx.textBaseline = 'middle';\n ctx.fillText(label, x, y);\n \n ctx.restore();\n }\n}\n","/**\n * Chart Export Utilities\n * \n * Handles exporting chart data to various formats (CSV, JSON, Image).\n */\n\nimport type { Series } from \"../Series\";\nimport type { Bounds } from \"../../types\";\nimport type { ExportOptions } from \"./types\";\n\n/**\n * Export series data to CSV format\n */\nexport function exportToCSV(\n series: Series[],\n options?: ExportOptions\n): string {\n const {\n seriesIds,\n includeHeaders = true,\n precision = 6,\n delimiter = ','\n } = options ?? {};\n\n const seriesToExport = seriesIds\n ? series.filter(s => seriesIds.includes(s.getId()))\n : series;\n\n if (seriesToExport.length === 0) return '';\n\n const lines: string[] = [];\n\n // Generate headers\n if (includeHeaders) {\n const headers: string[] = [];\n seriesToExport.forEach(s => {\n headers.push(`${s.getId()}_x`, `${s.getId()}_y`);\n });\n lines.push(headers.join(delimiter));\n }\n\n // Find max length\n const maxLength = Math.max(...seriesToExport.map(s => s.getPointCount()));\n\n // Generate data rows\n for (let i = 0; i < maxLength; i++) {\n const row: string[] = [];\n seriesToExport.forEach(s => {\n const data = s.getData();\n if (data && i < data.x.length) {\n row.push(data.x[i].toFixed(precision), data.y[i].toFixed(precision));\n } else {\n row.push('', '');\n }\n });\n lines.push(row.join(delimiter));\n }\n\n return lines.join('\\n');\n}\n\n/**\n * Export series data to JSON format\n */\nexport function exportToJSON(\n series: Series[],\n viewBounds: Bounds,\n options?: ExportOptions\n): string {\n const { seriesIds, precision = 6 } = options ?? {};\n\n const seriesToExport = seriesIds\n ? series.filter(s => seriesIds.includes(s.getId()))\n : series;\n\n const result: Record<string, { \n id: string;\n type: string;\n style: object;\n data: { x: number[]; y: number[] };\n pointCount: number;\n }> = {};\n\n seriesToExport.forEach(s => {\n const data = s.getData();\n result[s.getId()] = {\n id: s.getId(),\n type: s.getType(),\n style: s.getStyle(),\n data: {\n x: data ? Array.from(data.x).map(v => parseFloat(v.toFixed(precision))) : [],\n y: data ? Array.from(data.y).map(v => parseFloat(v.toFixed(precision))) : [],\n },\n pointCount: s.getPointCount()\n };\n });\n\n return JSON.stringify({\n exportDate: new Date().toISOString(),\n chartBounds: viewBounds,\n series: result\n }, null, 2);\n}\n\n/**\n * Export chart to image\n */\nexport function exportToImage(\n webglCanvas: HTMLCanvasElement,\n overlayCanvas: HTMLCanvasElement,\n backgroundColor: [number, number, number, number],\n legend: { draw: (ctx: CanvasRenderingContext2D, dpr: number) => void } | null,\n showLegend: boolean,\n dpr: number,\n type: \"png\" | \"jpeg\" = \"png\"\n): string {\n const finalCanvas = document.createElement(\"canvas\");\n finalCanvas.width = overlayCanvas.width;\n finalCanvas.height = overlayCanvas.height;\n const ctx = finalCanvas.getContext(\"2d\");\n if (!ctx) return \"\";\n\n // 1. Fill background\n const bg = backgroundColor;\n ctx.fillStyle = `rgba(${Math.round(bg[0] * 255)}, ${Math.round(\n bg[1] * 255\n )}, ${Math.round(bg[2] * 255)}, ${bg[3]})`;\n ctx.fillRect(0, 0, finalCanvas.width, finalCanvas.height);\n\n // 2. Draw WebGL plot area\n ctx.drawImage(webglCanvas, 0, 0);\n\n // 3. Draw Overlay (Axes, Grid, Labels)\n ctx.drawImage(overlayCanvas, 0, 0);\n\n // 4. Draw Legend (if exists and visible)\n if (legend && showLegend) {\n legend.draw(ctx, dpr);\n }\n\n return finalCanvas.toDataURL(`image/${type}`);\n}\n","/**\n * Chart Navigation\n * \n * Handles zoom, pan, auto-scale, and box zoom operations.\n */\n\nimport type { Bounds, ZoomOptions, AxisOptions } from \"../../types\";\nimport type { Scale } from \"../../scales\";\nimport type { EventEmitter } from \"../EventEmitter\";\nimport type { ChartEventMap } from \"../../types\";\n\nexport interface NavigationContext {\n viewBounds: Bounds;\n yScales: Map<string, Scale>;\n yAxisOptionsMap: Map<string, AxisOptions>;\n xAxisOptions: AxisOptions;\n primaryYAxisId: string;\n getPlotArea: () => { x: number; y: number; width: number; height: number };\n events: EventEmitter<ChartEventMap>;\n requestRender: () => void;\n series: Map<string, { isVisible(): boolean; getBounds(): Bounds | null; getYAxisId(): string | undefined }>;\n}\n\n/**\n * Apply zoom to the chart\n */\nexport function applyZoom(\n ctx: NavigationContext,\n options: ZoomOptions\n): void {\n if (options.x) {\n ctx.viewBounds.xMin = options.x[0];\n ctx.viewBounds.xMax = options.x[1];\n }\n \n if (options.y) {\n if (options.axisId) {\n // Zoom targeted axis only\n const scale = ctx.yScales.get(options.axisId);\n if (scale) {\n scale.setDomain(options.y[0], options.y[1]);\n // Sync primary viewBounds if applicable\n if (options.axisId === ctx.primaryYAxisId) {\n ctx.viewBounds.yMin = options.y[0];\n ctx.viewBounds.yMax = options.y[1];\n }\n }\n } else {\n // Global zoom: apply to all axes proportionally\n const oldRange = ctx.viewBounds.yMax - ctx.viewBounds.yMin;\n const newRange = options.y[1] - options.y[0];\n const factor = oldRange > 0 ? newRange / oldRange : 1;\n \n // Calculate relative shift based on primary axis change\n const offsetPct = oldRange > 0 ? (options.y[0] - ctx.viewBounds.yMin) / oldRange : 0;\n\n ctx.yScales.forEach((scale, id) => {\n if (id === ctx.primaryYAxisId) return; // Will sync with viewBounds later\n const sRange = scale.domain[1] - scale.domain[0];\n const sNewMin = scale.domain[0] + offsetPct * sRange;\n const sNewMax = sNewMin + factor * sRange;\n scale.setDomain(sNewMin, sNewMax);\n });\n\n ctx.viewBounds.yMin = options.y[0];\n ctx.viewBounds.yMax = options.y[1];\n }\n }\n \n ctx.events.emit(\"zoom\", {\n x: [ctx.viewBounds.xMin, ctx.viewBounds.xMax],\n y: [ctx.viewBounds.yMin, ctx.viewBounds.yMax],\n });\n ctx.requestRender();\n}\n\n/**\n * Apply pan to the chart\n */\nexport function applyPan(\n ctx: NavigationContext,\n deltaX: number,\n deltaY: number,\n axisId?: string\n): void {\n const pa = ctx.getPlotArea();\n const dx = (deltaX / pa.width) * (ctx.viewBounds.xMax - ctx.viewBounds.xMin);\n \n // Apply pan to X (always global)\n ctx.viewBounds.xMin -= dx;\n ctx.viewBounds.xMax -= dx;\n\n if (axisId) {\n // Pan targeted axis only\n const scale = ctx.yScales.get(axisId);\n if (scale) {\n const range = scale.domain[1] - scale.domain[0];\n const moveY = (deltaY / pa.height) * range;\n scale.setDomain(scale.domain[0] + moveY, scale.domain[1] + moveY);\n \n // Sync primary viewBounds if applicable\n if (axisId === ctx.primaryYAxisId) {\n ctx.viewBounds.yMin = scale.domain[0];\n ctx.viewBounds.yMax = scale.domain[1];\n }\n }\n } else {\n // Global pan: apply to all Y axes proportionally\n ctx.yScales.forEach((scale, id) => {\n const range = scale.domain[1] - scale.domain[0];\n const moveY = (deltaY / pa.height) * range;\n scale.setDomain(scale.domain[0] + moveY, scale.domain[1] + moveY);\n \n if (id === ctx.primaryYAxisId) {\n ctx.viewBounds.yMin = scale.domain[0];\n ctx.viewBounds.yMax = scale.domain[1];\n }\n });\n }\n\n const dy = (deltaY / pa.height) * (ctx.viewBounds.yMax - ctx.viewBounds.yMin);\n ctx.events.emit(\"pan\", { deltaX: dx, deltaY: dy });\n ctx.requestRender();\n}\n\n/**\n * Auto-scale all axes to fit data\n */\nexport function autoScaleAll(ctx: NavigationContext): void {\n if (ctx.series.size === 0) return;\n\n let xMin = Infinity;\n let xMax = -Infinity;\n \n // Track bounds per Y-axis\n const yAxisBounds = new Map<string, { min: number, max: number }>();\n ctx.yScales.forEach((_, id) => {\n yAxisBounds.set(id, { min: Infinity, max: -Infinity });\n });\n\n let hasValidData = false;\n\n ctx.series.forEach((s) => {\n if (!s.isVisible()) return;\n\n const b = s.getBounds();\n if (\n b &&\n isFinite(b.xMin) &&\n isFinite(b.xMax) &&\n isFinite(b.yMin) &&\n isFinite(b.yMax)\n ) {\n // Global X bounds\n xMin = Math.min(xMin, b.xMin);\n xMax = Math.max(xMax, b.xMax);\n \n // Axis-specific Y bounds\n const axisId = s.getYAxisId() || ctx.primaryYAxisId;\n const yBounds = yAxisBounds.get(axisId);\n if (yBounds) {\n yBounds.min = Math.min(yBounds.min, b.yMin);\n yBounds.max = Math.max(yBounds.max, b.yMax);\n }\n \n hasValidData = true;\n }\n });\n\n if (!hasValidData) {\n console.warn(\"[SciChart] No valid data bounds found for autoScale\");\n return;\n }\n\n const MAX_VALUE = 1e15;\n const MIN_VALUE = -1e15;\n\n // Apply X bounds (global)\n if (ctx.xAxisOptions.auto) {\n let xRange = xMax - xMin;\n if (xRange <= 0 || !isFinite(xRange)) xRange = Math.abs(xMin) * 0.1 || 1;\n const xPad = Math.min(xRange * 0.05, 1e10);\n \n ctx.viewBounds.xMin = Math.max(MIN_VALUE, xMin - xPad);\n ctx.viewBounds.xMax = Math.min(MAX_VALUE, xMax + xPad);\n }\n\n // Apply Y bounds (per axis)\n yAxisBounds.forEach((bounds, id) => {\n if (bounds.min === Infinity) return; // No data for this axis\n \n const opts = ctx.yAxisOptionsMap.get(id);\n const scale = ctx.yScales.get(id);\n \n if (opts && opts.auto && scale) {\n let yRange = bounds.max - bounds.min;\n if (yRange <= 0 || !isFinite(yRange)) yRange = Math.abs(bounds.min) * 0.1 || 1;\n const yPad = Math.min(yRange * 0.05, 1e10);\n \n const newMin = Math.max(MIN_VALUE, bounds.min - yPad);\n const newMax = Math.min(MAX_VALUE, bounds.max + yPad);\n \n scale.setDomain(newMin, newMax);\n \n // Sync primary axis to viewBounds for backward compatibility\n if (id === ctx.primaryYAxisId) {\n ctx.viewBounds.yMin = newMin;\n ctx.viewBounds.yMax = newMax;\n }\n }\n });\n\n ctx.requestRender();\n}\n\n/**\n * Handle box zoom selection\n */\nexport function handleBoxZoom(\n ctx: NavigationContext,\n selectionRect: { x: number; y: number; width: number; height: number } | null,\n currentRect: { x: number; y: number; width: number; height: number } | null,\n zoom: (options: ZoomOptions) => void\n): { x: number; y: number; width: number; height: number } | null {\n if (selectionRect === null) {\n if (\n currentRect &&\n currentRect.width > 5 &&\n currentRect.height > 5\n ) {\n const plotArea = ctx.getPlotArea();\n const bounds = ctx.viewBounds;\n\n const xMinNorm = (currentRect.x - plotArea.x) / plotArea.width;\n const xMaxNorm =\n (currentRect.x + currentRect.width - plotArea.x) /\n plotArea.width;\n const yMaxNorm =\n 1 - (currentRect.y - plotArea.y) / plotArea.height;\n const yMinNorm =\n 1 -\n (currentRect.y + currentRect.height - plotArea.y) /\n plotArea.height;\n\n const newXMin = bounds.xMin + xMinNorm * (bounds.xMax - bounds.xMin);\n const newXMax = bounds.xMin + xMaxNorm * (bounds.xMax - bounds.xMin);\n const newYMin = bounds.yMin + yMinNorm * (bounds.yMax - bounds.yMin);\n const newYMax = bounds.yMin + yMaxNorm * (bounds.yMax - bounds.yMin);\n\n zoom({\n x: [newXMin, newXMax],\n y: [newYMin, newYMax],\n });\n }\n return null;\n } else {\n return selectionRect;\n }\n}\n","/**\n * Chart Renderer\n * \n * Core rendering logic for the chart (WebGL + Overlay).\n */\n\nimport type { Bounds, CursorOptions, AxisOptions } from \"../../types\";\nimport type { Series } from \"../Series\";\nimport type { Scale } from \"../../scales\";\nimport type { NativeWebGLRenderer, NativeSeriesRenderData as SeriesRenderData } from \"../../renderer/NativeWebGLRenderer\";\nimport type { OverlayRenderer, CursorState } from \"../OverlayRenderer\";\nimport type { AnnotationManager } from \"../annotations\";\nimport type { ChartStatistics } from \"../ChartStatistics\";\nimport type { EventEmitter } from \"../EventEmitter\";\nimport type { ChartEventMap } from \"../../types\";\n\nexport interface RenderContext {\n webglCanvas: HTMLCanvasElement;\n overlayCanvas: HTMLCanvasElement;\n overlayCtx: CanvasRenderingContext2D;\n container: HTMLDivElement;\n series: Map<string, Series>;\n viewBounds: Bounds;\n xScale: Scale;\n yScales: Map<string, Scale>;\n yAxisOptionsMap: Map<string, AxisOptions>;\n xAxisOptions: AxisOptions;\n primaryYAxisId: string;\n renderer: NativeWebGLRenderer;\n overlay: OverlayRenderer;\n annotationManager: AnnotationManager;\n backgroundColor: [number, number, number, number];\n cursorOptions: CursorOptions | null;\n cursorPosition: { x: number; y: number } | null;\n selectionRect: { x: number; y: number; width: number; height: number } | null;\n stats: ChartStatistics | null;\n showStatistics: boolean;\n events: EventEmitter<ChartEventMap>;\n updateSeriesBuffer: (s: Series) => void;\n getPlotArea: () => { x: number; y: number; width: number; height: number };\n pixelToDataX: (px: number) => number;\n pixelToDataY: (py: number) => number;\n}\n\n/**\n * Prepare series data for WebGL rendering\n */\nexport function prepareSeriesData(\n ctx: RenderContext,\n plotArea: { x: number; y: number; width: number; height: number }\n): SeriesRenderData[] {\n const seriesData: SeriesRenderData[] = [];\n\n // Update all scales with current plot area range and domain\n ctx.xScale.setRange(plotArea.x, plotArea.x + plotArea.width);\n ctx.xScale.setDomain(ctx.viewBounds.xMin, ctx.viewBounds.xMax);\n\n ctx.yScales.forEach((scale, id) => {\n scale.setRange(plotArea.y + plotArea.height, plotArea.y);\n if (id === ctx.primaryYAxisId) {\n scale.setDomain(ctx.viewBounds.yMin, ctx.viewBounds.yMax);\n }\n });\n\n ctx.series.forEach((s) => {\n if (s.needsBufferUpdate) {\n ctx.updateSeriesBuffer(s);\n s.needsBufferUpdate = false;\n }\n\n const buf = ctx.renderer.getBuffer(s.getId());\n if (buf) {\n const seriesType = s.getType();\n \n // Determine Y-bounds for this series\n const axisId = s.getYAxisId() || ctx.primaryYAxisId;\n const scale = ctx.yScales.get(axisId);\n let yBounds: { min: number; max: number } | undefined;\n \n if (scale) {\n yBounds = { min: scale.domain[0], max: scale.domain[1] };\n }\n\n // Map area type to band for rendering (area fills to y=0)\n const renderType = seriesType === 'area' ? 'band' : seriesType;\n\n const renderData: SeriesRenderData = {\n id: s.getId(),\n buffer: buf,\n count: s.getPointCount(),\n style: s.getStyle(),\n visible: s.isVisible(),\n type: renderType,\n yBounds,\n };\n\n // For band and area series, count is doubled (2 vertices per point)\n if (seriesType === 'band' || seriesType === 'area') {\n renderData.count = s.getPointCount() * 2;\n }\n \n // Add step buffer for step types\n if (seriesType === 'step' || seriesType === 'step+scatter') {\n const stepBuf = ctx.renderer.getBuffer(`${s.getId()}_step`);\n if (stepBuf) {\n renderData.stepBuffer = stepBuf;\n // Calculate step count based on mode\n const stepMode = s.getStyle().stepMode ?? 'after';\n const pointCount = s.getPointCount();\n if (stepMode === 'center') {\n renderData.stepCount = 1 + (pointCount - 1) * 3;\n } else {\n renderData.stepCount = pointCount * 2 - 1;\n }\n }\n }\n \n seriesData.push(renderData);\n }\n });\n\n return seriesData;\n}\n\n/**\n * Render overlay elements (axes, grid, annotations, etc.)\n */\nexport function renderOverlay(\n ctx: RenderContext,\n plotArea: { x: number; y: number; width: number; height: number },\n primaryYScale: Scale\n): void {\n const rect = ctx.container.getBoundingClientRect();\n if (rect.width === 0 || rect.height === 0) {\n console.warn(\"[SciChart] Container has zero size in render, skipping overlay\");\n return;\n }\n\n ctx.overlay.clear(rect.width, rect.height);\n ctx.overlay.drawGrid(plotArea, ctx.xScale, primaryYScale);\n ctx.overlay.drawXAxis(plotArea, ctx.xScale, ctx.xAxisOptions.label);\n\n // Group axes by position\n const leftAxes: string[] = [];\n const rightAxes: string[] = [];\n \n ctx.yAxisOptionsMap.forEach((opts, id) => {\n if(opts.position === 'right') rightAxes.push(id);\n else leftAxes.push(id);\n });\n\n // Draw Left Axes (stacked outwards)\n leftAxes.forEach((id, index) => {\n const scale = ctx.yScales.get(id);\n const opts = ctx.yAxisOptionsMap.get(id);\n if(scale && opts) {\n const offset = index * 65; \n ctx.overlay.drawYAxis(plotArea, scale, opts.label, 'left', offset);\n }\n });\n\n // Draw Right Axes (stacked outwards)\n rightAxes.forEach((id, index) => {\n const scale = ctx.yScales.get(id);\n const opts = ctx.yAxisOptionsMap.get(id);\n if(scale && opts) {\n const offset = index * 65; \n ctx.overlay.drawYAxis(plotArea, scale, opts.label, 'right', offset);\n }\n });\n\n ctx.overlay.drawPlotBorder(plotArea);\n\n // Draw Error Bars for all series with error data\n ctx.series.forEach((s) => {\n if (s.isVisible() && s.hasErrorData()) {\n const axisId = s.getYAxisId() || ctx.primaryYAxisId;\n const scale = ctx.yScales.get(axisId);\n const yScale = scale || primaryYScale; \n \n ctx.overlay.drawErrorBars(plotArea, s, ctx.xScale, yScale);\n }\n });\n\n // Draw Selection Box\n if (ctx.selectionRect) {\n ctx.overlay.drawSelectionRect(ctx.selectionRect);\n }\n\n // Draw Annotations\n if (ctx.annotationManager.count > 0) {\n ctx.annotationManager.render(ctx.overlayCtx, plotArea, ctx.viewBounds);\n }\n\n // Cursor\n if (ctx.cursorOptions?.enabled && ctx.cursorPosition) {\n const cursor: CursorState = {\n enabled: true,\n x: ctx.cursorPosition.x,\n y: ctx.cursorPosition.y,\n crosshair: ctx.cursorOptions.crosshair ?? false,\n tooltipText: ctx.cursorOptions.formatter\n ? ctx.cursorOptions.formatter(\n ctx.pixelToDataX(ctx.cursorPosition.x),\n ctx.pixelToDataY(ctx.cursorPosition.y),\n \"\"\n )\n : `X: ${ctx.pixelToDataX(ctx.cursorPosition.x).toFixed(3)}\\nY: ${ctx.pixelToDataY(ctx.cursorPosition.y).toExponential(2)}`,\n };\n ctx.overlay.drawCursor(plotArea, cursor);\n }\n\n // Statistics Panel\n if (ctx.stats && ctx.showStatistics) {\n ctx.stats.update(ctx.viewBounds);\n }\n}\n","/**\n * Series - Represents a single data series in the chart\n *\n * Manages data arrays, styling, and GPU buffer lifecycle.\n */\n\nimport type {\n SeriesOptions,\n SeriesData,\n SeriesStyle,\n SeriesUpdateData,\n Bounds,\n SeriesType,\n} from \"../types\";\n\nconst DEFAULT_STYLE: SeriesStyle = {\n color: \"#ff0055\",\n width: 1.5,\n opacity: 1,\n pointSize: 4,\n};\n\nfunction ensureTypedArray(\n data: Float32Array | Float64Array | number[] | undefined\n): Float32Array | Float64Array {\n if (!data) return new Float32Array(0);\n if (data instanceof Float32Array || data instanceof Float64Array) return data;\n return new Float32Array(data);\n}\n\nexport class Series {\n private id: string;\n private type: SeriesType;\n private yAxisId?: string;\n private data: SeriesData;\n private style: SeriesStyle;\n private visible: boolean;\n private cycle?: number;\n private maxPoints?: number;\n\n // Track appends for optimized GPU updates\n private lastAppendCount = 0;\n\n // Cached bounds for performance\n private cachedBounds: Bounds | null = null;\n private boundsNeedsUpdate = true;\n\n // Track if GPU buffer needs update\n private _needsBufferUpdate = true;\n\n // Smoothed data cache\n private smoothedData: SeriesData | null = null;\n private smoothingNeedsUpdate = true;\n\n constructor(options: SeriesOptions) {\n if (!options) throw new Error(\"[Series] Options are required\");\n this.id = options.id;\n this.type = options.type;\n this.yAxisId = options.yAxisId;\n\n this.data = {\n x: ensureTypedArray(options.data?.x),\n y: ensureTypedArray(options.data?.y),\n // Error bar data\n yError: options.data?.yError ? ensureTypedArray(options.data.yError) : undefined,\n yErrorPlus: options.data?.yErrorPlus ? ensureTypedArray(options.data.yErrorPlus) : undefined,\n yErrorMinus: options.data?.yErrorMinus ? ensureTypedArray(options.data.yErrorMinus) : undefined,\n xError: options.data?.xError ? ensureTypedArray(options.data.xError) : undefined,\n xErrorPlus: options.data?.xErrorPlus ? ensureTypedArray(options.data.xErrorPlus) : undefined,\n xErrorMinus: options.data?.xErrorMinus ? ensureTypedArray(options.data.xErrorMinus) : undefined,\n y2: options.data?.y2 ? ensureTypedArray(options.data.y2) : undefined,\n };\n\n // Support both style object and top-level style properties for convenience\n this.style = {\n ...DEFAULT_STYLE,\n ...options.style,\n };\n\n // Fallback for top-level style properties often used in examples\n if ((options as any).color) this.style.color = (options as any).color;\n if ((options as any).width) this.style.width = (options as any).width;\n if ((options as any).pointSize)\n this.style.pointSize = (options as any).pointSize;\n if ((options as any).symbol)\n this.style.symbol = (options as any).symbol;\n\n this.visible = options.visible ?? true;\n this.cycle = options.cycle;\n this.maxPoints = options.maxPoints;\n\n // Validate data\n if (this.data.x.length !== this.data.y.length) {\n console.warn(\n `[Series \"${this.id}\"] X and Y arrays have different lengths:`,\n this.data.x.length,\n \"vs\",\n this.data.y.length\n );\n }\n }\n\n // ----------------------------------------\n // Getters\n // ----------------------------------------\n\n getId(): string {\n return this.id;\n }\n\n getType(): SeriesType {\n return this.type;\n }\n\n getYAxisId(): string | undefined {\n return this.yAxisId;\n }\n\n getVisible(): boolean {\n return this.visible;\n }\n\n getData(): SeriesData {\n if (this.style.smoothing && this.style.smoothing > 0) {\n return this.getSmoothedData();\n }\n return this.data;\n }\n\n private getSmoothedData(): SeriesData {\n if (this.smoothingNeedsUpdate || !this.smoothedData) {\n this.smoothedData = this.applySmoothing(this.data, 5); // Window size 5\n this.smoothingNeedsUpdate = false;\n }\n return this.smoothedData;\n }\n\n private applySmoothing(data: SeriesData, windowSize: number): SeriesData {\n const { x, y } = data;\n const len = x.length;\n if (len < windowSize) return { ...data };\n\n const smoothedY = new Float32Array(len);\n const halfWindow = Math.floor(windowSize / 2);\n\n for (let i = 0; i < len; i++) {\n let sum = 0;\n let count = 0;\n for (let j = i - halfWindow; j <= i + halfWindow; j++) {\n if (j >= 0 && j < len) {\n sum += y[j];\n count++;\n }\n }\n smoothedY[i] = sum / count;\n }\n\n return { x, y: smoothedY };\n }\n\n getStyle(): SeriesStyle {\n return this.style;\n }\n\n isVisible(): boolean {\n return this.visible;\n }\n\n getCycle(): number | undefined {\n return this.cycle;\n }\n\n getPointCount(): number {\n return this.data.x.length;\n }\n\n getLastAppendCount(): number {\n return this.lastAppendCount;\n }\n\n resetLastAppendCount(): void {\n this.lastAppendCount = 0;\n }\n\n /**\n * Check if series has error bar data\n */\n hasErrorData(): boolean {\n return !!(\n this.data.yError ||\n this.data.yErrorPlus ||\n this.data.yErrorMinus ||\n this.data.xError ||\n this.data.xErrorPlus ||\n this.data.xErrorMinus\n );\n }\n\n /**\n * Get Y error values for a data point\n * Returns [errorMinus, errorPlus] for the point at index i\n */\n getYError(i: number): [number, number] | null {\n if (i < 0 || i >= this.data.x.length) return null;\n \n // Symmetric error\n if (this.data.yError && i < this.data.yError.length) {\n const err = this.data.yError[i];\n return [err, err];\n }\n \n // Asymmetric error\n const minus = this.data.yErrorMinus?.[i] ?? 0;\n const plus = this.data.yErrorPlus?.[i] ?? 0;\n if (minus > 0 || plus > 0) {\n return [minus, plus];\n }\n \n return null;\n }\n\n /**\n * Get X error values for a data point\n * Returns [errorMinus, errorPlus] for the point at index i\n */\n getXError(i: number): [number, number] | null {\n if (i < 0 || i >= this.data.x.length) return null;\n \n // Symmetric error\n if (this.data.xError && i < this.data.xError.length) {\n const err = this.data.xError[i];\n return [err, err];\n }\n \n // Asymmetric error\n const minus = this.data.xErrorMinus?.[i] ?? 0;\n const plus = this.data.xErrorPlus?.[i] ?? 0;\n if (minus > 0 || plus > 0) {\n return [minus, plus];\n }\n \n return null;\n }\n\n // ----------------------------------------\n // Bounds Calculation\n // ----------------------------------------\n\n getBounds(): Bounds | null {\n if (this.data.x.length === 0) {\n return null;\n }\n\n if (this.boundsNeedsUpdate || this.cachedBounds === null) {\n this.cachedBounds = this.calculateBounds();\n this.boundsNeedsUpdate = false;\n }\n\n return this.cachedBounds;\n }\n\n private calculateBounds(): Bounds {\n const { x, y } = this.data;\n\n let xMin = Infinity;\n let xMax = -Infinity;\n let yMin = Infinity;\n let yMax = -Infinity;\n\n // Single pass through data\n for (let i = 0; i < x.length; i++) {\n const xVal = x[i];\n const yVal = y[i];\n\n // Skip NaN/Infinity\n if (!isFinite(xVal) || !isFinite(yVal)) continue;\n\n if (xVal < xMin) xMin = xVal;\n if (xVal > xMax) xMax = xVal;\n if (yVal < yMin) yMin = yVal;\n if (yVal > yMax) yMax = yVal;\n }\n\n const bounds = { xMin, xMax, yMin, yMax };\n return bounds;\n }\n\n // ----------------------------------------\n // Data Updates\n // ----------------------------------------\n\n /**\n * Update series data\n *\n * For streaming data, use append=true to avoid recreating buffers.\n */\n updateData(update: SeriesUpdateData): void {\n if (!update) return;\n\n if (update.append) {\n const newX = ensureTypedArray(update.x);\n const newY = ensureTypedArray(update.y);\n\n if (newX.length > 0 && newY.length > 0) {\n this.data = {\n ...this.data,\n x: this.appendArray(this.data.x, newX),\n y: this.appendArray(this.data.y, newY),\n };\n if (update.y2) {\n const newY2 = ensureTypedArray(update.y2);\n this.data.y2 = this.data.y2 \n ? this.appendArray(this.data.y2, newY2)\n : newY2;\n }\n this.lastAppendCount += newX.length;\n\n // Handle rolling window\n if (this.maxPoints && this.data.x.length > this.maxPoints) {\n const overflow = this.data.x.length - this.maxPoints;\n this.data.x = this.data.x.slice(overflow);\n this.data.y = this.data.y.slice(overflow);\n if (this.data.y2) this.data.y2 = this.data.y2.slice(overflow);\n this.lastAppendCount = 0; // Force full update since we shifted\n }\n }\n } else {\n // Replace mode\n if (update.x) this.data.x = ensureTypedArray(update.x);\n if (update.y) this.data.y = ensureTypedArray(update.y);\n if (update.y2) this.data.y2 = ensureTypedArray(update.y2);\n this.lastAppendCount = 0;\n }\n\n // Invalidate bounds cache\n this.boundsNeedsUpdate = true;\n this.smoothingNeedsUpdate = true;\n this._needsBufferUpdate = true;\n }\n\n private appendArray(\n existing: Float32Array | Float64Array,\n newData: Float32Array | Float64Array\n ): Float32Array | Float64Array {\n // Create new array with combined length\n const combined = new (existing.constructor as\n | Float32ArrayConstructor\n | Float64ArrayConstructor)(existing.length + newData.length);\n combined.set(existing, 0);\n combined.set(newData, existing.length);\n return combined;\n }\n\n /**\n * Replace all data at once\n */\n setData(\n x: Float32Array | Float64Array,\n y: Float32Array | Float64Array,\n y2?: Float32Array | Float64Array\n ): void {\n this.data = { x, y, y2 };\n this.boundsNeedsUpdate = true;\n this.smoothingNeedsUpdate = true;\n this._needsBufferUpdate = true;\n }\n\n // ----------------------------------------\n // Style Updates\n // ----------------------------------------\n\n setStyle(style: Partial<SeriesStyle>): void {\n const oldSmoothing = this.style.smoothing;\n this.style = { ...this.style, ...style };\n if (this.style.smoothing !== oldSmoothing) {\n this.smoothingNeedsUpdate = true;\n this._needsBufferUpdate = true;\n }\n }\n\n get needsBufferUpdate(): boolean {\n return this._needsBufferUpdate;\n }\n set needsBufferUpdate(val: boolean) {\n this._needsBufferUpdate = val;\n }\n\n setVisible(visible: boolean): void {\n this.visible = visible;\n }\n\n setType(type: SeriesType): void {\n this.type = type;\n }\n\n setMaxPoints(maxPoints: number | undefined): void {\n this.maxPoints = maxPoints;\n if (this.maxPoints && this.data.x.length > this.maxPoints) {\n this.data.x = this.data.x.slice(-this.maxPoints);\n this.data.y = this.data.y.slice(-this.maxPoints);\n if (this.data.y2) this.data.y2 = this.data.y2.slice(-this.maxPoints);\n this._needsBufferUpdate = true;\n }\n }\n\n // ----------------------------------------\n // Cleanup\n // ----------------------------------------\n\n destroy(): void {\n // Clear data references\n this.data = {\n x: new Float32Array(0),\n y: new Float32Array(0),\n };\n this.cachedBounds = null;\n }\n}\n","/**\n * Chart Series Manager\n * \n * Handles series CRUD operations, buffer management, and curve fitting.\n */\n\nimport type { SeriesOptions, SeriesUpdateData, Bounds } from \"../../types\";\nimport { Series } from \"../Series\";\nimport { fitData, type FitType, type FitOptions } from \"../../analysis\";\nimport {\n NativeWebGLRenderer,\n interleaveData,\n interleaveStepData,\n interleaveBandData,\n} from \"../../renderer/NativeWebGLRenderer\";\nimport type { Annotation } from \"../annotations\";\n\nexport interface SeriesManagerContext {\n series: Map<string, Series>;\n renderer: NativeWebGLRenderer;\n viewBounds: Bounds;\n autoScale: () => void;\n requestRender: () => void;\n addAnnotation: (annotation: Annotation) => string;\n xAxisOptions: { auto?: boolean };\n yAxisOptionsMap: Map<string, { auto?: boolean }>;\n autoScrollEnabled: boolean;\n updateLegend?: () => void;\n}\n\n/**\n * Add a new series to the chart\n */\nexport function addSeries(\n ctx: SeriesManagerContext,\n options: SeriesOptions\n): void {\n const s = new Series(options);\n ctx.series.set(s.getId(), s);\n updateSeriesBuffer(ctx, s);\n if (ctx.xAxisOptions.auto || Array.from(ctx.yAxisOptionsMap.values()).some(o => o.auto)) {\n ctx.autoScale();\n }\n ctx.updateLegend?.();\n ctx.requestRender();\n}\n\n/**\n * Remove a series from the chart\n */\nexport function removeSeries(\n ctx: SeriesManagerContext,\n id: string\n): void {\n const s = ctx.series.get(id);\n if (s) {\n ctx.renderer.deleteBuffer(id);\n ctx.renderer.deleteBuffer(`${id}_step`);\n s.destroy();\n ctx.series.delete(id);\n ctx.updateLegend?.();\n ctx.requestRender();\n }\n}\n\n/**\n * Update series data\n */\nexport function updateSeries(\n ctx: SeriesManagerContext,\n id: string,\n data: SeriesUpdateData\n): void {\n const s = ctx.series.get(id);\n if (s) {\n s.updateData(data);\n updateSeriesBuffer(ctx, s);\n ctx.requestRender();\n }\n}\n\n/**\n * Update series buffer for rendering\n */\nexport function updateSeriesBuffer(\n ctx: SeriesManagerContext,\n s: Series\n): void {\n const d = s.getData();\n if (!d || d.x.length === 0) return;\n \n const seriesType = s.getType();\n const seriesId = s.getId();\n const totalPoints = d.x.length;\n\n if (seriesType === \"band\" || seriesType === \"area\") {\n // For band: fill between y and y2\n // For area: fill between y and baseline (y=0)\n const y2 = seriesType === \"area\" \n ? new Float32Array(totalPoints).fill(0)\n : (d.y2 || new Float32Array(totalPoints).fill(0));\n ctx.renderer.createBuffer(seriesId, interleaveBandData(d.x, d.y, y2));\n } else {\n ctx.renderer.createBuffer(seriesId, interleaveData(d.x, d.y));\n }\n \n if (seriesType === 'step' || seriesType === 'step+scatter') {\n const stepMode = s.getStyle().stepMode ?? 'after';\n const stepData = interleaveStepData(d.x, d.y, stepMode);\n ctx.renderer.createBuffer(`${seriesId}_step`, stepData);\n }\n\n s.resetLastAppendCount();\n}\n\n/**\n * Append data to existing series\n */\nexport function appendData(\n ctx: SeriesManagerContext,\n id: string,\n x: number[] | Float32Array,\n y: number[] | Float32Array\n): void {\n const s = ctx.series.get(id);\n if (!s) return;\n\n const oldBounds = s.getBounds();\n const oldMaxX = oldBounds ? oldBounds.xMax : -Infinity;\n\n s.updateData({ x: x as any, y: y as any, append: true });\n updateSeriesBuffer(ctx, s);\n\n if (ctx.autoScrollEnabled) {\n const newBounds = s.getBounds();\n if (newBounds) {\n const xRange = ctx.viewBounds.xMax - ctx.viewBounds.xMin;\n if (oldMaxX >= ctx.viewBounds.xMax - xRange * 0.05 || !oldBounds) {\n ctx.viewBounds.xMax = newBounds.xMax;\n ctx.viewBounds.xMin = ctx.viewBounds.xMax - xRange;\n }\n }\n }\n\n if (ctx.xAxisOptions.auto || Array.from(ctx.yAxisOptionsMap.values()).some(o => o.auto)) {\n ctx.autoScale();\n }\n ctx.requestRender();\n}\n\n/**\n * Set max points for rolling window\n */\nexport function setMaxPoints(\n ctx: SeriesManagerContext,\n id: string,\n maxPoints: number\n): void {\n const s = ctx.series.get(id);\n if (s) {\n s.setMaxPoints(maxPoints);\n updateSeriesBuffer(ctx, s);\n }\n}\n\n/**\n * Add a fit line (regression) to an existing series\n */\nexport function addFitLine(\n ctx: SeriesManagerContext & { addSeries: (o: SeriesOptions) => void },\n seriesId: string,\n type: FitType,\n options: FitOptions = {}\n): string {\n const s = ctx.series.get(seriesId);\n if (!s) throw new Error(`Series ${seriesId} not found`);\n\n const data = s.getData();\n if (!data || data.x.length < 2) return \"\";\n\n const result = fitData(data.x as any, data.y as any, type, options);\n const bounds = s.getBounds();\n const xMin = bounds?.xMin ?? 0;\n const xMax = bounds?.xMax ?? 1;\n const dataWidth = xMax - xMin;\n const fitResolution = 200;\n const fitX = new Float32Array(fitResolution);\n const fitY = new Float32Array(fitResolution);\n\n for (let i = 0; i < fitResolution; i++) {\n const x = xMin + (i / (fitResolution - 1)) * dataWidth;\n fitX[i] = x;\n fitY[i] = result.predict(x);\n }\n\n const fitId = `${seriesId}-fit-${Date.now()}`;\n const sourceStyle = s.getStyle();\n\n ctx.addSeries({\n id: fitId,\n type: 'line',\n yAxisId: s.getYAxisId(),\n data: { x: fitX, y: fitY },\n style: {\n color: sourceStyle.color,\n width: (sourceStyle.width || 1) * 1.5,\n opacity: 0.8,\n lineDash: [5, 5]\n }\n });\n\n ctx.addAnnotation({\n type: 'text',\n x: xMin + dataWidth * 0.05,\n y: result.predict(xMin + dataWidth * 0.05),\n text: `${result.equation}\\n(R² = ${result.rSquared.toFixed(4)})`,\n fontSize: 12,\n backgroundColor: 'rgba(0,0,0,0.7)',\n color: sourceStyle.color || '#ffffff',\n padding: 4,\n anchor: 'bottom-left',\n interactive: true\n });\n\n return fitId;\n}\n","/**\n * Scale interface and implementations\n *\n * Scales transform data values to pixel coordinates and vice versa.\n */\n\nexport interface Scale {\n /** Data domain [min, max] */\n domain: [number, number];\n /** Pixel range [min, max] */\n range: [number, number];\n /** Scale type identifier */\n type: \"linear\" | \"log\";\n\n /** Set the domain */\n setDomain(min: number, max: number): void;\n /** Set the range */\n setRange(min: number, max: number): void;\n\n /** Transform data value to pixel */\n transform(value: number): number;\n /** Transform pixel to data value */\n invert(pixel: number): number;\n\n /** Generate nice tick values */\n ticks(count?: number): number[];\n}\n\n/**\n * Linear scale - proportional mapping\n */\nexport class LinearScale implements Scale {\n public domain: [number, number] = [0, 1];\n public range: [number, number] = [0, 100];\n public readonly type = \"linear\" as const;\n\n setDomain(min: number, max: number): void {\n // Ensure we have a valid, non-zero range\n if (!isFinite(min) || !isFinite(max)) {\n this.domain = [0, 1];\n return;\n }\n if (min === max) {\n this.domain = [min - 0.5, max + 0.5];\n return;\n }\n this.domain = [min, max];\n }\n\n setRange(min: number, max: number): void {\n this.range = [min, max];\n }\n\n transform(value: number): number {\n const [d0, d1] = this.domain;\n const [r0, r1] = this.range;\n const normalized = (value - d0) / (d1 - d0);\n return r0 + normalized * (r1 - r0);\n }\n\n invert(pixel: number): number {\n const [d0, d1] = this.domain;\n const [r0, r1] = this.range;\n const normalized = (pixel - r0) / (r1 - r0);\n return d0 + normalized * (d1 - d0);\n }\n\n ticks(count = 10): number[] {\n const [min, max] = this.domain;\n if (!isFinite(min) || !isFinite(max) || min === max) return [];\n\n const step = niceStep(min, max, count);\n const start = Math.ceil(min / step) * step;\n const ticks: number[] = [];\n\n // Limit ticks to prevent infinite loops or performance issues\n const maxTicks = 100;\n let t = start;\n while (t <= max + step * 0.5 && ticks.length < maxTicks) {\n ticks.push(Math.round(t * 1e12) / 1e12); // Fix floating point\n t += step;\n }\n\n return ticks;\n }\n}\n\n/**\n * Logarithmic scale - for exponential data\n */\nexport class LogScale implements Scale {\n public domain: [number, number] = [1, 1000];\n public range: [number, number] = [0, 100];\n public readonly type = \"log\" as const;\n\n private base = 10;\n\n setDomain(min: number, max: number): void {\n // Log scale requires positive values and non-zero range\n const safeMin = Math.max(min, 1e-12);\n const safeMax = Math.max(max, 1e-12 * 10);\n\n if (safeMin === safeMax) {\n this.domain = [safeMin / 10, safeMax * 10];\n return;\n }\n this.domain = [safeMin, safeMax];\n }\n\n setRange(min: number, max: number): void {\n this.range = [min, max];\n }\n\n transform(value: number): number {\n const [d0, d1] = this.domain;\n const [r0, r1] = this.range;\n\n if (value <= 0) return r0; // Handle invalid values\n\n const logMin = Math.log(d0) / Math.log(this.base);\n const logMax = Math.log(d1) / Math.log(this.base);\n const logVal = Math.log(value) / Math.log(this.base);\n\n const normalized = (logVal - logMin) / (logMax - logMin);\n return r0 + normalized * (r1 - r0);\n }\n\n invert(pixel: number): number {\n const [d0, d1] = this.domain;\n const [r0, r1] = this.range;\n\n const logMin = Math.log(d0) / Math.log(this.base);\n const logMax = Math.log(d1) / Math.log(this.base);\n\n const normalized = (pixel - r0) / (r1 - r0);\n const logVal = logMin + normalized * (logMax - logMin);\n\n return Math.pow(this.base, logVal);\n }\n\n ticks(count = 10): number[] {\n const [min, max] = this.domain;\n const logMin = Math.floor(Math.log10(min));\n const logMax = Math.ceil(Math.log10(max));\n const ticks: number[] = [];\n\n for (let p = logMin; p <= logMax && ticks.length < count; p++) {\n const value = Math.pow(10, p);\n if (value >= min && value <= max) {\n ticks.push(value);\n }\n }\n\n return ticks;\n }\n}\n\n// ============================================\n// Helpers\n// ============================================\n\n/**\n * Calculate a \"nice\" step size for tick marks\n */\nfunction niceStep(min: number, max: number, count: number): number {\n const range = max - min;\n if (range <= 0 || !isFinite(range)) return 1;\n\n const rawStep = range / count;\n const magnitude = Math.pow(10, Math.floor(Math.log10(rawStep)));\n const normalized = rawStep / magnitude;\n\n let niceNormalized: number;\n if (normalized < 1.5) {\n niceNormalized = 1;\n } else if (normalized < 3) {\n niceNormalized = 2;\n } else if (normalized < 7) {\n niceNormalized = 5;\n } else {\n niceNormalized = 10;\n }\n\n return niceNormalized * magnitude;\n}\n\n/**\n * Factory function to create scale by type\n */\nexport function createScale(type: \"linear\" | \"log\"): Scale {\n return type === \"log\" ? new LogScale() : new LinearScale();\n}\n","/**\n * Chart Setup\n * \n * Handles chart initialization, DOM setup, and configuration.\n */\n\nimport type { ChartOptions, AxisOptions } from \"../../types\";\nimport { parseColor } from \"../../renderer/NativeWebGLRenderer\";\nimport { LinearScale, LogScale, type Scale } from \"../../scales\";\nimport { DEFAULT_THEME, getThemeByName, type ChartTheme } from \"../../theme\";\nimport { MARGINS } from \"./types\";\n\nexport interface SetupResult {\n theme: ChartTheme;\n backgroundColor: [number, number, number, number];\n showLegend: boolean;\n showControls: boolean;\n autoScroll: boolean;\n showStatistics: boolean;\n dpr: number;\n xAxisOptions: AxisOptions;\n xScale: Scale;\n yAxisOptionsMap: Map<string, AxisOptions>;\n yScales: Map<string, Scale>;\n primaryYAxisId: string;\n webglCanvas: HTMLCanvasElement;\n overlayCanvas: HTMLCanvasElement;\n overlayCtx: CanvasRenderingContext2D;\n}\n\n/**\n * Initialize chart configuration from options\n */\nexport function initializeChart(\n container: HTMLDivElement,\n options: ChartOptions\n): SetupResult {\n if (!container) throw new Error(\"[SciChart] Container element is required\");\n\n const dpr = options.devicePixelRatio ?? window.devicePixelRatio;\n\n // Initialize theme\n const theme = typeof options.theme === \"string\"\n ? getThemeByName(options.theme)\n : (options.theme as ChartTheme) ?? DEFAULT_THEME;\n\n const bgColor = parseColor(options.background ?? theme.backgroundColor);\n const backgroundColor: [number, number, number, number] = [bgColor[0], bgColor[1], bgColor[2], bgColor[3]];\n const showLegend = options.showLegend ?? theme.legend.visible;\n const showControls = options.showControls ?? false;\n const autoScroll = options.autoScroll ?? false;\n const showStatistics = options.showStatistics ?? false;\n\n // X Axis\n const xAxisOptions: AxisOptions = { scale: \"linear\", auto: true, ...options.xAxis };\n const xScale = xAxisOptions.scale === \"log\" ? new LogScale() : new LinearScale();\n\n // Process Y Axes\n const yAxisOptionsMap = new Map<string, AxisOptions>();\n const yScales = new Map<string, Scale>();\n let primaryYAxisId = 'default';\n\n const providedYAxes = options.yAxis \n ? (Array.isArray(options.yAxis) ? options.yAxis : [options.yAxis])\n : [{}];\n\n providedYAxes.forEach((axisOpt, index) => {\n const isFirst = index === 0;\n const defaultId = isFirst ? 'default' : `y${index}`;\n const id = axisOpt.id || defaultId;\n \n if (isFirst) primaryYAxisId = id;\n const position = axisOpt.position || (isFirst ? 'left' : 'right');\n const fullOptions: AxisOptions = { scale: \"linear\", auto: true, position, ...axisOpt, id };\n\n yAxisOptionsMap.set(id, fullOptions);\n yScales.set(id, fullOptions.scale === \"log\" ? new LogScale() : new LinearScale());\n });\n\n // Create DOM structure\n container.style.position = \"relative\";\n container.style.overflow = \"hidden\";\n container.style.backgroundColor = options.background ?? theme.backgroundColor;\n\n const webglCanvas = createCanvas(\"webgl\");\n const overlayCanvas = createCanvas(\"overlay\");\n\n while (container.firstChild) {\n container.removeChild(container.firstChild);\n }\n\n container.appendChild(webglCanvas);\n container.appendChild(overlayCanvas);\n\n const ctx = overlayCanvas.getContext(\"2d\");\n if (!ctx) throw new Error(\"Failed to get 2D context\");\n\n return {\n theme,\n backgroundColor,\n showLegend,\n showControls,\n autoScroll,\n showStatistics,\n dpr,\n xAxisOptions,\n xScale,\n yAxisOptionsMap,\n yScales,\n primaryYAxisId,\n webglCanvas,\n overlayCanvas,\n overlayCtx: ctx,\n };\n}\n\n/**\n * Create a canvas element\n */\nexport function createCanvas(type: \"webgl\" | \"overlay\"): HTMLCanvasElement {\n const canvas = document.createElement(\"canvas\");\n canvas.style.cssText = \"position:absolute;top:0;left:0;width:100%;height:100%;\";\n if (type === \"overlay\") canvas.style.pointerEvents = \"none\";\n return canvas;\n}\n\n/**\n * Calculate the plot area based on container size and margins\n */\nexport function getPlotArea(\n container: HTMLDivElement,\n yAxisOptionsMap: Map<string, AxisOptions>\n): { x: number; y: number; width: number; height: number } {\n const rect = container.getBoundingClientRect();\n const leftAxisCount = Array.from(yAxisOptionsMap.values()).filter(a => a.position !== 'right').length;\n const rightAxisCount = Array.from(yAxisOptionsMap.values()).filter(a => a.position === 'right').length;\n const leftMargin = MARGINS.left + Math.max(0, leftAxisCount - 1) * 65;\n const rightMargin = MARGINS.right + rightAxisCount * 65;\n return {\n x: leftMargin,\n y: MARGINS.top,\n width: Math.max(1, rect.width - leftMargin - rightMargin),\n height: Math.max(1, rect.height - MARGINS.top - MARGINS.bottom),\n };\n}\n\n/**\n * Get axes layout for interaction manager\n */\nexport function getAxesLayout(\n yAxisOptionsMap: Map<string, AxisOptions>\n): Array<{ id: string; position: 'left' | 'right'; offset: number }> {\n // Separate axes by position to calculate offset correctly\n const result: Array<{ id: string; position: 'left' | 'right'; offset: number }> = [];\n let leftIndex = 0;\n let rightIndex = 0;\n\n yAxisOptionsMap.forEach((opts, id) => {\n const position = (opts.position === 'right' ? 'right' : 'left') as 'left' | 'right';\n const offset = position === 'left' ? leftIndex * 65 : rightIndex * 65;\n \n if (position === 'left') leftIndex++;\n else rightIndex++;\n\n result.push({ id, position, offset });\n });\n\n return result;\n}\n\n/**\n * Resize canvases to match container\n */\nexport function resizeCanvases(\n container: HTMLDivElement,\n webglCanvas: HTMLCanvasElement,\n overlayCanvas: HTMLCanvasElement,\n overlayCtx: CanvasRenderingContext2D,\n dpr: number\n): boolean {\n const rect = container.getBoundingClientRect();\n if (rect.width === 0 || rect.height === 0) return false;\n\n const w = rect.width * dpr;\n const h = rect.height * dpr;\n\n [webglCanvas, overlayCanvas].forEach((c) => {\n c.width = w;\n c.height = h;\n });\n\n overlayCtx.scale(dpr, dpr);\n return true;\n}\n","/**\n * ChartCore - Main Chart Implementation\n * \n * The core chart class that coordinates rendering, interactions,\n * and data management using the extracted utility modules.\n */\n\nimport type {\n ChartOptions,\n AxisOptions,\n SeriesOptions,\n SeriesUpdateData,\n ZoomOptions,\n CursorOptions,\n ChartEventMap,\n Bounds,\n} from \"../../types\";\nimport * as analysis from \"../../analysis\";\nimport type { FitType, FitOptions } from \"../../analysis\";\nimport { EventEmitter } from \"../EventEmitter\";\nimport { Series } from \"../Series\";\nimport { NativeWebGLRenderer, parseColor } from \"../../renderer/NativeWebGLRenderer\";\nimport type { Scale } from \"../../scales\";\nimport { getThemeByName, type ChartTheme } from \"../../theme\";\nimport { OverlayRenderer } from \"../OverlayRenderer\";\nimport { InteractionManager } from \"../InteractionManager\";\nimport { ChartControls } from \"../ChartControls\";\nimport { ChartLegend } from \"../ChartLegend\";\nimport { ChartStatistics } from \"../ChartStatistics\";\nimport { AnnotationManager, type Annotation } from \"../annotations\";\n\nimport type { Chart, ExportOptions } from \"./types\";\nimport { exportToCSV, exportToJSON, exportToImage } from \"./ChartExporter\";\nimport { applyZoom, applyPan, autoScaleAll, handleBoxZoom } from \"./ChartNavigation\";\nimport { prepareSeriesData, renderOverlay } from \"./ChartRenderer\";\nimport { \n addSeries as addSeriesImpl, \n removeSeries as removeSeriesImpl,\n updateSeries as updateSeriesImpl,\n updateSeriesBuffer,\n appendData as appendDataImpl,\n setMaxPoints as setMaxPointsImpl,\n addFitLine as addFitLineImpl\n} from \"./ChartSeries\";\nimport { \n initializeChart,\n getPlotArea,\n getAxesLayout,\n resizeCanvases\n} from \"./ChartSetup\";\n\n// ============================================\n// Chart Implementation\n// ============================================\n\nexport class ChartImpl implements Chart {\n private container: HTMLDivElement;\n private webglCanvas: HTMLCanvasElement;\n private overlayCanvas: HTMLCanvasElement;\n private overlayCtx: CanvasRenderingContext2D;\n private series: Map<string, Series> = new Map();\n private events = new EventEmitter<ChartEventMap>();\n private viewBounds: Bounds = { xMin: -0.5, xMax: 0.5, yMin: -1e-5, yMax: 1e-5 };\n private xAxisOptions: AxisOptions;\n private yAxisOptionsMap: Map<string, AxisOptions>;\n private primaryYAxisId: string;\n private dpr: number;\n private backgroundColor: [number, number, number, number];\n private renderer: NativeWebGLRenderer;\n private overlay: OverlayRenderer;\n private interaction: InteractionManager;\n private xScale: Scale;\n private yScales: Map<string, Scale>;\n private get yScale(): Scale {\n return (this.yScales.get(this.primaryYAxisId) || this.yScales.values().next().value) as Scale;\n }\n private theme: ChartTheme;\n private cursorOptions: CursorOptions | null = null;\n private cursorPosition: { x: number; y: number } | null = null;\n private showLegend: boolean;\n private legend: ChartLegend | null = null;\n private showControls: boolean;\n private controls: ChartControls | null = null;\n private animationFrameId: number | null = null;\n private needsRender = false;\n private isDestroyed = false;\n private autoScroll = false;\n private showStatistics = false;\n private stats: ChartStatistics | null = null;\n private selectionRect: { x: number; y: number; width: number; height: number } | null = null;\n private annotationManager: AnnotationManager = new AnnotationManager();\n public readonly analysis = analysis;\n\n constructor(options: ChartOptions) {\n this.container = options.container;\n const setup = initializeChart(this.container, options);\n\n this.theme = setup.theme;\n this.backgroundColor = setup.backgroundColor;\n this.showLegend = setup.showLegend;\n this.showControls = setup.showControls;\n this.autoScroll = setup.autoScroll;\n this.showStatistics = setup.showStatistics;\n this.dpr = setup.dpr;\n this.xAxisOptions = setup.xAxisOptions;\n this.xScale = setup.xScale;\n this.yAxisOptionsMap = setup.yAxisOptionsMap;\n this.yScales = setup.yScales;\n this.primaryYAxisId = setup.primaryYAxisId;\n this.webglCanvas = setup.webglCanvas;\n this.overlayCanvas = setup.overlayCanvas;\n this.overlayCtx = setup.overlayCtx;\n\n this.renderer = new NativeWebGLRenderer(this.webglCanvas);\n this.renderer.setDPR(this.dpr);\n this.overlay = new OverlayRenderer(this.overlayCtx, this.theme);\n this.interaction = new InteractionManager(\n this.container,\n {\n onZoom: (b, axisId) => this.zoom({ x: [b.xMin, b.xMax], y: [b.yMin, b.yMax], axisId }),\n onPan: (dx, dy, axisId) => this.pan(dx, dy, axisId),\n onBoxZoom: (rect) => this.handleBoxZoom(rect),\n onCursorMove: (x, y) => { this.cursorPosition = { x, y }; this.requestRender(); },\n onCursorLeave: () => { this.cursorPosition = null; this.requestRender(); },\n },\n () => this.getPlotArea(),\n (axisId) => this.getInteractedBounds(axisId),\n () => getAxesLayout(this.yAxisOptionsMap as any)\n );\n\n new ResizeObserver(() => !this.isDestroyed && this.resize()).observe(this.container);\n this.initControls();\n this.initLegend(options);\n if (this.showStatistics) {\n this.stats = new ChartStatistics(this.container, this.theme, this.series);\n }\n\n this.resize();\n this.startRenderLoop();\n setTimeout(() => !this.isDestroyed && this.resize(), 100);\n console.log(\"[SciChart] Initialized\", { dpr: this.dpr, theme: this.theme.name });\n }\n\n private initControls(): void {\n if (!this.showControls) return;\n this.controls = new ChartControls(this.container, this.theme, {\n onResetZoom: () => this.resetZoom(),\n onSetType: (type) => { this.series.forEach((s) => s.setType(type)); this.requestRender(); },\n onToggleSmoothing: () => {\n this.series.forEach((s) => {\n const style = s.getStyle();\n s.setStyle({ smoothing: (style.smoothing || 0) === 0 ? 0.5 : 0 });\n });\n this.requestRender();\n },\n onTogglePan: (active) => this.interaction.setPanMode(active),\n onExport: () => {\n const link = document.createElement(\"a\");\n link.download = `scichart-export-${Date.now()}.png`;\n link.href = this.exportImage();\n link.click();\n },\n onAutoScale: () => { this.autoScale(); this.requestRender(); this.events.emit(\"autoScale\", undefined); },\n onToggleLegend: (visible) => { this.showLegend = visible; if (this.legend) this.legend.setVisible(visible); }\n });\n }\n\n private initLegend(options: ChartOptions): void {\n if (!this.showLegend) return;\n this.legend = new ChartLegend(this.container, this.theme, options.legendPosition || {}, {\n onMove: (x, y) => this.events.emit(\"legendMove\", { x, y })\n });\n this.legend.update(this.getAllSeries());\n }\n\n setTheme(theme: string | ChartTheme): void {\n this.theme = typeof theme === \"string\" ? getThemeByName(theme) : theme;\n const bgColor = parseColor(this.theme.backgroundColor);\n this.backgroundColor = [bgColor[0], bgColor[1], bgColor[2], bgColor[3]];\n this.container.style.backgroundColor = this.theme.backgroundColor;\n this.overlay.setTheme(this.theme);\n this.requestRender();\n }\n\n getPlotArea() { return getPlotArea(this.container, this.yAxisOptionsMap as any); }\n private getInteractedBounds(axisId?: string): Bounds {\n if (axisId) {\n const scale = this.yScales.get(axisId);\n if (scale) return { ...this.viewBounds, yMin: scale.domain[0], yMax: scale.domain[1] };\n }\n return this.viewBounds;\n }\n\n exportImage(type: \"png\" | \"jpeg\" = \"png\"): string {\n return exportToImage(this.webglCanvas, this.overlayCanvas, this.backgroundColor, this.legend, this.showLegend, this.dpr, type);\n }\n\n // Series Management (delegates to ChartSeries)\n private getSeriesContext() {\n return {\n series: this.series,\n renderer: this.renderer,\n viewBounds: this.viewBounds,\n autoScale: () => this.autoScale(),\n requestRender: () => this.requestRender(),\n addAnnotation: (a: Annotation) => this.addAnnotation(a),\n xAxisOptions: this.xAxisOptions,\n yAxisOptionsMap: this.yAxisOptionsMap,\n autoScrollEnabled: this.autoScroll,\n addSeries: (o: SeriesOptions) => this.addSeries(o),\n updateLegend: () => { if (this.legend) this.legend.update(this.getAllSeries()); }\n };\n }\n\n addSeries(options: SeriesOptions): void { addSeriesImpl(this.getSeriesContext(), options); }\n removeSeries(id: string): void { removeSeriesImpl(this.getSeriesContext(), id); }\n updateSeries(id: string, data: SeriesUpdateData): void { updateSeriesImpl(this.getSeriesContext(), id, data); }\n appendData(id: string, x: number[] | Float32Array, y: number[] | Float32Array): void {\n appendDataImpl(this.getSeriesContext(), id, x, y);\n }\n setAutoScroll(enabled: boolean): void { this.autoScroll = enabled; }\n setMaxPoints(id: string, maxPoints: number): void { setMaxPointsImpl(this.getSeriesContext(), id, maxPoints); }\n addFitLine(seriesId: string, type: FitType, options: FitOptions = {}): string {\n return addFitLineImpl(this.getSeriesContext(), seriesId, type, options);\n }\n getSeries(id: string): Series | undefined { return this.series.get(id); }\n getAllSeries(): Series[] { return Array.from(this.series.values()); }\n\n // Navigation (delegates to ChartNavigation)\n private getNavContext() {\n return {\n viewBounds: this.viewBounds, yScales: this.yScales, yAxisOptionsMap: this.yAxisOptionsMap,\n xAxisOptions: this.xAxisOptions, primaryYAxisId: this.primaryYAxisId,\n getPlotArea: () => this.getPlotArea(), events: this.events,\n requestRender: () => this.requestRender(), series: this.series as any\n };\n }\n\n zoom(options: ZoomOptions): void { applyZoom(this.getNavContext(), options); }\n pan(deltaX: number, deltaY: number, axisId?: string): void { applyPan(this.getNavContext(), deltaX, deltaY, axisId); }\n resetZoom(): void {\n this.autoScale();\n this.events.emit(\"zoom\", { x: [this.viewBounds.xMin, this.viewBounds.xMax], y: [this.viewBounds.yMin, this.viewBounds.yMax] });\n this.requestRender();\n }\n getViewBounds(): Bounds { return { ...this.viewBounds }; }\n autoScale(): void { autoScaleAll(this.getNavContext()); }\n private handleBoxZoom(rect: { x: number; y: number; width: number; height: number } | null): void {\n this.selectionRect = handleBoxZoom(this.getNavContext(), rect, this.selectionRect, (o) => this.zoom(o));\n this.requestRender();\n }\n\n // Cursor\n enableCursor(options: CursorOptions): void { this.cursorOptions = { enabled: true, ...options }; }\n disableCursor(): void { this.cursorOptions = null; this.cursorPosition = null; this.requestRender(); }\n\n // Annotations\n addAnnotation(annotation: Annotation): string { const id = this.annotationManager.add(annotation); this.requestRender(); return id; }\n removeAnnotation(id: string): boolean { const result = this.annotationManager.remove(id); this.requestRender(); return result; }\n updateAnnotation(id: string, updates: Partial<Annotation>): void { this.annotationManager.update(id, updates); this.requestRender(); }\n getAnnotation(id: string): Annotation | undefined { return this.annotationManager.get(id); }\n getAnnotations(): Annotation[] { return this.annotationManager.getAll(); }\n clearAnnotations(): void { this.annotationManager.clear(); this.requestRender(); }\n\n // Export\n exportCSV(options?: ExportOptions): string { return exportToCSV(this.getAllSeries(), options); }\n exportJSON(options?: ExportOptions): string { return exportToJSON(this.getAllSeries(), this.viewBounds, options); }\n\n // Rendering\n resize(): void {\n if (!resizeCanvases(this.container, this.webglCanvas, this.overlayCanvas, this.overlayCtx, this.dpr)) return;\n this.renderer.resize();\n this.requestRender();\n }\n\n requestRender(): void { this.needsRender = true; }\n\n render(): void {\n if (this.isDestroyed) return;\n const start = performance.now();\n const plotArea = this.getPlotArea();\n if (this.webglCanvas.width === 0 || this.webglCanvas.height === 0) return;\n\n const ctx = {\n webglCanvas: this.webglCanvas, overlayCanvas: this.overlayCanvas, overlayCtx: this.overlayCtx,\n container: this.container, series: this.series, viewBounds: this.viewBounds,\n xScale: this.xScale, yScales: this.yScales, yAxisOptionsMap: this.yAxisOptionsMap as any,\n xAxisOptions: this.xAxisOptions as any, primaryYAxisId: this.primaryYAxisId,\n renderer: this.renderer, overlay: this.overlay, annotationManager: this.annotationManager,\n backgroundColor: this.backgroundColor, cursorOptions: this.cursorOptions, cursorPosition: this.cursorPosition,\n selectionRect: this.selectionRect, stats: this.stats, showStatistics: this.showStatistics,\n events: this.events, updateSeriesBuffer: (s: Series) => updateSeriesBuffer(this.getSeriesContext(), s),\n getPlotArea: () => plotArea, pixelToDataX: (px: number) => this.pixelToDataX(px), pixelToDataY: (py: number) => this.pixelToDataY(py)\n };\n\n const seriesData = prepareSeriesData(ctx, plotArea);\n this.renderer.render(seriesData, { bounds: this.viewBounds, backgroundColor: this.backgroundColor, plotArea });\n renderOverlay(ctx, plotArea, this.yScale);\n\n this.events.emit(\"render\", { fps: 1000 / (performance.now() - start), frameTime: performance.now() - start });\n }\n\n private pixelToDataX(px: number): number {\n const pa = this.getPlotArea();\n return this.viewBounds.xMin + ((px - pa.x) / pa.width) * (this.viewBounds.xMax - this.viewBounds.xMin);\n }\n\n private pixelToDataY(py: number): number {\n const pa = this.getPlotArea();\n return this.viewBounds.yMin + (1 - (py - pa.y) / pa.height) * (this.viewBounds.yMax - this.viewBounds.yMin);\n }\n\n private startRenderLoop(): void {\n const loop = () => {\n if (this.isDestroyed) return;\n if (this.needsRender) { this.render(); this.needsRender = false; }\n this.animationFrameId = requestAnimationFrame(loop);\n };\n this.animationFrameId = requestAnimationFrame(loop);\n }\n\n on<K extends keyof ChartEventMap>(e: K, h: (d: ChartEventMap[K]) => void): void { this.events.on(e, h); }\n off<K extends keyof ChartEventMap>(e: K, h: (d: ChartEventMap[K]) => void): void { this.events.off(e, h); }\n\n destroy(): void {\n this.isDestroyed = true;\n if (this.animationFrameId) cancelAnimationFrame(this.animationFrameId);\n this.interaction.destroy();\n this.series.forEach((s) => { this.renderer.deleteBuffer(s.getId()); s.destroy(); });\n this.series.clear();\n this.renderer.destroy();\n if (this.controls) this.controls.destroy();\n if (this.legend) this.legend.destroy();\n while (this.container.firstChild) this.container.removeChild(this.container.firstChild);\n console.log(\"[SciChart] Destroyed\");\n }\n}\n\nexport function createChart(options: ChartOptions): Chart {\n return new ChartImpl(options);\n}\n","/**\n * WebGL Renderer Interface & Factory\n *\n * This module provides a common interface for WebGL rendering.\n * Currently optimized for NativeWebGLRenderer (zero dependencies).\n */\n\nimport type { Bounds, SeriesStyle } from '../types';\nimport { NativeWebGLRenderer } from './NativeWebGLRenderer';\n\n// ============================================\n// Common Types\n// ============================================\n\nexport interface SeriesRenderData {\n id: string;\n buffer: WebGLBuffer;\n count: number;\n style: SeriesStyle;\n visible: boolean;\n type: 'line' | 'scatter';\n}\n\nexport interface RenderOptions {\n bounds: Bounds;\n backgroundColor?: [number, number, number, number];\n}\n\n// ============================================\n// Renderer Interface\n// ============================================\n\n/**\n * Common interface for all WebGL renderer implementations\n */\nexport interface IWebGLRenderer {\n /** Check if WebGL is available and initialized */\n readonly available: boolean;\n\n /**\n * Create or update a GPU buffer with interleaved X,Y data\n * @param id - Unique buffer identifier\n * @param data - Interleaved Float32Array [x0, y0, x1, y1, ...]\n */\n createBuffer(id: string, data: Float32Array): void;\n\n /**\n * Get a buffer by ID\n */\n getBuffer(id: string): WebGLBuffer | undefined;\n\n /**\n * Delete a buffer and free GPU memory\n */\n deleteBuffer(id: string): void;\n\n /**\n * Render a frame with all visible series\n */\n render(series: SeriesRenderData[], options: RenderOptions): void;\n\n /**\n * Handle canvas resize\n */\n resize(): void;\n\n /**\n * Get WebGL capabilities/limits\n */\n getLimits(): Record<string, unknown>;\n\n /**\n * Cleanup and destroy all GPU resources\n */\n destroy(): void;\n}\n\n// ============================================\n// Factory Functions\n// ============================================\n\n/**\n * Create a WebGL renderer (Native WebGL)\n *\n * @param canvas - Target canvas element\n */\nexport function createRenderer(canvas: HTMLCanvasElement): IWebGLRenderer {\n return new NativeWebGLRenderer(canvas);\n}\n\n/**\n * Create a renderer synchronously (native only)\n */\nexport { NativeWebGLRenderer as createNativeRenderer } from './NativeWebGLRenderer';\n","/**\n * LTTB (Largest-Triangle-Three-Buckets) Downsampling Algorithm\n *\n * This algorithm downsamples time-series data while preserving visual features.\n * It's much better than naive sampling for preserving peaks and valleys.\n *\n * Reference: https://skemman.is/bitstream/1946/15343/3/SS_MSthesis.pdf\n */\n\nexport interface DownsampleResult {\n x: Float32Array;\n y: Float32Array;\n /** Original indices of selected points */\n indices: Uint32Array;\n}\n\n/**\n * Downsample data using LTTB algorithm\n *\n * @param x - X values (e.g., potential)\n * @param y - Y values (e.g., current)\n * @param targetPoints - Number of output points\n * @returns Downsampled data\n */\nexport function lttbDownsample(\n x: Float32Array | Float64Array,\n y: Float32Array | Float64Array,\n targetPoints: number\n): DownsampleResult {\n const length = x.length;\n\n // No need to downsample\n if (targetPoints >= length || targetPoints <= 2) {\n return {\n x: new Float32Array(x),\n y: new Float32Array(y),\n indices: new Uint32Array(Array.from({ length }, (_, i) => i)),\n };\n }\n\n const outX = new Float32Array(targetPoints);\n const outY = new Float32Array(targetPoints);\n const outIndices = new Uint32Array(targetPoints);\n\n // Always include first point\n outX[0] = x[0];\n outY[0] = y[0];\n outIndices[0] = 0;\n\n // Bucket size\n const bucketSize = (length - 2) / (targetPoints - 2);\n\n let a = 0; // Previous selected point index\n let outIdx = 1;\n\n for (let i = 0; i < targetPoints - 2; i++) {\n // Calculate bucket boundaries\n const bucketStart = Math.floor((i + 1) * bucketSize) + 1;\n const bucketEnd = Math.floor((i + 2) * bucketSize) + 1;\n\n // Calculate average point of next bucket\n const nextBucketStart = Math.min(bucketEnd, length - 1);\n const nextBucketEnd = Math.min(\n Math.floor((i + 3) * bucketSize) + 1,\n length\n );\n\n let avgX = 0;\n let avgY = 0;\n let avgCount = 0;\n\n for (let j = nextBucketStart; j < nextBucketEnd; j++) {\n avgX += x[j];\n avgY += y[j];\n avgCount++;\n }\n\n if (avgCount > 0) {\n avgX /= avgCount;\n avgY /= avgCount;\n }\n\n // Find point in current bucket with largest triangle area\n let maxArea = -1;\n let maxIndex = bucketStart;\n\n const aX = x[a];\n const aY = y[a];\n\n for (let j = bucketStart; j < bucketEnd && j < length; j++) {\n // Calculate triangle area (simplified: |x1(y2-y3) + x2(y3-y1) + x3(y1-y2)| / 2)\n const area = Math.abs(\n (aX - avgX) * (y[j] - aY) - (aX - x[j]) * (avgY - aY)\n );\n\n if (area > maxArea) {\n maxArea = area;\n maxIndex = j;\n }\n }\n\n // Store selected point\n outX[outIdx] = x[maxIndex];\n outY[outIdx] = y[maxIndex];\n outIndices[outIdx] = maxIndex;\n\n a = maxIndex;\n outIdx++;\n }\n\n // Always include last point\n outX[targetPoints - 1] = x[length - 1];\n outY[targetPoints - 1] = y[length - 1];\n outIndices[targetPoints - 1] = length - 1;\n\n return { x: outX, y: outY, indices: outIndices };\n}\n\n/**\n * Min-Max per bucket downsampling\n *\n * Simpler alternative to LTTB that preserves extremes in each bucket.\n * Uses 2 points per bucket (min and max), so output is ~2x target.\n */\nexport function minMaxDownsample(\n x: Float32Array | Float64Array,\n y: Float32Array | Float64Array,\n bucketCount: number\n): DownsampleResult {\n const length = x.length;\n\n if (bucketCount >= length / 2) {\n return {\n x: new Float32Array(x),\n y: new Float32Array(y),\n indices: new Uint32Array(Array.from({ length }, (_, i) => i)),\n };\n }\n\n const bucketSize = length / bucketCount;\n const outX: number[] = [];\n const outY: number[] = [];\n const outIndices: number[] = [];\n\n for (let b = 0; b < bucketCount; b++) {\n const start = Math.floor(b * bucketSize);\n const end = Math.floor((b + 1) * bucketSize);\n\n let minY = Infinity;\n let maxY = -Infinity;\n let minIdx = start;\n let maxIdx = start;\n\n for (let i = start; i < end && i < length; i++) {\n if (y[i] < minY) {\n minY = y[i];\n minIdx = i;\n }\n if (y[i] > maxY) {\n maxY = y[i];\n maxIdx = i;\n }\n }\n\n // Add points in order (min first if it comes before max)\n if (minIdx <= maxIdx) {\n outX.push(x[minIdx], x[maxIdx]);\n outY.push(y[minIdx], y[maxIdx]);\n outIndices.push(minIdx, maxIdx);\n } else {\n outX.push(x[maxIdx], x[minIdx]);\n outY.push(y[maxIdx], y[minIdx]);\n outIndices.push(maxIdx, minIdx);\n }\n }\n\n return {\n x: new Float32Array(outX),\n y: new Float32Array(outY),\n indices: new Uint32Array(outIndices),\n };\n}\n\n/**\n * Calculate optimal target points based on canvas width\n */\nexport function calculateTargetPoints(\n dataLength: number,\n canvasWidth: number,\n pointsPerPixel = 2\n): number {\n // Never draw more than pointsPerPixel per pixel\n const maxPoints = canvasWidth * pointsPerPixel;\n return Math.min(dataLength, maxPoints);\n}\n","/**\n * @license React\n * react-jsx-runtime.production.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\"use strict\";\nvar REACT_ELEMENT_TYPE = Symbol.for(\"react.transitional.element\"),\n REACT_FRAGMENT_TYPE = Symbol.for(\"react.fragment\");\nfunction jsxProd(type, config, maybeKey) {\n var key = null;\n void 0 !== maybeKey && (key = \"\" + maybeKey);\n void 0 !== config.key && (key = \"\" + config.key);\n if (\"key\" in config) {\n maybeKey = {};\n for (var propName in config)\n \"key\" !== propName && (maybeKey[propName] = config[propName]);\n } else maybeKey = config;\n config = maybeKey.ref;\n return {\n $$typeof: REACT_ELEMENT_TYPE,\n type: type,\n key: key,\n ref: void 0 !== config ? config : null,\n props: maybeKey\n };\n}\nexports.Fragment = REACT_FRAGMENT_TYPE;\nexports.jsx = jsxProd;\nexports.jsxs = jsxProd;\n","/**\n * @license React\n * react-jsx-runtime.development.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\"use strict\";\n\"production\" !== process.env.NODE_ENV &&\n (function () {\n function getComponentNameFromType(type) {\n if (null == type) return null;\n if (\"function\" === typeof type)\n return type.$$typeof === REACT_CLIENT_REFERENCE\n ? null\n : type.displayName || type.name || null;\n if (\"string\" === typeof type) return type;\n switch (type) {\n case REACT_FRAGMENT_TYPE:\n return \"Fragment\";\n case REACT_PROFILER_TYPE:\n return \"Profiler\";\n case REACT_STRICT_MODE_TYPE:\n return \"StrictMode\";\n case REACT_SUSPENSE_TYPE:\n return \"Suspense\";\n case REACT_SUSPENSE_LIST_TYPE:\n return \"SuspenseList\";\n case REACT_ACTIVITY_TYPE:\n return \"Activity\";\n }\n if (\"object\" === typeof type)\n switch (\n (\"number\" === typeof type.tag &&\n console.error(\n \"Received an unexpected object in getComponentNameFromType(). This is likely a bug in React. Please file an issue.\"\n ),\n type.$$typeof)\n ) {\n case REACT_PORTAL_TYPE:\n return \"Portal\";\n case REACT_CONTEXT_TYPE:\n return type.displayName || \"Context\";\n case REACT_CONSUMER_TYPE:\n return (type._context.displayName || \"Context\") + \".Consumer\";\n case REACT_FORWARD_REF_TYPE:\n var innerType = type.render;\n type = type.displayName;\n type ||\n ((type = innerType.displayName || innerType.name || \"\"),\n (type = \"\" !== type ? \"ForwardRef(\" + type + \")\" : \"ForwardRef\"));\n return type;\n case REACT_MEMO_TYPE:\n return (\n (innerType = type.displayName || null),\n null !== innerType\n ? innerType\n : getComponentNameFromType(type.type) || \"Memo\"\n );\n case REACT_LAZY_TYPE:\n innerType = type._payload;\n type = type._init;\n try {\n return getComponentNameFromType(type(innerType));\n } catch (x) {}\n }\n return null;\n }\n function testStringCoercion(value) {\n return \"\" + value;\n }\n function checkKeyStringCoercion(value) {\n try {\n testStringCoercion(value);\n var JSCompiler_inline_result = !1;\n } catch (e) {\n JSCompiler_inline_result = !0;\n }\n if (JSCompiler_inline_result) {\n JSCompiler_inline_result = console;\n var JSCompiler_temp_const = JSCompiler_inline_result.error;\n var JSCompiler_inline_result$jscomp$0 =\n (\"function\" === typeof Symbol &&\n Symbol.toStringTag &&\n value[Symbol.toStringTag]) ||\n value.constructor.name ||\n \"Object\";\n JSCompiler_temp_const.call(\n JSCompiler_inline_result,\n \"The provided key is an unsupported type %s. This value must be coerced to a string before using it here.\",\n JSCompiler_inline_result$jscomp$0\n );\n return testStringCoercion(value);\n }\n }\n function getTaskName(type) {\n if (type === REACT_FRAGMENT_TYPE) return \"<>\";\n if (\n \"object\" === typeof type &&\n null !== type &&\n type.$$typeof === REACT_LAZY_TYPE\n )\n return \"<...>\";\n try {\n var name = getComponentNameFromType(type);\n return name ? \"<\" + name + \">\" : \"<...>\";\n } catch (x) {\n return \"<...>\";\n }\n }\n function getOwner() {\n var dispatcher = ReactSharedInternals.A;\n return null === dispatcher ? null : dispatcher.getOwner();\n }\n function UnknownOwner() {\n return Error(\"react-stack-top-frame\");\n }\n function hasValidKey(config) {\n if (hasOwnProperty.call(config, \"key\")) {\n var getter = Object.getOwnPropertyDescriptor(config, \"key\").get;\n if (getter && getter.isReactWarning) return !1;\n }\n return void 0 !== config.key;\n }\n function defineKeyPropWarningGetter(props, displayName) {\n function warnAboutAccessingKey() {\n specialPropKeyWarningShown ||\n ((specialPropKeyWarningShown = !0),\n console.error(\n \"%s: `key` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://react.dev/link/special-props)\",\n displayName\n ));\n }\n warnAboutAccessingKey.isReactWarning = !0;\n Object.defineProperty(props, \"key\", {\n get: warnAboutAccessingKey,\n configurable: !0\n });\n }\n function elementRefGetterWithDeprecationWarning() {\n var componentName = getComponentNameFromType(this.type);\n didWarnAboutElementRef[componentName] ||\n ((didWarnAboutElementRef[componentName] = !0),\n console.error(\n \"Accessing element.ref was removed in React 19. ref is now a regular prop. It will be removed from the JSX Element type in a future release.\"\n ));\n componentName = this.props.ref;\n return void 0 !== componentName ? componentName : null;\n }\n function ReactElement(type, key, props, owner, debugStack, debugTask) {\n var refProp = props.ref;\n type = {\n $$typeof: REACT_ELEMENT_TYPE,\n type: type,\n key: key,\n props: props,\n _owner: owner\n };\n null !== (void 0 !== refProp ? refProp : null)\n ? Object.defineProperty(type, \"ref\", {\n enumerable: !1,\n get: elementRefGetterWithDeprecationWarning\n })\n : Object.defineProperty(type, \"ref\", { enumerable: !1, value: null });\n type._store = {};\n Object.defineProperty(type._store, \"validated\", {\n configurable: !1,\n enumerable: !1,\n writable: !0,\n value: 0\n });\n Object.defineProperty(type, \"_debugInfo\", {\n configurable: !1,\n enumerable: !1,\n writable: !0,\n value: null\n });\n Object.defineProperty(type, \"_debugStack\", {\n configurable: !1,\n enumerable: !1,\n writable: !0,\n value: debugStack\n });\n Object.defineProperty(type, \"_debugTask\", {\n configurable: !1,\n enumerable: !1,\n writable: !0,\n value: debugTask\n });\n Object.freeze && (Object.freeze(type.props), Object.freeze(type));\n return type;\n }\n function jsxDEVImpl(\n type,\n config,\n maybeKey,\n isStaticChildren,\n debugStack,\n debugTask\n ) {\n var children = config.children;\n if (void 0 !== children)\n if (isStaticChildren)\n if (isArrayImpl(children)) {\n for (\n isStaticChildren = 0;\n isStaticChildren < children.length;\n isStaticChildren++\n )\n validateChildKeys(children[isStaticChildren]);\n Object.freeze && Object.freeze(children);\n } else\n console.error(\n \"React.jsx: Static children should always be an array. You are likely explicitly calling React.jsxs or React.jsxDEV. Use the Babel transform instead.\"\n );\n else validateChildKeys(children);\n if (hasOwnProperty.call(config, \"key\")) {\n children = getComponentNameFromType(type);\n var keys = Object.keys(config).filter(function (k) {\n return \"key\" !== k;\n });\n isStaticChildren =\n 0 < keys.length\n ? \"{key: someKey, \" + keys.join(\": ..., \") + \": ...}\"\n : \"{key: someKey}\";\n didWarnAboutKeySpread[children + isStaticChildren] ||\n ((keys =\n 0 < keys.length ? \"{\" + keys.join(\": ..., \") + \": ...}\" : \"{}\"),\n console.error(\n 'A props object containing a \"key\" prop is being spread into JSX:\\n let props = %s;\\n <%s {...props} />\\nReact keys must be passed directly to JSX without using spread:\\n let props = %s;\\n <%s key={someKey} {...props} />',\n isStaticChildren,\n children,\n keys,\n children\n ),\n (didWarnAboutKeySpread[children + isStaticChildren] = !0));\n }\n children = null;\n void 0 !== maybeKey &&\n (checkKeyStringCoercion(maybeKey), (children = \"\" + maybeKey));\n hasValidKey(config) &&\n (checkKeyStringCoercion(config.key), (children = \"\" + config.key));\n if (\"key\" in config) {\n maybeKey = {};\n for (var propName in config)\n \"key\" !== propName && (maybeKey[propName] = config[propName]);\n } else maybeKey = config;\n children &&\n defineKeyPropWarningGetter(\n maybeKey,\n \"function\" === typeof type\n ? type.displayName || type.name || \"Unknown\"\n : type\n );\n return ReactElement(\n type,\n children,\n maybeKey,\n getOwner(),\n debugStack,\n debugTask\n );\n }\n function validateChildKeys(node) {\n isValidElement(node)\n ? node._store && (node._store.validated = 1)\n : \"object\" === typeof node &&\n null !== node &&\n node.$$typeof === REACT_LAZY_TYPE &&\n (\"fulfilled\" === node._payload.status\n ? isValidElement(node._payload.value) &&\n node._payload.value._store &&\n (node._payload.value._store.validated = 1)\n : node._store && (node._store.validated = 1));\n }\n function isValidElement(object) {\n return (\n \"object\" === typeof object &&\n null !== object &&\n object.$$typeof === REACT_ELEMENT_TYPE\n );\n }\n var React = require(\"react\"),\n REACT_ELEMENT_TYPE = Symbol.for(\"react.transitional.element\"),\n REACT_PORTAL_TYPE = Symbol.for(\"react.portal\"),\n REACT_FRAGMENT_TYPE = Symbol.for(\"react.fragment\"),\n REACT_STRICT_MODE_TYPE = Symbol.for(\"react.strict_mode\"),\n REACT_PROFILER_TYPE = Symbol.for(\"react.profiler\"),\n REACT_CONSUMER_TYPE = Symbol.for(\"react.consumer\"),\n REACT_CONTEXT_TYPE = Symbol.for(\"react.context\"),\n REACT_FORWARD_REF_TYPE = Symbol.for(\"react.forward_ref\"),\n REACT_SUSPENSE_TYPE = Symbol.for(\"react.suspense\"),\n REACT_SUSPENSE_LIST_TYPE = Symbol.for(\"react.suspense_list\"),\n REACT_MEMO_TYPE = Symbol.for(\"react.memo\"),\n REACT_LAZY_TYPE = Symbol.for(\"react.lazy\"),\n REACT_ACTIVITY_TYPE = Symbol.for(\"react.activity\"),\n REACT_CLIENT_REFERENCE = Symbol.for(\"react.client.reference\"),\n ReactSharedInternals =\n React.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE,\n hasOwnProperty = Object.prototype.hasOwnProperty,\n isArrayImpl = Array.isArray,\n createTask = console.createTask\n ? console.createTask\n : function () {\n return null;\n };\n React = {\n react_stack_bottom_frame: function (callStackForError) {\n return callStackForError();\n }\n };\n var specialPropKeyWarningShown;\n var didWarnAboutElementRef = {};\n var unknownOwnerDebugStack = React.react_stack_bottom_frame.bind(\n React,\n UnknownOwner\n )();\n var unknownOwnerDebugTask = createTask(getTaskName(UnknownOwner));\n var didWarnAboutKeySpread = {};\n exports.Fragment = REACT_FRAGMENT_TYPE;\n exports.jsx = function (type, config, maybeKey) {\n var trackActualOwner =\n 1e4 > ReactSharedInternals.recentlyCreatedOwnerStacks++;\n return jsxDEVImpl(\n type,\n config,\n maybeKey,\n !1,\n trackActualOwner\n ? Error(\"react-stack-top-frame\")\n : unknownOwnerDebugStack,\n trackActualOwner ? createTask(getTaskName(type)) : unknownOwnerDebugTask\n );\n };\n exports.jsxs = function (type, config, maybeKey) {\n var trackActualOwner =\n 1e4 > ReactSharedInternals.recentlyCreatedOwnerStacks++;\n return jsxDEVImpl(\n type,\n config,\n maybeKey,\n !0,\n trackActualOwner\n ? Error(\"react-stack-top-frame\")\n : unknownOwnerDebugStack,\n trackActualOwner ? createTask(getTaskName(type)) : unknownOwnerDebugTask\n );\n };\n })();\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('./cjs/react-jsx-runtime.production.js');\n} else {\n module.exports = require('./cjs/react-jsx-runtime.development.js');\n}\n","/**\n * useSciChart - React hook for SciChart Engine\n *\n * Manages chart lifecycle and provides a clean React API.\n */\n\nimport {\n useEffect,\n useRef,\n useState,\n useCallback,\n type RefObject,\n} from \"react\";\nimport { createChart, type Chart, type ChartOptions } from \"../core/Chart\";\nimport type {\n SeriesOptions,\n SeriesUpdateData,\n ZoomOptions,\n Bounds,\n} from \"../types\";\n\nexport interface UseSciChartOptions extends Omit<ChartOptions, \"container\"> {\n /** Auto-resize on container changes */\n autoResize?: boolean;\n}\n\nexport interface UseSciChartReturn {\n /** Chart instance (null until initialized) */\n chart: Chart | null;\n /** Whether the chart is ready */\n isReady: boolean;\n /** Error during initialization */\n error: Error | null;\n /** Current view bounds */\n bounds: Bounds | null;\n /** Add a series */\n addSeries: (options: SeriesOptions) => void;\n /** Update series data */\n updateSeries: (id: string, data: SeriesUpdateData) => void;\n /** Remove a series */\n removeSeries: (id: string) => void;\n /** Set zoom range */\n zoom: (options: ZoomOptions) => void;\n /** Reset zoom to show all data */\n resetZoom: () => void;\n}\n\n/**\n * React hook for using SciChart Engine\n *\n * @example\n * ```tsx\n * function MyChart() {\n * const canvasRef = useRef<HTMLCanvasElement>(null);\n * const { chart, isReady, addSeries, zoom } = useSciChart(canvasRef, {\n * xAxis: { label: 'E / V' },\n * yAxis: { label: 'I / A' }\n * });\n *\n * useEffect(() => {\n * if (isReady) {\n * addSeries({\n * id: 'cv-1',\n * type: 'line',\n * data: { x: xData, y: yData },\n * style: { color: '#ff0055' }\n * });\n * }\n * }, [isReady]);\n *\n * return <canvas ref={canvasRef} />;\n * }\n * ```\n */\nexport function useSciChart(\n containerRef: RefObject<HTMLDivElement>,\n options: UseSciChartOptions = {}\n): UseSciChartReturn {\n const [chart, setChart] = useState<Chart | null>(null);\n const [isReady, setIsReady] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const [bounds, setBounds] = useState<Bounds | null>(null);\n\n // Store options in ref to avoid re-creating chart on every render\n const optionsRef = useRef(options);\n optionsRef.current = options;\n\n // Initialize chart\n useEffect(() => {\n const container = containerRef.current;\n if (!container) return;\n\n try {\n const chartInstance = createChart({\n ...optionsRef.current,\n container,\n });\n\n // Listen to zoom events to update bounds\n chartInstance.on(\"zoom\", () => {\n setBounds(chartInstance.getViewBounds());\n });\n\n setChart(chartInstance);\n setIsReady(true);\n setBounds(chartInstance.getViewBounds());\n setError(null);\n\n console.log(\"[useSciChart] Chart initialized\");\n } catch (err) {\n console.error(\"[useSciChart] Failed to initialize chart:\", err);\n setError(err instanceof Error ? err : new Error(String(err)));\n setIsReady(false);\n }\n\n return () => {\n if (chart) {\n chart.destroy();\n setChart(null);\n setIsReady(false);\n }\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [containerRef]);\n\n // Memoized methods\n const addSeries = useCallback(\n (seriesOptions: SeriesOptions) => {\n if (chart) {\n chart.addSeries(seriesOptions);\n setBounds(chart.getViewBounds());\n }\n },\n [chart]\n );\n\n const updateSeries = useCallback(\n (id: string, data: SeriesUpdateData) => {\n if (chart) {\n chart.updateSeries(id, data);\n }\n },\n [chart]\n );\n\n const removeSeries = useCallback(\n (id: string) => {\n if (chart) {\n chart.removeSeries(id);\n }\n },\n [chart]\n );\n\n const zoom = useCallback(\n (zoomOptions: ZoomOptions) => {\n if (chart) {\n chart.zoom(zoomOptions);\n }\n },\n [chart]\n );\n\n const resetZoom = useCallback(() => {\n if (chart) {\n chart.resetZoom();\n setBounds(chart.getViewBounds());\n }\n }, [chart]);\n\n return {\n chart,\n isReady,\n error,\n bounds,\n addSeries,\n updateSeries,\n removeSeries,\n zoom,\n resetZoom,\n };\n}\n","/**\n * SciChart - React Component for Scientific Charts\n *\n * A declarative React component that wraps the SciChart Engine.\n */\n\nimport {\n useRef,\n useEffect,\n useImperativeHandle,\n forwardRef,\n useMemo,\n type CSSProperties,\n} from \"react\";\nimport { useSciChart, type UseSciChartOptions } from \"./useSciChart\";\nimport type {\n SeriesOptions,\n ZoomOptions,\n CursorOptions,\n Bounds,\n} from \"../types\";\nimport type { Chart } from \"../core/Chart\";\n\n// ============================================\n// Types\n// ============================================\n\nexport interface SciChartSeries {\n id: string;\n x: Float32Array | Float64Array;\n y: Float32Array | Float64Array;\n color?: string;\n width?: number;\n visible?: boolean;\n}\n\nexport interface SciChartProps extends UseSciChartOptions {\n /** Series data to display */\n series?: SciChartSeries[];\n /** Zoom state (controlled) */\n zoom?: ZoomOptions;\n /** Callback when zoom changes */\n onZoomChange?: (bounds: Bounds) => void;\n /** Cursor configuration */\n cursor?: CursorOptions;\n /** Container width */\n width?: number | string;\n /** Container height */\n height?: number | string;\n /** Additional class name */\n className?: string;\n /** Additional styles */\n style?: CSSProperties;\n /** Debug mode - shows FPS counter */\n debug?: boolean;\n}\n\nexport interface SciChartRef {\n /** Get the chart instance */\n getChart: () => Chart | null;\n /** Reset zoom to show all data */\n resetZoom: () => void;\n /** Get current bounds */\n getBounds: () => Bounds | null;\n}\n\n// ============================================\n// Component\n// ============================================\n\n/**\n * SciChart React Component\n *\n * @example\n * ```tsx\n * <SciChart\n * series={[\n * { id: 'cv-1', x: potentialData, y: currentData, color: '#ff0055' }\n * ]}\n * xAxis={{ label: 'E / V' }}\n * yAxis={{ label: 'I / A' }}\n * height={400}\n * cursor={{ enabled: true, snap: true }}\n * onZoomChange={(bounds) => console.log('Zoom:', bounds)}\n * />\n * ```\n */\nexport const SciChart = forwardRef<SciChartRef, SciChartProps>(\n function SciChart(\n {\n series = [],\n zoom: zoomProp,\n onZoomChange,\n cursor,\n width = \"100%\",\n height = 400,\n className = \"\",\n style = {},\n debug = false,\n ...chartOptions\n },\n ref\n ) {\n const containerRef = useRef<HTMLDivElement>(null);\n const previousSeriesRef = useRef<Map<string, SciChartSeries>>(new Map());\n\n const {\n chart,\n isReady,\n bounds,\n addSeries,\n updateSeries,\n removeSeries,\n resetZoom,\n } = useSciChart(containerRef, chartOptions);\n\n // Expose methods via ref\n useImperativeHandle(\n ref,\n () => ({\n getChart: () => chart,\n resetZoom,\n getBounds: () => bounds,\n }),\n [chart, resetZoom, bounds]\n );\n\n // Handle series changes\n useEffect(() => {\n if (!isReady || !chart) return;\n\n const currentSeriesMap = new Map(series.map((s) => [s.id, s]));\n const previousSeriesMap = previousSeriesRef.current;\n\n // Remove series that no longer exist\n previousSeriesMap.forEach((_, id) => {\n if (!currentSeriesMap.has(id)) {\n removeSeries(id);\n }\n });\n\n // Add or update series\n currentSeriesMap.forEach((seriesData, id) => {\n const prevSeries = previousSeriesMap.get(id);\n\n if (!prevSeries) {\n // New series - add it\n const options: SeriesOptions = {\n id: seriesData.id,\n type: \"line\",\n data: { x: seriesData.x, y: seriesData.y },\n style: {\n color: seriesData.color ?? \"#ff0055\",\n width: seriesData.width ?? 1.5,\n },\n visible: seriesData.visible ?? true,\n };\n addSeries(options);\n // Force an initial autoscale if it's the first series\n if (currentSeriesMap.size === 1) {\n chart.autoScale();\n }\n } else if (\n prevSeries.x !== seriesData.x ||\n prevSeries.y !== seriesData.y\n ) {\n // Data changed - update\n updateSeries(id, {\n x: seriesData.x,\n y: seriesData.y,\n });\n }\n });\n\n previousSeriesRef.current = currentSeriesMap;\n }, [series, isReady, chart, addSeries, updateSeries, removeSeries]);\n\n // Handle controlled zoom\n useEffect(() => {\n if (!isReady || !chart || !zoomProp) return;\n chart.zoom(zoomProp);\n }, [isReady, chart, zoomProp]);\n\n // Handle zoom change callback\n useEffect(() => {\n if (!isReady || !chart || !onZoomChange) return;\n\n chart.on(\"zoom\", (event) => {\n onZoomChange({\n xMin: event.x[0],\n xMax: event.x[1],\n yMin: event.y[0],\n yMax: event.y[1],\n });\n });\n }, [isReady, chart, onZoomChange]);\n\n // Handle cursor\n useEffect(() => {\n if (!isReady || !chart) return;\n\n if (cursor?.enabled) {\n chart.enableCursor(cursor);\n } else {\n chart.disableCursor();\n }\n }, [isReady, chart, cursor]);\n\n // Container styles\n const containerStyle = useMemo<CSSProperties>(\n () => ({\n position: \"relative\",\n width: typeof width === \"number\" ? `${width}px` : width,\n height: typeof height === \"number\" ? `${height}px` : height,\n ...style,\n }),\n [width, height, style]\n );\n\n return (\n <div\n ref={containerRef}\n className={`scichart-container ${className}`}\n style={containerStyle}\n >\n {/* Debug overlay */}\n {debug && bounds && (\n <div\n style={{\n position: \"absolute\",\n top: 8,\n right: 8,\n background: \"rgba(0,0,0,0.7)\",\n color: \"#0f0\",\n padding: \"4px 8px\",\n borderRadius: 4,\n fontSize: 11,\n fontFamily: \"monospace\",\n }}\n >\n <div>\n X: [{bounds.xMin.toFixed(3)}, {bounds.xMax.toFixed(3)}]\n </div>\n <div>\n Y: [{bounds.yMin.toExponential(2)}, {bounds.yMax.toExponential(2)}\n ]\n </div>\n <div>Series: {series.length}</div>\n </div>\n )}\n </div>\n );\n }\n);\n\nexport default SciChart;\n"],"names":["MARGINS","SI_PREFIXES","getBestPrefix","value","absValue","i","prefix","scaled","formatWithPrefix","unit","decimals","formatValue","formatScientific","detectCycles","signal","tolerance","data","cycles","cycleStart","cycleNumber","prevDirection","directionChanges","direction","startValue","currentValue","generateCycleColors","count","colors","hueStep","hue","detectPeaks","x","y","options","minProminence","type","peaks","xData","yData","prev","curr","next","prominence","validateData","invalidCount","firstInvalidIndex","arr","calculateStats","min","max","sum","val","mean","sumSquaredDiff","diff","stdDev","movingAverage","windowSize","result","halfWindow","j","downsampleLTTB","targetPoints","dataLength","sampledX","sampledY","bucketSize","a","sampledIndex","bucketStart","bucketEnd","nextBucketEnd","avgX","avgY","avgCount","maxArea","maxAreaIndex","area","subtractBaseline","x1","x2","n","i1","i2","minDist1","minDist2","d1","d2","y1","slope","intercept","solveLinearSystem","A","B","matrix","row","maxRow","k","temp","pivot","factor","calculateR2","fitFn","sumY","meanY","ssTot","ssRes","yi","fi","integrate","xMin","xMax","start","end","ia","ib","y2","derivative","dx","cumulativeIntegral","fitData","fitLinear","fitPolynomial","fitExponential","fitLogarithmic","fitPower","opts","sumX","sumXY","sumX2","predict","v","prec","degree","m","coeffs","res","equation","c","xPrime","yPrime","b","EventEmitter","__publicField","event","handler","handlers","error","wrappedHandler","_a","LINE_VERT","LINE_FRAG","POINT_VERT","POINT_FRAG","NativeWebGLRenderer","canvas","gl","dpr","source","shader","vertSource","fragSource","hasPointSize","vertShader","fragShader","program","positionAttr","scaleUniform","translateUniform","colorUniform","id","buffer","currentSize","offsetInBytes","bounds","dataWidth","dataHeight","scaleX","scaleY","translateX","translateY","series","backgroundColor","plotArea","canvasHeight","canvasWidth","pa","uniforms","s","yMin","yRange","yScale","yTrans","seriesUniforms","color","parseColor","prog","alpha","pointSize","symbol","symbolMap","rect","width","height","hex","r","g","interleaveData","length","interleaveStepData","mode","stepCount","resultIdx","prevX","prevY","currX","currY","midX","interleaveBandData","idx","xi","DEFAULT_AXIS_THEME","DEFAULT_GRID_THEME","DEFAULT_LEGEND_THEME","DEFAULT_CURSOR_THEME","DARK_THEME","MIDNIGHT_THEME","LIGHT_THEME","ELECTROCHEM_THEME","createTheme","base","overrides","getThemeByName","name","DEFAULT_THEME","OverlayRenderer","ctx","theme","xScale","grid","xTicks","yTicks","tick","minorXTicks","minorYTicks","label","axis","axisY","position","offset","axisX","tickDir","labelX","titleX","titleY","legend","maxWidth","items","style","boxWidth","boxHeight","item","itemY","swatchX","centerY","centerX","size","typeStr","hasSymbol","isScatter","isLineScatter","d","cursor","cursorTheme","text","lines","lineHeight","padding","line","tooltipX","tooltipY","isDark","errorStyle","lineWidth","capWidth","showCaps","opacity","yError","errorMinus","errorPlus","yBase","yTop","yBottom","xError","xBase","xRight","xLeft","majorTicks","divisions","minor","step","absVal","precision","str","mantissa","exponent","superscriptMap","unicodeExp","char","InteractionManager","container","callbacks","getPlotArea","getBounds","getAxesLayout","enabled","mouseX","mouseY","axes","zoomX","zoomY","targetAxisId","hitWidth","hitX","zoomFactor","normalizedX","normalizedY","dataX","dataY","MIN_RANGE","MAX_RANGE","nextXMin","nextXMax","nextYMin","nextYMax","nextXRange","nextYRange","newBounds","deltaX","deltaY","touch","ICONS","ChartControls","parent","bg","borderColor","shadow","sep","types","nextIdx","sep2","sep3","btn","icon","svgEl","svg","title","onClick","buttons","activeColor","smoothActiveColor","legendActiveColor","normalColor","isHover","ChartLegend","rafId","onMouseDown","e","onMouseMove","onMouseUp","updatePosition","clientX","clientY","dy","newX","newY","tx","ty","parentRect","finalX","finalY","swatch","itemGap","swatchSize","headerHeight","visible","ChartStatistics","viewBounds","visibleY","visibleX","stats","DEFAULT_STYLES","AnnotationManager","annotation","resolved","updates","existing","sorted","normalized","xStart","xEnd","yStart","yEnd","labelY","fontSize","fontFamily","fontWeight","metrics","textWidth","textHeight","drawX","drawY","headSize","angle","headStyle","tailAngle","midY","cross","orientation","bgX","exportToCSV","seriesIds","includeHeaders","delimiter","seriesToExport","headers","maxLength","exportToJSON","exportToImage","webglCanvas","overlayCanvas","showLegend","finalCanvas","applyZoom","scale","oldRange","newRange","offsetPct","sRange","sNewMin","sNewMax","applyPan","axisId","range","moveY","autoScaleAll","yAxisBounds","_","hasValidData","yBounds","MAX_VALUE","MIN_VALUE","xRange","xPad","yPad","newMin","newMax","handleBoxZoom","selectionRect","currentRect","zoom","xMinNorm","xMaxNorm","yMaxNorm","yMinNorm","newXMin","newXMax","newYMin","newYMax","prepareSeriesData","seriesData","buf","seriesType","renderType","renderData","stepBuf","stepMode","pointCount","renderOverlay","primaryYScale","leftAxes","rightAxes","index","DEFAULT_STYLE","ensureTypedArray","Series","_b","_c","_d","_e","_f","_g","_h","_i","len","smoothedY","err","minus","plus","yMax","xVal","yVal","update","newY2","overflow","newData","combined","oldSmoothing","maxPoints","addSeries","updateSeriesBuffer","o","removeSeries","updateSeries","seriesId","totalPoints","stepData","appendData","oldBounds","oldMaxX","setMaxPoints","addFitLine","fitResolution","fitX","fitY","fitId","sourceStyle","LinearScale","d0","r0","r1","pixel","niceStep","ticks","maxTicks","t","LogScale","safeMin","safeMax","logMin","logMax","logVal","p","rawStep","magnitude","niceNormalized","createScale","initializeChart","bgColor","showControls","autoScroll","showStatistics","xAxisOptions","yAxisOptionsMap","yScales","primaryYAxisId","axisOpt","isFirst","defaultId","fullOptions","createCanvas","leftAxisCount","rightAxisCount","leftMargin","rightMargin","leftIndex","rightIndex","resizeCanvases","overlayCtx","w","h","ChartImpl","analysis","setup","active","link","addSeriesImpl","removeSeriesImpl","updateSeriesImpl","appendDataImpl","setMaxPointsImpl","addFitLineImpl","px","py","loop","createChart","createRenderer","lttbDownsample","outX","outY","outIndices","outIdx","nextBucketStart","maxIndex","aX","aY","minMaxDownsample","bucketCount","minY","maxY","minIdx","maxIdx","calculateTargetPoints","pointsPerPixel","REACT_ELEMENT_TYPE","REACT_FRAGMENT_TYPE","jsxProd","config","maybeKey","key","propName","reactJsxRuntime_production","getComponentNameFromType","REACT_CLIENT_REFERENCE","REACT_PROFILER_TYPE","REACT_STRICT_MODE_TYPE","REACT_SUSPENSE_TYPE","REACT_SUSPENSE_LIST_TYPE","REACT_ACTIVITY_TYPE","REACT_PORTAL_TYPE","REACT_CONTEXT_TYPE","REACT_CONSUMER_TYPE","REACT_FORWARD_REF_TYPE","innerType","REACT_MEMO_TYPE","REACT_LAZY_TYPE","testStringCoercion","checkKeyStringCoercion","JSCompiler_inline_result","JSCompiler_temp_const","JSCompiler_inline_result$jscomp$0","getTaskName","getOwner","dispatcher","ReactSharedInternals","UnknownOwner","hasValidKey","hasOwnProperty","getter","defineKeyPropWarningGetter","props","displayName","warnAboutAccessingKey","specialPropKeyWarningShown","elementRefGetterWithDeprecationWarning","componentName","didWarnAboutElementRef","ReactElement","owner","debugStack","debugTask","refProp","jsxDEVImpl","isStaticChildren","children","isArrayImpl","validateChildKeys","keys","didWarnAboutKeySpread","node","isValidElement","object","React","require$$0","createTask","callStackForError","unknownOwnerDebugStack","unknownOwnerDebugTask","reactJsxRuntime_development","trackActualOwner","jsxRuntimeModule","require$$1","useSciChart","containerRef","chart","setChart","useState","isReady","setIsReady","setError","setBounds","optionsRef","useRef","useEffect","chartInstance","useCallback","seriesOptions","zoomOptions","resetZoom","SciChart","forwardRef","zoomProp","onZoomChange","className","debug","chartOptions","ref","previousSeriesRef","useImperativeHandle","currentSeriesMap","previousSeriesMap","prevSeries","containerStyle","useMemo","jsx","jsxs"],"mappings":"ibAmFO,MAAMA,EAAU,CAAE,IAAK,GAAI,MAAO,GAAI,OAAQ,GAAI,KAAM,EAAA,ECjEzDC,GAA4B,CAChC,CAAE,OAAQ,IAAK,OAAQ,KAAA,EACvB,CAAE,OAAQ,IAAK,OAAQ,IAAA,EACvB,CAAE,OAAQ,IAAK,OAAQ,IAAA,EACvB,CAAE,OAAQ,IAAK,OAAQ,IAAA,EACvB,CAAE,OAAQ,GAAI,OAAQ,CAAA,EACtB,CAAE,OAAQ,IAAK,OAAQ,GAAA,EACvB,CAAE,OAAQ,IAAK,OAAQ,GAAA,EACvB,CAAE,OAAQ,IAAK,OAAQ,GAAA,CACzB,EAKO,SAASC,GAAcC,EAA2B,CACvD,MAAMC,EAAW,KAAK,IAAID,CAAK,EAE/B,GAAIC,IAAa,EACf,MAAO,CAAE,OAAQ,GAAI,OAAQ,CAAA,EAI/B,QAASC,EAAIJ,GAAY,OAAS,EAAGI,GAAK,EAAGA,IAAK,CAChD,MAAMC,EAASL,GAAYI,CAAC,EACtBE,EAASH,EAAWE,EAAO,OACjC,GAAIC,GAAU,GAAKA,EAAS,IAC1B,OAAOD,CAEX,CAGA,MAAO,CAAE,OAAQ,GAAI,OAAQ,CAAA,CAC/B,CAUO,SAASE,EACdL,EACAM,EACAC,EAAW,EACH,CACR,MAAMJ,EAASJ,GAAcC,CAAK,EAElC,MAAO,IADQA,EAAQG,EAAO,QACb,QAAQI,CAAQ,CAAC,IAAIJ,EAAO,MAAM,GAAGG,CAAI,EAC5D,CAMO,SAASE,GAAYR,EAAeO,EAAW,EAAW,CAC/D,OAAI,KAAK,IAAIP,CAAK,EAAI,MAAS,KAAK,IAAIA,CAAK,GAAK,IACzCA,EAAM,cAAcO,CAAQ,EAE9BP,EAAM,QAAQO,CAAQ,CAC/B,CAKO,SAASE,GAAiBT,EAAeO,EAAW,EAAW,CACpE,OAAOP,EAAM,cAAcO,CAAQ,CACrC,CA6BO,SAASG,GACdC,EACAC,EAAY,KACC,CACb,MAAMC,EAAOF,aAAkB,MAAQ,IAAI,aAAaA,CAAM,EAAIA,EAElE,GAAIE,EAAK,OAAS,EAAG,MAAO,CAAA,EAE5B,MAAMC,EAAsB,CAAA,EAC5B,IAAIC,EAAa,EACbC,EAAc,EAGdC,EAAgB,KAAK,KAAKJ,EAAK,CAAC,EAAIA,EAAK,CAAC,CAAC,EAC3CK,EAAmB,EAEvB,QAAShB,EAAI,EAAGA,EAAIW,EAAK,OAAQX,IAAK,CACpC,MAAMiB,EAAY,KAAK,KAAKN,EAAKX,CAAC,EAAIW,EAAKX,EAAI,CAAC,CAAC,EAGjD,GAAIiB,IAAc,GAGdA,IAAcF,EAAe,CAI/B,GAHAC,IAGIA,GAAoB,EAAG,CACzB,MAAME,EAAaP,EAAKE,CAAU,EAC5BM,EAAeR,EAAKX,CAAC,EAEvB,KAAK,IAAImB,EAAeD,CAAU,EAAIR,IACxCE,EAAO,KAAK,CACV,OAAQE,EACR,WAAYD,EACZ,SAAUb,EACV,UAAWW,EAAKE,EAAa,CAAC,EAAIF,EAAKE,CAAU,EAAI,EAAI,EAAA,CAC1D,EAEDC,IACAD,EAAab,EACbgB,EAAmB,EAEvB,CAEAD,EAAgBE,CAClB,CACF,CAGA,OAAIJ,EAAaF,EAAK,OAAS,GAC7BC,EAAO,KAAK,CACV,OAAQE,EACR,WAAYD,EACZ,SAAUF,EAAK,OAAS,EACxB,UAAWA,EAAKE,EAAa,CAAC,EAAIF,EAAKE,CAAU,EAAI,EAAI,EAAA,CAC1D,EAGID,CACT,CAOO,SAASQ,GAAoBC,EAAyB,CAC3D,MAAMC,EAAmB,CAAA,EACnBC,EAAU,IAAM,KAAK,IAAIF,EAAO,CAAC,EAEvC,QAAS,EAAI,EAAG,EAAIA,EAAO,IAAK,CAC9B,MAAMG,EAAO,EAAID,EAAW,IAC5BD,EAAO,KAAK,OAAOE,CAAG,aAAa,CACrC,CAEA,OAAOF,CACT,CAgCO,SAASG,GACdC,EACAC,EACAC,EAKI,CAAA,EACI,CACR,KAAM,CAAE,cAAAC,EAAgB,EAAG,KAAAC,EAAO,QAAWF,EACvCG,EAAgB,CAAA,EAEhBC,EAAQN,aAAa,MAAQ,IAAI,aAAaA,CAAC,EAAIA,EACnDO,EAAQN,aAAa,MAAQ,IAAI,aAAaA,CAAC,EAAIA,EAEzD,QAAS3B,EAAI,EAAGA,EAAIiC,EAAM,OAAS,EAAGjC,IAAK,CACzC,MAAMkC,EAAOD,EAAMjC,EAAI,CAAC,EAClBmC,EAAOF,EAAMjC,CAAC,EACdoC,EAAOH,EAAMjC,EAAI,CAAC,EAGxB,GAAImC,EAAOD,GAAQC,EAAOC,EAAM,CAC9B,MAAMC,EAAa,KAAK,IAAIF,EAAOD,EAAMC,EAAOC,CAAI,EAChDC,GAAcR,IAAkBC,IAAS,QAAUA,IAAS,QAC9DC,EAAM,KAAK,CAAE,MAAO/B,EAAG,EAAGgC,EAAMhC,CAAC,EAAG,EAAGmC,EAAM,KAAM,MAAO,WAAAE,EAAY,CAE1E,CAGA,GAAIF,EAAOD,GAAQC,EAAOC,EAAM,CAC9B,MAAMC,EAAa,KAAK,IAAIH,EAAOC,EAAMC,EAAOD,CAAI,EAChDE,GAAcR,IAAkBC,IAAS,QAAUA,IAAS,QAC9DC,EAAM,KAAK,CAAE,MAAO/B,EAAG,EAAGgC,EAAMhC,CAAC,EAAG,EAAGmC,EAAM,KAAM,MAAO,WAAAE,EAAY,CAE1E,CACF,CAEA,OAAON,CACT,CAqBO,SAASO,GACd3B,EACkB,CAClB,IAAI4B,EAAe,EACfC,EAAoB,GAExB,MAAMC,EAAM9B,aAAgB,MAAQA,EAAO,MAAM,KAAKA,CAAI,EAE1D,QAASX,EAAI,EAAGA,EAAIyC,EAAI,OAAQzC,IACzB,SAASyC,EAAIzC,CAAC,CAAC,IAClBuC,IACIC,IAAsB,KACxBA,EAAoBxC,IAK1B,MAAO,CACL,MAAOuC,IAAiB,EACxB,aAAAA,EACA,kBAAAC,CAAA,CAEJ,CAiBO,SAASE,GACd/B,EACW,CACX,MAAM8B,EAAM9B,aAAgB,MAAQA,EAAO,MAAM,KAAKA,CAAI,EACpDU,EAAQoB,EAAI,OAElB,GAAIpB,IAAU,EACZ,MAAO,CAAE,IAAK,EAAG,IAAK,EAAG,KAAM,EAAG,OAAQ,EAAG,MAAO,CAAA,EAGtD,IAAIsB,EAAMF,EAAI,CAAC,EACXG,EAAMH,EAAI,CAAC,EACXI,EAAM,EAEV,QAAS7C,EAAI,EAAGA,EAAIqB,EAAOrB,IAAK,CAC9B,MAAM8C,EAAML,EAAIzC,CAAC,EACb8C,EAAMH,IAAKA,EAAMG,GACjBA,EAAMF,IAAKA,EAAME,GACrBD,GAAOC,CACT,CAEA,MAAMC,EAAOF,EAAMxB,EAGnB,IAAI2B,EAAiB,EACrB,QAAShD,EAAI,EAAGA,EAAIqB,EAAOrB,IAAK,CAC9B,MAAMiD,EAAOR,EAAIzC,CAAC,EAAI+C,EACtBC,GAAkBC,EAAOA,CAC3B,CACA,MAAMC,EAAS,KAAK,KAAKF,EAAiB3B,CAAK,EAE/C,MAAO,CAAE,IAAAsB,EAAK,IAAAC,EAAK,KAAAG,EAAM,OAAAG,EAAQ,MAAA7B,CAAA,CACnC,CAYO,SAAS8B,GACdxC,EACAyC,EACc,CACd,MAAMX,EAAM9B,aAAgB,MAAQ,IAAI,aAAaA,CAAI,EAAIA,EACvD0C,EAAS,IAAI,aAAaZ,EAAI,MAAM,EACpCa,EAAa,KAAK,MAAMF,EAAa,CAAC,EAE5C,QAASpD,EAAI,EAAGA,EAAIyC,EAAI,OAAQzC,IAAK,CACnC,IAAI6C,EAAM,EACNxB,EAAQ,EAEZ,QAASkC,EAAI,KAAK,IAAI,EAAGvD,EAAIsD,CAAU,EAAGC,GAAK,KAAK,IAAId,EAAI,OAAS,EAAGzC,EAAIsD,CAAU,EAAGC,IACvFV,GAAOJ,EAAIc,CAAC,EACZlC,IAGFgC,EAAOrD,CAAC,EAAI6C,EAAMxB,CACpB,CAEA,OAAOgC,CACT,CAYO,SAASG,GACd9B,EACAC,EACA8B,EACsC,CACtC,MAAMC,EAAahC,EAAE,OAErB,GAAI+B,GAAgBC,GAAcD,EAAe,EAC/C,MAAO,CAAE,EAAG,IAAI,aAAa/B,CAAC,EAAG,EAAG,IAAI,aAAaC,CAAC,CAAA,EAGxD,MAAMgC,EAAW,IAAI,aAAaF,CAAY,EACxCG,EAAW,IAAI,aAAaH,CAAY,EAG9CE,EAAS,CAAC,EAAIjC,EAAE,CAAC,EACjBkC,EAAS,CAAC,EAAIjC,EAAE,CAAC,EAEjB,MAAMkC,GAAcH,EAAa,IAAMD,EAAe,GAEtD,IAAIK,EAAI,EACJC,EAAe,EAEnB,QAAS/D,EAAI,EAAGA,EAAIyD,EAAe,EAAGzD,IAAK,CAEzC,MAAMgE,EAAc,KAAK,OAAOhE,EAAI,GAAK6D,CAAU,EAAI,EACjDI,EAAY,KAAK,OAAOjE,EAAI,GAAK6D,CAAU,EAAI,EAC/CK,EAAgB,KAAK,IAAI,KAAK,OAAOlE,EAAI,GAAK6D,CAAU,EAAI,EAAGH,CAAU,EAG/E,IAAIS,EAAO,EACPC,EAAO,EACPC,EAAW,EAEf,QAASd,EAAIU,EAAWV,EAAIW,EAAeX,IACzCY,GAAQzC,EAAE6B,CAAC,EACXa,GAAQzC,EAAE4B,CAAC,EACXc,IAGEA,EAAW,IACbF,GAAQE,EACRD,GAAQC,GAIV,IAAIC,EAAU,GACVC,EAAeP,EAEnB,QAAST,EAAIS,EAAaT,EAAIU,GAAaV,EAAIG,EAAYH,IAAK,CAE9D,MAAMiB,EAAO,KAAK,KACf9C,EAAEoC,CAAC,EAAIK,IAASxC,EAAE4B,CAAC,EAAI5B,EAAEmC,CAAC,IAAMpC,EAAEoC,CAAC,EAAIpC,EAAE6B,CAAC,IAAMa,EAAOzC,EAAEmC,CAAC,EAAA,EAGzDU,EAAOF,IACTA,EAAUE,EACVD,EAAehB,EAEnB,CAEAI,EAASI,CAAY,EAAIrC,EAAE6C,CAAY,EACvCX,EAASG,CAAY,EAAIpC,EAAE4C,CAAY,EACvCR,IACAD,EAAIS,CACN,CAGA,OAAAZ,EAASF,EAAe,CAAC,EAAI/B,EAAEgC,EAAa,CAAC,EAC7CE,EAASH,EAAe,CAAC,EAAI9B,EAAE+B,EAAa,CAAC,EAEtC,CAAE,EAAGC,EAAU,EAAGC,CAAA,CAC3B,CAUO,SAASa,GACd/C,EACAC,EACA+C,EACAC,EACc,CACd,MAAMC,EAAIlD,EAAE,OACN2B,EAAS,IAAI,aAAauB,CAAC,EAGjC,IAAIC,EAAK,EAAGC,EAAKF,EAAI,EACjBG,EAAW,IAAUC,EAAW,IAEpC,QAAShF,EAAI,EAAGA,EAAI4E,EAAG5E,IAAK,CAC1B,MAAMiF,EAAK,KAAK,IAAIvD,EAAE1B,CAAC,EAAI0E,CAAE,EACvBQ,EAAK,KAAK,IAAIxD,EAAE1B,CAAC,EAAI2E,CAAE,EACzBM,EAAKF,IAAYA,EAAWE,EAAIJ,EAAK7E,GACrCkF,EAAKF,IAAYA,EAAWE,EAAIJ,EAAK9E,EAC3C,CAEA,MAAMmF,EAAKxD,EAAEkD,CAAE,EAETO,GADKzD,EAAEmD,CAAE,EACKK,IAAOzD,EAAEoD,CAAE,EAAIpD,EAAEmD,CAAE,GACjCQ,EAAYF,EAAKC,EAAQ1D,EAAEmD,CAAE,EAEnC,QAAS7E,EAAI,EAAGA,EAAI4E,EAAG5E,IACrBqD,EAAOrD,CAAC,EAAI2B,EAAE3B,CAAC,GAAKoF,EAAQ1D,EAAE1B,CAAC,EAAIqF,GAGrC,OAAOhC,CACT,CCrfO,SAASiC,GAAkBC,EAAeC,EAAuB,CACtE,MAAMZ,EAAIY,EAAE,OACNC,EAASF,EAAE,IAAI,CAACG,EAAK1F,IAAM,CAAC,GAAG0F,EAAKF,EAAExF,CAAC,CAAC,CAAC,EAE/C,QAASA,EAAI,EAAGA,EAAI4E,EAAG5E,IAAK,CAE1B,IAAI2F,EAAS3F,EACb,QAAS4F,EAAI5F,EAAI,EAAG4F,EAAIhB,EAAGgB,IACrB,KAAK,IAAIH,EAAOG,CAAC,EAAE5F,CAAC,CAAC,EAAI,KAAK,IAAIyF,EAAOE,CAAM,EAAE3F,CAAC,CAAC,IACrD2F,EAASC,GAKb,MAAMC,EAAOJ,EAAOzF,CAAC,EACrByF,EAAOzF,CAAC,EAAIyF,EAAOE,CAAM,EACzBF,EAAOE,CAAM,EAAIE,EAGjB,MAAMC,EAAQL,EAAOzF,CAAC,EAAEA,CAAC,EACzB,GAAI,KAAK,IAAI8F,CAAK,EAAI,MACpB,MAAM,IAAI,MAAM,qCAAqC,EAIvD,QAASF,EAAI5F,EAAI,EAAG4F,EAAIhB,EAAGgB,IAAK,CAC9B,MAAMG,EAASN,EAAOG,CAAC,EAAE5F,CAAC,EAAI8F,EAC9B,QAASvC,EAAIvD,EAAGuD,GAAKqB,EAAGrB,IACtBkC,EAAOG,CAAC,EAAErC,CAAC,GAAKwC,EAASN,EAAOzF,CAAC,EAAEuD,CAAC,CAExC,CACF,CAGA,MAAM7B,EAAI,IAAI,MAAMkD,CAAC,EAAE,KAAK,CAAC,EAC7B,QAAS5E,EAAI4E,EAAI,EAAG5E,GAAK,EAAGA,IAAK,CAC/B,IAAI6C,EAAM,EACV,QAASU,EAAIvD,EAAI,EAAGuD,EAAIqB,EAAGrB,IACzBV,GAAO4C,EAAOzF,CAAC,EAAEuD,CAAC,EAAI7B,EAAE6B,CAAC,EAE3B7B,EAAE1B,CAAC,GAAKyF,EAAOzF,CAAC,EAAE4E,CAAC,EAAI/B,GAAO4C,EAAOzF,CAAC,EAAEA,CAAC,CAC3C,CAEA,OAAO0B,CACT,CAKO,SAASsE,EACdtE,EACAC,EACAsE,EACQ,CACR,MAAMrB,EAAIlD,EAAE,OACZ,GAAIkD,IAAM,EAAG,MAAO,GAEpB,IAAIsB,EAAO,EACX,QAASlG,EAAI,EAAGA,EAAI4E,EAAG5E,IAAKkG,GAAQvE,EAAE3B,CAAC,EACvC,MAAMmG,EAAQD,EAAOtB,EAErB,IAAIwB,EAAQ,EACRC,EAAQ,EAEZ,QAASrG,EAAI,EAAGA,EAAI4E,EAAG5E,IAAK,CAC1B,MAAMsG,EAAK3E,EAAE3B,CAAC,EACRuG,EAAKN,EAAMvE,EAAE1B,CAAC,CAAC,EACrBoG,IAAUE,EAAKH,IAAUG,EAAKH,GAC9BE,IAAUC,EAAKC,IAAOD,EAAKC,EAC7B,CAEA,OAAOH,IAAU,EAAI,EAAI,EAAIC,EAAQD,CACvC,CAUO,SAASI,GACd9E,EACAC,EACA8E,EACAC,EACQ,CACR,MAAM9B,EAAIlD,EAAE,OACZ,GAAIkD,EAAI,EAAG,MAAO,GAElB,IAAIJ,EAAO,EACX,MAAMmC,EAAQF,IAAS,OAAYA,EAAO/E,EAAE,CAAC,EACvCkF,EAAMF,IAAS,OAAYA,EAAOhF,EAAEkD,EAAI,CAAC,EAE/C,QAAS5E,EAAI,EAAGA,EAAI4E,EAAI,EAAG5E,IAAK,CAC9B,MAAM0E,EAAKhD,EAAE1B,CAAC,EACR2E,EAAKjD,EAAE1B,EAAI,CAAC,EAGlB,GAAI2E,EAAKgC,EAAO,SAChB,GAAIjC,EAAKkC,EAAK,MAGd,MAAMC,EAAK,KAAK,IAAInC,EAAIiC,CAAK,EACvBG,EAAK,KAAK,IAAInC,EAAIiC,CAAG,EAE3B,GAAIC,EAAKC,EAAI,CAEX,MAAM3B,EAAKxD,EAAE3B,CAAC,GAAK2B,EAAE3B,EAAI,CAAC,EAAI2B,EAAE3B,CAAC,KAAO6G,EAAKnC,IAAOC,EAAKD,IACnDqC,EAAKpF,EAAE3B,CAAC,GAAK2B,EAAE3B,EAAI,CAAC,EAAI2B,EAAE3B,CAAC,KAAO8G,EAAKpC,IAAOC,EAAKD,IAEzDF,IAASsC,EAAKD,IAAO1B,EAAK4B,GAAM,CAClC,CACF,CAEA,OAAOvC,CACT,CAKO,SAASwC,GACdtF,EACAC,EACc,CACd,MAAMiD,EAAIlD,EAAE,OACZ,GAAIkD,EAAI,EAAG,OAAO,IAAI,aAAa,CAAC,EAEpC,MAAMvB,EAAS,IAAI,aAAauB,CAAC,EACjC,QAAS5E,EAAI,EAAGA,EAAI4E,EAAI,EAAG5E,IAAK,CAC9B,MAAMiH,EAAKvF,EAAE1B,EAAI,CAAC,EAAI0B,EAAE1B,CAAC,EACzBqD,EAAOrD,CAAC,EAAIiH,IAAO,GAAKtF,EAAE3B,EAAI,CAAC,EAAI2B,EAAE3B,CAAC,GAAKiH,EAAK,CAClD,CAEA,OAAA5D,EAAOuB,EAAI,CAAC,EAAIvB,EAAOuB,EAAI,CAAC,EACrBvB,CACT,CAKO,SAAS6D,GACdxF,EACAC,EACc,CACd,MAAMiD,EAAIlD,EAAE,OACZ,GAAIkD,EAAI,EAAG,OAAO,IAAI,aAAa,CAAC,EAEpC,MAAMvB,EAAS,IAAI,aAAauB,CAAC,EACjCvB,EAAO,CAAC,EAAI,EAEZ,QAASrD,EAAI,EAAGA,EAAI4E,EAAI,EAAG5E,IAAK,CAE9B,MAAMwE,GADK9C,EAAE1B,EAAI,CAAC,EAAI0B,EAAE1B,CAAC,IACN2B,EAAE3B,CAAC,EAAI2B,EAAE3B,EAAI,CAAC,GAAK,EACtCqD,EAAOrD,EAAI,CAAC,EAAIqD,EAAOrD,CAAC,EAAIwE,CAC9B,CAEA,OAAOnB,CACT,CC3IO,SAAS8D,GACdzF,EACAC,EACAG,EACAF,EAAsB,CAAA,EACX,CAEX,GADUF,EAAE,OACJ,EAAG,MAAM,IAAI,MAAM,4CAA4C,EAEvE,OAAQI,EAAA,CACN,IAAK,SACH,OAAOsF,EAAU1F,EAAGC,EAAGC,CAAO,EAChC,IAAK,aACH,OAAOyF,GAAc3F,EAAGC,EAAGC,EAAQ,QAAU,EAAGA,CAAO,EACzD,IAAK,cACH,OAAO0F,GAAe5F,EAAGC,EAAGC,CAAO,EACrC,IAAK,cACH,OAAO2F,GAAe7F,EAAGC,EAAGC,CAAO,EACrC,IAAK,QACH,OAAO4F,GAAS9F,EAAGC,EAAGC,CAAO,EAC/B,QACE,MAAM,IAAI,MAAM,yBAAyBE,CAAI,EAAE,CAAA,CAErD,CAEA,SAASsF,EAAU1F,EAAQC,EAAQ8F,EAA6B,CAC9D,MAAM7C,EAAIlD,EAAE,OACZ,IAAIgG,EAAO,EAAGxB,EAAO,EAAGyB,EAAQ,EAAGC,EAAQ,EAE3C,QAAS5H,EAAI,EAAGA,EAAI4E,EAAG5E,IACrB0H,GAAQhG,EAAE1B,CAAC,EACXkG,GAAQvE,EAAE3B,CAAC,EACX2H,GAASjG,EAAE1B,CAAC,EAAI2B,EAAE3B,CAAC,EACnB4H,GAASlG,EAAE1B,CAAC,EAAI0B,EAAE1B,CAAC,EAGrB,MAAMoF,GAASR,EAAI+C,EAAQD,EAAOxB,IAAStB,EAAIgD,EAAQF,EAAOA,GACxDrC,GAAaa,EAAOd,EAAQsC,GAAQ9C,EAEpCiD,EAAWC,GAAc1C,EAAQ0C,EAAIzC,EACrC0C,EAAON,EAAK,WAAa,EAE/B,MAAO,CACL,KAAM,SACN,aAAc,CAACrC,EAAOC,CAAS,EAC/B,SAAU,OAAOD,EAAM,QAAQ2C,CAAI,CAAC,KAAK1C,GAAa,EAAI,IAAM,GAAG,IAAI,KAAK,IAAIA,CAAS,EAAE,QAAQ0C,CAAI,CAAC,GACxG,SAAU/B,EAAYtE,EAAGC,EAAGkG,CAAO,EACnC,QAAAA,CAAA,CAEJ,CAEA,SAASR,GAAc3F,EAAQC,EAAQqG,EAAgBP,EAA6B,CAClF,MAAM7C,EAAIlD,EAAE,OACNuG,EAAID,EAAS,EACbzC,EAAgB,MAAM,KAAK,CAAE,OAAQ0C,CAAA,EAAK,IAAM,IAAI,MAAMA,CAAC,EAAE,KAAK,CAAC,CAAC,EACpEzC,EAAc,IAAI,MAAMyC,CAAC,EAAE,KAAK,CAAC,EAGvC,QAASjI,EAAI,EAAGA,EAAIiI,EAAGjI,IAAK,CAC1B,QAASuD,EAAI,EAAGA,EAAI0E,EAAG1E,IAAK,CAC1B,IAAIV,EAAM,EACV,QAAS+C,EAAI,EAAGA,EAAIhB,EAAGgB,IACrB/C,GAAO,KAAK,IAAInB,EAAEkE,CAAC,EAAG5F,EAAIuD,CAAC,EAE7BgC,EAAEvF,CAAC,EAAEuD,CAAC,EAAIV,CACZ,CAEA,IAAIA,EAAM,EACV,QAAS+C,EAAI,EAAGA,EAAIhB,EAAGgB,IACrB/C,GAAOlB,EAAEiE,CAAC,EAAI,KAAK,IAAIlE,EAAEkE,CAAC,EAAG5F,CAAC,EAEhCwF,EAAExF,CAAC,EAAI6C,CACT,CAEA,MAAMqF,EAAS5C,GAAkBC,EAAGC,CAAC,EAE/BqC,EAAWC,GAAc,CAC7B,IAAIK,EAAM,EACV,QAASnI,EAAI,EAAGA,EAAIkI,EAAO,OAAQlI,IACjCmI,GAAOD,EAAOlI,CAAC,EAAI,KAAK,IAAI8H,EAAG9H,CAAC,EAElC,OAAOmI,CACT,EAEMJ,EAAON,EAAK,WAAa,EAC/B,IAAIW,EAAW,OACf,QAASpI,EAAIkI,EAAO,OAAS,EAAGlI,GAAK,EAAGA,IAAK,CAC3C,MAAMqI,EAAIH,EAAOlI,CAAC,EACdA,EAAIkI,EAAO,OAAS,EAAGE,GAAYC,GAAK,EAAI,MAAQ,MAC/CA,EAAI,IAAGD,GAAY,KAE5BA,GAAY,GAAG,KAAK,IAAIC,CAAC,EAAE,QAAQN,CAAI,CAAC,GAAG/H,EAAI,EAAKA,EAAI,EAAI,KAAKA,CAAC,GAAK,IAAO,EAAE,EAClF,CAEA,MAAO,CACL,KAAM,aACN,aAAckI,EACd,SAAAE,EACA,SAAUpC,EAAYtE,EAAGC,EAAGkG,CAAO,EACnC,QAAAA,CAAA,CAEJ,CAEA,SAASP,GAAe5F,EAAQC,EAAQ8F,EAA6B,CAGnE,MAAM7C,EAAIlD,EAAE,OACN4G,EAAS,CAAA,EACTC,EAAS,CAAA,EAEf,QAASvI,EAAI,EAAGA,EAAI4E,EAAG5E,IACjB2B,EAAE3B,CAAC,EAAI,IACTsI,EAAO,KAAK5G,EAAE1B,CAAC,CAAC,EAChBuI,EAAO,KAAK,KAAK,IAAI5G,EAAE3B,CAAC,CAAC,CAAC,GAI9B,MAAMqD,EAAS+D,EAAUkB,EAAQC,EAAQd,CAAI,EACvCe,EAAInF,EAAO,aAAa,CAAC,EACzBS,EAAI,KAAK,IAAIT,EAAO,aAAa,CAAC,CAAC,EAEnCwE,EAAWC,GAAchE,EAAI,KAAK,IAAI0E,EAAIV,CAAC,EAC3CC,EAAON,EAAK,WAAa,EAE/B,MAAO,CACL,KAAM,cACN,aAAc,CAAC3D,EAAG0E,CAAC,EACnB,SAAU,OAAO1E,EAAE,QAAQiE,CAAI,CAAC,SAASS,EAAE,QAAQT,CAAI,CAAC,KACxD,SAAU/B,EAAYtE,EAAGC,EAAGkG,CAAO,EACnC,QAAAA,CAAA,CAEJ,CAEA,SAASN,GAAe7F,EAAQC,EAAQ8F,EAA6B,CAGnE,MAAM7C,EAAIlD,EAAE,OACN4G,EAAS,CAAA,EACTC,EAAS,CAAA,EAEf,QAASvI,EAAI,EAAGA,EAAI4E,EAAG5E,IACjB0B,EAAE1B,CAAC,EAAI,IACTsI,EAAO,KAAK,KAAK,IAAI5G,EAAE1B,CAAC,CAAC,CAAC,EAC1BuI,EAAO,KAAK5G,EAAE3B,CAAC,CAAC,GAIpB,MAAMqD,EAAS+D,EAAUkB,EAAQC,EAAQd,CAAI,EACvCe,EAAInF,EAAO,aAAa,CAAC,EACzBS,EAAIT,EAAO,aAAa,CAAC,EAEzBwE,EAAWC,GAAchE,EAAI0E,EAAI,KAAK,IAAIV,CAAC,EAC3CC,EAAON,EAAK,WAAa,EAE/B,MAAO,CACL,KAAM,cACN,aAAc,CAAC3D,EAAG0E,CAAC,EACnB,SAAU,OAAO1E,EAAE,QAAQiE,CAAI,CAAC,IAAIS,GAAK,EAAI,IAAM,GAAG,IAAI,KAAK,IAAIA,CAAC,EAAE,QAAQT,CAAI,CAAC,WACnF,SAAU/B,EAAYtE,EAAGC,EAAGkG,CAAO,EACnC,QAAAA,CAAA,CAEJ,CAEA,SAASL,GAAS9F,EAAQC,EAAQ8F,EAA6B,CAE7D,MAAM7C,EAAIlD,EAAE,OACN4G,EAAS,CAAA,EACTC,EAAS,CAAA,EAEf,QAASvI,EAAI,EAAGA,EAAI4E,EAAG5E,IACjB0B,EAAE1B,CAAC,EAAI,GAAK2B,EAAE3B,CAAC,EAAI,IACrBsI,EAAO,KAAK,KAAK,IAAI5G,EAAE1B,CAAC,CAAC,CAAC,EAC1BuI,EAAO,KAAK,KAAK,IAAI5G,EAAE3B,CAAC,CAAC,CAAC,GAI9B,MAAMqD,EAAS+D,EAAUkB,EAAQC,EAAQd,CAAI,EACvCe,EAAInF,EAAO,aAAa,CAAC,EACzBS,EAAI,KAAK,IAAIT,EAAO,aAAa,CAAC,CAAC,EAEnCwE,EAAWC,GAAchE,EAAI,KAAK,IAAIgE,EAAGU,CAAC,EAC1CT,EAAON,EAAK,WAAa,EAE/B,MAAO,CACL,KAAM,QACN,aAAc,CAAC3D,EAAG0E,CAAC,EACnB,SAAU,OAAO1E,EAAE,QAAQiE,CAAI,CAAC,SAASS,EAAE,QAAQT,CAAI,CAAC,IACxD,SAAU/B,EAAYtE,EAAGC,EAAGkG,CAAO,EACnC,QAAAA,CAAA,CAEJ,0ZCzNO,MAAMY,EAAsC,CAA5C,cACGC,EAAA,qBACF,KAKN,GACEC,EACAC,EACM,CACD,KAAK,UAAU,IAAID,CAAK,GAC3B,KAAK,UAAU,IAAIA,EAAO,IAAI,GAAK,EAErC,KAAK,UAAU,IAAIA,CAAK,EAAG,IAAIC,CAAkC,CACnE,CAKA,IACED,EACAC,EACM,CACN,MAAMC,EAAW,KAAK,UAAU,IAAIF,CAAK,EACrCE,GACFA,EAAS,OAAOD,CAAkC,CAEtD,CAKA,KAA+BD,EAAUhI,EAAyB,CAChE,MAAMkI,EAAW,KAAK,UAAU,IAAIF,CAAK,EACrCE,GACFA,EAAS,QAASD,GAAY,CAC5B,GAAI,CACFA,EAAQjI,CAAI,CACd,OAASmI,EAAO,CACd,QAAQ,MAAM,wCAAwC,OAAOH,CAAK,CAAC,KAAMG,CAAK,CAChF,CACF,CAAC,CAEL,CAKA,KACEH,EACAC,EACM,CACN,MAAMG,EAAkBpI,GAAsB,CAC5C,KAAK,IAAIgI,EAAOI,CAAc,EAC9BH,EAAQjI,CAAI,CACd,EACA,KAAK,GAAGgI,EAAOI,CAAc,CAC/B,CAKA,OAAc,CACZ,KAAK,UAAU,MAAA,CACjB,CAKA,cAAcJ,EAA+B,OAC3C,QAAOK,EAAA,KAAK,UAAU,IAAIL,CAAK,IAAxB,YAAAK,EAA2B,OAAQ,CAC5C,CACF,CCrBA,MAAMC,GAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYZC,GAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASZC,GAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcbC,GAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAwFZ,MAAMC,CAAoB,CAqB/B,YAAYC,EAA2B,CApB/BZ,EAAA,eACAA,EAAA,WACAA,EAAA,YAQAA,EAAA,oBACAA,EAAA,qBAGAA,EAAA,mBAAwC,KACxCA,EAAA,uBAAuC,KAGvCA,EAAA,qBAAgB,IAGtB,KAAK,OAASY,EACd,KAAK,IAAM,OAAO,kBAAoB,EAGtC,MAAMC,EAAKD,EAAO,WAAW,QAAS,CACpC,MAAO,GACP,UAAW,GACX,sBAAuB,GACvB,gBAAiB,kBAAA,CAClB,EAED,GAAI,CAACC,EACH,MAAM,IAAI,MAAM,qBAAqB,EAGvC,KAAK,GAAKA,EAGV,KAAK,YAAc,KAAK,cAAcN,GAAWC,GAAW,EAAK,EACjE,KAAK,aAAe,KAAK,cAAcC,GAAYC,GAAY,EAAI,EAGnEG,EAAG,OAAOA,EAAG,KAAK,EAClBA,EAAG,UAAUA,EAAG,UAAWA,EAAG,mBAAmB,EAEjD,KAAK,cAAgB,GACrB,QAAQ,IAAI,wCAAwC,CACtD,CA5CA,OAAOC,EAAmB,CACxB,KAAK,IAAMA,EACX,KAAK,OAAA,CACP,CA+CQ,aAAaC,EAAgB3H,EAA2B,CAC9D,KAAM,CAAE,GAAAyH,GAAO,KACTG,EAASH,EAAG,aAAazH,CAAI,EACnC,GAAI,CAAC4H,EAAQ,MAAM,IAAI,MAAM,yBAAyB,EAKtD,GAHAH,EAAG,aAAaG,EAAQD,CAAM,EAC9BF,EAAG,cAAcG,CAAM,EAEnB,CAACH,EAAG,mBAAmBG,EAAQH,EAAG,cAAc,EAAG,CACrD,MAAMT,EAAQS,EAAG,iBAAiBG,CAAM,EACxC,MAAAH,EAAG,aAAaG,CAAM,EAChB,IAAI,MAAM,6BAA6BZ,CAAK,EAAE,CACtD,CAEA,OAAOY,CACT,CAEQ,cACNC,EACAC,EACAC,EACe,CACf,KAAM,CAAE,GAAAN,GAAO,KAETO,EAAa,KAAK,aAAaH,EAAYJ,EAAG,aAAa,EAC3DQ,EAAa,KAAK,aAAaH,EAAYL,EAAG,eAAe,EAE7DS,EAAUT,EAAG,cAAA,EACnB,GAAI,CAACS,EAAS,MAAM,IAAI,MAAM,0BAA0B,EAMxD,GAJAT,EAAG,aAAaS,EAASF,CAAU,EACnCP,EAAG,aAAaS,EAASD,CAAU,EACnCR,EAAG,YAAYS,CAAO,EAElB,CAACT,EAAG,oBAAoBS,EAAST,EAAG,WAAW,EAAG,CACpD,MAAMT,EAAQS,EAAG,kBAAkBS,CAAO,EAC1C,MAAM,IAAI,MAAM,uBAAuBlB,CAAK,EAAE,CAChD,CAGAS,EAAG,aAAaO,CAAU,EAC1BP,EAAG,aAAaQ,CAAU,EAG1B,MAAME,EAAeV,EAAG,kBAAkBS,EAAS,UAAU,EACvDE,EAAeX,EAAG,mBAAmBS,EAAS,QAAQ,EACtDG,EAAmBZ,EAAG,mBAAmBS,EAAS,YAAY,EAC9DI,EAAeb,EAAG,mBAAmBS,EAAS,QAAQ,EAE5D,GACEE,IAAiB,MACjBC,IAAqB,MACrBC,IAAiB,KAEjB,MAAM,IAAI,MAAM,iCAAiC,EAGnD,MAAM/G,EAAwB,CAC5B,QAAA2G,EACA,WAAY,CAAE,SAAUC,CAAA,EACxB,SAAU,CACR,OAAQC,EACR,WAAYC,EACZ,OAAQC,CAAA,CACV,EAGF,OAAIP,IACFxG,EAAO,SAAS,WACdkG,EAAG,mBAAmBS,EAAS,YAAY,GAAK,OAClD3G,EAAO,SAAS,QACdkG,EAAG,mBAAmBS,EAAS,SAAS,GAAK,QAG1C3G,CACT,CAMA,IAAI,WAAqB,CACvB,OAAO,KAAK,aACd,CAKA,aAAagH,EAAY1J,EAA0B,CACjD,KAAM,CAAE,GAAA4I,GAAO,KACf,IAAIe,EAAS,KAAK,QAAQ,IAAID,CAAE,EAChC,MAAME,EAAc,KAAK,YAAY,IAAIF,CAAE,GAAK,EAEhD,GAAIC,GAAU3J,EAAK,YAAc4J,EAE/BhB,EAAG,WAAWA,EAAG,aAAce,CAAM,EACrCf,EAAG,cAAcA,EAAG,aAAc,EAAG5I,CAAI,MACpC,CAML,GAJI2J,GACFf,EAAG,aAAae,CAAM,EAExBA,EAASf,EAAG,aAAA,EACR,CAACe,EAAQ,MAAM,IAAI,MAAM,yBAAyB,EAEtDf,EAAG,WAAWA,EAAG,aAAce,CAAM,EACrCf,EAAG,WAAWA,EAAG,aAAc5I,EAAM4I,EAAG,YAAY,EAEpD,KAAK,QAAQ,IAAIc,EAAIC,CAAM,EAC3B,KAAK,YAAY,IAAID,EAAI1J,EAAK,UAAU,CAC1C,CACF,CAMA,aAAa0J,EAAY1J,EAAoB6J,EAAgC,CAC3E,KAAM,CAAE,GAAAjB,GAAO,KACTe,EAAS,KAAK,QAAQ,IAAID,CAAE,EAC5BE,EAAc,KAAK,YAAY,IAAIF,CAAE,GAAK,EAEhD,MAAI,CAACC,GAAUE,EAAgB7J,EAAK,WAAa4J,EACxC,IAGThB,EAAG,WAAWA,EAAG,aAAce,CAAM,EACrCf,EAAG,cAAcA,EAAG,aAAciB,EAAe7J,CAAI,EAC9C,GACT,CAKA,UAAU0J,EAAqC,CAC7C,OAAO,KAAK,QAAQ,IAAIA,CAAE,CAC5B,CAKA,aAAaA,EAAkB,CAC7B,MAAMC,EAAS,KAAK,QAAQ,IAAID,CAAE,EAC9BC,IACF,KAAK,GAAG,aAAaA,CAAM,EAC3B,KAAK,QAAQ,OAAOD,CAAE,EACtB,KAAK,YAAY,OAAOA,CAAE,EAE9B,CASQ,kBAAkBI,EAGxB,CACA,MAAMC,EAAYD,EAAO,KAAOA,EAAO,KACjCE,EAAaF,EAAO,KAAOA,EAAO,KAElCG,EAASF,EAAY,EAAI,EAAIA,EAAY,EACzCG,EAASF,EAAa,EAAI,EAAIA,EAAa,EAE3CG,EAAa,GAAKL,EAAO,KAAOG,EAChCG,EAAa,GAAKN,EAAO,KAAOI,EAEtC,MAAO,CACL,MAAO,CAACD,EAAQC,CAAM,EACtB,UAAW,CAACC,EAAYC,CAAU,CAAA,CAEtC,CAKA,OAAOC,EAAkCpJ,EAAoC,CAC3E,GAAI,CAAC,KAAK,cAAe,OAEzB,KAAM,CAAE,GAAA2H,GAAO,KACT,CAAE,OAAAkB,EAAQ,gBAAAQ,EAAkB,CAAC,GAAK,GAAK,IAAM,CAAC,EAAG,SAAAC,CAAA,EAAatJ,EAG9DuJ,EAAe,KAAK,OAAO,OAC3BC,EAAc,KAAK,OAAO,MAE1BC,EAAKH,EAAW,CAClB,EAAGA,EAAS,EAAI,KAAK,IACrB,EAAGC,GAAgBD,EAAS,EAAIA,EAAS,QAAU,KAAK,IACxD,MAAOA,EAAS,MAAQ,KAAK,IAC7B,OAAQA,EAAS,OAAS,KAAK,GAAA,EAC/B,CACA,EAAG,EAAG,EAAG,EAAG,MAAOE,EAAa,OAAQD,CAAA,EAI5C5B,EAAG,SAAS,EAAG,EAAG6B,EAAaD,CAAY,EAC3C5B,EAAG,QAAQA,EAAG,YAAY,EAC1BA,EAAG,WACD0B,EAAgB,CAAC,EACjBA,EAAgB,CAAC,EACjBA,EAAgB,CAAC,EACjBA,EAAgB,CAAC,CAAA,EAEnB1B,EAAG,MAAMA,EAAG,gBAAgB,EAG5BA,EAAG,SAAS8B,EAAG,EAAGA,EAAG,EAAGA,EAAG,MAAOA,EAAG,MAAM,EAC3C9B,EAAG,OAAOA,EAAG,YAAY,EACzBA,EAAG,QAAQ8B,EAAG,EAAGA,EAAG,EAAGA,EAAG,MAAOA,EAAG,MAAM,EAE1C,MAAMC,EAAW,KAAK,kBAAkBb,CAAM,EAG9C,UAAWc,KAAKP,EAAQ,CACtB,GAAI,CAACO,EAAE,SAAWA,EAAE,QAAU,EAAG,SAEjC,MAAMC,EAAOD,EAAE,QAAUA,EAAE,QAAQ,IAAMd,EAAO,KAE1CgB,GADOF,EAAE,QAAUA,EAAE,QAAQ,IAAMd,EAAO,MAC1Be,EAGhBE,EAASD,EAAS,EAAI,EAAIA,EAAS,EACnCE,EAAS,GAAKH,EAAOE,EAErBE,EAAiB,CACrB,MAAO,CAACN,EAAS,MAAM,CAAC,EAAGI,CAAM,EACjC,UAAW,CAACJ,EAAS,UAAU,CAAC,EAAGK,CAAM,CAAA,EAGrCE,EAAQC,EAAWP,EAAE,MAAM,OAAS,SAAS,EACnDM,EAAM,CAAC,EAAIN,EAAE,MAAM,SAAW,EAE1BA,EAAE,OAAS,UACb,KAAK,aACHA,EAAE,OACFA,EAAE,MACFK,EACAC,GACCN,EAAE,MAAM,WAAa,GAAK,KAAK,IAChCA,EAAE,MAAM,MAAA,EAEDA,EAAE,OAAS,OACpB,KAAK,WAAWA,EAAE,OAAQA,EAAE,MAAOK,EAAgBC,CAAK,EAC/CN,EAAE,OAAS,gBACpB,KAAK,WAAWA,EAAE,OAAQA,EAAE,MAAOK,EAAgBC,CAAK,EACxD,KAAK,aACHN,EAAE,OACFA,EAAE,MACFK,EACAC,GACCN,EAAE,MAAM,WAAa,GAAK,KAAK,IAChCA,EAAE,MAAM,MAAA,GAEDA,EAAE,OAAS,QAAUA,EAAE,OAAS,gBAErCA,EAAE,YAAcA,EAAE,UACpB,KAAK,WAAWA,EAAE,WAAYA,EAAE,UAAWK,EAAgBC,CAAK,EAEhE,KAAK,WAAWN,EAAE,OAAQA,EAAE,MAAOK,EAAgBC,CAAK,EAGtDN,EAAE,OAAS,gBACb,KAAK,aACHA,EAAE,OACFA,EAAE,MACFK,EACAC,GACCN,EAAE,MAAM,WAAa,GAAK,KAAK,IAChCA,EAAE,MAAM,MAAA,GAGHA,EAAE,OAAS,QACpB,KAAK,WAAWA,EAAE,OAAQA,EAAE,MAAOK,EAAgBC,CAAK,CAE5D,CACF,CAEQ,WACNvB,EACAjJ,EACAiK,EACAO,EACM,CACN,KAAM,CAAE,GAAAtC,GAAO,KACTwC,EAAO,KAAK,YAElBxC,EAAG,WAAWwC,EAAK,OAAO,EAC1BxC,EAAG,WAAWA,EAAG,aAAce,CAAM,EACrCf,EAAG,wBAAwBwC,EAAK,WAAW,QAAQ,EACnDxC,EAAG,oBAAoBwC,EAAK,WAAW,SAAU,EAAGxC,EAAG,MAAO,GAAO,EAAG,CAAC,EAEzEA,EAAG,UAAUwC,EAAK,SAAS,OAAQT,EAAS,MAAM,CAAC,EAAGA,EAAS,MAAM,CAAC,CAAC,EACvE/B,EAAG,UAAUwC,EAAK,SAAS,WAAYT,EAAS,UAAU,CAAC,EAAGA,EAAS,UAAU,CAAC,CAAC,EAGnF,MAAMU,EAAQH,EAAM,CAAC,EAAI,GACzBtC,EAAG,UAAUwC,EAAK,SAAS,OAAQF,EAAM,CAAC,EAAGA,EAAM,CAAC,EAAGA,EAAM,CAAC,EAAGG,CAAK,EAItEzC,EAAG,WAAWA,EAAG,eAAgB,EAAGlI,CAAK,EAEzCkI,EAAG,yBAAyBwC,EAAK,WAAW,QAAQ,CACtD,CAEQ,WACNzB,EACAjJ,EACAiK,EACAO,EACM,CACN,KAAM,CAAE,GAAAtC,GAAO,KACTwC,EAAO,KAAK,YAElBxC,EAAG,WAAWwC,EAAK,OAAO,EAG1BxC,EAAG,WAAWA,EAAG,aAAce,CAAM,EACrCf,EAAG,wBAAwBwC,EAAK,WAAW,QAAQ,EACnDxC,EAAG,oBAAoBwC,EAAK,WAAW,SAAU,EAAGxC,EAAG,MAAO,GAAO,EAAG,CAAC,EAGzEA,EAAG,UAAUwC,EAAK,SAAS,OAAQT,EAAS,MAAM,CAAC,EAAGA,EAAS,MAAM,CAAC,CAAC,EACvE/B,EAAG,UACDwC,EAAK,SAAS,WACdT,EAAS,UAAU,CAAC,EACpBA,EAAS,UAAU,CAAC,CAAA,EAEtB/B,EAAG,UAAUwC,EAAK,SAAS,OAAQF,EAAM,CAAC,EAAGA,EAAM,CAAC,EAAGA,EAAM,CAAC,EAAGA,EAAM,CAAC,CAAC,EAGzEtC,EAAG,WAAWA,EAAG,WAAY,EAAGlI,CAAK,EAErCkI,EAAG,yBAAyBwC,EAAK,WAAW,QAAQ,CACtD,CAEQ,aACNzB,EACAjJ,EACAiK,EACAO,EACAI,EACAC,EAAiB,SACX,CACN,KAAM,CAAE,GAAA3C,GAAO,KACTwC,EAAO,KAAK,aAsBlB,GApBAxC,EAAG,WAAWwC,EAAK,OAAO,EAG1BxC,EAAG,WAAWA,EAAG,aAAce,CAAM,EACrCf,EAAG,wBAAwBwC,EAAK,WAAW,QAAQ,EACnDxC,EAAG,oBAAoBwC,EAAK,WAAW,SAAU,EAAGxC,EAAG,MAAO,GAAO,EAAG,CAAC,EAGzEA,EAAG,UAAUwC,EAAK,SAAS,OAAQT,EAAS,MAAM,CAAC,EAAGA,EAAS,MAAM,CAAC,CAAC,EACvE/B,EAAG,UACDwC,EAAK,SAAS,WACdT,EAAS,UAAU,CAAC,EACpBA,EAAS,UAAU,CAAC,CAAA,EAEtB/B,EAAG,UAAUwC,EAAK,SAAS,OAAQF,EAAM,CAAC,EAAGA,EAAM,CAAC,EAAGA,EAAM,CAAC,EAAGA,EAAM,CAAC,CAAC,EAErEE,EAAK,SAAS,YAChBxC,EAAG,UAAUwC,EAAK,SAAS,WAAYE,CAAS,EAG9CF,EAAK,SAAS,QAAS,CAEzB,MAAMI,EAAoC,CACxC,OAAU,EACV,OAAU,EACV,QAAW,EACX,SAAY,EACZ,aAAgB,EAChB,MAAS,EACT,EAAK,EACL,KAAQ,CAAA,EAEV5C,EAAG,UAAUwC,EAAK,SAAS,QAASI,EAAUD,CAAM,GAAK,CAAC,CAC5D,CAGA3C,EAAG,WAAWA,EAAG,OAAQ,EAAGlI,CAAK,EAEjCkI,EAAG,yBAAyBwC,EAAK,WAAW,QAAQ,CACtD,CAKA,QAAe,CACb,MAAMK,EAAO,KAAK,OAAO,sBAAA,EACnBC,EAAQD,EAAK,MAAQ,KAAK,IAC1BE,EAASF,EAAK,OAAS,KAAK,KAE9B,KAAK,OAAO,QAAUC,GAAS,KAAK,OAAO,SAAWC,KACxD,KAAK,OAAO,MAAQD,EACpB,KAAK,OAAO,OAASC,EACrB,KAAK,GAAG,SAAS,EAAG,EAAGD,EAAOC,CAAM,EAExC,CAKA,WAAY,CACV,KAAM,CAAE,GAAA/C,GAAO,KACf,MAAO,CACL,eAAgBA,EAAG,aAAaA,EAAG,gBAAgB,EACnD,gBAAiBA,EAAG,aAAaA,EAAG,iBAAiB,EACrD,SAAUA,EAAG,aAAaA,EAAG,QAAQ,EACrC,OAAQA,EAAG,aAAaA,EAAG,MAAM,CAAA,CAErC,CAKA,SAAgB,CACd,KAAM,CAAE,GAAAA,GAAO,KAGf,KAAK,QAAQ,QAASe,GAAWf,EAAG,aAAae,CAAM,CAAC,EACxD,KAAK,QAAQ,MAAA,EACb,KAAK,YAAY,MAAA,EAGjBf,EAAG,cAAc,KAAK,YAAY,OAAO,EACzCA,EAAG,cAAc,KAAK,aAAa,OAAO,EAE1C,KAAK,cAAgB,GACrB,QAAQ,IAAI,yBAAyB,CACvC,CACF,CAMO,SAASuC,EAAWD,EAAiD,CAC1E,GAAIA,EAAM,WAAW,GAAG,EAAG,CACzB,MAAMU,EAAMV,EAAM,MAAM,CAAC,EACzB,GAAIU,EAAI,SAAW,EAAG,CACpB,MAAMC,EAAI,SAASD,EAAI,CAAC,EAAIA,EAAI,CAAC,EAAG,EAAE,EAAI,IACpCE,EAAI,SAASF,EAAI,CAAC,EAAIA,EAAI,CAAC,EAAG,EAAE,EAAI,IACpC/D,EAAI,SAAS+D,EAAI,CAAC,EAAIA,EAAI,CAAC,EAAG,EAAE,EAAI,IAC1C,MAAO,CAACC,EAAGC,EAAGjE,EAAG,CAAC,CACpB,SAAW+D,EAAI,SAAW,EAAG,CAC3B,MAAMC,EAAI,SAASD,EAAI,MAAM,EAAG,CAAC,EAAG,EAAE,EAAI,IACpCE,EAAI,SAASF,EAAI,MAAM,EAAG,CAAC,EAAG,EAAE,EAAI,IACpC/D,EAAI,SAAS+D,EAAI,MAAM,EAAG,CAAC,EAAG,EAAE,EAAI,IAC1C,MAAO,CAACC,EAAGC,EAAGjE,EAAG,CAAC,CACpB,SAAW+D,EAAI,SAAW,EAAG,CAC3B,MAAMC,EAAI,SAASD,EAAI,MAAM,EAAG,CAAC,EAAG,EAAE,EAAI,IACpCE,EAAI,SAASF,EAAI,MAAM,EAAG,CAAC,EAAG,EAAE,EAAI,IACpC/D,EAAI,SAAS+D,EAAI,MAAM,EAAG,CAAC,EAAG,EAAE,EAAI,IACpCzI,EAAI,SAASyI,EAAI,MAAM,EAAG,CAAC,EAAG,EAAE,EAAI,IAC1C,MAAO,CAACC,EAAGC,EAAGjE,EAAG1E,CAAC,CACpB,CACF,CAGA,MAAO,CAAC,EAAG,EAAG,EAAG,CAAC,CACpB,CAMO,SAAS4I,GACdhL,EACAC,EACc,CACd,MAAMgL,EAAS,KAAK,IAAIjL,EAAE,OAAQC,EAAE,MAAM,EACpC0B,EAAS,IAAI,aAAasJ,EAAS,CAAC,EAE1C,QAAS3M,EAAI,EAAGA,EAAI2M,EAAQ3M,IAC1BqD,EAAOrD,EAAI,CAAC,EAAI0B,EAAE1B,CAAC,EACnBqD,EAAOrD,EAAI,EAAI,CAAC,EAAI2B,EAAE3B,CAAC,EAGzB,OAAOqD,CACT,CAmBO,SAASuJ,GACdlL,EACAC,EACAkL,EAAsC,QACxB,CACd,MAAMF,EAAS,KAAK,IAAIjL,EAAE,OAAQC,EAAE,MAAM,EAC1C,GAAIgL,EAAS,EAEX,OAAOD,GAAehL,EAAGC,CAAC,EAI5B,MAAMmL,EAAYH,EAAS,EAAI,EACzBtJ,EAAS,IAAI,aAAayJ,EAAY,CAAC,EAE7C,IAAIC,EAAY,EAEhB,QAAS/M,EAAI,EAAGA,EAAI2M,EAAQ3M,IAC1B,GAAIA,IAAM,EAERqD,EAAO0J,GAAW,EAAIrL,EAAE,CAAC,EACzB2B,EAAO0J,GAAW,EAAIpL,EAAE,CAAC,MACpB,CACL,MAAMqL,EAAQtL,EAAE1B,EAAI,CAAC,EACfiN,EAAQtL,EAAE3B,EAAI,CAAC,EACfkN,EAAQxL,EAAE1B,CAAC,EACXmN,EAAQxL,EAAE3B,CAAC,EAEjB,GAAI6M,IAAS,QAGXxJ,EAAO0J,GAAW,EAAIG,EACtB7J,EAAO0J,GAAW,EAAIE,EAEtB5J,EAAO0J,GAAW,EAAIG,EACtB7J,EAAO0J,GAAW,EAAII,UACbN,IAAS,SAGlBxJ,EAAO0J,GAAW,EAAIC,EACtB3J,EAAO0J,GAAW,EAAII,EAEtB9J,EAAO0J,GAAW,EAAIG,EACtB7J,EAAO0J,GAAW,EAAII,MACjB,CAEL,MAAMC,GAAQJ,EAAQE,GAAS,EAE/B7J,EAAO0J,GAAW,EAAIK,EACtB/J,EAAO0J,GAAW,EAAIE,EAEtB5J,EAAO0J,GAAW,EAAIK,EACtB/J,EAAO0J,GAAW,EAAII,EAEtB9J,EAAO0J,GAAW,EAAIG,EACtB7J,EAAO0J,GAAW,EAAII,CACxB,CACF,CAIF,OAAO9J,EAAO,SAAS,EAAG0J,CAAS,CACrC,CAOO,SAASM,GACd3L,EACAyD,EACA4B,EACc,CACd,MAAMnC,EAAI,KAAK,IAAIlD,EAAE,OAAQyD,EAAG,OAAQ4B,EAAG,MAAM,EAC3C1D,EAAS,IAAI,aAAauB,EAAI,EAAI,CAAC,EAEzC,QAAS5E,EAAI,EAAGA,EAAI4E,EAAG5E,IAAK,CAC1B,MAAMsN,EAAMtN,EAAI,EACVuN,EAAK7L,EAAE1B,CAAC,EAEdqD,EAAOiK,EAAM,CAAC,EAAIC,EAClBlK,EAAOiK,EAAM,CAAC,EAAInI,EAAGnF,CAAC,EAEtBqD,EAAOiK,EAAM,CAAC,EAAIC,EAClBlK,EAAOiK,EAAM,CAAC,EAAIvG,EAAG/G,CAAC,CACxB,CACA,OAAOqD,CACT,CCnsBA,MAAMmK,EAAgC,CACpC,UAAW,UACX,UAAW,EACX,UAAW,UACX,WAAY,EACZ,WAAY,UACZ,UAAW,GACX,WAAY,UACZ,UAAW,GACX,WAAY,8BACd,EAEMC,EAAgC,CACpC,QAAS,GACT,WAAY,4BACZ,WAAY,4BACZ,WAAY,EACZ,WAAY,GACZ,UAAW,CAAC,EAAG,CAAC,EAChB,UAAW,CAAC,EAAG,CAAC,EAChB,UAAW,GACX,eAAgB,CAClB,EAEMC,EAAoC,CACxC,QAAS,GACT,SAAU,YACV,gBAAiB,wBACjB,YAAa,4BACb,aAAc,EACd,UAAW,UACX,SAAU,GACV,WAAY,+BACZ,QAAS,EACT,QAAS,EACT,WAAY,EACd,EAEMC,GAAoC,CACxC,UAAW,2BACX,UAAW,EACX,SAAU,CAAC,EAAG,CAAC,EACf,kBAAmB,yBACnB,cAAe,2BACf,aAAc,UACd,YAAa,EACf,EAMaC,GAAyB,CACpC,KAAM,OACN,gBAAiB,UACjB,gBAAiB,UACjB,KAAM,CACJ,GAAGH,EACH,WAAY,4BACZ,WAAY,2BAAA,EAEd,MAAO,CACL,GAAGD,EACH,WAAY,UACZ,WAAY,UACZ,UAAW,UACX,UAAW,SAAA,EAEb,MAAO,CACL,GAAGA,EACH,WAAY,UACZ,WAAY,UACZ,UAAW,UACX,UAAW,SAAA,EAEb,OAAQE,EACR,OAAQC,EACV,EAEaE,GAA6B,CACxC,KAAM,WACN,gBAAiB,UACjB,gBAAiB,UACjB,KAAM,CACJ,GAAGJ,EACH,WAAY,2BACZ,WAAY,2BAAA,EAEd,MAAO,CACL,GAAGD,EACH,UAAW,UACX,WAAY,UACZ,WAAY,UACZ,UAAW,SAAA,EAEb,MAAO,CACL,GAAGA,EACH,UAAW,UACX,WAAY,UACZ,WAAY,UACZ,UAAW,SAAA,EAEb,OAAQ,CACN,GAAGE,EACH,gBAAiB,yBACjB,YAAa,0BAAA,EAEf,OAAQ,CACN,GAAGC,GACH,UAAW,0BAAA,CAEf,EAGaG,GAA0B,CACrC,KAAM,QACN,gBAAiB,UACjB,gBAAiB,UACjB,KAAM,CACJ,GAAGL,EACH,WAAY,qBACZ,WAAY,qBAAA,EAEd,MAAO,CACL,GAAGD,EACH,UAAW,UACX,UAAW,UACX,WAAY,UACZ,WAAY,SAAA,EAEd,MAAO,CACL,GAAGA,EACH,UAAW,UACX,UAAW,UACX,WAAY,UACZ,WAAY,SAAA,EAEd,OAAQ,CACN,GAAGE,EACH,gBAAiB,4BACjB,YAAa,sBACb,UAAW,SAAA,EAEb,OAAQ,CACN,GAAGC,GACH,UAAW,qBACX,kBAAmB,wBAAA,CAEvB,EAGaI,GAAgC,CAC3C,KAAM,mBACN,gBAAiB,UACjB,gBAAiB,UACjB,KAAM,CACJ,GAAGN,EACH,WAAY,2BACZ,WAAY,2BACZ,UAAW,GACX,eAAgB,CAAA,EAElB,MAAO,CACL,GAAGD,EACH,UAAW,UACX,UAAW,UACX,WAAY,UACZ,WAAY,SAAA,EAEd,MAAO,CACL,GAAGA,EACH,UAAW,UACX,UAAW,UACX,WAAY,UACZ,WAAY,SAAA,EAEd,OAAQ,CACN,GAAGE,EACH,gBAAiB,yBACjB,YAAa,yBAAA,EAEf,OAAQ,CACN,GAAGC,GACH,UAAW,0BAAA,CAEf,EASO,SAASK,GACdC,EACAC,EACY,CACZ,MAAO,CACL,GAAGD,EACH,GAAGC,EACH,KAAM,CAAE,GAAGD,EAAK,KAAM,GAAGC,EAAU,IAAA,EACnC,MAAO,CAAE,GAAGD,EAAK,MAAO,GAAGC,EAAU,KAAA,EACrC,MAAO,CAAE,GAAGD,EAAK,MAAO,GAAGC,EAAU,KAAA,EACrC,OAAQ,CAAE,GAAGD,EAAK,OAAQ,GAAGC,EAAU,MAAA,EACvC,OAAQ,CAAE,GAAGD,EAAK,OAAQ,GAAGC,EAAU,MAAA,CAAO,CAElD,CAKO,SAASC,GAAeC,EAA0B,CACvD,OAAQA,EAAA,CACN,IAAK,OACH,OAAOR,GACT,IAAK,WACH,OAAOC,GACT,IAAK,QACH,OAAOC,GACT,IAAK,mBACL,IAAK,cACH,OAAOC,GACT,QACE,eAAQ,KAAK,0BAA0BK,CAAI,eAAe,EACnDR,EAAA,CAEb,CAGO,MAAMS,GAAgBT,GCxTtB,MAAMU,EAAgB,CAI3B,YAAYC,EAA+BC,EAAmB,CAHtD9F,EAAA,YACAA,EAAA,cAGN,KAAK,IAAM6F,EACX,KAAK,MAAQC,CACf,CAKA,SAASA,EAAyB,CAChC,KAAK,MAAQA,CACf,CAKA,MAAMnC,EAAeC,EAAsB,CACzC,KAAK,IAAI,UAAU,EAAG,EAAGD,EAAOC,CAAM,CACxC,CAKA,SAASpB,EAAoBuD,EAAe/C,EAAqB,CAC/D,GAAI,CAAC,KAAK,MAAM,KAAK,QAAS,OAE9B,KAAM,CAAE,IAAA6C,GAAQ,KACVG,EAAO,KAAK,MAAM,KAElBC,EAASF,EAAO,MAAM,CAAC,EACvBG,EAASlD,EAAO,MAAM,CAAC,EA8B7B,GA3BA6C,EAAI,YAAcG,EAAK,WACvBH,EAAI,UAAYG,EAAK,WACrBH,EAAI,YAAYG,EAAK,SAAS,EAG9BC,EAAO,QAASE,GAAS,CACvB,MAAMnN,EAAI+M,EAAO,UAAUI,CAAI,EAC3BnN,GAAKwJ,EAAS,GAAKxJ,GAAKwJ,EAAS,EAAIA,EAAS,QAChDqD,EAAI,UAAA,EACJA,EAAI,OAAO7M,EAAGwJ,EAAS,CAAC,EACxBqD,EAAI,OAAO7M,EAAGwJ,EAAS,EAAIA,EAAS,MAAM,EAC1CqD,EAAI,OAAA,EAER,CAAC,EAGDK,EAAO,QAASC,GAAS,CACvB,MAAMlN,EAAI+J,EAAO,UAAUmD,CAAI,EAC3BlN,GAAKuJ,EAAS,GAAKvJ,GAAKuJ,EAAS,EAAIA,EAAS,SAChDqD,EAAI,UAAA,EACJA,EAAI,OAAOrD,EAAS,EAAGvJ,CAAC,EACxB4M,EAAI,OAAOrD,EAAS,EAAIA,EAAS,MAAOvJ,CAAC,EACzC4M,EAAI,OAAA,EAER,CAAC,EAGGG,EAAK,UAAW,CAClBH,EAAI,YAAcG,EAAK,WACvBH,EAAI,UAAYG,EAAK,WACrBH,EAAI,YAAYG,EAAK,SAAS,EAG9B,MAAMI,EAAc,KAAK,mBAAmBH,EAAQD,EAAK,cAAc,EACjEK,EAAc,KAAK,mBAAmBH,EAAQF,EAAK,cAAc,EAEvEI,EAAY,QAASD,GAAS,CAC5B,MAAMnN,EAAI+M,EAAO,UAAUI,CAAI,EAC3BnN,GAAKwJ,EAAS,GAAKxJ,GAAKwJ,EAAS,EAAIA,EAAS,QAChDqD,EAAI,UAAA,EACJA,EAAI,OAAO7M,EAAGwJ,EAAS,CAAC,EACxBqD,EAAI,OAAO7M,EAAGwJ,EAAS,EAAIA,EAAS,MAAM,EAC1CqD,EAAI,OAAA,EAER,CAAC,EAEDQ,EAAY,QAASF,GAAS,CAC5B,MAAMlN,EAAI+J,EAAO,UAAUmD,CAAI,EAC3BlN,GAAKuJ,EAAS,GAAKvJ,GAAKuJ,EAAS,EAAIA,EAAS,SAChDqD,EAAI,UAAA,EACJA,EAAI,OAAOrD,EAAS,EAAGvJ,CAAC,EACxB4M,EAAI,OAAOrD,EAAS,EAAIA,EAAS,MAAOvJ,CAAC,EACzC4M,EAAI,OAAA,EAER,CAAC,CACH,CAEAA,EAAI,YAAY,EAAE,CACpB,CAKA,UAAUrD,EAAoBuD,EAAeO,EAAsB,CACjE,KAAM,CAAE,IAAAT,GAAQ,KACVU,EAAO,KAAK,MAAM,MAClBN,EAASF,EAAO,MAAM,CAAC,EACvBS,EAAQhE,EAAS,EAAIA,EAAS,OAGpCqD,EAAI,YAAcU,EAAK,UACvBV,EAAI,UAAYU,EAAK,UACrBV,EAAI,UAAA,EACJA,EAAI,OAAOrD,EAAS,EAAGgE,CAAK,EAC5BX,EAAI,OAAOrD,EAAS,EAAIA,EAAS,MAAOgE,CAAK,EAC7CX,EAAI,OAAA,EAGJA,EAAI,UAAYU,EAAK,WACrBV,EAAI,KAAO,GAAGU,EAAK,SAAS,MAAMA,EAAK,UAAU,GACjDV,EAAI,UAAY,SAChBA,EAAI,aAAe,MAEnBI,EAAO,QAASE,GAAS,CACvB,MAAMnN,EAAI+M,EAAO,UAAUI,CAAI,EAE3BnN,GAAKwJ,EAAS,GAAKxJ,GAAKwJ,EAAS,EAAIA,EAAS,QAEhDqD,EAAI,YAAcU,EAAK,UACvBV,EAAI,UAAA,EACJA,EAAI,OAAO7M,EAAGwN,CAAK,EACnBX,EAAI,OAAO7M,EAAGwN,EAAQD,EAAK,UAAU,EACrCV,EAAI,OAAA,EAGJA,EAAI,SAAS,KAAK,YAAYM,CAAI,EAAGnN,EAAGwN,EAAQD,EAAK,WAAa,CAAC,EAEvE,CAAC,EAGGD,IACFT,EAAI,UAAYU,EAAK,WACrBV,EAAI,KAAO,GAAGU,EAAK,SAAS,MAAMA,EAAK,UAAU,GACjDV,EAAI,UAAY,SAChBA,EAAI,aAAe,SACnBA,EAAI,SACFS,EACA9D,EAAS,EAAIA,EAAS,MAAQ,EAC9BA,EAAS,EAAIA,EAAS,OAAS,EAAA,EAGrC,CAKA,UACEA,EACAQ,EACAsD,EACAG,EAA6B,OAC7BC,EAAiB,EACX,CACN,KAAM,CAAE,IAAAb,GAAQ,KACVU,EAAO,KAAK,MAAM,MAClBL,EAASlD,EAAO,MAAM,CAAC,EAEvB2D,EAAQF,IAAa,OAASjE,EAAS,EAAIkE,EAASlE,EAAS,EAAIA,EAAS,MAAQkE,EAClFE,EAAUH,IAAa,OAAS,GAAK,EAkC3C,GA/BAZ,EAAI,YAAcU,EAAK,UACvBV,EAAI,UAAYU,EAAK,UACrBV,EAAI,UAAA,EACJA,EAAI,OAAOc,EAAOnE,EAAS,CAAC,EAC5BqD,EAAI,OAAOc,EAAOnE,EAAS,EAAIA,EAAS,MAAM,EAC9CqD,EAAI,OAAA,EAGJA,EAAI,UAAYU,EAAK,WACrBV,EAAI,KAAO,GAAGU,EAAK,SAAS,MAAMA,EAAK,UAAU,GACjDV,EAAI,UAAYY,IAAa,OAAS,QAAU,OAChDZ,EAAI,aAAe,SAEnBK,EAAO,QAASC,GAAS,CACvB,MAAMlN,EAAI+J,EAAO,UAAUmD,CAAI,EAE/B,GAAIlN,GAAKuJ,EAAS,GAAKvJ,GAAKuJ,EAAS,EAAIA,EAAS,OAAQ,CAExDqD,EAAI,YAAcU,EAAK,UACvBV,EAAI,UAAA,EACJA,EAAI,OAAOc,EAAO1N,CAAC,EACnB4M,EAAI,OAAOc,EAAQJ,EAAK,WAAaK,EAAS3N,CAAC,EAC/C4M,EAAI,OAAA,EAGJ,MAAMgB,EAASF,GAASJ,EAAK,WAAa,GAAKK,EAC/Cf,EAAI,SAAS,KAAK,YAAYM,CAAI,EAAGU,EAAQ5N,CAAC,CAChD,CACF,CAAC,EAGGqN,EAAO,CACTT,EAAI,KAAA,EACJA,EAAI,UAAYU,EAAK,WACrBV,EAAI,KAAO,GAAGU,EAAK,SAAS,MAAMA,EAAK,UAAU,GACjDV,EAAI,UAAY,SAChBA,EAAI,aAAe,MAEnB,MAAMiB,EAASL,IAAa,OACxBE,EAAQ,GACRA,EAAQ,GAENI,EAASvE,EAAS,EAAIA,EAAS,OAAS,EAE9CqD,EAAI,UAAUiB,EAAQC,CAAM,EAC5BlB,EAAI,OAAOY,IAAa,OAAS,CAAC,KAAK,GAAK,EAAI,KAAK,GAAK,CAAC,EAC3DZ,EAAI,SAASS,EAAO,EAAG,CAAC,EACxBT,EAAI,QAAA,CACN,CACF,CAKA,eAAerD,EAA0B,CACvC,KAAM,CAAE,IAAAqD,GAAQ,KAChBA,EAAI,YAAc,KAAK,MAAM,gBAC7BA,EAAI,UAAY,EAChBA,EAAI,WAAWrD,EAAS,EAAGA,EAAS,EAAGA,EAAS,MAAOA,EAAS,MAAM,CACxE,CAKA,WAAWA,EAAoBF,EAAwB,CACrD,GAAIA,EAAO,SAAW,EAAG,OAEzB,KAAM,CAAE,IAAAuD,GAAQ,KACVmB,EAAS,KAAK,MAAM,OAG1BnB,EAAI,KAAO,GAAGmB,EAAO,QAAQ,MAAMA,EAAO,UAAU,GACpD,IAAIC,EAAW,EACf,MAAMC,EAAQ5E,EAAO,IAAKO,GAAM,CAC9B,MAAMyD,EAAQzD,EAAE,MAAA,EACVsE,EAAQtE,EAAE,SAAA,EACVc,EAAQkC,EAAI,YAAYS,CAAK,EAAE,MACrC,OAAAW,EAAW,KAAK,IAAIA,EAAUtD,CAAK,EAC5B,CACL,GAAId,EAAE,MAAA,EACN,MAAOsE,EAAM,OAAS,UACtB,MAAAb,EACA,KAAMzD,EAAE,QAAA,EACR,OAAQsE,EAAM,OACd,QAASA,EAAM,SAAW,CAAA,CAE9B,CAAC,EAEKC,EAAWJ,EAAO,WAAa,EAAIC,EAAWD,EAAO,QAAU,EAC/DK,EACJH,EAAM,QAAUF,EAAO,WAAaA,EAAO,SAC3CA,EAAO,QACPA,EAAO,QAAU,EAGnB,IAAIhO,EAAWC,EACf,OAAQ+N,EAAO,SAAA,CACb,IAAK,WACHhO,EAAIwJ,EAAS,EAAI,GACjBvJ,EAAIuJ,EAAS,EAAI,GACjB,MACF,IAAK,cACHxJ,EAAIwJ,EAAS,EAAI,GACjBvJ,EAAIuJ,EAAS,EAAI,GACjB,MACF,IAAK,eACHxJ,EAAIwJ,EAAS,EAAIA,EAAS,MAAQ4E,EAAW,GAC7CnO,EAAIuJ,EAAS,EAAIA,EAAS,OAAS6E,EAAY,GAC/C,MACF,IAAK,YACL,QACErO,EAAIwJ,EAAS,EAAIA,EAAS,MAAQ4E,EAAW,GAC7CnO,EAAIuJ,EAAS,EAAI,GACjB,KAAA,CAIJqD,EAAI,UAAYmB,EAAO,gBACvBnB,EAAI,YAAcmB,EAAO,YACzBnB,EAAI,UAAY,EAChBA,EAAI,UAAA,EACJ,MAAM/B,EAAIkD,EAAO,aACjBnB,EAAI,OAAO7M,EAAI8K,EAAG7K,CAAC,EACnB4M,EAAI,OAAO7M,EAAIoO,EAAWtD,EAAG7K,CAAC,EAC9B4M,EAAI,MAAM7M,EAAIoO,EAAUnO,EAAGD,EAAIoO,EAAUnO,EAAI6K,EAAGA,CAAC,EACjD+B,EAAI,OAAO7M,EAAIoO,EAAUnO,EAAIoO,EAAYvD,CAAC,EAC1C+B,EAAI,MAAM7M,EAAIoO,EAAUnO,EAAIoO,EAAWrO,EAAIoO,EAAWtD,EAAG7K,EAAIoO,EAAWvD,CAAC,EACzE+B,EAAI,OAAO7M,EAAI8K,EAAG7K,EAAIoO,CAAS,EAC/BxB,EAAI,MAAM7M,EAAGC,EAAIoO,EAAWrO,EAAGC,EAAIoO,EAAYvD,EAAGA,CAAC,EACnD+B,EAAI,OAAO7M,EAAGC,EAAI6K,CAAC,EACnB+B,EAAI,MAAM7M,EAAGC,EAAGD,EAAI8K,EAAG7K,EAAG6K,CAAC,EAC3B+B,EAAI,UAAA,EACJA,EAAI,KAAA,EACJA,EAAI,OAAA,EAGJA,EAAI,UAAY,OAChBA,EAAI,aAAe,SAEnBqB,EAAM,QAAQ,CAACI,EAAMhQ,IAAM,CACzB,MAAMiQ,EACJtO,EAAI+N,EAAO,QAAU1P,GAAK0P,EAAO,WAAaA,EAAO,SACjDQ,EAAUxO,EAAIgO,EAAO,QACrBS,EAAUF,EAAQP,EAAO,WAAa,EACtCU,EAAUF,EAAUR,EAAO,WAAa,EAG9CnB,EAAI,KAAA,EACJA,EAAI,YAAcyB,EAAK,QACvBzB,EAAI,UAAYyB,EAAK,MACrBzB,EAAI,YAAcyB,EAAK,MACvBzB,EAAI,UAAY,EAEhB,MAAM8B,EAAOX,EAAO,WAGdY,EAAU,OAAON,EAAK,IAAI,EAAE,YAAA,EAC5BO,EAAY,CAAC,CAACP,EAAK,QAAUA,EAAK,SAAW,SAE7CQ,EAAYF,IAAY,WAAaA,IAAY,KAAQA,IAAY,QAAUC,EAC/EE,EAAgBH,EAAQ,SAAS,SAAS,GAAKA,IAAY,IAE7DE,EACF,KAAK,iBAAiBjC,EAAKyB,EAAK,QAAU,SAAUI,EAASD,EAASE,EAAO,EAAG,EACvEI,GAETlC,EAAI,UAAA,EACJA,EAAI,OAAO2B,EAASC,CAAO,EAC3B5B,EAAI,OAAO2B,EAAUG,EAAMF,CAAO,EAClC5B,EAAI,OAAA,EAEJ,KAAK,iBAAiBA,EAAKyB,EAAK,QAAU,SAAUI,EAASD,EAASE,EAAO,EAAG,IAGhF9B,EAAI,UAAA,EACJA,EAAI,OAAO2B,EAASC,CAAO,EAC3B5B,EAAI,OAAO2B,EAAUG,EAAMF,CAAO,EAClC5B,EAAI,OAAA,GAENA,EAAI,QAAA,EAGJA,EAAI,UAAYmB,EAAO,UACvBnB,EAAI,SACFyB,EAAK,MACLtO,EAAIgO,EAAO,QAAUA,EAAO,WAAa,EACzCS,CAAA,CAEJ,CAAC,CACH,CAKQ,iBACN5B,EACArC,EACAxK,EACAC,EACA0O,EACM,CACN,MAAM7D,EAAI6D,EAAO,EAGjB,OAFA9B,EAAI,UAAA,EAEIrC,EAAA,CACN,IAAK,SACHqC,EAAI,IAAI7M,EAAGC,EAAG6K,EAAG,EAAG,KAAK,GAAK,CAAC,EAC/B+B,EAAI,KAAA,EACJ,MACF,IAAK,SACHA,EAAI,KAAK7M,EAAI8K,EAAG7K,EAAI6K,EAAG6D,EAAMA,CAAI,EACjC9B,EAAI,KAAA,EACJ,MACF,IAAK,UACHA,EAAI,OAAO7M,EAAGC,EAAI6K,CAAC,EACnB+B,EAAI,OAAO7M,EAAI8K,EAAG7K,CAAC,EACnB4M,EAAI,OAAO7M,EAAGC,EAAI6K,CAAC,EACnB+B,EAAI,OAAO7M,EAAI8K,EAAG7K,CAAC,EACnB4M,EAAI,UAAA,EACJA,EAAI,KAAA,EACJ,MACF,IAAK,WACHA,EAAI,OAAO7M,EAAGC,EAAI6K,CAAC,EACnB+B,EAAI,OAAO7M,EAAI8K,EAAG7K,EAAI6K,CAAC,EACvB+B,EAAI,OAAO7M,EAAI8K,EAAG7K,EAAI6K,CAAC,EACvB+B,EAAI,UAAA,EACJA,EAAI,KAAA,EACJ,MACF,IAAK,eACHA,EAAI,OAAO7M,EAAGC,EAAI6K,CAAC,EACnB+B,EAAI,OAAO7M,EAAI8K,EAAG7K,EAAI6K,CAAC,EACvB+B,EAAI,OAAO7M,EAAI8K,EAAG7K,EAAI6K,CAAC,EACvB+B,EAAI,UAAA,EACJA,EAAI,KAAA,EACJ,MACF,IAAK,QACHA,EAAI,OAAO7M,EAAI8K,EAAG7K,CAAC,EACnB4M,EAAI,OAAO7M,EAAI8K,EAAG7K,CAAC,EACnB4M,EAAI,OAAO7M,EAAGC,EAAI6K,CAAC,EACnB+B,EAAI,OAAO7M,EAAGC,EAAI6K,CAAC,EACnB+B,EAAI,OAAA,EACJ,MACF,IAAK,IACH,MAAMmC,EAAIlE,EAAI,KACd+B,EAAI,OAAO7M,EAAIgP,EAAG/O,EAAI+O,CAAC,EACvBnC,EAAI,OAAO7M,EAAIgP,EAAG/O,EAAI+O,CAAC,EACvBnC,EAAI,OAAO7M,EAAIgP,EAAG/O,EAAI+O,CAAC,EACvBnC,EAAI,OAAO7M,EAAIgP,EAAG/O,EAAI+O,CAAC,EACvBnC,EAAI,OAAA,EACJ,MACF,IAAK,OACH,QAASvO,EAAI,EAAGA,EAAI,EAAGA,IACrBuO,EAAI,OACF7M,EAAI8K,EAAI,KAAK,KAAM,GAAKxM,EAAI,IAAM,IAAO,KAAK,EAAE,EAChD2B,EAAI6K,EAAI,KAAK,KAAM,GAAKxM,EAAI,IAAM,IAAO,KAAK,EAAE,CAAA,EAElDuO,EAAI,OACF7M,EAAK8K,EAAI,EAAK,KAAK,KAAM,GAAKxM,EAAI,IAAM,IAAO,KAAK,EAAE,EACtD2B,EAAK6K,EAAI,EAAK,KAAK,KAAM,GAAKxM,EAAI,IAAM,IAAO,KAAK,EAAE,CAAA,EAG1DuO,EAAI,UAAA,EACJA,EAAI,KAAA,EACJ,KAAA,CAEN,CAKA,WAAWrD,EAAoByF,EAA2B,CACxD,GAAI,CAACA,EAAO,QAAS,OAErB,KAAM,CAAE,IAAApC,GAAQ,KACVqC,EAAc,KAAK,MAAM,OAI7BD,EAAO,EAAIzF,EAAS,GACpByF,EAAO,EAAIzF,EAAS,EAAIA,EAAS,OACjCyF,EAAO,EAAIzF,EAAS,GACpByF,EAAO,EAAIzF,EAAS,EAAIA,EAAS,SAKnCqD,EAAI,KAAA,EAGJA,EAAI,UAAA,EACJA,EAAI,KAAKrD,EAAS,EAAGA,EAAS,EAAGA,EAAS,MAAOA,EAAS,MAAM,EAChEqD,EAAI,KAAA,EAGJA,EAAI,YAAcqC,EAAY,UAC9BrC,EAAI,UAAYqC,EAAY,UAC5BrC,EAAI,YAAYqC,EAAY,QAAQ,EAEhCD,EAAO,WAETpC,EAAI,UAAA,EACJA,EAAI,OAAOoC,EAAO,EAAGzF,EAAS,CAAC,EAC/BqD,EAAI,OAAOoC,EAAO,EAAGzF,EAAS,EAAIA,EAAS,MAAM,EACjDqD,EAAI,OAAA,EAGJA,EAAI,UAAA,EACJA,EAAI,OAAOrD,EAAS,EAAGyF,EAAO,CAAC,EAC/BpC,EAAI,OAAOrD,EAAS,EAAIA,EAAS,MAAOyF,EAAO,CAAC,EAChDpC,EAAI,OAAA,IAGJA,EAAI,UAAA,EACJA,EAAI,OAAOoC,EAAO,EAAGzF,EAAS,CAAC,EAC/BqD,EAAI,OAAOoC,EAAO,EAAGzF,EAAS,EAAIA,EAAS,MAAM,EACjDqD,EAAI,OAAA,GAGNA,EAAI,QAAA,EAGAoC,EAAO,aACT,KAAK,YAAYA,EAAO,EAAGA,EAAO,EAAGA,EAAO,YAAazF,CAAQ,EAErE,CAKQ,YACNxJ,EACAC,EACAkP,EACA3F,EACM,CACN,KAAM,CAAE,IAAAqD,GAAQ,KACVoC,EAAS,KAAK,MAAM,OACpBG,EAAQD,EAAK,MAAM;AAAA,CAAI,EACvBE,EAAaJ,EAAO,YAAc,EAClCK,EAAU,EAEhBzC,EAAI,KAAO,GAAGoC,EAAO,WAAW,MAAM,KAAK,MAAM,MAAM,UAAU,GACjE,IAAIhB,EAAW,EACfmB,EAAM,QAASG,GAAS,CACtBtB,EAAW,KAAK,IAAIA,EAAUpB,EAAI,YAAY0C,CAAI,EAAE,KAAK,CAC3D,CAAC,EAED,MAAMnB,EAAWH,EAAWqB,EAAU,EAChCjB,EAAYe,EAAM,OAASC,EAAaC,EAAU,EAAI,EAG5D,IAAIE,EAAWxP,EAAI,GACfyP,EAAWxP,EAAIoO,EAAY,GAE3BmB,EAAWpB,EAAW5E,EAAS,EAAIA,EAAS,QAC9CgG,EAAWxP,EAAIoO,EAAW,IAExBqB,EAAWjG,EAAS,IACtBiG,EAAWxP,EAAI,IAIjB4M,EAAI,UAAYoC,EAAO,kBACvBpC,EAAI,YAAcoC,EAAO,cACzBpC,EAAI,UAAY,EAChBA,EAAI,UAAA,EACJ,MAAM/B,EAAI,EACV+B,EAAI,OAAO2C,EAAW1E,EAAG2E,CAAQ,EACjC5C,EAAI,OAAO2C,EAAWpB,EAAWtD,EAAG2E,CAAQ,EAC5C5C,EAAI,MAAM2C,EAAWpB,EAAUqB,EAAUD,EAAWpB,EAAUqB,EAAW3E,EAAGA,CAAC,EAC7E+B,EAAI,OAAO2C,EAAWpB,EAAUqB,EAAWpB,EAAYvD,CAAC,EACxD+B,EAAI,MAAM2C,EAAWpB,EAAUqB,EAAWpB,EAAWmB,EAAWpB,EAAWtD,EAAG2E,EAAWpB,EAAWvD,CAAC,EACrG+B,EAAI,OAAO2C,EAAW1E,EAAG2E,EAAWpB,CAAS,EAC7CxB,EAAI,MAAM2C,EAAUC,EAAWpB,EAAWmB,EAAUC,EAAWpB,EAAYvD,EAAGA,CAAC,EAC/E+B,EAAI,OAAO2C,EAAUC,EAAW3E,CAAC,EACjC+B,EAAI,MAAM2C,EAAUC,EAAUD,EAAW1E,EAAG2E,EAAU3E,CAAC,EACvD+B,EAAI,UAAA,EACJA,EAAI,KAAA,EACJA,EAAI,OAAA,EAGJA,EAAI,UAAYoC,EAAO,aACvBpC,EAAI,UAAY,OAChBA,EAAI,aAAe,MACnBuC,EAAM,QAAQ,CAACG,EAAMjR,IAAM,CACzBuO,EAAI,SACF0C,EACAC,EAAWF,EACXG,EAAWH,EAAUhR,EAAI+Q,CAAA,CAE7B,CAAC,CACH,CAKA,kBAAkB3E,EAKT,CACP,KAAM,CAAE,IAAAmC,GAAQ,KACV6C,EACJ,KAAK,MAAM,KAAK,cAAc,SAAS,MAAM,GAC7C,KAAK,MAAM,KAAK,YAAA,EAAc,SAAS,UAAU,EAEnD7C,EAAI,KAAA,EACJA,EAAI,UAAY6C,EACZ,0BACA,yBACJ7C,EAAI,YAAc,UAClBA,EAAI,UAAY,EAChBA,EAAI,YAAY,CAAC,EAAG,CAAC,CAAC,EAEtBA,EAAI,UAAA,EACJA,EAAI,KAAKnC,EAAK,EAAGA,EAAK,EAAGA,EAAK,MAAOA,EAAK,MAAM,EAChDmC,EAAI,KAAA,EACJA,EAAI,OAAA,EACJA,EAAI,QAAA,CACN,CAKA,cACErD,EACAF,EACAyD,EACA/C,EACM,CACN,GAAI,CAACV,EAAO,eAAgB,OAE5B,KAAM,CAAE,IAAAuD,GAAQ,KACV5N,EAAOqK,EAAO,QAAA,EACd6E,EAAQ7E,EAAO,SAAA,EACfqG,EAAaxB,EAAM,WAAa,CAAA,EAGtC,GAAIwB,EAAW,UAAY,GAAO,OAGlC,MAAMxF,EAAQwF,EAAW,OAASxB,EAAM,OAAS,UAC3CyB,EAAYD,EAAW,OAAS,EAChCE,EAAWF,EAAW,UAAY,EAClCG,EAAWH,EAAW,WAAa,GACnCI,EAAUJ,EAAW,SAAW,GAChCpQ,EAAYoQ,EAAW,WAAa,OAE1C9C,EAAI,KAAA,EAGJA,EAAI,UAAA,EACJA,EAAI,KAAKrD,EAAS,EAAGA,EAAS,EAAGA,EAAS,MAAOA,EAAS,MAAM,EAChEqD,EAAI,KAAA,EAEJA,EAAI,YAAc1C,EAClB0C,EAAI,UAAY+C,EAChB/C,EAAI,YAAckD,EAGlB,QAASzR,EAAI,EAAGA,EAAIW,EAAK,EAAE,OAAQX,IAAK,CACtC,MAAM0B,EAAI+M,EAAO,UAAU9N,EAAK,EAAEX,CAAC,CAAC,EAC9B2B,EAAI+J,EAAO,UAAU/K,EAAK,EAAEX,CAAC,CAAC,EAIpC,GADI0B,EAAIwJ,EAAS,GAAKxJ,EAAIwJ,EAAS,EAAIA,EAAS,OAC5CvJ,EAAIuJ,EAAS,GAAKvJ,EAAIuJ,EAAS,EAAIA,EAAS,OAAQ,SAGxD,MAAMwG,EAAS1G,EAAO,UAAUhL,CAAC,EACjC,GAAI0R,EAAQ,CACV,KAAM,CAACC,EAAYC,CAAS,EAAIF,EAC1BG,EAAQlR,EAAK,EAAEX,CAAC,EAGhB8R,EAAOpG,EAAO,UAAUmG,EAAQD,CAAS,EACzCG,EAAUrG,EAAO,UAAUmG,EAAQF,CAAU,EAEnDpD,EAAI,UAAA,GAGAtN,IAAc,QAAUA,IAAc,cAExCsN,EAAI,OAAO7M,EAAGC,CAAC,EACf4M,EAAI,OAAO7M,EAAGoQ,CAAI,EAEdN,IACFjD,EAAI,OAAO7M,EAAI6P,EAAW,EAAGO,CAAI,EACjCvD,EAAI,OAAO7M,EAAI6P,EAAW,EAAGO,CAAI,KAIjC7Q,IAAc,QAAUA,IAAc,cAExCsN,EAAI,OAAO7M,EAAGC,CAAC,EACf4M,EAAI,OAAO7M,EAAGqQ,CAAO,EAEjBP,IACFjD,EAAI,OAAO7M,EAAI6P,EAAW,EAAGQ,CAAO,EACpCxD,EAAI,OAAO7M,EAAI6P,EAAW,EAAGQ,CAAO,IAIxCxD,EAAI,OAAA,CACN,CAGA,MAAMyD,EAAShH,EAAO,UAAUhL,CAAC,EACjC,GAAIgS,EAAQ,CACV,KAAM,CAACL,EAAYC,CAAS,EAAII,EAC1BC,EAAQtR,EAAK,EAAEX,CAAC,EAGhBkS,EAASzD,EAAO,UAAUwD,EAAQL,CAAS,EAC3CO,EAAQ1D,EAAO,UAAUwD,EAAQN,CAAU,EAEjDpD,EAAI,UAAA,GAEAtN,IAAc,QAAUA,IAAc,cAExCsN,EAAI,OAAO7M,EAAGC,CAAC,EACf4M,EAAI,OAAO2D,EAAQvQ,CAAC,EAEhB6P,IACFjD,EAAI,OAAO2D,EAAQvQ,EAAI4P,EAAW,CAAC,EACnChD,EAAI,OAAO2D,EAAQvQ,EAAI4P,EAAW,CAAC,KAInCtQ,IAAc,QAAUA,IAAc,cAExCsN,EAAI,OAAO7M,EAAGC,CAAC,EACf4M,EAAI,OAAO4D,EAAOxQ,CAAC,EAEf6P,IACFjD,EAAI,OAAO4D,EAAOxQ,EAAI4P,EAAW,CAAC,EAClChD,EAAI,OAAO4D,EAAOxQ,EAAI4P,EAAW,CAAC,IAItChD,EAAI,OAAA,CACN,CACF,CAEAA,EAAI,QAAA,CACN,CAMQ,mBACN6D,EACAC,EACU,CACV,GAAID,EAAW,OAAS,EAAG,MAAO,CAAA,EAElC,MAAME,EAAkB,CAAA,EACxB,QAAStS,EAAI,EAAGA,EAAIoS,EAAW,OAAS,EAAGpS,IAAK,CAC9C,MAAMuS,GAAQH,EAAWpS,EAAI,CAAC,EAAIoS,EAAWpS,CAAC,GAAKqS,EACnD,QAAS9O,EAAI,EAAGA,EAAI8O,EAAW9O,IAC7B+O,EAAM,KAAKF,EAAWpS,CAAC,EAAIuS,EAAOhP,CAAC,CAEvC,CACA,OAAO+O,CACT,CAEQ,YAAYxS,EAAuB,CACzC,OAAI,KAAK,IAAIA,CAAK,EAAI,MAASA,IAAU,EAChC,KAAK,oBAAoBA,EAAO,CAAC,EAEnCA,EAAM,QAAQ,CAAC,EAAE,QAAQ,SAAU,EAAE,CAC9C,CAEQ,YAAYA,EAAuB,CACzC,GAAIA,IAAU,EAAG,MAAO,IACxB,MAAM0S,EAAS,KAAK,IAAI1S,CAAK,EAC7B,OAAI0S,EAAS,MAAUA,GAAU,IACxB,KAAK,oBAAoB1S,EAAO,CAAC,EAEnCA,EAAM,YAAY,CAAC,CAC5B,CAEQ,oBAAoBA,EAAe2S,EAA2B,CACpE,MAAMC,EAAM5S,EAAM,cAAc2S,CAAS,EACnC,CAACE,EAAUC,CAAQ,EAAIF,EAAI,MAAM,GAAG,EAGpCG,EAAyC,CAC7C,EAAK,IACL,EAAK,IACL,EAAK,IACL,EAAK,IACL,EAAK,IACL,EAAK,IACL,EAAK,IACL,EAAK,IACL,EAAK,IACL,EAAK,IACL,IAAK,IACL,IAAK,GAAA,EAGDC,EAAaF,EAAS,QAC1B,YACCG,GAASF,EAAeE,CAAI,GAAKA,CAAA,EAIpC,MAAO,GAAGJ,CAAQ,QAAQG,CAAU,EACtC,CACF,CCnwBO,MAAME,EAAmB,CAwB9B,YACEC,EACAC,EACAC,EACAC,EACAC,EACA,CA7BM3K,EAAA,kBACAA,EAAA,kBACAA,EAAA,oBACAA,EAAA,kBACAA,EAAA,sBAEAA,EAAA,kBAAa,IACbA,EAAA,sBACAA,EAAA,sBAAiB,IACjBA,EAAA,sBAAiB,CAAE,EAAG,EAAG,EAAG,CAAA,GAC5BA,EAAA,oBAAe,CAAE,EAAG,EAAG,EAAG,CAAA,GAC1BA,EAAA,iBAAY,IAGZA,EAAA,mBACAA,EAAA,uBACAA,EAAA,uBACAA,EAAA,qBACAA,EAAA,wBACAA,EAAA,wBACAA,EAAA,uBACAA,EAAA,sBASN,KAAK,UAAYuK,EACjB,KAAK,UAAYC,EACjB,KAAK,YAAcC,EACnB,KAAK,UAAYC,EACjB,KAAK,cAAgBC,EAGrB,KAAK,WAAa,KAAK,YAAY,KAAK,IAAI,EAC5C,KAAK,eAAiB,KAAK,gBAAgB,KAAK,IAAI,EACpD,KAAK,eAAiB,KAAK,gBAAgB,KAAK,IAAI,EACpD,KAAK,aAAe,KAAK,cAAc,KAAK,IAAI,EAChD,KAAK,gBAAkB,KAAK,iBAAiB,KAAK,IAAI,EACtD,KAAK,gBAAkB,KAAK,iBAAiB,KAAK,IAAI,EACtD,KAAK,eAAiB,KAAK,gBAAgB,KAAK,IAAI,EACpD,KAAK,cAAgB,KAAK,eAAe,KAAK,IAAI,EAElD,KAAK,gBAAA,CACP,CAEQ,iBAAwB,CAC9B,KAAK,UAAU,iBAAiB,QAAS,KAAK,WAAY,CACxD,QAAS,EAAA,CACV,EACD,KAAK,UAAU,iBAAiB,YAAa,KAAK,cAAc,EAChE,KAAK,UAAU,iBAAiB,YAAa,KAAK,cAAc,EAChE,KAAK,UAAU,iBAAiB,UAAW,KAAK,YAAY,EAC5D,KAAK,UAAU,iBAAiB,aAAc,KAAK,eAAe,EAClE,KAAK,UAAU,iBAAiB,aAAc,KAAK,eAAe,EAClE,KAAK,UAAU,iBAAiB,YAAa,KAAK,cAAc,EAChE,KAAK,UAAU,iBAAiB,WAAY,KAAK,aAAa,CAChE,CAEQ,iBAAwB,CAC9B,KAAK,UAAU,oBAAoB,QAAS,KAAK,UAAU,EAC3D,KAAK,UAAU,oBAAoB,YAAa,KAAK,cAAc,EACnE,KAAK,UAAU,oBAAoB,YAAa,KAAK,cAAc,EACnE,KAAK,UAAU,oBAAoB,UAAW,KAAK,YAAY,EAC/D,KAAK,UAAU,oBAAoB,aAAc,KAAK,eAAe,EACrE,KAAK,UAAU,oBAAoB,aAAc,KAAK,eAAe,EACrE,KAAK,UAAU,oBAAoB,YAAa,KAAK,cAAc,EACnE,KAAK,UAAU,oBAAoB,WAAY,KAAK,aAAa,CACnE,CAEO,WAAWC,EAAwB,CACxC,KAAK,UAAYA,CACnB,CAMQ,YAAY,EAAqB,CACvC,MAAMpI,EAAW,KAAK,YAAA,EACtB,GAAIA,EAAS,OAAS,GAAKA,EAAS,QAAU,EAAG,OAEjD,EAAE,eAAA,EACF,MAAMkB,EAAO,KAAK,UAAU,sBAAA,EACtBmH,EAAS,EAAE,QAAUnH,EAAK,KAC1BoH,EAAS,EAAE,QAAUpH,EAAK,IAG1BqH,EAAO,KAAK,cAAA,EAClB,IAAIC,EAAQ,GACRC,EAAQ,GACRC,EAGJ,UAAW3E,KAAQwE,EAAM,CACvB,MAAMpE,EAAQJ,EAAK,WAAa,OAC5B/D,EAAS,EAAI+D,EAAK,OAClB/D,EAAS,EAAIA,EAAS,MAAQ+D,EAAK,OAEjC4E,EAAW,GACXC,EAAO7E,EAAK,WAAa,OAASI,EAAQwE,EAAWxE,EAE3D,GACEkE,GAAUO,GACVP,GAAUO,EAAOD,GACjBL,GAAUtI,EAAS,GACnBsI,GAAUtI,EAAS,EAAIA,EAAS,OAChC,CACA0I,EAAe3E,EAAK,GACpB0E,EAAQ,GACRD,EAAQ,GACR,KACF,CACF,CAEA,GAAI,CAACE,EAEH,GACEJ,EAAStI,EAAS,EAAIA,EAAS,QAC/BqI,GAAUrI,EAAS,GACnBqI,GAAUrI,EAAS,EAAIA,EAAS,MAEhCwI,EAAQ,WAIRH,GAAUrI,EAAS,GACnBqI,GAAUrI,EAAS,EAAIA,EAAS,OAChCsI,GAAUtI,EAAS,GACnBsI,GAAUtI,EAAS,EAAIA,EAAS,OAEhCwI,EAAQ,GACRC,EAAQ,OAER,QAIJ,MAAMlJ,EAAS,KAAK,UAAUmJ,CAAY,EACpCG,EAAa,EAAE,OAAS,EAAI,IAAM,GAGlCC,GAAeT,EAASrI,EAAS,GAAKA,EAAS,MAC/C+I,EAAc,GAAKT,EAAStI,EAAS,GAAKA,EAAS,OAEnDgJ,EAAQzJ,EAAO,KAAOuJ,GAAevJ,EAAO,KAAOA,EAAO,MAC1D0J,EAAQ1J,EAAO,KAAOwJ,GAAexJ,EAAO,KAAOA,EAAO,MAG1D2J,EAAY,MACZC,EAAY,KAElB,IAAIC,EAAWZ,EACXQ,GAASA,EAAQzJ,EAAO,MAAQsJ,EAChCtJ,EAAO,KACP8J,EAAWb,EACXQ,GAASzJ,EAAO,KAAOyJ,GAASH,EAChCtJ,EAAO,KACP+J,EAAWb,EACXQ,GAASA,EAAQ1J,EAAO,MAAQsJ,EAChCtJ,EAAO,KACPgK,EAAWd,EACXQ,GAAS1J,EAAO,KAAO0J,GAASJ,EAChCtJ,EAAO,KAEX,MAAMiK,EAAaH,EAAWD,EACxBK,EAAaF,EAAWD,GAE1BE,EAAaN,GAAaM,EAAaL,KACzCC,EAAW7J,EAAO,KAClB8J,EAAW9J,EAAO,OAEhBkK,EAAaP,GAAaO,EAAaN,KACzCG,EAAW/J,EAAO,KAClBgK,EAAWhK,EAAO,MAGpB,MAAMmK,EAAoB,CACxB,KAAMN,EACN,KAAMC,EACN,KAAMC,EACN,KAAMC,CAAA,EAGR,KAAK,UAAU,OAAOG,EAAWhB,CAAY,CAC/C,CAEQ,gBAAgB,EAAqB,CAC3C,MAAM1I,EAAW,KAAK,YAAA,EACtB,GAAIA,EAAS,OAAS,GAAKA,EAAS,QAAU,EAAG,OAEjD,MAAMkB,EAAO,KAAK,UAAU,sBAAA,EACtBmH,EAAS,EAAE,QAAUnH,EAAK,KAC1BoH,EAAS,EAAE,QAAUpH,EAAK,IAG1BqH,EAAO,KAAK,cAAA,EAClB,UAAWxE,KAAQwE,EAAM,CACvB,MAAMpE,EAAQJ,EAAK,WAAa,OAC5B/D,EAAS,EAAI+D,EAAK,OAClB/D,EAAS,EAAIA,EAAS,MAAQ+D,EAAK,OAEjC4E,EAAW,GACXC,EAAO7E,EAAK,WAAa,OAASI,EAAQwE,EAAWxE,EAE3D,GACEkE,GAAUO,GACVP,GAAUO,EAAOD,GACjBL,GAAUtI,EAAS,GACnBsI,GAAUtI,EAAS,EAAIA,EAAS,OAChC,CACA,KAAK,WAAa,GAClB,KAAK,cAAgB+D,EAAK,GAC1B,KAAK,aAAe,CAAE,EAAG,EAAE,QAAS,EAAG,EAAE,OAAA,EACzC,KAAK,UAAU,MAAM,OAAS,YAC9B,MACF,CACF,CAIEsE,GAAUrI,EAAS,GACnBqI,GAAUrI,EAAS,EAAIA,EAAS,OAChCsI,GAAUtI,EAAS,GACnBsI,GAAUtI,EAAS,EAAIA,EAAS,SAE5B,KAAK,WACP,KAAK,WAAa,GAClB,KAAK,cAAgB,OACrB,KAAK,aAAe,CAAE,EAAG,EAAE,QAAS,EAAG,EAAE,OAAA,EACzC,KAAK,UAAU,MAAM,OAAS,aAE9B,KAAK,eAAiB,GACtB,KAAK,eAAiB,CAAE,EAAGqI,EAAQ,EAAGC,CAAA,EACtC,KAAK,UAAU,MAAM,OAAS,aAGpC,CAEQ,gBAAgB,EAAqB,CAC3C,MAAMpH,EAAO,KAAK,UAAU,sBAAA,EACtBmH,EAAS,EAAE,QAAUnH,EAAK,KAC1BoH,EAAS,EAAE,QAAUpH,EAAK,IAKhC,GAFA,KAAK,UAAU,aAAamH,EAAQC,CAAM,EAEtC,KAAK,WAAY,CACnB,MAAMqB,EAAS,EAAE,QAAU,KAAK,aAAa,EACvCC,EAAS,EAAE,QAAU,KAAK,aAAa,EAC7C,KAAK,UAAU,MAAMD,EAAQC,EAAQ,KAAK,aAAa,EACvD,KAAK,aAAe,CAAE,EAAG,EAAE,QAAS,EAAG,EAAE,OAAA,CAC3C,SAAW,KAAK,eAAgB,CAC9B,MAAMpT,EAAI,KAAK,IAAI,KAAK,eAAe,EAAG6R,CAAM,EAC1C5R,EAAI,KAAK,IAAI,KAAK,eAAe,EAAG6R,CAAM,EAC1CnH,EAAQ,KAAK,IAAIkH,EAAS,KAAK,eAAe,CAAC,EAC/CjH,EAAS,KAAK,IAAIkH,EAAS,KAAK,eAAe,CAAC,EACtD,KAAK,UAAU,UAAU,CAAE,EAAA9R,EAAG,EAAAC,EAAG,MAAA0K,EAAO,OAAAC,EAAQ,CAClD,CACF,CAEQ,eAAsB,CACxB,KAAK,gBACP,KAAK,UAAU,UAAU,IAAI,EAE/B,KAAK,WAAa,GAClB,KAAK,cAAgB,OACrB,KAAK,eAAiB,GACtB,KAAK,UAAU,MAAM,OAAS,EAChC,CAEQ,kBAAyB,CAC/B,KAAK,WAAa,GAClB,KAAK,cAAgB,OACrB,KAAK,UAAU,MAAM,OAAS,GAC9B,KAAK,UAAU,cAAA,CACjB,CAMQ,iBAAiB,EAAqB,CAC5C,GAAI,EAAE,QAAQ,SAAW,EAAG,CAC1B,MAAMyI,EAAQ,EAAE,QAAQ,CAAC,EACzB,KAAK,WAAa,GAClB,KAAK,cAAgB,OACrB,KAAK,aAAe,CAAE,EAAGA,EAAM,QAAS,EAAGA,EAAM,OAAA,CACnD,CACF,CAEQ,gBAAgB,EAAqB,CAC3C,GAAI,CAAC,KAAK,YAAc,EAAE,QAAQ,SAAW,EAAG,OAEhD,EAAE,eAAA,EAEF,MAAMA,EAAQ,EAAE,QAAQ,CAAC,EACnBF,EAASE,EAAM,QAAU,KAAK,aAAa,EAC3CD,EAASC,EAAM,QAAU,KAAK,aAAa,EAEjD,KAAK,UAAU,MAAMF,EAAQC,EAAQ,KAAK,aAAa,EAEvD,KAAK,aAAe,CAAE,EAAGC,EAAM,QAAS,EAAGA,EAAM,OAAA,CACnD,CAEQ,gBAAuB,CAC7B,KAAK,WAAa,GAClB,KAAK,cAAgB,MACvB,CAMA,SAAgB,CACd,KAAK,gBAAA,CACP,CACF,CCtVA,MAAMC,EAAQ,CACZ,IAAK,8bACL,MAAO,6UACP,KAAM,wOACN,QAAS,qWACT,KAAM,8dACN,OAAQ,uTACR,UAAW,6UACX,OAAQ,iTACR,OAAQ,kMACV,EAEO,MAAMC,EAAc,CAWzB,YACEC,EACA1G,EACA0E,EACA,CAdMxK,EAAA,kBACAA,EAAA,gBACAA,EAAA,kBACAA,EAAA,cAEAA,EAAA,mBAAc,IACdA,EAAA,iBAAY,IACZA,EAAA,uBAAkB,IAClBA,EAAA,mBAAmD,QAOzD,KAAK,UAAYwK,EACjB,KAAK,MAAQ1E,EAEb,KAAK,UAAY,SAAS,cAAc,KAAK,EAC7C,KAAK,UAAU,MAAM,QAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAY/B,KAAK,QAAU,SAAS,cAAc,KAAK,EAC3C,KAAK,QAAQ,UAAY,mBACzB,KAAK,mBAAA,EAEL,KAAK,cAAA,EACL,KAAK,UAAU,YAAY,KAAK,OAAO,EACvC0G,EAAO,YAAY,KAAK,SAAS,CACnC,CAEQ,aAAuB,CAC7B,MAAM9G,EAAO,KAAK,MAAM,KAAK,YAAA,EAC7B,OACEA,EAAK,SAAS,MAAM,GACpBA,EAAK,SAAS,UAAU,GACxBA,EAAK,SAAS,SAAS,CAE3B,CAEQ,oBAA2B,CACjC,MAAMgD,EAAS,KAAK,YAAA,EAEd+D,EAAK/D,EAAS,yBAA2B,4BACzCgE,EAAchE,EAChB,2BACA,sBACEiE,EAASjE,EACX,oEACA,iCAEJ,KAAK,QAAQ,MAAM,QAAU;AAAA;AAAA;AAAA;AAAA;AAAA,oBAKb+D,CAAE;AAAA;AAAA;AAAA,0BAGIC,CAAW;AAAA;AAAA,oBAEjBC,CAAM;AAAA;AAAA,KAGxB,CAEQ,eAAsB,CAE5B,KAAK,aACHL,EAAM,IACN,WACA,IAAM,CACJ,KAAK,UAAY,CAAC,KAAK,UACvB,KAAK,mBAAA,EACL,KAAK,UAAU,YAAY,KAAK,SAAS,CAC3C,EACA,KAAA,EAIF,KAAK,aACHA,EAAM,MACN,aACA,IAAM,KAAK,UAAU,YAAA,EACrB,OAAA,EAIF,KAAK,aACHA,EAAM,UACN,aACA,IAAM,KAAK,UAAU,YAAA,EACrB,WAAA,EAIF,MAAMM,EAAM,SAAS,cAAc,KAAK,EAClClE,EAAS,KAAK,YAAA,EACpBkE,EAAI,MAAM,QAAU,yCAClBlE,EAAS,yBAA2B,iBACtC,mBACA,KAAK,QAAQ,YAAYkE,CAAG,EAG5B,KAAK,aACHN,EAAM,KACN,2BACA,IAAM,CACJ,MAAMO,EAAiD,CACrD,OACA,UACA,cAAA,EAEIC,GAAWD,EAAM,QAAQ,KAAK,WAAW,EAAI,GAAKA,EAAM,OAC9D,KAAK,YAAcA,EAAMC,CAAO,EAChC,KAAK,UAAU,UAAU,KAAK,WAAW,EACzC,KAAK,mBAAA,CACP,EACA,MAAA,EAIF,KAAK,aACHR,EAAM,OACN,sBACA,IAAM,CACJ,KAAK,YAAc,CAAC,KAAK,YACzB,KAAK,mBAAA,EACL,KAAK,UAAU,kBAAA,CACjB,EACA,QAAA,EAIF,MAAMS,EAAO,SAAS,cAAc,KAAK,EACzCA,EAAK,MAAM,QAAU,yCACnBrE,EAAS,yBAA2B,iBACtC,mBACA,KAAK,QAAQ,YAAYqE,CAAI,EAG7B,KAAK,aACHT,EAAM,OACN,gBACA,IAAM,KAAK,UAAU,SAAA,EACrB,QAAA,EAIF,MAAMU,EAAO,SAAS,cAAc,KAAK,EACzCA,EAAK,MAAM,QAAU,yCACnB,KAAK,cAAgB,yBAA2B,iBAClD,mBACA,KAAK,QAAQ,YAAYA,CAAI,EAG7B,KAAK,aACHV,EAAM,OACN,gBACA,IAAM,CACJ,KAAK,gBAAkB,CAAC,KAAK,gBAC7B,KAAK,mBAAA,EACL,KAAK,UAAU,eAAe,KAAK,eAAe,CACpD,EACA,QAAA,EAGF,KAAK,mBAAA,CACP,CAEQ,qBAAqBW,EAA8B,CAEzD,MAAMC,EAAOD,EAAI,cAA2B,wBAAwB,EAChEC,IACFA,EAAK,MAAM,QAAU,OACrBA,EAAK,MAAM,WAAa,SACxBA,EAAK,MAAM,eAAiB,SAC5BA,EAAK,MAAM,MAAQ,OACnBA,EAAK,MAAM,OAAS,OACpBA,EAAK,MAAM,cAAgB,QAG7B,MAAMC,EAAQF,EAAI,cAA0B,KAAK,EAC7CE,IACFA,EAAM,aAAa,QAAS,IAAI,EAChCA,EAAM,aAAa,SAAU,IAAI,EAChCA,EAAc,MAAM,QAAU,QAC9BA,EAAc,MAAM,SAAW,UAC/BA,EAAc,MAAM,MAAQ,UAC5BA,EAAc,MAAM,OAAS,eACzBA,EAAM,aAAa,MAAM,IAC3BA,EAAc,MAAM,KAAO,QAGlC,CAEQ,aACNC,EACAC,EACAC,EACA3L,EACmB,CACnB,MAAMsL,EAAM,SAAS,cAAc,QAAQ,EAC3CA,EAAI,UAAY,uCAAuCG,CAAG,UAC1DH,EAAI,MAAQI,EACZJ,EAAI,QAAQ,GAAKtL,EAEjB,MAAM+G,EAAS,KAAK,YAAA,EACdvF,EAAQuF,EAAS,UAAY,UAEnC,OAAAuE,EAAI,MAAM,QAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,eAQT9J,CAAK;AAAA;AAAA;AAAA;AAAA;AAAA,MAOhB8J,EAAI,aAAe,IAAM,CACvBA,EAAI,MAAM,QAAU,IACpBA,EAAI,MAAM,WAAavE,EACnB,4BACA,qBACJuE,EAAI,MAAM,UAAY,mBACtBA,EAAI,MAAM,UAAYvE,EAClB,4BACA,2BACN,EACAuE,EAAI,aAAe,IAAM,CACvBA,EAAI,MAAM,UAAY,OACtBA,EAAI,MAAM,UAAY,OACtB,KAAK,mBAAA,CACP,EACAA,EAAI,QAAUK,EAGd,KAAK,qBAAqBL,CAAG,EAE7B,KAAK,QAAQ,YAAYA,CAAG,EACrBA,CACT,CAEQ,oBAA2B,CACjC,MAAMM,EAAU,KAAK,QAAQ,iBAAiB,QAAQ,EAChD7E,EAAS,KAAK,YAAA,EAEd8E,EAAc,UACdC,EAAoB,UACpBC,EAAoB,UACpBC,EAAcjF,EAAS,UAAY,UAEzC6E,EAAQ,QAASN,GAA2B,CAC1C,MAAMtL,EAAKsL,EAAI,QAAQ,GACjBW,EAAUX,EAAI,QAAQ,QAAQ,EAEhCtL,IAAO,OACTsL,EAAI,MAAM,MAAQ,KAAK,UAAYO,EAAcG,EACjDV,EAAI,MAAM,QAAUW,GAAW,KAAK,UAAY,IAAM,MAClD,KAAK,YACPX,EAAI,MAAM,WAAavE,EACnB,2BACA,4BAEG/G,IAAO,UAChBsL,EAAI,MAAM,MAAQ,KAAK,YAAcQ,EAAoBE,EACzDV,EAAI,MAAM,QAAUW,GAAW,KAAK,YAAc,IAAM,MACpD,KAAK,cACPX,EAAI,MAAM,WAAavE,EACnB,4BACA,6BAEG/G,IAAO,UAChBsL,EAAI,MAAM,MAAQ,KAAK,gBAAkBS,EAAoBC,EAC7DV,EAAI,MAAM,QAAUW,GAAW,KAAK,gBAAkB,IAAM,MACxD,KAAK,kBACPX,EAAI,MAAM,WAAavE,EACnB,2BACA,4BAEG/G,IAAO,QAChBsL,EAAI,UACF,KAAK,cAAgB,OACjBX,EAAM,KACN,KAAK,cAAgB,UACrBA,EAAM,QACNA,EAAM,KAEZ,KAAK,qBAAqBW,CAAG,EAC7BA,EAAI,MAAM,MAAQU,EAClBV,EAAI,MAAM,QAAUW,EAAU,IAAM,QAC3BjM,IAAO,SAAWA,IAAO,aAAeA,IAAO,YACxDsL,EAAI,MAAM,MAAQU,EAClBV,EAAI,MAAM,QAAUW,EAAU,IAAM,OAIpC,CAACA,GACD,EACGjM,IAAO,OAAS,KAAK,WACrBA,IAAO,UAAY,KAAK,aACxBA,IAAO,UAAY,KAAK,mBAG3BsL,EAAI,MAAM,WAAa,cAE3B,CAAC,CACH,CAEO,YAAYnH,EAAyB,CAC1C,KAAK,MAAQA,EACb,KAAK,mBAAA,EACL,KAAK,mBAAA,CACP,CAEO,SAAgB,CACrB,KAAK,UAAU,OAAA,CACjB,CACF,CCzWO,MAAM+H,EAAY,CAcvB,YACErB,EACA1G,EACA5M,EACAsR,EACA,CAlBMxK,EAAA,kBACAA,EAAA,eACAA,EAAA,gBACAA,EAAA,cACAA,EAAA,cAAmB,CAAA,GACnBA,EAAA,kBAEAA,EAAA,kBAAa,IACbA,EAAA,cAAS,GACTA,EAAA,cAAS,GACTA,EAAA,gBAAW,GACXA,EAAA,gBAAW,GAQjB,KAAK,MAAQ8F,EACb,KAAK,UAAY0E,EAEjB,KAAK,UAAY,SAAS,cAAc,KAAK,EAC7C,KAAK,UAAU,UAAY,kBAK3B,MAAMxR,EAAIE,EAAQ,GAAKsT,EAAO,YAAc,IACtCvT,EAAIC,EAAQ,GAAK,GAEvB,KAAK,UAAU,MAAM,QAAU;AAAA;AAAA,cAErBF,CAAC;AAAA,aACFC,CAAC;AAAA;AAAA;AAAA;AAAA,uBAIS6M,EAAM,OAAO,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA,MAO5C,KAAK,YAAA,EAGL,KAAK,OAAS,SAAS,cAAc,KAAK,EAC1C,KAAK,OAAO,MAAM,QAAU;AAAA;AAAA;AAAA;AAAA;AAAA,MAO5B,KAAK,QAAU,SAAS,cAAc,KAAK,EAC3C,KAAK,QAAQ,MAAM,QAAU,GAAGA,EAAM,OAAO,OAAO,KAEpD,KAAK,UAAU,YAAY,KAAK,MAAM,EACtC,KAAK,UAAU,YAAY,KAAK,OAAO,EACvC0G,EAAO,YAAY,KAAK,SAAS,EAEjC,KAAK,aAAA,CACP,CAEQ,aAAoB,CAC1B,MAAM9D,EACJ,KAAK,MAAM,KAAK,cAAc,SAAS,MAAM,GAC7C,KAAK,MAAM,KAAK,cAAc,SAAS,UAAU,GACjD,KAAK,MAAM,KAAK,YAAA,EAAc,SAAS,SAAS,EAE5C+D,EAAK/D,EAAS,yBAA2B,4BACzCgE,EAAchE,EAChB,4BACA,qBACEiE,EAASjE,EACX,gCACA,iCAEJ,KAAK,UAAU,MAAM,WAAa+D,EAClC,KAAK,UAAU,MAAM,eAAiB,4BACrC,KAAK,UAAU,MAAc,qBAC5B,4BACF,KAAK,UAAU,MAAM,OAAS,aAAaC,CAAW,GACtD,KAAK,UAAU,MAAM,UAAYC,CACnC,CAEQ,cAAqB,CAC3B,IAAImB,EAAuB,KAE3B,MAAMC,EAAeC,GAAkB,CAEjCA,EAAE,SAAW,IAEjBA,EAAE,gBAAA,EACFA,EAAE,eAAA,EAEF,KAAK,WAAa,GAClB,KAAK,OAASA,EAAE,QAChB,KAAK,OAASA,EAAE,QAChB,KAAK,SAAW,KAAK,UAAU,WAC/B,KAAK,SAAW,KAAK,UAAU,UAE/B,KAAK,UAAU,MAAM,WAAa,OAClC,KAAK,UAAU,MAAM,WAAa,YAClC,KAAK,UAAU,MAAM,UAAY,6BACjC,KAAK,UAAU,MAAM,OAAS,WAE9B,SAAS,iBAAiB,YAAaC,CAAW,EAClD,SAAS,iBAAiB,UAAWC,CAAS,EAChD,EAEMC,EAAiB,CAACC,EAAiBC,IAAoB,CAC3D,MAAM9P,EAAK6P,EAAU,KAAK,OACpBE,EAAKD,EAAU,KAAK,OAE1B,IAAIE,EAAO,KAAK,SAAWhQ,EACvBiQ,EAAO,KAAK,SAAWF,EAE3B,MAAM9B,EAAS,KAAK,UAAU,cAC1BA,IACF+B,EAAO,KAAK,IACV,EACA,KAAK,IAAIA,EAAM/B,EAAO,YAAc,KAAK,UAAU,WAAW,CAAA,EAEhEgC,EAAO,KAAK,IACV,EACA,KAAK,IAAIA,EAAMhC,EAAO,aAAe,KAAK,UAAU,YAAY,CAAA,GAKpE,MAAMiC,EAAKF,EAAO,KAAK,SACjBG,EAAKF,EAAO,KAAK,SACvB,KAAK,UAAU,MAAM,UAAY,eAAeC,CAAE,OAAOC,CAAE,QAC7D,EAEMT,EAAeD,GAAkB,CAChC,KAAK,aACNF,wBAA4BA,CAAK,EACrCA,EAAQ,sBAAsB,IAAMK,EAAeH,EAAE,QAASA,EAAE,OAAO,CAAC,EAC1E,EAEME,EAAY,IAAM,OACtB,GAAI,KAAK,WAAY,CACnB,KAAK,WAAa,GACdJ,wBAA4BA,CAAK,EAGrC,MAAMpK,EAAO,KAAK,UAAU,sBAAA,EACtBiL,GACJrO,EAAA,KAAK,UAAU,gBAAf,YAAAA,EAA8B,wBAChC,GAAIqO,EAAY,CACd,MAAMC,EAASlL,EAAK,KAAOiL,EAAW,KAChCE,EAASnL,EAAK,IAAMiL,EAAW,IAErC,KAAK,UAAU,MAAM,UAAY,OACjC,KAAK,UAAU,MAAM,KAAO,GAAGC,CAAM,KACrC,KAAK,UAAU,MAAM,IAAM,GAAGC,CAAM,KAEpC,KAAK,UAAU,OAAOD,EAAQC,CAAM,CACtC,CAEA,KAAK,UAAU,MAAM,WAAa,OAClC,KAAK,UAAU,MAAM,WAAa,uBAClC,KAAK,UAAU,MAAM,UAAY,8BACjC,KAAK,UAAU,MAAM,OAAS,MAChC,CACA,SAAS,oBAAoB,YAAaZ,CAAW,EACrD,SAAS,oBAAoB,UAAWC,CAAS,CACnD,EAEA,KAAK,UAAU,iBAAiB,YAAaH,CAAW,EAGxD,KAAK,UAAU,iBAAiB,QAAUC,GAAMA,EAAE,iBAAiB,EACnE,KAAK,UAAU,iBAAiB,QAAUA,GAAMA,EAAE,iBAAiB,EACnE,KAAK,UAAU,iBAAiB,WAAaA,GAAMA,EAAE,iBAAiB,CAExE,CAEO,OAAO1L,EAAwB,CACpC,KAAK,OAASA,EACd,KAAK,OAAA,CACP,CAEQ,QAAe,CACrB,KAAK,QAAQ,UAAY,GACzB,MAAM0E,EAAS,KAAK,MAAM,OACpBlG,EAAM,OAAO,kBAAoB,EAEvC,KAAK,OAAO,QAAS+B,GAAM,CACzB,MAAMyE,EAAO,SAAS,cAAc,KAAK,EACzCA,EAAK,MAAM,QAAU;AAAA;AAAA;AAAA;AAAA,yBAIFN,EAAO,OAAO;AAAA,uBAChBA,EAAO,UAAU;AAAA,qBACnBA,EAAO,QAAQ;AAAA,iBACnBA,EAAO,SAAS;AAAA,QAI3B,MAAM8H,EAAS,SAAS,cAAc,QAAQ,EACxCnH,EAAOX,EAAO,WACpB8H,EAAO,MAAQnH,EAAO7G,EACtBgO,EAAO,OAASnH,EAAO7G,EACvBgO,EAAO,MAAM,MAAQ,GAAGnH,CAAI,KAC5BmH,EAAO,MAAM,OAAS,GAAGnH,CAAI,KAE7B,MAAM9B,EAAMiJ,EAAO,WAAW,IAAI,EAClC,GAAIjJ,EAAK,CACPA,EAAI,MAAM/E,EAAKA,CAAG,EAClB,MAAMqG,EAAQtE,EAAE,SAAA,EACVM,EAAQgE,EAAM,OAAS,UACvB/N,EAAOyJ,EAAE,QAAA,EACTW,EAAS2D,EAAM,QAAU,SAE/BtB,EAAI,UAAY1C,EAChB0C,EAAI,YAAc1C,EAClB0C,EAAI,UAAY,EAEhB,MAAM6B,EAAUC,EAAO,EACjBF,EAAUE,EAAO,EAEjBC,EAAU,OAAOxO,CAAI,EAAE,YAAA,EACvB0O,EAAYF,IAAY,WAAaA,IAAY,KAAQA,IAAY,QAAU,CAAC,CAACT,EAAM,OACvFY,EAAgBH,EAAQ,SAAS,SAAS,GAAKA,IAAY,IAE7DE,EACF,KAAK,WAAWjC,EAAKrC,EAAQkE,EAASD,EAASE,EAAO,EAAG,EAChDI,GACTlC,EAAI,UAAA,EACJA,EAAI,OAAO,EAAG4B,CAAO,EACrB5B,EAAI,OAAO8B,EAAMF,CAAO,EACxB5B,EAAI,OAAA,EACJ,KAAK,WAAWA,EAAKrC,EAAQkE,EAASD,EAASE,EAAO,EAAG,IAEzD9B,EAAI,UAAA,EACJA,EAAI,OAAO,EAAG4B,CAAO,EACrB5B,EAAI,OAAO8B,EAAMF,CAAO,EACxB5B,EAAI,OAAA,EAER,CAEA,MAAMS,EAAQ,SAAS,cAAc,MAAM,EAC3CA,EAAM,YAAczD,EAAE,MAAA,EAEtByE,EAAK,YAAYwH,CAAM,EACvBxH,EAAK,YAAYhB,CAAK,EACtB,KAAK,QAAQ,YAAYgB,CAAI,CAC/B,CAAC,CACH,CAKQ,WACNzB,EACArC,EACAxK,EACAC,EACA0O,EACM,CACN,MAAM7D,EAAI6D,EAAO,EAGjB,OAFA9B,EAAI,UAAA,EAEIrC,EAAA,CACN,IAAK,SACHqC,EAAI,IAAI7M,EAAGC,EAAG6K,EAAG,EAAG,KAAK,GAAK,CAAC,EAC/B+B,EAAI,KAAA,EACJ,MACF,IAAK,SACHA,EAAI,KAAK7M,EAAI8K,EAAG7K,EAAI6K,EAAG6D,EAAMA,CAAI,EACjC9B,EAAI,KAAA,EACJ,MACF,IAAK,UACHA,EAAI,OAAO7M,EAAGC,EAAI6K,CAAC,EACnB+B,EAAI,OAAO7M,EAAI8K,EAAG7K,CAAC,EACnB4M,EAAI,OAAO7M,EAAGC,EAAI6K,CAAC,EACnB+B,EAAI,OAAO7M,EAAI8K,EAAG7K,CAAC,EACnB4M,EAAI,UAAA,EACJA,EAAI,KAAA,EACJ,MACF,IAAK,WACHA,EAAI,OAAO7M,EAAGC,EAAI6K,CAAC,EACnB+B,EAAI,OAAO7M,EAAI8K,EAAG7K,EAAI6K,CAAC,EACvB+B,EAAI,OAAO7M,EAAI8K,EAAG7K,EAAI6K,CAAC,EACvB+B,EAAI,UAAA,EACJA,EAAI,KAAA,EACJ,MACF,IAAK,eACHA,EAAI,OAAO7M,EAAGC,EAAI6K,CAAC,EACnB+B,EAAI,OAAO7M,EAAI8K,EAAG7K,EAAI6K,CAAC,EACvB+B,EAAI,OAAO7M,EAAI8K,EAAG7K,EAAI6K,CAAC,EACvB+B,EAAI,UAAA,EACJA,EAAI,KAAA,EACJ,MACF,IAAK,QACHA,EAAI,OAAO7M,EAAI8K,EAAG7K,CAAC,EACnB4M,EAAI,OAAO7M,EAAI8K,EAAG7K,CAAC,EACnB4M,EAAI,OAAO7M,EAAGC,EAAI6K,CAAC,EACnB+B,EAAI,OAAO7M,EAAGC,EAAI6K,CAAC,EACnB+B,EAAI,OAAA,EACJ,MACF,IAAK,IACH,MAAMmC,EAAIlE,EAAI,KACd+B,EAAI,OAAO7M,EAAIgP,EAAG/O,EAAI+O,CAAC,EACvBnC,EAAI,OAAO7M,EAAIgP,EAAG/O,EAAI+O,CAAC,EACvBnC,EAAI,OAAO7M,EAAIgP,EAAG/O,EAAI+O,CAAC,EACvBnC,EAAI,OAAO7M,EAAIgP,EAAG/O,EAAI+O,CAAC,EACvBnC,EAAI,OAAA,EACJ,MACF,IAAK,OACH,QAASvO,EAAI,EAAGA,EAAI,EAAGA,IACrBuO,EAAI,OACF7M,EAAI8K,EAAI,KAAK,KAAM,GAAKxM,EAAI,IAAM,IAAO,KAAK,EAAE,EAChD2B,EAAI6K,EAAI,KAAK,KAAM,GAAKxM,EAAI,IAAM,IAAO,KAAK,EAAE,CAAA,EAElDuO,EAAI,OACF7M,EAAK8K,EAAI,EAAK,KAAK,KAAM,GAAKxM,EAAI,IAAM,IAAO,KAAK,EAAE,EACtD2B,EAAK6K,EAAI,EAAK,KAAK,KAAM,GAAKxM,EAAI,IAAM,IAAO,KAAK,EAAE,CAAA,EAG1DuO,EAAI,UAAA,EACJA,EAAI,KAAA,EACJ,KAAA,CAEN,CAEO,KAAKA,EAA+B/E,EAAmB,CAC5D,GAAI,KAAK,OAAO,SAAW,EAAG,OAE9B,MAAMkG,EAAS,KAAK,MAAM,OACpBsB,EAAUtB,EAAO,QAAUlG,EAC3BiO,EAAU/H,EAAO,QAAUlG,EAC3BkO,EAAahI,EAAO,WAAalG,EACjCmO,EAAe,EAAInO,EAEnB9H,EAAI,KAAK,UAAU,WAAa8H,EAChC7H,EAAI,KAAK,UAAU,UAAY6H,EAC/B6C,EAAQ,KAAK,UAAU,YAAc7C,EACrC8C,EAAS,KAAK,UAAU,aAAe9C,EAE7C+E,EAAI,KAAA,EAGJ,MAAM6C,EACJ,KAAK,MAAM,KAAK,cAAc,SAAS,MAAM,GAC7C,KAAK,MAAM,KAAK,YAAA,EAAc,SAAS,UAAU,EACnD7C,EAAI,UAAY6C,EACZ1B,EAAO,gBACP,4BACJnB,EAAI,YAAcmB,EAAO,YACzBnB,EAAI,UAAY,EAAI/E,EAEpB,MAAMgD,EAAIkD,EAAO,aAAelG,EAChC+E,EAAI,UAAA,EACJA,EAAI,OAAO7M,EAAI8K,EAAG7K,CAAC,EACnB4M,EAAI,OAAO7M,EAAI2K,EAAQG,EAAG7K,CAAC,EAC3B4M,EAAI,MAAM7M,EAAI2K,EAAO1K,EAAGD,EAAI2K,EAAO1K,EAAI6K,EAAGA,CAAC,EAC3C+B,EAAI,OAAO7M,EAAI2K,EAAO1K,EAAI2K,EAASE,CAAC,EACpC+B,EAAI,MAAM7M,EAAI2K,EAAO1K,EAAI2K,EAAQ5K,EAAI2K,EAAQG,EAAG7K,EAAI2K,EAAQE,CAAC,EAC7D+B,EAAI,OAAO7M,EAAI8K,EAAG7K,EAAI2K,CAAM,EAC5BiC,EAAI,MAAM7M,EAAGC,EAAI2K,EAAQ5K,EAAGC,EAAI2K,EAASE,EAAGA,CAAC,EAC7C+B,EAAI,OAAO7M,EAAGC,EAAI6K,CAAC,EACnB+B,EAAI,MAAM7M,EAAGC,EAAGD,EAAI8K,EAAG7K,EAAG6K,CAAC,EAC3B+B,EAAI,UAAA,EACJA,EAAI,KAAA,EACJA,EAAI,OAAA,EAGJA,EAAI,UAAY,OAChBA,EAAI,aAAe,SACnBA,EAAI,KAAO,GAAGmB,EAAO,SAAWlG,CAAG,MAAMkG,EAAO,UAAU,GAE1D,KAAK,OAAO,QAAQ,CAACnE,EAAGvL,IAAM,CAC5B,MAAMiQ,EACJtO,EACAgW,EACA3G,EACAhR,GAAK0X,EAAaD,GAClBC,EAAa,EAETtH,EAAU1O,EAAIsP,EAAU0G,EAAa,EACrCvH,EAAUF,EACVJ,EAAQtE,EAAE,SAAA,EACVzJ,EAAOyJ,EAAE,QAAA,EACTW,EAAS2D,EAAM,QAAU,SAE/BtB,EAAI,UAAYsB,EAAM,OAAS,UAC/BtB,EAAI,YAAcsB,EAAM,OAAS,UACjCtB,EAAI,UAAY,EAAI/E,EAEpB,MAAM8G,EAAU,OAAOxO,CAAI,EAAE,YAAA,EACvB0O,EAAYF,IAAY,WAAaA,IAAY,KAAQA,IAAY,QAAU,CAAC,CAACT,EAAM,OACvFY,EAAgBH,EAAQ,SAAS,SAAS,GAAKA,IAAY,IAE7DE,EACF,KAAK,WAAWjC,EAAKrC,EAAQkE,EAASD,EAASuH,EAAa,EAAG,EACtDjH,GACTlC,EAAI,UAAA,EACJA,EAAI,OAAO7M,EAAIsP,EAASb,CAAO,EAC/B5B,EAAI,OAAO7M,EAAIsP,EAAU0G,EAAYvH,CAAO,EAC5C5B,EAAI,OAAA,EACJ,KAAK,WAAWA,EAAKrC,EAAQkE,EAASD,EAASuH,EAAa,EAAG,IAE/DnJ,EAAI,UAAA,EACJA,EAAI,OAAO7M,EAAIsP,EAASb,CAAO,EAC/B5B,EAAI,OAAO7M,EAAIsP,EAAU0G,EAAYvH,CAAO,EAC5C5B,EAAI,OAAA,GAGNA,EAAI,UAAYmB,EAAO,UACvBnB,EAAI,SAAShD,EAAE,QAAS7J,EAAIsP,EAAU0G,EAAa,EAAIlO,EAAKyG,CAAK,CACnE,CAAC,EAED1B,EAAI,QAAA,CACN,CAEO,YAAYC,EAAyB,CAC1C,KAAK,MAAQA,EACb,KAAK,YAAA,EACL,KAAK,OAAA,CACP,CAEO,WAAWoJ,EAAwB,CACxC,KAAK,UAAU,MAAM,QAAUA,EAAU,QAAU,MACrD,CAEO,SAAgB,CACrB,KAAK,UAAU,OAAA,CACjB,CACF,CCnbO,MAAMC,EAAgB,CAO3B,YACE3C,EACA1G,EACAxD,EACA,CAVMtC,EAAA,kBACAA,EAAA,gBACAA,EAAA,cACAA,EAAA,eACAA,EAAA,kBAAa,IAOnB,KAAK,MAAQ8F,EACb,KAAK,OAASxD,EAEd,KAAK,UAAY,SAAS,cAAc,KAAK,EAC7C,KAAK,UAAU,UAAY,uBAC3B,KAAK,qBAAA,EAEL,MAAM+K,EAAQ,SAAS,cAAc,KAAK,EAC1CA,EAAM,UAAY,gBAClBA,EAAM,MAAM,QAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAWtBA,EAAM,QAAU,IAAM,KAAK,OAAA,EAE3B,KAAK,QAAU,SAAS,cAAc,KAAK,EAC3C,KAAK,QAAQ,MAAM,QAAU,OAE7B,KAAK,UAAU,YAAYA,CAAK,EAChC,KAAK,UAAU,YAAY,KAAK,OAAO,EACvCb,EAAO,YAAY,KAAK,SAAS,CACnC,CAEQ,aAAuB,CAC7B,MAAM9G,EAAO,KAAK,MAAM,KAAK,YAAA,EAC7B,OAAOA,EAAK,SAAS,MAAM,GAAKA,EAAK,SAAS,UAAU,GAAKA,EAAK,SAAS,SAAS,CACtF,CAEQ,sBAA6B,CACnC,MAAMgD,EAAS,KAAK,YAAA,EACd+D,EAAK/D,EAAS,yBAA2B,4BACzCvF,EAAQuF,EAAS,UAAY,UAC7BgE,EAAchE,EAAS,2BAA6B,qBACpDiE,EAASjE,EAAS,gCAAkC,gCAE1D,KAAK,UAAU,MAAM,QAAU;AAAA;AAAA;AAAA;AAAA;AAAA,oBAKf+D,CAAE;AAAA;AAAA;AAAA,0BAGIC,CAAW;AAAA;AAAA,oBAEjBC,CAAM;AAAA,eACXxJ,CAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KAQlB,CAEO,OAAOiM,EAA0B,CACjC,KAAK,aAEV,KAAK,QAAQ,UAAY,GAEzB,KAAK,OAAO,QAASvM,GAAM,CACzB,GAAI,CAACA,EAAE,aAAc,OAErB,MAAM5K,EAAO4K,EAAE,QAAA,EACf,GAAI,CAAC5K,EAAM,OAGX,MAAMoX,EAAqB,CAAA,EACrBC,EAAqB,CAAA,EAC3B,QAAShY,EAAI,EAAGA,EAAIW,EAAK,EAAE,OAAQX,IAC7BW,EAAK,EAAEX,CAAC,GAAK8X,EAAW,MAAQnX,EAAK,EAAEX,CAAC,GAAK8X,EAAW,OAC1DE,EAAS,KAAKrX,EAAK,EAAEX,CAAC,CAAC,EACvB+X,EAAS,KAAKpX,EAAK,EAAEX,CAAC,CAAC,GAI3B,GAAI+X,EAAS,SAAW,EAAG,OAE3B,MAAME,EAAQvV,GAAeqV,CAAQ,EAC/BvT,EAAOgC,GAAUwR,EAAiBD,CAAe,EACjDlI,EAAQtE,EAAE,SAAA,EAEVyE,EAAO,SAAS,cAAc,KAAK,EACzCA,EAAK,MAAM,QAAU;AAAA;AAAA,gCAEK,KAAK,cAAgB,yBAA2B,kBAAkB;AAAA,QAG5FA,EAAK,UAAY;AAAA;AAAA,iFAE0DH,EAAM,KAAK;AAAA,YAChFtE,EAAE,OAAO;AAAA;AAAA;AAAA,uBAGE0M,EAAM,IAAI,cAAc,CAAC,CAAC;AAAA,uBAC1BA,EAAM,IAAI,cAAc,CAAC,CAAC;AAAA,wBACzBA,EAAM,KAAK,cAAc,CAAC,CAAC;AAAA,yBAC1BA,EAAM,KAAK;AAAA,qDACiBzT,EAAK,cAAc,CAAC,CAAC;AAAA;AAAA,QAIpE,KAAK,QAAQ,YAAYwL,CAAI,CAC/B,CAAC,EAEG,KAAK,QAAQ,YAAc,KAC3B,KAAK,QAAQ,UAAY,mFAE/B,CAEO,QAAe,CACpB,KAAK,WAAa,CAAC,KAAK,WACxB,KAAK,QAAQ,MAAM,QAAU,KAAK,WAAa,QAAU,OACrD,KAAK,UAGX,CAEO,YAAYxB,EAAyB,CAC1C,KAAK,MAAQA,EACb,KAAK,qBAAA,CACP,CAEO,SAAgB,CACrB,KAAK,UAAU,OAAA,CACjB,CACF,CCzIA,MAAM0J,EAAiB,CACrB,KAAM,CACJ,MAAO,2BACP,UAAW,EACX,SAAU,CAAA,CAAC,EAEb,UAAW,CACT,UAAW,2BAEX,YAAa,CAAA,EAEf,KAAM,CACJ,SAAU,GACV,WAAY,+BACZ,MAAO,UAEP,QAAS,CAAA,EAEX,MAAO,CACL,MAAO,2BACP,UAAW,EACX,SAAU,EAAA,CAEd,EAiBO,MAAMC,EAAkB,CAAxB,cACGzP,EAAA,uBAA2C,KAC3CA,EAAA,iBAAY,GAUpB,IAAI0P,EAAgC,CAClC,MAAM/N,EAAK+N,EAAW,IAAM,cAAc,EAAE,KAAK,SAAS,GACpDC,EAAuB,CAC3B,GAAGD,EACH,GAAA/N,EACA,QAAS+N,EAAW,SAAW,GAC/B,YAAaA,EAAW,aAAe,GACvC,OAAQA,EAAW,QAAU,CAAA,EAG/B,YAAK,YAAY,IAAI/N,EAAIgO,CAAQ,EAC1BhO,CACT,CAKA,OAAOA,EAAqB,CAC1B,OAAO,KAAK,YAAY,OAAOA,CAAE,CACnC,CAKA,OAAOA,EAAYiO,EAAoC,CACrD,MAAMC,EAAW,KAAK,YAAY,IAAIlO,CAAE,EACpCkO,GACF,KAAK,YAAY,IAAIlO,EAAI,CAAE,GAAGkO,EAAU,GAAGD,EAAuB,CAEtE,CAKA,IAAIjO,EAAoC,CACtC,OAAO,KAAK,YAAY,IAAIA,CAAE,CAChC,CAKA,QAAuB,CACrB,OAAO,MAAM,KAAK,KAAK,YAAY,QAAQ,CAC7C,CAKA,OAAc,CACZ,KAAK,YAAY,MAAA,CACnB,CAKA,IAAI,OAAgB,CAClB,OAAO,KAAK,YAAY,IAC1B,CASA,OACEkE,EACArD,EACAT,EACM,CAEN,MAAM+N,EAAS,KAAK,SACjB,OAAO1U,GAAKA,EAAE,UAAY,EAAK,EAC/B,KAAK,CAACA,EAAG0E,KAAO1E,EAAE,QAAU,IAAM0E,EAAE,QAAU,EAAE,EAEnD+F,EAAI,KAAA,EAGJA,EAAI,UAAA,EACJA,EAAI,KAAKrD,EAAS,EAAGA,EAAS,EAAGA,EAAS,MAAOA,EAAS,MAAM,EAChEqD,EAAI,KAAA,EAEJ,UAAW6J,KAAcI,EACvB,KAAK,iBAAiBjK,EAAK6J,EAAYlN,EAAUT,CAAM,EAGzD8D,EAAI,QAAA,CACN,CAEQ,iBACNA,EACA6J,EACAlN,EACAT,EACM,CACN,OAAQ2N,EAAW,KAAA,CACjB,IAAK,kBACH,KAAK,qBAAqB7J,EAAK6J,EAAYlN,EAAUT,CAAM,EAC3D,MACF,IAAK,gBACH,KAAK,mBAAmB8D,EAAK6J,EAAYlN,EAAUT,CAAM,EACzD,MACF,IAAK,YACH,KAAK,gBAAgB8D,EAAK6J,EAAYlN,EAAUT,CAAM,EACtD,MACF,IAAK,OACH,KAAK,WAAW8D,EAAK6J,EAAYlN,EAAUT,CAAM,EACjD,MACF,IAAK,OACH,KAAK,WAAW8D,EAAK6J,EAAYlN,EAAUT,CAAM,EACjD,MACF,IAAK,QACH,KAAK,YAAY8D,EAAK6J,EAAYlN,EAAUT,CAAM,EAClD,KAAA,CAEN,CAMQ,aAAa3K,EAAe2K,EAAgBS,EAA4B,CAC9E,MAAMuN,GAAc3Y,EAAQ2K,EAAO,OAASA,EAAO,KAAOA,EAAO,MACjE,OAAOS,EAAS,EAAIuN,EAAavN,EAAS,KAC5C,CAEQ,aAAapL,EAAe2K,EAAgBS,EAA4B,CAC9E,MAAMuN,GAAc3Y,EAAQ2K,EAAO,OAASA,EAAO,KAAOA,EAAO,MACjE,OAAOS,EAAS,EAAIA,EAAS,QAAU,EAAIuN,EAC7C,CAMQ,qBACNlK,EACA6J,EACAlN,EACAT,EACM,CACN,MAAM9I,EAAI,KAAK,aAAayW,EAAW,EAAG3N,EAAQS,CAAQ,EAG1D,GAAIvJ,EAAIuJ,EAAS,GAAKvJ,EAAIuJ,EAAS,EAAIA,EAAS,OAAQ,OAExD,MAAMwN,EAASN,EAAW,OAAS,OAC/B,KAAK,IAAI,KAAK,aAAaA,EAAW,KAAM3N,EAAQS,CAAQ,EAAGA,EAAS,CAAC,EACzEA,EAAS,EACPyN,EAAOP,EAAW,OAAS,OAC7B,KAAK,IAAI,KAAK,aAAaA,EAAW,KAAM3N,EAAQS,CAAQ,EAAGA,EAAS,EAAIA,EAAS,KAAK,EAC1FA,EAAS,EAAIA,EAAS,MAE1BqD,EAAI,KAAA,EACJA,EAAI,YAAc6J,EAAW,OAASF,EAAe,KAAK,MAC1D3J,EAAI,UAAY6J,EAAW,WAAaF,EAAe,KAAK,UAC5D3J,EAAI,YAAY6J,EAAW,UAAYF,EAAe,KAAK,QAAQ,EAEnE3J,EAAI,UAAA,EACJA,EAAI,OAAOmK,EAAQ/W,CAAC,EACpB4M,EAAI,OAAOoK,EAAMhX,CAAC,EAClB4M,EAAI,OAAA,EAGA6J,EAAW,OACb,KAAK,gBACH7J,EACA6J,EAAW,MACXM,EAAQC,EAAMhX,EACdyW,EAAW,eAAiB,QAC5B,aACAA,EAAW,eAAA,EAIf7J,EAAI,QAAA,CACN,CAMQ,mBACNA,EACA6J,EACAlN,EACAT,EACM,CACN,MAAM/I,EAAI,KAAK,aAAa0W,EAAW,EAAG3N,EAAQS,CAAQ,EAG1D,GAAIxJ,EAAIwJ,EAAS,GAAKxJ,EAAIwJ,EAAS,EAAIA,EAAS,MAAO,OAEvD,MAAM0N,EAASR,EAAW,OAAS,OAC/B,KAAK,IAAI,KAAK,aAAaA,EAAW,KAAM3N,EAAQS,CAAQ,EAAGA,EAAS,EAAIA,EAAS,MAAM,EAC3FA,EAAS,EACP2N,EAAOT,EAAW,OAAS,OAC7B,KAAK,IAAI,KAAK,aAAaA,EAAW,KAAM3N,EAAQS,CAAQ,EAAGA,EAAS,CAAC,EACzEA,EAAS,EAAIA,EAAS,OAE1BqD,EAAI,KAAA,EACJA,EAAI,YAAc6J,EAAW,OAASF,EAAe,KAAK,MAC1D3J,EAAI,UAAY6J,EAAW,WAAaF,EAAe,KAAK,UAC5D3J,EAAI,YAAY6J,EAAW,UAAYF,EAAe,KAAK,QAAQ,EAEnE3J,EAAI,UAAA,EACJA,EAAI,OAAO7M,EAAGkX,CAAM,EACpBrK,EAAI,OAAO7M,EAAGmX,CAAI,EAClBtK,EAAI,OAAA,EAGA6J,EAAW,OACb,KAAK,gBACH7J,EACA6J,EAAW,MACXQ,EAAQC,EAAMnX,EACd0W,EAAW,eAAiB,MAC5B,WACAA,EAAW,eAAA,EAIf7J,EAAI,QAAA,CACN,CAMQ,gBACNA,EACA6J,EACAlN,EACAT,EACM,CACN,MAAM/F,EAAK,KAAK,aAAa0T,EAAW,KAAM3N,EAAQS,CAAQ,EACxDvG,EAAK,KAAK,aAAayT,EAAW,KAAM3N,EAAQS,CAAQ,EACxD/F,EAAK,KAAK,aAAaiT,EAAW,KAAM3N,EAAQS,CAAQ,EACxDnE,EAAK,KAAK,aAAaqR,EAAW,KAAM3N,EAAQS,CAAQ,EAExDxJ,EAAI,KAAK,IAAIgD,EAAIC,CAAE,EACnBhD,EAAI,KAAK,IAAIwD,EAAI4B,CAAE,EACnBsF,EAAQ,KAAK,IAAI1H,EAAKD,CAAE,EACxB4H,EAAS,KAAK,IAAIvF,EAAK5B,CAAE,EAE/BoJ,EAAI,KAAA,EAGA6J,EAAW,YACb7J,EAAI,UAAY6J,EAAW,UAC3B7J,EAAI,SAAS7M,EAAGC,EAAG0K,EAAOC,CAAM,GAI9B8L,EAAW,cACb7J,EAAI,YAAc6J,EAAW,YAC7B7J,EAAI,UAAY6J,EAAW,aAAeF,EAAe,UAAU,YACnE3J,EAAI,YAAY6J,EAAW,YAAc,CAAA,CAAE,EAC3C7J,EAAI,WAAW7M,EAAGC,EAAG0K,EAAOC,CAAM,GAIhC8L,EAAW,OACb,KAAK,oBAAoB7J,EAAK6J,EAAW,MAAO1W,EAAI2K,EAAQ,EAAG1K,EAAI2K,EAAS,CAAC,EAG/EiC,EAAI,QAAA,CACN,CAMQ,WACNA,EACA6J,EACAlN,EACAT,EACM,CAEN,IAAI/I,EAAWC,EAAW0K,EAAeC,EAEzC,GAAI8L,EAAW,OAAS,QAAaA,EAAW,OAAS,OAAW,CAElE,MAAM1T,EAAK,KAAK,aAAa0T,EAAW,KAAM3N,EAAQS,CAAQ,EACxDvG,EAAK,KAAK,aAAayT,EAAW,KAAM3N,EAAQS,CAAQ,EAC9DxJ,EAAI,KAAK,IAAIgD,EAAIC,CAAE,EACnB0H,EAAQ,KAAK,IAAI1H,EAAKD,CAAE,EACxB/C,EAAIuJ,EAAS,EACboB,EAASpB,EAAS,OAEdkN,EAAW,OAAS,SAEtB9L,EADe,KAAK,aAAa8L,EAAW,KAAM3N,EAAQS,CAAQ,EAChDvJ,GAEhByW,EAAW,OAAS,SAEtBzW,EADe,KAAK,aAAayW,EAAW,KAAM3N,EAAQS,CAAQ,EAElEoB,EAASpB,EAAS,EAAIA,EAAS,OAASvJ,EAE5C,SAAWyW,EAAW,OAAS,QAAaA,EAAW,OAAS,OAAW,CAEzE,MAAMjT,EAAK,KAAK,aAAaiT,EAAW,KAAM3N,EAAQS,CAAQ,EACxDnE,EAAK,KAAK,aAAaqR,EAAW,KAAM3N,EAAQS,CAAQ,EAC9DvJ,EAAI,KAAK,IAAIwD,EAAI4B,CAAE,EACnBuF,EAAS,KAAK,IAAIvF,EAAK5B,CAAE,EACzBzD,EAAIwJ,EAAS,EACbmB,EAAQnB,EAAS,KACnB,KAEE,QAiBF,GAdAqD,EAAI,KAAA,EAGJA,EAAI,UAAY6J,EAAW,WAAaF,EAAe,UAAU,UACjE3J,EAAI,SAAS7M,EAAGC,EAAG0K,EAAOC,CAAM,EAG5B8L,EAAW,cACb7J,EAAI,YAAc6J,EAAW,YAC7B7J,EAAI,UAAY6J,EAAW,aAAe,EAC1C7J,EAAI,WAAW7M,EAAGC,EAAG0K,EAAOC,CAAM,GAIhC8L,EAAW,MAAO,CACpB,IAAI7I,EAAS7N,EAAI2K,EAAQ,EACrByM,EAASnX,EAAI2K,EAAS,EAE1B,OAAQ8L,EAAW,cAAA,CACjB,IAAK,MACHU,EAASnX,EAAI,GACb,MACF,IAAK,SACHmX,EAASnX,EAAI2K,EAAS,EACtB,MACF,IAAK,OACHiD,EAAS7N,EAAI,GACb,MACF,IAAK,QACH6N,EAAS7N,EAAI2K,EAAQ,GACrB,KAAA,CAGJ,KAAK,oBAAoBkC,EAAK6J,EAAW,MAAO7I,EAAQuJ,CAAM,CAChE,CAEAvK,EAAI,QAAA,CACN,CAMQ,WACNA,EACA6J,EACAlN,EACAT,EACM,CACN,MAAM/I,EAAI,KAAK,aAAa0W,EAAW,EAAG3N,EAAQS,CAAQ,EACpDvJ,EAAI,KAAK,aAAayW,EAAW,EAAG3N,EAAQS,CAAQ,EAE1DqD,EAAI,KAAA,EAGA6J,EAAW,WACb7J,EAAI,UAAU7M,EAAGC,CAAC,EAClB4M,EAAI,OAAQ6J,EAAW,SAAW,KAAK,GAAM,GAAG,EAChD7J,EAAI,UAAU,CAAC7M,EAAG,CAACC,CAAC,GAGtB,MAAMoX,EAAWX,EAAW,UAAYF,EAAe,KAAK,SACtDc,EAAaZ,EAAW,YAAcF,EAAe,KAAK,WAC1De,EAAab,EAAW,YAAc,SAE5C7J,EAAI,KAAO,GAAG0K,CAAU,IAAIF,CAAQ,MAAMC,CAAU,GACpDzK,EAAI,UAAY,SAChBA,EAAI,aAAe,SAGnB,MAAM2K,EAAU3K,EAAI,YAAY6J,EAAW,IAAI,EACzCpH,EAAUoH,EAAW,SAAWF,EAAe,KAAK,QACpDiB,EAAYD,EAAQ,MAAQlI,EAAU,EACtCoI,EAAaL,EAAW/H,EAAU,EAGxC,IAAIqI,EAAQ3X,EACR4X,EAAQ3X,EAEZ,OAAQyW,EAAW,OAAA,CACjB,IAAK,WACHiB,GAASF,EAAY,EACrBG,GAASF,EAAa,EACtB,MACF,IAAK,YACHC,GAASF,EAAY,EACrBG,GAASF,EAAa,EACtB,MACF,IAAK,cACHC,GAASF,EAAY,EACrBG,GAASF,EAAa,EACtB,MACF,IAAK,eACHC,GAASF,EAAY,EACrBG,GAASF,EAAa,EACtB,MACF,IAAK,aACHE,GAASF,EAAa,EACtB,MACF,IAAK,gBACHE,GAASF,EAAa,EACtB,MACF,IAAK,cACHC,GAASF,EAAY,EACrB,MACF,IAAK,eACHE,GAASF,EAAY,EACrB,KAAA,CAIAf,EAAW,kBACb7J,EAAI,UAAY6J,EAAW,gBAC3B7J,EAAI,UAAA,EACJA,EAAI,UACF8K,EAAQF,EAAY,EACpBG,EAAQF,EAAa,EACrBD,EACAC,EACA,CAAA,EAEF7K,EAAI,KAAA,GAINA,EAAI,UAAY6J,EAAW,OAASF,EAAe,KAAK,MACxD3J,EAAI,SAAS6J,EAAW,KAAMiB,EAAOC,CAAK,EAE1C/K,EAAI,QAAA,CACN,CAMQ,YACNA,EACA6J,EACAlN,EACAT,EACM,CACN,MAAM/F,EAAK,KAAK,aAAa0T,EAAW,GAAI3N,EAAQS,CAAQ,EACtD/F,EAAK,KAAK,aAAaiT,EAAW,GAAI3N,EAAQS,CAAQ,EACtDvG,EAAK,KAAK,aAAayT,EAAW,GAAI3N,EAAQS,CAAQ,EACtDnE,EAAK,KAAK,aAAaqR,EAAW,GAAI3N,EAAQS,CAAQ,EAE5DqD,EAAI,KAAA,EACJA,EAAI,YAAc6J,EAAW,OAASF,EAAe,MAAM,MAC3D3J,EAAI,UAAY6J,EAAW,OAASF,EAAe,MAAM,MACzD3J,EAAI,UAAY6J,EAAW,WAAaF,EAAe,MAAM,UAG7D3J,EAAI,UAAA,EACJA,EAAI,OAAO7J,EAAIS,CAAE,EACjBoJ,EAAI,OAAO5J,EAAIoC,CAAE,EACjBwH,EAAI,OAAA,EAGJ,MAAMgL,EAAWnB,EAAW,UAAYF,EAAe,MAAM,SACvDsB,EAAQ,KAAK,MAAMzS,EAAK5B,EAAIR,EAAKD,CAAE,EAEnC+U,EAAYrB,EAAW,WAAa,SA4B1C,GA1BIqB,IAAc,SAChBlL,EAAI,UAAA,EACJA,EAAI,OAAO5J,EAAIoC,CAAE,EACjBwH,EAAI,OACF5J,EAAK4U,EAAW,KAAK,IAAIC,EAAQ,KAAK,GAAK,CAAC,EAC5CzS,EAAKwS,EAAW,KAAK,IAAIC,EAAQ,KAAK,GAAK,CAAC,CAAA,EAG1CC,IAAc,UAChBlL,EAAI,OACF5J,EAAK4U,EAAW,KAAK,IAAIC,EAAQ,KAAK,GAAK,CAAC,EAC5CzS,EAAKwS,EAAW,KAAK,IAAIC,EAAQ,KAAK,GAAK,CAAC,CAAA,EAE9CjL,EAAI,UAAA,EACJA,EAAI,KAAA,IAEJA,EAAI,OAAO5J,EAAIoC,CAAE,EACjBwH,EAAI,OACF5J,EAAK4U,EAAW,KAAK,IAAIC,EAAQ,KAAK,GAAK,CAAC,EAC5CzS,EAAKwS,EAAW,KAAK,IAAIC,EAAQ,KAAK,GAAK,CAAC,CAAA,EAE9CjL,EAAI,OAAA,IAKJ6J,EAAW,SAAU,CACvB,MAAMsB,EAAYF,EAAQ,KAAK,GAC/BjL,EAAI,UAAA,EACJA,EAAI,OAAO7J,EAAIS,CAAE,EACjBoJ,EAAI,OACF7J,EAAK6U,EAAW,KAAK,IAAIG,EAAY,KAAK,GAAK,CAAC,EAChDvU,EAAKoU,EAAW,KAAK,IAAIG,EAAY,KAAK,GAAK,CAAC,CAAA,EAElDnL,EAAI,OACF7J,EAAK6U,EAAW,KAAK,IAAIG,EAAY,KAAK,GAAK,CAAC,EAChDvU,EAAKoU,EAAW,KAAK,IAAIG,EAAY,KAAK,GAAK,CAAC,CAAA,EAElDnL,EAAI,UAAA,EACJA,EAAI,KAAA,CACN,CAGA,GAAI6J,EAAW,MAAO,CACpB,MAAMhL,GAAQ1I,EAAKC,GAAM,EACnBgV,GAAQxU,EAAK4B,GAAM,EACzB,KAAK,oBAAoBwH,EAAK6J,EAAW,MAAOhL,EAAMuM,EAAO,EAAE,CACjE,CAEApL,EAAI,QAAA,CACN,CAMQ,gBACNA,EACAS,EACArI,EACAC,EACAgT,EACAzK,EACA0K,EACA5O,EACM,CACNsD,EAAI,KAAA,EAEJA,EAAI,KAAO,GAAG2J,EAAe,KAAK,QAAQ,MAAMA,EAAe,KAAK,UAAU,GAC9E,MAAMgB,EAAU3K,EAAI,YAAYS,CAAK,EAC/BgC,EAAU,EACVmI,EAAYD,EAAQ,MAAQlI,EAAU,EACtCoI,EAAalB,EAAe,KAAK,SAAWlH,EAAU,EAE5D,IAAItP,EAAWC,EAEf,GAAIkY,IAAgB,aAAc,CAGhC,OAFAlY,EAAIiY,EAEIzK,EAAA,CACN,IAAK,OACHzN,EAAIiF,EAAQ,EACZ4H,EAAI,UAAY,OAChB,MACF,IAAK,QACH7M,EAAIkF,EAAM,EACV2H,EAAI,UAAY,QAChB,MACF,QACE7M,GAAKiF,EAAQC,GAAO,EACpB2H,EAAI,UAAY,QAAA,CAGpBA,EAAI,aAAe,SACnB5M,GAAK,CACP,KAAO,CAGL,OAFAD,EAAIkY,EAEIzK,EAAA,CACN,IAAK,MACHxN,EAAIgF,EAAQyS,EACZ,MACF,IAAK,SACHzX,EAAIiF,EAAM,EACV,MACF,QACEjF,GAAKgF,EAAQC,GAAO,CAAA,CAGxB2H,EAAI,UAAY,SAChBA,EAAI,aAAe,QACrB,CAGA,GAAItD,GAAmB,GAAM,CAC3BsD,EAAI,UAAYtD,GAAmB,qBACnC,MAAM6O,EAAMvL,EAAI,YAAc,OAAS7M,EAAIsP,EAC/BzC,EAAI,YAAc,QAAU7M,EAAIyX,EAAYnI,EAC5CtP,EAAIyX,EAAY,EAC5B5K,EAAI,SAASuL,EAAKnY,EAAIyX,EAAapI,EAASmI,EAAWC,CAAU,CACnE,CAGA7K,EAAI,UAAY2J,EAAe,KAAK,MACpC3J,EAAI,SAASS,EAAOtN,EAAGC,CAAC,EAExB4M,EAAI,QAAA,CACN,CAEQ,oBACNA,EACAS,EACAtN,EACAC,EACM,CACN4M,EAAI,KAAA,EAEJA,EAAI,KAAO,GAAG2J,EAAe,KAAK,QAAQ,MAAMA,EAAe,KAAK,UAAU,GAC9E,MAAMgB,EAAU3K,EAAI,YAAYS,CAAK,EAC/BgC,EAAU,EACVmI,EAAYD,EAAQ,MAAQlI,EAAU,EACtCoI,EAAalB,EAAe,KAAK,SAAWlH,EAAU,EAG5DzC,EAAI,UAAY,qBAChBA,EAAI,UAAA,EACJA,EAAI,UAAU7M,EAAIyX,EAAY,EAAGxX,EAAIyX,EAAa,EAAGD,EAAWC,EAAY,CAAC,EAC7E7K,EAAI,KAAA,EAGJA,EAAI,UAAY2J,EAAe,KAAK,MACpC3J,EAAI,UAAY,SAChBA,EAAI,aAAe,SACnBA,EAAI,SAASS,EAAOtN,EAAGC,CAAC,EAExB4M,EAAI,QAAA,CACN,CACF,CCtrBO,SAASwL,GACd/O,EACApJ,EACQ,CACR,KAAM,CACJ,UAAAoY,EACA,eAAAC,EAAiB,GACjB,UAAAxH,EAAY,EACZ,UAAAyH,EAAY,GAAA,EACVtY,GAAW,CAAA,EAETuY,EAAiBH,EACnBhP,EAAO,OAAOO,GAAKyO,EAAU,SAASzO,EAAE,MAAA,CAAO,CAAC,EAChDP,EAEJ,GAAImP,EAAe,SAAW,EAAG,MAAO,GAExC,MAAMrJ,EAAkB,CAAA,EAGxB,GAAImJ,EAAgB,CAClB,MAAMG,EAAoB,CAAA,EAC1BD,EAAe,QAAQ5O,GAAK,CAC1B6O,EAAQ,KAAK,GAAG7O,EAAE,MAAA,CAAO,KAAM,GAAGA,EAAE,MAAA,CAAO,IAAI,CACjD,CAAC,EACDuF,EAAM,KAAKsJ,EAAQ,KAAKF,CAAS,CAAC,CACpC,CAGA,MAAMG,EAAY,KAAK,IAAI,GAAGF,EAAe,IAAI5O,GAAKA,EAAE,cAAA,CAAe,CAAC,EAGxE,QAASvL,EAAI,EAAGA,EAAIqa,EAAWra,IAAK,CAClC,MAAM0F,EAAgB,CAAA,EACtByU,EAAe,QAAQ5O,GAAK,CAC1B,MAAM5K,EAAO4K,EAAE,QAAA,EACX5K,GAAQX,EAAIW,EAAK,EAAE,OACrB+E,EAAI,KAAK/E,EAAK,EAAEX,CAAC,EAAE,QAAQyS,CAAS,EAAG9R,EAAK,EAAEX,CAAC,EAAE,QAAQyS,CAAS,CAAC,EAEnE/M,EAAI,KAAK,GAAI,EAAE,CAEnB,CAAC,EACDoL,EAAM,KAAKpL,EAAI,KAAKwU,CAAS,CAAC,CAChC,CAEA,OAAOpJ,EAAM,KAAK;AAAA,CAAI,CACxB,CAKO,SAASwJ,GACdtP,EACA8M,EACAlW,EACQ,CACR,KAAM,CAAE,UAAAoY,EAAW,UAAAvH,EAAY,CAAA,EAAM7Q,GAAW,CAAA,EAE1CuY,EAAiBH,EACnBhP,EAAO,OAAOO,GAAKyO,EAAU,SAASzO,EAAE,MAAA,CAAO,CAAC,EAChDP,EAEE3H,EAMD,CAAA,EAEL,OAAA8W,EAAe,QAAQ5O,GAAK,CAC1B,MAAM5K,EAAO4K,EAAE,QAAA,EACflI,EAAOkI,EAAE,MAAA,CAAO,EAAI,CAClB,GAAIA,EAAE,MAAA,EACN,KAAMA,EAAE,QAAA,EACR,MAAOA,EAAE,SAAA,EACT,KAAM,CACJ,EAAG5K,EAAO,MAAM,KAAKA,EAAK,CAAC,EAAE,IAAImH,GAAK,WAAWA,EAAE,QAAQ2K,CAAS,CAAC,CAAC,EAAI,CAAA,EAC1E,EAAG9R,EAAO,MAAM,KAAKA,EAAK,CAAC,EAAE,IAAImH,GAAK,WAAWA,EAAE,QAAQ2K,CAAS,CAAC,CAAC,EAAI,CAAA,CAAC,EAE7E,WAAYlH,EAAE,cAAA,CAAc,CAEhC,CAAC,EAEM,KAAK,UAAU,CACpB,WAAY,IAAI,KAAA,EAAO,YAAA,EACvB,YAAauM,EACb,OAAQzU,CAAA,EACP,KAAM,CAAC,CACZ,CAKO,SAASkX,GACdC,EACAC,EACAxP,EACAyE,EACAgL,EACAlR,EACA1H,EAAuB,MACf,CACR,MAAM6Y,EAAc,SAAS,cAAc,QAAQ,EACnDA,EAAY,MAAQF,EAAc,MAClCE,EAAY,OAASF,EAAc,OACnC,MAAMlM,EAAMoM,EAAY,WAAW,IAAI,EACvC,GAAI,CAACpM,EAAK,MAAO,GAGjB,MAAM4G,EAAKlK,EACX,OAAAsD,EAAI,UAAY,QAAQ,KAAK,MAAM4G,EAAG,CAAC,EAAI,GAAG,CAAC,KAAK,KAAK,MACvDA,EAAG,CAAC,EAAI,GAAA,CACT,KAAK,KAAK,MAAMA,EAAG,CAAC,EAAI,GAAG,CAAC,KAAKA,EAAG,CAAC,CAAC,IACvC5G,EAAI,SAAS,EAAG,EAAGoM,EAAY,MAAOA,EAAY,MAAM,EAGxDpM,EAAI,UAAUiM,EAAa,EAAG,CAAC,EAG/BjM,EAAI,UAAUkM,EAAe,EAAG,CAAC,EAG7B/K,GAAUgL,GACZhL,EAAO,KAAKnB,EAAK/E,CAAG,EAGfmR,EAAY,UAAU,SAAS7Y,CAAI,EAAE,CAC9C,CCnHO,SAAS8Y,GACdrM,EACA3M,EACM,CAMN,GALIA,EAAQ,IACV2M,EAAI,WAAW,KAAO3M,EAAQ,EAAE,CAAC,EACjC2M,EAAI,WAAW,KAAO3M,EAAQ,EAAE,CAAC,GAG/BA,EAAQ,EACV,GAAIA,EAAQ,OAAQ,CAElB,MAAMiZ,EAAQtM,EAAI,QAAQ,IAAI3M,EAAQ,MAAM,EACxCiZ,IACFA,EAAM,UAAUjZ,EAAQ,EAAE,CAAC,EAAGA,EAAQ,EAAE,CAAC,CAAC,EAEtCA,EAAQ,SAAW2M,EAAI,iBACzBA,EAAI,WAAW,KAAO3M,EAAQ,EAAE,CAAC,EACjC2M,EAAI,WAAW,KAAO3M,EAAQ,EAAE,CAAC,GAGvC,KAAO,CAEL,MAAMkZ,EAAWvM,EAAI,WAAW,KAAOA,EAAI,WAAW,KAChDwM,EAAWnZ,EAAQ,EAAE,CAAC,EAAIA,EAAQ,EAAE,CAAC,EACrCmE,EAAS+U,EAAW,EAAIC,EAAWD,EAAW,EAG9CE,EAAYF,EAAW,GAAKlZ,EAAQ,EAAE,CAAC,EAAI2M,EAAI,WAAW,MAAQuM,EAAW,EAEnFvM,EAAI,QAAQ,QAAQ,CAACsM,EAAOxQ,IAAO,CACjC,GAAIA,IAAOkE,EAAI,eAAgB,OAC/B,MAAM0M,EAASJ,EAAM,OAAO,CAAC,EAAIA,EAAM,OAAO,CAAC,EACzCK,EAAUL,EAAM,OAAO,CAAC,EAAIG,EAAYC,EACxCE,EAAUD,EAAUnV,EAASkV,EACnCJ,EAAM,UAAUK,EAASC,CAAO,CAClC,CAAC,EAED5M,EAAI,WAAW,KAAO3M,EAAQ,EAAE,CAAC,EACjC2M,EAAI,WAAW,KAAO3M,EAAQ,EAAE,CAAC,CACnC,CAGF2M,EAAI,OAAO,KAAK,OAAQ,CACtB,EAAG,CAACA,EAAI,WAAW,KAAMA,EAAI,WAAW,IAAI,EAC5C,EAAG,CAACA,EAAI,WAAW,KAAMA,EAAI,WAAW,IAAI,CAAA,CAC7C,EACDA,EAAI,cAAA,CACN,CAKO,SAAS6M,GACd7M,EACAsG,EACAC,EACAuG,EACM,CACN,MAAMhQ,EAAKkD,EAAI,YAAA,EACTtH,EAAM4N,EAASxJ,EAAG,OAAUkD,EAAI,WAAW,KAAOA,EAAI,WAAW,MAMvE,GAHAA,EAAI,WAAW,MAAQtH,EACvBsH,EAAI,WAAW,MAAQtH,EAEnBoU,EAAQ,CAEV,MAAMR,EAAQtM,EAAI,QAAQ,IAAI8M,CAAM,EACpC,GAAIR,EAAO,CACT,MAAMS,EAAQT,EAAM,OAAO,CAAC,EAAIA,EAAM,OAAO,CAAC,EACxCU,EAASzG,EAASzJ,EAAG,OAAUiQ,EACrCT,EAAM,UAAUA,EAAM,OAAO,CAAC,EAAIU,EAAOV,EAAM,OAAO,CAAC,EAAIU,CAAK,EAG5DF,IAAW9M,EAAI,iBACjBA,EAAI,WAAW,KAAOsM,EAAM,OAAO,CAAC,EACpCtM,EAAI,WAAW,KAAOsM,EAAM,OAAO,CAAC,EAExC,CACF,MAEEtM,EAAI,QAAQ,QAAQ,CAACsM,EAAOxQ,IAAO,CACjC,MAAMiR,EAAQT,EAAM,OAAO,CAAC,EAAIA,EAAM,OAAO,CAAC,EACxCU,EAASzG,EAASzJ,EAAG,OAAUiQ,EACrCT,EAAM,UAAUA,EAAM,OAAO,CAAC,EAAIU,EAAOV,EAAM,OAAO,CAAC,EAAIU,CAAK,EAE5DlR,IAAOkE,EAAI,iBACbA,EAAI,WAAW,KAAOsM,EAAM,OAAO,CAAC,EACpCtM,EAAI,WAAW,KAAOsM,EAAM,OAAO,CAAC,EAExC,CAAC,EAGH,MAAM7D,EAAMlC,EAASzJ,EAAG,QAAWkD,EAAI,WAAW,KAAOA,EAAI,WAAW,MACxEA,EAAI,OAAO,KAAK,MAAO,CAAE,OAAQtH,EAAI,OAAQ+P,EAAI,EACjDzI,EAAI,cAAA,CACN,CAKO,SAASiN,GAAajN,EAA8B,CACzD,GAAIA,EAAI,OAAO,OAAS,EAAG,OAE3B,IAAI9H,EAAO,IACPC,EAAO,KAGX,MAAM+U,MAAkB,IACxBlN,EAAI,QAAQ,QAAQ,CAACmN,EAAGrR,IAAO,CAC7BoR,EAAY,IAAIpR,EAAI,CAAE,IAAK,IAAU,IAAK,KAAW,CACvD,CAAC,EAED,IAAIsR,EAAe,GA6BnB,GA3BApN,EAAI,OAAO,QAAShD,GAAM,CACxB,GAAI,CAACA,EAAE,YAAa,OAEpB,MAAM/C,EAAI+C,EAAE,UAAA,EACZ,GACE/C,GACA,SAASA,EAAE,IAAI,GACf,SAASA,EAAE,IAAI,GACf,SAASA,EAAE,IAAI,GACf,SAASA,EAAE,IAAI,EACf,CAEA/B,EAAO,KAAK,IAAIA,EAAM+B,EAAE,IAAI,EAC5B9B,EAAO,KAAK,IAAIA,EAAM8B,EAAE,IAAI,EAG5B,MAAM6S,EAAS9P,EAAE,WAAA,GAAgBgD,EAAI,eAC/BqN,EAAUH,EAAY,IAAIJ,CAAM,EAClCO,IACFA,EAAQ,IAAM,KAAK,IAAIA,EAAQ,IAAKpT,EAAE,IAAI,EAC1CoT,EAAQ,IAAM,KAAK,IAAIA,EAAQ,IAAKpT,EAAE,IAAI,GAG5CmT,EAAe,EACjB,CACF,CAAC,EAEG,CAACA,EAAc,CACjB,QAAQ,KAAK,qDAAqD,EAClE,MACF,CAEA,MAAME,EAAY,KACZC,EAAY,MAGlB,GAAIvN,EAAI,aAAa,KAAM,CACxB,IAAIwN,EAASrV,EAAOD,GAChBsV,GAAU,GAAK,CAAC,SAASA,CAAM,KAAGA,EAAS,KAAK,IAAItV,CAAI,EAAI,IAAO,GACvE,MAAMuV,EAAO,KAAK,IAAID,EAAS,IAAM,IAAI,EAEzCxN,EAAI,WAAW,KAAO,KAAK,IAAIuN,EAAWrV,EAAOuV,CAAI,EACrDzN,EAAI,WAAW,KAAO,KAAK,IAAIsN,EAAWnV,EAAOsV,CAAI,CACxD,CAGAP,EAAY,QAAQ,CAAChR,EAAQJ,IAAO,CAChC,GAAII,EAAO,MAAQ,IAAU,OAE7B,MAAMhD,EAAO8G,EAAI,gBAAgB,IAAIlE,CAAE,EACjCwQ,EAAQtM,EAAI,QAAQ,IAAIlE,CAAE,EAEhC,GAAI5C,GAAQA,EAAK,MAAQoT,EAAO,CAC5B,IAAIpP,EAAShB,EAAO,IAAMA,EAAO,KAC7BgB,GAAU,GAAK,CAAC,SAASA,CAAM,KAAGA,EAAS,KAAK,IAAIhB,EAAO,GAAG,EAAI,IAAO,GAC7E,MAAMwR,EAAO,KAAK,IAAIxQ,EAAS,IAAM,IAAI,EAEnCyQ,EAAS,KAAK,IAAIJ,EAAWrR,EAAO,IAAMwR,CAAI,EAC9CE,EAAS,KAAK,IAAIN,EAAWpR,EAAO,IAAMwR,CAAI,EAEpDpB,EAAM,UAAUqB,EAAQC,CAAM,EAG1B9R,IAAOkE,EAAI,iBACXA,EAAI,WAAW,KAAO2N,EACtB3N,EAAI,WAAW,KAAO4N,EAE9B,CACJ,CAAC,EAED5N,EAAI,cAAA,CACN,CAKO,SAAS6N,GACd7N,EACA8N,EACAC,EACAC,EACgE,CAChE,GAAIF,IAAkB,KAAM,CAC1B,GACEC,GACAA,EAAY,MAAQ,GACpBA,EAAY,OAAS,EACrB,CACA,MAAMpR,EAAWqD,EAAI,YAAA,EACf9D,EAAS8D,EAAI,WAEbiO,GAAYF,EAAY,EAAIpR,EAAS,GAAKA,EAAS,MACnDuR,GACHH,EAAY,EAAIA,EAAY,MAAQpR,EAAS,GAC9CA,EAAS,MACLwR,EACJ,GAAKJ,EAAY,EAAIpR,EAAS,GAAKA,EAAS,OACxCyR,EACJ,GACCL,EAAY,EAAIA,EAAY,OAASpR,EAAS,GAC7CA,EAAS,OAEP0R,EAAUnS,EAAO,KAAO+R,GAAY/R,EAAO,KAAOA,EAAO,MACzDoS,EAAUpS,EAAO,KAAOgS,GAAYhS,EAAO,KAAOA,EAAO,MACzDqS,EAAUrS,EAAO,KAAOkS,GAAYlS,EAAO,KAAOA,EAAO,MACzDsS,EAAUtS,EAAO,KAAOiS,GAAYjS,EAAO,KAAOA,EAAO,MAE/D8R,EAAK,CACH,EAAG,CAACK,EAASC,CAAO,EACpB,EAAG,CAACC,EAASC,CAAO,CAAA,CACrB,CACH,CACA,OAAO,IACT,KACE,QAAOV,CAEX,CCnNO,SAASW,GACdzO,EACArD,EACoB,CACpB,MAAM+R,EAAiC,CAAA,EAGvC,OAAA1O,EAAI,OAAO,SAASrD,EAAS,EAAGA,EAAS,EAAIA,EAAS,KAAK,EAC3DqD,EAAI,OAAO,UAAUA,EAAI,WAAW,KAAMA,EAAI,WAAW,IAAI,EAE7DA,EAAI,QAAQ,QAAQ,CAACsM,EAAOxQ,IAAO,CACjCwQ,EAAM,SAAS3P,EAAS,EAAIA,EAAS,OAAQA,EAAS,CAAC,EACnDb,IAAOkE,EAAI,gBACbsM,EAAM,UAAUtM,EAAI,WAAW,KAAMA,EAAI,WAAW,IAAI,CAE5D,CAAC,EAEDA,EAAI,OAAO,QAAShD,GAAM,CACpBA,EAAE,oBACJgD,EAAI,mBAAmBhD,CAAC,EACxBA,EAAE,kBAAoB,IAGxB,MAAM2R,EAAM3O,EAAI,SAAS,UAAUhD,EAAE,OAAO,EAC5C,GAAI2R,EAAK,CACP,MAAMC,EAAa5R,EAAE,QAAA,EAGf8P,EAAS9P,EAAE,WAAA,GAAgBgD,EAAI,eAC/BsM,EAAQtM,EAAI,QAAQ,IAAI8M,CAAM,EACpC,IAAIO,EAEAf,IACDe,EAAU,CAAE,IAAKf,EAAM,OAAO,CAAC,EAAG,IAAKA,EAAM,OAAO,CAAC,CAAA,GAIxD,MAAMuC,EAAaD,IAAe,OAAS,OAASA,EAE9CE,EAA+B,CACnC,GAAI9R,EAAE,MAAA,EACN,OAAQ2R,EACR,MAAO3R,EAAE,cAAA,EACT,MAAOA,EAAE,SAAA,EACT,QAASA,EAAE,UAAA,EACX,KAAM6R,EACN,QAAAxB,CAAA,EASF,IALIuB,IAAe,QAAUA,IAAe,UAC1CE,EAAW,MAAQ9R,EAAE,cAAA,EAAkB,GAIrC4R,IAAe,QAAUA,IAAe,eAAgB,CAC1D,MAAMG,EAAU/O,EAAI,SAAS,UAAU,GAAGhD,EAAE,OAAO,OAAO,EAC1D,GAAI+R,EAAS,CACXD,EAAW,WAAaC,EAExB,MAAMC,EAAWhS,EAAE,SAAA,EAAW,UAAY,QACpCiS,EAAajS,EAAE,cAAA,EACjBgS,IAAa,SACfF,EAAW,UAAY,GAAKG,EAAa,GAAK,EAE9CH,EAAW,UAAYG,EAAa,EAAI,CAE5C,CACF,CAEAP,EAAW,KAAKI,CAAU,CAC5B,CACF,CAAC,EAEMJ,CACT,CAKO,SAASQ,GACdlP,EACArD,EACAwS,EACM,OACN,MAAMtR,EAAOmC,EAAI,UAAU,sBAAA,EAC3B,GAAInC,EAAK,QAAU,GAAKA,EAAK,SAAW,EAAG,CACzC,QAAQ,KAAK,gEAAgE,EAC7E,MACF,CAEAmC,EAAI,QAAQ,MAAMnC,EAAK,MAAOA,EAAK,MAAM,EACzCmC,EAAI,QAAQ,SAASrD,EAAUqD,EAAI,OAAQmP,CAAa,EACxDnP,EAAI,QAAQ,UAAUrD,EAAUqD,EAAI,OAAQA,EAAI,aAAa,KAAK,EAGlE,MAAMoP,EAAqB,CAAA,EACrBC,EAAsB,CAAA,EAmD5B,GAjDArP,EAAI,gBAAgB,QAAQ,CAAC9G,EAAM4C,IAAO,CACnC5C,EAAK,WAAa,QAASmW,EAAU,KAAKvT,CAAE,EAC1CsT,EAAS,KAAKtT,CAAE,CACzB,CAAC,EAGDsT,EAAS,QAAQ,CAACtT,EAAIwT,IAAU,CAC5B,MAAMhD,EAAQtM,EAAI,QAAQ,IAAIlE,CAAE,EAC1B5C,EAAO8G,EAAI,gBAAgB,IAAIlE,CAAE,EACvC,GAAGwQ,GAASpT,EAAM,CACb,MAAM2H,EAASyO,EAAQ,GACvBtP,EAAI,QAAQ,UAAUrD,EAAU2P,EAAOpT,EAAK,MAAO,OAAQ2H,CAAM,CACtE,CACJ,CAAC,EAGDwO,EAAU,QAAQ,CAACvT,EAAIwT,IAAU,CAC7B,MAAMhD,EAAQtM,EAAI,QAAQ,IAAIlE,CAAE,EAC1B5C,EAAO8G,EAAI,gBAAgB,IAAIlE,CAAE,EACvC,GAAGwQ,GAASpT,EAAM,CACb,MAAM2H,EAASyO,EAAQ,GACvBtP,EAAI,QAAQ,UAAUrD,EAAU2P,EAAOpT,EAAK,MAAO,QAAS2H,CAAM,CACvE,CACJ,CAAC,EAEDb,EAAI,QAAQ,eAAerD,CAAQ,EAGnCqD,EAAI,OAAO,QAAShD,GAAM,CACxB,GAAIA,EAAE,UAAA,GAAeA,EAAE,eAAgB,CACrC,MAAM8P,EAAS9P,EAAE,WAAA,GAAgBgD,EAAI,eAE/B7C,EADQ6C,EAAI,QAAQ,IAAI8M,CAAM,GACZqC,EAExBnP,EAAI,QAAQ,cAAcrD,EAAUK,EAAGgD,EAAI,OAAQ7C,CAAM,CAC3D,CACF,CAAC,EAGG6C,EAAI,eACNA,EAAI,QAAQ,kBAAkBA,EAAI,aAAa,EAI7CA,EAAI,kBAAkB,MAAQ,GAChCA,EAAI,kBAAkB,OAAOA,EAAI,WAAYrD,EAAUqD,EAAI,UAAU,GAInEvF,EAAAuF,EAAI,gBAAJ,MAAAvF,EAAmB,SAAWuF,EAAI,eAAgB,CACpD,MAAMoC,EAAsB,CAC1B,QAAS,GACT,EAAGpC,EAAI,eAAe,EACtB,EAAGA,EAAI,eAAe,EACtB,UAAWA,EAAI,cAAc,WAAa,GAC1C,YAAaA,EAAI,cAAc,UAC3BA,EAAI,cAAc,UAChBA,EAAI,aAAaA,EAAI,eAAe,CAAC,EACrCA,EAAI,aAAaA,EAAI,eAAe,CAAC,EACrC,EAAA,EAEF,MAAMA,EAAI,aAAaA,EAAI,eAAe,CAAC,EAAE,QAAQ,CAAC,CAAC;AAAA,KAAQA,EAAI,aAAaA,EAAI,eAAe,CAAC,EAAE,cAAc,CAAC,CAAC,EAAA,EAE5HA,EAAI,QAAQ,WAAWrD,EAAUyF,CAAM,CACzC,CAGIpC,EAAI,OAASA,EAAI,gBACnBA,EAAI,MAAM,OAAOA,EAAI,UAAU,CAEnC,CCzMA,MAAMuP,GAA6B,CACjC,MAAO,UACP,MAAO,IACP,QAAS,EACT,UAAW,CACb,EAEA,SAASC,EACPpd,EAC6B,CAC7B,OAAKA,EACDA,aAAgB,cAAgBA,aAAgB,aAAqBA,EAClE,IAAI,aAAaA,CAAI,EAFV,IAAI,aAAa,CAAC,CAGtC,CAEO,MAAMqd,EAAO,CAwBlB,YAAYpc,EAAwB,CAvB5B8G,EAAA,WACAA,EAAA,aACAA,EAAA,gBACAA,EAAA,aACAA,EAAA,cACAA,EAAA,gBACAA,EAAA,cACAA,EAAA,kBAGAA,EAAA,uBAAkB,GAGlBA,EAAA,oBAA8B,MAC9BA,EAAA,yBAAoB,IAGpBA,EAAA,0BAAqB,IAGrBA,EAAA,oBAAkC,MAClCA,EAAA,4BAAuB,0BAG7B,GAAI,CAAC9G,EAAS,MAAM,IAAI,MAAM,+BAA+B,EAC7D,KAAK,GAAKA,EAAQ,GAClB,KAAK,KAAOA,EAAQ,KACpB,KAAK,QAAUA,EAAQ,QAEvB,KAAK,KAAO,CACV,EAAGmc,GAAiB/U,EAAApH,EAAQ,OAAR,YAAAoH,EAAc,CAAC,EACnC,EAAG+U,GAAiBE,EAAArc,EAAQ,OAAR,YAAAqc,EAAc,CAAC,EAEnC,QAAQC,EAAAtc,EAAQ,OAAR,MAAAsc,EAAc,OAASH,EAAiBnc,EAAQ,KAAK,MAAM,EAAI,OACvE,YAAYuc,EAAAvc,EAAQ,OAAR,MAAAuc,EAAc,WAAaJ,EAAiBnc,EAAQ,KAAK,UAAU,EAAI,OACnF,aAAawc,EAAAxc,EAAQ,OAAR,MAAAwc,EAAc,YAAcL,EAAiBnc,EAAQ,KAAK,WAAW,EAAI,OACtF,QAAQyc,EAAAzc,EAAQ,OAAR,MAAAyc,EAAc,OAASN,EAAiBnc,EAAQ,KAAK,MAAM,EAAI,OACvE,YAAY0c,EAAA1c,EAAQ,OAAR,MAAA0c,EAAc,WAAaP,EAAiBnc,EAAQ,KAAK,UAAU,EAAI,OACnF,aAAa2c,EAAA3c,EAAQ,OAAR,MAAA2c,EAAc,YAAcR,EAAiBnc,EAAQ,KAAK,WAAW,EAAI,OACtF,IAAI4c,EAAA5c,EAAQ,OAAR,MAAA4c,EAAc,GAAKT,EAAiBnc,EAAQ,KAAK,EAAE,EAAI,MAAA,EAI7D,KAAK,MAAQ,CACX,GAAGkc,GACH,GAAGlc,EAAQ,KAAA,EAIRA,EAAgB,QAAO,KAAK,MAAM,MAASA,EAAgB,OAC3DA,EAAgB,QAAO,KAAK,MAAM,MAASA,EAAgB,OAC3DA,EAAgB,YACnB,KAAK,MAAM,UAAaA,EAAgB,WACrCA,EAAgB,SACnB,KAAK,MAAM,OAAUA,EAAgB,QAEvC,KAAK,QAAUA,EAAQ,SAAW,GAClC,KAAK,MAAQA,EAAQ,MACrB,KAAK,UAAYA,EAAQ,UAGrB,KAAK,KAAK,EAAE,SAAW,KAAK,KAAK,EAAE,QACrC,QAAQ,KACN,YAAY,KAAK,EAAE,4CACnB,KAAK,KAAK,EAAE,OACZ,KACA,KAAK,KAAK,EAAE,MAAA,CAGlB,CAMA,OAAgB,CACd,OAAO,KAAK,EACd,CAEA,SAAsB,CACpB,OAAO,KAAK,IACd,CAEA,YAAiC,CAC/B,OAAO,KAAK,OACd,CAEA,YAAsB,CACpB,OAAO,KAAK,OACd,CAEA,SAAsB,CACpB,OAAI,KAAK,MAAM,WAAa,KAAK,MAAM,UAAY,EAC1C,KAAK,gBAAA,EAEP,KAAK,IACd,CAEQ,iBAA8B,CACpC,OAAI,KAAK,sBAAwB,CAAC,KAAK,gBACrC,KAAK,aAAe,KAAK,eAAe,KAAK,KAAM,CAAC,EACpD,KAAK,qBAAuB,IAEvB,KAAK,YACd,CAEQ,eAAejB,EAAkByC,EAAgC,CACvE,KAAM,CAAE,EAAA1B,EAAG,EAAAC,CAAA,EAAMhB,EACX8d,EAAM/c,EAAE,OACd,GAAI+c,EAAMrb,EAAY,MAAO,CAAE,GAAGzC,CAAA,EAElC,MAAM+d,EAAY,IAAI,aAAaD,CAAG,EAChCnb,EAAa,KAAK,MAAMF,EAAa,CAAC,EAE5C,QAASpD,EAAI,EAAGA,EAAIye,EAAKze,IAAK,CAC5B,IAAI6C,EAAM,EACNxB,EAAQ,EACZ,QAASkC,EAAIvD,EAAIsD,EAAYC,GAAKvD,EAAIsD,EAAYC,IAC5CA,GAAK,GAAKA,EAAIkb,IAChB5b,GAAOlB,EAAE4B,CAAC,EACVlC,KAGJqd,EAAU1e,CAAC,EAAI6C,EAAMxB,CACvB,CAEA,MAAO,CAAE,EAAAK,EAAG,EAAGgd,CAAA,CACjB,CAEA,UAAwB,CACtB,OAAO,KAAK,KACd,CAEA,WAAqB,CACnB,OAAO,KAAK,OACd,CAEA,UAA+B,CAC7B,OAAO,KAAK,KACd,CAEA,eAAwB,CACtB,OAAO,KAAK,KAAK,EAAE,MACrB,CAEA,oBAA6B,CAC3B,OAAO,KAAK,eACd,CAEA,sBAA6B,CAC3B,KAAK,gBAAkB,CACzB,CAKA,cAAwB,CACtB,MAAO,CAAC,EACN,KAAK,KAAK,QACV,KAAK,KAAK,YACV,KAAK,KAAK,aACV,KAAK,KAAK,QACV,KAAK,KAAK,YACV,KAAK,KAAK,YAEd,CAMA,UAAU1e,EAAoC,SAC5C,GAAIA,EAAI,GAAKA,GAAK,KAAK,KAAK,EAAE,OAAQ,OAAO,KAG7C,GAAI,KAAK,KAAK,QAAUA,EAAI,KAAK,KAAK,OAAO,OAAQ,CACnD,MAAM2e,EAAM,KAAK,KAAK,OAAO3e,CAAC,EAC9B,MAAO,CAAC2e,EAAKA,CAAG,CAClB,CAGA,MAAMC,IAAQ5V,EAAA,KAAK,KAAK,cAAV,YAAAA,EAAwBhJ,KAAM,EACtC6e,IAAOZ,EAAA,KAAK,KAAK,aAAV,YAAAA,EAAuBje,KAAM,EAC1C,OAAI4e,EAAQ,GAAKC,EAAO,EACf,CAACD,EAAOC,CAAI,EAGd,IACT,CAMA,UAAU7e,EAAoC,SAC5C,GAAIA,EAAI,GAAKA,GAAK,KAAK,KAAK,EAAE,OAAQ,OAAO,KAG7C,GAAI,KAAK,KAAK,QAAUA,EAAI,KAAK,KAAK,OAAO,OAAQ,CACnD,MAAM2e,EAAM,KAAK,KAAK,OAAO3e,CAAC,EAC9B,MAAO,CAAC2e,EAAKA,CAAG,CAClB,CAGA,MAAMC,IAAQ5V,EAAA,KAAK,KAAK,cAAV,YAAAA,EAAwBhJ,KAAM,EACtC6e,IAAOZ,EAAA,KAAK,KAAK,aAAV,YAAAA,EAAuBje,KAAM,EAC1C,OAAI4e,EAAQ,GAAKC,EAAO,EACf,CAACD,EAAOC,CAAI,EAGd,IACT,CAMA,WAA2B,CACzB,OAAI,KAAK,KAAK,EAAE,SAAW,EAClB,OAGL,KAAK,mBAAqB,KAAK,eAAiB,QAClD,KAAK,aAAe,KAAK,gBAAA,EACzB,KAAK,kBAAoB,IAGpB,KAAK,aACd,CAEQ,iBAA0B,CAChC,KAAM,CAAE,EAAAnd,EAAG,EAAAC,CAAA,EAAM,KAAK,KAEtB,IAAI8E,EAAO,IACPC,EAAO,KACP8E,EAAO,IACPsT,EAAO,KAGX,QAAS9e,EAAI,EAAGA,EAAI0B,EAAE,OAAQ1B,IAAK,CACjC,MAAM+e,EAAOrd,EAAE1B,CAAC,EACVgf,EAAOrd,EAAE3B,CAAC,EAGZ,CAAC,SAAS+e,CAAI,GAAK,CAAC,SAASC,CAAI,IAEjCD,EAAOtY,IAAMA,EAAOsY,GACpBA,EAAOrY,IAAMA,EAAOqY,GACpBC,EAAOxT,IAAMA,EAAOwT,GACpBA,EAAOF,IAAMA,EAAOE,GAC1B,CAGA,MADe,CAAE,KAAAvY,EAAM,KAAAC,EAAM,KAAA8E,EAAM,KAAAsT,CAAA,CAErC,CAWA,WAAWG,EAAgC,CACzC,GAAKA,EAEL,IAAIA,EAAO,OAAQ,CACjB,MAAMhI,EAAO8G,EAAiBkB,EAAO,CAAC,EAChC/H,EAAO6G,EAAiBkB,EAAO,CAAC,EAEtC,GAAIhI,EAAK,OAAS,GAAKC,EAAK,OAAS,EAAG,CAMtC,GALA,KAAK,KAAO,CACV,GAAG,KAAK,KACR,EAAG,KAAK,YAAY,KAAK,KAAK,EAAGD,CAAI,EACrC,EAAG,KAAK,YAAY,KAAK,KAAK,EAAGC,CAAI,CAAA,EAEnC+H,EAAO,GAAI,CACb,MAAMC,EAAQnB,EAAiBkB,EAAO,EAAE,EACxC,KAAK,KAAK,GAAK,KAAK,KAAK,GACrB,KAAK,YAAY,KAAK,KAAK,GAAIC,CAAK,EACpCA,CACN,CAIA,GAHA,KAAK,iBAAmBjI,EAAK,OAGzB,KAAK,WAAa,KAAK,KAAK,EAAE,OAAS,KAAK,UAAW,CACxD,MAAMkI,EAAW,KAAK,KAAK,EAAE,OAAS,KAAK,UAC3C,KAAK,KAAK,EAAI,KAAK,KAAK,EAAE,MAAMA,CAAQ,EACxC,KAAK,KAAK,EAAI,KAAK,KAAK,EAAE,MAAMA,CAAQ,EACpC,KAAK,KAAK,KAAI,KAAK,KAAK,GAAK,KAAK,KAAK,GAAG,MAAMA,CAAQ,GAC5D,KAAK,gBAAkB,CAC1B,CACF,CACF,MAEMF,EAAO,IAAG,KAAK,KAAK,EAAIlB,EAAiBkB,EAAO,CAAC,GACjDA,EAAO,IAAG,KAAK,KAAK,EAAIlB,EAAiBkB,EAAO,CAAC,GACjDA,EAAO,KAAI,KAAK,KAAK,GAAKlB,EAAiBkB,EAAO,EAAE,GACxD,KAAK,gBAAkB,EAIzB,KAAK,kBAAoB,GACzB,KAAK,qBAAuB,GAC5B,KAAK,mBAAqB,GAC5B,CAEQ,YACN1G,EACA6G,EAC6B,CAE7B,MAAMC,EAAW,IAAK9G,EAAS,YAEFA,EAAS,OAAS6G,EAAQ,MAAM,EAC7D,OAAAC,EAAS,IAAI9G,EAAU,CAAC,EACxB8G,EAAS,IAAID,EAAS7G,EAAS,MAAM,EAC9B8G,CACT,CAKA,QACE3d,EACAC,EACAoF,EACM,CACN,KAAK,KAAO,CAAE,EAAArF,EAAG,EAAAC,EAAG,GAAAoF,CAAA,EACpB,KAAK,kBAAoB,GACzB,KAAK,qBAAuB,GAC5B,KAAK,mBAAqB,EAC5B,CAMA,SAAS8I,EAAmC,CAC1C,MAAMyP,EAAe,KAAK,MAAM,UAChC,KAAK,MAAQ,CAAE,GAAG,KAAK,MAAO,GAAGzP,CAAA,EAC7B,KAAK,MAAM,YAAcyP,IAC3B,KAAK,qBAAuB,GAC5B,KAAK,mBAAqB,GAE9B,CAEA,IAAI,mBAA6B,CAC/B,OAAO,KAAK,kBACd,CACA,IAAI,kBAAkBxc,EAAc,CAClC,KAAK,mBAAqBA,CAC5B,CAEA,WAAW8U,EAAwB,CACjC,KAAK,QAAUA,CACjB,CAEA,QAAQ9V,EAAwB,CAC9B,KAAK,KAAOA,CACd,CAEA,aAAayd,EAAqC,CAChD,KAAK,UAAYA,EACb,KAAK,WAAa,KAAK,KAAK,EAAE,OAAS,KAAK,YAC5C,KAAK,KAAK,EAAI,KAAK,KAAK,EAAE,MAAM,CAAC,KAAK,SAAS,EAC/C,KAAK,KAAK,EAAI,KAAK,KAAK,EAAE,MAAM,CAAC,KAAK,SAAS,EAC3C,KAAK,KAAK,KAAI,KAAK,KAAK,GAAK,KAAK,KAAK,GAAG,MAAM,CAAC,KAAK,SAAS,GACnE,KAAK,mBAAqB,GAEhC,CAMA,SAAgB,CAEd,KAAK,KAAO,CACV,EAAG,IAAI,aAAa,CAAC,EACrB,EAAG,IAAI,aAAa,CAAC,CAAA,EAEvB,KAAK,aAAe,IACtB,CACF,CChYO,SAASC,GACdjR,EACA3M,EACM,OACN,MAAM2J,EAAI,IAAIyS,GAAOpc,CAAO,EAC5B2M,EAAI,OAAO,IAAIhD,EAAE,MAAA,EAASA,CAAC,EAC3BkU,EAAmBlR,EAAKhD,CAAC,GACrBgD,EAAI,aAAa,MAAQ,MAAM,KAAKA,EAAI,gBAAgB,OAAA,CAAQ,EAAE,KAAKmR,GAAKA,EAAE,IAAI,IACpFnR,EAAI,UAAA,GAENvF,EAAAuF,EAAI,eAAJ,MAAAvF,EAAA,KAAAuF,GACAA,EAAI,cAAA,CACN,CAKO,SAASoR,GACdpR,EACAlE,EACM,OACN,MAAMkB,EAAIgD,EAAI,OAAO,IAAIlE,CAAE,EACvBkB,IACFgD,EAAI,SAAS,aAAalE,CAAE,EAC5BkE,EAAI,SAAS,aAAa,GAAGlE,CAAE,OAAO,EACtCkB,EAAE,QAAA,EACFgD,EAAI,OAAO,OAAOlE,CAAE,GACpBrB,EAAAuF,EAAI,eAAJ,MAAAvF,EAAA,KAAAuF,GACAA,EAAI,cAAA,EAER,CAKO,SAASqR,GACdrR,EACAlE,EACA1J,EACM,CACN,MAAM4K,EAAIgD,EAAI,OAAO,IAAIlE,CAAE,EACvBkB,IACFA,EAAE,WAAW5K,CAAI,EACjB8e,EAAmBlR,EAAKhD,CAAC,EACzBgD,EAAI,cAAA,EAER,CAKO,SAASkR,EACdlR,EACAhD,EACM,CACN,MAAMmF,EAAInF,EAAE,QAAA,EACZ,GAAI,CAACmF,GAAKA,EAAE,EAAE,SAAW,EAAG,OAE5B,MAAMyM,EAAa5R,EAAE,QAAA,EACfsU,EAAWtU,EAAE,MAAA,EACbuU,EAAcpP,EAAE,EAAE,OAExB,GAAIyM,IAAe,QAAUA,IAAe,OAAQ,CAGlD,MAAMpW,EAAKoW,IAAe,OACtB,IAAI,aAAa2C,CAAW,EAAE,KAAK,CAAC,EACnCpP,EAAE,IAAM,IAAI,aAAaoP,CAAW,EAAE,KAAK,CAAC,EACjDvR,EAAI,SAAS,aAAasR,EAAUxS,GAAmBqD,EAAE,EAAGA,EAAE,EAAG3J,CAAE,CAAC,CACtE,MACEwH,EAAI,SAAS,aAAasR,EAAUnT,GAAegE,EAAE,EAAGA,EAAE,CAAC,CAAC,EAG9D,GAAIyM,IAAe,QAAUA,IAAe,eAAgB,CAC1D,MAAMI,EAAWhS,EAAE,SAAA,EAAW,UAAY,QACpCwU,EAAWnT,GAAmB8D,EAAE,EAAGA,EAAE,EAAG6M,CAAQ,EACtDhP,EAAI,SAAS,aAAa,GAAGsR,CAAQ,QAASE,CAAQ,CACxD,CAEAxU,EAAE,qBAAA,CACJ,CAKO,SAASyU,GACdzR,EACAlE,EACA3I,EACAC,EACM,CACN,MAAM,EAAI4M,EAAI,OAAO,IAAIlE,CAAE,EAC3B,GAAI,CAAC,EAAG,OAER,MAAM4V,EAAY,EAAE,UAAA,EACdC,EAAUD,EAAYA,EAAU,KAAO,KAK7C,GAHA,EAAE,WAAW,CAAE,EAAAve,EAAa,EAAAC,EAAa,OAAQ,GAAM,EACvD8d,EAAmBlR,EAAK,CAAC,EAErBA,EAAI,kBAAmB,CACzB,MAAMqG,EAAY,EAAE,UAAA,EACpB,GAAIA,EAAW,CACb,MAAMmH,EAASxN,EAAI,WAAW,KAAOA,EAAI,WAAW,MAChD2R,GAAW3R,EAAI,WAAW,KAAOwN,EAAS,KAAQ,CAACkE,KACrD1R,EAAI,WAAW,KAAOqG,EAAU,KAChCrG,EAAI,WAAW,KAAOA,EAAI,WAAW,KAAOwN,EAEhD,CACF,EAEIxN,EAAI,aAAa,MAAQ,MAAM,KAAKA,EAAI,gBAAgB,OAAA,CAAQ,EAAE,KAAKmR,GAAKA,EAAE,IAAI,IACpFnR,EAAI,UAAA,EAENA,EAAI,cAAA,CACN,CAKO,SAAS4R,GACd5R,EACAlE,EACAkV,EACM,CACN,MAAMhU,EAAIgD,EAAI,OAAO,IAAIlE,CAAE,EACvBkB,IACFA,EAAE,aAAagU,CAAS,EACxBE,EAAmBlR,EAAKhD,CAAC,EAE7B,CAKO,SAAS6U,GACd7R,EACAsR,EACA/d,EACAF,EAAsB,CAAA,EACd,CACR,MAAM,EAAI2M,EAAI,OAAO,IAAIsR,CAAQ,EACjC,GAAI,CAAC,EAAG,MAAM,IAAI,MAAM,UAAUA,CAAQ,YAAY,EAEtD,MAAMlf,EAAO,EAAE,QAAA,EACf,GAAI,CAACA,GAAQA,EAAK,EAAE,OAAS,EAAG,MAAO,GAEvC,MAAM0C,EAAS8D,GAAQxG,EAAK,EAAUA,EAAK,EAAUmB,EAAMF,CAAO,EAC5D6I,EAAS,EAAE,UAAA,EACXhE,GAAOgE,GAAA,YAAAA,EAAQ,OAAQ,EAEvBC,IADOD,GAAA,YAAAA,EAAQ,OAAQ,GACJhE,EACnB4Z,EAAgB,IAChBC,EAAO,IAAI,aAAaD,CAAa,EACrCE,EAAO,IAAI,aAAaF,CAAa,EAE3C,QAASrgB,EAAI,EAAGA,EAAIqgB,EAAergB,IAAK,CACtC,MAAM,EAAIyG,EAAQzG,GAAKqgB,EAAgB,GAAM3V,EAC7C4V,EAAKtgB,CAAC,EAAI,EACVugB,EAAKvgB,CAAC,EAAIqD,EAAO,QAAQ,CAAC,CAC5B,CAEA,MAAMmd,EAAQ,GAAGX,CAAQ,QAAQ,KAAK,KAAK,GACrCY,EAAc,EAAE,SAAA,EAEtB,OAAAlS,EAAI,UAAU,CACZ,GAAIiS,EACJ,KAAM,OACN,QAAS,EAAE,WAAA,EACX,KAAM,CAAE,EAAGF,EAAM,EAAGC,CAAA,EACpB,MAAO,CACL,MAAOE,EAAY,MACnB,OAAQA,EAAY,OAAS,GAAK,IAClC,QAAS,GACT,SAAU,CAAC,EAAG,CAAC,CAAA,CACjB,CACD,EAEDlS,EAAI,cAAc,CAChB,KAAM,OACN,EAAG9H,EAAOiE,EAAY,IACtB,EAAGrH,EAAO,QAAQoD,EAAOiE,EAAY,GAAI,EACzC,KAAM,GAAGrH,EAAO,QAAQ;AAAA,QAAWA,EAAO,SAAS,QAAQ,CAAC,CAAC,IAC7D,SAAU,GACV,gBAAiB,kBACjB,MAAOod,EAAY,OAAS,UAC5B,QAAS,EACT,OAAQ,cACR,YAAa,EAAA,CACd,EAEMD,CACT,CClMO,MAAME,EAA6B,CAAnC,cACEhY,EAAA,cAA2B,CAAC,EAAG,CAAC,GAChCA,EAAA,aAA0B,CAAC,EAAG,GAAG,GACxBA,EAAA,YAAO,UAEvB,UAAU/F,EAAaC,EAAmB,CAExC,GAAI,CAAC,SAASD,CAAG,GAAK,CAAC,SAASC,CAAG,EAAG,CACpC,KAAK,OAAS,CAAC,EAAG,CAAC,EACnB,MACF,CACA,GAAID,IAAQC,EAAK,CACf,KAAK,OAAS,CAACD,EAAM,GAAKC,EAAM,EAAG,EACnC,MACF,CACA,KAAK,OAAS,CAACD,EAAKC,CAAG,CACzB,CAEA,SAASD,EAAaC,EAAmB,CACvC,KAAK,MAAQ,CAACD,EAAKC,CAAG,CACxB,CAEA,UAAU9C,EAAuB,CAC/B,KAAM,CAAC6gB,EAAI1b,CAAE,EAAI,KAAK,OAChB,CAAC2b,EAAIC,CAAE,EAAI,KAAK,MAChBpI,GAAc3Y,EAAQ6gB,IAAO1b,EAAK0b,GACxC,OAAOC,EAAKnI,GAAcoI,EAAKD,EACjC,CAEA,OAAOE,EAAuB,CAC5B,KAAM,CAACH,EAAI1b,CAAE,EAAI,KAAK,OAChB,CAAC2b,EAAIC,CAAE,EAAI,KAAK,MAChBpI,GAAcqI,EAAQF,IAAOC,EAAKD,GACxC,OAAOD,EAAKlI,GAAcxT,EAAK0b,EACjC,CAEA,MAAMtf,EAAQ,GAAc,CAC1B,KAAM,CAACsB,EAAKC,CAAG,EAAI,KAAK,OACxB,GAAI,CAAC,SAASD,CAAG,GAAK,CAAC,SAASC,CAAG,GAAKD,IAAQC,EAAK,MAAO,CAAA,EAE5D,MAAM2P,EAAOwO,GAASpe,EAAKC,EAAKvB,CAAK,EAC/BsF,EAAQ,KAAK,KAAKhE,EAAM4P,CAAI,EAAIA,EAChCyO,EAAkB,CAAA,EAGlBC,EAAW,IACjB,IAAIC,EAAIva,EACR,KAAOua,GAAKte,EAAM2P,EAAO,IAAOyO,EAAM,OAASC,GAC7CD,EAAM,KAAK,KAAK,MAAME,EAAI,IAAI,EAAI,IAAI,EACtCA,GAAK3O,EAGP,OAAOyO,CACT,CACF,CAKO,MAAMG,EAA0B,CAAhC,cACEzY,EAAA,cAA2B,CAAC,EAAG,GAAI,GACnCA,EAAA,aAA0B,CAAC,EAAG,GAAG,GACxBA,EAAA,YAAO,OAEfA,EAAA,YAAO,IAEf,UAAU/F,EAAaC,EAAmB,CAExC,MAAMwe,EAAU,KAAK,IAAIze,EAAK,KAAK,EAC7B0e,EAAU,KAAK,IAAIze,EAAK,MAAQ,EAAE,EAExC,GAAIwe,IAAYC,EAAS,CACvB,KAAK,OAAS,CAACD,EAAU,GAAIC,EAAU,EAAE,EACzC,MACF,CACA,KAAK,OAAS,CAACD,EAASC,CAAO,CACjC,CAEA,SAAS1e,EAAaC,EAAmB,CACvC,KAAK,MAAQ,CAACD,EAAKC,CAAG,CACxB,CAEA,UAAU9C,EAAuB,CAC/B,KAAM,CAAC6gB,EAAI1b,CAAE,EAAI,KAAK,OAChB,CAAC2b,EAAIC,CAAE,EAAI,KAAK,MAEtB,GAAI/gB,GAAS,EAAG,OAAO8gB,EAEvB,MAAMU,EAAS,KAAK,IAAIX,CAAE,EAAI,KAAK,IAAI,KAAK,IAAI,EAC1CY,EAAS,KAAK,IAAItc,CAAE,EAAI,KAAK,IAAI,KAAK,IAAI,EAG1CwT,GAFS,KAAK,IAAI3Y,CAAK,EAAI,KAAK,IAAI,KAAK,IAAI,EAEtBwhB,IAAWC,EAASD,GACjD,OAAOV,EAAKnI,GAAcoI,EAAKD,EACjC,CAEA,OAAOE,EAAuB,CAC5B,KAAM,CAACH,EAAI1b,CAAE,EAAI,KAAK,OAChB,CAAC2b,EAAIC,CAAE,EAAI,KAAK,MAEhBS,EAAS,KAAK,IAAIX,CAAE,EAAI,KAAK,IAAI,KAAK,IAAI,EAC1CY,EAAS,KAAK,IAAItc,CAAE,EAAI,KAAK,IAAI,KAAK,IAAI,EAE1CwT,GAAcqI,EAAQF,IAAOC,EAAKD,GAClCY,EAASF,EAAS7I,GAAc8I,EAASD,GAE/C,OAAO,KAAK,IAAI,KAAK,KAAME,CAAM,CACnC,CAEA,MAAMngB,EAAQ,GAAc,CAC1B,KAAM,CAACsB,EAAKC,CAAG,EAAI,KAAK,OAClB0e,EAAS,KAAK,MAAM,KAAK,MAAM3e,CAAG,CAAC,EACnC4e,EAAS,KAAK,KAAK,KAAK,MAAM3e,CAAG,CAAC,EAClCoe,EAAkB,CAAA,EAExB,QAASS,EAAIH,EAAQG,GAAKF,GAAUP,EAAM,OAAS3f,EAAOogB,IAAK,CAC7D,MAAM3hB,EAAQ,KAAK,IAAI,GAAI2hB,CAAC,EACxB3hB,GAAS6C,GAAO7C,GAAS8C,GAC3Boe,EAAM,KAAKlhB,CAAK,CAEpB,CAEA,OAAOkhB,CACT,CACF,CASA,SAASD,GAASpe,EAAaC,EAAavB,EAAuB,CACjE,MAAMia,EAAQ1Y,EAAMD,EACpB,GAAI2Y,GAAS,GAAK,CAAC,SAASA,CAAK,EAAG,MAAO,GAE3C,MAAMoG,EAAUpG,EAAQja,EAClBsgB,EAAY,KAAK,IAAI,GAAI,KAAK,MAAM,KAAK,MAAMD,CAAO,CAAC,CAAC,EACxDjJ,EAAaiJ,EAAUC,EAE7B,IAAIC,EACJ,OAAInJ,EAAa,IACfmJ,EAAiB,EACRnJ,EAAa,EACtBmJ,EAAiB,EACRnJ,EAAa,EACtBmJ,EAAiB,EAEjBA,EAAiB,GAGZA,EAAiBD,CAC1B,CAKO,SAASE,GAAY/f,EAA+B,CACzD,OAAOA,IAAS,MAAQ,IAAIqf,GAAa,IAAIT,EAC/C,CC9JO,SAASoB,GACd7O,EACArR,EACa,CACb,GAAI,CAACqR,EAAW,MAAM,IAAI,MAAM,0CAA0C,EAE1E,MAAMzJ,EAAM5H,EAAQ,kBAAoB,OAAO,iBAGzC4M,EAAQ,OAAO5M,EAAQ,OAAU,SACnCuM,GAAevM,EAAQ,KAAK,EAC3BA,EAAQ,OAAwByM,GAE/B0T,EAAUjW,EAAWlK,EAAQ,YAAc4M,EAAM,eAAe,EAChEvD,EAAoD,CAAC8W,EAAQ,CAAC,EAAGA,EAAQ,CAAC,EAAGA,EAAQ,CAAC,EAAGA,EAAQ,CAAC,CAAC,EACnGrH,EAAa9Y,EAAQ,YAAc4M,EAAM,OAAO,QAChDwT,EAAepgB,EAAQ,cAAgB,GACvCqgB,EAAargB,EAAQ,YAAc,GACnCsgB,EAAiBtgB,EAAQ,gBAAkB,GAG3CugB,EAA4B,CAAE,MAAO,SAAU,KAAM,GAAM,GAAGvgB,EAAQ,KAAA,EACtE6M,EAAS0T,EAAa,QAAU,MAAQ,IAAIhB,GAAa,IAAIT,GAG7D0B,MAAsB,IACtBC,MAAc,IACpB,IAAIC,EAAiB,WAEC1gB,EAAQ,MACzB,MAAM,QAAQA,EAAQ,KAAK,EAAIA,EAAQ,MAAQ,CAACA,EAAQ,KAAK,EAC9D,CAAC,CAAA,CAAE,GAEO,QAAQ,CAAC2gB,EAAS1E,IAAU,CACxC,MAAM2E,EAAU3E,IAAU,EACpB4E,EAAYD,EAAU,UAAY,IAAI3E,CAAK,GAC3CxT,EAAKkY,EAAQ,IAAME,EAErBD,IAASF,EAAiBjY,GAE9B,MAAMqY,EAA2B,CAAE,MAAO,SAAU,KAAM,GAAM,SAD/CH,EAAQ,WAAaC,EAAU,OAAS,SACiB,GAAGD,EAAS,GAAAlY,CAAA,EAEtF+X,EAAgB,IAAI/X,EAAIqY,CAAW,EACnCL,EAAQ,IAAIhY,EAAIqY,EAAY,QAAU,MAAQ,IAAIvB,GAAa,IAAIT,EAAa,CAClF,CAAC,EAGDzN,EAAU,MAAM,SAAW,WAC3BA,EAAU,MAAM,SAAW,SAC3BA,EAAU,MAAM,gBAAkBrR,EAAQ,YAAc4M,EAAM,gBAE9D,MAAMgM,EAAcmI,GAAa,OAAO,EAClClI,EAAgBkI,GAAa,SAAS,EAE5C,KAAO1P,EAAU,YACfA,EAAU,YAAYA,EAAU,UAAU,EAG5CA,EAAU,YAAYuH,CAAW,EACjCvH,EAAU,YAAYwH,CAAa,EAEnC,MAAMlM,EAAMkM,EAAc,WAAW,IAAI,EACzC,GAAI,CAAClM,EAAK,MAAM,IAAI,MAAM,0BAA0B,EAEpD,MAAO,CACL,MAAAC,EACA,gBAAAvD,EACA,WAAAyP,EACA,aAAAsH,EACA,WAAAC,EACA,eAAAC,EACA,IAAA1Y,EACA,aAAA2Y,EACA,OAAA1T,EACA,gBAAA2T,EACA,QAAAC,EACA,eAAAC,EACA,YAAA9H,EACA,cAAAC,EACA,WAAYlM,CAAA,CAEhB,CAKO,SAASoU,GAAa7gB,EAA8C,CACzE,MAAMwH,EAAS,SAAS,cAAc,QAAQ,EAC9C,OAAAA,EAAO,MAAM,QAAU,yDACnBxH,IAAS,YAAWwH,EAAO,MAAM,cAAgB,QAC9CA,CACT,CAKO,SAAS6J,GACdF,EACAmP,EACyD,CACzD,MAAMhW,EAAO6G,EAAU,sBAAA,EACjB2P,EAAgB,MAAM,KAAKR,EAAgB,OAAA,CAAQ,EAAE,OAAOte,GAAKA,EAAE,WAAa,OAAO,EAAE,OACzF+e,EAAiB,MAAM,KAAKT,EAAgB,OAAA,CAAQ,EAAE,OAAOte,GAAKA,EAAE,WAAa,OAAO,EAAE,OAC1Fgf,EAAanjB,EAAQ,KAAO,KAAK,IAAI,EAAGijB,EAAgB,CAAC,EAAI,GAC7DG,EAAcpjB,EAAQ,MAAQkjB,EAAiB,GACrD,MAAO,CACL,EAAGC,EACH,EAAGnjB,EAAQ,IACX,MAAO,KAAK,IAAI,EAAGyM,EAAK,MAAQ0W,EAAaC,CAAW,EACxD,OAAQ,KAAK,IAAI,EAAG3W,EAAK,OAASzM,EAAQ,IAAMA,EAAQ,MAAM,CAAA,CAElE,CAKO,SAAS0T,GACd+O,EACmE,CAEnE,MAAM/e,EAA4E,CAAA,EAClF,IAAI2f,EAAY,EACZC,EAAa,EAEjB,OAAAb,EAAgB,QAAQ,CAAC3a,EAAM4C,IAAO,CACpC,MAAM8E,EAAY1H,EAAK,WAAa,QAAU,QAAU,OAClD2H,EAASD,IAAa,OAAS6T,EAAY,GAAKC,EAAa,GAE/D9T,IAAa,OAAQ6T,IACpBC,IAEL5f,EAAO,KAAK,CAAE,GAAAgH,EAAI,SAAA8E,EAAU,OAAAC,EAAQ,CACtC,CAAC,EAEM/L,CACT,CAKO,SAAS6f,GACdjQ,EACAuH,EACAC,EACA0I,EACA3Z,EACS,CACT,MAAM4C,EAAO6G,EAAU,sBAAA,EACvB,GAAI7G,EAAK,QAAU,GAAKA,EAAK,SAAW,EAAG,MAAO,GAElD,MAAMgX,EAAIhX,EAAK,MAAQ5C,EACjB6Z,EAAIjX,EAAK,OAAS5C,EAExB,OAACgR,EAAaC,CAAa,EAAE,QAASpS,GAAM,CAC1CA,EAAE,MAAQ+a,EACV/a,EAAE,OAASgb,CACb,CAAC,EAEDF,EAAW,MAAM3Z,EAAKA,CAAG,EAClB,EACT,CC1IO,MAAM8Z,EAA2B,CAsCtC,YAAY1hB,EAAuB,CArC3B8G,EAAA,kBACAA,EAAA,oBACAA,EAAA,sBACAA,EAAA,mBACAA,EAAA,kBAAkC,KAClCA,EAAA,cAAS,IAAID,IACbC,EAAA,kBAAqB,CAAE,KAAM,IAAM,KAAM,GAAK,KAAM,MAAO,KAAM,IAAA,GACjEA,EAAA,qBACAA,EAAA,wBACAA,EAAA,uBACAA,EAAA,YACAA,EAAA,wBACAA,EAAA,iBACAA,EAAA,gBACAA,EAAA,oBACAA,EAAA,eACAA,EAAA,gBAIAA,EAAA,cACAA,EAAA,qBAAsC,MACtCA,EAAA,sBAAkD,MAClDA,EAAA,mBACAA,EAAA,cAA6B,MAC7BA,EAAA,qBACAA,EAAA,gBAAiC,MACjCA,EAAA,wBAAkC,MAClCA,EAAA,mBAAc,IACdA,EAAA,mBAAc,IACdA,EAAA,kBAAa,IACbA,EAAA,sBAAiB,IACjBA,EAAA,aAAgC,MAChCA,EAAA,qBAAgF,MAChFA,EAAA,yBAAuC,IAAIyP,IACnCzP,EAAA,gBAAW6a,IAGzB,KAAK,UAAY3hB,EAAQ,UACzB,MAAM4hB,EAAQ1B,GAAgB,KAAK,UAAWlgB,CAAO,EAErD,KAAK,MAAQ4hB,EAAM,MACnB,KAAK,gBAAkBA,EAAM,gBAC7B,KAAK,WAAaA,EAAM,WACxB,KAAK,aAAeA,EAAM,aAC1B,KAAK,WAAaA,EAAM,WACxB,KAAK,eAAiBA,EAAM,eAC5B,KAAK,IAAMA,EAAM,IACjB,KAAK,aAAeA,EAAM,aAC1B,KAAK,OAASA,EAAM,OACpB,KAAK,gBAAkBA,EAAM,gBAC7B,KAAK,QAAUA,EAAM,QACrB,KAAK,eAAiBA,EAAM,eAC5B,KAAK,YAAcA,EAAM,YACzB,KAAK,cAAgBA,EAAM,cAC3B,KAAK,WAAaA,EAAM,WAExB,KAAK,SAAW,IAAIna,EAAoB,KAAK,WAAW,EACxD,KAAK,SAAS,OAAO,KAAK,GAAG,EAC7B,KAAK,QAAU,IAAIiF,GAAgB,KAAK,WAAY,KAAK,KAAK,EAC9D,KAAK,YAAc,IAAI0E,GACrB,KAAK,UACL,CACE,OAAQ,CAACxK,EAAG6S,IAAW,KAAK,KAAK,CAAE,EAAG,CAAC7S,EAAE,KAAMA,EAAE,IAAI,EAAG,EAAG,CAACA,EAAE,KAAMA,EAAE,IAAI,EAAG,OAAA6S,EAAQ,EACrF,MAAO,CAACpU,EAAI+P,EAAIqE,IAAW,KAAK,IAAIpU,EAAI+P,EAAIqE,CAAM,EAClD,UAAYjP,GAAS,KAAK,cAAcA,CAAI,EAC5C,aAAc,CAAC1K,EAAGC,IAAM,CAAE,KAAK,eAAiB,CAAE,EAAAD,EAAG,EAAAC,CAAA,EAAK,KAAK,cAAA,CAAiB,EAChF,cAAe,IAAM,CAAE,KAAK,eAAiB,KAAM,KAAK,cAAA,CAAiB,CAAA,EAE3E,IAAM,KAAK,YAAA,EACV0Z,GAAW,KAAK,oBAAoBA,CAAM,EAC3C,IAAMhI,GAAc,KAAK,eAAsB,CAAA,EAGjD,IAAI,eAAe,IAAM,CAAC,KAAK,aAAe,KAAK,OAAA,CAAQ,EAAE,QAAQ,KAAK,SAAS,EACnF,KAAK,aAAA,EACL,KAAK,WAAWzR,CAAO,EACnB,KAAK,iBACP,KAAK,MAAQ,IAAIiW,GAAgB,KAAK,UAAW,KAAK,MAAO,KAAK,MAAM,GAG1E,KAAK,OAAA,EACL,KAAK,gBAAA,EACL,WAAW,IAAM,CAAC,KAAK,aAAe,KAAK,OAAA,EAAU,GAAG,EACxD,QAAQ,IAAI,yBAA0B,CAAE,IAAK,KAAK,IAAK,MAAO,KAAK,MAAM,IAAA,CAAM,CACjF,CApEA,IAAY,QAAgB,CAC1B,OAAQ,KAAK,QAAQ,IAAI,KAAK,cAAc,GAAK,KAAK,QAAQ,SAAS,KAAA,EAAO,KAChF,CAoEQ,cAAqB,CACtB,KAAK,eACV,KAAK,SAAW,IAAI5C,GAAc,KAAK,UAAW,KAAK,MAAO,CAC5D,YAAa,IAAM,KAAK,UAAA,EACxB,UAAYnT,GAAS,CAAE,KAAK,OAAO,QAASyJ,GAAMA,EAAE,QAAQzJ,CAAI,CAAC,EAAG,KAAK,cAAA,CAAiB,EAC1F,kBAAmB,IAAM,CACvB,KAAK,OAAO,QAASyJ,GAAM,CACzB,MAAMsE,EAAQtE,EAAE,SAAA,EAChBA,EAAE,SAAS,CAAE,WAAYsE,EAAM,WAAa,KAAO,EAAI,GAAM,EAAG,CAClE,CAAC,EACD,KAAK,cAAA,CACP,EACA,YAAc4T,GAAW,KAAK,YAAY,WAAWA,CAAM,EAC3D,SAAU,IAAM,CACd,MAAMC,EAAO,SAAS,cAAc,GAAG,EACvCA,EAAK,SAAW,mBAAmB,KAAK,IAAA,CAAK,OAC7CA,EAAK,KAAO,KAAK,YAAA,EACjBA,EAAK,MAAA,CACP,EACA,YAAa,IAAM,CAAE,KAAK,UAAA,EAAa,KAAK,cAAA,EAAiB,KAAK,OAAO,KAAK,YAAa,MAAS,CAAG,EACvG,eAAiB9L,GAAY,CAAE,KAAK,WAAaA,EAAa,KAAK,QAAQ,KAAK,OAAO,WAAWA,CAAO,CAAG,CAAA,CAC7G,EACH,CAEQ,WAAWhW,EAA6B,CACzC,KAAK,aACV,KAAK,OAAS,IAAI2U,GAAY,KAAK,UAAW,KAAK,MAAO3U,EAAQ,gBAAkB,GAAI,CACtF,OAAQ,CAACF,EAAGC,IAAM,KAAK,OAAO,KAAK,aAAc,CAAE,EAAAD,EAAG,EAAAC,CAAA,CAAG,CAAA,CAC1D,EACD,KAAK,OAAO,OAAO,KAAK,aAAA,CAAc,EACxC,CAEA,SAAS6M,EAAkC,CACzC,KAAK,MAAQ,OAAOA,GAAU,SAAWL,GAAeK,CAAK,EAAIA,EACjE,MAAMuT,EAAUjW,EAAW,KAAK,MAAM,eAAe,EACrD,KAAK,gBAAkB,CAACiW,EAAQ,CAAC,EAAGA,EAAQ,CAAC,EAAGA,EAAQ,CAAC,EAAGA,EAAQ,CAAC,CAAC,EACtE,KAAK,UAAU,MAAM,gBAAkB,KAAK,MAAM,gBAClD,KAAK,QAAQ,SAAS,KAAK,KAAK,EAChC,KAAK,cAAA,CACP,CAEA,aAAc,CAAE,OAAO5O,GAAY,KAAK,UAAW,KAAK,eAAsB,CAAG,CACzE,oBAAoBkI,EAAyB,CACnD,GAAIA,EAAQ,CACV,MAAMR,EAAQ,KAAK,QAAQ,IAAIQ,CAAM,EACrC,GAAIR,EAAO,MAAO,CAAE,GAAG,KAAK,WAAY,KAAMA,EAAM,OAAO,CAAC,EAAG,KAAMA,EAAM,OAAO,CAAC,CAAA,CACrF,CACA,OAAO,KAAK,UACd,CAEA,YAAY/Y,EAAuB,MAAe,CAChD,OAAOyY,GAAc,KAAK,YAAa,KAAK,cAAe,KAAK,gBAAiB,KAAK,OAAQ,KAAK,WAAY,KAAK,IAAKzY,CAAI,CAC/H,CAGQ,kBAAmB,CACzB,MAAO,CACL,OAAQ,KAAK,OACb,SAAU,KAAK,SACf,WAAY,KAAK,WACjB,UAAW,IAAM,KAAK,UAAA,EACtB,cAAe,IAAM,KAAK,cAAA,EAC1B,cAAgBgC,GAAkB,KAAK,cAAcA,CAAC,EACtD,aAAc,KAAK,aACnB,gBAAiB,KAAK,gBACtB,kBAAmB,KAAK,WACxB,UAAY4b,GAAqB,KAAK,UAAUA,CAAC,EACjD,aAAc,IAAM,CAAM,KAAK,QAAQ,KAAK,OAAO,OAAO,KAAK,cAAc,CAAG,CAAA,CAEpF,CAEA,UAAU9d,EAA8B,CAAE+hB,GAAc,KAAK,iBAAA,EAAoB/hB,CAAO,CAAG,CAC3F,aAAayI,EAAkB,CAAEuZ,GAAiB,KAAK,iBAAA,EAAoBvZ,CAAE,CAAG,CAChF,aAAaA,EAAY1J,EAA8B,CAAEkjB,GAAiB,KAAK,mBAAoBxZ,EAAI1J,CAAI,CAAG,CAC9G,WAAW0J,EAAY3I,EAA4BC,EAAkC,CACnFmiB,GAAe,KAAK,iBAAA,EAAoBzZ,EAAI3I,EAAGC,CAAC,CAClD,CACA,cAAc2R,EAAwB,CAAE,KAAK,WAAaA,CAAS,CACnE,aAAajJ,EAAYkV,EAAyB,CAAEwE,GAAiB,KAAK,mBAAoB1Z,EAAIkV,CAAS,CAAG,CAC9G,WAAWM,EAAkB/d,EAAeF,EAAsB,CAAA,EAAY,CAC5E,OAAOoiB,GAAe,KAAK,iBAAA,EAAoBnE,EAAU/d,EAAMF,CAAO,CACxE,CACA,UAAUyI,EAAgC,CAAE,OAAO,KAAK,OAAO,IAAIA,CAAE,CAAG,CACxE,cAAyB,CAAE,OAAO,MAAM,KAAK,KAAK,OAAO,QAAQ,CAAG,CAG5D,eAAgB,CACtB,MAAO,CACL,WAAY,KAAK,WAAY,QAAS,KAAK,QAAS,gBAAiB,KAAK,gBAC1E,aAAc,KAAK,aAAc,eAAgB,KAAK,eACtD,YAAa,IAAM,KAAK,YAAA,EAAe,OAAQ,KAAK,OACpD,cAAe,IAAM,KAAK,cAAA,EAAiB,OAAQ,KAAK,MAAA,CAE5D,CAEA,KAAKzI,EAA4B,CAAEgZ,GAAU,KAAK,cAAA,EAAiBhZ,CAAO,CAAG,CAC7E,IAAIiT,EAAgBC,EAAgBuG,EAAuB,CAAED,GAAS,KAAK,cAAA,EAAiBvG,EAAQC,EAAQuG,CAAM,CAAG,CACrH,WAAkB,CAChB,KAAK,UAAA,EACL,KAAK,OAAO,KAAK,OAAQ,CAAE,EAAG,CAAC,KAAK,WAAW,KAAM,KAAK,WAAW,IAAI,EAAG,EAAG,CAAC,KAAK,WAAW,KAAM,KAAK,WAAW,IAAI,EAAG,EAC7H,KAAK,cAAA,CACP,CACA,eAAwB,CAAE,MAAO,CAAE,GAAG,KAAK,UAAA,CAAc,CACzD,WAAkB,CAAEG,GAAa,KAAK,eAAe,CAAG,CAChD,cAAcpP,EAA4E,CAChG,KAAK,cAAgBgQ,GAAc,KAAK,cAAA,EAAiBhQ,EAAM,KAAK,cAAgBsT,GAAM,KAAK,KAAKA,CAAC,CAAC,EACtG,KAAK,cAAA,CACP,CAGA,aAAa9d,EAA8B,CAAE,KAAK,cAAgB,CAAE,QAAS,GAAM,GAAGA,CAAA,CAAW,CACjG,eAAsB,CAAE,KAAK,cAAgB,KAAM,KAAK,eAAiB,KAAM,KAAK,cAAA,CAAiB,CAGrG,cAAcwW,EAAgC,CAAE,MAAM/N,EAAK,KAAK,kBAAkB,IAAI+N,CAAU,EAAG,YAAK,cAAA,EAAwB/N,CAAI,CACpI,iBAAiBA,EAAqB,CAAE,MAAMhH,EAAS,KAAK,kBAAkB,OAAOgH,CAAE,EAAG,YAAK,cAAA,EAAwBhH,CAAQ,CAC/H,iBAAiBgH,EAAYiO,EAAoC,CAAE,KAAK,kBAAkB,OAAOjO,EAAIiO,CAAO,EAAG,KAAK,cAAA,CAAiB,CACrI,cAAcjO,EAAoC,CAAE,OAAO,KAAK,kBAAkB,IAAIA,CAAE,CAAG,CAC3F,gBAA+B,CAAE,OAAO,KAAK,kBAAkB,OAAA,CAAU,CACzE,kBAAyB,CAAE,KAAK,kBAAkB,MAAA,EAAS,KAAK,cAAA,CAAiB,CAGjF,UAAUzI,EAAiC,CAAE,OAAOmY,GAAY,KAAK,aAAA,EAAgBnY,CAAO,CAAG,CAC/F,WAAWA,EAAiC,CAAE,OAAO0Y,GAAa,KAAK,aAAA,EAAgB,KAAK,WAAY1Y,CAAO,CAAG,CAGlH,QAAe,CACRshB,GAAe,KAAK,UAAW,KAAK,YAAa,KAAK,cAAe,KAAK,WAAY,KAAK,GAAG,IACnG,KAAK,SAAS,OAAA,EACd,KAAK,cAAA,EACP,CAEA,eAAsB,CAAE,KAAK,YAAc,EAAM,CAEjD,QAAe,CACb,GAAI,KAAK,YAAa,OACtB,MAAMvc,EAAQ,YAAY,IAAA,EACpBuE,EAAW,KAAK,YAAA,EACtB,GAAI,KAAK,YAAY,QAAU,GAAK,KAAK,YAAY,SAAW,EAAG,OAEnE,MAAMqD,EAAM,CACV,YAAa,KAAK,YAAa,cAAe,KAAK,cAAe,WAAY,KAAK,WACnF,UAAW,KAAK,UAAW,OAAQ,KAAK,OAAQ,WAAY,KAAK,WACjE,OAAQ,KAAK,OAAQ,QAAS,KAAK,QAAS,gBAAiB,KAAK,gBAClE,aAAc,KAAK,aAAqB,eAAgB,KAAK,eAC7D,SAAU,KAAK,SAAU,QAAS,KAAK,QAAS,kBAAmB,KAAK,kBACxE,gBAAiB,KAAK,gBAAiB,cAAe,KAAK,cAAe,eAAgB,KAAK,eAC/F,cAAe,KAAK,cAAe,MAAO,KAAK,MAAO,eAAgB,KAAK,eAC3E,OAAQ,KAAK,OAAQ,mBAAqBhD,GAAckU,EAAmB,KAAK,iBAAA,EAAoBlU,CAAC,EACrG,YAAa,IAAML,EAAU,aAAe+Y,GAAe,KAAK,aAAaA,CAAE,EAAG,aAAeC,GAAe,KAAK,aAAaA,CAAE,CAAA,EAGhIjH,EAAaD,GAAkBzO,EAAKrD,CAAQ,EAClD,KAAK,SAAS,OAAO+R,EAAY,CAAE,OAAQ,KAAK,WAAY,gBAAiB,KAAK,gBAAiB,SAAA/R,CAAA,CAAU,EAC7GuS,GAAclP,EAAKrD,EAAU,KAAK,MAAM,EAExC,KAAK,OAAO,KAAK,SAAU,CAAE,IAAK,KAAQ,YAAY,IAAA,EAAQvE,GAAQ,UAAW,YAAY,IAAA,EAAQA,EAAO,CAC9G,CAEQ,aAAasd,EAAoB,CACvC,MAAM5Y,EAAK,KAAK,YAAA,EAChB,OAAO,KAAK,WAAW,MAAS4Y,EAAK5Y,EAAG,GAAKA,EAAG,OAAU,KAAK,WAAW,KAAO,KAAK,WAAW,KACnG,CAEQ,aAAa6Y,EAAoB,CACvC,MAAM7Y,EAAK,KAAK,YAAA,EAChB,OAAO,KAAK,WAAW,MAAQ,GAAK6Y,EAAK7Y,EAAG,GAAKA,EAAG,SAAW,KAAK,WAAW,KAAO,KAAK,WAAW,KACxG,CAEQ,iBAAwB,CAC9B,MAAM8Y,EAAO,IAAM,CACb,KAAK,cACL,KAAK,cAAe,KAAK,OAAA,EAAU,KAAK,YAAc,IAC1D,KAAK,iBAAmB,sBAAsBA,CAAI,EACpD,EACA,KAAK,iBAAmB,sBAAsBA,CAAI,CACpD,CAEA,GAAkC,EAAMd,EAAwC,CAAE,KAAK,OAAO,GAAG,EAAGA,CAAC,CAAG,CACxG,IAAmC,EAAMA,EAAwC,CAAE,KAAK,OAAO,IAAI,EAAGA,CAAC,CAAG,CAE1G,SAAgB,CASd,IARA,KAAK,YAAc,GACf,KAAK,kBAAkB,qBAAqB,KAAK,gBAAgB,EACrE,KAAK,YAAY,QAAA,EACjB,KAAK,OAAO,QAAS9X,GAAM,CAAE,KAAK,SAAS,aAAaA,EAAE,MAAA,CAAO,EAAGA,EAAE,QAAA,CAAW,CAAC,EAClF,KAAK,OAAO,MAAA,EACZ,KAAK,SAAS,QAAA,EACV,KAAK,UAAU,KAAK,SAAS,QAAA,EAC7B,KAAK,QAAQ,KAAK,OAAO,QAAA,EACtB,KAAK,UAAU,YAAY,KAAK,UAAU,YAAY,KAAK,UAAU,UAAU,EACtF,QAAQ,IAAI,sBAAsB,CACpC,CACF,CAEO,SAAS6Y,GAAYxiB,EAA8B,CACxD,OAAO,IAAI0hB,GAAU1hB,CAAO,CAC9B,CC9PO,SAASyiB,GAAe/a,EAA2C,CACxE,OAAO,IAAID,EAAoBC,CAAM,CACvC,CChEO,SAASgb,GACd5iB,EACAC,EACA8B,EACkB,CAClB,MAAMkJ,EAASjL,EAAE,OAGjB,GAAI+B,GAAgBkJ,GAAUlJ,GAAgB,EAC5C,MAAO,CACL,EAAG,IAAI,aAAa/B,CAAC,EACrB,EAAG,IAAI,aAAaC,CAAC,EACrB,QAAS,IAAI,YAAY,MAAM,KAAK,CAAE,OAAAgL,CAAA,EAAU,CAAC+O,EAAG1b,IAAMA,CAAC,CAAC,CAAA,EAIhE,MAAMukB,EAAO,IAAI,aAAa9gB,CAAY,EACpC+gB,EAAO,IAAI,aAAa/gB,CAAY,EACpCghB,EAAa,IAAI,YAAYhhB,CAAY,EAG/C8gB,EAAK,CAAC,EAAI7iB,EAAE,CAAC,EACb8iB,EAAK,CAAC,EAAI7iB,EAAE,CAAC,EACb8iB,EAAW,CAAC,EAAI,EAGhB,MAAM5gB,GAAc8I,EAAS,IAAMlJ,EAAe,GAElD,IAAIK,EAAI,EACJ4gB,EAAS,EAEb,QAAS1kB,EAAI,EAAGA,EAAIyD,EAAe,EAAGzD,IAAK,CAEzC,MAAMgE,EAAc,KAAK,OAAOhE,EAAI,GAAK6D,CAAU,EAAI,EACjDI,EAAY,KAAK,OAAOjE,EAAI,GAAK6D,CAAU,EAAI,EAG/C8gB,EAAkB,KAAK,IAAI1gB,EAAW0I,EAAS,CAAC,EAChDzI,EAAgB,KAAK,IACzB,KAAK,OAAOlE,EAAI,GAAK6D,CAAU,EAAI,EACnC8I,CAAA,EAGF,IAAIxI,EAAO,EACPC,EAAO,EACPC,EAAW,EAEf,QAASd,EAAIohB,EAAiBphB,EAAIW,EAAeX,IAC/CY,GAAQzC,EAAE6B,CAAC,EACXa,GAAQzC,EAAE4B,CAAC,EACXc,IAGEA,EAAW,IACbF,GAAQE,EACRD,GAAQC,GAIV,IAAIC,EAAU,GACVsgB,EAAW5gB,EAEf,MAAM6gB,EAAKnjB,EAAEoC,CAAC,EACRghB,EAAKnjB,EAAEmC,CAAC,EAEd,QAASP,EAAIS,EAAaT,EAAIU,GAAaV,EAAIoJ,EAAQpJ,IAAK,CAE1D,MAAMiB,EAAO,KAAK,KACfqgB,EAAK1gB,IAASxC,EAAE4B,CAAC,EAAIuhB,IAAOD,EAAKnjB,EAAE6B,CAAC,IAAMa,EAAO0gB,EAAA,EAGhDtgB,EAAOF,IACTA,EAAUE,EACVogB,EAAWrhB,EAEf,CAGAghB,EAAKG,CAAM,EAAIhjB,EAAEkjB,CAAQ,EACzBJ,EAAKE,CAAM,EAAI/iB,EAAEijB,CAAQ,EACzBH,EAAWC,CAAM,EAAIE,EAErB9gB,EAAI8gB,EACJF,GACF,CAGA,OAAAH,EAAK9gB,EAAe,CAAC,EAAI/B,EAAEiL,EAAS,CAAC,EACrC6X,EAAK/gB,EAAe,CAAC,EAAI9B,EAAEgL,EAAS,CAAC,EACrC8X,EAAWhhB,EAAe,CAAC,EAAIkJ,EAAS,EAEjC,CAAE,EAAG4X,EAAM,EAAGC,EAAM,QAASC,CAAA,CACtC,CAQO,SAASM,GACdrjB,EACAC,EACAqjB,EACkB,CAClB,MAAMrY,EAASjL,EAAE,OAEjB,GAAIsjB,GAAerY,EAAS,EAC1B,MAAO,CACL,EAAG,IAAI,aAAajL,CAAC,EACrB,EAAG,IAAI,aAAaC,CAAC,EACrB,QAAS,IAAI,YAAY,MAAM,KAAK,CAAE,OAAAgL,CAAA,EAAU,CAAC+O,EAAG1b,IAAMA,CAAC,CAAC,CAAA,EAIhE,MAAM6D,EAAa8I,EAASqY,EACtBT,EAAiB,CAAA,EACjBC,EAAiB,CAAA,EACjBC,EAAuB,CAAA,EAE7B,QAASjc,EAAI,EAAGA,EAAIwc,EAAaxc,IAAK,CACpC,MAAM7B,EAAQ,KAAK,MAAM6B,EAAI3E,CAAU,EACjC+C,EAAM,KAAK,OAAO4B,EAAI,GAAK3E,CAAU,EAE3C,IAAIohB,EAAO,IACPC,EAAO,KACPC,EAASxe,EACTye,EAASze,EAEb,QAAS3G,EAAI2G,EAAO3G,EAAI4G,GAAO5G,EAAI2M,EAAQ3M,IACrC2B,EAAE3B,CAAC,EAAIilB,IACTA,EAAOtjB,EAAE3B,CAAC,EACVmlB,EAASnlB,GAEP2B,EAAE3B,CAAC,EAAIklB,IACTA,EAAOvjB,EAAE3B,CAAC,EACVolB,EAASplB,GAKTmlB,GAAUC,GACZb,EAAK,KAAK7iB,EAAEyjB,CAAM,EAAGzjB,EAAE0jB,CAAM,CAAC,EAC9BZ,EAAK,KAAK7iB,EAAEwjB,CAAM,EAAGxjB,EAAEyjB,CAAM,CAAC,EAC9BX,EAAW,KAAKU,EAAQC,CAAM,IAE9Bb,EAAK,KAAK7iB,EAAE0jB,CAAM,EAAG1jB,EAAEyjB,CAAM,CAAC,EAC9BX,EAAK,KAAK7iB,EAAEyjB,CAAM,EAAGzjB,EAAEwjB,CAAM,CAAC,EAC9BV,EAAW,KAAKW,EAAQD,CAAM,EAElC,CAEA,MAAO,CACL,EAAG,IAAI,aAAaZ,CAAI,EACxB,EAAG,IAAI,aAAaC,CAAI,EACxB,QAAS,IAAI,YAAYC,CAAU,CAAA,CAEvC,CAKO,SAASY,GACd3hB,EACA0H,EACAka,EAAiB,EACT,CAER,MAAM/F,EAAYnU,EAAcka,EAChC,OAAO,KAAK,IAAI5hB,EAAY6b,CAAS,CACvC;;;;;;;;4CCvLA,IAAIgG,EAAqB,OAAO,IAAI,4BAA4B,EAC9DC,EAAsB,OAAO,IAAI,gBAAgB,EACnD,SAASC,EAAQ3jB,EAAM4jB,EAAQC,EAAU,CACvC,IAAIC,EAAM,KAGV,GAFWD,IAAX,SAAwBC,EAAM,GAAKD,GACxBD,EAAO,MAAlB,SAA0BE,EAAM,GAAKF,EAAO,KACxC,QAASA,EAAQ,CACnBC,EAAW,CAAA,EACX,QAASE,KAAYH,EACTG,IAAV,QAAuBF,EAASE,CAAQ,EAAIH,EAAOG,CAAQ,EACjE,MAASF,EAAWD,EAClB,OAAAA,EAASC,EAAS,IACX,CACL,SAAUJ,EACV,KAAMzjB,EACN,IAAK8jB,EACL,IAAgBF,IAAX,OAAoBA,EAAS,KAClC,MAAOC,CACX,CACA,CACA,OAAAG,EAAA,SAAmBN,EACnBM,EAAA,IAAcL,EACdK,EAAA,KAAeL;;;;;;;;yCCtBE,QAAQ,IAAI,WAA7B,cACG,UAAY,CACX,SAASM,EAAyBjkB,EAAM,CACtC,GAAYA,GAAR,KAAc,OAAO,KACzB,GAAmB,OAAOA,GAAtB,WACF,OAAOA,EAAK,WAAakkB,EACrB,KACAlkB,EAAK,aAAeA,EAAK,MAAQ,KACvC,GAAiB,OAAOA,GAApB,SAA0B,OAAOA,EACrC,OAAQA,EAAI,CACV,KAAK0jB,EACH,MAAO,WACT,KAAKS,EACH,MAAO,WACT,KAAKC,EACH,MAAO,aACT,KAAKC,EACH,MAAO,WACT,KAAKC,EACH,MAAO,eACT,KAAKC,EACH,MAAO,WAEX,GAAiB,OAAOvkB,GAApB,SACF,OACgB,OAAOA,EAAK,KAAzB,UACC,QAAQ,MACN,qHAEJA,EAAK,SACf,CACU,KAAKwkB,EACH,MAAO,SACT,KAAKC,EACH,OAAOzkB,EAAK,aAAe,UAC7B,KAAK0kB,EACH,OAAQ1kB,EAAK,SAAS,aAAe,WAAa,YACpD,KAAK2kB,EACH,IAAIC,EAAY5kB,EAAK,OACrB,OAAAA,EAAOA,EAAK,YACZA,IACIA,EAAO4kB,EAAU,aAAeA,EAAU,MAAQ,GACnD5kB,EAAcA,IAAP,GAAc,cAAgBA,EAAO,IAAM,cAC9CA,EACT,KAAK6kB,EACH,OACGD,EAAY5kB,EAAK,aAAe,KACxB4kB,IAAT,KACIA,EACAX,EAAyBjkB,EAAK,IAAI,GAAK,OAE/C,KAAK8kB,EACHF,EAAY5kB,EAAK,SACjBA,EAAOA,EAAK,MACZ,GAAI,CACF,OAAOikB,EAAyBjkB,EAAK4kB,CAAS,CAAC,CAC7D,MAAwB,CAAA,EAElB,OAAO,IACb,CACI,SAASG,EAAmB/mB,EAAO,CACjC,MAAO,GAAKA,CAClB,CACI,SAASgnB,EAAuBhnB,EAAO,CACrC,GAAI,CACF+mB,EAAmB/mB,CAAK,EACxB,IAAIinB,EAA2B,EACvC,MAAkB,CACVA,EAA2B,EACnC,CACM,GAAIA,EAA0B,CAC5BA,EAA2B,QAC3B,IAAIC,EAAwBD,EAAyB,MACjDE,EACc,OAAO,QAAtB,YACC,OAAO,aACPnnB,EAAM,OAAO,WAAW,GAC1BA,EAAM,YAAY,MAClB,SACF,OAAAknB,EAAsB,KACpBD,EACA,2GACAE,CACV,EACeJ,EAAmB/mB,CAAK,CACvC,CACA,CACI,SAASonB,EAAYplB,EAAM,CACzB,GAAIA,IAAS0jB,EAAqB,MAAO,KACzC,GACe,OAAO1jB,GAApB,UACSA,IAAT,MACAA,EAAK,WAAa8kB,EAElB,MAAO,QACT,GAAI,CACF,IAAIxY,EAAO2X,EAAyBjkB,CAAI,EACxC,OAAOsM,EAAO,IAAMA,EAAO,IAAM,OACzC,MAAkB,CACV,MAAO,OACf,CACA,CACI,SAAS+Y,GAAW,CAClB,IAAIC,EAAaC,EAAqB,EACtC,OAAgBD,IAAT,KAAsB,KAAOA,EAAW,SAAQ,CAC7D,CACI,SAASE,GAAe,CACtB,OAAO,MAAM,uBAAuB,CAC1C,CACI,SAASC,EAAY7B,EAAQ,CAC3B,GAAI8B,GAAe,KAAK9B,EAAQ,KAAK,EAAG,CACtC,IAAI+B,EAAS,OAAO,yBAAyB/B,EAAQ,KAAK,EAAE,IAC5D,GAAI+B,GAAUA,EAAO,eAAgB,MAAO,EACpD,CACM,OAAkB/B,EAAO,MAAlB,MACb,CACI,SAASgC,EAA2BC,EAAOC,EAAa,CACtD,SAASC,GAAwB,CAC/BC,KACIA,GAA6B,GAC/B,QAAQ,MACN,0OACAF,CACZ,EACA,CACMC,EAAsB,eAAiB,GACvC,OAAO,eAAeF,EAAO,MAAO,CAClC,IAAKE,EACL,aAAc,EACtB,CAAO,CACP,CACI,SAASE,GAAyC,CAChD,IAAIC,EAAgBjC,EAAyB,KAAK,IAAI,EACtD,OAAAkC,GAAuBD,CAAa,IAChCC,GAAuBD,CAAa,EAAI,GAC1C,QAAQ,MACN,6IACV,GACMA,EAAgB,KAAK,MAAM,IACTA,IAAX,OAA2BA,EAAgB,IACxD,CACI,SAASE,EAAapmB,EAAM8jB,EAAK+B,EAAOQ,EAAOC,GAAYC,GAAW,CACpE,IAAIC,EAAUX,EAAM,IACpB,OAAA7lB,EAAO,CACL,SAAUyjB,EACV,KAAMzjB,EACN,IAAK8jB,EACL,MAAO+B,EACP,OAAQQ,CAChB,GAC2BG,IAAX,OAAqBA,EAAU,QAAzC,KACI,OAAO,eAAexmB,EAAM,MAAO,CACjC,WAAY,GACZ,IAAKimB,CACjB,CAAW,EACD,OAAO,eAAejmB,EAAM,MAAO,CAAE,WAAY,GAAI,MAAO,KAAM,EACtEA,EAAK,OAAS,CAAA,EACd,OAAO,eAAeA,EAAK,OAAQ,YAAa,CAC9C,aAAc,GACd,WAAY,GACZ,SAAU,GACV,MAAO,CACf,CAAO,EACD,OAAO,eAAeA,EAAM,aAAc,CACxC,aAAc,GACd,WAAY,GACZ,SAAU,GACV,MAAO,IACf,CAAO,EACD,OAAO,eAAeA,EAAM,cAAe,CACzC,aAAc,GACd,WAAY,GACZ,SAAU,GACV,MAAOsmB,EACf,CAAO,EACD,OAAO,eAAetmB,EAAM,aAAc,CACxC,aAAc,GACd,WAAY,GACZ,SAAU,GACV,MAAOumB,EACf,CAAO,EACD,OAAO,SAAW,OAAO,OAAOvmB,EAAK,KAAK,EAAG,OAAO,OAAOA,CAAI,GACxDA,CACb,CACI,SAASymB,EACPzmB,EACA4jB,EACAC,EACA6C,EACAJ,GACAC,GACA,CACA,IAAII,EAAW/C,EAAO,SACtB,GAAe+C,IAAX,OACF,GAAID,EACF,GAAIE,GAAYD,CAAQ,EAAG,CACzB,IACED,EAAmB,EACnBA,EAAmBC,EAAS,OAC5BD,IAEAG,EAAkBF,EAASD,CAAgB,CAAC,EAC9C,OAAO,QAAU,OAAO,OAAOC,CAAQ,CACnD,MACY,QAAQ,MACN,sJACd,OACaE,EAAkBF,CAAQ,EACjC,GAAIjB,GAAe,KAAK9B,EAAQ,KAAK,EAAG,CACtC+C,EAAW1C,EAAyBjkB,CAAI,EACxC,IAAI8mB,EAAO,OAAO,KAAKlD,CAAM,EAAE,OAAO,SAAU9f,GAAG,CACjD,OAAiBA,KAAV,KACjB,CAAS,EACD4iB,EACE,EAAII,EAAK,OACL,kBAAoBA,EAAK,KAAK,SAAS,EAAI,SAC3C,iBACNC,GAAsBJ,EAAWD,CAAgB,IAC7CI,EACA,EAAIA,EAAK,OAAS,IAAMA,EAAK,KAAK,SAAS,EAAI,SAAW,KAC5D,QAAQ,MACN;AAAA;AAAA;AAAA;AAAA;AAAA,mCACAJ,EACAC,EACAG,EACAH,GAEDI,GAAsBJ,EAAWD,CAAgB,EAAI,GAChE,CAMM,GALAC,EAAW,KACA9C,IAAX,SACGmB,EAAuBnB,CAAQ,EAAI8C,EAAW,GAAK9C,GACtD4B,EAAY7B,CAAM,IACfoB,EAAuBpB,EAAO,GAAG,EAAI+C,EAAW,GAAK/C,EAAO,KAC3D,QAASA,EAAQ,CACnBC,EAAW,CAAA,EACX,QAASE,MAAYH,EACTG,KAAV,QAAuBF,EAASE,EAAQ,EAAIH,EAAOG,EAAQ,EACrE,MAAaF,EAAWD,EAClB,OAAA+C,GACEf,EACE/B,EACe,OAAO7jB,GAAtB,WACIA,EAAK,aAAeA,EAAK,MAAQ,UACjCA,CACd,EACaomB,EACLpmB,EACA2mB,EACA9C,EACAwB,EAAQ,EACRiB,GACAC,EACR,CACA,CACI,SAASM,EAAkBG,EAAM,CAC/BC,EAAeD,CAAI,EACfA,EAAK,SAAWA,EAAK,OAAO,UAAY,GAC3B,OAAOA,GAApB,UACSA,IAAT,MACAA,EAAK,WAAalC,IACDkC,EAAK,SAAS,SAA9B,YACGC,EAAeD,EAAK,SAAS,KAAK,GAClCA,EAAK,SAAS,MAAM,SACnBA,EAAK,SAAS,MAAM,OAAO,UAAY,GACxCA,EAAK,SAAWA,EAAK,OAAO,UAAY,GACtD,CACI,SAASC,EAAeC,EAAQ,CAC9B,OACe,OAAOA,GAApB,UACSA,IAAT,MACAA,EAAO,WAAazD,CAE5B,CACI,IAAI0D,EAAQC,EACV3D,EAAqB,OAAO,IAAI,4BAA4B,EAC5De,EAAoB,OAAO,IAAI,cAAc,EAC7Cd,EAAsB,OAAO,IAAI,gBAAgB,EACjDU,EAAyB,OAAO,IAAI,mBAAmB,EACvDD,EAAsB,OAAO,IAAI,gBAAgB,EACjDO,EAAsB,OAAO,IAAI,gBAAgB,EACjDD,EAAqB,OAAO,IAAI,eAAe,EAC/CE,EAAyB,OAAO,IAAI,mBAAmB,EACvDN,EAAsB,OAAO,IAAI,gBAAgB,EACjDC,EAA2B,OAAO,IAAI,qBAAqB,EAC3DO,EAAkB,OAAO,IAAI,YAAY,EACzCC,EAAkB,OAAO,IAAI,YAAY,EACzCP,EAAsB,OAAO,IAAI,gBAAgB,EACjDL,EAAyB,OAAO,IAAI,wBAAwB,EAC5DqB,EACE4B,EAAM,gEACRzB,GAAiB,OAAO,UAAU,eAClCkB,GAAc,MAAM,QACpBS,GAAa,QAAQ,WACjB,QAAQ,WACR,UAAY,CACV,OAAO,IACnB,EACIF,EAAQ,CACN,yBAA0B,SAAUG,EAAmB,CACrD,OAAOA,EAAiB,CAChC,CACA,EACI,IAAItB,GACAG,GAAyB,CAAA,EACzBoB,GAAyBJ,EAAM,yBAAyB,KAC1DA,EACA3B,CACN,EAAK,EACGgC,GAAwBH,GAAWjC,EAAYI,CAAY,CAAC,EAC5DuB,GAAwB,CAAA,EAC5BU,EAAA,SAAmB/D,EACnB+D,EAAA,IAAc,SAAUznB,EAAM4jB,EAAQC,EAAU,CAC9C,IAAI6D,EACF,IAAMnC,EAAqB,6BAC7B,OAAOkB,EACLzmB,EACA4jB,EACAC,EACA,GACA6D,EACI,MAAM,uBAAuB,EAC7BH,GACJG,EAAmBL,GAAWjC,EAAYplB,CAAI,CAAC,EAAIwnB,EAC3D,CACA,EACIC,EAAA,KAAe,SAAUznB,EAAM4jB,EAAQC,EAAU,CAC/C,IAAI6D,EACF,IAAMnC,EAAqB,6BAC7B,OAAOkB,EACLzmB,EACA4jB,EACAC,EACA,GACA6D,EACI,MAAM,uBAAuB,EAC7BH,GACJG,EAAmBL,GAAWjC,EAAYplB,CAAI,CAAC,EAAIwnB,EAC3D,CACA,CACA,EAAG,KC7VC,QAAQ,IAAI,WAAa,aAC3BG,GAAA,QAAiBP,GAAA,EAEjBO,GAAA,QAAiBC,GAAA,mBCqEZ,SAASC,GACdC,EACAhoB,EAA8B,GACX,CACnB,KAAM,CAACioB,EAAOC,CAAQ,EAAIC,EAAAA,SAAuB,IAAI,EAC/C,CAACC,EAASC,CAAU,EAAIF,EAAAA,SAAS,EAAK,EACtC,CAACjhB,EAAOohB,CAAQ,EAAIH,EAAAA,SAAuB,IAAI,EAC/C,CAACtf,EAAQ0f,CAAS,EAAIJ,EAAAA,SAAwB,IAAI,EAGlDK,EAAaC,EAAAA,OAAOzoB,CAAO,EACjCwoB,EAAW,QAAUxoB,EAGrB0oB,EAAAA,UAAU,IAAM,CACd,MAAMrX,EAAY2W,EAAa,QAC/B,GAAK3W,EAEL,IAAI,CACF,MAAMsX,EAAgBnG,GAAY,CAChC,GAAGgG,EAAW,QACd,UAAAnX,CAAA,CACD,EAGDsX,EAAc,GAAG,OAAQ,IAAM,CAC7BJ,EAAUI,EAAc,eAAe,CACzC,CAAC,EAEDT,EAASS,CAAa,EACtBN,EAAW,EAAI,EACfE,EAAUI,EAAc,eAAe,EACvCL,EAAS,IAAI,EAEb,QAAQ,IAAI,iCAAiC,CAC/C,OAASvL,EAAK,CACZ,QAAQ,MAAM,4CAA6CA,CAAG,EAC9DuL,EAASvL,aAAe,MAAQA,EAAM,IAAI,MAAM,OAAOA,CAAG,CAAC,CAAC,EAC5DsL,EAAW,EAAK,CAClB,CAEA,MAAO,IAAM,CACPJ,IACFA,EAAM,QAAA,EACNC,EAAS,IAAI,EACbG,EAAW,EAAK,EAEpB,EAEF,EAAG,CAACL,CAAY,CAAC,EAGjB,MAAMpK,EAAYgL,EAAAA,YACfC,GAAiC,CAC5BZ,IACFA,EAAM,UAAUY,CAAa,EAC7BN,EAAUN,EAAM,eAAe,EAEnC,EACA,CAACA,CAAK,CAAA,EAGFjK,EAAe4K,EAAAA,YACnB,CAACngB,EAAY1J,IAA2B,CAClCkpB,GACFA,EAAM,aAAaxf,EAAI1J,CAAI,CAE/B,EACA,CAACkpB,CAAK,CAAA,EAGFlK,EAAe6K,EAAAA,YAClBngB,GAAe,CACVwf,GACFA,EAAM,aAAaxf,CAAE,CAEzB,EACA,CAACwf,CAAK,CAAA,EAGFtN,EAAOiO,EAAAA,YACVE,GAA6B,CACxBb,GACFA,EAAM,KAAKa,CAAW,CAE1B,EACA,CAACb,CAAK,CAAA,EAGFc,EAAYH,EAAAA,YAAY,IAAM,CAC9BX,IACFA,EAAM,UAAA,EACNM,EAAUN,EAAM,eAAe,EAEnC,EAAG,CAACA,CAAK,CAAC,EAEV,MAAO,CACL,MAAAA,EACA,QAAAG,EACA,MAAAlhB,EACA,OAAA2B,EACA,UAAA+U,EACA,aAAAI,EACA,aAAAD,EACA,KAAApD,EACA,UAAAoO,CAAA,CAEJ,CC9FO,MAAMC,GAAWC,EAAAA,WACtB,SACE,CACE,OAAA7f,EAAS,CAAA,EACT,KAAM8f,EACN,aAAAC,EACA,OAAApa,EACA,MAAAtE,EAAQ,OACR,OAAAC,EAAS,IACT,UAAA0e,EAAY,GACZ,MAAAnb,EAAQ,CAAA,EACR,MAAAob,EAAQ,GACR,GAAGC,CAAA,EAELC,EACA,CACA,MAAMvB,EAAeS,EAAAA,OAAuB,IAAI,EAC1Ce,EAAoBf,EAAAA,OAAoC,IAAI,GAAK,EAEjE,CACJ,MAAAR,EACA,QAAAG,EACA,OAAAvf,EACA,UAAA+U,EACA,aAAAI,EACA,aAAAD,EACA,UAAAgL,CAAA,EACEhB,GAAYC,EAAcsB,CAAY,EAG1CG,EAAAA,oBACEF,EACA,KAAO,CACL,SAAU,IAAMtB,EAChB,UAAAc,EACA,UAAW,IAAMlgB,CAAA,GAEnB,CAACof,EAAOc,EAAWlgB,CAAM,CAAA,EAI3B6f,EAAAA,UAAU,IAAM,CACd,GAAI,CAACN,GAAW,CAACH,EAAO,OAExB,MAAMyB,EAAmB,IAAI,IAAItgB,EAAO,IAAKO,GAAM,CAACA,EAAE,GAAIA,CAAC,CAAC,CAAC,EACvDggB,EAAoBH,EAAkB,QAG5CG,EAAkB,QAAQ,CAAC7P,EAAGrR,IAAO,CAC9BihB,EAAiB,IAAIjhB,CAAE,GAC1BsV,EAAatV,CAAE,CAEnB,CAAC,EAGDihB,EAAiB,QAAQ,CAACrO,EAAY5S,IAAO,CAC3C,MAAMmhB,EAAaD,EAAkB,IAAIlhB,CAAE,EAE3C,GAAKmhB,GAkBHA,EAAW,IAAMvO,EAAW,GAC5BuO,EAAW,IAAMvO,EAAW,IAG5B2C,EAAavV,EAAI,CACf,EAAG4S,EAAW,EACd,EAAGA,EAAW,CAAA,CACf,MAzBc,CAEf,MAAMrb,EAAyB,CAC7B,GAAIqb,EAAW,GACf,KAAM,OACN,KAAM,CAAE,EAAGA,EAAW,EAAG,EAAGA,EAAW,CAAA,EACvC,MAAO,CACL,MAAOA,EAAW,OAAS,UAC3B,MAAOA,EAAW,OAAS,GAAA,EAE7B,QAASA,EAAW,SAAW,EAAA,EAEjCuC,EAAU5d,CAAO,EAEb0pB,EAAiB,OAAS,GAC5BzB,EAAM,UAAA,CAEV,CAUF,CAAC,EAEDuB,EAAkB,QAAUE,CAC9B,EAAG,CAACtgB,EAAQgf,EAASH,EAAOrK,EAAWI,EAAcD,CAAY,CAAC,EAGlE2K,EAAAA,UAAU,IAAM,CACV,CAACN,GAAW,CAACH,GAAS,CAACiB,GAC3BjB,EAAM,KAAKiB,CAAQ,CACrB,EAAG,CAACd,EAASH,EAAOiB,CAAQ,CAAC,EAG7BR,EAAAA,UAAU,IAAM,CACV,CAACN,GAAW,CAACH,GAAS,CAACkB,GAE3BlB,EAAM,GAAG,OAASlhB,GAAU,CAC1BoiB,EAAa,CACX,KAAMpiB,EAAM,EAAE,CAAC,EACf,KAAMA,EAAM,EAAE,CAAC,EACf,KAAMA,EAAM,EAAE,CAAC,EACf,KAAMA,EAAM,EAAE,CAAC,CAAA,CAChB,CACH,CAAC,CACH,EAAG,CAACqhB,EAASH,EAAOkB,CAAY,CAAC,EAGjCT,EAAAA,UAAU,IAAM,CACV,CAACN,GAAW,CAACH,IAEblZ,GAAA,MAAAA,EAAQ,QACVkZ,EAAM,aAAalZ,CAAM,EAEzBkZ,EAAM,cAAA,EAEV,EAAG,CAACG,EAASH,EAAOlZ,CAAM,CAAC,EAG3B,MAAM8a,EAAiBC,EAAAA,QACrB,KAAO,CACL,SAAU,WACV,MAAO,OAAOrf,GAAU,SAAW,GAAGA,CAAK,KAAOA,EAClD,OAAQ,OAAOC,GAAW,SAAW,GAAGA,CAAM,KAAOA,EACrD,GAAGuD,CAAA,GAEL,CAACxD,EAAOC,EAAQuD,CAAK,CAAA,EAGvB,OACE8b,EAAAA,IAAC,MAAA,CACC,IAAK/B,EACL,UAAW,sBAAsBoB,CAAS,GAC1C,MAAOS,EAGN,YAAShhB,GACRmhB,EAAAA,KAAC,MAAA,CACC,MAAO,CACL,SAAU,WACV,IAAK,EACL,MAAO,EACP,WAAY,kBACZ,MAAO,OACP,QAAS,UACT,aAAc,EACd,SAAU,GACV,WAAY,WAAA,EAGd,SAAA,CAAAA,OAAC,MAAA,CAAI,SAAA,CAAA,OACEnhB,EAAO,KAAK,QAAQ,CAAC,EAAE,KAAGA,EAAO,KAAK,QAAQ,CAAC,EAAE,GAAA,EACxD,SACC,MAAA,CAAI,SAAA,CAAA,OACEA,EAAO,KAAK,cAAc,CAAC,EAAE,KAAGA,EAAO,KAAK,cAAc,CAAC,EAAE,GAAA,EAEpE,SACC,MAAA,CAAI,SAAA,CAAA,WAASO,EAAO,MAAA,CAAA,CAAO,CAAA,CAAA,CAAA,CAC9B,CAAA,CAIR,CACF","x_google_ignoreList":[23,24,25]}