@pixerate/editor-react 0.84.0 → 0.86.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{chunk-VKWTKESA.js → chunk-4FQXRPBN.js} +12 -1
- package/dist/chunk-4FQXRPBN.js.map +1 -0
- package/dist/image-editor/index.cjs +8 -0
- package/dist/image-editor/index.cjs.map +1 -1
- package/dist/image-editor/index.js +1 -1
- package/dist/index.cjs +8 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +1 -1
- package/dist/vector/index.cjs +413 -381
- package/dist/vector/index.cjs.map +1 -1
- package/dist/vector/index.d.cts +11 -1
- package/dist/vector/index.d.ts +11 -1
- package/dist/vector/index.js +302 -271
- package/dist/vector/index.js.map +1 -1
- package/package.json +3 -3
- package/dist/chunk-VKWTKESA.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/image-editor/useImageEditor.ts","../src/image-editor/ImageEditor.tsx","../src/image-editor/ControlSlider.tsx","../src/image-editor/Histogram.tsx","../src/image-editor/AdjustmentLayersPanel.tsx","../src/image-editor/CurvesEditor.tsx","../src/image-editor/LayersPanel.tsx","../src/image-editor/LayerEffectsPanel.tsx","../src/image-editor/ImageProviderEffectsPanel.tsx","../src/image-editor/BrushOptionsBar.tsx","../src/image-editor/PaintGradientEditor.tsx","../src/image-editor/ColorProfilePanel.tsx","../src/image-editor/SelectionOptionsBar.tsx","../src/image-editor/RefineEdgePanel.tsx","../src/image-editor/FreeTransformOptionsBar.tsx","../src/image-editor/ShapeOptionsBar.tsx","../src/image-editor/TypeOptionsBar.tsx"],"sourcesContent":["import { useRef, useState, useEffect, useCallback, useMemo } from 'react';\nimport type { ToolRegistry } from '@pixerate/editor/tools';\nimport {\n ImageEditorController,\n createImageEffectsToolProvider,\n type ImageEffectsToolProviderOptions,\n type ImageEditorOptions,\n type ImageEditorState,\n type ImageEditorTool,\n type CropBox,\n type AspectRatio,\n type ImageAdjustments,\n type DepthMaskOptions,\n type Annotation,\n type CreateAnnotationPayload,\n type ExportOptions,\n type SerializedImageEditorState,\n type AIResultOptions,\n type ImagePoint,\n type AdjustmentKind,\n type AdjustmentLayerInit,\n type AdjustmentLayerUpdate,\n type ImageHistogram,\n} from '@pixerate/editor/image-editor';\n\nexport interface UseImageEditorReturn {\n controller: ImageEditorController;\n state: ImageEditorState;\n canUndo: boolean;\n canRedo: boolean;\n setTool: (tool: ImageEditorTool) => void;\n setCrop: (crop: CropBox | null, addToHistory?: boolean) => void;\n applyCropPreset: (ratio: AspectRatio) => void;\n resetCrop: () => void;\n rotate: (degrees: number) => void;\n setRotation: (degrees: number) => void;\n flipHorizontal: () => void;\n flipVertical: () => void;\n setAdjustments: (partial: Partial<ImageAdjustments>, commitToHistory?: boolean) => void;\n resetAdjustments: () => void;\n /** Update to Current Process: re-render the adjustments with the latest process (one undo step). */\n upgradeProcess: () => boolean;\n /** Adds an adjustment layer (one undo step) and returns its id. */\n addAdjustmentLayer: (init: AdjustmentKind | AdjustmentLayerInit, index?: number) => string;\n updateAdjustmentLayer: (id: string, update: AdjustmentLayerUpdate, commitToHistory?: boolean) => boolean;\n removeAdjustmentLayer: (id: string) => boolean;\n moveAdjustmentLayer: (id: string, toIndex: number) => boolean;\n toggleAdjustmentLayer: (id: string, enabled?: boolean) => boolean;\n /** Histogram of the last rendered preview (after adjustments and layers); null before a render. */\n histogram: ImageHistogram | null;\n setDepthMask: (partial: Partial<DepthMaskOptions>) => void;\n resetDepthMask: () => void;\n addAnnotation: (annotation: CreateAnnotationPayload) => string;\n updateAnnotation: (id: string, partial: Partial<Annotation>, commitToHistory?: boolean) => void;\n removeAnnotation: (id: string) => void;\n clearAnnotations: () => void;\n selectAnnotation: (id: string | null) => void;\n undo: () => boolean;\n redo: () => boolean;\n reset: () => void;\n zoomIn: (factor?: number) => void;\n zoomOut: (factor?: number) => void;\n resetZoom: () => void;\n setZoom: (zoom: number) => void;\n setPan: (pan: ImagePoint) => void;\n setComparing: (comparing: boolean) => void;\n loadImage: (src: string | HTMLImageElement) => Promise<void>;\n toDataURL: (options?: ExportOptions) => Promise<string>;\n toBlob: (options?: ExportOptions) => Promise<Blob>;\n toJSON: () => SerializedImageEditorState;\n loadJSON: (data: SerializedImageEditorState) => void;\n renderMask: (options?: { useAnnotations?: boolean; useCrop?: boolean }) => Promise<HTMLCanvasElement>;\n toMaskDataURL: (options?: { useAnnotations?: boolean; useCrop?: boolean }) => Promise<string>;\n toSourceDataURL: (options?: Pick<ExportOptions, 'format' | 'quality'>) => Promise<string>;\n /** In documents with several layers (or `target: 'new-layer'`) the result goes to a new layer. */\n applyInpaintedImage: (newDataUrl: string, options?: AIResultOptions) => Promise<string | void>;\n /** In documents with several layers (or `target: 'new-layer'`) the result's alpha masks the active layer. */\n applyBackgroundRemovedImage: (newDataUrl: string, options?: AIResultOptions) => Promise<string | void>;\n}\n\nexport function useImageEditor(options: ImageEditorOptions = {}): UseImageEditorReturn {\n const controllerRef = useRef<ImageEditorController | null>(null);\n\n if (!controllerRef.current) {\n controllerRef.current = new ImageEditorController(options);\n }\n\n const controller = controllerRef.current;\n const [state, setState] = useState<ImageEditorState>(() => controller.getState());\n const [historyTicks, setHistoryTicks] = useState(0);\n const [histogram, setHistogram] = useState<ImageHistogram | null>(() => controller.getHistogram());\n\n useEffect(() => controller.subscribeHistogram(setHistogram), [controller]);\n\n useEffect(() => {\n const unsub = controller.subscribe((next) => {\n setState(next);\n setHistoryTicks((t) => t + 1);\n });\n return unsub;\n }, [controller]);\n\n // The constructor loads the initial image. Reload only when the `image`\n // option itself changes, not whenever the controller's source differs from\n // it (AI edits replace the source with a data URL and must not be reverted).\n const loadedImageRef = useRef(options.image);\n useEffect(() => {\n if (options.image === loadedImageRef.current) return;\n loadedImageRef.current = options.image;\n if (options.image) {\n controller.loadImage(options.image);\n }\n }, [options.image, controller]);\n\n const setTool = useCallback((tool: ImageEditorTool) => controller.setTool(tool), [controller]);\n const setCrop = useCallback(\n (crop: CropBox | null, addToHistory = true) => controller.setCrop(crop, addToHistory),\n [controller]\n );\n const applyCropPreset = useCallback((ratio: AspectRatio) => controller.applyCropPreset(ratio), [controller]);\n const resetCrop = useCallback(() => controller.resetCrop(), [controller]);\n const rotate = useCallback((deg: number) => controller.rotate(deg), [controller]);\n const setRotation = useCallback((deg: number) => controller.setRotation(deg), [controller]);\n const flipHorizontal = useCallback(() => controller.flipHorizontal(), [controller]);\n const flipVertical = useCallback(() => controller.flipVertical(), [controller]);\n const setAdjustments = useCallback(\n (partial: Partial<ImageAdjustments>, commitToHistory = true) =>\n controller.setAdjustments(partial, commitToHistory),\n [controller]\n );\n const resetAdjustments = useCallback(() => controller.resetAdjustments(), [controller]);\n const upgradeProcess = useCallback(() => controller.upgradeProcess(), [controller]);\n const addAdjustmentLayer = useCallback(\n (init: AdjustmentKind | AdjustmentLayerInit, index?: number) => controller.addAdjustmentLayer(init, index),\n [controller]\n );\n const updateAdjustmentLayer = useCallback(\n (id: string, update: AdjustmentLayerUpdate, commitToHistory = true) =>\n controller.updateAdjustmentLayer(id, update, commitToHistory),\n [controller]\n );\n const removeAdjustmentLayer = useCallback((id: string) => controller.removeAdjustmentLayer(id), [controller]);\n const moveAdjustmentLayer = useCallback((id: string, to: number) => controller.moveAdjustmentLayer(id, to), [controller]);\n const toggleAdjustmentLayer = useCallback(\n (id: string, enabled?: boolean) => controller.toggleAdjustmentLayer(id, enabled),\n [controller]\n );\n const setDepthMask = useCallback((partial: Partial<DepthMaskOptions>) => controller.setDepthMask(partial), [controller]);\n const resetDepthMask = useCallback(() => controller.resetDepthMask(), [controller]);\n const addAnnotation = useCallback((ann: CreateAnnotationPayload) => controller.addAnnotation(ann), [controller]);\n const updateAnnotation = useCallback(\n (id: string, partial: Partial<Annotation>, commitToHistory = true) =>\n controller.updateAnnotation(id, partial, commitToHistory),\n [controller]\n );\n const removeAnnotation = useCallback((id: string) => controller.removeAnnotation(id), [controller]);\n const clearAnnotations = useCallback(() => controller.clearAnnotations(), [controller]);\n const selectAnnotation = useCallback((id: string | null) => controller.selectAnnotation(id), [controller]);\n const undo = useCallback(() => controller.undo(), [controller]);\n const redo = useCallback(() => controller.redo(), [controller]);\n const reset = useCallback(() => controller.reset(), [controller]);\n const zoomIn = useCallback((factor?: number) => controller.zoomIn(factor), [controller]);\n const zoomOut = useCallback((factor?: number) => controller.zoomOut(factor), [controller]);\n const resetZoom = useCallback(() => controller.resetZoom(), [controller]);\n const setZoom = useCallback((zoom: number) => controller.setZoom(zoom), [controller]);\n const setPan = useCallback((pan: ImagePoint) => controller.setPan(pan), [controller]);\n const setComparing = useCallback((comp: boolean) => controller.setComparing(comp), [controller]);\n const loadImage = useCallback((src: string | HTMLImageElement) => controller.loadImage(src), [controller]);\n const toDataURL = useCallback((opts?: ExportOptions) => controller.toDataURL(opts), [controller]);\n const toBlob = useCallback((opts?: ExportOptions) => controller.toBlob(opts), [controller]);\n const toJSON = useCallback(() => controller.toJSON(), [controller]);\n const loadJSON = useCallback((data: SerializedImageEditorState) => controller.loadJSON(data), [controller]);\n const renderMask = useCallback(\n (opts?: { useAnnotations?: boolean; useCrop?: boolean }) => controller.renderMask(opts),\n [controller]\n );\n const toMaskDataURL = useCallback(\n (opts?: { useAnnotations?: boolean; useCrop?: boolean }) => controller.toMaskDataURL(opts),\n [controller]\n );\n const toSourceDataURL = useCallback(\n (opts?: Pick<ExportOptions, 'format' | 'quality'>) => controller.toSourceDataURL(opts),\n [controller]\n );\n const applyInpaintedImage = useCallback(\n (newDataUrl: string, options?: AIResultOptions) => controller.applyInpaintedImage(newDataUrl, options),\n [controller]\n );\n const applyBackgroundRemovedImage = useCallback(\n (newDataUrl: string, options?: AIResultOptions) => controller.applyBackgroundRemovedImage(newDataUrl, options),\n [controller]\n );\n\n return useMemo(\n () => ({\n controller,\n state,\n canUndo: controller.canUndo,\n canRedo: controller.canRedo,\n setTool,\n setCrop,\n applyCropPreset,\n resetCrop,\n rotate,\n setRotation,\n flipHorizontal,\n flipVertical,\n setAdjustments,\n resetAdjustments,\n upgradeProcess,\n addAdjustmentLayer,\n updateAdjustmentLayer,\n removeAdjustmentLayer,\n moveAdjustmentLayer,\n toggleAdjustmentLayer,\n histogram,\n setDepthMask,\n resetDepthMask,\n addAnnotation,\n updateAnnotation,\n removeAnnotation,\n clearAnnotations,\n selectAnnotation,\n undo,\n redo,\n reset,\n zoomIn,\n zoomOut,\n resetZoom,\n setZoom,\n setPan,\n setComparing,\n loadImage,\n toDataURL,\n toBlob,\n toJSON,\n loadJSON,\n renderMask,\n toMaskDataURL,\n toSourceDataURL,\n applyInpaintedImage,\n applyBackgroundRemovedImage,\n }),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [controller, state, historyTicks, histogram]\n );\n}\n\n/**\n * Registers the image editor's provider-effect tools (`search_effects`, `describe_effect`,\n * `apply_effect`, `add_effect_layer`, …) in `registry` while mounted. They work once an effects\n * provider is registered (see `useEffects`); before that the read tools say so and the write tools\n * refuse.\n */\nexport function useImageEffectsTools(\n registry: ToolRegistry | null | undefined,\n controller: ImageEditorController,\n options: ImageEffectsToolProviderOptions = {},\n): void {\n const { id, namespace, readOnly } = options;\n useEffect(() => {\n if (!registry) return;\n return registry.register(createImageEffectsToolProvider(controller, { id, namespace, readOnly }));\n }, [registry, controller, id, namespace, readOnly]);\n}\n","import React, { useRef, useEffect, useState, useCallback } from 'react';\nimport type {\n Annotation,\n CropBox,\n CropHandle,\n ExportOptions,\n ImageEditorTool,\n ImagePoint,\n InpaintHook,\n RemoveBackgroundHook,\n ImageEditorAIHooks,\n} from '@pixerate/editor/image-editor';\nimport {\n canvasToImagePoint,\n hitTestCrop,\n getCropCursor,\n calculateCropDrag,\n hitTestAnnotation,\n normalizeProcessVersion,\n LATEST_PROCESS_VERSION,\n IMAGE_ADJUSTMENT_CONTROLS,\n readAdjustmentControls,\n DEFAULT_SELECTION_TOOL_OPTIONS,\n SelectionGesture,\n PaintGesture,\n handlePaintShortcut,\n pointerPressure,\n FreeTransformTool,\n getViewportProjection,\n ShapeDrawGesture,\n TypeToolGesture,\n DEFAULT_SHAPE_TOOL_OPTIONS,\n DEFAULT_TYPE_TOOL_OPTIONS,\n type SelectionToolOptions,\n type ShapeToolOptions,\n type TypeToolOptions,\n type TransformHandle,\n} from '@pixerate/editor/image-editor';\nimport { useImageEditor, type UseImageEditorReturn } from './useImageEditor';\nimport { ControlSlider } from './ControlSlider';\nimport { Histogram } from './Histogram';\nimport { AdjustmentLayersPanel } from './AdjustmentLayersPanel';\nimport { LayersPanel } from './LayersPanel';\nimport { ImageProviderEffectsPanel } from './ImageProviderEffectsPanel';\nimport type { EffectProvider } from '@pixerate/editor/effects';\nimport { useEffects } from '../effects';\nimport { BrushOptionsBar } from './BrushOptionsBar';\nimport { ColorProfilePanel } from './ColorProfilePanel';\nimport { SelectionOptionsBar } from './SelectionOptionsBar';\nimport { RefineEdgePanel } from './RefineEdgePanel';\nimport { FreeTransformOptionsBar } from './FreeTransformOptionsBar';\nimport { ShapeOptionsBar } from './ShapeOptionsBar';\nimport { TypeOptionsBar } from './TypeOptionsBar';\n\nexport interface ImageEditorProps {\n editor?: UseImageEditorReturn;\n src?: string;\n className?: string;\n style?: React.CSSProperties;\n onSave?: (dataUrl: string) => void;\n exportOptions?: ExportOptions;\n onInpaint?: InpaintHook;\n onRemoveBackground?: RemoveBackgroundHook;\n aiHooks?: ImageEditorAIHooks;\n /**\n * An effects provider (see `@pixerate/editor/effects`), registered with the controller while\n * mounted: filter effects as smart filters and generator or overlay effects as effect layers,\n * with an Effects section in the Layers tab. Optional: without one the editor is as before.\n */\n effects?: EffectProvider | null;\n}\n\ntype TabType = 'crop' | 'adjust' | 'layers' | 'paint' | 'select' | 'annotate' | 'depth' | 'ai';\n\nexport const ImageEditor: React.FC<ImageEditorProps> = ({\n editor: externalEditor,\n src,\n className = '',\n style,\n onSave,\n exportOptions,\n onInpaint,\n onRemoveBackground,\n aiHooks,\n effects,\n}) => {\n const internalEditor = useImageEditor({ image: src });\n const editor = externalEditor || internalEditor;\n const { state, controller } = editor;\n useEffects(controller, effects);\n const effectsShown = !!controller.effectsProvider || state.layers.some(function has(l): boolean {\n return (l.type === 'pixel' && !!l.generator) || (l.type === 'smart' && !!l.smartFilters?.filters.some((f) => f.kind === 'effect')) || (l.type === 'group' && l.children.some(has));\n });\n const legacyProcess = normalizeProcessVersion(state.adjustments.process) < LATEST_PROCESS_VERSION;\n\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n const [activeTab, setActiveTab] = useState<TabType>('crop');\n const [activeCropRatio, setActiveCropRatio] = useState<number | null>(null);\n\n // Selection tools (magic wand, marquees, lasso): options bar state and the pointer gesture.\n const [selectionOptions, setSelectionOptions] = useState<SelectionToolOptions>(DEFAULT_SELECTION_TOOL_OPTIONS);\n const selectionOptionsRef = useRef(selectionOptions);\n selectionOptionsRef.current = selectionOptions;\n const selectionGestureRef = useRef<SelectionGesture | null>(null);\n if (!selectionGestureRef.current || selectionGestureRef.current.controller !== controller) {\n selectionGestureRef.current = new SelectionGesture(controller, () => selectionOptionsRef.current);\n }\n const selectionDraftRef = useRef<ImagePoint[] | null>(null);\n const [selectionError, setSelectionError] = useState<string | null>(null);\n\n // Paint tools (Move, Brush, Eraser): the pointer gesture and the brush cursor.\n const paintGestureRef = useRef<PaintGesture | null>(null);\n const paintControllerRef = useRef(controller);\n if (!paintGestureRef.current || paintControllerRef.current !== controller) {\n paintGestureRef.current = new PaintGesture(controller);\n paintControllerRef.current = controller;\n }\n const brushCursorRef = useRef<ImagePoint | null>(null);\n const [paintError, setPaintError] = useState<string | null>(null);\n\n // Free Transform (Ctrl/Cmd+T): the shared tool drives a session; its overlay is drawn by the renderer.\n const transformToolRef = useRef<FreeTransformTool | null>(null);\n const transformControllerRef = useRef(controller);\n if (!transformToolRef.current || transformControllerRef.current !== controller) {\n transformToolRef.current?.cancel();\n transformToolRef.current = new FreeTransformTool(controller, {\n schedule: (run) => (typeof requestAnimationFrame !== 'undefined' ? requestAnimationFrame(run) : run()),\n });\n transformControllerRef.current = controller;\n }\n const transformTool = transformToolRef.current;\n const [, setTransformTick] = useState(0);\n const [transformCursor, setTransformCursor] = useState('default');\n\n // Shape and type tools: their options and gestures; type is edited on the canvas through a hidden textarea.\n const [shapeOptions, setShapeOptions] = useState<ShapeToolOptions>(DEFAULT_SHAPE_TOOL_OPTIONS);\n const shapeOptionsRef = useRef(shapeOptions);\n shapeOptionsRef.current = shapeOptions;\n const [typeOptions, setTypeOptions] = useState<TypeToolOptions>(DEFAULT_TYPE_TOOL_OPTIONS);\n const typeOptionsRef = useRef(typeOptions);\n typeOptionsRef.current = typeOptions;\n const shapeGestureRef = useRef<ShapeDrawGesture | null>(null);\n const typeToolRef = useRef<TypeToolGesture | null>(null);\n const shapeTypeControllerRef = useRef(controller);\n if (!shapeGestureRef.current || !typeToolRef.current || shapeTypeControllerRef.current !== controller) {\n typeToolRef.current?.finish();\n shapeGestureRef.current = new ShapeDrawGesture(controller, () => shapeOptionsRef.current);\n typeToolRef.current = new TypeToolGesture(controller, () => typeOptionsRef.current);\n shapeTypeControllerRef.current = controller;\n }\n const typeInputRef = useRef<HTMLTextAreaElement>(null);\n const [typeSession, setTypeSession] = useState(typeToolRef.current.session);\n const [shapeTypeError, setShapeTypeError] = useState<string | null>(null);\n\n // AI Tools state\n const [inpaintPrompt, setInpaintPrompt] = useState('');\n const [inpaintMaskMode, setInpaintMaskMode] = useState<'annotations' | 'crop'>('annotations');\n const [isRemovingBg, setIsRemovingBg] = useState(false);\n const [isInpainting, setIsInpainting] = useState(false);\n const [aiError, setAiError] = useState<string | null>(null);\n const [aiSuccess, setAiSuccess] = useState<string | null>(null);\n /** Where AI results go: by layer count (auto), a new layer / mask, or replacing the Background. */\n const [aiTarget, setAiTarget] = useState<'auto' | 'new-layer' | 'replace'>('auto');\n const aiOptions = aiTarget === 'auto' ? {} : { target: aiTarget };\n\n const effectiveOnInpaint = onInpaint || aiHooks?.onInpaint;\n const effectiveOnRemoveBg = onRemoveBackground || aiHooks?.onRemoveBackground;\n\n const handleRemoveBackground = async () => {\n if (!effectiveOnRemoveBg) {\n setAiError('No background removal hook is configured.');\n return;\n }\n setAiError(null);\n setAiSuccess(null);\n setIsRemovingBg(true);\n try {\n // AI hooks work in natural pixels (no crop or rotation): the source when the result replaces\n // it, the composite of the layers when the result becomes a layer or mask.\n const imageDataUrl = await controller.toAIInputDataURL(aiOptions);\n const result = await effectiveOnRemoveBg({ imageDataUrl });\n if (typeof result === 'string') {\n await editor.applyBackgroundRemovedImage(result, aiOptions);\n setAiSuccess('Background removed successfully!');\n } else {\n setAiSuccess('Background removal complete.');\n }\n } catch (err: any) {\n setAiError(err?.message || 'Failed to remove background.');\n } finally {\n setIsRemovingBg(false);\n }\n };\n\n const handleInpaint = async () => {\n if (!effectiveOnInpaint) {\n setAiError('No inpainting hook is configured.');\n return;\n }\n if (!inpaintPrompt.trim()) {\n setAiError('Please enter an inpainting prompt.');\n return;\n }\n setAiError(null);\n setAiSuccess(null);\n setIsInpainting(true);\n try {\n // Source image and mask share natural image space so they line up exactly.\n const imageDataUrl = await controller.toAIInputDataURL(aiOptions);\n const maskDataUrl = await editor.toMaskDataURL({\n useAnnotations: inpaintMaskMode === 'annotations',\n useCrop: inpaintMaskMode === 'crop',\n });\n const result = await effectiveOnInpaint({\n prompt: inpaintPrompt.trim(),\n imageDataUrl,\n maskDataUrl,\n cropBox: inpaintMaskMode === 'crop' ? editor.state.crop : null,\n });\n if (typeof result === 'string') {\n await editor.applyInpaintedImage(result, aiOptions);\n setAiSuccess('Inpainting applied successfully!');\n } else {\n setAiSuccess('Inpainting complete.');\n }\n } catch (err: any) {\n setAiError(err?.message || 'Failed to apply inpainting.');\n } finally {\n setIsInpainting(false);\n }\n };\n\n // Annotation drafting state\n const [activeColor, setActiveColor] = useState('#ef4444');\n const [strokeWidth, setStrokeWidth] = useState(3);\n const [fontSize, setFontSize] = useState(24);\n const [textInput, setTextInput] = useState('');\n\n // Live draft and drag references\n const draftAnnotationRef = useRef<Annotation | null>(null);\n const draftCropRef = useRef<CropBox | null>(null);\n const cropDragInfoRef = useRef<{\n handle: CropHandle | 'new';\n startCanvasPt: ImagePoint;\n startImgPt: ImagePoint;\n startCrop: CropBox;\n } | null>(null);\n const annotationDragInfoRef = useRef<{\n annId: string;\n startImgPt: ImagePoint;\n initialAnn: Annotation;\n } | null>(null);\n const isDrawingRef = useRef(false);\n const currentPathRef = useRef<ImagePoint[]>([]);\n const dragStartPointRef = useRef<ImagePoint | null>(null);\n\n // Canvas viewport sizing and re-render\n const renderCanvas = useCallback(\n async (draftAnnotation?: Annotation | null, draftCrop?: CropBox | null) => {\n const canvas = canvasRef.current;\n const container = containerRef.current;\n if (!canvas || !container) return;\n\n const vpWidth = container.clientWidth || 800;\n const vpHeight = container.clientHeight || 500;\n\n await controller.render(canvas, {\n viewportWidth: vpWidth,\n viewportHeight: vpHeight,\n showCropOverlay: activeTab === 'crop',\n showSelectionOverlay: true,\n interactive: true,\n draftAnnotation: draftAnnotation !== undefined ? draftAnnotation : draftAnnotationRef.current,\n draftCrop: draftCrop !== undefined ? draftCrop : draftCropRef.current,\n draftSelectionPath: selectionDraftRef.current,\n brushCursor:\n activeTab === 'paint' && brushCursorRef.current && controller.getState().activeTool !== 'move' && !transformTool.active\n ? { ...brushCursorRef.current, diameter: controller.getState().paint.brush.size }\n : null,\n freeTransform: transformTool.overlay(),\n textEdit: typeToolRef.current?.session?.alive ? typeToolRef.current.session.overlay() : null,\n });\n },\n [controller, activeTab, transformTool]\n );\n\n // The text being edited: re-render on every change, and end it when the tool or tab changes.\n useEffect(() => typeSession?.subscribe(() => void renderCanvas()), [typeSession, renderCanvas]);\n useEffect(() => {\n if (activeTab === 'annotate' && state.activeTool === 'type') return;\n if (typeToolRef.current?.session) {\n typeToolRef.current.finish();\n setTypeSession(null);\n void renderCanvas();\n }\n }, [activeTab, state.activeTool, renderCanvas]);\n const finishTyping = () => {\n typeToolRef.current?.finish();\n setTypeSession(null);\n void renderCanvas();\n };\n const handleTypeKeyDown = (e: React.KeyboardEvent<HTMLTextAreaElement>) => {\n const session = typeToolRef.current?.session;\n if (!session || e.nativeEvent.isComposing) return;\n if (e.key === 'Escape') {\n e.preventDefault();\n finishTyping();\n return;\n }\n if ((e.metaKey || e.ctrlKey) && ['z', 'y', 'c', 'x', 'v'].includes(e.key.toLowerCase())) return;\n if (session.handleKey(e)) {\n e.preventDefault();\n setShapeTypeError(session.error);\n }\n };\n const handleTypeInput = (e: React.FormEvent<HTMLTextAreaElement>) => {\n // Composed (IME) and pasted text arrives here; plain keys were handled on keydown.\n const el = e.currentTarget;\n const session = typeToolRef.current?.session;\n if (session && el.value && !(e.nativeEvent as InputEvent).isComposing) {\n session.insert(el.value);\n el.value = '';\n }\n };\n\n useEffect(() => transformTool.subscribe(() => {\n setTransformTick((n) => n + 1);\n void renderCanvas();\n }), [transformTool, renderCanvas]);\n\n /** The canvas point of a pointer event, its document point, and the screen scale. */\n const transformPoint = (e: React.PointerEvent<HTMLCanvasElement>) => {\n const canvas = canvasRef.current!;\n const rect = canvas.getBoundingClientRect();\n const sx = rect.width > 0 ? canvas.width / rect.width : 1;\n const sy = rect.height > 0 ? canvas.height / rect.height : 1;\n const s = controller.getState();\n const cropping = activeTab === 'crop';\n const projection = getViewportProjection(s, canvas.width, canvas.height, cropping);\n const pt = canvasToImagePoint({ x: (e.clientX - rect.left) * sx, y: (e.clientY - rect.top) * sy }, s, canvas.width, canvas.height, cropping);\n transformTool.setView(projection.scale);\n return { pt, tolerance: 6 / (projection.scale || 1) };\n };\n const handleTransformPointerDown = (e: React.PointerEvent<HTMLCanvasElement>): boolean => {\n if (!transformTool.active) return false;\n if (e.button !== 0) return true;\n e.preventDefault();\n try {\n e.currentTarget.setPointerCapture?.(e.pointerId);\n } catch {\n // Synthetic events have no active pointer to capture.\n }\n const { pt, tolerance } = transformPoint(e);\n transformTool.down(pt, tolerance);\n return true;\n };\n const handleTransformPointerMove = (e: React.PointerEvent<HTMLCanvasElement>): boolean => {\n if (!transformTool.active) return false;\n const { pt, tolerance } = transformPoint(e);\n if (e.buttons & 1) transformTool.move(pt, e);\n else {\n const over: TransformHandle | null = transformTool.hit(pt, tolerance);\n setTransformCursor(transformTool.cursor(over));\n }\n return true;\n };\n const handleTransformPointerUp = (): boolean => {\n if (!transformTool.active) return false;\n transformTool.up();\n return true;\n };\n\n useEffect(() => {\n if (typeof window === 'undefined') return;\n const onKey = (e: KeyboardEvent) => {\n if (transformTool.key(e)) e.preventDefault();\n };\n window.addEventListener('keydown', onKey);\n return () => window.removeEventListener('keydown', onKey);\n }, [transformTool]);\n\n\n useEffect(() => {\n const raf =\n typeof requestAnimationFrame !== 'undefined'\n ? requestAnimationFrame\n : (cb: () => void) => setTimeout(cb, 0) as unknown as number;\n const caf =\n typeof cancelAnimationFrame !== 'undefined'\n ? cancelAnimationFrame\n : (id: number) => clearTimeout(id);\n\n const animId = raf(() => {\n renderCanvas();\n });\n return () => caf(animId);\n }, [renderCanvas, state]);\n\n // Synchronize initial tool with activeTab\n useEffect(() => {\n if (activeTab === 'crop' && editor.state.activeTool !== 'crop') {\n editor.setTool('crop');\n }\n }, [activeTab, editor]);\n\n // Container resize observer to safely adapt viewport without feedback loops\n useEffect(() => {\n const container = containerRef.current;\n if (!container) return;\n\n if (typeof ResizeObserver !== 'undefined') {\n const observer = new ResizeObserver(() => {\n renderCanvas();\n });\n observer.observe(container);\n return () => observer.disconnect();\n } else {\n const handleResize = () => renderCanvas();\n window.addEventListener('resize', handleResize);\n return () => window.removeEventListener('resize', handleResize);\n }\n }, [renderCanvas]);\n\n // Convert mouse event coordinates to internal canvas pixel space\n const getCanvasEventPoint = (e: React.MouseEvent<HTMLCanvasElement>): ImagePoint => {\n const canvas = canvasRef.current;\n if (!canvas) return { x: 0, y: 0 };\n const rect = canvas.getBoundingClientRect();\n const scaleX = rect.width > 0 ? canvas.width / rect.width : 1;\n const scaleY = rect.height > 0 ? canvas.height / rect.height : 1;\n return {\n x: (e.clientX - rect.left) * scaleX,\n y: (e.clientY - rect.top) * scaleY,\n };\n };\n\n // Paint tools: pointer events (coalesced samples, pointer capture) into strokes and moves.\n const paintSamples = (e: React.PointerEvent<HTMLCanvasElement>) => {\n const canvas = canvasRef.current!;\n const native = e.nativeEvent as PointerEvent;\n const events = typeof native.getCoalescedEvents === 'function' ? native.getCoalescedEvents() : [];\n const list = events.length ? events : [native];\n const rect = canvas.getBoundingClientRect();\n const sx = rect.width > 0 ? canvas.width / rect.width : 1;\n const sy = rect.height > 0 ? canvas.height / rect.height : 1;\n const s = controller.getState();\n return list.map((ev) => ({\n ...canvasToImagePoint({ x: (ev.clientX - rect.left) * sx, y: (ev.clientY - rect.top) * sy }, s, canvas.width, canvas.height, false),\n pressure: pointerPressure(ev),\n }));\n };\n const handlePaintPointerDown = (e: React.PointerEvent<HTMLCanvasElement>) => {\n if (handleTransformPointerDown(e)) return;\n if (activeTab !== 'paint' || e.button !== 0) return;\n e.preventDefault();\n try {\n e.currentTarget.setPointerCapture?.(e.pointerId);\n } catch {\n // Synthetic events have no active pointer to capture.\n }\n const [first] = paintSamples(e);\n setPaintError(paintGestureRef.current!.down({ ...first, altKey: e.altKey }));\n };\n const handlePaintPointerMove = (e: React.PointerEvent<HTMLCanvasElement>) => {\n if (handleTransformPointerMove(e)) return;\n if (activeTab !== 'paint') return;\n const samples = paintSamples(e);\n brushCursorRef.current = samples[samples.length - 1] ?? null;\n if (paintGestureRef.current!.active) paintGestureRef.current!.moveTo(samples);\n else void renderCanvas();\n };\n const handlePaintPointerUp = () => {\n if (handleTransformPointerUp()) return;\n if (activeTab !== 'paint') return;\n const g = paintGestureRef.current!;\n if (g.active) {\n g.up();\n if (g.error) setPaintError(g.error);\n }\n };\n\n useEffect(() => {\n if (activeTab !== 'paint' || typeof window === 'undefined') return;\n const onKey = (e: KeyboardEvent) => {\n if (handlePaintShortcut(controller, e)) e.preventDefault();\n };\n window.addEventListener('keydown', onKey);\n return () => window.removeEventListener('keydown', onKey);\n }, [activeTab, controller]);\n\n // Pointer event handlers for drawing and annotations\n const handleMouseDown = (e: React.MouseEvent<HTMLCanvasElement>) => {\n const canvas = canvasRef.current;\n if (!canvas || transformTool.active) return;\n const canvasPt = getCanvasEventPoint(e);\n\n if (activeTab === 'select') {\n const gesture = selectionGestureRef.current!;\n const imgPt = canvasToImagePoint(canvasPt, state, canvas.width, canvas.height, false);\n void gesture.begin(imgPt, e).then(() => setSelectionError(gesture.error));\n return;\n }\n\n if (activeTab === 'crop') {\n const activeCrop = draftCropRef.current || state.crop || {\n x: 0,\n y: 0,\n width: state.imageDimensions.width,\n height: state.imageDimensions.height,\n };\n const handle = hitTestCrop(canvasPt, state, canvas.width, canvas.height, 14, activeCrop);\n const startImgPt = canvasToImagePoint(canvasPt, state, canvas.width, canvas.height, true);\n\n if (handle) {\n cropDragInfoRef.current = {\n handle,\n startCanvasPt: canvasPt,\n startImgPt,\n startCrop: activeCrop,\n };\n } else {\n // Clicked outside crop box: start new crop selection\n cropDragInfoRef.current = {\n handle: 'new',\n startCanvasPt: canvasPt,\n startImgPt,\n startCrop: { x: startImgPt.x, y: startImgPt.y, width: 0, height: 0 },\n };\n }\n return;\n }\n\n if (activeTab === 'annotate' && (state.activeTool === 'shape' || state.activeTool === 'type')) {\n const imgPt = canvasToImagePoint(canvasPt, state, canvas.width, canvas.height, false);\n setShapeTypeError(null);\n if (state.activeTool === 'shape') shapeGestureRef.current!.down(imgPt);\n else {\n typeToolRef.current!.down(imgPt, { shift: e.shiftKey });\n setTypeSession(typeToolRef.current!.session);\n void renderCanvas();\n }\n return;\n }\n\n if (activeTab === 'annotate') {\n const imgPt = canvasToImagePoint(canvasPt, state, canvas.width, canvas.height, false);\n dragStartPointRef.current = imgPt;\n\n if (state.activeTool === 'select') {\n for (let i = state.annotations.length - 1; i >= 0; i--) {\n const ann = state.annotations[i];\n if (hitTestAnnotation(imgPt, ann)) {\n editor.selectAnnotation(ann.id);\n annotationDragInfoRef.current = {\n annId: ann.id,\n startImgPt: imgPt,\n initialAnn: { ...ann },\n };\n return;\n }\n }\n editor.selectAnnotation(null);\n return;\n }\n\n if (state.activeTool === 'pen') {\n isDrawingRef.current = true;\n currentPathRef.current = [imgPt];\n const draft: Annotation = {\n id: 'draft',\n type: 'pen',\n x: 0,\n y: 0,\n points: [imgPt],\n strokeColor: activeColor,\n strokeWidth,\n };\n draftAnnotationRef.current = draft;\n renderCanvas(draft);\n }\n }\n };\n\n const handleMouseMove = (e: React.MouseEvent<HTMLCanvasElement>) => {\n const canvas = canvasRef.current;\n if (!canvas || transformTool.active) return;\n const canvasPt = getCanvasEventPoint(e);\n\n if (activeTab === 'select') {\n const gesture = selectionGestureRef.current!;\n if (gesture.active && gesture.move(canvasToImagePoint(canvasPt, state, canvas.width, canvas.height, false))) {\n selectionDraftRef.current = gesture.draftPath;\n renderCanvas();\n }\n return;\n }\n\n if (activeTab === 'crop') {\n const drag = cropDragInfoRef.current;\n if (drag) {\n const currentImgPt = canvasToImagePoint(canvasPt, state, canvas.width, canvas.height, true);\n let newCrop: CropBox;\n\n if (drag.handle === 'new') {\n const minX = Math.max(0, Math.min(drag.startImgPt.x, currentImgPt.x));\n const minY = Math.max(0, Math.min(drag.startImgPt.y, currentImgPt.y));\n const maxX = Math.min(state.imageDimensions.width, Math.max(drag.startImgPt.x, currentImgPt.x));\n const maxY = Math.min(state.imageDimensions.height, Math.max(drag.startImgPt.y, currentImgPt.y));\n newCrop = {\n x: Math.round(minX),\n y: Math.round(minY),\n width: Math.round(Math.max(20, maxX - minX)),\n height: Math.round(Math.max(20, maxY - minY)),\n };\n } else {\n newCrop = calculateCropDrag(\n drag.startCrop,\n drag.handle,\n drag.startImgPt,\n currentImgPt,\n state.imageDimensions.width,\n state.imageDimensions.height,\n activeCropRatio,\n state.transform\n );\n }\n\n draftCropRef.current = newCrop;\n renderCanvas(null, newCrop);\n } else {\n const activeCrop = draftCropRef.current || state.crop || {\n x: 0,\n y: 0,\n width: state.imageDimensions.width,\n height: state.imageDimensions.height,\n };\n const handle = hitTestCrop(canvasPt, state, canvas.width, canvas.height, 14, activeCrop);\n canvas.style.cursor = getCropCursor(handle, state.transform);\n }\n return;\n }\n\n if (activeTab === 'annotate' && state.activeTool === 'shape') {\n const g = shapeGestureRef.current!;\n if (g.active) {\n g.move(canvasToImagePoint(canvasPt, state, canvas.width, canvas.height, false), { shift: e.shiftKey, alt: e.altKey });\n if (g.error) setShapeTypeError(g.error);\n }\n return;\n }\n\n if (activeTab === 'annotate') {\n // If moving selected annotation\n if (annotationDragInfoRef.current) {\n const drag = annotationDragInfoRef.current;\n const currentImgPt = canvasToImagePoint(canvasPt, state, canvas.width, canvas.height, false);\n const dx = currentImgPt.x - drag.startImgPt.x;\n const dy = currentImgPt.y - drag.startImgPt.y;\n editor.updateAnnotation(drag.annId, {\n x: Math.round(drag.initialAnn.x + dx),\n y: Math.round(drag.initialAnn.y + dy),\n });\n return;\n }\n\n const startPt = dragStartPointRef.current;\n if (!startPt) {\n // Update cursor for hover on select tool\n if (state.activeTool === 'select') {\n const imgPt = canvasToImagePoint(canvasPt, state, canvas.width, canvas.height, false);\n let hovered = false;\n for (let i = state.annotations.length - 1; i >= 0; i--) {\n if (hitTestAnnotation(imgPt, state.annotations[i])) {\n hovered = true;\n break;\n }\n }\n canvas.style.cursor = hovered ? 'move' : 'default';\n } else {\n canvas.style.cursor = 'crosshair';\n }\n return;\n }\n\n const currentImgPt = canvasToImagePoint(canvasPt, state, canvas.width, canvas.height, false);\n\n if (state.activeTool === 'pen' && isDrawingRef.current) {\n currentPathRef.current.push(currentImgPt);\n const draft: Annotation = {\n id: 'draft',\n type: 'pen',\n x: 0,\n y: 0,\n points: [...currentPathRef.current],\n strokeColor: activeColor,\n strokeWidth,\n };\n draftAnnotationRef.current = draft;\n renderCanvas(draft);\n } else if (state.activeTool === 'rect') {\n const w = currentImgPt.x - startPt.x;\n const h = currentImgPt.y - startPt.y;\n const draft: Annotation = {\n id: 'draft',\n type: 'rect',\n x: Math.min(startPt.x, currentImgPt.x),\n y: Math.min(startPt.y, currentImgPt.y),\n width: Math.abs(w),\n height: Math.abs(h),\n strokeColor: activeColor,\n strokeWidth,\n };\n draftAnnotationRef.current = draft;\n renderCanvas(draft);\n } else if (state.activeTool === 'circle') {\n const rx = Math.abs(currentImgPt.x - startPt.x) / 2;\n const ry = Math.abs(currentImgPt.y - startPt.y) / 2;\n const draft: Annotation = {\n id: 'draft',\n type: 'circle',\n x: Math.min(startPt.x, currentImgPt.x) + rx,\n y: Math.min(startPt.y, currentImgPt.y) + ry,\n radiusX: rx,\n radiusY: ry,\n strokeColor: activeColor,\n strokeWidth,\n };\n draftAnnotationRef.current = draft;\n renderCanvas(draft);\n } else if (state.activeTool === 'arrow') {\n const draft: Annotation = {\n id: 'draft',\n type: 'arrow',\n x: startPt.x,\n y: startPt.y,\n endX: currentImgPt.x,\n endY: currentImgPt.y,\n strokeColor: activeColor,\n strokeWidth,\n };\n draftAnnotationRef.current = draft;\n renderCanvas(draft);\n } else if (state.activeTool === 'line') {\n const draft: Annotation = {\n id: 'draft',\n type: 'line',\n x: startPt.x,\n y: startPt.y,\n endX: currentImgPt.x,\n endY: currentImgPt.y,\n strokeColor: activeColor,\n strokeWidth,\n };\n draftAnnotationRef.current = draft;\n renderCanvas(draft);\n }\n }\n };\n\n const handleMouseUp = (e: React.MouseEvent<HTMLCanvasElement>) => {\n const canvas = canvasRef.current;\n if (!canvas || transformTool.active) return;\n const canvasPt = getCanvasEventPoint(e);\n\n if (activeTab === 'select') {\n const gesture = selectionGestureRef.current!;\n if (gesture.active) {\n gesture.end(canvasToImagePoint(canvasPt, state, canvas.width, canvas.height, false), e);\n selectionDraftRef.current = null;\n renderCanvas();\n }\n return;\n }\n\n if (activeTab === 'crop') {\n if (cropDragInfoRef.current) {\n if (\n draftCropRef.current &&\n draftCropRef.current.width >= 20 &&\n draftCropRef.current.height >= 20\n ) {\n editor.setCrop(draftCropRef.current, true);\n }\n cropDragInfoRef.current = null;\n draftCropRef.current = null;\n renderCanvas();\n }\n return;\n }\n\n if (activeTab === 'annotate' && state.activeTool === 'shape') {\n shapeGestureRef.current!.up();\n return;\n }\n if (activeTab === 'annotate' && state.activeTool === 'type') {\n const tool = typeToolRef.current!;\n tool.up(canvasToImagePoint(canvasPt, state, canvas.width, canvas.height, false));\n setTypeSession(tool.session);\n if (tool.error) setShapeTypeError(tool.error);\n void renderCanvas();\n // Keystrokes go to the hidden textarea while text is being edited.\n if (tool.session) setTimeout(() => typeInputRef.current?.focus(), 0);\n return;\n }\n\n if (activeTab === 'annotate') {\n if (annotationDragInfoRef.current) {\n annotationDragInfoRef.current = null;\n return;\n }\n\n const startPt = dragStartPointRef.current;\n if (startPt) {\n const currentImgPt = canvasToImagePoint(canvasPt, state, canvas.width, canvas.height, false);\n\n if (state.activeTool === 'pen' && isDrawingRef.current) {\n if (currentPathRef.current.length > 1) {\n editor.addAnnotation({\n type: 'pen',\n x: 0,\n y: 0,\n points: [...currentPathRef.current],\n strokeColor: activeColor,\n strokeWidth,\n });\n }\n isDrawingRef.current = false;\n currentPathRef.current = [];\n } else if (state.activeTool === 'rect') {\n const w = Math.abs(currentImgPt.x - startPt.x);\n const h = Math.abs(currentImgPt.y - startPt.y);\n if (w > 4 && h > 4) {\n editor.addAnnotation({\n type: 'rect',\n x: Math.min(startPt.x, currentImgPt.x),\n y: Math.min(startPt.y, currentImgPt.y),\n width: w,\n height: h,\n strokeColor: activeColor,\n strokeWidth,\n });\n }\n } else if (state.activeTool === 'circle') {\n const rx = Math.abs(currentImgPt.x - startPt.x) / 2;\n const ry = Math.abs(currentImgPt.y - startPt.y) / 2;\n if (rx > 4 && ry > 4) {\n editor.addAnnotation({\n type: 'circle',\n x: Math.min(startPt.x, currentImgPt.x) + rx,\n y: Math.min(startPt.y, currentImgPt.y) + ry,\n radiusX: rx,\n radiusY: ry,\n strokeColor: activeColor,\n strokeWidth,\n });\n }\n } else if (state.activeTool === 'arrow') {\n if (Math.hypot(currentImgPt.x - startPt.x, currentImgPt.y - startPt.y) > 4) {\n editor.addAnnotation({\n type: 'arrow',\n x: startPt.x,\n y: startPt.y,\n endX: currentImgPt.x,\n endY: currentImgPt.y,\n strokeColor: activeColor,\n strokeWidth,\n });\n }\n } else if (state.activeTool === 'line') {\n if (Math.hypot(currentImgPt.x - startPt.x, currentImgPt.y - startPt.y) > 4) {\n editor.addAnnotation({\n type: 'line',\n x: startPt.x,\n y: startPt.y,\n endX: currentImgPt.x,\n endY: currentImgPt.y,\n strokeColor: activeColor,\n strokeWidth,\n });\n }\n }\n\n draftAnnotationRef.current = null;\n dragStartPointRef.current = null;\n renderCanvas();\n }\n }\n };\n\n const handleAddText = () => {\n if (!textInput.trim()) return;\n editor.addAnnotation({\n type: 'text',\n x: 50,\n y: 50,\n text: textInput.trim(),\n fontSize,\n color: activeColor,\n });\n setTextInput('');\n };\n\n const handleExport = async () => {\n const dataUrl = await editor.toDataURL(exportOptions);\n if (onSave) {\n onSave(dataUrl);\n } else {\n // Default download trigger\n const link = document.createElement('a');\n link.download = `edited-image-${Date.now()}.png`;\n link.href = dataUrl;\n link.click();\n }\n };\n\n return (\n <div\n className={`flex flex-col bg-slate-900 border border-slate-800 rounded-xl overflow-hidden shadow-2xl text-slate-100 ${className}`}\n style={style}\n >\n {/* Top Action Header */}\n <div className=\"flex flex-wrap items-center justify-between px-4 py-3 bg-slate-950/80 border-b border-slate-800 gap-3\">\n {/* Navigation Tabs */}\n <div className=\"flex items-center gap-1 bg-slate-900 p-1 rounded-lg border border-slate-800 text-xs\">\n <button\n type=\"button\"\n onClick={() => {\n setActiveTab('crop');\n editor.setTool('crop');\n }}\n className={`px-3 py-1.5 rounded-md font-medium transition-colors ${\n activeTab === 'crop' ? 'bg-indigo-600 text-white shadow' : 'text-slate-400 hover:text-slate-200'\n }`}\n >\n Transform & Crop\n </button>\n <button\n type=\"button\"\n onClick={() => {\n setActiveTab('adjust');\n editor.setTool('select');\n }}\n className={`px-3 py-1.5 rounded-md font-medium transition-colors ${\n activeTab === 'adjust' ? 'bg-indigo-600 text-white shadow' : 'text-slate-400 hover:text-slate-200'\n }`}\n >\n Adjustments\n </button>\n <button\n type=\"button\"\n onClick={() => {\n setActiveTab('layers');\n editor.setTool('select');\n }}\n className={`px-3 py-1.5 rounded-md font-medium transition-colors ${\n activeTab === 'layers' ? 'bg-indigo-600 text-white shadow' : 'text-slate-400 hover:text-slate-200'\n }`}\n >\n Layers\n </button>\n <button\n type=\"button\"\n onClick={() => {\n setActiveTab('paint');\n editor.setTool('brush');\n }}\n className={`px-3 py-1.5 rounded-md font-medium transition-colors ${\n activeTab === 'paint' ? 'bg-indigo-600 text-white shadow' : 'text-slate-400 hover:text-slate-200'\n }`}\n >\n Paint\n </button>\n <button\n type=\"button\"\n onClick={() => {\n setActiveTab('select');\n editor.setTool('select');\n }}\n className={`px-3 py-1.5 rounded-md font-medium transition-colors ${\n activeTab === 'select' ? 'bg-indigo-600 text-white shadow' : 'text-slate-400 hover:text-slate-200'\n }`}\n >\n Select & Mask\n </button>\n <button\n type=\"button\"\n onClick={() => {\n setActiveTab('annotate');\n editor.setTool('pen');\n }}\n className={`px-3 py-1.5 rounded-md font-medium transition-colors ${\n activeTab === 'annotate' ? 'bg-indigo-600 text-white shadow' : 'text-slate-400 hover:text-slate-200'\n }`}\n >\n Annotations\n </button>\n <button\n type=\"button\"\n onClick={() => {\n setActiveTab('depth');\n editor.setTool('select');\n }}\n className={`px-3 py-1.5 rounded-md font-medium transition-colors ${\n activeTab === 'depth' ? 'bg-indigo-600 text-white shadow' : 'text-slate-400 hover:text-slate-200'\n }`}\n >\n Depth Mask\n </button>\n <button\n type=\"button\"\n onClick={() => {\n setActiveTab('ai');\n editor.setTool('select');\n }}\n className={`px-3 py-1.5 rounded-md font-medium transition-colors flex items-center gap-1.5 ${\n activeTab === 'ai' ? 'bg-indigo-600 text-white shadow' : 'text-slate-400 hover:text-slate-200'\n }`}\n >\n <svg className=\"w-3.5 h-3.5\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <path d=\"M12 2v4M12 18v4M4.93 4.93l2.83 2.83M16.24 16.24l2.83 2.83M2 12h4M18 12h4M4.93 19.07l2.83-2.83M16.24 7.76l2.83-2.83\" />\n </svg>\n AI Tools\n </button>\n </div>\n\n {/* Global Action Tools (Undo/Redo, Zoom, Compare, Save) */}\n <div className=\"flex items-center gap-2 text-xs\">\n <button\n type=\"button\"\n disabled={!editor.canUndo}\n onClick={() => editor.undo()}\n className=\"p-1.5 rounded-lg border border-slate-800 bg-slate-900 text-slate-300 disabled:opacity-40 disabled:cursor-not-allowed hover:bg-slate-800\"\n title=\"Undo\"\n >\n ↩\n </button>\n <button\n type=\"button\"\n disabled={!editor.canRedo}\n onClick={() => editor.redo()}\n className=\"p-1.5 rounded-lg border border-slate-800 bg-slate-900 text-slate-300 disabled:opacity-40 disabled:cursor-not-allowed hover:bg-slate-800\"\n title=\"Redo\"\n >\n ↪\n </button>\n <button\n type=\"button\"\n onClick={() => editor.reset()}\n className=\"px-2 py-1.5 rounded-lg border border-slate-800 bg-slate-900 text-slate-400 hover:text-slate-200 hover:bg-slate-800\"\n >\n Reset\n </button>\n\n <div className=\"h-4 w-px bg-slate-800 mx-1\" />\n\n {/* Zoom */}\n <button\n type=\"button\"\n onClick={() => editor.zoomOut()}\n className=\"p-1.5 rounded-lg border border-slate-800 bg-slate-900 text-slate-300 hover:bg-slate-800\"\n title=\"Zoom Out\"\n >\n -\n </button>\n <span className=\"font-mono text-slate-400 w-10 text-center\">{Math.round(state.zoom * 100)}%</span>\n <button\n type=\"button\"\n onClick={() => editor.zoomIn()}\n className=\"p-1.5 rounded-lg border border-slate-800 bg-slate-900 text-slate-300 hover:bg-slate-800\"\n title=\"Zoom In\"\n >\n +\n </button>\n\n <div className=\"h-4 w-px bg-slate-800 mx-1\" />\n\n {/* Live Compare */}\n <button\n type=\"button\"\n onMouseDown={() => editor.setComparing(true)}\n onMouseUp={() => editor.setComparing(false)}\n onMouseLeave={() => editor.setComparing(false)}\n className=\"px-2.5 py-1.5 rounded-lg border border-slate-800 bg-slate-900 text-amber-400 hover:bg-slate-800 select-none active:bg-amber-950/40\"\n >\n Hold Compare\n </button>\n\n {/* Save / Export */}\n <button\n type=\"button\"\n onClick={handleExport}\n className=\"px-4 py-1.5 rounded-lg bg-emerald-600 hover:bg-emerald-500 text-white font-medium shadow-md shadow-emerald-900/30 transition-colors\"\n >\n Export Image\n </button>\n </div>\n </div>\n\n {/* Free Transform options bar (Ctrl/Cmd+T), above the viewport while a transform is open */}\n {transformTool.active && <FreeTransformOptionsBar tool={transformTool} className=\"border-b border-slate-800 bg-slate-900/95 px-4 py-2\" />}\n {!transformTool.active && transformTool.error && (\n <div role=\"alert\" className=\"border-b border-rose-900 bg-rose-950/80 px-4 py-1.5 text-xs text-rose-200\">\n {transformTool.error}\n </div>\n )}\n\n {/* Main Viewport + Sidebar Layout */}\n <div className=\"flex flex-col md:flex-row flex-1 min-h-[520px] md:h-[560px]\">\n {/* Canvas Area */}\n <div\n ref={containerRef}\n className=\"relative flex-1 h-[360px] md:h-full min-h-[320px] bg-slate-950 overflow-hidden select-none\"\n >\n <canvas\n ref={canvasRef}\n onMouseDown={handleMouseDown}\n onMouseMove={handleMouseMove}\n onMouseUp={handleMouseUp}\n onMouseLeave={handleMouseUp}\n onPointerDown={handlePaintPointerDown}\n onPointerMove={handlePaintPointerMove}\n onPointerUp={handlePaintPointerUp}\n onPointerCancel={() => paintGestureRef.current?.cancel()}\n data-testid=\"image-editor-canvas\"\n style={transformTool.active ? { cursor: transformCursor } : undefined}\n className={`absolute inset-0 w-full h-full block ${transformTool.active ? 'touch-none' : activeTab === 'paint' ? 'touch-none cursor-crosshair' : activeTab === 'annotate' && state.activeTool === 'type' ? 'cursor-text' : activeTab === 'annotate' && state.activeTool === 'shape' ? 'cursor-crosshair' : ''}`}\n />\n {typeSession && (\n <textarea\n ref={typeInputRef}\n aria-label=\"Edit text\"\n data-testid=\"type-input\"\n autoCapitalize=\"off\"\n autoCorrect=\"off\"\n spellCheck={false}\n onKeyDown={handleTypeKeyDown}\n onInput={handleTypeInput}\n onCompositionEnd={(e) => {\n const session = typeToolRef.current?.session;\n if (session && e.data) session.insert(e.data);\n e.currentTarget.value = '';\n }}\n className=\"absolute left-0 top-0 h-px w-px opacity-0\"\n />\n )}\n\n </div>\n\n {/* Tab Controls Sidebar */}\n <div className=\"w-full md:w-80 bg-slate-900/90 border-t md:border-t-0 md:border-l border-slate-800 p-4 overflow-y-auto h-auto md:h-full md:max-h-[560px]\">\n {/* TAB 1: CROP & TRANSFORM */}\n {activeTab === 'crop' && (\n <div className=\"flex flex-col gap-4 text-xs\">\n <span className=\"font-semibold text-slate-200 uppercase tracking-wider text-[11px]\">\n Aspect Ratio Presets\n </span>\n <div className=\"grid grid-cols-3 gap-2\">\n <button\n type=\"button\"\n onClick={() => {\n setActiveCropRatio(null);\n editor.applyCropPreset(null);\n }}\n className={`px-2.5 py-2 rounded-lg border font-medium ${\n activeCropRatio === null && state.crop\n ? 'bg-indigo-600 border-indigo-500 text-white'\n : 'bg-slate-800 hover:bg-slate-700 text-slate-200 border-slate-700'\n }`}\n >\n Freeform\n </button>\n <button\n type=\"button\"\n onClick={() => {\n setActiveCropRatio(1);\n editor.applyCropPreset(1);\n }}\n className={`px-2.5 py-2 rounded-lg border font-medium ${\n activeCropRatio === 1\n ? 'bg-indigo-600 border-indigo-500 text-white'\n : 'bg-slate-800 hover:bg-slate-700 text-slate-200 border-slate-700'\n }`}\n >\n 1:1 Square\n </button>\n <button\n type=\"button\"\n onClick={() => {\n setActiveCropRatio(4 / 3);\n editor.applyCropPreset(4 / 3);\n }}\n className={`px-2.5 py-2 rounded-lg border font-medium ${\n activeCropRatio === 4 / 3\n ? 'bg-indigo-600 border-indigo-500 text-white'\n : 'bg-slate-800 hover:bg-slate-700 text-slate-200 border-slate-700'\n }`}\n >\n 4:3 Standard\n </button>\n <button\n type=\"button\"\n onClick={() => {\n setActiveCropRatio(16 / 9);\n editor.applyCropPreset(16 / 9);\n }}\n className={`px-2.5 py-2 rounded-lg border font-medium ${\n activeCropRatio === 16 / 9\n ? 'bg-indigo-600 border-indigo-500 text-white'\n : 'bg-slate-800 hover:bg-slate-700 text-slate-200 border-slate-700'\n }`}\n >\n 16:9 Wide\n </button>\n <button\n type=\"button\"\n onClick={() => {\n setActiveCropRatio(3 / 2);\n editor.applyCropPreset(3 / 2);\n }}\n className={`px-2.5 py-2 rounded-lg border font-medium ${\n activeCropRatio === 3 / 2\n ? 'bg-indigo-600 border-indigo-500 text-white'\n : 'bg-slate-800 hover:bg-slate-700 text-slate-200 border-slate-700'\n }`}\n >\n 3:2 Photo\n </button>\n <button\n type=\"button\"\n onClick={() => {\n setActiveCropRatio(null);\n editor.resetCrop();\n }}\n className=\"px-2.5 py-2 rounded-lg bg-rose-950/40 hover:bg-rose-900/60 text-rose-300 border border-rose-800/40 font-medium\"\n >\n Clear Crop\n </button>\n </div>\n\n <div className=\"h-px bg-slate-800 my-1\" />\n\n <span className=\"font-semibold text-slate-200 uppercase tracking-wider text-[11px]\">\n Orientation & Flips\n </span>\n <div className=\"grid grid-cols-2 gap-2\">\n <button\n type=\"button\"\n onClick={() => editor.rotate(-90)}\n className=\"px-3 py-2 rounded-lg bg-slate-800 hover:bg-slate-700 text-slate-200 border border-slate-700\"\n >\n Rotate -90°\n </button>\n <button\n type=\"button\"\n onClick={() => editor.rotate(90)}\n className=\"px-3 py-2 rounded-lg bg-slate-800 hover:bg-slate-700 text-slate-200 border border-slate-700\"\n >\n Rotate +90°\n </button>\n <button\n type=\"button\"\n onClick={() => editor.flipHorizontal()}\n className={`px-3 py-2 rounded-lg border transition-colors ${\n state.transform.flipH\n ? 'bg-indigo-600 border-indigo-500 text-white'\n : 'bg-slate-800 border-slate-700 text-slate-200 hover:bg-slate-700'\n }`}\n >\n Flip Horizontal\n </button>\n <button\n type=\"button\"\n onClick={() => editor.flipVertical()}\n className={`px-3 py-2 rounded-lg border transition-colors ${\n state.transform.flipV\n ? 'bg-indigo-600 border-indigo-500 text-white'\n : 'bg-slate-800 border-slate-700 text-slate-200 hover:bg-slate-700'\n }`}\n >\n Flip Vertical\n </button>\n </div>\n </div>\n )}\n\n {/* TAB 2: ADJUSTMENTS */}\n {activeTab === 'adjust' && (\n <div className=\"flex flex-col gap-3 text-xs\">\n <div className=\"flex items-center justify-between\">\n <span className=\"font-semibold text-slate-200 uppercase tracking-wider text-[11px]\">\n Color Adjustments\n </span>\n <button\n type=\"button\"\n onClick={() => editor.resetAdjustments()}\n className=\"text-[10px] text-rose-400 hover:underline\"\n >\n Reset Sliders\n </button>\n </div>\n\n <Histogram histogram={editor.histogram} />\n\n {IMAGE_ADJUSTMENT_CONTROLS.map((spec) => (\n <React.Fragment key={spec.id}>\n <ControlSlider\n spec={spec}\n value={readAdjustmentControls(state.adjustments)[spec.id]}\n disabled={spec.requiresProcess !== undefined && legacyProcess}\n onChange={(v) => editor.setAdjustments({ [spec.id]: v })}\n />\n {spec.id === 'tint' && legacyProcess && (\n <div\n className=\"flex items-center justify-between gap-2 rounded border border-amber-500/30 bg-amber-500/10 px-2 py-1.5 text-[10px] text-amber-200\"\n data-testid=\"image-editor-process-notice\"\n >\n <span>Legacy rendering (process 1). Tint needs the current process.</span>\n <button\n type=\"button\"\n onClick={() => editor.upgradeProcess()}\n className=\"shrink-0 rounded bg-amber-500/20 px-2 py-0.5 hover:bg-amber-500/30\"\n >\n Update\n </button>\n </div>\n )}\n </React.Fragment>\n ))}\n\n <div className=\"border-t border-slate-700/60 pt-3\">\n <AdjustmentLayersPanel\n controller={controller}\n layers={state.adjustments.layers}\n histogram={editor.histogram}\n />\n </div>\n </div>\n )}\n\n {/* TAB: LAYERS */}\n {activeTab === 'layers' && (\n <div className=\"flex flex-col gap-3 text-xs\">\n <span className=\"font-semibold text-slate-200 uppercase tracking-wider text-[11px]\">Layers</span>\n <button\n type=\"button\"\n title=\"Edit › Free Transform (Ctrl/Cmd+T): the selected pixels, or the whole active layer\"\n className=\"px-2 py-1 rounded text-[11px] bg-slate-800 text-slate-300 hover:text-white self-start disabled:opacity-40\"\n disabled={transformTool.active}\n onClick={() => transformTool.begin()}\n >\n Free Transform\n </button>\n <LayersPanel controller={controller} />\n {effectsShown && <ImageProviderEffectsPanel controller={controller} className=\"border-t border-slate-700/60 pt-3\" />}\n <span className=\"font-semibold text-slate-200 uppercase tracking-wider text-[11px]\">Colour</span>\n <ColorProfilePanel controller={controller} />\n </div>\n )}\n\n {/* TAB: PAINT */}\n {activeTab === 'paint' && (\n <div className=\"flex flex-col gap-3 text-xs\">\n <span className=\"font-semibold text-slate-200 uppercase tracking-wider text-[11px]\">Paint</span>\n <BrushOptionsBar controller={controller} />\n <button\n type=\"button\"\n title=\"Edit › Free Transform (Ctrl/Cmd+T): the selected pixels, or the whole active layer\"\n className=\"px-2 py-1 rounded text-[11px] bg-slate-800 text-slate-300 hover:text-white self-start\"\n disabled={transformTool.active}\n onClick={() => transformTool.begin()}\n >\n Free Transform\n </button>\n {paintError && (\n <p role=\"alert\" className=\"text-rose-400\" data-testid=\"paint-error\">\n {paintError}\n </p>\n )}\n <div className=\"border-t border-slate-700/60 pt-3\">\n <LayersPanel controller={controller} />\n </div>\n </div>\n )}\n\n {/* TAB 3: ANNOTATIONS */}\n {activeTab === 'annotate' && (\n <div className=\"flex flex-col gap-3 text-xs\">\n <span className=\"font-semibold text-slate-200 uppercase tracking-wider text-[11px]\">Shape & Type Layers</span>\n <div className=\"grid grid-cols-2 gap-1.5\">\n {(['shape', 'type'] as ImageEditorTool[]).map((t) => (\n <button\n key={t}\n type=\"button\"\n aria-pressed={state.activeTool === t}\n onClick={() => editor.setTool(t)}\n className={`py-1.5 px-2 rounded-lg font-medium border transition-colors ${\n state.activeTool === t ? 'bg-indigo-600 border-indigo-500 text-white' : 'bg-slate-800 border-slate-700 text-slate-300 hover:bg-slate-700'\n }`}\n >\n {t === 'shape' ? 'Shape' : 'Type'}\n </button>\n ))}\n </div>\n {state.activeTool === 'shape' && <ShapeOptionsBar controller={controller} options={shapeOptions} onChange={setShapeOptions} />}\n {state.activeTool === 'type' && (\n <TypeOptionsBar controller={controller} options={typeOptions} onChange={setTypeOptions} session={typeSession} />\n )}\n {state.activeTool === 'type' && typeSession && (\n <button type=\"button\" onClick={finishTyping} className=\"self-start rounded bg-slate-800 px-2 py-1 text-[11px] text-slate-200 hover:bg-slate-700\">\n Done editing text\n </button>\n )}\n {shapeTypeError && (\n <p role=\"alert\" className=\"text-rose-400\" data-testid=\"shape-type-error\">\n {shapeTypeError}\n </p>\n )}\n <div className=\"h-px bg-slate-800 my-1\" />\n\n <span className=\"font-semibold text-slate-200 uppercase tracking-wider text-[11px]\">\n Draw & Annotate\n </span>\n\n {/* Tool Picker */}\n <div className=\"grid grid-cols-3 gap-1.5\">\n {(['pen', 'rect', 'circle', 'arrow', 'line'] as ImageEditorTool[]).map((t) => (\n <button\n key={t}\n type=\"button\"\n onClick={() => editor.setTool(t)}\n className={`py-1.5 px-2 rounded-lg font-medium capitalize border transition-colors ${\n state.activeTool === t\n ? 'bg-indigo-600 border-indigo-500 text-white'\n : 'bg-slate-800 border-slate-700 text-slate-300 hover:bg-slate-700'\n }`}\n >\n {t}\n </button>\n ))}\n </div>\n\n {/* Color & Size */}\n <div className=\"flex items-center gap-2 mt-2\">\n <label className=\"text-slate-400\">Color:</label>\n <input\n type=\"color\"\n value={activeColor}\n onChange={(e) => setActiveColor(e.target.value)}\n className=\"w-8 h-8 rounded border border-slate-700 cursor-pointer bg-transparent\"\n />\n <div className=\"flex-1 ml-2\">\n <div className=\"flex justify-between text-slate-400 mb-0.5\">\n <span>Width:</span>\n <span className=\"font-mono\">{strokeWidth}px</span>\n </div>\n <input\n type=\"range\"\n min=\"1\"\n max=\"20\"\n value={strokeWidth}\n onChange={(e) => setStrokeWidth(Number(e.target.value))}\n className=\"w-full accent-indigo-500\"\n />\n </div>\n </div>\n\n <div className=\"h-px bg-slate-800 my-1\" />\n\n {/* Text Tool */}\n <span className=\"font-semibold text-slate-200 uppercase tracking-wider text-[11px]\">Add Text</span>\n <div className=\"flex gap-2\">\n <input\n type=\"text\"\n placeholder=\"Type watermark or label...\"\n value={textInput}\n onChange={(e) => setTextInput(e.target.value)}\n onKeyDown={(e) => e.key === 'Enter' && handleAddText()}\n className=\"flex-1 bg-slate-950 border border-slate-700 rounded-lg px-2.5 py-1.5 text-xs text-slate-100 placeholder-slate-500 focus:outline-none focus:border-indigo-500\"\n />\n <button\n type=\"button\"\n onClick={handleAddText}\n className=\"px-3 py-1.5 rounded-lg bg-indigo-600 hover:bg-indigo-500 text-white font-medium shadow\"\n >\n Add\n </button>\n </div>\n <div className=\"flex items-center justify-between text-slate-400\">\n <span>Font Size:</span>\n <span className=\"font-mono\">{fontSize}px</span>\n </div>\n <input\n type=\"range\"\n min=\"12\"\n max=\"72\"\n value={fontSize}\n onChange={(e) => setFontSize(Number(e.target.value))}\n className=\"w-full accent-indigo-500\"\n />\n\n {/* Layers & Selected Annotation */}\n <div className=\"h-px bg-slate-800 my-1\" />\n <div className=\"flex items-center justify-between\">\n <span className=\"text-slate-400\">Layers ({state.annotations.length})</span>\n {state.selectedAnnotationId && (\n <button\n type=\"button\"\n onClick={() => editor.removeAnnotation(state.selectedAnnotationId!)}\n className=\"text-rose-400 hover:underline text-[11px]\"\n >\n Delete Selected\n </button>\n )}\n {state.annotations.length > 0 && (\n <button\n type=\"button\"\n onClick={() => editor.clearAnnotations()}\n className=\"text-slate-400 hover:text-slate-200 text-[11px]\"\n >\n Clear All\n </button>\n )}\n </div>\n </div>\n )}\n\n {/* TAB 4: GLEAMFORGE DEPTH MASKING */}\n {activeTab === 'depth' && (\n <div className=\"flex flex-col gap-3 text-xs\">\n <div className=\"flex items-center justify-between\">\n <span className=\"font-semibold text-slate-200 uppercase tracking-wider text-[11px]\">\n Depth Masking\n </span>\n <button\n type=\"button\"\n onClick={() => editor.resetDepthMask()}\n className=\"text-[10px] text-rose-400 hover:underline\"\n >\n Reset Mask\n </button>\n </div>\n\n <label className=\"flex items-center gap-2 cursor-pointer text-slate-300\">\n <input\n type=\"checkbox\"\n checked={state.depthMask.enabled}\n onChange={(e) => editor.setDepthMask({ enabled: e.target.checked })}\n className=\"rounded accent-indigo-500\"\n />\n <span>Enable Depth / Alpha Mask</span>\n </label>\n\n {state.depthMask.enabled && (\n <>\n <div>\n <label className=\"text-slate-400 block mb-1\">Mask Image URL:</label>\n <input\n type=\"text\"\n placeholder=\"https://.../depthmap.png\"\n value={state.depthMask.maskSource || ''}\n onChange={(e) => editor.setDepthMask({ maskSource: e.target.value || null })}\n className=\"w-full bg-slate-950 border border-slate-700 rounded-lg px-2.5 py-1.5 text-xs text-slate-100 placeholder-slate-500\"\n />\n </div>\n\n <div className=\"flex gap-2\">\n <button\n type=\"button\"\n onClick={() => editor.setDepthMask({ mode: 'threshold' })}\n className={`flex-1 py-1.5 rounded-lg border text-xs font-medium ${\n state.depthMask.mode === 'threshold'\n ? 'bg-indigo-600 border-indigo-500 text-white'\n : 'bg-slate-800 border-slate-700 text-slate-300'\n }`}\n >\n Threshold Mode\n </button>\n <button\n type=\"button\"\n onClick={() => editor.setDepthMask({ mode: 'brightness' })}\n className={`flex-1 py-1.5 rounded-lg border text-xs font-medium ${\n state.depthMask.mode === 'brightness'\n ? 'bg-indigo-600 border-indigo-500 text-white'\n : 'bg-slate-800 border-slate-700 text-slate-300'\n }`}\n >\n Brightness Mode\n </button>\n </div>\n\n <div>\n <div className=\"flex justify-between text-slate-400 mb-1\">\n <span>Depth Start (Lower):</span>\n <span className=\"font-mono\">{state.depthMask.depthRange[0]}</span>\n </div>\n <input\n type=\"range\"\n min=\"0\"\n max=\"255\"\n value={state.depthMask.depthRange[0]}\n onChange={(e) =>\n editor.setDepthMask({\n depthRange: [Number(e.target.value), state.depthMask.depthRange[1]],\n })\n }\n className=\"w-full accent-indigo-500\"\n />\n </div>\n\n <div>\n <div className=\"flex justify-between text-slate-400 mb-1\">\n <span>Depth Stop (Upper):</span>\n <span className=\"font-mono\">{state.depthMask.depthRange[1]}</span>\n </div>\n <input\n type=\"range\"\n min=\"0\"\n max=\"255\"\n value={state.depthMask.depthRange[1]}\n onChange={(e) =>\n editor.setDepthMask({\n depthRange: [state.depthMask.depthRange[0], Number(e.target.value)],\n })\n }\n className=\"w-full accent-indigo-500\"\n />\n </div>\n\n <div>\n <div className=\"flex justify-between text-slate-400 mb-1\">\n <span>Softness:</span>\n <span className=\"font-mono\">{state.depthMask.softness}</span>\n </div>\n <input\n type=\"range\"\n min=\"1\"\n max=\"50\"\n value={state.depthMask.softness}\n onChange={(e) => editor.setDepthMask({ softness: Number(e.target.value) })}\n className=\"w-full accent-indigo-500\"\n />\n </div>\n\n <label className=\"flex items-center gap-2 cursor-pointer text-slate-300 mt-1\">\n <input\n type=\"checkbox\"\n checked={state.depthMask.invert}\n onChange={(e) => editor.setDepthMask({ invert: e.target.checked })}\n className=\"rounded accent-indigo-500\"\n />\n <span>Invert Mask</span>\n </label>\n </>\n )}\n </div>\n )}\n\n {/* SELECT & MASK: selection tools, refine edge, layer masks */}\n {activeTab === 'select' && (\n <div className=\"flex flex-col gap-4 text-xs\">\n <SelectionOptionsBar\n controller={controller}\n options={selectionOptions}\n onOptionsChange={setSelectionOptions}\n selection={state.selection ?? null}\n quickMask={Boolean(state.quickMask)}\n />\n {selectionError && (\n <p role=\"alert\" className=\"text-rose-400\">\n {selectionError}\n </p>\n )}\n <div className=\"flex gap-1\">\n <button\n type=\"button\"\n title=\"Select › Transform Selection: the outline only\"\n className=\"px-2 py-1 rounded text-[11px] bg-slate-800 text-slate-300 hover:text-white self-start disabled:opacity-40\"\n disabled={transformTool.active}\n onClick={() => transformTool.begin({ content: 'selection-outline' })}\n >\n Transform Selection\n </button>\n <button\n type=\"button\"\n title=\"Edit › Free Transform: the selected pixels of the active layer\"\n className=\"px-2 py-1 rounded text-[11px] bg-slate-800 text-slate-300 hover:text-white self-start disabled:opacity-40\"\n disabled={transformTool.active}\n onClick={() => transformTool.begin({ content: 'selection' })}\n >\n Free Transform Pixels\n </button>\n </div>\n <RefineEdgePanel controller={controller} selection={state.selection ?? null} layers={state.adjustments.layers} />\n </div>\n )}\n\n {/* TAB 5: AI TOOLS / INPAINTING & BACKGROUND REMOVAL */}\n {activeTab === 'ai' && (\n <div className=\"flex flex-col gap-4 text-xs\">\n <label className=\"flex items-center justify-between gap-2 text-slate-300\">\n <span>Results go to</span>\n <select\n aria-label=\"AI result target\"\n value={aiTarget}\n onChange={(e) => setAiTarget(e.target.value as typeof aiTarget)}\n className=\"bg-slate-800 border border-slate-700 rounded px-1.5 py-1\"\n >\n <option value=\"auto\">{controller.isMultiLayer ? 'Auto (new layer)' : 'Auto (replace image)'}</option>\n <option value=\"new-layer\">New layer / mask</option>\n <option value=\"replace\">Replace image</option>\n </select>\n </label>\n {/* Background Removal Section */}\n <div className=\"p-3 rounded-lg bg-slate-950/60 border border-slate-800 flex flex-col gap-2.5\">\n <div className=\"flex items-center justify-between\">\n <span className=\"font-semibold text-slate-200 uppercase tracking-wider text-[11px] flex items-center gap-1.5\">\n <svg className=\"w-3.5 h-3.5 text-indigo-400\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <path d=\"M6 3v12M18 9a3 3 0 1 0 0-6 3 3 0 0 0 0 6zM6 21a3 3 0 1 0 0-6 3 3 0 0 0 0 6z\" />\n </svg>\n Background Removal\n </span>\n {isRemovingBg && (\n <span className=\"inline-flex items-center px-1.5 py-0.5 rounded text-[10px] font-medium bg-indigo-900/60 text-indigo-300 animate-pulse\">\n Removing...\n </span>\n )}\n </div>\n\n <p className=\"text-slate-400 text-[11px] leading-relaxed\">\n Isolate foreground subject with AI alpha transparency segmentation.\n </p>\n\n <button\n type=\"button\"\n onClick={handleRemoveBackground}\n disabled={isRemovingBg || isInpainting}\n className=\"mt-1 px-3 py-2 rounded-lg bg-indigo-600 hover:bg-indigo-500 disabled:opacity-50 text-white font-medium shadow transition-colors flex items-center justify-center gap-2\"\n >\n {isRemovingBg ? (\n <>\n <div className=\"w-3.5 h-3.5 border-2 border-white/30 border-t-white rounded-full animate-spin\" />\n Removing Background...\n </>\n ) : (\n <>\n <svg className=\"w-3.5 h-3.5\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <path d=\"M12 2v4M12 18v4M4.93 4.93l2.83 2.83M16.24 16.24l2.83 2.83M2 12h4M18 12h4M4.93 19.07l2.83-2.83M16.24 7.76l2.83-2.83\" />\n </svg>\n Remove Background\n </>\n )}\n </button>\n </div>\n\n {/* AI Inpainting / Generative Fill Section */}\n <div className=\"p-3 rounded-lg bg-slate-950/60 border border-slate-800 flex flex-col gap-2.5\">\n <div className=\"flex items-center justify-between\">\n <span className=\"font-semibold text-slate-200 uppercase tracking-wider text-[11px] flex items-center gap-1.5\">\n <svg className=\"w-3.5 h-3.5 text-purple-400\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <path d=\"m21.64 3.64-1.28-1.28a1.2 1.2 0 0 0-1.7 0l-9.72 9.72-1.94 4.86 4.86-1.94 9.72-9.72a1.2 1.2 0 0 0 .06-1.64z\" />\n <path d=\"m14 7 3 3\" />\n </svg>\n Generative Inpainting\n </span>\n {isInpainting && (\n <span className=\"inline-flex items-center px-1.5 py-0.5 rounded text-[10px] font-medium bg-purple-900/60 text-purple-300 animate-pulse\">\n Inpainting...\n </span>\n )}\n </div>\n\n <p className=\"text-slate-400 text-[11px] leading-relaxed\">\n Replace, modify, or fill selected regions using prompt-guided generative inpainting.\n </p>\n\n <div className=\"flex flex-col gap-1\">\n <label htmlFor=\"ai-inpaint-prompt-react\" className=\"text-slate-300 text-[11px] font-medium\">Prompt</label>\n <textarea\n id=\"ai-inpaint-prompt-react\"\n value={inpaintPrompt}\n onChange={(e) => setInpaintPrompt(e.target.value)}\n placeholder=\"e.g. replace sunglasses with steampunk goggles, remove person in background...\"\n rows={3}\n className=\"w-full bg-slate-900 border border-slate-700 rounded-lg p-2 text-xs text-slate-100 placeholder-slate-500 focus:outline-none focus:border-indigo-500 resize-none\"\n />\n </div>\n\n <div className=\"flex flex-col gap-1\">\n <span className=\"text-slate-300 text-[11px] font-medium\">Target Mask Region</span>\n <div className=\"grid grid-cols-2 gap-1.5\">\n <button\n type=\"button\"\n onClick={() => setInpaintMaskMode('annotations')}\n className={`px-2 py-1.5 rounded border text-[11px] font-medium text-left transition-colors ${\n inpaintMaskMode === 'annotations'\n ? 'bg-purple-600/30 border-purple-500 text-purple-200'\n : 'bg-slate-900 border-slate-700 text-slate-400 hover:text-slate-200'\n }`}\n >\n Drawn Shapes ({state.annotations.length})\n </button>\n <button\n type=\"button\"\n onClick={() => setInpaintMaskMode('crop')}\n className={`px-2 py-1.5 rounded border text-[11px] font-medium text-left transition-colors ${\n inpaintMaskMode === 'crop'\n ? 'bg-purple-600/30 border-purple-500 text-purple-200'\n : 'bg-slate-900 border-slate-700 text-slate-400 hover:text-slate-200'\n }`}\n >\n Crop Box ({state.crop ? 'Selected' : 'Full'})\n </button>\n </div>\n </div>\n\n <button\n type=\"button\"\n onClick={handleInpaint}\n disabled={isInpainting || isRemovingBg || !inpaintPrompt.trim()}\n className=\"mt-1 px-3 py-2 rounded-lg bg-purple-600 hover:bg-purple-500 disabled:opacity-50 text-white font-medium shadow transition-colors flex items-center justify-center gap-2\"\n >\n {isInpainting ? (\n <>\n <div className=\"w-3.5 h-3.5 border-2 border-white/30 border-t-white rounded-full animate-spin\" />\n Generating Inpaint...\n </>\n ) : (\n <>\n <svg className=\"w-3.5 h-3.5\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <path d=\"M12 2v4M12 18v4M4.93 4.93l2.83 2.83M16.24 16.24l2.83 2.83M2 12h4M18 12h4M4.93 19.07l2.83-2.83M16.24 7.76l2.83-2.83\" />\n </svg>\n Apply Inpainting\n </>\n )}\n </button>\n </div>\n\n {aiError && (\n <div className=\"p-2.5 rounded-lg bg-rose-950/60 border border-rose-800 text-rose-300 text-[11px]\">\n {aiError}\n </div>\n )}\n\n {aiSuccess && (\n <div className=\"p-2.5 rounded-lg bg-emerald-950/60 border border-emerald-800 text-emerald-300 text-[11px]\">\n {aiSuccess}\n </div>\n )}\n </div>\n )}\n </div>\n </div>\n </div>\n );\n};\n","import React from 'react';\nimport type { ControlSpec } from '@pixerate/editor/image-editor';\nimport { controlTrackBackground, formatControlValue } from '@pixerate/editor/image-editor';\n\nexport interface ControlSliderProps {\n spec: ControlSpec;\n value: number;\n onChange: (value: number) => void;\n disabled?: boolean;\n /** Overrides `spec.label` (also the accessible name). */\n label?: string;\n}\n\n/** A labelled range input described by a control-table entry. */\nexport const ControlSlider: React.FC<ControlSliderProps> = ({ spec, value, onChange, disabled, label }) => {\n const name = label ?? spec.label;\n const track = controlTrackBackground(spec);\n return (\n <div data-control-id={spec.id}>\n <div className=\"flex justify-between text-slate-400 mb-1\">\n <span>{name}</span>\n <span className=\"font-mono\">{formatControlValue(spec, value)}</span>\n </div>\n <input\n type=\"range\"\n min={spec.min}\n max={spec.max}\n step={spec.step}\n aria-label={name}\n disabled={disabled}\n value={value}\n onChange={(e) => onChange(Number(e.target.value))}\n className=\"w-full accent-indigo-500 disabled:opacity-40\"\n />\n {track && <div className=\"h-0.5 rounded-full opacity-70\" style={{ background: track }} />}\n </div>\n );\n};\n","import React, { useEffect, useMemo, useState } from 'react';\nimport type { ImageEditorController, ImageHistogram } from '@pixerate/editor/image-editor';\nimport { histogramPath } from '@pixerate/editor/image-editor';\n\nexport interface HistogramProps {\n histogram: ImageHistogram | null;\n /** `rgb` overlays the three channels on the luminance; a single channel draws just that one. */\n channel?: 'rgb' | 'luminance' | 'red' | 'green' | 'blue';\n height?: number;\n className?: string;\n style?: React.CSSProperties;\n}\n\nconst FILL: Record<'luminance' | 'red' | 'green' | 'blue', string> = {\n luminance: 'rgba(148, 163, 184, 0.45)',\n red: 'rgba(239, 68, 68, 0.45)',\n green: 'rgba(34, 197, 94, 0.45)',\n blue: 'rgba(59, 130, 246, 0.45)',\n};\n\nconst W = 256;\n\n/** SVG histogram of an image (see `computeHistogram` / `controller.subscribeHistogram`). */\nexport const Histogram: React.FC<HistogramProps> = ({ histogram, channel = 'rgb', height = 64, className = '', style }) => {\n const channels = channel === 'rgb' ? (['luminance', 'red', 'green', 'blue'] as const) : ([channel] as const);\n const paths = useMemo(\n () => (histogram && histogram.samples > 0 ? channels.map((c) => ({ c, d: histogramPath(histogram, c, W, height) })) : []),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [histogram, channel, height]\n );\n const clipLow = histogram && histogram.samples ? Math.max(...histogram.shadows) / histogram.samples : 0;\n const clipHigh = histogram && histogram.samples ? Math.max(...histogram.highlights) / histogram.samples : 0;\n return (\n <svg\n viewBox={`0 0 ${W} ${height}`}\n preserveAspectRatio=\"none\"\n role=\"img\"\n aria-label={histogram ? `Histogram of ${histogram.samples} pixels` : 'Histogram (no data)'}\n data-testid=\"image-editor-histogram\"\n className={`w-full rounded bg-slate-950/60 ${className}`}\n style={{ height, ...style }}\n >\n {paths.map(({ c, d }) => (\n <path key={c} d={d} fill={FILL[c]} stroke=\"none\" />\n ))}\n {clipLow > 0.005 && <rect x={0} y={0} width={3} height={height} fill=\"#3b82f6\" data-testid=\"histogram-clip-shadows\" />}\n {clipHigh > 0.005 && <rect x={W - 3} y={0} width={3} height={height} fill=\"#ef4444\" data-testid=\"histogram-clip-highlights\" />}\n </svg>\n );\n};\n\n/** The preview histogram of an image editor, updated after every render. */\nexport function useImageHistogram(controller: ImageEditorController): ImageHistogram | null {\n const [histogram, setHistogram] = useState<ImageHistogram | null>(() => controller.getHistogram());\n useEffect(() => controller.subscribeHistogram(setHistogram), [controller]);\n return histogram;\n}\n","import React, { useEffect, useState } from 'react';\nimport type {\n AdjustmentKind,\n AdjustmentLayer,\n BlendMode,\n ControlSpec,\n CurvePoint,\n ImageEditorController,\n ImageHistogram,\n} from '@pixerate/editor/image-editor';\nimport {\n ADJUSTMENT_KINDS,\n ADJUSTMENT_LAYER_CONTROLS,\n ADJUSTMENT_LAYER_OPACITY_CONTROL,\n BLEND_MODES,\n HUE_RANGE_LABELS,\n adjustmentKindLabel,\n getControlPath,\n hueRangeWeight,\n setControlPath,\n} from '@pixerate/editor/image-editor';\nimport { ControlSlider } from './ControlSlider';\nimport { CurvesEditor } from './CurvesEditor';\n\nexport interface AdjustmentLayersPanelProps {\n controller: ImageEditorController;\n /** The current layers (`state.adjustments.layers`), bottom to top. Omit to follow the controller. */\n layers?: AdjustmentLayer[];\n histogram?: ImageHistogram | null;\n}\n\ntype Channel = 'master' | 'red' | 'green' | 'blue';\nconst CHANNELS: { id: Channel; label: string }[] = [\n { id: 'master', label: 'RGB' },\n { id: 'red', label: 'Red' },\n { id: 'green', label: 'Green' },\n { id: 'blue', label: 'Blue' },\n];\nconst TONES = [\n { id: 'shadows', label: 'Shadows' },\n { id: 'midtones', label: 'Midtones' },\n { id: 'highlights', label: 'Highlights' },\n] as const;\n\nconst selectClass = 'bg-slate-800 border border-slate-700 rounded px-1.5 py-1 text-slate-200';\nconst chipClass = (on: boolean) =>\n `px-2 py-0.5 rounded text-[10px] ${on ? 'bg-indigo-600 text-white' : 'bg-slate-800 text-slate-400 hover:text-slate-200'}`;\n\n/** Hue strip with the weight of one Hue/Saturation range drawn over it. */\nconst HueRangeStrip: React.FC<{ bounds: [number, number, number, number] }> = ({ bounds }) => {\n const pts = Array.from({ length: 73 }, (_, i) => `${(i / 72) * 360},${20 - hueRangeWeight({ bounds }, i * 5) * 18}`).join(' ');\n return (\n <svg viewBox=\"0 0 360 20\" preserveAspectRatio=\"none\" className=\"w-full h-4 rounded\" data-testid=\"hue-range-strip\">\n <defs>\n <linearGradient id=\"pixerate-hue-strip\">\n {[0, 60, 120, 180, 240, 300, 360].map((h) => (\n <stop key={h} offset={`${(h / 360) * 100}%`} stopColor={`hsl(${h}, 90%, 50%)`} />\n ))}\n </linearGradient>\n </defs>\n <rect width={360} height={20} fill=\"url(#pixerate-hue-strip)\" opacity={0.6} />\n <polyline points={pts} fill=\"none\" stroke=\"#fff\" strokeWidth={1.5} />\n </svg>\n );\n};\n\n/**\n * Adjustment-layer stack: add, reorder, show / hide and remove layers, and edit the selected\n * one (curves over the histogram, levels, hue/saturation ranges, colour balance, …).\n */\nexport const AdjustmentLayersPanel: React.FC<AdjustmentLayersPanelProps> = ({ controller, layers: layersProp, histogram }) => {\n // Follows the controller when no `layers` prop is given.\n const follow = layersProp === undefined;\n const [, setTick] = useState(0);\n useEffect(() => (follow ? controller.subscribe(() => setTick((n) => n + 1)) : undefined), [controller, follow]);\n const layers = layersProp ?? controller.getAdjustmentLayers();\n const [newKind, setNewKind] = useState<AdjustmentKind>('curves');\n const [selectedId, setSelectedId] = useState<string | null>(null);\n const [channel, setChannel] = useState<Channel>('master');\n const [range, setRange] = useState<number>(-1);\n const [tone, setTone] = useState<(typeof TONES)[number]['id']>('midtones');\n\n const selected = layers.find((l) => l.id === selectedId) ?? null;\n const topFirst = [...layers].reverse();\n\n const setParam = (layer: AdjustmentLayer, path: string, value: unknown, commit = true) =>\n controller.updateAdjustmentLayer(layer.id, { params: setControlPath(layer.params, path, value) as never }, commit);\n\n const slider = (layer: AdjustmentLayer, spec: ControlSpec, label?: string) => (\n <ControlSlider\n key={spec.id}\n spec={spec}\n label={label}\n value={Number(getControlPath(layer.params, spec.id) ?? spec.default)}\n onChange={(v) => setParam(layer, spec.id, v)}\n />\n );\n const controlsOf = (layer: AdjustmentLayer, filter: (spec: ControlSpec) => boolean = () => true) =>\n ADJUSTMENT_LAYER_CONTROLS[layer.kind].filter(filter);\n const checkbox = (layer: AdjustmentLayer, path: string, label: string) => (\n <label className=\"flex items-center gap-2 text-slate-300\">\n <input\n type=\"checkbox\"\n checked={Boolean(getControlPath(layer.params, path))}\n onChange={(e) => setParam(layer, path, e.target.checked)}\n className=\"accent-indigo-500\"\n />\n {label}\n </label>\n );\n\n const editor = (layer: AdjustmentLayer) => {\n switch (layer.kind) {\n case 'curves':\n return (\n <div className=\"flex flex-col gap-2\">\n <div className=\"flex gap-1\" role=\"group\" aria-label=\"Curve channel\">\n {CHANNELS.map((c) => (\n <button key={c.id} type=\"button\" className={chipClass(channel === c.id)} onClick={() => setChannel(c.id)}>\n {c.label}\n </button>\n ))}\n </div>\n <CurvesEditor\n points={layer.params[channel]}\n channel={channel}\n histogram={histogram}\n onChange={(points: CurvePoint[], commit) => setParam(layer, channel, points, commit)}\n />\n </div>\n );\n case 'levels':\n return (\n <div className=\"flex flex-col gap-2\">\n <div className=\"flex gap-1\" role=\"group\" aria-label=\"Levels channel\">\n {CHANNELS.map((c) => (\n <button key={c.id} type=\"button\" className={chipClass(channel === c.id)} onClick={() => setChannel(c.id)}>\n {c.label}\n </button>\n ))}\n </div>\n {controlsOf(layer, (s) => s.id.startsWith(`${channel}.`)).map((s) => slider(layer, s))}\n </div>\n );\n case 'hueSaturation':\n return (\n <div className=\"flex flex-col gap-2\">\n <div className=\"flex flex-wrap gap-1\" role=\"group\" aria-label=\"Hue range\">\n <button type=\"button\" className={chipClass(range === -1)} onClick={() => setRange(-1)}>\n Master\n </button>\n {HUE_RANGE_LABELS.map((name, i) => (\n <button key={name} type=\"button\" className={chipClass(range === i)} onClick={() => setRange(i)} disabled={layer.params.colorize}>\n {name}\n </button>\n ))}\n </div>\n {range >= 0 && !layer.params.colorize && <HueRangeStrip bounds={layer.params.ranges[range].bounds} />}\n {controlsOf(layer, (s) => (range === -1 || layer.params.colorize ? !s.id.startsWith('ranges.') : s.id.startsWith(`ranges.${range}.`))).map((s) =>\n slider(layer, s)\n )}\n {range === -1 && checkbox(layer, 'colorize', 'Colorize')}\n </div>\n );\n case 'colorBalance':\n return (\n <div className=\"flex flex-col gap-2\">\n <div className=\"flex gap-1\" role=\"group\" aria-label=\"Tone\">\n {TONES.map((t) => (\n <button key={t.id} type=\"button\" className={chipClass(tone === t.id)} onClick={() => setTone(t.id)}>\n {t.label}\n </button>\n ))}\n </div>\n {controlsOf(layer, (s) => s.id.startsWith(`${tone}.`)).map((s) => slider(layer, s))}\n {checkbox(layer, 'preserveLuminosity', 'Preserve luminosity')}\n </div>\n );\n case 'blackWhite':\n return (\n <div className=\"flex flex-col gap-2\">\n {controlsOf(layer).map((s) => slider(layer, s))}\n <label className=\"flex items-center gap-2 text-slate-300\">\n <input\n type=\"checkbox\"\n checked={layer.params.tint !== null}\n onChange={(e) => setParam(layer, 'tint', e.target.checked ? '#e1d3b3' : null)}\n className=\"accent-indigo-500\"\n />\n Tint\n {layer.params.tint && (\n <input\n type=\"color\"\n aria-label=\"Tint colour\"\n value={layer.params.tint}\n onChange={(e) => setParam(layer, 'tint', e.target.value)}\n className=\"h-5 w-8 bg-transparent\"\n />\n )}\n </label>\n </div>\n );\n case 'photoFilter':\n return (\n <div className=\"flex flex-col gap-2\">\n <label className=\"flex items-center gap-2 text-slate-300\">\n Filter colour\n <input\n type=\"color\"\n aria-label=\"Filter colour\"\n value={layer.params.color}\n onChange={(e) => setParam(layer, 'color', e.target.value)}\n className=\"h-5 w-8 bg-transparent\"\n />\n </label>\n {controlsOf(layer).map((s) => slider(layer, s))}\n {checkbox(layer, 'preserveLuminosity', 'Preserve luminosity')}\n </div>\n );\n case 'invert':\n return <p className=\"text-slate-500 text-[11px]\">Invert has no settings.</p>;\n default:\n return <div className=\"flex flex-col gap-2\">{controlsOf(layer).map((s) => slider(layer, s))}</div>;\n }\n };\n\n return (\n <div className=\"flex flex-col gap-2 text-xs\" data-testid=\"adjustment-layers-panel\">\n <div className=\"flex items-center justify-between\">\n <span className=\"font-semibold text-slate-200 uppercase tracking-wider text-[11px]\">Adjustment Layers</span>\n </div>\n <div className=\"flex gap-1.5\">\n <select\n aria-label=\"New adjustment layer kind\"\n className={`${selectClass} flex-1`}\n value={newKind}\n onChange={(e) => setNewKind(e.target.value as AdjustmentKind)}\n >\n {ADJUSTMENT_KINDS.map((k) => (\n <option key={k.kind} value={k.kind}>\n {k.label}\n </option>\n ))}\n </select>\n <button\n type=\"button\"\n className=\"px-2 py-1 rounded bg-indigo-600 text-white hover:bg-indigo-500\"\n onClick={() => {\n setSelectedId(controller.addAdjustmentLayer(newKind));\n setChannel('master');\n setRange(-1);\n }}\n >\n Add Layer\n </button>\n </div>\n\n {topFirst.length > 0 && (\n <ul className=\"flex flex-col gap-1\" aria-label=\"Adjustment layers\">\n {topFirst.map((layer) => {\n const index = layers.indexOf(layer);\n const label = layer.name || adjustmentKindLabel(layer.kind);\n return (\n <li\n key={layer.id}\n className={`flex items-center gap-1.5 rounded px-1.5 py-1 ${layer.id === selectedId ? 'bg-indigo-600/20 ring-1 ring-indigo-500/50' : 'bg-slate-800/60'}`}\n >\n <input\n type=\"checkbox\"\n aria-label={`Show ${label}`}\n checked={layer.enabled}\n onChange={() => controller.toggleAdjustmentLayer(layer.id)}\n className=\"accent-indigo-500\"\n />\n <button\n type=\"button\"\n className={`flex-1 text-left truncate ${layer.enabled ? 'text-slate-200' : 'text-slate-500 line-through'}`}\n onClick={() => setSelectedId(layer.id === selectedId ? null : layer.id)}\n aria-pressed={layer.id === selectedId}\n >\n {label}\n </button>\n <button\n type=\"button\"\n aria-label={`Move ${label} up`}\n disabled={index === layers.length - 1}\n onClick={() => controller.moveAdjustmentLayer(layer.id, index + 1)}\n className=\"px-1 text-slate-400 hover:text-slate-200 disabled:opacity-30\"\n >\n ↑\n </button>\n <button\n type=\"button\"\n aria-label={`Move ${label} down`}\n disabled={index === 0}\n onClick={() => controller.moveAdjustmentLayer(layer.id, index - 1)}\n className=\"px-1 text-slate-400 hover:text-slate-200 disabled:opacity-30\"\n >\n ↓\n </button>\n <button\n type=\"button\"\n aria-label={`Remove ${label}`}\n onClick={() => {\n controller.removeAdjustmentLayer(layer.id);\n if (selectedId === layer.id) setSelectedId(null);\n }}\n className=\"px-1 text-rose-400 hover:text-rose-300\"\n >\n ✕\n </button>\n </li>\n );\n })}\n </ul>\n )}\n\n {selected && (\n <div className=\"flex flex-col gap-2 rounded border border-slate-700/60 p-2\" data-testid=\"adjustment-layer-editor\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-slate-400\">Blend</span>\n <select\n aria-label=\"Blend mode\"\n className={`${selectClass} flex-1`}\n value={selected.blend}\n onChange={(e) => controller.updateAdjustmentLayer(selected.id, { blend: e.target.value as BlendMode })}\n >\n {BLEND_MODES.map((m) => (\n <option key={m.id} value={m.id}>\n {m.label}\n </option>\n ))}\n </select>\n </div>\n <ControlSlider\n spec={ADJUSTMENT_LAYER_OPACITY_CONTROL}\n label=\"Layer opacity\"\n value={selected.opacity}\n onChange={(v) => controller.updateAdjustmentLayer(selected.id, { opacity: v })}\n />\n {editor(selected)}\n </div>\n )}\n </div>\n );\n};\n","import React, { useRef, useState } from 'react';\nimport type { CurvePoint, ImageHistogram } from '@pixerate/editor/image-editor';\nimport {\n boxToCurvePoint,\n curvePointToBox,\n curveSvgPath,\n hitTestCurvePoint,\n histogramPath,\n insertCurvePoint,\n moveCurvePoint,\n removeCurvePoint,\n} from '@pixerate/editor/image-editor';\n\nexport interface CurvesEditorProps {\n points: CurvePoint[];\n /** `commit` is true for the first change of a gesture (one undo step), false for the drag moves. */\n onChange: (points: CurvePoint[], commit: boolean) => void;\n histogram?: ImageHistogram | null;\n channel?: 'master' | 'red' | 'green' | 'blue';\n size?: number;\n}\n\nconst BOX = 256;\nconst STROKE = { master: '#e2e8f0', red: '#ef4444', green: '#22c55e', blue: '#3b82f6' };\n\n/**\n * Curves editor over the histogram: click to add a point, drag to move it, double-click to\n * remove it.\n */\nexport const CurvesEditor: React.FC<CurvesEditorProps> = ({ points, onChange, histogram, channel = 'master', size = 200 }) => {\n const svgRef = useRef<SVGSVGElement>(null);\n const [drag, setDrag] = useState<number | null>(null);\n\n const toBox = (e: React.PointerEvent | React.MouseEvent) => {\n const rect = svgRef.current?.getBoundingClientRect();\n if (!rect || !rect.width || !rect.height) return { x: 0, y: 0 };\n return { x: ((e.clientX - rect.left) / rect.width) * BOX, y: ((e.clientY - rect.top) / rect.height) * BOX };\n };\n\n const onPointerDown = (e: React.PointerEvent) => {\n const { x, y } = toBox(e);\n let index = hitTestCurvePoint(points, x, y, BOX, BOX, 10);\n if (index === -1) {\n const inserted = insertCurvePoint(points, boxToCurvePoint(x, y, BOX, BOX));\n onChange(inserted.points, true);\n index = inserted.index;\n } else {\n onChange(points, true);\n }\n setDrag(index);\n (e.target as Element).setPointerCapture?.(e.pointerId);\n };\n\n const onPointerMove = (e: React.PointerEvent) => {\n if (drag === null) return;\n onChange(moveCurvePoint(points, drag, boxToCurvePoint(toBox(e).x, toBox(e).y, BOX, BOX)), false);\n };\n\n const onDoubleClick = (e: React.MouseEvent) => {\n const { x, y } = toBox(e);\n const index = hitTestCurvePoint(points, x, y, BOX, BOX, 10);\n if (index !== -1 && points.length > 2) onChange(removeCurvePoint(points, index), true);\n };\n\n const histChannel = channel === 'master' ? 'luminance' : channel;\n return (\n <svg\n ref={svgRef}\n viewBox={`0 0 ${BOX} ${BOX}`}\n width={size}\n height={size}\n role=\"application\"\n aria-label={`${channel} curve`}\n data-testid=\"curves-editor\"\n className=\"rounded bg-slate-950/70 touch-none select-none cursor-crosshair\"\n onPointerDown={onPointerDown}\n onPointerMove={onPointerMove}\n onPointerUp={() => setDrag(null)}\n onPointerCancel={() => setDrag(null)}\n onDoubleClick={onDoubleClick}\n >\n {histogram && histogram.samples > 0 && (\n <path d={histogramPath(histogram, histChannel, BOX, BOX)} fill=\"rgba(148, 163, 184, 0.25)\" />\n )}\n {[64, 128, 192].map((v) => (\n <g key={v} stroke=\"rgba(148, 163, 184, 0.2)\" strokeWidth={1}>\n <line x1={v} y1={0} x2={v} y2={BOX} />\n <line x1={0} y1={v} x2={BOX} y2={v} />\n </g>\n ))}\n <line x1={0} y1={BOX} x2={BOX} y2={0} stroke=\"rgba(148, 163, 184, 0.35)\" strokeDasharray=\"4 4\" />\n <path d={curveSvgPath(points, BOX, BOX)} fill=\"none\" stroke={STROKE[channel]} strokeWidth={2} />\n {points.map((p, i) => {\n const b = curvePointToBox(p, BOX, BOX);\n return (\n <circle\n key={i}\n cx={b.x}\n cy={b.y}\n r={5}\n fill={drag === i ? STROKE[channel] : '#0f172a'}\n stroke={STROKE[channel]}\n strokeWidth={2}\n aria-label={`Point ${p.input} to ${p.output}`}\n />\n );\n })}\n </svg>\n );\n};\n","import React, { useEffect, useRef, useState } from 'react';\nimport type { ImageEditorController, ImageLayer, LayerMenuAction, LayerPanelRow, PixelBuffer } from '@pixerate/editor/image-editor';\nimport { LayerEffectsPanel } from './LayerEffectsPanel';\nimport {\n BIT_DEPTH_OPTIONS,\n BLEND_MODES,\n PSD_FILE_ACCEPT,\n downloadPsd,\n dropPlacement,\n dropZone,\n openPsdFile,\n layerBadge,\n layerHasThumbnail,\n layerWarning,\n layerEffectsBadge,\n layerMenu,\n layerPanelRows,\n runLayerMenuAction,\n} from '@pixerate/editor/image-editor';\n\nexport interface LayersPanelProps {\n controller: ImageEditorController;\n /** Thumbnail size in px (default 32). */\n thumbnailSize?: number;\n /** Show Open PSD / Export PSD (default true). */\n psd?: boolean;\n /** Base name of exported PSD files (default `image`). */\n psdFileName?: string;\n /** Show the active layer's effects section (default true). */\n effects?: boolean;\n className?: string;\n}\n\nconst iconButton = 'px-1.5 py-0.5 rounded text-[10px] bg-slate-800 text-slate-300 hover:text-white disabled:opacity-40';\nconst rowClass = (active: boolean) =>\n `flex items-center gap-1.5 px-1.5 py-1 rounded cursor-pointer select-none ${active ? 'bg-indigo-600/30 ring-1 ring-indigo-500' : 'hover:bg-slate-800'}`;\n\n/** Draws a thumbnail (RGBA pixels) into a small canvas; nothing without a 2D context. */\nconst Thumbnail: React.FC<{ pixels: PixelBuffer | null; size: number; label: string; onClick?: (e: React.MouseEvent) => void; selected?: boolean; testId?: string }> = ({\n pixels,\n size,\n label,\n onClick,\n selected,\n testId,\n}) => {\n const ref = useRef<HTMLCanvasElement>(null);\n useEffect(() => {\n const canvas = ref.current;\n const ctx = canvas?.getContext('2d');\n if (!canvas || !ctx || !pixels || typeof ctx.createImageData !== 'function') return;\n canvas.width = pixels.width;\n canvas.height = pixels.height;\n const img = ctx.createImageData(pixels.width, pixels.height);\n img.data.set(pixels.data as ArrayLike<number>);\n ctx.putImageData(img, 0, 0);\n }, [pixels]);\n return (\n <canvas\n ref={ref}\n role={onClick ? 'button' : 'img'}\n aria-label={label}\n data-testid={testId}\n onClick={onClick}\n style={{ width: size, height: size }}\n className={`shrink-0 rounded bg-[repeating-conic-gradient(#334155_0%_25%,#1e293b_0%_50%)] [background-size:8px_8px] object-contain ${selected ? 'ring-2 ring-white' : 'ring-1 ring-slate-700'}`}\n />\n );\n};\n\n/**\n * The layer stack, top first: visibility, thumbnails, names (double-click to rename), locks,\n * mask thumbnails (click to paint the mask, Shift-click to disable it), drag to reorder or drop\n * into a group, opacity / fill / blend / clipping for the active layer, and the layer menu\n * (right-click a row, or the ⋯ button), an fx badge on rows with effects (click to switch them\n * on or off) and the active layer's effects. Every action is one undo step on the controller.\n */\nexport const LayersPanel: React.FC<LayersPanelProps> = ({ controller, thumbnailSize = 32, psd = true, psdFileName = 'image', effects = true, className }) => {\n const [, setTick] = useState(0);\n useEffect(() => controller.subscribe(() => setTick((n) => n + 1)), [controller]);\n const [error, setError] = useState<string | null>(null);\n const [renaming, setRenaming] = useState<string | null>(null);\n const [menu, setMenu] = useState<{ x: number; y: number } | null>(null);\n const [drag, setDrag] = useState<string | null>(null);\n /** Warnings of the last PSD open or export. */\n const [psdNotes, setPsdNotes] = useState<string[]>([]);\n const fileInput = useRef<HTMLInputElement>(null);\n const psdTask = async (fn: () => Promise<string[]>) => {\n try {\n setError(null);\n setPsdNotes(await fn());\n } catch (err) {\n setError(err instanceof Error ? err.message : String(err));\n }\n };\n /** Whether the next slider change records an undo step (the first of a drag does, the rest replace it). */\n const commitNext = useRef(true);\n\n const state = controller.getState();\n const rows = layerPanelRows(state.layers, state.activeLayerId);\n const active = controller.getActiveLayer();\n\n const attempt = (fn: () => unknown) => {\n try {\n setError(null);\n fn();\n } catch (err) {\n setError(err instanceof Error ? err.message : String(err));\n }\n };\n const run = async (action: LayerMenuAction) => {\n setMenu(null);\n setError(await runLayerMenuAction(controller, action));\n };\n const prop = (key: 'opacity' | 'fillOpacity', value: number) =>\n attempt(() => {\n controller.setLayerProperties(active!.id, { [key]: value }, commitNext.current);\n commitNext.current = false;\n });\n const sliderEvents = {\n onPointerDown: () => (commitNext.current = true),\n onPointerUp: () => (commitNext.current = true),\n onKeyDown: () => (commitNext.current = true),\n };\n\n const onDrop = (e: React.DragEvent, row: LayerPanelRow) => {\n e.preventDefault();\n const id = e.dataTransfer.getData('text/x-pixerate-layer') || drag;\n setDrag(null);\n if (!id) return;\n const rect = (e.currentTarget as HTMLElement).getBoundingClientRect();\n const fraction = rect.height ? (e.clientY - rect.top) / rect.height : 0.5;\n const placement = dropPlacement(state.layers, id, row.layer.id, dropZone(fraction, row.layer.type === 'group'));\n if (placement) attempt(() => controller.moveLayer(id, placement));\n };\n\n const thumb = (layer: ImageLayer) => (layerHasThumbnail(layer) ? controller.getLayerThumbnail(layer.id, { maxSide: 64 }) : null);\n const maskThumb = (layer: ImageLayer) => (layer.mask && !layer.mask.source ? controller.getLayerThumbnail(layer.id, { maxSide: 64, mask: true }) : null);\n\n const locked = (layer: ImageLayer) => Boolean(layer.locks?.all || layer.locks?.pixels || layer.locks?.position || layer.locks?.transparency);\n\n return (\n <div className={`flex flex-col gap-2 text-xs text-slate-200 ${className ?? ''}`} data-testid=\"layers-panel\" onClick={() => menu && setMenu(null)}>\n <div className=\"flex flex-wrap items-center gap-1\" role=\"toolbar\" aria-label=\"Layer actions\">\n <button type=\"button\" className={iconButton} onClick={() => run('new-layer')}>New Layer</button>\n <button type=\"button\" className={iconButton} onClick={() => run('new-group')}>New Group</button>\n <button type=\"button\" className={iconButton} disabled={!active} onClick={() => run('duplicate')}>Duplicate</button>\n <button type=\"button\" className={iconButton} disabled={!active} onClick={() => run('add-mask')}>Add Mask</button>\n <button type=\"button\" className={iconButton} disabled={!active} onClick={() => run('delete')}>Delete</button>\n <button\n type=\"button\"\n className={iconButton}\n aria-label=\"Layer menu\"\n aria-haspopup=\"menu\"\n onClick={(e) => {\n e.stopPropagation();\n const r = (e.currentTarget as HTMLElement).getBoundingClientRect();\n setMenu(menu ? null : { x: r.left, y: r.bottom });\n }}\n >\n ⋯\n </button>\n <select\n aria-label=\"Bits per channel\"\n title=\"Image › Mode: bits per channel\"\n className=\"rounded bg-slate-800 px-1 py-0.5 text-[11px] text-slate-200\"\n value={controller.bitDepth}\n onChange={(e) => attempt(() => controller.setBitDepth(Number(e.target.value) as 8 | 16 | 32))}\n >\n {BIT_DEPTH_OPTIONS.map((o) => (\n <option key={o.depth} value={o.depth} title={o.title}>\n {o.label}\n </option>\n ))}\n </select>\n {psd && (\n <>\n <button type=\"button\" className={iconButton} onClick={() => fileInput.current?.click()}>Open PSD…</button>\n <button type=\"button\" className={iconButton} onClick={() => psdTask(async () => (await downloadPsd(controller, psdFileName)).warnings)}>Export PSD</button>\n <input\n ref={fileInput}\n type=\"file\"\n accept={PSD_FILE_ACCEPT}\n className=\"hidden\"\n data-testid=\"psd-file-input\"\n aria-label=\"Open a PSD file\"\n onChange={(e) => {\n const file = e.currentTarget.files?.[0];\n e.currentTarget.value = '';\n if (file) psdTask(() => openPsdFile(controller, file));\n }}\n />\n </>\n )}\n </div>\n {psdNotes.length > 0 && (\n <ul className=\"rounded bg-amber-900/30 text-amber-200 px-2 py-1 space-y-0.5\" data-testid=\"psd-warnings\" aria-label=\"PSD warnings\">\n {psdNotes.map((n) => (\n <li key={n}>{n}</li>\n ))}\n <li>\n <button type=\"button\" className=\"underline\" onClick={() => setPsdNotes([])}>Dismiss</button>\n </li>\n </ul>\n )}\n\n {active && (\n <div className=\"grid grid-cols-2 gap-x-2 gap-y-1 items-center\" data-testid=\"layer-properties\">\n <label className=\"flex flex-col gap-0.5\">\n <span className=\"text-slate-400\">Opacity {Math.round(active.opacity * 100)}%</span>\n <input\n type=\"range\"\n min={0}\n max={100}\n aria-label=\"Layer opacity\"\n value={Math.round(active.opacity * 100)}\n {...sliderEvents}\n onChange={(e) => prop('opacity', Number(e.target.value) / 100)}\n className=\"accent-indigo-500\"\n />\n </label>\n <label className=\"flex flex-col gap-0.5\">\n <span className=\"text-slate-400\">Fill {Math.round(((active.type === 'pixel' ? active.fillOpacity : undefined) ?? 1) * 100)}%</span>\n <input\n type=\"range\"\n min={0}\n max={100}\n aria-label=\"Layer fill\"\n disabled={active.type !== 'pixel'}\n value={Math.round(((active.type === 'pixel' ? active.fillOpacity : undefined) ?? 1) * 100)}\n {...sliderEvents}\n onChange={(e) => prop('fillOpacity', Number(e.target.value) / 100)}\n className=\"accent-indigo-500 disabled:opacity-40\"\n />\n </label>\n <select\n aria-label=\"Layer blend mode\"\n className=\"bg-slate-800 border border-slate-700 rounded px-1.5 py-1\"\n value={active.blend}\n onChange={(e) => attempt(() => controller.setLayerProperties(active.id, { blend: e.target.value as never }))}\n >\n {active.type === 'group' && <option value=\"pass-through\">Pass Through</option>}\n {BLEND_MODES.map((m) => (\n <option key={m.id} value={m.id}>{m.label}</option>\n ))}\n </select>\n <label className=\"flex items-center gap-1.5 text-slate-300\">\n <input\n type=\"checkbox\"\n aria-label=\"Clip to layer below\"\n checked={Boolean(active.clipped)}\n onChange={(e) => attempt(() => controller.setLayerProperties(active.id, { clipped: e.target.checked }))}\n className=\"accent-indigo-500\"\n />\n Clip to below\n </label>\n <div className=\"col-span-2 flex flex-wrap gap-2 text-slate-400\" role=\"group\" aria-label=\"Layer locks\">\n {(['pixels', 'transparency', 'position', 'all'] as const).map((k) => (\n <label key={k} className=\"flex items-center gap-1\">\n <input\n type=\"checkbox\"\n aria-label={`Lock ${k}`}\n checked={Boolean(active.locks?.[k])}\n onChange={(e) => attempt(() => controller.setLayerProperties(active.id, { locks: { ...active.locks, [k]: e.target.checked } }))}\n className=\"accent-indigo-500\"\n />\n {k}\n </label>\n ))}\n </div>\n </div>\n )}\n\n {effects && active && active.type !== 'adjustment' && <LayerEffectsPanel controller={controller} className=\"border-t border-slate-800 pt-1.5\" />}\n\n <ul className=\"flex flex-col gap-0.5\" role=\"tree\" aria-label=\"Layers\">\n {rows.map((row) => {\n const { layer } = row;\n return (\n <li\n key={layer.id}\n role=\"treeitem\"\n aria-selected={row.active}\n aria-level={row.depth + 1}\n data-layer-id={layer.id}\n draggable={!layer.locks?.all}\n onDragStart={(e) => {\n e.dataTransfer.setData('text/x-pixerate-layer', layer.id);\n setDrag(layer.id);\n }}\n onDragOver={(e) => e.preventDefault()}\n onDrop={(e) => onDrop(e, row)}\n tabIndex={0}\n onClick={() => attempt(() => controller.setActiveLayer(layer.id, 'pixels'))}\n onKeyDown={(e) => {\n if (e.target === e.currentTarget && (e.key === 'Enter' || e.key === ' ')) {\n e.preventDefault();\n attempt(() => controller.setActiveLayer(layer.id, 'pixels'));\n }\n }}\n onContextMenu={(e) => {\n e.preventDefault();\n controller.setActiveLayer(layer.id, state.activeLayerId === layer.id ? state.activeTarget : 'pixels');\n setMenu({ x: e.clientX, y: e.clientY });\n }}\n className={rowClass(row.active)}\n style={{ paddingLeft: 6 + row.depth * 14 }}\n >\n <button\n type=\"button\"\n aria-label={layer.visible ? `Hide ${row.label}` : `Show ${row.label}`}\n aria-pressed={layer.visible}\n className=\"w-4 text-center text-slate-300\"\n onClick={(e) => {\n e.stopPropagation();\n attempt(() => controller.setLayerProperties(layer.id, { visible: !layer.visible }));\n }}\n >\n {layer.visible ? '●' : '○'}\n </button>\n {layer.type === 'group' && (\n <button\n type=\"button\"\n aria-label={layer.collapsed ? `Expand ${row.label}` : `Collapse ${row.label}`}\n className=\"w-3 text-slate-400\"\n onClick={(e) => {\n e.stopPropagation();\n attempt(() => controller.setLayerProperties(layer.id, { collapsed: !layer.collapsed }));\n }}\n >\n {layer.collapsed ? '▸' : '▾'}\n </button>\n )}\n {row.clipped && <span className=\"text-slate-500\" aria-label=\"Clipped\">↳</span>}\n {layerHasThumbnail(layer) ? (\n <span className=\"relative shrink-0\">\n <Thumbnail\n pixels={thumb(layer)}\n size={thumbnailSize}\n label={`${row.label} pixels`}\n selected={row.active && state.activeTarget === 'pixels' && Boolean(layer.mask)}\n />\n {layer.type !== 'pixel' && (\n <span\n data-testid=\"layer-kind-badge\"\n className=\"absolute -bottom-1 -right-1 rounded bg-slate-700 px-0.5 text-[8px] font-bold leading-tight text-slate-100 ring-1 ring-slate-900\"\n >\n {layerBadge(layer)}\n </span>\n )}\n </span>\n ) : (\n <span\n className=\"shrink-0 grid place-items-center rounded bg-slate-800 text-[9px] text-slate-400 ring-1 ring-slate-700\"\n style={{ width: thumbnailSize, height: thumbnailSize }}\n >\n {layerBadge(layer)}\n </span>\n )}\n {layer.mask && !layer.mask.source && layer.type === 'pixel' && (\n <button\n type=\"button\"\n aria-label={`${layer.mask.linked === false ? 'Link' : 'Unlink'} ${row.label} mask`}\n aria-pressed={layer.mask.linked !== false}\n title={layer.mask.linked === false ? 'Mask unlinked: it stays put when the layer moves or transforms. Click to link.' : 'Mask linked: it moves with the layer. Click to unlink.'}\n data-testid=\"layer-mask-link\"\n className={`shrink-0 text-[10px] leading-none ${layer.mask.linked === false ? 'text-slate-600' : 'text-slate-300'}`}\n onClick={(e) => {\n e.stopPropagation();\n attempt(() => controller.setLayerMaskProps(layer.id, { linked: layer.mask!.linked === false }));\n }}\n >\n {layer.mask.linked === false ? '⛓︎̸' : '⛓︎'}\n </button>\n )}\n {layer.mask && (\n <Thumbnail\n pixels={maskThumb(layer)}\n size={thumbnailSize}\n label={`${row.label} mask${layer.mask.enabled === false ? ' (disabled)' : ''}`}\n testId=\"layer-mask-thumbnail\"\n selected={row.active && state.activeTarget === 'mask'}\n onClick={(e) => {\n e.stopPropagation();\n if (e.shiftKey) attempt(() => controller.setLayerMaskProps(layer.id, { enabled: layer.mask!.enabled === false }));\n else attempt(() => controller.setActiveLayer(layer.id, 'mask'));\n }}\n />\n )}\n {renaming === layer.id ? (\n <input\n autoFocus\n aria-label=\"Layer name\"\n defaultValue={layer.name || row.label}\n className=\"flex-1 min-w-0 bg-slate-900 border border-slate-600 rounded px-1\"\n onClick={(e) => e.stopPropagation()}\n onBlur={(e) => {\n setRenaming(null);\n if (e.target.value.trim() && e.target.value !== layer.name) attempt(() => controller.setLayerProperties(layer.id, { name: e.target.value }));\n }}\n onKeyDown={(e) => {\n if (e.key === 'Enter') (e.target as HTMLInputElement).blur();\n if (e.key === 'Escape') setRenaming(null);\n }}\n />\n ) : (\n <span\n className={`flex-1 min-w-0 truncate ${layer.visible ? '' : 'text-slate-500'}`}\n onDoubleClick={(e) => {\n e.stopPropagation();\n setRenaming(layer.id);\n }}\n >\n {row.label}\n </span>\n )}\n {layerWarning(layer) && (\n <span role=\"img\" data-testid=\"layer-warning\" aria-label={layerWarning(layer)!} title={layerWarning(layer)!} className=\"text-[10px] text-amber-400\">\n ⚠\n </span>\n )}\n {layerEffectsBadge(layer) && (\n <button\n type=\"button\"\n data-testid=\"layer-fx-badge\"\n aria-label={layerEffectsBadge(layer) === 'on' ? `Turn effects off for ${row.label}` : `Turn effects on for ${row.label}`}\n aria-pressed={layerEffectsBadge(layer) === 'on'}\n className={`text-[9px] italic font-semibold ${layerEffectsBadge(layer) === 'on' ? 'text-indigo-300' : 'text-slate-600 line-through'}`}\n onClick={(e) => {\n e.stopPropagation();\n attempt(() => controller.setLayerEffectsEnabled(layer.id, layerEffectsBadge(layer) !== 'on'));\n }}\n >\n fx\n </button>\n )}\n {locked(layer) && <span aria-label=\"Locked\" className=\"text-slate-400\">🔒</span>}\n {layer.blend !== 'normal' && layer.blend !== 'pass-through' && <span className=\"text-[9px] text-slate-500\">{layer.blend}</span>}\n </li>\n );\n })}\n </ul>\n\n {error && (\n <p role=\"alert\" className=\"text-rose-400\">\n {error}\n </p>\n )}\n\n {menu && (\n <div\n role=\"menu\"\n aria-label=\"Layer menu\"\n className=\"fixed z-50 min-w-44 rounded border border-slate-700 bg-slate-900 py-1 shadow-xl\"\n style={{ left: menu.x, top: menu.y }}\n onClick={(e) => e.stopPropagation()}\n onKeyDown={(e) => e.key === 'Escape' && setMenu(null)}\n >\n {layerMenu(controller).map((item) => (\n <button\n key={item.action}\n type=\"button\"\n role=\"menuitem\"\n disabled={!item.enabled}\n className=\"block w-full px-3 py-1 text-left hover:bg-slate-800 disabled:opacity-40\"\n onClick={() => run(item.action)}\n >\n {item.label}\n </button>\n ))}\n </div>\n )}\n </div>\n );\n};\n","import React, { useEffect, useRef, useState } from 'react';\nimport type { EffectControl, ImageEditorController, LayerEffectKind } from '@pixerate/editor/image-editor';\nimport { LAYER_EFFECT_MENU, effectControlChange, layerEffectControls, layerEffectsPanel } from '@pixerate/editor/image-editor';\n\nexport interface LayerEffectsPanelProps {\n controller: ImageEditorController;\n /** The layer whose effects to show (default: the active layer). */\n layerId?: string | null;\n className?: string;\n}\n\nconst button = 'px-1.5 py-0.5 rounded text-[10px] bg-slate-800 text-slate-300 hover:text-white disabled:opacity-40';\n\n/**\n * A layer's effects (Photoshop's layer styles): the master switch, Scale Effects, an \"Add effect\"\n * menu, and each effect with its enabled toggle, remove button and, when expanded, its settings.\n * Every change is one undo step (a slider drag is one step too).\n */\nexport const LayerEffectsPanel: React.FC<LayerEffectsPanelProps> = ({ controller, layerId, className }) => {\n const [, setTick] = useState(0);\n useEffect(() => controller.subscribe(() => setTick((n) => n + 1)), [controller]);\n const [open, setOpen] = useState<string | null>(null);\n const [error, setError] = useState<string | null>(null);\n /** Whether the next slider change records an undo step (the first of a drag does, the rest replace it). */\n const commitNext = useRef(true);\n\n const layer = layerId ? controller.getLayer(layerId) : controller.getActiveLayer();\n const model = layerEffectsPanel(layer);\n const id = layer?.id;\n const attempt = (fn: () => unknown) => {\n try {\n setError(null);\n fn();\n } catch (err) {\n setError(err instanceof Error ? err.message : String(err));\n }\n };\n const sliderEvents = {\n onPointerDown: () => (commitNext.current = true),\n onPointerUp: () => (commitNext.current = true),\n onKeyDown: () => (commitNext.current = true),\n };\n\n if (!model.available || !id) {\n return (\n <div className={`text-xs text-slate-500 ${className ?? ''}`} data-testid=\"layer-effects\">\n {model.reason}\n </div>\n );\n }\n const effects = controller.getLayerEffects(id);\n const patterns = controller.getDocumentPatterns();\n const change = (effectId: string, control: EffectControl, value: unknown, drag = false) =>\n attempt(() => {\n const effect = controller.getLayerEffects(id).items.find((e) => e.id === effectId)!;\n controller.updateLayerEffect(id, effectId, effectControlChange(effect, control.key, value, patterns), drag ? commitNext.current : true);\n if (drag) commitNext.current = false;\n });\n\n const renderControl = (effectId: string, c: EffectControl) => {\n const label = `${c.label}`;\n switch (c.type) {\n case 'range': {\n const k = c.percent ? 100 : 1;\n const shown = Math.round(c.value * k * 100) / 100;\n return (\n <label key={c.key} className=\"flex flex-col gap-0.5\">\n <span className=\"text-slate-400\">\n {label} {shown}\n {c.unit}\n </span>\n <input\n type=\"range\"\n aria-label={label}\n min={c.min * k}\n max={c.max * k}\n step={c.step * k}\n value={shown}\n disabled={model.readOnly}\n {...sliderEvents}\n onChange={(e) => change(effectId, c, Number(e.target.value) / k, true)}\n className=\"accent-indigo-500\"\n />\n </label>\n );\n }\n case 'color':\n return (\n <label key={c.key} className=\"flex items-center gap-1.5 text-slate-300\">\n <input type=\"color\" aria-label={label} value={c.value} disabled={model.readOnly} onChange={(e) => change(effectId, c, e.target.value)} />\n {label}\n </label>\n );\n case 'checkbox':\n return (\n <label key={c.key} className=\"flex items-center gap-1.5 text-slate-300\">\n <input type=\"checkbox\" aria-label={label} checked={c.value} disabled={model.readOnly} onChange={(e) => change(effectId, c, e.target.checked)} className=\"accent-indigo-500\" />\n {label}\n </label>\n );\n case 'select':\n return (\n <label key={c.key} className=\"flex flex-col gap-0.5\">\n <span className=\"text-slate-400\">{label}</span>\n <select\n aria-label={label}\n value={c.value}\n disabled={model.readOnly}\n onChange={(e) => change(effectId, c, e.target.value)}\n className=\"bg-slate-800 border border-slate-700 rounded px-1.5 py-1\"\n >\n {c.options.map((o) => (\n <option key={o.value} value={o.value}>\n {o.label}\n </option>\n ))}\n </select>\n </label>\n );\n }\n };\n\n return (\n <div className={`flex flex-col gap-1.5 text-xs text-slate-200 ${className ?? ''}`} data-testid=\"layer-effects\" aria-label=\"Layer effects\" role=\"group\">\n <div className=\"flex flex-wrap items-center gap-2\">\n <span className=\"font-semibold text-slate-300\">fx Effects</span>\n <label className=\"flex items-center gap-1 text-slate-300\">\n <input\n type=\"checkbox\"\n aria-label=\"Effects on\"\n checked={model.enabled}\n disabled={model.readOnly}\n onChange={(e) => attempt(() => controller.setLayerEffectsEnabled(id, e.target.checked))}\n className=\"accent-indigo-500\"\n />\n On\n </label>\n <label className=\"flex items-center gap-1 text-slate-400\">\n Scale\n <input\n type=\"number\"\n aria-label=\"Scale effects\"\n min={1}\n max={1000}\n step={1}\n value={Math.round(model.scale * 100)}\n disabled={model.readOnly}\n onChange={(e) => {\n const v = Number(e.target.value);\n if (v >= 1 && v <= 1000) attempt(() => controller.setLayerEffectsEnabled(id, model.enabled, v / 100));\n }}\n className=\"w-14 bg-slate-800 border border-slate-700 rounded px-1\"\n />\n %\n </label>\n <select\n aria-label=\"Add effect\"\n value=\"\"\n disabled={model.readOnly}\n onChange={(e) => {\n const kind = e.target.value as LayerEffectKind;\n if (!kind) return;\n attempt(() => setOpen(controller.addLayerEffect(id, kind).effect.id));\n }}\n className=\"bg-slate-800 border border-slate-700 rounded px-1.5 py-1\"\n >\n <option value=\"\">Add effect…</option>\n {LAYER_EFFECT_MENU.map((m) => (\n <option key={m.kind} value={m.kind}>\n {m.label}\n </option>\n ))}\n </select>\n </div>\n {model.readOnly && model.reason && <p className=\"text-slate-500\">{model.reason}</p>}\n <ul className=\"flex flex-col gap-1\" aria-label=\"Effects\">\n {model.rows.map((row) => {\n const effect = effects.items.find((e) => e.id === row.id)!;\n const expanded = open === row.id;\n return (\n <li key={row.id} data-effect-id={row.id} className=\"rounded bg-slate-900/60 ring-1 ring-slate-800\">\n <div className=\"flex items-center gap-1.5 px-1.5 py-1\">\n <input\n type=\"checkbox\"\n aria-label={`${row.label} on`}\n checked={row.enabled}\n disabled={model.readOnly}\n onChange={(e) => attempt(() => controller.updateLayerEffect(id, row.id, { enabled: e.target.checked }))}\n className=\"accent-indigo-500\"\n />\n <button\n type=\"button\"\n aria-expanded={expanded}\n className={`flex-1 text-left ${row.enabled && model.enabled ? '' : 'text-slate-500'}`}\n onClick={() => setOpen(expanded ? null : row.id)}\n >\n {row.label}\n </button>\n <button type=\"button\" className={button} aria-label={`Remove ${row.label}`} disabled={model.readOnly} onClick={() => attempt(() => controller.removeLayerEffect(id, row.id))}>\n ✕\n </button>\n </div>\n {expanded && (\n <div className=\"grid grid-cols-2 gap-x-2 gap-y-1 px-1.5 pb-1.5\" data-testid=\"effect-settings\">\n {layerEffectControls(effect, patterns).map((c) => renderControl(row.id, c))}\n </div>\n )}\n </li>\n );\n })}\n </ul>\n {error && (\n <p role=\"alert\" className=\"text-rose-400\">\n {error}\n </p>\n )}\n </div>\n );\n};\n","import React, { useEffect, useState } from 'react';\nimport { findLayer, type ImageEditorController, type ImageLayer, type SmartObjectLayer } from '@pixerate/editor/image-editor';\nimport type { EffectProvider } from '@pixerate/editor/effects';\nimport { EffectParameters, EffectsBrowser, useEffectDescription } from '../effects';\n\nexport interface ImageProviderEffectsPanelProps {\n controller: ImageEditorController;\n className?: string;\n}\n\nconst btn = 'rounded border border-slate-700 px-1.5 py-0.5 text-[11px] text-slate-300 hover:text-white disabled:opacity-40';\n\n/** One effect's controls, loaded from the provider; a note when it does not have the effect. */\nfunction Controls({\n provider,\n effect,\n name,\n values,\n onChange,\n onPreset,\n}: {\n provider: EffectProvider | null;\n effect: string;\n name?: string;\n values: Readonly<Record<string, unknown>>;\n onChange: (control: string, value: unknown, gesture: string | null) => void;\n onPreset: (values: Readonly<Record<string, unknown>>) => void;\n}) {\n const { description, error } = useEffectDescription(provider, effect);\n if (!provider) return <p className=\"text-[11px] text-slate-400\">No effects provider: \"{name ?? effect}\" is kept but not drawn.</p>;\n if (error) return <p className=\"text-[11px] text-amber-400\">{error}</p>;\n if (!description) return <p className=\"text-[11px] text-slate-400\">Loading…</p>;\n return <EffectParameters description={description} values={values} onChange={onChange} onReset={(k) => onChange(k, description.defaults[k], null)} onPreset={onPreset} />;\n}\n\n/**\n * Provider effects in the image editor, for the active layer: its effect smart filters (apply,\n * turn on and off, opacity, reorder, change controls, remove) and, for an effect layer, its own\n * controls; plus adding effect layers. Applying a filter effect to a pixel layer converts it to a\n * smart object in the same undo step. Without a provider it says why nothing can be added.\n */\nexport function ImageProviderEffectsPanel({ controller, className = '' }: ImageProviderEffectsPanelProps) {\n const [, setTick] = useState(0);\n useEffect(() => controller.subscribe(() => setTick((n) => n + 1)), [controller]);\n const [browse, setBrowse] = useState<null | 'filter' | 'layer'>(null);\n const [message, setMessage] = useState<string | null>(null);\n const [open, setOpen] = useState<string | null>(null);\n const provider = controller.effectsProvider;\n const state = controller.getState();\n const layer: ImageLayer | null = state.activeLayerId ? (findLayer(state.layers, state.activeLayerId)?.layer ?? null) : null;\n const run = (work: () => unknown) => {\n setMessage(null);\n Promise.resolve()\n .then(work)\n .catch((e: unknown) => setMessage(e instanceof Error ? e.message : String(e)));\n };\n const drags = React.useRef(new Set<string>());\n /** Changes during a drag skip the undo stack; the last one (gesture ended) records one step. */\n const commit = (gesture: string | null) => {\n if (gesture) {\n if (!drags.current.has(gesture)) {\n drags.current.add(gesture);\n return true;\n }\n return false;\n }\n return true;\n };\n const filters = layer?.type === 'smart' ? ((layer as SmartObjectLayer).smartFilters?.filters ?? []).filter((f) => f.kind === 'effect') : [];\n const generator = layer?.type === 'pixel' ? layer.generator : undefined;\n const canFilter = !!layer && layer.type !== 'adjustment' && layer.type !== 'annotation';\n\n return (\n <section className={`flex flex-col gap-2 text-xs ${className}`} aria-label=\"Provider effects\" data-image-provider-effects=\"\">\n <div className=\"flex items-center gap-1\">\n <span className=\"flex-1 font-semibold uppercase tracking-wider text-[11px] text-slate-200\">Effects</span>\n <button type=\"button\" className={btn} disabled={!provider || !canFilter} aria-pressed={browse === 'filter'} onClick={() => setBrowse(browse === 'filter' ? null : 'filter')}>\n Apply effect…\n </button>\n <button type=\"button\" className={btn} disabled={!provider} aria-pressed={browse === 'layer'} onClick={() => setBrowse(browse === 'layer' ? null : 'layer')}>\n Effect layer…\n </button>\n </div>\n {!provider && <p className=\"text-[11px] text-slate-400\">No effects provider is registered. Effects in the document are kept.</p>}\n {browse === 'filter' && layer && (\n <EffectsBrowser provider={provider} uses={['filter']} title=\"Filters\" onPick={(e) => (setBrowse(null), run(() => controller.applyEffectFilter(layer.id, e.id)))} />\n )}\n {browse === 'layer' && (\n <EffectsBrowser provider={provider} uses={['generator', 'overlay', 'title']} title=\"Generators and overlays\" onPick={(e) => (setBrowse(null), run(() => controller.addEffectLayer(e.id)))} />\n )}\n {generator && layer && (\n <div className=\"space-y-1\" data-effect-part=\"generator\">\n <div className=\"flex items-center gap-1\">\n <span className=\"flex-1 font-medium text-slate-200\">{generator.name ?? generator.effect}</span>\n <button type=\"button\" className={btn} title=\"Keep the pixels as a plain layer\" onClick={() => run(() => controller.rasterizeEffectLayer(layer.id))}>\n Rasterize\n </button>\n </div>\n <Controls\n provider={provider}\n effect={generator.effect}\n name={generator.name}\n values={generator.values}\n onChange={(k, v, gesture) => run(() => controller.updateEffectLayer(layer.id, { values: { [k]: v as never } }, commit(gesture)))}\n onPreset={(values) => run(() => controller.updateEffectLayer(layer.id, { values: values as never }))}\n />\n </div>\n )}\n {filters.length > 0 && layer && (\n <ol className=\"space-y-1\" data-effect-part=\"filters\">\n {filters.map((f) => {\n const label = f.kind === 'effect' ? (f.name ?? f.effect) : f.kind;\n const all = (layer as SmartObjectLayer).smartFilters!.filters;\n const index = all.indexOf(f);\n if (f.kind !== 'effect') return null;\n return (\n <li key={f.id} className=\"rounded border border-slate-700 p-1\" data-smart-effect={f.id}>\n <div className=\"flex items-center gap-1\">\n <input type=\"checkbox\" checked={f.enabled} aria-label={`${label} on`} onChange={(e) => {\n const enabled = e.currentTarget.checked;\n run(() => controller.updateEffectFilter(layer.id, f.id, { enabled }));\n }} />\n <button type=\"button\" className=\"min-w-0 flex-1 truncate text-left text-slate-200\" aria-expanded={open === f.id} onClick={() => setOpen(open === f.id ? null : f.id)}>\n {label}\n </button>\n <button type=\"button\" className={btn} disabled={index === all.length - 1} aria-label=\"Move up\" onClick={() => run(() => controller.updateEffectFilter(layer.id, f.id, { index: index + 1 }))}>\n ↑\n </button>\n <button type=\"button\" className={btn} disabled={index === 0} aria-label=\"Move down\" onClick={() => run(() => controller.updateEffectFilter(layer.id, f.id, { index: index - 1 }))}>\n ↓\n </button>\n <button type=\"button\" className={btn} aria-label={`Remove ${label}`} onClick={() => run(() => controller.removeSmartFilter(layer.id, f.id))}>\n ✕\n </button>\n </div>\n {open === f.id && (\n <div className=\"mt-1 space-y-2\">\n <label className=\"flex items-center gap-1\">\n <span className=\"w-14 text-[11px] text-slate-300\">Opacity</span>\n <input\n type=\"range\"\n min={0}\n max={1}\n step={0.01}\n className=\"flex-1\"\n value={f.opacity}\n aria-label={`${label} opacity`}\n onChange={(e) => {\n const opacity = Number(e.currentTarget.value);\n run(() => controller.updateEffectFilter(layer.id, f.id, { opacity }));\n }}\n />\n </label>\n <Controls\n provider={provider}\n effect={f.effect}\n name={f.name}\n values={f.values}\n onChange={(k, v, gesture) => run(() => controller.updateEffectFilter(layer.id, f.id, { values: { [k]: v as never } }, commit(gesture)))}\n onPreset={(values) => run(() => controller.updateEffectFilter(layer.id, f.id, { values: values as never }))}\n />\n </div>\n )}\n </li>\n );\n })}\n </ol>\n )}\n {!layer && <p className=\"text-[11px] text-slate-400\">Select a layer to apply effects to it.</p>}\n {message && (\n <p role=\"alert\" className=\"text-[11px] text-rose-400\">\n {message}\n </p>\n )}\n </section>\n );\n}\n","import React, { useEffect, useState } from 'react';\nimport type { ImageEditorController } from '@pixerate/editor/image-editor';\nimport {\n BRUSH_OPTION_CONTROLS,\n MIXER_MIXING_OPTIONS,\n MIXER_OPTION_CONTROLS,\n PAINT_TOOLS,\n RETOUCH_CHOICES,\n RETOUCH_OPTION_CONTROLS,\n RETOUCH_TOGGLES,\n CLONE_TRANSFORM_CONTROLS,\n cloneSourceLabel,\n cloneTransformView,\n setCloneTransformValue,\n isRetouchPaintTool,\n rgbUnitToHex,\n setRetouchChoice,\n} from '@pixerate/editor/image-editor';\nimport { DEFAULT_PAINT_GRADIENT } from '@pixerate/editor/image-editor';\nimport { PaintGradientEditor } from './PaintGradientEditor';\nimport { ControlSlider } from './ControlSlider';\n\nexport interface BrushOptionsBarProps {\n controller: ImageEditorController;\n className?: string;\n}\n\nconst chip = (on: boolean) => `px-2 py-1 rounded text-[11px] ${on ? 'bg-indigo-600 text-white' : 'bg-slate-800 text-slate-300 hover:text-white'}`;\n\n/**\n * The paint tools: Move / Brush / Mixer / Eraser, the brush's size, hardness, opacity, flow and\n * smoothing, pressure toggles, the foreground and background colours (D resets, X swaps) and\n * Edit › Fill / Clear on the active layer, and gradient paint for the brush (the colour changes as\n * the stroke goes; `PaintGradientEditor`). With the Mixer Brush: its load (Load brush / Clean\n * brush), Wet / Load / Mix, load and clean each stroke, and the RGB / Pigment mixing toggle.\n * With a retouching tool: the clone source (Alt-click the canvas to set it), Sample, the Spot\n * Healing type, the tone Range, Exposure / Strength and the Aligned / Protect tones / Vibrance\n * toggles that tool uses.\n * Shortcuts are handled by `handlePaintShortcut` in the editor.\n */\nexport const BrushOptionsBar: React.FC<BrushOptionsBarProps> = ({ controller, className }) => {\n const [, setTick] = useState(0);\n useEffect(() => controller.subscribe(() => setTick((n) => n + 1)), [controller]);\n const [error, setError] = useState<string | null>(null);\n const state = controller.getState();\n const { brush, foreground, background, mixer, mixerLoad, retouch, cloneSource, paint } = state.paint;\n const tool = state.activeTool as (typeof PAINT_TOOLS)[number]['id'];\n const attempt = (fn: () => unknown) => {\n try {\n setError(null);\n fn();\n } catch (err) {\n setError(err instanceof Error ? err.message : String(err));\n }\n };\n\n return (\n <div className={`flex flex-col gap-2 text-xs text-slate-200 ${className ?? ''}`} data-testid=\"brush-options\">\n <div className=\"flex flex-wrap gap-1\" role=\"toolbar\" aria-label=\"Paint tools\">\n {PAINT_TOOLS.map((t) => (\n <button\n key={t.id}\n type=\"button\"\n aria-pressed={state.activeTool === t.id}\n title={t.shortcut ? `${t.label} (${t.shortcut})` : t.label}\n className={chip(state.activeTool === t.id)}\n onClick={() => controller.setTool(t.id)}\n >\n {t.label}\n </button>\n ))}\n </div>\n\n <div className=\"flex items-center gap-2\" role=\"group\" aria-label=\"Colours\">\n <label className=\"flex items-center gap-1\">\n <input\n type=\"color\"\n aria-label=\"Foreground colour\"\n value={foreground}\n onChange={(e) => controller.setPaintOptions({ foreground: e.target.value })}\n className=\"h-6 w-8 rounded border border-slate-700 bg-transparent\"\n />\n <span className=\"text-slate-400\">FG</span>\n </label>\n <label className=\"flex items-center gap-1\">\n <input\n type=\"color\"\n aria-label=\"Background colour\"\n value={background}\n onChange={(e) => controller.setPaintOptions({ background: e.target.value })}\n className=\"h-6 w-8 rounded border border-slate-700 bg-transparent\"\n />\n <span className=\"text-slate-400\">BG</span>\n </label>\n <button type=\"button\" title=\"Swap colours (X)\" className={chip(false)} onClick={() => controller.swapPaintColors()}>\n Swap\n </button>\n <button type=\"button\" title=\"Default colours (D)\" className={chip(false)} onClick={() => controller.resetPaintColors()}>\n Default\n </button>\n {state.activeTool === 'brush' && (\n <button\n type=\"button\"\n aria-pressed={paint.type === 'gradient'}\n title=\"Gradient paint: the brush changes colour as the stroke goes\"\n className={chip(paint.type === 'gradient')}\n onClick={() => attempt(() => controller.setPaintOptions(paint.type === 'gradient' ? { foreground } : { paint: DEFAULT_PAINT_GRADIENT }))}\n >\n Gradient\n </button>\n )}\n </div>\n {state.activeTool === 'brush' && paint.type === 'gradient' && (\n <PaintGradientEditor value={paint} colors={{ paint: foreground, secondary: background }} onChange={(g) => attempt(() => controller.setPaintOptions({ paint: g }))} />\n )}\n\n {BRUSH_OPTION_CONTROLS.map((spec) => (\n <ControlSlider\n key={spec.id}\n spec={spec}\n value={brush[spec.id]}\n onChange={(v) => controller.setPaintOptions({ brush: { [spec.id]: v } })}\n />\n ))}\n\n {state.activeTool === 'mixer' && (\n <div className=\"flex flex-col gap-2 border-t border-slate-800 pt-2\" role=\"group\" aria-label=\"Mixer Brush\" data-testid=\"mixer-options\">\n <div className=\"flex items-center gap-2\">\n <span\n aria-label=\"Brush load\"\n title={mixerLoad.reservoir ? `Loaded ${rgbUnitToHex(mixerLoad.reservoir)}, ${Math.round(mixerLoad.amount * 100)}% left` : 'Unloaded'}\n className=\"h-6 w-6 rounded border border-slate-700\"\n style={{ background: mixerLoad.reservoir ? rgbUnitToHex(mixerLoad.reservoir) : 'transparent' }}\n />\n <button type=\"button\" title=\"Fill the reservoir with the foreground colour\" className={chip(false)} onClick={() => controller.loadMixerBrush()}>\n Load brush\n </button>\n <button type=\"button\" title=\"Empty the picked-up colour\" className={chip(false)} onClick={() => controller.cleanMixerBrush()}>\n Clean brush\n </button>\n </div>\n <div className=\"flex gap-1\" role=\"group\" aria-label=\"Mixing\">\n {MIXER_MIXING_OPTIONS.map((m) => (\n <button\n key={m.id}\n type=\"button\"\n aria-pressed={mixer.mixing === m.id}\n title={m.title}\n className={chip(mixer.mixing === m.id)}\n onClick={() => controller.setPaintOptions({ mixer: { mixing: m.id } })}\n >\n {m.label}\n </button>\n ))}\n </div>\n {MIXER_OPTION_CONTROLS.map((spec) => (\n <ControlSlider key={spec.id} spec={spec} value={mixer[spec.id]} onChange={(v) => controller.setPaintOptions({ mixer: { [spec.id]: v } })} />\n ))}\n <div className=\"flex flex-wrap gap-3 text-slate-300\">\n <label className=\"flex items-center gap-1.5\">\n <input\n type=\"checkbox\"\n aria-label=\"Load the brush after each stroke\"\n checked={mixer.loadEachStroke}\n onChange={(e) => controller.setPaintOptions({ mixer: { loadEachStroke: e.target.checked } })}\n className=\"accent-indigo-500\"\n />\n Load each stroke\n </label>\n <label className=\"flex items-center gap-1.5\">\n <input\n type=\"checkbox\"\n aria-label=\"Clean the brush after each stroke\"\n checked={mixer.cleanEachStroke}\n onChange={(e) => controller.setPaintOptions({ mixer: { cleanEachStroke: e.target.checked } })}\n className=\"accent-indigo-500\"\n />\n Clean each stroke\n </label>\n </div>\n </div>\n )}\n\n {isRetouchPaintTool(tool) && (\n <div className=\"flex flex-col gap-2 border-t border-slate-800 pt-2\" role=\"group\" aria-label=\"Retouch options\" data-testid=\"retouch-options\">\n {(tool === 'clone' || tool === 'heal') && (\n <div className=\"flex items-center gap-2\">\n <span className=\"text-slate-400\" data-testid=\"clone-source\">\n {cloneSourceLabel(controller)}\n </span>\n {cloneSource && (\n <button type=\"button\" title=\"Forget the source point\" className={chip(false)} onClick={() => controller.setCloneSource(null)}>\n Clear source\n </button>\n )}\n </div>\n )}\n {(tool === 'clone' || tool === 'heal') && (\n <div className=\"flex flex-col gap-1\" role=\"group\" aria-label=\"Clone source transform\" data-testid=\"clone-transform\">\n {CLONE_TRANSFORM_CONTROLS.map((spec) => (\n <ControlSlider key={spec.id} spec={spec} value={cloneTransformView(controller)[spec.id]} onChange={(v) => setCloneTransformValue(controller, spec.id, v)} />\n ))}\n <div className=\"flex items-center gap-1\">\n <button type=\"button\" aria-pressed={cloneTransformView(controller).flipH} title=\"Mirror the source left to right\" className={chip(cloneTransformView(controller).flipH)} onClick={() => setCloneTransformValue(controller, 'flipH')}>\n Flip H\n </button>\n <button type=\"button\" aria-pressed={cloneTransformView(controller).flipV} title=\"Mirror the source top to bottom\" className={chip(cloneTransformView(controller).flipV)} onClick={() => setCloneTransformValue(controller, 'flipV')}>\n Flip V\n </button>\n {!cloneTransformView(controller).identity && (\n <button type=\"button\" title=\"Back to 100 %, no flip, 0°\" className={chip(false)} onClick={() => controller.setCloneTransform(null)}>\n Reset transform\n </button>\n )}\n </div>\n </div>\n )}\n {RETOUCH_CHOICES.filter((c) => c.tools.includes(tool)).map((choice) => (\n <div key={choice.id} className=\"flex flex-wrap items-center gap-1\" role=\"group\" aria-label={choice.label}>\n <span className=\"text-slate-400\">{choice.label}</span>\n {choice.options.map((o) => (\n <button\n key={o.id}\n type=\"button\"\n aria-pressed={retouch[choice.id] === o.id}\n title={o.title}\n className={chip(retouch[choice.id] === o.id)}\n onClick={() => setRetouchChoice(controller, choice.id, o.id)}\n >\n {o.label}\n </button>\n ))}\n </div>\n ))}\n {RETOUCH_OPTION_CONTROLS.filter((c) => c.tools.includes(tool)).map((spec) => (\n <ControlSlider key={spec.id} spec={spec} value={retouch[spec.id]} onChange={(v) => controller.setPaintOptions({ retouch: { [spec.id]: v } })} />\n ))}\n <div className=\"flex flex-wrap gap-3 text-slate-300\">\n {RETOUCH_TOGGLES.filter((t) => t.tools.includes(tool)).map((t) => (\n <label key={t.id} className=\"flex items-center gap-1.5\">\n <input\n type=\"checkbox\"\n aria-label={t.label}\n checked={retouch[t.id]}\n onChange={(e) => controller.setPaintOptions({ retouch: { [t.id]: e.target.checked } })}\n className=\"accent-indigo-500\"\n />\n {t.label}\n </label>\n ))}\n </div>\n </div>\n )}\n\n <div className=\"flex flex-wrap gap-3 text-slate-300\" role=\"group\" aria-label=\"Pressure\">\n <label className=\"flex items-center gap-1.5\">\n <input\n type=\"checkbox\"\n aria-label=\"Pressure controls size\"\n checked={brush.pressureSize}\n onChange={(e) => controller.setPaintOptions({ brush: { pressureSize: e.target.checked } })}\n className=\"accent-indigo-500\"\n />\n Pressure size\n </label>\n <label className=\"flex items-center gap-1.5\">\n <input\n type=\"checkbox\"\n aria-label=\"Pressure controls opacity\"\n checked={brush.pressureOpacity}\n onChange={(e) => controller.setPaintOptions({ brush: { pressureOpacity: e.target.checked } })}\n className=\"accent-indigo-500\"\n />\n Pressure opacity\n </label>\n </div>\n\n <div className=\"flex gap-1\">\n <button type=\"button\" className={chip(false)} onClick={() => attempt(() => controller.fillPixels())}>\n Fill\n </button>\n <button type=\"button\" className={chip(false)} onClick={() => attempt(() => controller.clearPixels())}>\n Clear\n </button>\n </div>\n {error && (\n <p role=\"alert\" className=\"text-rose-400\">\n {error}\n </p>\n )}\n </div>\n );\n};\n","import React from 'react';\nimport { PAINT_GRADIENT_KIT } from '@pixerate/editor/image-editor';\nimport { PaintGradientEditorView, type PaintGradientEditorProps } from '../paint-editor/PaintGradientEditorView';\n\nexport type { PaintGradientEditorProps } from '../paint-editor/PaintGradientEditorView';\n\n/** The gradient paint editor for the image editor's brush (see `PaintGradientEditorView`). */\nexport const PaintGradientEditor: React.FC<PaintGradientEditorProps> = (props) => <PaintGradientEditorView {...props} kit={PAINT_GRADIENT_KIT} />;\n","import React, { useEffect, useState } from 'react';\nimport type { ImageEditorController, Intent } from '@pixerate/editor/image-editor';\nimport { COLOR_MODE_OPTIONS, INTENT_OPTIONS, PROOF_PROFILE_OPTIONS, WORKING_SPACE_OPTIONS, colorPanelView } from '@pixerate/editor/image-editor';\n\nexport interface ColorProfilePanelProps {\n controller: ImageEditorController;\n className?: string;\n}\n\nconst chip = 'px-2 py-1 rounded text-[11px] bg-slate-800 text-slate-300 hover:text-white';\nconst select = 'rounded bg-slate-800 px-1 py-0.5 text-[11px] text-slate-200';\n\n/**\n * Colour management: the document's profile (working space) with Assign Profile and Convert to\n * Profile (intent, black point compensation), Image › Mode (RGB, CMYK, Lab), and View › Proof\n * Setup (profile, intent, simulate paper, gamut warning).\n */\nexport const ColorProfilePanel: React.FC<ColorProfilePanelProps> = ({ controller, className }) => {\n const [, setTick] = useState(0);\n useEffect(() => controller.subscribe(() => setTick((n) => n + 1)), [controller]);\n const [target, setTarget] = useState<string>('display-p3');\n const [intent, setIntent] = useState<Intent>('relative');\n const [bpc, setBpc] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const view = colorPanelView(controller);\n const attempt = (fn: () => unknown) => {\n try {\n setError(null);\n fn();\n } catch (err) {\n setError(err instanceof Error ? err.message : String(err));\n }\n };\n const proofWith = (patch: Partial<{ id: string; intent: Intent; simulatePaper: boolean; gamutWarning: boolean }>) => {\n const cur = view.proof;\n const id = patch.id ?? cur?.id ?? 'coated-cmyk';\n attempt(() =>\n controller.setProofSetup({\n profile: id,\n intent: patch.intent ?? cur?.intent ?? 'relative',\n simulatePaper: patch.simulatePaper ?? cur?.simulatePaper ?? false,\n gamutWarning: patch.gamutWarning ?? cur?.gamutWarning ?? false,\n })\n );\n };\n\n return (\n <div className={`flex flex-col gap-2 text-xs text-slate-200 ${className ?? ''}`} data-testid=\"color-profile-panel\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-slate-400\">Profile</span>\n <span data-testid=\"color-profile-name\">{view.profileName}</span>\n </div>\n <div className=\"flex flex-wrap items-center gap-1\" role=\"group\" aria-label=\"Colour mode\">\n <span className=\"text-slate-400\">Mode</span>\n <select aria-label=\"Colour mode\" className={select} value={view.mode} onChange={(e) => attempt(() => controller.setColorMode(e.target.value as 'rgb' | 'cmyk' | 'lab'))}>\n {COLOR_MODE_OPTIONS.map((o) => (\n <option key={o.id} value={o.id} title={o.title}>\n {o.label}\n </option>\n ))}\n </select>\n {view.cmykProfileName && <span className=\"text-slate-400\">{view.cmykProfileName}</span>}\n </div>\n <div className=\"flex flex-wrap items-center gap-1\" role=\"group\" aria-label=\"Assign or convert\">\n <select aria-label=\"Target profile\" className={select} value={target} onChange={(e) => setTarget(e.target.value)}>\n {WORKING_SPACE_OPTIONS.map((o) => (\n <option key={o.id} value={o.id}>\n {o.label}\n </option>\n ))}\n </select>\n <select aria-label=\"Rendering intent\" className={select} value={intent} onChange={(e) => setIntent(e.target.value as Intent)}>\n {INTENT_OPTIONS.map((o) => (\n <option key={o.id} value={o.id} title={o.title}>\n {o.label}\n </option>\n ))}\n </select>\n <label className=\"flex items-center gap-1\">\n <input type=\"checkbox\" aria-label=\"Black point compensation\" checked={bpc} onChange={(e) => setBpc(e.target.checked)} className=\"accent-indigo-500\" />\n BPC\n </label>\n <button type=\"button\" className={chip} title=\"Edit › Assign Profile: keep the numbers\" onClick={() => attempt(() => controller.assignProfile(target))}>\n Assign\n </button>\n <button type=\"button\" className={chip} title=\"Edit › Convert to Profile: keep the look\" onClick={() => attempt(() => controller.convertToProfile(target, { intent, bpc }))}>\n Convert\n </button>\n </div>\n <div className=\"flex flex-wrap items-center gap-1\" role=\"group\" aria-label=\"Proof setup\">\n <span className=\"text-slate-400\">Proof</span>\n <select\n aria-label=\"Proof profile\"\n className={select}\n value={view.proof?.id ?? ''}\n onChange={(e) => (e.target.value ? proofWith({ id: e.target.value }) : attempt(() => controller.setProofSetup(null)))}\n >\n <option value=\"\">Off</option>\n {PROOF_PROFILE_OPTIONS.map((o) => (\n <option key={o.id} value={o.id}>\n {o.label}\n </option>\n ))}\n </select>\n {view.proof && (\n <>\n <select aria-label=\"Proof intent\" className={select} value={view.proof.intent} onChange={(e) => proofWith({ intent: e.target.value as Intent })}>\n {INTENT_OPTIONS.map((o) => (\n <option key={o.id} value={o.id}>\n {o.label}\n </option>\n ))}\n </select>\n <label className=\"flex items-center gap-1\">\n <input type=\"checkbox\" aria-label=\"Simulate paper colour\" checked={view.proof.simulatePaper} onChange={(e) => proofWith({ simulatePaper: e.target.checked })} className=\"accent-indigo-500\" />\n Paper\n </label>\n <label className=\"flex items-center gap-1\">\n <input type=\"checkbox\" aria-label=\"Gamut warning\" checked={view.proof.gamutWarning} onChange={(e) => proofWith({ gamutWarning: e.target.checked })} className=\"accent-indigo-500\" />\n Gamut warning\n </label>\n </>\n )}\n </div>\n {error && (\n <p role=\"alert\" className=\"text-rose-400\">\n {error}\n </p>\n )}\n </div>\n );\n};\n","import React, { useState } from 'react';\nimport type { ImageEditorController, SelectionMask, SelectionModifyOp, SelectionToolOptions } from '@pixerate/editor/image-editor';\nimport {\n SELECTION_MODES,\n SELECTION_MODE_LABELS,\n SELECTION_TOOLS,\n describeSelection,\n} from '@pixerate/editor/image-editor';\n\nexport interface SelectionOptionsBarProps {\n controller: ImageEditorController;\n options: SelectionToolOptions;\n onOptionsChange: (next: SelectionToolOptions) => void;\n /** The current selection (pass `state.selection` so the bar re-renders with it). */\n selection?: SelectionMask | null;\n /** The current Quick Mask view flag (`state.quickMask`). */\n quickMask?: boolean;\n className?: string;\n}\n\nconst MODIFY_OPS: { op: SelectionModifyOp; label: string }[] = [\n { op: 'grow', label: 'Grow' },\n { op: 'shrink', label: 'Shrink' },\n { op: 'feather', label: 'Feather' },\n { op: 'border', label: 'Border' },\n { op: 'smooth', label: 'Smooth' },\n];\n\nconst btn = (on: boolean) =>\n `px-2 py-1 rounded-md border text-[11px] transition-colors ${\n on ? 'bg-indigo-600 border-indigo-500 text-white' : 'bg-slate-950 border-slate-800 text-slate-300 hover:text-white'\n }`;\n\n/**\n * Options bar of the selection tools: tool, mode (new / add / subtract / intersect), magic wand\n * tolerance and contiguous, anti-alias, sample merged, Select › All / Deselect / Inverse,\n * Modify (grow, shrink, feather, border, smooth) and the Quick Mask toggle.\n */\nexport const SelectionOptionsBar: React.FC<SelectionOptionsBarProps> = ({\n controller,\n options,\n onOptionsChange,\n selection,\n quickMask,\n className = '',\n}) => {\n const [radius, setRadius] = useState(2);\n const set = (patch: Partial<SelectionToolOptions>) => onOptionsChange({ ...options, ...patch });\n const sel = selection === undefined ? controller.getSelection() : selection;\n const qm = quickMask ?? Boolean(controller.getState().quickMask);\n return (\n <div data-testid=\"selection-options-bar\" className={`flex flex-col gap-3 text-xs ${className}`}>\n <div role=\"group\" aria-label=\"Selection tool\" className=\"flex flex-wrap gap-1\">\n {SELECTION_TOOLS.map((t) => (\n <button key={t.id} type=\"button\" aria-pressed={options.tool === t.id} className={btn(options.tool === t.id)} onClick={() => set({ tool: t.id })}>\n {t.label}\n </button>\n ))}\n </div>\n <div role=\"group\" aria-label=\"Selection mode\" className=\"flex flex-wrap gap-1\">\n {SELECTION_MODES.map((m) => (\n <button key={m} type=\"button\" aria-pressed={options.mode === m} className={btn(options.mode === m)} onClick={() => set({ mode: m })}>\n {SELECTION_MODE_LABELS[m]}\n </button>\n ))}\n </div>\n {options.tool === 'wand' && (\n <div className=\"flex flex-col gap-2\">\n <label className=\"flex flex-col gap-1\">\n <span className=\"flex justify-between text-slate-400\">\n <span>Tolerance</span>\n <span className=\"font-mono\">{options.tolerance}</span>\n </span>\n <input\n type=\"range\"\n min={0}\n max={255}\n step={1}\n aria-label=\"Tolerance\"\n value={options.tolerance}\n onChange={(e) => set({ tolerance: Number(e.target.value) })}\n className=\"w-full accent-indigo-500\"\n />\n </label>\n <label className=\"flex items-center gap-2 text-slate-300\">\n <input type=\"checkbox\" checked={options.contiguous} onChange={(e) => set({ contiguous: e.target.checked })} />\n Contiguous\n </label>\n <label className=\"flex items-center gap-2 text-slate-300\">\n <input type=\"checkbox\" checked={options.sampleMerged} onChange={(e) => set({ sampleMerged: e.target.checked })} />\n Sample adjusted image\n </label>\n <label className=\"flex items-center gap-2 text-slate-300\">\n Sample\n <select\n aria-label=\"Sample from\"\n value={options.sample ?? 'composite'}\n onChange={(e) => set({ sample: e.target.value as 'composite' | 'active-layer' })}\n className=\"bg-slate-800 border border-slate-700 rounded px-1 py-0.5\"\n >\n <option value=\"composite\">All layers</option>\n <option value=\"active-layer\">Active layer</option>\n </select>\n </label>\n </div>\n )}\n <label className=\"flex items-center gap-2 text-slate-300\">\n <input type=\"checkbox\" checked={options.antiAlias} onChange={(e) => set({ antiAlias: e.target.checked })} />\n Anti-alias\n </label>\n <div className=\"flex flex-wrap gap-1\">\n <button type=\"button\" className={btn(false)} onClick={() => controller.selectAll()}>\n Select All\n </button>\n <button type=\"button\" className={btn(false)} disabled={!sel} onClick={() => controller.deselect()}>\n Deselect\n </button>\n <button type=\"button\" className={btn(false)} onClick={() => controller.invertSelection()}>\n Inverse\n </button>\n <button type=\"button\" aria-pressed={qm} className={btn(qm)} onClick={() => controller.setQuickMask(!qm)}>\n Quick Mask\n </button>\n </div>\n <div className=\"flex flex-wrap items-center gap-1\">\n <label className=\"flex items-center gap-1 text-slate-400\">\n Radius\n <input\n type=\"number\"\n min={0}\n max={500}\n step={1}\n aria-label=\"Modify radius\"\n value={radius}\n onChange={(e) => setRadius(Math.max(0, Number(e.target.value) || 0))}\n className=\"w-14 bg-slate-950 border border-slate-800 rounded px-1 py-0.5 text-slate-200\"\n />\n </label>\n {MODIFY_OPS.map(({ op, label }) => (\n <button key={op} type=\"button\" className={btn(false)} disabled={!sel} onClick={() => controller.modifySelection(op, radius)}>\n {label}\n </button>\n ))}\n </div>\n <p data-testid=\"selection-status\" className=\"text-slate-400\">\n {describeSelection(sel)}\n </p>\n </div>\n );\n};\n","import React, { useState } from 'react';\nimport type { AdjustmentKind, AdjustmentLayer, ImageEditorController, RefineEdgeParams, SelectionMask } from '@pixerate/editor/image-editor';\nimport {\n ADJUSTMENT_KINDS,\n REFINE_EDGE_CONTROLS,\n adjustmentKindLabel,\n layerMaskFromSelection,\n} from '@pixerate/editor/image-editor';\n\nexport interface RefineEdgePanelProps {\n controller: ImageEditorController;\n /** The current selection (`state.selection`), so the panel re-renders with it. */\n selection?: SelectionMask | null;\n /** The adjustment layers (`state.adjustments.layers`), for the mask actions. */\n layers?: AdjustmentLayer[];\n className?: string;\n}\n\nconst DEFAULT_PARAMS: Required<RefineEdgeParams> = { radius: 8, smartRadius: false, smooth: 0, feather: 0, contrast: 0, shiftEdge: 0 };\n\nconst button =\n 'px-2 py-1 rounded-md border border-slate-800 bg-slate-950 text-[11px] text-slate-200 hover:text-white disabled:opacity-40';\n\n/**\n * Refine Edge (snap the selection, e.g. a coarse AI mask, to the image's edges) and layer masks:\n * use the selection as an adjustment layer's mask, edit mask density and feather, load a mask\n * back as a selection.\n */\nexport const RefineEdgePanel: React.FC<RefineEdgePanelProps> = ({ controller, selection, layers, className = '' }) => {\n const [params, setParams] = useState<Required<RefineEdgeParams>>(DEFAULT_PARAMS);\n const [busy, setBusy] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [layerId, setLayerId] = useState('');\n const [newKind, setNewKind] = useState<AdjustmentKind>('hueSaturation');\n const sel = selection === undefined ? controller.getSelection() : selection;\n const list = layers ?? controller.getAdjustmentLayers();\n const target = list.find((l) => l.id === layerId) ?? list[list.length - 1];\n\n const refine = async () => {\n setBusy(true);\n setError(null);\n try {\n await controller.refineSelection(params);\n } catch (err) {\n setError(err instanceof Error ? err.message : String(err));\n } finally {\n setBusy(false);\n }\n };\n\n return (\n <div data-testid=\"refine-edge-panel\" className={`flex flex-col gap-3 text-xs ${className}`}>\n <span className=\"font-semibold text-slate-200 uppercase tracking-wider text-[11px]\">Refine Edge</span>\n {REFINE_EDGE_CONTROLS.map((c) => (\n <label key={c.id} className=\"flex flex-col gap-1\">\n <span className=\"flex justify-between text-slate-400\">\n <span>{c.label}</span>\n <span className=\"font-mono\">\n {params[c.id]}\n {c.unit}\n </span>\n </span>\n <input\n type=\"range\"\n min={c.min}\n max={c.max}\n step={c.step}\n aria-label={c.label}\n value={params[c.id]}\n onChange={(e) => setParams({ ...params, [c.id]: Number(e.target.value) })}\n className=\"w-full accent-indigo-500\"\n />\n </label>\n ))}\n <label className=\"flex items-center gap-2 text-slate-300\">\n <input type=\"checkbox\" checked={params.smartRadius} onChange={(e) => setParams({ ...params, smartRadius: e.target.checked })} />\n Smart Radius\n </label>\n <div className=\"flex gap-1\">\n <button type=\"button\" className={button} disabled={!sel || busy} onClick={refine}>\n Refine Edge\n </button>\n <button type=\"button\" className={button} onClick={() => setParams(DEFAULT_PARAMS)}>\n Reset\n </button>\n </div>\n {error && (\n <p role=\"alert\" className=\"text-rose-400\">\n {error}\n </p>\n )}\n\n <span className=\"font-semibold text-slate-200 uppercase tracking-wider text-[11px] mt-2\">Layer Mask</span>\n <div className=\"flex gap-1 items-center\">\n <select\n aria-label=\"New masked layer kind\"\n value={newKind}\n onChange={(e) => setNewKind(e.target.value as AdjustmentKind)}\n className=\"flex-1 bg-slate-950 border border-slate-800 rounded px-1 py-1 text-slate-200\"\n >\n {ADJUSTMENT_KINDS.map((k) => (\n <option key={k.kind} value={k.kind}>\n {k.label}\n </option>\n ))}\n </select>\n <button\n type=\"button\"\n className={button}\n disabled={!sel}\n onClick={() => sel && setLayerId(controller.addAdjustmentLayer({ kind: newKind, mask: layerMaskFromSelection(sel) }))}\n >\n New Masked Layer\n </button>\n </div>\n {list.length > 0 && target && (\n <div className=\"flex flex-col gap-2\">\n <select\n aria-label=\"Mask layer\"\n value={target.id}\n onChange={(e) => setLayerId(e.target.value)}\n className=\"bg-slate-950 border border-slate-800 rounded px-1 py-1 text-slate-200\"\n >\n {list.map((l) => (\n <option key={l.id} value={l.id}>\n {l.name || adjustmentKindLabel(l.kind)}\n {l.mask ? ' (masked)' : ''}\n </option>\n ))}\n </select>\n <div className=\"flex flex-wrap gap-1\">\n <button type=\"button\" className={button} disabled={!sel} onClick={() => controller.applySelectionAsLayerMask(target.id)}>\n Mask with Selection\n </button>\n <button type=\"button\" className={button} disabled={!target.mask} onClick={() => controller.selectionFromLayerMask(target.id)}>\n Load as Selection\n </button>\n <button type=\"button\" className={button} disabled={!target.mask} onClick={() => controller.setAdjustmentLayerMask(target.id, null)}>\n Remove Mask\n </button>\n </div>\n {target.mask && (\n <>\n <label className=\"flex flex-col gap-1\">\n <span className=\"flex justify-between text-slate-400\">\n <span>Density</span>\n <span className=\"font-mono\">{Math.round((target.mask.density ?? 1) * 100)}%</span>\n </span>\n <input\n type=\"range\"\n min={0}\n max={100}\n step={1}\n aria-label=\"Mask density\"\n value={Math.round((target.mask.density ?? 1) * 100)}\n onChange={(e) => controller.setAdjustmentLayerMaskProps(target.id, { density: Number(e.target.value) / 100 })}\n className=\"w-full accent-indigo-500\"\n />\n </label>\n <label className=\"flex flex-col gap-1\">\n <span className=\"flex justify-between text-slate-400\">\n <span>Mask Feather</span>\n <span className=\"font-mono\">{target.mask.feather ?? 0}px</span>\n </span>\n <input\n type=\"range\"\n min={0}\n max={50}\n step={0.5}\n aria-label=\"Mask feather\"\n value={target.mask.feather ?? 0}\n onChange={(e) => controller.setAdjustmentLayerMaskProps(target.id, { feather: Number(e.target.value) })}\n className=\"w-full accent-indigo-500\"\n />\n </label>\n </>\n )}\n </div>\n )}\n </div>\n );\n};\n","import React, { useEffect, useState } from 'react';\nimport type { FreeTransformField, FreeTransformTool, Interpolation, TransformAnchor, WarpBar } from '@pixerate/editor/image-editor';\nimport { FREE_TRANSFORM_FIELDS, FREE_TRANSFORM_MODE_OPTIONS, INTERPOLATIONS, TRANSFORM_ANCHORS, WARP_GRID_OPTIONS, WARP_STYLE_OPTIONS } from '@pixerate/editor/image-editor';\n\nexport interface FreeTransformOptionsBarProps {\n tool: FreeTransformTool;\n className?: string;\n}\n\nconst chip = (on: boolean) => `px-2 py-1 rounded text-[11px] ${on ? 'bg-indigo-600 text-white' : 'bg-slate-800 text-slate-300 hover:text-white'}`;\nconst round = (v: number, unit: string) => (unit === 'px' ? Math.round(v * 10) / 10 : Math.round(v * 100) / 100);\n\n/**\n * Free Transform's options bar (Photoshop's): the mode switch (Free, Rotate, Skew, Distort,\n * Perspective, Warp), the reference-point locator, X / Y of the reference point, W / H in percent\n * with the proportional chain, the angle and skews, the interpolation, and Commit (Enter) / Cancel\n * (Esc). In Warp mode the numbers give way to the warp style, bend, horizontal and vertical\n * distortion, orientation and grid. Typed values apply on Enter or when the field loses focus.\n */\nexport const FreeTransformOptionsBar: React.FC<FreeTransformOptionsBarProps> = ({ tool, className }) => {\n const [, setTick] = useState(0);\n useEffect(() => tool.subscribe(() => setTick((n) => n + 1)), [tool]);\n const bar = tool.bar();\n if (!tool.active || !bar) return null;\n const warp = tool.warpBar();\n const warpNumber = (key: 'bend' | 'horizontal' | 'vertical', raw: string) => {\n const v = Number(raw);\n if (raw.trim() !== '' && Number.isFinite(v) && v !== warp[key]) tool.setWarp({ [key]: Math.max(-100, Math.min(100, v)) } as Partial<WarpBar>);\n };\n const apply = (field: FreeTransformField, raw: string) => {\n const v = Number(raw);\n if (raw.trim() !== '' && Number.isFinite(v) && Math.abs(v - bar[field]) > 1e-9) tool.setField(field, v);\n };\n\n return (\n <div className={`flex flex-wrap items-center gap-2 text-xs text-slate-200 ${className ?? ''}`} data-testid=\"free-transform-options\" role=\"toolbar\" aria-label=\"Free Transform options\">\n <div className=\"flex gap-1\" role=\"group\" aria-label=\"Transform mode\">\n {FREE_TRANSFORM_MODE_OPTIONS.map((m) => (\n <button key={m.id} type=\"button\" title={m.title} aria-pressed={tool.mode === m.id} className={chip(tool.mode === m.id)} onClick={() => tool.setMode(m.id)}>\n {m.label}\n </button>\n ))}\n </div>\n <div className=\"grid grid-cols-3 gap-px\" role=\"group\" aria-label=\"Reference point\">\n {TRANSFORM_ANCHORS.map((a: TransformAnchor) => (\n <button key={a} type=\"button\" aria-label={`Reference point ${a}`} title={`Reference point: ${a}`} className=\"h-2.5 w-2.5 rounded-sm bg-slate-700 hover:bg-indigo-500\" onClick={() => tool.setReference(a)} />\n ))}\n </div>\n {tool.mode === 'warp' && (\n <div className=\"flex flex-wrap items-center gap-2\" role=\"group\" aria-label=\"Warp options\">\n <label className=\"flex items-center gap-1\">\n <span className=\"text-slate-400\">Warp</span>\n <select aria-label=\"Warp style\" value={warp.style} onChange={(e) => tool.setWarp({ style: e.target.value as WarpBar['style'] })} className=\"rounded border border-slate-700 bg-slate-900 px-1 py-0.5\">\n {WARP_STYLE_OPTIONS.map((o) => (\n <option key={o.id} value={o.id}>\n {o.label}\n </option>\n ))}\n </select>\n </label>\n {(['bend', 'horizontal', 'vertical'] as const).map((k) => (\n <label key={k} className=\"flex items-center gap-1\">\n <span className=\"text-slate-400\">{k === 'bend' ? 'Bend' : k === 'horizontal' ? 'H' : 'V'}</span>\n <input\n key={`${k}:${warp[k]}`}\n type=\"number\"\n aria-label={k === 'bend' ? 'Warp bend in percent' : `Warp ${k} distortion in percent`}\n defaultValue={warp[k]}\n min={-100}\n max={100}\n disabled={warp.style === 'custom'}\n className=\"w-14 rounded border border-slate-700 bg-slate-900 px-1 py-0.5 text-right disabled:opacity-40\"\n onBlur={(e) => warpNumber(k, e.currentTarget.value)}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n e.stopPropagation();\n warpNumber(k, e.currentTarget.value);\n }\n }}\n />\n <span className=\"text-slate-500\">%</span>\n </label>\n ))}\n <button\n type=\"button\"\n title=\"Bend along the vertical axis\"\n aria-pressed={warp.orientation === 'vertical'}\n disabled={warp.style === 'custom'}\n className={chip(warp.orientation === 'vertical')}\n onClick={() => tool.setWarp({ orientation: warp.orientation === 'vertical' ? 'horizontal' : 'vertical' })}\n >\n Vertical\n </button>\n <label className=\"flex items-center gap-1\">\n <span className=\"text-slate-400\">Grid</span>\n <select\n aria-label=\"Warp grid\"\n value={WARP_GRID_OPTIONS.find((g) => g.columns === warp.columns && g.rows === warp.rows)?.id ?? '1x1'}\n onChange={(e) => {\n const g = WARP_GRID_OPTIONS.find((o) => o.id === e.target.value)!;\n tool.setWarp({ columns: g.columns, rows: g.rows });\n }}\n className=\"rounded border border-slate-700 bg-slate-900 px-1 py-0.5\"\n >\n {WARP_GRID_OPTIONS.map((g) => (\n <option key={g.id} value={g.id}>\n {g.label}\n </option>\n ))}\n </select>\n </label>\n </div>\n )}\n {tool.mode !== 'warp' && FREE_TRANSFORM_FIELDS.map((f) => (\n <label key={f.id} className=\"flex items-center gap-1\" title={f.title}>\n <span className=\"text-slate-400\">{f.label}</span>\n <input\n key={`${f.id}:${round(bar[f.id], f.unit)}`}\n type=\"number\"\n aria-label={f.title}\n defaultValue={round(bar[f.id], f.unit)}\n disabled={!bar.affine}\n step={f.unit === 'px' ? 1 : 0.1}\n className=\"w-16 rounded border border-slate-700 bg-slate-900 px-1 py-0.5 text-right disabled:opacity-40\"\n onBlur={(e) => apply(f.id, e.currentTarget.value)}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n e.stopPropagation();\n apply(f.id, e.currentTarget.value);\n }\n }}\n />\n <span className=\"text-slate-500\">{f.unit}</span>\n {f.id === 'scaleX' && (\n <button\n type=\"button\"\n aria-label=\"Keep width and height proportional\"\n aria-pressed={tool.proportional}\n className={chip(tool.proportional)}\n onClick={() => {\n tool.proportional = !tool.proportional;\n setTick((n) => n + 1);\n }}\n >\n ⛓︎\n </button>\n )}\n </label>\n ))}\n <label className=\"flex items-center gap-1\">\n <span className=\"text-slate-400\">Interpolation</span>\n <select\n aria-label=\"Interpolation\"\n value={tool.interpolation}\n onChange={(e) => tool.setInterpolation(e.target.value as Interpolation)}\n className=\"rounded border border-slate-700 bg-slate-900 px-1 py-0.5\"\n >\n {INTERPOLATIONS.map((i) => (\n <option key={i} value={i}>\n {i[0].toUpperCase() + i.slice(1)}\n </option>\n ))}\n </select>\n </label>\n <button type=\"button\" title=\"Commit (Enter)\" className=\"px-2 py-1 rounded bg-emerald-600 text-white hover:bg-emerald-500\" onClick={() => tool.commit()}>\n Commit\n </button>\n <button type=\"button\" title=\"Cancel (Esc)\" className={chip(false)} onClick={() => tool.cancel()}>\n Cancel\n </button>\n {tool.error && (\n <span role=\"alert\" className=\"text-rose-400\">\n {tool.error}\n </span>\n )}\n </div>\n );\n};\n","import React, { useEffect, useState } from 'react';\nimport type { ImageEditorController, LiveShapeKind, ShapeToolOptions } from '@pixerate/editor/image-editor';\nimport { LIVE_SHAPE_KINDS, SHAPE_KIND_LABELS, applyShapeOptions } from '@pixerate/editor/image-editor';\n\nexport interface ShapeOptionsBarProps {\n controller: ImageEditorController;\n options: ShapeToolOptions;\n onChange: (options: ShapeToolOptions) => void;\n className?: string;\n}\n\nconst chip = (on: boolean) => `px-2 py-1 rounded text-[11px] ${on ? 'bg-indigo-600 text-white' : 'bg-slate-800 text-slate-300 hover:text-white'}`;\n\n/**\n * The shape tool's options: the kind to draw, fill and stroke (colour or none), stroke width and\n * the kind's own settings (corner radius, sides, points, line weight and arrowhead). Changes also\n * apply to the active shape layer, as one undo step each.\n */\nexport const ShapeOptionsBar: React.FC<ShapeOptionsBarProps> = ({ controller, options, onChange, className }) => {\n const [, setTick] = useState(0);\n useEffect(() => controller.subscribe(() => setTick((n) => n + 1)), [controller]);\n const [error, setError] = useState<string | null>(null);\n const active = controller.getActiveLayer();\n const shapeId = active?.type === 'shape' ? active.id : null;\n const set = (change: Partial<ShapeToolOptions>) => {\n onChange({ ...options, ...change });\n if (!shapeId) return;\n try {\n setError(null);\n applyShapeOptions(controller, shapeId, change);\n } catch (e) {\n setError(e instanceof Error ? e.message : String(e));\n }\n };\n const num = (v: string, min: number, max: number) => Math.max(min, Math.min(max, Number(v) || min));\n\n return (\n <div className={`flex flex-col gap-2 text-xs text-slate-200 ${className ?? ''}`} data-testid=\"shape-options\">\n <div className=\"flex flex-wrap gap-1\" role=\"toolbar\" aria-label=\"Shape kind\">\n {LIVE_SHAPE_KINDS.map((k: LiveShapeKind) => (\n <button key={k} type=\"button\" aria-pressed={options.kind === k} className={chip(options.kind === k)} onClick={() => onChange({ ...options, kind: k })}>\n {SHAPE_KIND_LABELS[k]}\n </button>\n ))}\n </div>\n <div className=\"flex flex-wrap items-center gap-3\">\n <label className=\"flex items-center gap-1\">\n <input type=\"checkbox\" aria-label=\"Fill\" checked={options.fill !== null} onChange={(e) => set({ fill: e.target.checked ? '#4f46e5' : null })} />\n Fill\n <input\n type=\"color\"\n aria-label=\"Fill colour\"\n disabled={options.fill === null}\n value={options.fill ?? '#4f46e5'}\n onChange={(e) => set({ fill: e.target.value })}\n className=\"h-6 w-8 rounded border border-slate-700 bg-transparent\"\n />\n </label>\n <label className=\"flex items-center gap-1\">\n <input type=\"checkbox\" aria-label=\"Stroke\" checked={options.stroke !== null} onChange={(e) => set({ stroke: e.target.checked ? '#000000' : null })} />\n Stroke\n <input\n type=\"color\"\n aria-label=\"Stroke colour\"\n disabled={options.stroke === null}\n value={options.stroke ?? '#000000'}\n onChange={(e) => set({ stroke: e.target.value })}\n className=\"h-6 w-8 rounded border border-slate-700 bg-transparent\"\n />\n </label>\n <label className=\"flex items-center gap-1\">\n Width\n <input\n type=\"number\"\n aria-label=\"Stroke width\"\n min={0}\n max={200}\n value={options.strokeWidth}\n onChange={(e) => set({ strokeWidth: num(e.target.value, 0, 200) })}\n className=\"w-14 rounded border border-slate-700 bg-slate-950 px-1 py-0.5\"\n />\n </label>\n </div>\n <div className=\"flex flex-wrap items-center gap-3\">\n {options.kind === 'rect' && (\n <label className=\"flex items-center gap-1\">\n Radius\n <input type=\"number\" aria-label=\"Corner radius\" min={0} max={1000} value={options.radius} onChange={(e) => set({ radius: num(e.target.value, 0, 1000) })} className=\"w-14 rounded border border-slate-700 bg-slate-950 px-1 py-0.5\" />\n </label>\n )}\n {options.kind === 'polygon' && (\n <label className=\"flex items-center gap-1\">\n Sides\n <input type=\"number\" aria-label=\"Sides\" min={3} max={100} value={options.sides} onChange={(e) => set({ sides: num(e.target.value, 3, 100) })} className=\"w-14 rounded border border-slate-700 bg-slate-950 px-1 py-0.5\" />\n </label>\n )}\n {options.kind === 'star' && (\n <>\n <label className=\"flex items-center gap-1\">\n Points\n <input type=\"number\" aria-label=\"Points\" min={3} max={100} value={options.points} onChange={(e) => set({ points: num(e.target.value, 3, 100) })} className=\"w-14 rounded border border-slate-700 bg-slate-950 px-1 py-0.5\" />\n </label>\n <label className=\"flex items-center gap-1\">\n Inner\n <input\n type=\"range\"\n aria-label=\"Inner radius\"\n min={0.05}\n max={1}\n step={0.05}\n value={options.innerRatio}\n onChange={(e) => set({ innerRatio: Number(e.target.value) })}\n className=\"accent-indigo-500\"\n />\n </label>\n </>\n )}\n {options.kind === 'line' && (\n <>\n <label className=\"flex items-center gap-1\">\n Weight\n <input type=\"number\" aria-label=\"Line weight\" min={1} max={200} value={options.weight} onChange={(e) => set({ weight: num(e.target.value, 1, 200) })} className=\"w-14 rounded border border-slate-700 bg-slate-950 px-1 py-0.5\" />\n </label>\n <label className=\"flex items-center gap-1\">\n <input type=\"checkbox\" aria-label=\"Arrowhead\" checked={options.arrow} onChange={(e) => set({ arrow: e.target.checked })} />\n Arrowhead\n </label>\n </>\n )}\n </div>\n <p className=\"text-[10px] text-slate-500\">Drag on the image to draw. Shift: square, circle or 45° line. Alt: from the centre.</p>\n {error && (\n <p role=\"alert\" className=\"text-rose-400\">\n {error}\n </p>\n )}\n </div>\n );\n};\n","import React, { useEffect, useState } from 'react';\nimport type { ImageEditorController, TextAlign, TextEditSession, TextStyle, TypeToolOptions } from '@pixerate/editor/image-editor';\nimport { TEXT_ALIGNS } from '@pixerate/editor/image-editor';\n\nexport interface TypeOptionsBarProps {\n controller: ImageEditorController;\n options: TypeToolOptions;\n onChange: (options: TypeToolOptions) => void;\n /** The text being edited on the canvas: changes style its selection (or all of it). */\n session?: TextEditSession | null;\n className?: string;\n}\n\nconst chip = (on: boolean) => `px-2 py-1 rounded text-[11px] ${on ? 'bg-indigo-600 text-white' : 'bg-slate-800 text-slate-300 hover:text-white'}`;\nconst ALIGN_LABELS: Record<TextAlign, string> = { left: 'Left', center: 'Centre', right: 'Right', justify: 'Justify' };\n\n/**\n * The type tool's options: font family (from the editor's fonts), size, bold, italic, colour and\n * alignment. While text is being edited they style the selection (or the whole text); with a\n * type layer active they style all of it; otherwise they set what the next text uses.\n */\nexport const TypeOptionsBar: React.FC<TypeOptionsBarProps> = ({ controller, options, onChange, session, className }) => {\n const [, setTick] = useState(0);\n useEffect(() => controller.subscribe(() => setTick((n) => n + 1)), [controller]);\n useEffect(() => session?.subscribe(() => setTick((n) => n + 1)), [session]);\n const [error, setError] = useState<string | null>(null);\n const active = controller.getActiveLayer();\n const typeId = !session && active?.type === 'type' ? active.id : null;\n const here: Partial<TextStyle> = session?.alive ? session.styleHere() : {};\n const shown: TypeToolOptions = {\n ...options,\n ...(here.fontFamily ? { fontFamily: here.fontFamily } : {}),\n ...(here.fontSize ? { fontSize: here.fontSize } : {}),\n ...(here.fontWeight ? { fontWeight: here.fontWeight } : {}),\n ...(session?.alive ? { italic: Boolean(here.italic), color: here.color ?? options.color } : {}),\n };\n const fonts = controller.listFonts();\n const missing = active?.type === 'type' ? active.missingFonts ?? [] : [];\n\n const style = (change: Partial<TypeToolOptions>) => {\n onChange({ ...options, ...change });\n const s: Record<string, unknown> = {};\n for (const k of ['fontFamily', 'fontSize', 'fontWeight', 'italic', 'color'] as const) if (k in change) s[k] = change[k];\n const p = change.align ? { align: change.align } : null;\n try {\n setError(null);\n if (session?.alive) {\n if (Object.keys(s).length) session.setStyle(s as Partial<TextStyle>);\n if (p) session.setParagraph(p);\n if (session.error) setError(session.error);\n } else if (typeId) {\n if (Object.keys(s).length) controller.setTextStyle(typeId, s);\n if (p) controller.setParagraphStyle(typeId, p);\n }\n } catch (e) {\n setError(e instanceof Error ? e.message : String(e));\n }\n };\n\n return (\n <div className={`flex flex-col gap-2 text-xs text-slate-200 ${className ?? ''}`} data-testid=\"type-options\">\n <div className=\"flex flex-wrap items-center gap-2\">\n <label className=\"flex items-center gap-1\">\n Font\n <input\n list=\"pixerate-type-fonts\"\n aria-label=\"Font family\"\n value={shown.fontFamily}\n onChange={(e) => e.target.value.trim() && style({ fontFamily: e.target.value })}\n className=\"w-32 rounded border border-slate-700 bg-slate-950 px-1 py-0.5\"\n />\n <datalist id=\"pixerate-type-fonts\">\n {fonts.map((f) => (\n <option key={f} value={f} />\n ))}\n </datalist>\n </label>\n <label className=\"flex items-center gap-1\">\n Size\n <input\n type=\"number\"\n aria-label=\"Font size\"\n min={1}\n max={2000}\n value={Math.round(shown.fontSize * 10) / 10}\n onChange={(e) => Number(e.target.value) > 0 && style({ fontSize: Number(e.target.value) })}\n className=\"w-16 rounded border border-slate-700 bg-slate-950 px-1 py-0.5\"\n />\n </label>\n <button type=\"button\" aria-pressed={shown.fontWeight >= 600} className={`${chip(shown.fontWeight >= 600)} font-bold`} onClick={() => style({ fontWeight: shown.fontWeight >= 600 ? 400 : 700 })}>\n B\n </button>\n <button type=\"button\" aria-pressed={shown.italic} className={`${chip(shown.italic)} italic`} onClick={() => style({ italic: !shown.italic })}>\n I\n </button>\n <input type=\"color\" aria-label=\"Text colour\" value={shown.color} onChange={(e) => style({ color: e.target.value })} className=\"h-6 w-8 rounded border border-slate-700 bg-transparent\" />\n </div>\n <div className=\"flex gap-1\" role=\"toolbar\" aria-label=\"Alignment\">\n {TEXT_ALIGNS.map((a) => (\n <button key={a} type=\"button\" aria-pressed={options.align === a} className={chip(options.align === a)} onClick={() => style({ align: a })}>\n {ALIGN_LABELS[a]}\n </button>\n ))}\n </div>\n <p className=\"text-[10px] text-slate-500\">Click to type point text, drag for a paragraph box, click text to edit it. Esc finishes.</p>\n {missing.length > 0 && (\n <p role=\"status\" className=\"text-amber-400\" data-testid=\"type-missing-fonts\">\n Missing {missing.length === 1 ? 'font' : 'fonts'}: {missing.join(', ')}\n </p>\n )}\n {error && (\n <p role=\"alert\" className=\"text-rose-400\">\n {error}\n </p>\n )}\n </div>\n );\n};\n"],"mappings":";;;;;;;;;;;AAAA,SAAS,QAAQ,UAAU,WAAW,aAAa,eAAe;AAElE;AAAA,EACE;AAAA,EACA;AAAA,OAmBK;AAyDA,SAAS,eAAe,UAA8B,CAAC,GAAyB;AACrF,QAAM,gBAAgB,OAAqC,IAAI;AAE/D,MAAI,CAAC,cAAc,SAAS;AAC1B,kBAAc,UAAU,IAAI,sBAAsB,OAAO;AAAA,EAC3D;AAEA,QAAM,aAAa,cAAc;AACjC,QAAM,CAAC,OAAO,QAAQ,IAAI,SAA2B,MAAM,WAAW,SAAS,CAAC;AAChF,QAAM,CAAC,cAAc,eAAe,IAAI,SAAS,CAAC;AAClD,QAAM,CAAC,WAAW,YAAY,IAAI,SAAgC,MAAM,WAAW,aAAa,CAAC;AAEjG,YAAU,MAAM,WAAW,mBAAmB,YAAY,GAAG,CAAC,UAAU,CAAC;AAEzE,YAAU,MAAM;AACd,UAAM,QAAQ,WAAW,UAAU,CAAC,SAAS;AAC3C,eAAS,IAAI;AACb,sBAAgB,CAAC,MAAM,IAAI,CAAC;AAAA,IAC9B,CAAC;AACD,WAAO;AAAA,EACT,GAAG,CAAC,UAAU,CAAC;AAKf,QAAM,iBAAiB,OAAO,QAAQ,KAAK;AAC3C,YAAU,MAAM;AACd,QAAI,QAAQ,UAAU,eAAe,QAAS;AAC9C,mBAAe,UAAU,QAAQ;AACjC,QAAI,QAAQ,OAAO;AACjB,iBAAW,UAAU,QAAQ,KAAK;AAAA,IACpC;AAAA,EACF,GAAG,CAAC,QAAQ,OAAO,UAAU,CAAC;AAE9B,QAAM,UAAU,YAAY,CAAC,SAA0B,WAAW,QAAQ,IAAI,GAAG,CAAC,UAAU,CAAC;AAC7F,QAAM,UAAU;AAAA,IACd,CAAC,MAAsB,eAAe,SAAS,WAAW,QAAQ,MAAM,YAAY;AAAA,IACpF,CAAC,UAAU;AAAA,EACb;AACA,QAAM,kBAAkB,YAAY,CAAC,UAAuB,WAAW,gBAAgB,KAAK,GAAG,CAAC,UAAU,CAAC;AAC3G,QAAM,YAAY,YAAY,MAAM,WAAW,UAAU,GAAG,CAAC,UAAU,CAAC;AACxE,QAAM,SAAS,YAAY,CAAC,QAAgB,WAAW,OAAO,GAAG,GAAG,CAAC,UAAU,CAAC;AAChF,QAAM,cAAc,YAAY,CAAC,QAAgB,WAAW,YAAY,GAAG,GAAG,CAAC,UAAU,CAAC;AAC1F,QAAM,iBAAiB,YAAY,MAAM,WAAW,eAAe,GAAG,CAAC,UAAU,CAAC;AAClF,QAAM,eAAe,YAAY,MAAM,WAAW,aAAa,GAAG,CAAC,UAAU,CAAC;AAC9E,QAAM,iBAAiB;AAAA,IACrB,CAAC,SAAoC,kBAAkB,SACrD,WAAW,eAAe,SAAS,eAAe;AAAA,IACpD,CAAC,UAAU;AAAA,EACb;AACA,QAAM,mBAAmB,YAAY,MAAM,WAAW,iBAAiB,GAAG,CAAC,UAAU,CAAC;AACtF,QAAM,iBAAiB,YAAY,MAAM,WAAW,eAAe,GAAG,CAAC,UAAU,CAAC;AAClF,QAAM,qBAAqB;AAAA,IACzB,CAAC,MAA4C,UAAmB,WAAW,mBAAmB,MAAM,KAAK;AAAA,IACzG,CAAC,UAAU;AAAA,EACb;AACA,QAAM,wBAAwB;AAAA,IAC5B,CAAC,IAAY,QAA+B,kBAAkB,SAC5D,WAAW,sBAAsB,IAAI,QAAQ,eAAe;AAAA,IAC9D,CAAC,UAAU;AAAA,EACb;AACA,QAAM,wBAAwB,YAAY,CAAC,OAAe,WAAW,sBAAsB,EAAE,GAAG,CAAC,UAAU,CAAC;AAC5G,QAAM,sBAAsB,YAAY,CAAC,IAAY,OAAe,WAAW,oBAAoB,IAAI,EAAE,GAAG,CAAC,UAAU,CAAC;AACxH,QAAM,wBAAwB;AAAA,IAC5B,CAAC,IAAY,YAAsB,WAAW,sBAAsB,IAAI,OAAO;AAAA,IAC/E,CAAC,UAAU;AAAA,EACb;AACA,QAAM,eAAe,YAAY,CAAC,YAAuC,WAAW,aAAa,OAAO,GAAG,CAAC,UAAU,CAAC;AACvH,QAAM,iBAAiB,YAAY,MAAM,WAAW,eAAe,GAAG,CAAC,UAAU,CAAC;AAClF,QAAM,gBAAgB,YAAY,CAAC,QAAiC,WAAW,cAAc,GAAG,GAAG,CAAC,UAAU,CAAC;AAC/G,QAAM,mBAAmB;AAAA,IACvB,CAAC,IAAY,SAA8B,kBAAkB,SAC3D,WAAW,iBAAiB,IAAI,SAAS,eAAe;AAAA,IAC1D,CAAC,UAAU;AAAA,EACb;AACA,QAAM,mBAAmB,YAAY,CAAC,OAAe,WAAW,iBAAiB,EAAE,GAAG,CAAC,UAAU,CAAC;AAClG,QAAM,mBAAmB,YAAY,MAAM,WAAW,iBAAiB,GAAG,CAAC,UAAU,CAAC;AACtF,QAAM,mBAAmB,YAAY,CAAC,OAAsB,WAAW,iBAAiB,EAAE,GAAG,CAAC,UAAU,CAAC;AACzG,QAAM,OAAO,YAAY,MAAM,WAAW,KAAK,GAAG,CAAC,UAAU,CAAC;AAC9D,QAAM,OAAO,YAAY,MAAM,WAAW,KAAK,GAAG,CAAC,UAAU,CAAC;AAC9D,QAAM,QAAQ,YAAY,MAAM,WAAW,MAAM,GAAG,CAAC,UAAU,CAAC;AAChE,QAAM,SAAS,YAAY,CAAC,WAAoB,WAAW,OAAO,MAAM,GAAG,CAAC,UAAU,CAAC;AACvF,QAAM,UAAU,YAAY,CAAC,WAAoB,WAAW,QAAQ,MAAM,GAAG,CAAC,UAAU,CAAC;AACzF,QAAM,YAAY,YAAY,MAAM,WAAW,UAAU,GAAG,CAAC,UAAU,CAAC;AACxE,QAAM,UAAU,YAAY,CAAC,SAAiB,WAAW,QAAQ,IAAI,GAAG,CAAC,UAAU,CAAC;AACpF,QAAM,SAAS,YAAY,CAAC,QAAoB,WAAW,OAAO,GAAG,GAAG,CAAC,UAAU,CAAC;AACpF,QAAM,eAAe,YAAY,CAAC,SAAkB,WAAW,aAAa,IAAI,GAAG,CAAC,UAAU,CAAC;AAC/F,QAAM,YAAY,YAAY,CAAC,QAAmC,WAAW,UAAU,GAAG,GAAG,CAAC,UAAU,CAAC;AACzG,QAAM,YAAY,YAAY,CAAC,SAAyB,WAAW,UAAU,IAAI,GAAG,CAAC,UAAU,CAAC;AAChG,QAAM,SAAS,YAAY,CAAC,SAAyB,WAAW,OAAO,IAAI,GAAG,CAAC,UAAU,CAAC;AAC1F,QAAM,SAAS,YAAY,MAAM,WAAW,OAAO,GAAG,CAAC,UAAU,CAAC;AAClE,QAAM,WAAW,YAAY,CAAC,SAAqC,WAAW,SAAS,IAAI,GAAG,CAAC,UAAU,CAAC;AAC1G,QAAM,aAAa;AAAA,IACjB,CAAC,SAA2D,WAAW,WAAW,IAAI;AAAA,IACtF,CAAC,UAAU;AAAA,EACb;AACA,QAAM,gBAAgB;AAAA,IACpB,CAAC,SAA2D,WAAW,cAAc,IAAI;AAAA,IACzF,CAAC,UAAU;AAAA,EACb;AACA,QAAM,kBAAkB;AAAA,IACtB,CAAC,SAAqD,WAAW,gBAAgB,IAAI;AAAA,IACrF,CAAC,UAAU;AAAA,EACb;AACA,QAAM,sBAAsB;AAAA,IAC1B,CAAC,YAAoBA,aAA8B,WAAW,oBAAoB,YAAYA,QAAO;AAAA,IACrG,CAAC,UAAU;AAAA,EACb;AACA,QAAM,8BAA8B;AAAA,IAClC,CAAC,YAAoBA,aAA8B,WAAW,4BAA4B,YAAYA,QAAO;AAAA,IAC7G,CAAC,UAAU;AAAA,EACb;AAEA,SAAO;AAAA,IACL,OAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA,SAAS,WAAW;AAAA,MACpB,SAAS,WAAW;AAAA,MACpB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA;AAAA,IAEA,CAAC,YAAY,OAAO,cAAc,SAAS;AAAA,EAC7C;AACF;AAQO,SAAS,qBACd,UACA,YACA,UAA2C,CAAC,GACtC;AACN,QAAM,EAAE,IAAI,WAAW,SAAS,IAAI;AACpC,YAAU,MAAM;AACd,QAAI,CAAC,SAAU;AACf,WAAO,SAAS,SAAS,+BAA+B,YAAY,EAAE,IAAI,WAAW,SAAS,CAAC,CAAC;AAAA,EAClG,GAAG,CAAC,UAAU,YAAY,IAAI,WAAW,QAAQ,CAAC;AACpD;;;ACxQA,OAAOC,WAAS,UAAAC,SAAQ,aAAAC,aAAW,YAAAC,YAAU,eAAAC,oBAAmB;AAYhE;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAKK;;;ACnCP,SAAS,wBAAwB,0BAA0B;AAiBrD,SACE,KADF;AALC,IAAM,gBAA8C,CAAC,EAAE,MAAM,OAAO,UAAU,UAAU,MAAM,MAAM;AACzG,QAAM,OAAO,SAAS,KAAK;AAC3B,QAAM,QAAQ,uBAAuB,IAAI;AACzC,SACE,qBAAC,SAAI,mBAAiB,KAAK,IACzB;AAAA,yBAAC,SAAI,WAAU,4CACb;AAAA,0BAAC,UAAM,gBAAK;AAAA,MACZ,oBAAC,UAAK,WAAU,aAAa,6BAAmB,MAAM,KAAK,GAAE;AAAA,OAC/D;AAAA,IACA;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,KAAK,KAAK;AAAA,QACV,KAAK,KAAK;AAAA,QACV,MAAM,KAAK;AAAA,QACX,cAAY;AAAA,QACZ;AAAA,QACA;AAAA,QACA,UAAU,CAAC,MAAM,SAAS,OAAO,EAAE,OAAO,KAAK,CAAC;AAAA,QAChD,WAAU;AAAA;AAAA,IACZ;AAAA,IACC,SAAS,oBAAC,SAAI,WAAU,iCAAgC,OAAO,EAAE,YAAY,MAAM,GAAG;AAAA,KACzF;AAEJ;;;ACrCA,SAAgB,aAAAC,YAAW,WAAAC,UAAS,YAAAC,iBAAgB;AAEpD,SAAS,qBAAqB;AA+B1B,SAUI,OAAAC,MAVJ,QAAAC,aAAA;AApBJ,IAAM,OAA+D;AAAA,EACnE,WAAW;AAAA,EACX,KAAK;AAAA,EACL,OAAO;AAAA,EACP,MAAM;AACR;AAEA,IAAM,IAAI;AAGH,IAAM,YAAsC,CAAC,EAAE,WAAW,UAAU,OAAO,SAAS,IAAI,YAAY,IAAI,MAAM,MAAM;AACzH,QAAM,WAAW,YAAY,QAAS,CAAC,aAAa,OAAO,SAAS,MAAM,IAAe,CAAC,OAAO;AACjG,QAAM,QAAQH;AAAA,IACZ,MAAO,aAAa,UAAU,UAAU,IAAI,SAAS,IAAI,CAAC,OAAO,EAAE,GAAG,GAAG,cAAc,WAAW,GAAG,GAAG,MAAM,EAAE,EAAE,IAAI,CAAC;AAAA;AAAA,IAEvH,CAAC,WAAW,SAAS,MAAM;AAAA,EAC7B;AACA,QAAM,UAAU,aAAa,UAAU,UAAU,KAAK,IAAI,GAAG,UAAU,OAAO,IAAI,UAAU,UAAU;AACtG,QAAM,WAAW,aAAa,UAAU,UAAU,KAAK,IAAI,GAAG,UAAU,UAAU,IAAI,UAAU,UAAU;AAC1G,SACE,gBAAAG;AAAA,IAAC;AAAA;AAAA,MACC,SAAS,OAAO,CAAC,IAAI,MAAM;AAAA,MAC3B,qBAAoB;AAAA,MACpB,MAAK;AAAA,MACL,cAAY,YAAY,gBAAgB,UAAU,OAAO,YAAY;AAAA,MACrE,eAAY;AAAA,MACZ,WAAW,kCAAkC,SAAS;AAAA,MACtD,OAAO,EAAE,QAAQ,GAAG,MAAM;AAAA,MAEzB;AAAA,cAAM,IAAI,CAAC,EAAE,GAAG,EAAE,MACjB,gBAAAD,KAAC,UAAa,GAAM,MAAM,KAAK,CAAC,GAAG,QAAO,UAA/B,CAAsC,CAClD;AAAA,QACA,UAAU,QAAS,gBAAAA,KAAC,UAAK,GAAG,GAAG,GAAG,GAAG,OAAO,GAAG,QAAgB,MAAK,WAAU,eAAY,0BAAyB;AAAA,QACnH,WAAW,QAAS,gBAAAA,KAAC,UAAK,GAAG,IAAI,GAAG,GAAG,GAAG,OAAO,GAAG,QAAgB,MAAK,WAAU,eAAY,6BAA4B;AAAA;AAAA;AAAA,EAC9H;AAEJ;AAGO,SAAS,kBAAkB,YAA0D;AAC1F,QAAM,CAAC,WAAW,YAAY,IAAID,UAAgC,MAAM,WAAW,aAAa,CAAC;AACjG,EAAAF,WAAU,MAAM,WAAW,mBAAmB,YAAY,GAAG,CAAC,UAAU,CAAC;AACzE,SAAO;AACT;;;ACxDA,SAAgB,aAAAK,YAAW,YAAAC,iBAAgB;AAU3C;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;;;ACpBP,SAAgB,UAAAC,SAAQ,YAAAC,iBAAgB;AAExC;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,iBAAAC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAuEC,gBAAAC,MAGA,QAAAC,aAHA;AA5DR,IAAM,MAAM;AACZ,IAAM,SAAS,EAAE,QAAQ,WAAW,KAAK,WAAW,OAAO,WAAW,MAAM,UAAU;AAM/E,IAAM,eAA4C,CAAC,EAAE,QAAQ,UAAU,WAAW,UAAU,UAAU,OAAO,IAAI,MAAM;AAC5H,QAAM,SAASJ,QAAsB,IAAI;AACzC,QAAM,CAAC,MAAM,OAAO,IAAIC,UAAwB,IAAI;AAEpD,QAAM,QAAQ,CAAC,MAA6C;AAC1D,UAAM,OAAO,OAAO,SAAS,sBAAsB;AACnD,QAAI,CAAC,QAAQ,CAAC,KAAK,SAAS,CAAC,KAAK,OAAQ,QAAO,EAAE,GAAG,GAAG,GAAG,EAAE;AAC9D,WAAO,EAAE,IAAK,EAAE,UAAU,KAAK,QAAQ,KAAK,QAAS,KAAK,IAAK,EAAE,UAAU,KAAK,OAAO,KAAK,SAAU,IAAI;AAAA,EAC5G;AAEA,QAAM,gBAAgB,CAAC,MAA0B;AAC/C,UAAM,EAAE,GAAG,EAAE,IAAI,MAAM,CAAC;AACxB,QAAI,QAAQ,kBAAkB,QAAQ,GAAG,GAAG,KAAK,KAAK,EAAE;AACxD,QAAI,UAAU,IAAI;AAChB,YAAM,WAAW,iBAAiB,QAAQ,gBAAgB,GAAG,GAAG,KAAK,GAAG,CAAC;AACzE,eAAS,SAAS,QAAQ,IAAI;AAC9B,cAAQ,SAAS;AAAA,IACnB,OAAO;AACL,eAAS,QAAQ,IAAI;AAAA,IACvB;AACA,YAAQ,KAAK;AACb,IAAC,EAAE,OAAmB,oBAAoB,EAAE,SAAS;AAAA,EACvD;AAEA,QAAM,gBAAgB,CAAC,MAA0B;AAC/C,QAAI,SAAS,KAAM;AACnB,aAAS,eAAe,QAAQ,MAAM,gBAAgB,MAAM,CAAC,EAAE,GAAG,MAAM,CAAC,EAAE,GAAG,KAAK,GAAG,CAAC,GAAG,KAAK;AAAA,EACjG;AAEA,QAAM,gBAAgB,CAAC,MAAwB;AAC7C,UAAM,EAAE,GAAG,EAAE,IAAI,MAAM,CAAC;AACxB,UAAM,QAAQ,kBAAkB,QAAQ,GAAG,GAAG,KAAK,KAAK,EAAE;AAC1D,QAAI,UAAU,MAAM,OAAO,SAAS,EAAG,UAAS,iBAAiB,QAAQ,KAAK,GAAG,IAAI;AAAA,EACvF;AAEA,QAAM,cAAc,YAAY,WAAW,cAAc;AACzD,SACE,gBAAAG;AAAA,IAAC;AAAA;AAAA,MACC,KAAK;AAAA,MACL,SAAS,OAAO,GAAG,IAAI,GAAG;AAAA,MAC1B,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,MAAK;AAAA,MACL,cAAY,GAAG,OAAO;AAAA,MACtB,eAAY;AAAA,MACZ,WAAU;AAAA,MACV;AAAA,MACA;AAAA,MACA,aAAa,MAAM,QAAQ,IAAI;AAAA,MAC/B,iBAAiB,MAAM,QAAQ,IAAI;AAAA,MACnC;AAAA,MAEC;AAAA,qBAAa,UAAU,UAAU,KAChC,gBAAAD,KAAC,UAAK,GAAGD,eAAc,WAAW,aAAa,KAAK,GAAG,GAAG,MAAK,6BAA4B;AAAA,QAE5F,CAAC,IAAI,KAAK,GAAG,EAAE,IAAI,CAAC,MACnB,gBAAAE,MAAC,OAAU,QAAO,4BAA2B,aAAa,GACxD;AAAA,0BAAAD,KAAC,UAAK,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,KAAK;AAAA,UACpC,gBAAAA,KAAC,UAAK,IAAI,GAAG,IAAI,GAAG,IAAI,KAAK,IAAI,GAAG;AAAA,aAF9B,CAGR,CACD;AAAA,QACD,gBAAAA,KAAC,UAAK,IAAI,GAAG,IAAI,KAAK,IAAI,KAAK,IAAI,GAAG,QAAO,6BAA4B,iBAAgB,OAAM;AAAA,QAC/F,gBAAAA,KAAC,UAAK,GAAG,aAAa,QAAQ,KAAK,GAAG,GAAG,MAAK,QAAO,QAAQ,OAAO,OAAO,GAAG,aAAa,GAAG;AAAA,QAC7F,OAAO,IAAI,CAAC,GAAG,MAAM;AACpB,gBAAM,IAAI,gBAAgB,GAAG,KAAK,GAAG;AACrC,iBACE,gBAAAA;AAAA,YAAC;AAAA;AAAA,cAEC,IAAI,EAAE;AAAA,cACN,IAAI,EAAE;AAAA,cACN,GAAG;AAAA,cACH,MAAM,SAAS,IAAI,OAAO,OAAO,IAAI;AAAA,cACrC,QAAQ,OAAO,OAAO;AAAA,cACtB,aAAa;AAAA,cACb,cAAY,SAAS,EAAE,KAAK,OAAO,EAAE,MAAM;AAAA;AAAA,YAPtC;AAAA,UAQP;AAAA,QAEJ,CAAC;AAAA;AAAA;AAAA,EACH;AAEJ;;;ADzDI,SAIQ,OAAAE,MAJR,QAAAC,aAAA;AApBJ,IAAM,WAA6C;AAAA,EACjD,EAAE,IAAI,UAAU,OAAO,MAAM;AAAA,EAC7B,EAAE,IAAI,OAAO,OAAO,MAAM;AAAA,EAC1B,EAAE,IAAI,SAAS,OAAO,QAAQ;AAAA,EAC9B,EAAE,IAAI,QAAQ,OAAO,OAAO;AAC9B;AACA,IAAM,QAAQ;AAAA,EACZ,EAAE,IAAI,WAAW,OAAO,UAAU;AAAA,EAClC,EAAE,IAAI,YAAY,OAAO,WAAW;AAAA,EACpC,EAAE,IAAI,cAAc,OAAO,aAAa;AAC1C;AAEA,IAAM,cAAc;AACpB,IAAM,YAAY,CAAC,OACjB,mCAAmC,KAAK,6BAA6B,kDAAkD;AAGzH,IAAM,gBAAwE,CAAC,EAAE,OAAO,MAAM;AAC5F,QAAM,MAAM,MAAM,KAAK,EAAE,QAAQ,GAAG,GAAG,CAAC,GAAG,MAAM,GAAI,IAAI,KAAM,GAAG,IAAI,KAAK,eAAe,EAAE,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,EAAE,EAAE,KAAK,GAAG;AAC7H,SACE,gBAAAA,MAAC,SAAI,SAAQ,cAAa,qBAAoB,QAAO,WAAU,sBAAqB,eAAY,mBAC9F;AAAA,oBAAAD,KAAC,UACC,0BAAAA,KAAC,oBAAe,IAAG,sBAChB,WAAC,GAAG,IAAI,KAAK,KAAK,KAAK,KAAK,GAAG,EAAE,IAAI,CAAC,MACrC,gBAAAA,KAAC,UAAa,QAAQ,GAAI,IAAI,MAAO,GAAG,KAAK,WAAW,OAAO,CAAC,iBAArD,CAAoE,CAChF,GACH,GACF;AAAA,IACA,gBAAAA,KAAC,UAAK,OAAO,KAAK,QAAQ,IAAI,MAAK,4BAA2B,SAAS,KAAK;AAAA,IAC5E,gBAAAA,KAAC,cAAS,QAAQ,KAAK,MAAK,QAAO,QAAO,QAAO,aAAa,KAAK;AAAA,KACrE;AAEJ;AAMO,IAAM,wBAA8D,CAAC,EAAE,YAAY,QAAQ,YAAY,UAAU,MAAM;AAE5H,QAAM,SAAS,eAAe;AAC9B,QAAM,CAAC,EAAE,OAAO,IAAIE,UAAS,CAAC;AAC9B,EAAAC,WAAU,MAAO,SAAS,WAAW,UAAU,MAAM,QAAQ,CAAC,MAAM,IAAI,CAAC,CAAC,IAAI,QAAY,CAAC,YAAY,MAAM,CAAC;AAC9G,QAAM,SAAS,cAAc,WAAW,oBAAoB;AAC5D,QAAM,CAAC,SAAS,UAAU,IAAID,UAAyB,QAAQ;AAC/D,QAAM,CAAC,YAAY,aAAa,IAAIA,UAAwB,IAAI;AAChE,QAAM,CAAC,SAAS,UAAU,IAAIA,UAAkB,QAAQ;AACxD,QAAM,CAAC,OAAO,QAAQ,IAAIA,UAAiB,EAAE;AAC7C,QAAM,CAAC,MAAM,OAAO,IAAIA,UAAuC,UAAU;AAEzE,QAAM,WAAW,OAAO,KAAK,CAAC,MAAM,EAAE,OAAO,UAAU,KAAK;AAC5D,QAAM,WAAW,CAAC,GAAG,MAAM,EAAE,QAAQ;AAErC,QAAM,WAAW,CAAC,OAAwB,MAAc,OAAgB,SAAS,SAC/E,WAAW,sBAAsB,MAAM,IAAI,EAAE,QAAQ,eAAe,MAAM,QAAQ,MAAM,KAAK,EAAW,GAAG,MAAM;AAEnH,QAAM,SAAS,CAAC,OAAwB,MAAmB,UACzD,gBAAAF;AAAA,IAAC;AAAA;AAAA,MAEC;AAAA,MACA;AAAA,MACA,OAAO,OAAO,eAAe,MAAM,QAAQ,KAAK,EAAE,KAAK,KAAK,OAAO;AAAA,MACnE,UAAU,CAAC,MAAM,SAAS,OAAO,KAAK,IAAI,CAAC;AAAA;AAAA,IAJtC,KAAK;AAAA,EAKZ;AAEF,QAAM,aAAa,CAAC,OAAwB,SAAyC,MAAM,SACzF,0BAA0B,MAAM,IAAI,EAAE,OAAO,MAAM;AACrD,QAAM,WAAW,CAAC,OAAwB,MAAc,UACtD,gBAAAC,MAAC,WAAM,WAAU,0CACf;AAAA,oBAAAD;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,SAAS,QAAQ,eAAe,MAAM,QAAQ,IAAI,CAAC;AAAA,QACnD,UAAU,CAAC,MAAM,SAAS,OAAO,MAAM,EAAE,OAAO,OAAO;AAAA,QACvD,WAAU;AAAA;AAAA,IACZ;AAAA,IACC;AAAA,KACH;AAGF,QAAM,SAAS,CAAC,UAA2B;AACzC,YAAQ,MAAM,MAAM;AAAA,MAClB,KAAK;AACH,eACE,gBAAAC,MAAC,SAAI,WAAU,uBACb;AAAA,0BAAAD,KAAC,SAAI,WAAU,cAAa,MAAK,SAAQ,cAAW,iBACjD,mBAAS,IAAI,CAAC,MACb,gBAAAA,KAAC,YAAkB,MAAK,UAAS,WAAW,UAAU,YAAY,EAAE,EAAE,GAAG,SAAS,MAAM,WAAW,EAAE,EAAE,GACpG,YAAE,SADQ,EAAE,EAEf,CACD,GACH;AAAA,UACA,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACC,QAAQ,MAAM,OAAO,OAAO;AAAA,cAC5B;AAAA,cACA;AAAA,cACA,UAAU,CAAC,QAAsB,WAAW,SAAS,OAAO,SAAS,QAAQ,MAAM;AAAA;AAAA,UACrF;AAAA,WACF;AAAA,MAEJ,KAAK;AACH,eACE,gBAAAC,MAAC,SAAI,WAAU,uBACb;AAAA,0BAAAD,KAAC,SAAI,WAAU,cAAa,MAAK,SAAQ,cAAW,kBACjD,mBAAS,IAAI,CAAC,MACb,gBAAAA,KAAC,YAAkB,MAAK,UAAS,WAAW,UAAU,YAAY,EAAE,EAAE,GAAG,SAAS,MAAM,WAAW,EAAE,EAAE,GACpG,YAAE,SADQ,EAAE,EAEf,CACD,GACH;AAAA,UACC,WAAW,OAAO,CAAC,MAAM,EAAE,GAAG,WAAW,GAAG,OAAO,GAAG,CAAC,EAAE,IAAI,CAAC,MAAM,OAAO,OAAO,CAAC,CAAC;AAAA,WACvF;AAAA,MAEJ,KAAK;AACH,eACE,gBAAAC,MAAC,SAAI,WAAU,uBACb;AAAA,0BAAAA,MAAC,SAAI,WAAU,wBAAuB,MAAK,SAAQ,cAAW,aAC5D;AAAA,4BAAAD,KAAC,YAAO,MAAK,UAAS,WAAW,UAAU,UAAU,EAAE,GAAG,SAAS,MAAM,SAAS,EAAE,GAAG,oBAEvF;AAAA,YACC,iBAAiB,IAAI,CAAC,MAAM,MAC3B,gBAAAA,KAAC,YAAkB,MAAK,UAAS,WAAW,UAAU,UAAU,CAAC,GAAG,SAAS,MAAM,SAAS,CAAC,GAAG,UAAU,MAAM,OAAO,UACpH,kBADU,IAEb,CACD;AAAA,aACH;AAAA,UACC,SAAS,KAAK,CAAC,MAAM,OAAO,YAAY,gBAAAA,KAAC,iBAAc,QAAQ,MAAM,OAAO,OAAO,KAAK,EAAE,QAAQ;AAAA,UAClG,WAAW,OAAO,CAAC,MAAO,UAAU,MAAM,MAAM,OAAO,WAAW,CAAC,EAAE,GAAG,WAAW,SAAS,IAAI,EAAE,GAAG,WAAW,UAAU,KAAK,GAAG,CAAE,EAAE;AAAA,YAAI,CAAC,MAC1I,OAAO,OAAO,CAAC;AAAA,UACjB;AAAA,UACC,UAAU,MAAM,SAAS,OAAO,YAAY,UAAU;AAAA,WACzD;AAAA,MAEJ,KAAK;AACH,eACE,gBAAAC,MAAC,SAAI,WAAU,uBACb;AAAA,0BAAAD,KAAC,SAAI,WAAU,cAAa,MAAK,SAAQ,cAAW,QACjD,gBAAM,IAAI,CAAC,MACV,gBAAAA,KAAC,YAAkB,MAAK,UAAS,WAAW,UAAU,SAAS,EAAE,EAAE,GAAG,SAAS,MAAM,QAAQ,EAAE,EAAE,GAC9F,YAAE,SADQ,EAAE,EAEf,CACD,GACH;AAAA,UACC,WAAW,OAAO,CAAC,MAAM,EAAE,GAAG,WAAW,GAAG,IAAI,GAAG,CAAC,EAAE,IAAI,CAAC,MAAM,OAAO,OAAO,CAAC,CAAC;AAAA,UACjF,SAAS,OAAO,sBAAsB,qBAAqB;AAAA,WAC9D;AAAA,MAEJ,KAAK;AACH,eACE,gBAAAC,MAAC,SAAI,WAAU,uBACZ;AAAA,qBAAW,KAAK,EAAE,IAAI,CAAC,MAAM,OAAO,OAAO,CAAC,CAAC;AAAA,UAC9C,gBAAAA,MAAC,WAAM,WAAU,0CACf;AAAA,4BAAAD;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,SAAS,MAAM,OAAO,SAAS;AAAA,gBAC/B,UAAU,CAAC,MAAM,SAAS,OAAO,QAAQ,EAAE,OAAO,UAAU,YAAY,IAAI;AAAA,gBAC5E,WAAU;AAAA;AAAA,YACZ;AAAA,YAAE;AAAA,YAED,MAAM,OAAO,QACZ,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,cAAW;AAAA,gBACX,OAAO,MAAM,OAAO;AAAA,gBACpB,UAAU,CAAC,MAAM,SAAS,OAAO,QAAQ,EAAE,OAAO,KAAK;AAAA,gBACvD,WAAU;AAAA;AAAA,YACZ;AAAA,aAEJ;AAAA,WACF;AAAA,MAEJ,KAAK;AACH,eACE,gBAAAC,MAAC,SAAI,WAAU,uBACb;AAAA,0BAAAA,MAAC,WAAM,WAAU,0CAAyC;AAAA;AAAA,YAExD,gBAAAD;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,cAAW;AAAA,gBACX,OAAO,MAAM,OAAO;AAAA,gBACpB,UAAU,CAAC,MAAM,SAAS,OAAO,SAAS,EAAE,OAAO,KAAK;AAAA,gBACxD,WAAU;AAAA;AAAA,YACZ;AAAA,aACF;AAAA,UACC,WAAW,KAAK,EAAE,IAAI,CAAC,MAAM,OAAO,OAAO,CAAC,CAAC;AAAA,UAC7C,SAAS,OAAO,sBAAsB,qBAAqB;AAAA,WAC9D;AAAA,MAEJ,KAAK;AACH,eAAO,gBAAAA,KAAC,OAAE,WAAU,8BAA6B,qCAAuB;AAAA,MAC1E;AACE,eAAO,gBAAAA,KAAC,SAAI,WAAU,uBAAuB,qBAAW,KAAK,EAAE,IAAI,CAAC,MAAM,OAAO,OAAO,CAAC,CAAC,GAAE;AAAA,IAChG;AAAA,EACF;AAEA,SACE,gBAAAC,MAAC,SAAI,WAAU,+BAA8B,eAAY,2BACvD;AAAA,oBAAAD,KAAC,SAAI,WAAU,qCACb,0BAAAA,KAAC,UAAK,WAAU,qEAAoE,+BAAiB,GACvG;AAAA,IACA,gBAAAC,MAAC,SAAI,WAAU,gBACb;AAAA,sBAAAD;AAAA,QAAC;AAAA;AAAA,UACC,cAAW;AAAA,UACX,WAAW,GAAG,WAAW;AAAA,UACzB,OAAO;AAAA,UACP,UAAU,CAAC,MAAM,WAAW,EAAE,OAAO,KAAuB;AAAA,UAE3D,2BAAiB,IAAI,CAAC,MACrB,gBAAAA,KAAC,YAAoB,OAAO,EAAE,MAC3B,YAAE,SADQ,EAAE,IAEf,CACD;AAAA;AAAA,MACH;AAAA,MACA,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,WAAU;AAAA,UACV,SAAS,MAAM;AACb,0BAAc,WAAW,mBAAmB,OAAO,CAAC;AACpD,uBAAW,QAAQ;AACnB,qBAAS,EAAE;AAAA,UACb;AAAA,UACD;AAAA;AAAA,MAED;AAAA,OACF;AAAA,IAEC,SAAS,SAAS,KACjB,gBAAAA,KAAC,QAAG,WAAU,uBAAsB,cAAW,qBAC5C,mBAAS,IAAI,CAAC,UAAU;AACvB,YAAM,QAAQ,OAAO,QAAQ,KAAK;AAClC,YAAM,QAAQ,MAAM,QAAQ,oBAAoB,MAAM,IAAI;AAC1D,aACE,gBAAAC;AAAA,QAAC;AAAA;AAAA,UAEC,WAAW,iDAAiD,MAAM,OAAO,aAAa,+CAA+C,iBAAiB;AAAA,UAEtJ;AAAA,4BAAAD;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,cAAY,QAAQ,KAAK;AAAA,gBACzB,SAAS,MAAM;AAAA,gBACf,UAAU,MAAM,WAAW,sBAAsB,MAAM,EAAE;AAAA,gBACzD,WAAU;AAAA;AAAA,YACZ;AAAA,YACA,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,WAAW,6BAA6B,MAAM,UAAU,mBAAmB,6BAA6B;AAAA,gBACxG,SAAS,MAAM,cAAc,MAAM,OAAO,aAAa,OAAO,MAAM,EAAE;AAAA,gBACtE,gBAAc,MAAM,OAAO;AAAA,gBAE1B;AAAA;AAAA,YACH;AAAA,YACA,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,cAAY,QAAQ,KAAK;AAAA,gBACzB,UAAU,UAAU,OAAO,SAAS;AAAA,gBACpC,SAAS,MAAM,WAAW,oBAAoB,MAAM,IAAI,QAAQ,CAAC;AAAA,gBACjE,WAAU;AAAA,gBACX;AAAA;AAAA,YAED;AAAA,YACA,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,cAAY,QAAQ,KAAK;AAAA,gBACzB,UAAU,UAAU;AAAA,gBACpB,SAAS,MAAM,WAAW,oBAAoB,MAAM,IAAI,QAAQ,CAAC;AAAA,gBACjE,WAAU;AAAA,gBACX;AAAA;AAAA,YAED;AAAA,YACA,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,cAAY,UAAU,KAAK;AAAA,gBAC3B,SAAS,MAAM;AACb,6BAAW,sBAAsB,MAAM,EAAE;AACzC,sBAAI,eAAe,MAAM,GAAI,eAAc,IAAI;AAAA,gBACjD;AAAA,gBACA,WAAU;AAAA,gBACX;AAAA;AAAA,YAED;AAAA;AAAA;AAAA,QA9CK,MAAM;AAAA,MA+Cb;AAAA,IAEJ,CAAC,GACH;AAAA,IAGD,YACC,gBAAAC,MAAC,SAAI,WAAU,8DAA6D,eAAY,2BACtF;AAAA,sBAAAA,MAAC,SAAI,WAAU,2BACb;AAAA,wBAAAD,KAAC,UAAK,WAAU,kBAAiB,mBAAK;AAAA,QACtC,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,cAAW;AAAA,YACX,WAAW,GAAG,WAAW;AAAA,YACzB,OAAO,SAAS;AAAA,YAChB,UAAU,CAAC,MAAM,WAAW,sBAAsB,SAAS,IAAI,EAAE,OAAO,EAAE,OAAO,MAAmB,CAAC;AAAA,YAEpG,sBAAY,IAAI,CAAC,MAChB,gBAAAA,KAAC,YAAkB,OAAO,EAAE,IACzB,YAAE,SADQ,EAAE,EAEf,CACD;AAAA;AAAA,QACH;AAAA,SACF;AAAA,MACA,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,MAAM;AAAA,UACN,OAAM;AAAA,UACN,OAAO,SAAS;AAAA,UAChB,UAAU,CAAC,MAAM,WAAW,sBAAsB,SAAS,IAAI,EAAE,SAAS,EAAE,CAAC;AAAA;AAAA,MAC/E;AAAA,MACC,OAAO,QAAQ;AAAA,OAClB;AAAA,KAEJ;AAEJ;;;AEzVA,SAAgB,aAAAI,YAAW,UAAAC,SAAQ,YAAAC,iBAAgB;;;ACAnD,SAAgB,aAAAC,YAAW,UAAAC,SAAQ,YAAAC,iBAAgB;AAEnD,SAAS,mBAAmB,qBAAqB,qBAAqB,yBAAyB;AA2CzF,gBAAAC,MAsBM,QAAAC,aAtBN;AAlCN,IAAM,SAAS;AAOR,IAAM,oBAAsD,CAAC,EAAE,YAAY,SAAS,UAAU,MAAM;AACzG,QAAM,CAAC,EAAE,OAAO,IAAIF,UAAS,CAAC;AAC9B,EAAAF,WAAU,MAAM,WAAW,UAAU,MAAM,QAAQ,CAAC,MAAM,IAAI,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC;AAC/E,QAAM,CAAC,MAAM,OAAO,IAAIE,UAAwB,IAAI;AACpD,QAAM,CAAC,OAAO,QAAQ,IAAIA,UAAwB,IAAI;AAEtD,QAAM,aAAaD,QAAO,IAAI;AAE9B,QAAM,QAAQ,UAAU,WAAW,SAAS,OAAO,IAAI,WAAW,eAAe;AACjF,QAAM,QAAQ,kBAAkB,KAAK;AACrC,QAAM,KAAK,OAAO;AAClB,QAAM,UAAU,CAAC,OAAsB;AACrC,QAAI;AACF,eAAS,IAAI;AACb,SAAG;AAAA,IACL,SAAS,KAAK;AACZ,eAAS,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,IAC3D;AAAA,EACF;AACA,QAAM,eAAe;AAAA,IACnB,eAAe,MAAO,WAAW,UAAU;AAAA,IAC3C,aAAa,MAAO,WAAW,UAAU;AAAA,IACzC,WAAW,MAAO,WAAW,UAAU;AAAA,EACzC;AAEA,MAAI,CAAC,MAAM,aAAa,CAAC,IAAI;AAC3B,WACE,gBAAAE,KAAC,SAAI,WAAW,0BAA0B,aAAa,EAAE,IAAI,eAAY,iBACtE,gBAAM,QACT;AAAA,EAEJ;AACA,QAAM,UAAU,WAAW,gBAAgB,EAAE;AAC7C,QAAM,WAAW,WAAW,oBAAoB;AAChD,QAAM,SAAS,CAAC,UAAkB,SAAwB,OAAgB,OAAO,UAC/E,QAAQ,MAAM;AACZ,UAAM,SAAS,WAAW,gBAAgB,EAAE,EAAE,MAAM,KAAK,CAAC,MAAM,EAAE,OAAO,QAAQ;AACjF,eAAW,kBAAkB,IAAI,UAAU,oBAAoB,QAAQ,QAAQ,KAAK,OAAO,QAAQ,GAAG,OAAO,WAAW,UAAU,IAAI;AACtI,QAAI,KAAM,YAAW,UAAU;AAAA,EACjC,CAAC;AAEH,QAAM,gBAAgB,CAAC,UAAkB,MAAqB;AAC5D,UAAM,QAAQ,GAAG,EAAE,KAAK;AACxB,YAAQ,EAAE,MAAM;AAAA,MACd,KAAK,SAAS;AACZ,cAAM,IAAI,EAAE,UAAU,MAAM;AAC5B,cAAM,QAAQ,KAAK,MAAM,EAAE,QAAQ,IAAI,GAAG,IAAI;AAC9C,eACE,gBAAAC,MAAC,WAAkB,WAAU,yBAC3B;AAAA,0BAAAA,MAAC,UAAK,WAAU,kBACb;AAAA;AAAA,YAAM;AAAA,YAAE;AAAA,YACR,EAAE;AAAA,aACL;AAAA,UACA,gBAAAD;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,cAAY;AAAA,cACZ,KAAK,EAAE,MAAM;AAAA,cACb,KAAK,EAAE,MAAM;AAAA,cACb,MAAM,EAAE,OAAO;AAAA,cACf,OAAO;AAAA,cACP,UAAU,MAAM;AAAA,cACf,GAAG;AAAA,cACJ,UAAU,CAAC,MAAM,OAAO,UAAU,GAAG,OAAO,EAAE,OAAO,KAAK,IAAI,GAAG,IAAI;AAAA,cACrE,WAAU;AAAA;AAAA,UACZ;AAAA,aAhBU,EAAE,GAiBd;AAAA,MAEJ;AAAA,MACA,KAAK;AACH,eACE,gBAAAC,MAAC,WAAkB,WAAU,4CAC3B;AAAA,0BAAAD,KAAC,WAAM,MAAK,SAAQ,cAAY,OAAO,OAAO,EAAE,OAAO,UAAU,MAAM,UAAU,UAAU,CAAC,MAAM,OAAO,UAAU,GAAG,EAAE,OAAO,KAAK,GAAG;AAAA,UACtI;AAAA,aAFS,EAAE,GAGd;AAAA,MAEJ,KAAK;AACH,eACE,gBAAAC,MAAC,WAAkB,WAAU,4CAC3B;AAAA,0BAAAD,KAAC,WAAM,MAAK,YAAW,cAAY,OAAO,SAAS,EAAE,OAAO,UAAU,MAAM,UAAU,UAAU,CAAC,MAAM,OAAO,UAAU,GAAG,EAAE,OAAO,OAAO,GAAG,WAAU,qBAAoB;AAAA,UAC3K;AAAA,aAFS,EAAE,GAGd;AAAA,MAEJ,KAAK;AACH,eACE,gBAAAC,MAAC,WAAkB,WAAU,yBAC3B;AAAA,0BAAAD,KAAC,UAAK,WAAU,kBAAkB,iBAAM;AAAA,UACxC,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACC,cAAY;AAAA,cACZ,OAAO,EAAE;AAAA,cACT,UAAU,MAAM;AAAA,cAChB,UAAU,CAAC,MAAM,OAAO,UAAU,GAAG,EAAE,OAAO,KAAK;AAAA,cACnD,WAAU;AAAA,cAET,YAAE,QAAQ,IAAI,CAAC,MACd,gBAAAA,KAAC,YAAqB,OAAO,EAAE,OAC5B,YAAE,SADQ,EAAE,KAEf,CACD;AAAA;AAAA,UACH;AAAA,aAdU,EAAE,GAed;AAAA,IAEN;AAAA,EACF;AAEA,SACE,gBAAAC,MAAC,SAAI,WAAW,gDAAgD,aAAa,EAAE,IAAI,eAAY,iBAAgB,cAAW,iBAAgB,MAAK,SAC7I;AAAA,oBAAAA,MAAC,SAAI,WAAU,qCACb;AAAA,sBAAAD,KAAC,UAAK,WAAU,gCAA+B,wBAAU;AAAA,MACzD,gBAAAC,MAAC,WAAM,WAAU,0CACf;AAAA,wBAAAD;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,cAAW;AAAA,YACX,SAAS,MAAM;AAAA,YACf,UAAU,MAAM;AAAA,YAChB,UAAU,CAAC,MAAM,QAAQ,MAAM,WAAW,uBAAuB,IAAI,EAAE,OAAO,OAAO,CAAC;AAAA,YACtF,WAAU;AAAA;AAAA,QACZ;AAAA,QAAE;AAAA,SAEJ;AAAA,MACA,gBAAAC,MAAC,WAAM,WAAU,0CAAyC;AAAA;AAAA,QAExD,gBAAAD;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,cAAW;AAAA,YACX,KAAK;AAAA,YACL,KAAK;AAAA,YACL,MAAM;AAAA,YACN,OAAO,KAAK,MAAM,MAAM,QAAQ,GAAG;AAAA,YACnC,UAAU,MAAM;AAAA,YAChB,UAAU,CAAC,MAAM;AACf,oBAAM,IAAI,OAAO,EAAE,OAAO,KAAK;AAC/B,kBAAI,KAAK,KAAK,KAAK,IAAM,SAAQ,MAAM,WAAW,uBAAuB,IAAI,MAAM,SAAS,IAAI,GAAG,CAAC;AAAA,YACtG;AAAA,YACA,WAAU;AAAA;AAAA,QACZ;AAAA,QAAE;AAAA,SAEJ;AAAA,MACA,gBAAAC;AAAA,QAAC;AAAA;AAAA,UACC,cAAW;AAAA,UACX,OAAM;AAAA,UACN,UAAU,MAAM;AAAA,UAChB,UAAU,CAAC,MAAM;AACf,kBAAM,OAAO,EAAE,OAAO;AACtB,gBAAI,CAAC,KAAM;AACX,oBAAQ,MAAM,QAAQ,WAAW,eAAe,IAAI,IAAI,EAAE,OAAO,EAAE,CAAC;AAAA,UACtE;AAAA,UACA,WAAU;AAAA,UAEV;AAAA,4BAAAD,KAAC,YAAO,OAAM,IAAG,8BAAW;AAAA,YAC3B,kBAAkB,IAAI,CAAC,MACtB,gBAAAA,KAAC,YAAoB,OAAO,EAAE,MAC3B,YAAE,SADQ,EAAE,IAEf,CACD;AAAA;AAAA;AAAA,MACH;AAAA,OACF;AAAA,IACC,MAAM,YAAY,MAAM,UAAU,gBAAAA,KAAC,OAAE,WAAU,kBAAkB,gBAAM,QAAO;AAAA,IAC/E,gBAAAA,KAAC,QAAG,WAAU,uBAAsB,cAAW,WAC5C,gBAAM,KAAK,IAAI,CAAC,QAAQ;AACvB,YAAM,SAAS,QAAQ,MAAM,KAAK,CAAC,MAAM,EAAE,OAAO,IAAI,EAAE;AACxD,YAAM,WAAW,SAAS,IAAI;AAC9B,aACE,gBAAAC,MAAC,QAAgB,kBAAgB,IAAI,IAAI,WAAU,iDACjD;AAAA,wBAAAA,MAAC,SAAI,WAAU,yCACb;AAAA,0BAAAD;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,cAAY,GAAG,IAAI,KAAK;AAAA,cACxB,SAAS,IAAI;AAAA,cACb,UAAU,MAAM;AAAA,cAChB,UAAU,CAAC,MAAM,QAAQ,MAAM,WAAW,kBAAkB,IAAI,IAAI,IAAI,EAAE,SAAS,EAAE,OAAO,QAAQ,CAAC,CAAC;AAAA,cACtG,WAAU;AAAA;AAAA,UACZ;AAAA,UACA,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,iBAAe;AAAA,cACf,WAAW,oBAAoB,IAAI,WAAW,MAAM,UAAU,KAAK,gBAAgB;AAAA,cACnF,SAAS,MAAM,QAAQ,WAAW,OAAO,IAAI,EAAE;AAAA,cAE9C,cAAI;AAAA;AAAA,UACP;AAAA,UACA,gBAAAA,KAAC,YAAO,MAAK,UAAS,WAAW,QAAQ,cAAY,UAAU,IAAI,KAAK,IAAI,UAAU,MAAM,UAAU,SAAS,MAAM,QAAQ,MAAM,WAAW,kBAAkB,IAAI,IAAI,EAAE,CAAC,GAAG,oBAE9K;AAAA,WACF;AAAA,QACC,YACC,gBAAAA,KAAC,SAAI,WAAU,kDAAiD,eAAY,mBACzE,8BAAoB,QAAQ,QAAQ,EAAE,IAAI,CAAC,MAAM,cAAc,IAAI,IAAI,CAAC,CAAC,GAC5E;AAAA,WAzBK,IAAI,EA2Bb;AAAA,IAEJ,CAAC,GACH;AAAA,IACC,SACC,gBAAAA,KAAC,OAAE,MAAK,SAAQ,WAAU,iBACvB,iBACH;AAAA,KAEJ;AAEJ;;;ADvNA;AAAA,EACE;AAAA,EACA,eAAAE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAwCH,SAsHM,UAtHN,OAAAC,MAsHM,QAAAC,aAtHN;AAzBJ,IAAM,aAAa;AACnB,IAAM,WAAW,CAAC,WAChB,4EAA4E,SAAS,4CAA4C,oBAAoB;AAGvJ,IAAM,YAAiK,CAAC;AAAA,EACtK;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,QAAM,MAAMC,QAA0B,IAAI;AAC1C,EAAAC,WAAU,MAAM;AACd,UAAM,SAAS,IAAI;AACnB,UAAM,MAAM,QAAQ,WAAW,IAAI;AACnC,QAAI,CAAC,UAAU,CAAC,OAAO,CAAC,UAAU,OAAO,IAAI,oBAAoB,WAAY;AAC7E,WAAO,QAAQ,OAAO;AACtB,WAAO,SAAS,OAAO;AACvB,UAAM,MAAM,IAAI,gBAAgB,OAAO,OAAO,OAAO,MAAM;AAC3D,QAAI,KAAK,IAAI,OAAO,IAAyB;AAC7C,QAAI,aAAa,KAAK,GAAG,CAAC;AAAA,EAC5B,GAAG,CAAC,MAAM,CAAC;AACX,SACE,gBAAAH;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,MAAM,UAAU,WAAW;AAAA,MAC3B,cAAY;AAAA,MACZ,eAAa;AAAA,MACb;AAAA,MACA,OAAO,EAAE,OAAO,MAAM,QAAQ,KAAK;AAAA,MACnC,WAAW,0HAA0H,WAAW,sBAAsB,uBAAuB;AAAA;AAAA,EAC/L;AAEJ;AASO,IAAM,cAA0C,CAAC,EAAE,YAAY,gBAAgB,IAAI,MAAM,MAAM,cAAc,SAAS,UAAU,MAAM,UAAU,MAAM;AAC3J,QAAM,CAAC,EAAE,OAAO,IAAII,UAAS,CAAC;AAC9B,EAAAD,WAAU,MAAM,WAAW,UAAU,MAAM,QAAQ,CAAC,MAAM,IAAI,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC;AAC/E,QAAM,CAAC,OAAO,QAAQ,IAAIC,UAAwB,IAAI;AACtD,QAAM,CAAC,UAAU,WAAW,IAAIA,UAAwB,IAAI;AAC5D,QAAM,CAAC,MAAM,OAAO,IAAIA,UAA0C,IAAI;AACtE,QAAM,CAAC,MAAM,OAAO,IAAIA,UAAwB,IAAI;AAEpD,QAAM,CAAC,UAAU,WAAW,IAAIA,UAAmB,CAAC,CAAC;AACrD,QAAM,YAAYF,QAAyB,IAAI;AAC/C,QAAM,UAAU,OAAO,OAAgC;AACrD,QAAI;AACF,eAAS,IAAI;AACb,kBAAY,MAAM,GAAG,CAAC;AAAA,IACxB,SAAS,KAAK;AACZ,eAAS,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,IAC3D;AAAA,EACF;AAEA,QAAM,aAAaA,QAAO,IAAI;AAE9B,QAAM,QAAQ,WAAW,SAAS;AAClC,QAAM,OAAO,eAAe,MAAM,QAAQ,MAAM,aAAa;AAC7D,QAAM,SAAS,WAAW,eAAe;AAEzC,QAAM,UAAU,CAAC,OAAsB;AACrC,QAAI;AACF,eAAS,IAAI;AACb,SAAG;AAAA,IACL,SAAS,KAAK;AACZ,eAAS,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,IAC3D;AAAA,EACF;AACA,QAAM,MAAM,OAAO,WAA4B;AAC7C,YAAQ,IAAI;AACZ,aAAS,MAAM,mBAAmB,YAAY,MAAM,CAAC;AAAA,EACvD;AACA,QAAM,OAAO,CAAC,KAAgC,UAC5C,QAAQ,MAAM;AACZ,eAAW,mBAAmB,OAAQ,IAAI,EAAE,CAAC,GAAG,GAAG,MAAM,GAAG,WAAW,OAAO;AAC9E,eAAW,UAAU;AAAA,EACvB,CAAC;AACH,QAAM,eAAe;AAAA,IACnB,eAAe,MAAO,WAAW,UAAU;AAAA,IAC3C,aAAa,MAAO,WAAW,UAAU;AAAA,IACzC,WAAW,MAAO,WAAW,UAAU;AAAA,EACzC;AAEA,QAAM,SAAS,CAAC,GAAoB,QAAuB;AACzD,MAAE,eAAe;AACjB,UAAM,KAAK,EAAE,aAAa,QAAQ,uBAAuB,KAAK;AAC9D,YAAQ,IAAI;AACZ,QAAI,CAAC,GAAI;AACT,UAAM,OAAQ,EAAE,cAA8B,sBAAsB;AACpE,UAAM,WAAW,KAAK,UAAU,EAAE,UAAU,KAAK,OAAO,KAAK,SAAS;AACtE,UAAM,YAAY,cAAc,MAAM,QAAQ,IAAI,IAAI,MAAM,IAAI,SAAS,UAAU,IAAI,MAAM,SAAS,OAAO,CAAC;AAC9G,QAAI,UAAW,SAAQ,MAAM,WAAW,UAAU,IAAI,SAAS,CAAC;AAAA,EAClE;AAEA,QAAM,QAAQ,CAAC,UAAuB,kBAAkB,KAAK,IAAI,WAAW,kBAAkB,MAAM,IAAI,EAAE,SAAS,GAAG,CAAC,IAAI;AAC3H,QAAM,YAAY,CAAC,UAAuB,MAAM,QAAQ,CAAC,MAAM,KAAK,SAAS,WAAW,kBAAkB,MAAM,IAAI,EAAE,SAAS,IAAI,MAAM,KAAK,CAAC,IAAI;AAEnJ,QAAM,SAAS,CAAC,UAAsB,QAAQ,MAAM,OAAO,OAAO,MAAM,OAAO,UAAU,MAAM,OAAO,YAAY,MAAM,OAAO,YAAY;AAE3I,SACE,gBAAAD,MAAC,SAAI,WAAW,8CAA8C,aAAa,EAAE,IAAI,eAAY,gBAAe,SAAS,MAAM,QAAQ,QAAQ,IAAI,GAC7I;AAAA,oBAAAA,MAAC,SAAI,WAAU,qCAAoC,MAAK,WAAU,cAAW,iBAC3E;AAAA,sBAAAD,KAAC,YAAO,MAAK,UAAS,WAAW,YAAY,SAAS,MAAM,IAAI,WAAW,GAAG,uBAAS;AAAA,MACvF,gBAAAA,KAAC,YAAO,MAAK,UAAS,WAAW,YAAY,SAAS,MAAM,IAAI,WAAW,GAAG,uBAAS;AAAA,MACvF,gBAAAA,KAAC,YAAO,MAAK,UAAS,WAAW,YAAY,UAAU,CAAC,QAAQ,SAAS,MAAM,IAAI,WAAW,GAAG,uBAAS;AAAA,MAC1G,gBAAAA,KAAC,YAAO,MAAK,UAAS,WAAW,YAAY,UAAU,CAAC,QAAQ,SAAS,MAAM,IAAI,UAAU,GAAG,sBAAQ;AAAA,MACxG,gBAAAA,KAAC,YAAO,MAAK,UAAS,WAAW,YAAY,UAAU,CAAC,QAAQ,SAAS,MAAM,IAAI,QAAQ,GAAG,oBAAM;AAAA,MACpG,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,WAAW;AAAA,UACX,cAAW;AAAA,UACX,iBAAc;AAAA,UACd,SAAS,CAAC,MAAM;AACd,cAAE,gBAAgB;AAClB,kBAAM,IAAK,EAAE,cAA8B,sBAAsB;AACjE,oBAAQ,OAAO,OAAO,EAAE,GAAG,EAAE,MAAM,GAAG,EAAE,OAAO,CAAC;AAAA,UAClD;AAAA,UACD;AAAA;AAAA,MAED;AAAA,MACA,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,cAAW;AAAA,UACX,OAAM;AAAA,UACN,WAAU;AAAA,UACV,OAAO,WAAW;AAAA,UAClB,UAAU,CAAC,MAAM,QAAQ,MAAM,WAAW,YAAY,OAAO,EAAE,OAAO,KAAK,CAAgB,CAAC;AAAA,UAE3F,4BAAkB,IAAI,CAAC,MACtB,gBAAAA,KAAC,YAAqB,OAAO,EAAE,OAAO,OAAO,EAAE,OAC5C,YAAE,SADQ,EAAE,KAEf,CACD;AAAA;AAAA,MACH;AAAA,MACC,OACC,gBAAAC,MAAA,YACE;AAAA,wBAAAD,KAAC,YAAO,MAAK,UAAS,WAAW,YAAY,SAAS,MAAM,UAAU,SAAS,MAAM,GAAG,4BAAS;AAAA,QACjG,gBAAAA,KAAC,YAAO,MAAK,UAAS,WAAW,YAAY,SAAS,MAAM,QAAQ,aAAa,MAAM,YAAY,YAAY,WAAW,GAAG,QAAQ,GAAG,wBAAU;AAAA,QAClJ,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,KAAK;AAAA,YACL,MAAK;AAAA,YACL,QAAQ;AAAA,YACR,WAAU;AAAA,YACV,eAAY;AAAA,YACZ,cAAW;AAAA,YACX,UAAU,CAAC,MAAM;AACf,oBAAM,OAAO,EAAE,cAAc,QAAQ,CAAC;AACtC,gBAAE,cAAc,QAAQ;AACxB,kBAAI,KAAM,SAAQ,MAAM,YAAY,YAAY,IAAI,CAAC;AAAA,YACvD;AAAA;AAAA,QACF;AAAA,SACF;AAAA,OAEJ;AAAA,IACC,SAAS,SAAS,KACjB,gBAAAC,MAAC,QAAG,WAAU,gEAA+D,eAAY,gBAAe,cAAW,gBAChH;AAAA,eAAS,IAAI,CAAC,MACb,gBAAAD,KAAC,QAAY,eAAJ,CAAM,CAChB;AAAA,MACD,gBAAAA,KAAC,QACC,0BAAAA,KAAC,YAAO,MAAK,UAAS,WAAU,aAAY,SAAS,MAAM,YAAY,CAAC,CAAC,GAAG,qBAAO,GACrF;AAAA,OACF;AAAA,IAGD,UACC,gBAAAC,MAAC,SAAI,WAAU,iDAAgD,eAAY,oBACzE;AAAA,sBAAAA,MAAC,WAAM,WAAU,yBACf;AAAA,wBAAAA,MAAC,UAAK,WAAU,kBAAiB;AAAA;AAAA,UAAS,KAAK,MAAM,OAAO,UAAU,GAAG;AAAA,UAAE;AAAA,WAAC;AAAA,QAC5E,gBAAAD;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,KAAK;AAAA,YACL,KAAK;AAAA,YACL,cAAW;AAAA,YACX,OAAO,KAAK,MAAM,OAAO,UAAU,GAAG;AAAA,YACrC,GAAG;AAAA,YACJ,UAAU,CAAC,MAAM,KAAK,WAAW,OAAO,EAAE,OAAO,KAAK,IAAI,GAAG;AAAA,YAC7D,WAAU;AAAA;AAAA,QACZ;AAAA,SACF;AAAA,MACA,gBAAAC,MAAC,WAAM,WAAU,yBACf;AAAA,wBAAAA,MAAC,UAAK,WAAU,kBAAiB;AAAA;AAAA,UAAM,KAAK,QAAQ,OAAO,SAAS,UAAU,OAAO,cAAc,WAAc,KAAK,GAAG;AAAA,UAAE;AAAA,WAAC;AAAA,QAC5H,gBAAAD;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,KAAK;AAAA,YACL,KAAK;AAAA,YACL,cAAW;AAAA,YACX,UAAU,OAAO,SAAS;AAAA,YAC1B,OAAO,KAAK,QAAQ,OAAO,SAAS,UAAU,OAAO,cAAc,WAAc,KAAK,GAAG;AAAA,YACxF,GAAG;AAAA,YACJ,UAAU,CAAC,MAAM,KAAK,eAAe,OAAO,EAAE,OAAO,KAAK,IAAI,GAAG;AAAA,YACjE,WAAU;AAAA;AAAA,QACZ;AAAA,SACF;AAAA,MACA,gBAAAC;AAAA,QAAC;AAAA;AAAA,UACC,cAAW;AAAA,UACX,WAAU;AAAA,UACV,OAAO,OAAO;AAAA,UACd,UAAU,CAAC,MAAM,QAAQ,MAAM,WAAW,mBAAmB,OAAO,IAAI,EAAE,OAAO,EAAE,OAAO,MAAe,CAAC,CAAC;AAAA,UAE1G;AAAA,mBAAO,SAAS,WAAW,gBAAAD,KAAC,YAAO,OAAM,gBAAe,0BAAY;AAAA,YACpED,aAAY,IAAI,CAAC,MAChB,gBAAAC,KAAC,YAAkB,OAAO,EAAE,IAAK,YAAE,SAAtB,EAAE,EAA0B,CAC1C;AAAA;AAAA;AAAA,MACH;AAAA,MACA,gBAAAC,MAAC,WAAM,WAAU,4CACf;AAAA,wBAAAD;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,cAAW;AAAA,YACX,SAAS,QAAQ,OAAO,OAAO;AAAA,YAC/B,UAAU,CAAC,MAAM,QAAQ,MAAM,WAAW,mBAAmB,OAAO,IAAI,EAAE,SAAS,EAAE,OAAO,QAAQ,CAAC,CAAC;AAAA,YACtG,WAAU;AAAA;AAAA,QACZ;AAAA,QAAE;AAAA,SAEJ;AAAA,MACA,gBAAAA,KAAC,SAAI,WAAU,kDAAiD,MAAK,SAAQ,cAAW,eACpF,WAAC,UAAU,gBAAgB,YAAY,KAAK,EAAY,IAAI,CAAC,MAC7D,gBAAAC,MAAC,WAAc,WAAU,2BACvB;AAAA,wBAAAD;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,cAAY,QAAQ,CAAC;AAAA,YACrB,SAAS,QAAQ,OAAO,QAAQ,CAAC,CAAC;AAAA,YAClC,UAAU,CAAC,MAAM,QAAQ,MAAM,WAAW,mBAAmB,OAAO,IAAI,EAAE,OAAO,EAAE,GAAG,OAAO,OAAO,CAAC,CAAC,GAAG,EAAE,OAAO,QAAQ,EAAE,CAAC,CAAC;AAAA,YAC9H,WAAU;AAAA;AAAA,QACZ;AAAA,QACC;AAAA,WARS,CASZ,CACD,GACH;AAAA,OACF;AAAA,IAGD,WAAW,UAAU,OAAO,SAAS,gBAAgB,gBAAAA,KAAC,qBAAkB,YAAwB,WAAU,oCAAmC;AAAA,IAE9I,gBAAAA,KAAC,QAAG,WAAU,yBAAwB,MAAK,QAAO,cAAW,UAC1D,eAAK,IAAI,CAAC,QAAQ;AACjB,YAAM,EAAE,MAAM,IAAI;AAClB,aACE,gBAAAC;AAAA,QAAC;AAAA;AAAA,UAEC,MAAK;AAAA,UACL,iBAAe,IAAI;AAAA,UACnB,cAAY,IAAI,QAAQ;AAAA,UACxB,iBAAe,MAAM;AAAA,UACrB,WAAW,CAAC,MAAM,OAAO;AAAA,UACzB,aAAa,CAAC,MAAM;AAClB,cAAE,aAAa,QAAQ,yBAAyB,MAAM,EAAE;AACxD,oBAAQ,MAAM,EAAE;AAAA,UAClB;AAAA,UACA,YAAY,CAAC,MAAM,EAAE,eAAe;AAAA,UACpC,QAAQ,CAAC,MAAM,OAAO,GAAG,GAAG;AAAA,UAC5B,UAAU;AAAA,UACV,SAAS,MAAM,QAAQ,MAAM,WAAW,eAAe,MAAM,IAAI,QAAQ,CAAC;AAAA,UAC1E,WAAW,CAAC,MAAM;AAChB,gBAAI,EAAE,WAAW,EAAE,kBAAkB,EAAE,QAAQ,WAAW,EAAE,QAAQ,MAAM;AACxE,gBAAE,eAAe;AACjB,sBAAQ,MAAM,WAAW,eAAe,MAAM,IAAI,QAAQ,CAAC;AAAA,YAC7D;AAAA,UACF;AAAA,UACA,eAAe,CAAC,MAAM;AACpB,cAAE,eAAe;AACjB,uBAAW,eAAe,MAAM,IAAI,MAAM,kBAAkB,MAAM,KAAK,MAAM,eAAe,QAAQ;AACpG,oBAAQ,EAAE,GAAG,EAAE,SAAS,GAAG,EAAE,QAAQ,CAAC;AAAA,UACxC;AAAA,UACA,WAAW,SAAS,IAAI,MAAM;AAAA,UAC9B,OAAO,EAAE,aAAa,IAAI,IAAI,QAAQ,GAAG;AAAA,UAEzC;AAAA,4BAAAD;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,cAAY,MAAM,UAAU,QAAQ,IAAI,KAAK,KAAK,QAAQ,IAAI,KAAK;AAAA,gBACnE,gBAAc,MAAM;AAAA,gBACpB,WAAU;AAAA,gBACV,SAAS,CAAC,MAAM;AACd,oBAAE,gBAAgB;AAClB,0BAAQ,MAAM,WAAW,mBAAmB,MAAM,IAAI,EAAE,SAAS,CAAC,MAAM,QAAQ,CAAC,CAAC;AAAA,gBACpF;AAAA,gBAEC,gBAAM,UAAU,WAAM;AAAA;AAAA,YACzB;AAAA,YACC,MAAM,SAAS,WACd,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,cAAY,MAAM,YAAY,UAAU,IAAI,KAAK,KAAK,YAAY,IAAI,KAAK;AAAA,gBAC3E,WAAU;AAAA,gBACV,SAAS,CAAC,MAAM;AACd,oBAAE,gBAAgB;AAClB,0BAAQ,MAAM,WAAW,mBAAmB,MAAM,IAAI,EAAE,WAAW,CAAC,MAAM,UAAU,CAAC,CAAC;AAAA,gBACxF;AAAA,gBAEC,gBAAM,YAAY,WAAM;AAAA;AAAA,YAC3B;AAAA,YAED,IAAI,WAAW,gBAAAA,KAAC,UAAK,WAAU,kBAAiB,cAAW,WAAU,oBAAC;AAAA,YACtE,kBAAkB,KAAK,IACtB,gBAAAC,MAAC,UAAK,WAAU,qBACd;AAAA,8BAAAD;AAAA,gBAAC;AAAA;AAAA,kBACC,QAAQ,MAAM,KAAK;AAAA,kBACnB,MAAM;AAAA,kBACN,OAAO,GAAG,IAAI,KAAK;AAAA,kBACnB,UAAU,IAAI,UAAU,MAAM,iBAAiB,YAAY,QAAQ,MAAM,IAAI;AAAA;AAAA,cAC/E;AAAA,cACC,MAAM,SAAS,WACd,gBAAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,eAAY;AAAA,kBACZ,WAAU;AAAA,kBAET,qBAAW,KAAK;AAAA;AAAA,cACnB;AAAA,eAEJ,IAEA,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,WAAU;AAAA,gBACV,OAAO,EAAE,OAAO,eAAe,QAAQ,cAAc;AAAA,gBAEpD,qBAAW,KAAK;AAAA;AAAA,YACnB;AAAA,YAED,MAAM,QAAQ,CAAC,MAAM,KAAK,UAAU,MAAM,SAAS,WAClD,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,cAAY,GAAG,MAAM,KAAK,WAAW,QAAQ,SAAS,QAAQ,IAAI,IAAI,KAAK;AAAA,gBAC3E,gBAAc,MAAM,KAAK,WAAW;AAAA,gBACpC,OAAO,MAAM,KAAK,WAAW,QAAQ,mFAAmF;AAAA,gBACxH,eAAY;AAAA,gBACZ,WAAW,qCAAqC,MAAM,KAAK,WAAW,QAAQ,mBAAmB,gBAAgB;AAAA,gBACjH,SAAS,CAAC,MAAM;AACd,oBAAE,gBAAgB;AAClB,0BAAQ,MAAM,WAAW,kBAAkB,MAAM,IAAI,EAAE,QAAQ,MAAM,KAAM,WAAW,MAAM,CAAC,CAAC;AAAA,gBAChG;AAAA,gBAEC,gBAAM,KAAK,WAAW,QAAQ,uBAAQ;AAAA;AAAA,YACzC;AAAA,YAED,MAAM,QACL,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,QAAQ,UAAU,KAAK;AAAA,gBACvB,MAAM;AAAA,gBACN,OAAO,GAAG,IAAI,KAAK,QAAQ,MAAM,KAAK,YAAY,QAAQ,gBAAgB,EAAE;AAAA,gBAC5E,QAAO;AAAA,gBACP,UAAU,IAAI,UAAU,MAAM,iBAAiB;AAAA,gBAC/C,SAAS,CAAC,MAAM;AACd,oBAAE,gBAAgB;AAClB,sBAAI,EAAE,SAAU,SAAQ,MAAM,WAAW,kBAAkB,MAAM,IAAI,EAAE,SAAS,MAAM,KAAM,YAAY,MAAM,CAAC,CAAC;AAAA,sBAC3G,SAAQ,MAAM,WAAW,eAAe,MAAM,IAAI,MAAM,CAAC;AAAA,gBAChE;AAAA;AAAA,YACF;AAAA,YAED,aAAa,MAAM,KAClB,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,WAAS;AAAA,gBACT,cAAW;AAAA,gBACX,cAAc,MAAM,QAAQ,IAAI;AAAA,gBAChC,WAAU;AAAA,gBACV,SAAS,CAAC,MAAM,EAAE,gBAAgB;AAAA,gBAClC,QAAQ,CAAC,MAAM;AACb,8BAAY,IAAI;AAChB,sBAAI,EAAE,OAAO,MAAM,KAAK,KAAK,EAAE,OAAO,UAAU,MAAM,KAAM,SAAQ,MAAM,WAAW,mBAAmB,MAAM,IAAI,EAAE,MAAM,EAAE,OAAO,MAAM,CAAC,CAAC;AAAA,gBAC7I;AAAA,gBACA,WAAW,CAAC,MAAM;AAChB,sBAAI,EAAE,QAAQ,QAAS,CAAC,EAAE,OAA4B,KAAK;AAC3D,sBAAI,EAAE,QAAQ,SAAU,aAAY,IAAI;AAAA,gBAC1C;AAAA;AAAA,YACF,IAEA,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,WAAW,2BAA2B,MAAM,UAAU,KAAK,gBAAgB;AAAA,gBAC3E,eAAe,CAAC,MAAM;AACpB,oBAAE,gBAAgB;AAClB,8BAAY,MAAM,EAAE;AAAA,gBACtB;AAAA,gBAEC,cAAI;AAAA;AAAA,YACP;AAAA,YAED,aAAa,KAAK,KACjB,gBAAAA,KAAC,UAAK,MAAK,OAAM,eAAY,iBAAgB,cAAY,aAAa,KAAK,GAAI,OAAO,aAAa,KAAK,GAAI,WAAU,8BAA6B,oBAEnJ;AAAA,YAED,kBAAkB,KAAK,KACtB,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,eAAY;AAAA,gBACZ,cAAY,kBAAkB,KAAK,MAAM,OAAO,wBAAwB,IAAI,KAAK,KAAK,uBAAuB,IAAI,KAAK;AAAA,gBACtH,gBAAc,kBAAkB,KAAK,MAAM;AAAA,gBAC3C,WAAW,mCAAmC,kBAAkB,KAAK,MAAM,OAAO,oBAAoB,6BAA6B;AAAA,gBACnI,SAAS,CAAC,MAAM;AACd,oBAAE,gBAAgB;AAClB,0BAAQ,MAAM,WAAW,uBAAuB,MAAM,IAAI,kBAAkB,KAAK,MAAM,IAAI,CAAC;AAAA,gBAC9F;AAAA,gBACD;AAAA;AAAA,YAED;AAAA,YAED,OAAO,KAAK,KAAK,gBAAAA,KAAC,UAAK,cAAW,UAAS,WAAU,kBAAiB,uBAAE;AAAA,YACxE,MAAM,UAAU,YAAY,MAAM,UAAU,kBAAkB,gBAAAA,KAAC,UAAK,WAAU,6BAA6B,gBAAM,OAAM;AAAA;AAAA;AAAA,QA7JnH,MAAM;AAAA,MA8Jb;AAAA,IAEJ,CAAC,GACH;AAAA,IAEC,SACC,gBAAAA,KAAC,OAAE,MAAK,SAAQ,WAAU,iBACvB,iBACH;AAAA,IAGD,QACC,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,cAAW;AAAA,QACX,WAAU;AAAA,QACV,OAAO,EAAE,MAAM,KAAK,GAAG,KAAK,KAAK,EAAE;AAAA,QACnC,SAAS,CAAC,MAAM,EAAE,gBAAgB;AAAA,QAClC,WAAW,CAAC,MAAM,EAAE,QAAQ,YAAY,QAAQ,IAAI;AAAA,QAEnD,oBAAU,UAAU,EAAE,IAAI,CAAC,SAC1B,gBAAAA;AAAA,UAAC;AAAA;AAAA,YAEC,MAAK;AAAA,YACL,MAAK;AAAA,YACL,UAAU,CAAC,KAAK;AAAA,YAChB,WAAU;AAAA,YACV,SAAS,MAAM,IAAI,KAAK,MAAM;AAAA,YAE7B,eAAK;AAAA;AAAA,UAPD,KAAK;AAAA,QAQZ,CACD;AAAA;AAAA,IACH;AAAA,KAEJ;AAEJ;;;AE1dA,OAAOK,UAAS,aAAAC,YAAW,YAAAC,iBAAgB;AAC3C,SAAS,iBAAqF;AA4BtE,SACJ,OAAAC,MADI,QAAAC,aAAA;AAnBxB,IAAM,MAAM;AAGZ,SAAS,SAAS;AAAA,EAChB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAOG;AACD,QAAM,EAAE,aAAa,MAAM,IAAI,qBAAqB,UAAU,MAAM;AACpE,MAAI,CAAC,SAAU,QAAO,gBAAAA,MAAC,OAAE,WAAU,8BAA6B;AAAA;AAAA,IAAuB,QAAQ;AAAA,IAAO;AAAA,KAAwB;AAC9H,MAAI,MAAO,QAAO,gBAAAD,KAAC,OAAE,WAAU,8BAA8B,iBAAM;AACnE,MAAI,CAAC,YAAa,QAAO,gBAAAA,KAAC,OAAE,WAAU,8BAA6B,2BAAQ;AAC3E,SAAO,gBAAAA,KAAC,oBAAiB,aAA0B,QAAgB,UAAoB,SAAS,CAAC,MAAM,SAAS,GAAG,YAAY,SAAS,CAAC,GAAG,IAAI,GAAG,UAAoB;AACzK;AAQO,SAAS,0BAA0B,EAAE,YAAY,YAAY,GAAG,GAAmC;AACxG,QAAM,CAAC,EAAE,OAAO,IAAIE,UAAS,CAAC;AAC9B,EAAAC,WAAU,MAAM,WAAW,UAAU,MAAM,QAAQ,CAAC,MAAM,IAAI,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC;AAC/E,QAAM,CAAC,QAAQ,SAAS,IAAID,UAAoC,IAAI;AACpE,QAAM,CAAC,SAAS,UAAU,IAAIA,UAAwB,IAAI;AAC1D,QAAM,CAAC,MAAM,OAAO,IAAIA,UAAwB,IAAI;AACpD,QAAM,WAAW,WAAW;AAC5B,QAAM,QAAQ,WAAW,SAAS;AAClC,QAAM,QAA2B,MAAM,gBAAiB,UAAU,MAAM,QAAQ,MAAM,aAAa,GAAG,SAAS,OAAQ;AACvH,QAAM,MAAM,CAAC,SAAwB;AACnC,eAAW,IAAI;AACf,YAAQ,QAAQ,EACb,KAAK,IAAI,EACT,MAAM,CAAC,MAAe,WAAW,aAAa,QAAQ,EAAE,UAAU,OAAO,CAAC,CAAC,CAAC;AAAA,EACjF;AACA,QAAM,QAAQE,OAAM,OAAO,oBAAI,IAAY,CAAC;AAE5C,QAAM,SAAS,CAAC,YAA2B;AACzC,QAAI,SAAS;AACX,UAAI,CAAC,MAAM,QAAQ,IAAI,OAAO,GAAG;AAC/B,cAAM,QAAQ,IAAI,OAAO;AACzB,eAAO;AAAA,MACT;AACA,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT;AACA,QAAM,UAAU,OAAO,SAAS,WAAY,MAA2B,cAAc,WAAW,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,SAAS,QAAQ,IAAI,CAAC;AAC1I,QAAM,YAAY,OAAO,SAAS,UAAU,MAAM,YAAY;AAC9D,QAAM,YAAY,CAAC,CAAC,SAAS,MAAM,SAAS,gBAAgB,MAAM,SAAS;AAE3E,SACE,gBAAAH,MAAC,aAAQ,WAAW,+BAA+B,SAAS,IAAI,cAAW,oBAAmB,+BAA4B,IACxH;AAAA,oBAAAA,MAAC,SAAI,WAAU,2BACb;AAAA,sBAAAD,KAAC,UAAK,WAAU,4EAA2E,qBAAO;AAAA,MAClG,gBAAAA,KAAC,YAAO,MAAK,UAAS,WAAW,KAAK,UAAU,CAAC,YAAY,CAAC,WAAW,gBAAc,WAAW,UAAU,SAAS,MAAM,UAAU,WAAW,WAAW,OAAO,QAAQ,GAAG,gCAE7K;AAAA,MACA,gBAAAA,KAAC,YAAO,MAAK,UAAS,WAAW,KAAK,UAAU,CAAC,UAAU,gBAAc,WAAW,SAAS,SAAS,MAAM,UAAU,WAAW,UAAU,OAAO,OAAO,GAAG,gCAE5J;AAAA,OACF;AAAA,IACC,CAAC,YAAY,gBAAAA,KAAC,OAAE,WAAU,8BAA6B,kFAAoE;AAAA,IAC3H,WAAW,YAAY,SACtB,gBAAAA,KAAC,kBAAe,UAAoB,MAAM,CAAC,QAAQ,GAAG,OAAM,WAAU,QAAQ,CAAC,OAAO,UAAU,IAAI,GAAG,IAAI,MAAM,WAAW,kBAAkB,MAAM,IAAI,EAAE,EAAE,CAAC,IAAI;AAAA,IAElK,WAAW,WACV,gBAAAA,KAAC,kBAAe,UAAoB,MAAM,CAAC,aAAa,WAAW,OAAO,GAAG,OAAM,2BAA0B,QAAQ,CAAC,OAAO,UAAU,IAAI,GAAG,IAAI,MAAM,WAAW,eAAe,EAAE,EAAE,CAAC,IAAI;AAAA,IAE5L,aAAa,SACZ,gBAAAC,MAAC,SAAI,WAAU,aAAY,oBAAiB,aAC1C;AAAA,sBAAAA,MAAC,SAAI,WAAU,2BACb;AAAA,wBAAAD,KAAC,UAAK,WAAU,qCAAqC,oBAAU,QAAQ,UAAU,QAAO;AAAA,QACxF,gBAAAA,KAAC,YAAO,MAAK,UAAS,WAAW,KAAK,OAAM,oCAAmC,SAAS,MAAM,IAAI,MAAM,WAAW,qBAAqB,MAAM,EAAE,CAAC,GAAG,uBAEpJ;AAAA,SACF;AAAA,MACA,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC;AAAA,UACA,QAAQ,UAAU;AAAA,UAClB,MAAM,UAAU;AAAA,UAChB,QAAQ,UAAU;AAAA,UAClB,UAAU,CAAC,GAAG,GAAG,YAAY,IAAI,MAAM,WAAW,kBAAkB,MAAM,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,GAAG,EAAW,EAAE,GAAG,OAAO,OAAO,CAAC,CAAC;AAAA,UAC/H,UAAU,CAAC,WAAW,IAAI,MAAM,WAAW,kBAAkB,MAAM,IAAI,EAAE,OAAwB,CAAC,CAAC;AAAA;AAAA,MACrG;AAAA,OACF;AAAA,IAED,QAAQ,SAAS,KAAK,SACrB,gBAAAA,KAAC,QAAG,WAAU,aAAY,oBAAiB,WACxC,kBAAQ,IAAI,CAAC,MAAM;AAClB,YAAM,QAAQ,EAAE,SAAS,WAAY,EAAE,QAAQ,EAAE,SAAU,EAAE;AAC7D,YAAM,MAAO,MAA2B,aAAc;AACtD,YAAM,QAAQ,IAAI,QAAQ,CAAC;AAC3B,UAAI,EAAE,SAAS,SAAU,QAAO;AAChC,aACE,gBAAAC,MAAC,QAAc,WAAU,uCAAsC,qBAAmB,EAAE,IAClF;AAAA,wBAAAA,MAAC,SAAI,WAAU,2BACb;AAAA,0BAAAD,KAAC,WAAM,MAAK,YAAW,SAAS,EAAE,SAAS,cAAY,GAAG,KAAK,OAAO,UAAU,CAAC,MAAM;AACnF,kBAAM,UAAU,EAAE,cAAc;AAChC,gBAAI,MAAM,WAAW,mBAAmB,MAAM,IAAI,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;AAAA,UACtE,GAAG;AAAA,UACL,gBAAAA,KAAC,YAAO,MAAK,UAAS,WAAU,oDAAmD,iBAAe,SAAS,EAAE,IAAI,SAAS,MAAM,QAAQ,SAAS,EAAE,KAAK,OAAO,EAAE,EAAE,GAChK,iBACH;AAAA,UACA,gBAAAA,KAAC,YAAO,MAAK,UAAS,WAAW,KAAK,UAAU,UAAU,IAAI,SAAS,GAAG,cAAW,WAAU,SAAS,MAAM,IAAI,MAAM,WAAW,mBAAmB,MAAM,IAAI,EAAE,IAAI,EAAE,OAAO,QAAQ,EAAE,CAAC,CAAC,GAAG,oBAE9L;AAAA,UACA,gBAAAA,KAAC,YAAO,MAAK,UAAS,WAAW,KAAK,UAAU,UAAU,GAAG,cAAW,aAAY,SAAS,MAAM,IAAI,MAAM,WAAW,mBAAmB,MAAM,IAAI,EAAE,IAAI,EAAE,OAAO,QAAQ,EAAE,CAAC,CAAC,GAAG,oBAEnL;AAAA,UACA,gBAAAA,KAAC,YAAO,MAAK,UAAS,WAAW,KAAK,cAAY,UAAU,KAAK,IAAI,SAAS,MAAM,IAAI,MAAM,WAAW,kBAAkB,MAAM,IAAI,EAAE,EAAE,CAAC,GAAG,oBAE7I;AAAA,WACF;AAAA,QACC,SAAS,EAAE,MACV,gBAAAC,MAAC,SAAI,WAAU,kBACb;AAAA,0BAAAA,MAAC,WAAM,WAAU,2BACf;AAAA,4BAAAD,KAAC,UAAK,WAAU,mCAAkC,qBAAO;AAAA,YACzD,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,KAAK;AAAA,gBACL,KAAK;AAAA,gBACL,MAAM;AAAA,gBACN,WAAU;AAAA,gBACV,OAAO,EAAE;AAAA,gBACT,cAAY,GAAG,KAAK;AAAA,gBACpB,UAAU,CAAC,MAAM;AACf,wBAAM,UAAU,OAAO,EAAE,cAAc,KAAK;AAC5C,sBAAI,MAAM,WAAW,mBAAmB,MAAM,IAAI,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;AAAA,gBACtE;AAAA;AAAA,YACF;AAAA,aACF;AAAA,UACA,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACC;AAAA,cACA,QAAQ,EAAE;AAAA,cACV,MAAM,EAAE;AAAA,cACR,QAAQ,EAAE;AAAA,cACV,UAAU,CAAC,GAAG,GAAG,YAAY,IAAI,MAAM,WAAW,mBAAmB,MAAM,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,GAAG,EAAW,EAAE,GAAG,OAAO,OAAO,CAAC,CAAC;AAAA,cACtI,UAAU,CAAC,WAAW,IAAI,MAAM,WAAW,mBAAmB,MAAM,IAAI,EAAE,IAAI,EAAE,OAAwB,CAAC,CAAC;AAAA;AAAA,UAC5G;AAAA,WACF;AAAA,WA7CK,EAAE,EA+CX;AAAA,IAEJ,CAAC,GACH;AAAA,IAED,CAAC,SAAS,gBAAAA,KAAC,OAAE,WAAU,8BAA6B,oDAAsC;AAAA,IAC1F,WACC,gBAAAA,KAAC,OAAE,MAAK,SAAQ,WAAU,6BACvB,mBACH;AAAA,KAEJ;AAEJ;;;AChLA,SAAgB,aAAAK,YAAW,YAAAC,iBAAgB;AAE3C;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,8BAA8B;;;ACjBvC,SAAS,0BAA0B;AAM+C,gBAAAC,YAAA;AAA3E,IAAM,sBAA0D,CAAC,UAAU,gBAAAA,KAAC,2BAAyB,GAAG,OAAO,KAAK,oBAAoB;;;ADqDrI,gBAAAC,MAcF,QAAAC,aAdE;AAjCV,IAAM,OAAO,CAAC,OAAgB,iCAAiC,KAAK,6BAA6B,8CAA8C;AAaxI,IAAM,kBAAkD,CAAC,EAAE,YAAY,UAAU,MAAM;AAC5F,QAAM,CAAC,EAAE,OAAO,IAAIC,UAAS,CAAC;AAC9B,EAAAC,WAAU,MAAM,WAAW,UAAU,MAAM,QAAQ,CAAC,MAAM,IAAI,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC;AAC/E,QAAM,CAAC,OAAO,QAAQ,IAAID,UAAwB,IAAI;AACtD,QAAM,QAAQ,WAAW,SAAS;AAClC,QAAM,EAAE,OAAO,YAAY,YAAY,OAAO,WAAW,SAAS,aAAa,MAAM,IAAI,MAAM;AAC/F,QAAM,OAAO,MAAM;AACnB,QAAM,UAAU,CAAC,OAAsB;AACrC,QAAI;AACF,eAAS,IAAI;AACb,SAAG;AAAA,IACL,SAAS,KAAK;AACZ,eAAS,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,IAC3D;AAAA,EACF;AAEA,SACE,gBAAAD,MAAC,SAAI,WAAW,8CAA8C,aAAa,EAAE,IAAI,eAAY,iBAC3F;AAAA,oBAAAD,KAAC,SAAI,WAAU,wBAAuB,MAAK,WAAU,cAAW,eAC7D,sBAAY,IAAI,CAAC,MAChB,gBAAAA;AAAA,MAAC;AAAA;AAAA,QAEC,MAAK;AAAA,QACL,gBAAc,MAAM,eAAe,EAAE;AAAA,QACrC,OAAO,EAAE,WAAW,GAAG,EAAE,KAAK,KAAK,EAAE,QAAQ,MAAM,EAAE;AAAA,QACrD,WAAW,KAAK,MAAM,eAAe,EAAE,EAAE;AAAA,QACzC,SAAS,MAAM,WAAW,QAAQ,EAAE,EAAE;AAAA,QAErC,YAAE;AAAA;AAAA,MAPE,EAAE;AAAA,IAQT,CACD,GACH;AAAA,IAEA,gBAAAC,MAAC,SAAI,WAAU,2BAA0B,MAAK,SAAQ,cAAW,WAC/D;AAAA,sBAAAA,MAAC,WAAM,WAAU,2BACf;AAAA,wBAAAD;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,cAAW;AAAA,YACX,OAAO;AAAA,YACP,UAAU,CAAC,MAAM,WAAW,gBAAgB,EAAE,YAAY,EAAE,OAAO,MAAM,CAAC;AAAA,YAC1E,WAAU;AAAA;AAAA,QACZ;AAAA,QACA,gBAAAA,KAAC,UAAK,WAAU,kBAAiB,gBAAE;AAAA,SACrC;AAAA,MACA,gBAAAC,MAAC,WAAM,WAAU,2BACf;AAAA,wBAAAD;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,cAAW;AAAA,YACX,OAAO;AAAA,YACP,UAAU,CAAC,MAAM,WAAW,gBAAgB,EAAE,YAAY,EAAE,OAAO,MAAM,CAAC;AAAA,YAC1E,WAAU;AAAA;AAAA,QACZ;AAAA,QACA,gBAAAA,KAAC,UAAK,WAAU,kBAAiB,gBAAE;AAAA,SACrC;AAAA,MACA,gBAAAA,KAAC,YAAO,MAAK,UAAS,OAAM,oBAAmB,WAAW,KAAK,KAAK,GAAG,SAAS,MAAM,WAAW,gBAAgB,GAAG,kBAEpH;AAAA,MACA,gBAAAA,KAAC,YAAO,MAAK,UAAS,OAAM,uBAAsB,WAAW,KAAK,KAAK,GAAG,SAAS,MAAM,WAAW,iBAAiB,GAAG,qBAExH;AAAA,MACC,MAAM,eAAe,WACpB,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,gBAAc,MAAM,SAAS;AAAA,UAC7B,OAAM;AAAA,UACN,WAAW,KAAK,MAAM,SAAS,UAAU;AAAA,UACzC,SAAS,MAAM,QAAQ,MAAM,WAAW,gBAAgB,MAAM,SAAS,aAAa,EAAE,WAAW,IAAI,EAAE,OAAO,uBAAuB,CAAC,CAAC;AAAA,UACxI;AAAA;AAAA,MAED;AAAA,OAEJ;AAAA,IACC,MAAM,eAAe,WAAW,MAAM,SAAS,cAC9C,gBAAAA,KAAC,uBAAoB,OAAO,OAAO,QAAQ,EAAE,OAAO,YAAY,WAAW,WAAW,GAAG,UAAU,CAAC,MAAM,QAAQ,MAAM,WAAW,gBAAgB,EAAE,OAAO,EAAE,CAAC,CAAC,GAAG;AAAA,IAGpK,sBAAsB,IAAI,CAAC,SAC1B,gBAAAA;AAAA,MAAC;AAAA;AAAA,QAEC;AAAA,QACA,OAAO,MAAM,KAAK,EAAE;AAAA,QACpB,UAAU,CAAC,MAAM,WAAW,gBAAgB,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE,CAAC;AAAA;AAAA,MAHlE,KAAK;AAAA,IAIZ,CACD;AAAA,IAEA,MAAM,eAAe,WACpB,gBAAAC,MAAC,SAAI,WAAU,sDAAqD,MAAK,SAAQ,cAAW,eAAc,eAAY,iBACpH;AAAA,sBAAAA,MAAC,SAAI,WAAU,2BACb;AAAA,wBAAAD;AAAA,UAAC;AAAA;AAAA,YACC,cAAW;AAAA,YACX,OAAO,UAAU,YAAY,UAAU,aAAa,UAAU,SAAS,CAAC,KAAK,KAAK,MAAM,UAAU,SAAS,GAAG,CAAC,WAAW;AAAA,YAC1H,WAAU;AAAA,YACV,OAAO,EAAE,YAAY,UAAU,YAAY,aAAa,UAAU,SAAS,IAAI,cAAc;AAAA;AAAA,QAC/F;AAAA,QACA,gBAAAA,KAAC,YAAO,MAAK,UAAS,OAAM,iDAAgD,WAAW,KAAK,KAAK,GAAG,SAAS,MAAM,WAAW,eAAe,GAAG,wBAEhJ;AAAA,QACA,gBAAAA,KAAC,YAAO,MAAK,UAAS,OAAM,8BAA6B,WAAW,KAAK,KAAK,GAAG,SAAS,MAAM,WAAW,gBAAgB,GAAG,yBAE9H;AAAA,SACF;AAAA,MACA,gBAAAA,KAAC,SAAI,WAAU,cAAa,MAAK,SAAQ,cAAW,UACjD,+BAAqB,IAAI,CAAC,MACzB,gBAAAA;AAAA,QAAC;AAAA;AAAA,UAEC,MAAK;AAAA,UACL,gBAAc,MAAM,WAAW,EAAE;AAAA,UACjC,OAAO,EAAE;AAAA,UACT,WAAW,KAAK,MAAM,WAAW,EAAE,EAAE;AAAA,UACrC,SAAS,MAAM,WAAW,gBAAgB,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC;AAAA,UAEpE,YAAE;AAAA;AAAA,QAPE,EAAE;AAAA,MAQT,CACD,GACH;AAAA,MACC,sBAAsB,IAAI,CAAC,SAC1B,gBAAAA,KAAC,iBAA4B,MAAY,OAAO,MAAM,KAAK,EAAE,GAAG,UAAU,CAAC,MAAM,WAAW,gBAAgB,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE,CAAC,KAAnH,KAAK,EAAiH,CAC3I;AAAA,MACD,gBAAAC,MAAC,SAAI,WAAU,uCACb;AAAA,wBAAAA,MAAC,WAAM,WAAU,6BACf;AAAA,0BAAAD;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,cAAW;AAAA,cACX,SAAS,MAAM;AAAA,cACf,UAAU,CAAC,MAAM,WAAW,gBAAgB,EAAE,OAAO,EAAE,gBAAgB,EAAE,OAAO,QAAQ,EAAE,CAAC;AAAA,cAC3F,WAAU;AAAA;AAAA,UACZ;AAAA,UAAE;AAAA,WAEJ;AAAA,QACA,gBAAAC,MAAC,WAAM,WAAU,6BACf;AAAA,0BAAAD;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,cAAW;AAAA,cACX,SAAS,MAAM;AAAA,cACf,UAAU,CAAC,MAAM,WAAW,gBAAgB,EAAE,OAAO,EAAE,iBAAiB,EAAE,OAAO,QAAQ,EAAE,CAAC;AAAA,cAC5F,WAAU;AAAA;AAAA,UACZ;AAAA,UAAE;AAAA,WAEJ;AAAA,SACF;AAAA,OACF;AAAA,IAGD,mBAAmB,IAAI,KACtB,gBAAAC,MAAC,SAAI,WAAU,sDAAqD,MAAK,SAAQ,cAAW,mBAAkB,eAAY,mBACtH;AAAA,gBAAS,WAAW,SAAS,WAC7B,gBAAAA,MAAC,SAAI,WAAU,2BACb;AAAA,wBAAAD,KAAC,UAAK,WAAU,kBAAiB,eAAY,gBAC1C,2BAAiB,UAAU,GAC9B;AAAA,QACC,eACC,gBAAAA,KAAC,YAAO,MAAK,UAAS,OAAM,2BAA0B,WAAW,KAAK,KAAK,GAAG,SAAS,MAAM,WAAW,eAAe,IAAI,GAAG,0BAE9H;AAAA,SAEJ;AAAA,OAEA,SAAS,WAAW,SAAS,WAC7B,gBAAAC,MAAC,SAAI,WAAU,uBAAsB,MAAK,SAAQ,cAAW,0BAAyB,eAAY,mBAC/F;AAAA,iCAAyB,IAAI,CAAC,SAC7B,gBAAAD,KAAC,iBAA4B,MAAY,OAAO,mBAAmB,UAAU,EAAE,KAAK,EAAE,GAAG,UAAU,CAAC,MAAM,uBAAuB,YAAY,KAAK,IAAI,CAAC,KAAnI,KAAK,EAAiI,CAC3J;AAAA,QACD,gBAAAC,MAAC,SAAI,WAAU,2BACb;AAAA,0BAAAD,KAAC,YAAO,MAAK,UAAS,gBAAc,mBAAmB,UAAU,EAAE,OAAO,OAAM,mCAAkC,WAAW,KAAK,mBAAmB,UAAU,EAAE,KAAK,GAAG,SAAS,MAAM,uBAAuB,YAAY,OAAO,GAAG,oBAErO;AAAA,UACA,gBAAAA,KAAC,YAAO,MAAK,UAAS,gBAAc,mBAAmB,UAAU,EAAE,OAAO,OAAM,mCAAkC,WAAW,KAAK,mBAAmB,UAAU,EAAE,KAAK,GAAG,SAAS,MAAM,uBAAuB,YAAY,OAAO,GAAG,oBAErO;AAAA,UACC,CAAC,mBAAmB,UAAU,EAAE,YAC/B,gBAAAA,KAAC,YAAO,MAAK,UAAS,OAAM,iCAA6B,WAAW,KAAK,KAAK,GAAG,SAAS,MAAM,WAAW,kBAAkB,IAAI,GAAG,6BAEpI;AAAA,WAEJ;AAAA,SACF;AAAA,MAED,gBAAgB,OAAO,CAAC,MAAM,EAAE,MAAM,SAAS,IAAI,CAAC,EAAE,IAAI,CAAC,WAC1D,gBAAAC,MAAC,SAAoB,WAAU,qCAAoC,MAAK,SAAQ,cAAY,OAAO,OACjG;AAAA,wBAAAD,KAAC,UAAK,WAAU,kBAAkB,iBAAO,OAAM;AAAA,QAC9C,OAAO,QAAQ,IAAI,CAAC,MACnB,gBAAAA;AAAA,UAAC;AAAA;AAAA,YAEC,MAAK;AAAA,YACL,gBAAc,QAAQ,OAAO,EAAE,MAAM,EAAE;AAAA,YACvC,OAAO,EAAE;AAAA,YACT,WAAW,KAAK,QAAQ,OAAO,EAAE,MAAM,EAAE,EAAE;AAAA,YAC3C,SAAS,MAAM,iBAAiB,YAAY,OAAO,IAAI,EAAE,EAAE;AAAA,YAE1D,YAAE;AAAA;AAAA,UAPE,EAAE;AAAA,QAQT,CACD;AAAA,WAbO,OAAO,EAcjB,CACD;AAAA,MACA,wBAAwB,OAAO,CAAC,MAAM,EAAE,MAAM,SAAS,IAAI,CAAC,EAAE,IAAI,CAAC,SAClE,gBAAAA,KAAC,iBAA4B,MAAY,OAAO,QAAQ,KAAK,EAAE,GAAG,UAAU,CAAC,MAAM,WAAW,gBAAgB,EAAE,SAAS,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE,CAAC,KAAvH,KAAK,EAAqH,CAC/I;AAAA,MACD,gBAAAA,KAAC,SAAI,WAAU,uCACZ,0BAAgB,OAAO,CAAC,MAAM,EAAE,MAAM,SAAS,IAAI,CAAC,EAAE,IAAI,CAAC,MAC1D,gBAAAC,MAAC,WAAiB,WAAU,6BAC1B;AAAA,wBAAAD;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,cAAY,EAAE;AAAA,YACd,SAAS,QAAQ,EAAE,EAAE;AAAA,YACrB,UAAU,CAAC,MAAM,WAAW,gBAAgB,EAAE,SAAS,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,OAAO,QAAQ,EAAE,CAAC;AAAA,YACrF,WAAU;AAAA;AAAA,QACZ;AAAA,QACC,EAAE;AAAA,WARO,EAAE,EASd,CACD,GACH;AAAA,OACF;AAAA,IAGF,gBAAAC,MAAC,SAAI,WAAU,uCAAsC,MAAK,SAAQ,cAAW,YAC3E;AAAA,sBAAAA,MAAC,WAAM,WAAU,6BACf;AAAA,wBAAAD;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,cAAW;AAAA,YACX,SAAS,MAAM;AAAA,YACf,UAAU,CAAC,MAAM,WAAW,gBAAgB,EAAE,OAAO,EAAE,cAAc,EAAE,OAAO,QAAQ,EAAE,CAAC;AAAA,YACzF,WAAU;AAAA;AAAA,QACZ;AAAA,QAAE;AAAA,SAEJ;AAAA,MACA,gBAAAC,MAAC,WAAM,WAAU,6BACf;AAAA,wBAAAD;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,cAAW;AAAA,YACX,SAAS,MAAM;AAAA,YACf,UAAU,CAAC,MAAM,WAAW,gBAAgB,EAAE,OAAO,EAAE,iBAAiB,EAAE,OAAO,QAAQ,EAAE,CAAC;AAAA,YAC5F,WAAU;AAAA;AAAA,QACZ;AAAA,QAAE;AAAA,SAEJ;AAAA,OACF;AAAA,IAEA,gBAAAC,MAAC,SAAI,WAAU,cACb;AAAA,sBAAAD,KAAC,YAAO,MAAK,UAAS,WAAW,KAAK,KAAK,GAAG,SAAS,MAAM,QAAQ,MAAM,WAAW,WAAW,CAAC,GAAG,kBAErG;AAAA,MACA,gBAAAA,KAAC,YAAO,MAAK,UAAS,WAAW,KAAK,KAAK,GAAG,SAAS,MAAM,QAAQ,MAAM,WAAW,YAAY,CAAC,GAAG,mBAEtG;AAAA,OACF;AAAA,IACC,SACC,gBAAAA,KAAC,OAAE,MAAK,SAAQ,WAAU,iBACvB,iBACH;AAAA,KAEJ;AAEJ;;;AEpSA,SAAgB,aAAAI,YAAW,YAAAC,iBAAgB;AAE3C,SAAS,oBAAoB,gBAAgB,uBAAuB,uBAAuB,sBAAsB;AA8C3G,SAyDI,YAAAC,WAxDF,OAAAC,OADF,QAAAC,aAAA;AAvCN,IAAMC,QAAO;AACb,IAAM,SAAS;AAOR,IAAM,oBAAsD,CAAC,EAAE,YAAY,UAAU,MAAM;AAChG,QAAM,CAAC,EAAE,OAAO,IAAIJ,UAAS,CAAC;AAC9B,EAAAD,WAAU,MAAM,WAAW,UAAU,MAAM,QAAQ,CAAC,MAAM,IAAI,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC;AAC/E,QAAM,CAAC,QAAQ,SAAS,IAAIC,UAAiB,YAAY;AACzD,QAAM,CAAC,QAAQ,SAAS,IAAIA,UAAiB,UAAU;AACvD,QAAM,CAAC,KAAK,MAAM,IAAIA,UAAS,IAAI;AACnC,QAAM,CAAC,OAAO,QAAQ,IAAIA,UAAwB,IAAI;AACtD,QAAM,OAAO,eAAe,UAAU;AACtC,QAAM,UAAU,CAAC,OAAsB;AACrC,QAAI;AACF,eAAS,IAAI;AACb,SAAG;AAAA,IACL,SAAS,KAAK;AACZ,eAAS,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,IAC3D;AAAA,EACF;AACA,QAAM,YAAY,CAAC,UAAkG;AACnH,UAAM,MAAM,KAAK;AACjB,UAAM,KAAK,MAAM,MAAM,KAAK,MAAM;AAClC;AAAA,MAAQ,MACN,WAAW,cAAc;AAAA,QACvB,SAAS;AAAA,QACT,QAAQ,MAAM,UAAU,KAAK,UAAU;AAAA,QACvC,eAAe,MAAM,iBAAiB,KAAK,iBAAiB;AAAA,QAC5D,cAAc,MAAM,gBAAgB,KAAK,gBAAgB;AAAA,MAC3D,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SACE,gBAAAG,MAAC,SAAI,WAAW,8CAA8C,aAAa,EAAE,IAAI,eAAY,uBAC3F;AAAA,oBAAAA,MAAC,SAAI,WAAU,2BACb;AAAA,sBAAAD,MAAC,UAAK,WAAU,kBAAiB,qBAAO;AAAA,MACxC,gBAAAA,MAAC,UAAK,eAAY,sBAAsB,eAAK,aAAY;AAAA,OAC3D;AAAA,IACA,gBAAAC,MAAC,SAAI,WAAU,qCAAoC,MAAK,SAAQ,cAAW,eACzE;AAAA,sBAAAD,MAAC,UAAK,WAAU,kBAAiB,kBAAI;AAAA,MACrC,gBAAAA,MAAC,YAAO,cAAW,eAAc,WAAW,QAAQ,OAAO,KAAK,MAAM,UAAU,CAAC,MAAM,QAAQ,MAAM,WAAW,aAAa,EAAE,OAAO,KAA+B,CAAC,GACnK,6BAAmB,IAAI,CAAC,MACvB,gBAAAA,MAAC,YAAkB,OAAO,EAAE,IAAI,OAAO,EAAE,OACtC,YAAE,SADQ,EAAE,EAEf,CACD,GACH;AAAA,MACC,KAAK,mBAAmB,gBAAAA,MAAC,UAAK,WAAU,kBAAkB,eAAK,iBAAgB;AAAA,OAClF;AAAA,IACA,gBAAAC,MAAC,SAAI,WAAU,qCAAoC,MAAK,SAAQ,cAAW,qBACzE;AAAA,sBAAAD,MAAC,YAAO,cAAW,kBAAiB,WAAW,QAAQ,OAAO,QAAQ,UAAU,CAAC,MAAM,UAAU,EAAE,OAAO,KAAK,GAC5G,gCAAsB,IAAI,CAAC,MAC1B,gBAAAA,MAAC,YAAkB,OAAO,EAAE,IACzB,YAAE,SADQ,EAAE,EAEf,CACD,GACH;AAAA,MACA,gBAAAA,MAAC,YAAO,cAAW,oBAAmB,WAAW,QAAQ,OAAO,QAAQ,UAAU,CAAC,MAAM,UAAU,EAAE,OAAO,KAAe,GACxH,yBAAe,IAAI,CAAC,MACnB,gBAAAA,MAAC,YAAkB,OAAO,EAAE,IAAI,OAAO,EAAE,OACtC,YAAE,SADQ,EAAE,EAEf,CACD,GACH;AAAA,MACA,gBAAAC,MAAC,WAAM,WAAU,2BACf;AAAA,wBAAAD,MAAC,WAAM,MAAK,YAAW,cAAW,4BAA2B,SAAS,KAAK,UAAU,CAAC,MAAM,OAAO,EAAE,OAAO,OAAO,GAAG,WAAU,qBAAoB;AAAA,QAAE;AAAA,SAExJ;AAAA,MACA,gBAAAA,MAAC,YAAO,MAAK,UAAS,WAAWE,OAAM,OAAM,gDAA0C,SAAS,MAAM,QAAQ,MAAM,WAAW,cAAc,MAAM,CAAC,GAAG,oBAEvJ;AAAA,MACA,gBAAAF,MAAC,YAAO,MAAK,UAAS,WAAWE,OAAM,OAAM,iDAA2C,SAAS,MAAM,QAAQ,MAAM,WAAW,iBAAiB,QAAQ,EAAE,QAAQ,IAAI,CAAC,CAAC,GAAG,qBAE5K;AAAA,OACF;AAAA,IACA,gBAAAD,MAAC,SAAI,WAAU,qCAAoC,MAAK,SAAQ,cAAW,eACzE;AAAA,sBAAAD,MAAC,UAAK,WAAU,kBAAiB,mBAAK;AAAA,MACtC,gBAAAC;AAAA,QAAC;AAAA;AAAA,UACC,cAAW;AAAA,UACX,WAAW;AAAA,UACX,OAAO,KAAK,OAAO,MAAM;AAAA,UACzB,UAAU,CAAC,MAAO,EAAE,OAAO,QAAQ,UAAU,EAAE,IAAI,EAAE,OAAO,MAAM,CAAC,IAAI,QAAQ,MAAM,WAAW,cAAc,IAAI,CAAC;AAAA,UAEnH;AAAA,4BAAAD,MAAC,YAAO,OAAM,IAAG,iBAAG;AAAA,YACnB,sBAAsB,IAAI,CAAC,MAC1B,gBAAAA,MAAC,YAAkB,OAAO,EAAE,IACzB,YAAE,SADQ,EAAE,EAEf,CACD;AAAA;AAAA;AAAA,MACH;AAAA,MACC,KAAK,SACJ,gBAAAC,MAAAF,WAAA,EACE;AAAA,wBAAAC,MAAC,YAAO,cAAW,gBAAe,WAAW,QAAQ,OAAO,KAAK,MAAM,QAAQ,UAAU,CAAC,MAAM,UAAU,EAAE,QAAQ,EAAE,OAAO,MAAgB,CAAC,GAC3I,yBAAe,IAAI,CAAC,MACnB,gBAAAA,MAAC,YAAkB,OAAO,EAAE,IACzB,YAAE,SADQ,EAAE,EAEf,CACD,GACH;AAAA,QACA,gBAAAC,MAAC,WAAM,WAAU,2BACf;AAAA,0BAAAD,MAAC,WAAM,MAAK,YAAW,cAAW,yBAAwB,SAAS,KAAK,MAAM,eAAe,UAAU,CAAC,MAAM,UAAU,EAAE,eAAe,EAAE,OAAO,QAAQ,CAAC,GAAG,WAAU,qBAAoB;AAAA,UAAE;AAAA,WAEhM;AAAA,QACA,gBAAAC,MAAC,WAAM,WAAU,2BACf;AAAA,0BAAAD,MAAC,WAAM,MAAK,YAAW,cAAW,iBAAgB,SAAS,KAAK,MAAM,cAAc,UAAU,CAAC,MAAM,UAAU,EAAE,cAAc,EAAE,OAAO,QAAQ,CAAC,GAAG,WAAU,qBAAoB;AAAA,UAAE;AAAA,WAEtL;AAAA,SACF;AAAA,OAEJ;AAAA,IACC,SACC,gBAAAA,MAAC,OAAE,MAAK,SAAQ,WAAU,iBACvB,iBACH;AAAA,KAEJ;AAEJ;;;ACnIA,SAAgB,YAAAG,kBAAgB;AAEhC;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AA+CG,gBAAAC,OAeE,QAAAC,cAfF;AAlCV,IAAM,aAAyD;AAAA,EAC7D,EAAE,IAAI,QAAQ,OAAO,OAAO;AAAA,EAC5B,EAAE,IAAI,UAAU,OAAO,SAAS;AAAA,EAChC,EAAE,IAAI,WAAW,OAAO,UAAU;AAAA,EAClC,EAAE,IAAI,UAAU,OAAO,SAAS;AAAA,EAChC,EAAE,IAAI,UAAU,OAAO,SAAS;AAClC;AAEA,IAAMC,OAAM,CAAC,OACX,6DACE,KAAK,+CAA+C,+DACtD;AAOK,IAAM,sBAA0D,CAAC;AAAA,EACtE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,YAAY;AACd,MAAM;AACJ,QAAM,CAAC,QAAQ,SAAS,IAAIH,WAAS,CAAC;AACtC,QAAM,MAAM,CAAC,UAAyC,gBAAgB,EAAE,GAAG,SAAS,GAAG,MAAM,CAAC;AAC9F,QAAM,MAAM,cAAc,SAAY,WAAW,aAAa,IAAI;AAClE,QAAM,KAAK,aAAa,QAAQ,WAAW,SAAS,EAAE,SAAS;AAC/D,SACE,gBAAAE,OAAC,SAAI,eAAY,yBAAwB,WAAW,+BAA+B,SAAS,IAC1F;AAAA,oBAAAD,MAAC,SAAI,MAAK,SAAQ,cAAW,kBAAiB,WAAU,wBACrD,0BAAgB,IAAI,CAAC,MACpB,gBAAAA,MAAC,YAAkB,MAAK,UAAS,gBAAc,QAAQ,SAAS,EAAE,IAAI,WAAWE,KAAI,QAAQ,SAAS,EAAE,EAAE,GAAG,SAAS,MAAM,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC,GAC3I,YAAE,SADQ,EAAE,EAEf,CACD,GACH;AAAA,IACA,gBAAAF,MAAC,SAAI,MAAK,SAAQ,cAAW,kBAAiB,WAAU,wBACrD,0BAAgB,IAAI,CAAC,MACpB,gBAAAA,MAAC,YAAe,MAAK,UAAS,gBAAc,QAAQ,SAAS,GAAG,WAAWE,KAAI,QAAQ,SAAS,CAAC,GAAG,SAAS,MAAM,IAAI,EAAE,MAAM,EAAE,CAAC,GAC/H,gCAAsB,CAAC,KADb,CAEb,CACD,GACH;AAAA,IACC,QAAQ,SAAS,UAChB,gBAAAD,OAAC,SAAI,WAAU,uBACb;AAAA,sBAAAA,OAAC,WAAM,WAAU,uBACf;AAAA,wBAAAA,OAAC,UAAK,WAAU,uCACd;AAAA,0BAAAD,MAAC,UAAK,uBAAS;AAAA,UACf,gBAAAA,MAAC,UAAK,WAAU,aAAa,kBAAQ,WAAU;AAAA,WACjD;AAAA,QACA,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,KAAK;AAAA,YACL,KAAK;AAAA,YACL,MAAM;AAAA,YACN,cAAW;AAAA,YACX,OAAO,QAAQ;AAAA,YACf,UAAU,CAAC,MAAM,IAAI,EAAE,WAAW,OAAO,EAAE,OAAO,KAAK,EAAE,CAAC;AAAA,YAC1D,WAAU;AAAA;AAAA,QACZ;AAAA,SACF;AAAA,MACA,gBAAAC,OAAC,WAAM,WAAU,0CACf;AAAA,wBAAAD,MAAC,WAAM,MAAK,YAAW,SAAS,QAAQ,YAAY,UAAU,CAAC,MAAM,IAAI,EAAE,YAAY,EAAE,OAAO,QAAQ,CAAC,GAAG;AAAA,QAAE;AAAA,SAEhH;AAAA,MACA,gBAAAC,OAAC,WAAM,WAAU,0CACf;AAAA,wBAAAD,MAAC,WAAM,MAAK,YAAW,SAAS,QAAQ,cAAc,UAAU,CAAC,MAAM,IAAI,EAAE,cAAc,EAAE,OAAO,QAAQ,CAAC,GAAG;AAAA,QAAE;AAAA,SAEpH;AAAA,MACA,gBAAAC,OAAC,WAAM,WAAU,0CAAyC;AAAA;AAAA,QAExD,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,cAAW;AAAA,YACX,OAAO,QAAQ,UAAU;AAAA,YACzB,UAAU,CAAC,MAAM,IAAI,EAAE,QAAQ,EAAE,OAAO,MAAsC,CAAC;AAAA,YAC/E,WAAU;AAAA,YAEV;AAAA,8BAAAD,MAAC,YAAO,OAAM,aAAY,wBAAU;AAAA,cACpC,gBAAAA,MAAC,YAAO,OAAM,gBAAe,0BAAY;AAAA;AAAA;AAAA,QAC3C;AAAA,SACF;AAAA,OACF;AAAA,IAEF,gBAAAC,OAAC,WAAM,WAAU,0CACf;AAAA,sBAAAD,MAAC,WAAM,MAAK,YAAW,SAAS,QAAQ,WAAW,UAAU,CAAC,MAAM,IAAI,EAAE,WAAW,EAAE,OAAO,QAAQ,CAAC,GAAG;AAAA,MAAE;AAAA,OAE9G;AAAA,IACA,gBAAAC,OAAC,SAAI,WAAU,wBACb;AAAA,sBAAAD,MAAC,YAAO,MAAK,UAAS,WAAWE,KAAI,KAAK,GAAG,SAAS,MAAM,WAAW,UAAU,GAAG,wBAEpF;AAAA,MACA,gBAAAF,MAAC,YAAO,MAAK,UAAS,WAAWE,KAAI,KAAK,GAAG,UAAU,CAAC,KAAK,SAAS,MAAM,WAAW,SAAS,GAAG,sBAEnG;AAAA,MACA,gBAAAF,MAAC,YAAO,MAAK,UAAS,WAAWE,KAAI,KAAK,GAAG,SAAS,MAAM,WAAW,gBAAgB,GAAG,qBAE1F;AAAA,MACA,gBAAAF,MAAC,YAAO,MAAK,UAAS,gBAAc,IAAI,WAAWE,KAAI,EAAE,GAAG,SAAS,MAAM,WAAW,aAAa,CAAC,EAAE,GAAG,wBAEzG;AAAA,OACF;AAAA,IACA,gBAAAD,OAAC,SAAI,WAAU,qCACb;AAAA,sBAAAA,OAAC,WAAM,WAAU,0CAAyC;AAAA;AAAA,QAExD,gBAAAD;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,KAAK;AAAA,YACL,KAAK;AAAA,YACL,MAAM;AAAA,YACN,cAAW;AAAA,YACX,OAAO;AAAA,YACP,UAAU,CAAC,MAAM,UAAU,KAAK,IAAI,GAAG,OAAO,EAAE,OAAO,KAAK,KAAK,CAAC,CAAC;AAAA,YACnE,WAAU;AAAA;AAAA,QACZ;AAAA,SACF;AAAA,MACC,WAAW,IAAI,CAAC,EAAE,IAAI,MAAM,MAC3B,gBAAAA,MAAC,YAAgB,MAAK,UAAS,WAAWE,KAAI,KAAK,GAAG,UAAU,CAAC,KAAK,SAAS,MAAM,WAAW,gBAAgB,IAAI,MAAM,GACvH,mBADU,EAEb,CACD;AAAA,OACH;AAAA,IACA,gBAAAF,MAAC,OAAE,eAAY,oBAAmB,WAAU,kBACzC,4BAAkB,GAAG,GACxB;AAAA,KACF;AAEJ;;;ACrJA,SAAgB,YAAAG,kBAAgB;AAEhC;AAAA,EACE,oBAAAC;AAAA,EACA;AAAA,EACA,uBAAAC;AAAA,EACA;AAAA,OACK;AA6CD,SA0FM,YAAAC,WA1FN,OAAAC,OAKM,QAAAC,cALN;AAlCN,IAAM,iBAA6C,EAAE,QAAQ,GAAG,aAAa,OAAO,QAAQ,GAAG,SAAS,GAAG,UAAU,GAAG,WAAW,EAAE;AAErI,IAAMC,UACJ;AAOK,IAAM,kBAAkD,CAAC,EAAE,YAAY,WAAW,QAAQ,YAAY,GAAG,MAAM;AACpH,QAAM,CAAC,QAAQ,SAAS,IAAIN,WAAqC,cAAc;AAC/E,QAAM,CAAC,MAAM,OAAO,IAAIA,WAAS,KAAK;AACtC,QAAM,CAAC,OAAO,QAAQ,IAAIA,WAAwB,IAAI;AACtD,QAAM,CAAC,SAAS,UAAU,IAAIA,WAAS,EAAE;AACzC,QAAM,CAAC,SAAS,UAAU,IAAIA,WAAyB,eAAe;AACtE,QAAM,MAAM,cAAc,SAAY,WAAW,aAAa,IAAI;AAClE,QAAM,OAAO,UAAU,WAAW,oBAAoB;AACtD,QAAM,SAAS,KAAK,KAAK,CAAC,MAAM,EAAE,OAAO,OAAO,KAAK,KAAK,KAAK,SAAS,CAAC;AAEzE,QAAM,SAAS,YAAY;AACzB,YAAQ,IAAI;AACZ,aAAS,IAAI;AACb,QAAI;AACF,YAAM,WAAW,gBAAgB,MAAM;AAAA,IACzC,SAAS,KAAK;AACZ,eAAS,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,IAC3D,UAAE;AACA,cAAQ,KAAK;AAAA,IACf;AAAA,EACF;AAEA,SACE,gBAAAK,OAAC,SAAI,eAAY,qBAAoB,WAAW,+BAA+B,SAAS,IACtF;AAAA,oBAAAD,MAAC,UAAK,WAAU,qEAAoE,yBAAW;AAAA,IAC9F,qBAAqB,IAAI,CAAC,MACzB,gBAAAC,OAAC,WAAiB,WAAU,uBAC1B;AAAA,sBAAAA,OAAC,UAAK,WAAU,uCACd;AAAA,wBAAAD,MAAC,UAAM,YAAE,OAAM;AAAA,QACf,gBAAAC,OAAC,UAAK,WAAU,aACb;AAAA,iBAAO,EAAE,EAAE;AAAA,UACX,EAAE;AAAA,WACL;AAAA,SACF;AAAA,MACA,gBAAAD;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,KAAK,EAAE;AAAA,UACP,KAAK,EAAE;AAAA,UACP,MAAM,EAAE;AAAA,UACR,cAAY,EAAE;AAAA,UACd,OAAO,OAAO,EAAE,EAAE;AAAA,UAClB,UAAU,CAAC,MAAM,UAAU,EAAE,GAAG,QAAQ,CAAC,EAAE,EAAE,GAAG,OAAO,EAAE,OAAO,KAAK,EAAE,CAAC;AAAA,UACxE,WAAU;AAAA;AAAA,MACZ;AAAA,SAjBU,EAAE,EAkBd,CACD;AAAA,IACD,gBAAAC,OAAC,WAAM,WAAU,0CACf;AAAA,sBAAAD,MAAC,WAAM,MAAK,YAAW,SAAS,OAAO,aAAa,UAAU,CAAC,MAAM,UAAU,EAAE,GAAG,QAAQ,aAAa,EAAE,OAAO,QAAQ,CAAC,GAAG;AAAA,MAAE;AAAA,OAElI;AAAA,IACA,gBAAAC,OAAC,SAAI,WAAU,cACb;AAAA,sBAAAD,MAAC,YAAO,MAAK,UAAS,WAAWE,SAAQ,UAAU,CAAC,OAAO,MAAM,SAAS,QAAQ,yBAElF;AAAA,MACA,gBAAAF,MAAC,YAAO,MAAK,UAAS,WAAWE,SAAQ,SAAS,MAAM,UAAU,cAAc,GAAG,mBAEnF;AAAA,OACF;AAAA,IACC,SACC,gBAAAF,MAAC,OAAE,MAAK,SAAQ,WAAU,iBACvB,iBACH;AAAA,IAGF,gBAAAA,MAAC,UAAK,WAAU,0EAAyE,wBAAU;AAAA,IACnG,gBAAAC,OAAC,SAAI,WAAU,2BACb;AAAA,sBAAAD;AAAA,QAAC;AAAA;AAAA,UACC,cAAW;AAAA,UACX,OAAO;AAAA,UACP,UAAU,CAAC,MAAM,WAAW,EAAE,OAAO,KAAuB;AAAA,UAC5D,WAAU;AAAA,UAET,UAAAH,kBAAiB,IAAI,CAAC,MACrB,gBAAAG,MAAC,YAAoB,OAAO,EAAE,MAC3B,YAAE,SADQ,EAAE,IAEf,CACD;AAAA;AAAA,MACH;AAAA,MACA,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,WAAWE;AAAA,UACX,UAAU,CAAC;AAAA,UACX,SAAS,MAAM,OAAO,WAAW,WAAW,mBAAmB,EAAE,MAAM,SAAS,MAAM,uBAAuB,GAAG,EAAE,CAAC,CAAC;AAAA,UACrH;AAAA;AAAA,MAED;AAAA,OACF;AAAA,IACC,KAAK,SAAS,KAAK,UAClB,gBAAAD,OAAC,SAAI,WAAU,uBACb;AAAA,sBAAAD;AAAA,QAAC;AAAA;AAAA,UACC,cAAW;AAAA,UACX,OAAO,OAAO;AAAA,UACd,UAAU,CAAC,MAAM,WAAW,EAAE,OAAO,KAAK;AAAA,UAC1C,WAAU;AAAA,UAET,eAAK,IAAI,CAAC,MACT,gBAAAC,OAAC,YAAkB,OAAO,EAAE,IACzB;AAAA,cAAE,QAAQH,qBAAoB,EAAE,IAAI;AAAA,YACpC,EAAE,OAAO,cAAc;AAAA,eAFb,EAAE,EAGf,CACD;AAAA;AAAA,MACH;AAAA,MACA,gBAAAG,OAAC,SAAI,WAAU,wBACb;AAAA,wBAAAD,MAAC,YAAO,MAAK,UAAS,WAAWE,SAAQ,UAAU,CAAC,KAAK,SAAS,MAAM,WAAW,0BAA0B,OAAO,EAAE,GAAG,iCAEzH;AAAA,QACA,gBAAAF,MAAC,YAAO,MAAK,UAAS,WAAWE,SAAQ,UAAU,CAAC,OAAO,MAAM,SAAS,MAAM,WAAW,uBAAuB,OAAO,EAAE,GAAG,+BAE9H;AAAA,QACA,gBAAAF,MAAC,YAAO,MAAK,UAAS,WAAWE,SAAQ,UAAU,CAAC,OAAO,MAAM,SAAS,MAAM,WAAW,uBAAuB,OAAO,IAAI,IAAI,GAAG,yBAEpI;AAAA,SACF;AAAA,MACC,OAAO,QACN,gBAAAD,OAAAF,WAAA,EACE;AAAA,wBAAAE,OAAC,WAAM,WAAU,uBACf;AAAA,0BAAAA,OAAC,UAAK,WAAU,uCACd;AAAA,4BAAAD,MAAC,UAAK,qBAAO;AAAA,YACb,gBAAAC,OAAC,UAAK,WAAU,aAAa;AAAA,mBAAK,OAAO,OAAO,KAAK,WAAW,KAAK,GAAG;AAAA,cAAE;AAAA,eAAC;AAAA,aAC7E;AAAA,UACA,gBAAAD;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,KAAK;AAAA,cACL,KAAK;AAAA,cACL,MAAM;AAAA,cACN,cAAW;AAAA,cACX,OAAO,KAAK,OAAO,OAAO,KAAK,WAAW,KAAK,GAAG;AAAA,cAClD,UAAU,CAAC,MAAM,WAAW,4BAA4B,OAAO,IAAI,EAAE,SAAS,OAAO,EAAE,OAAO,KAAK,IAAI,IAAI,CAAC;AAAA,cAC5G,WAAU;AAAA;AAAA,UACZ;AAAA,WACF;AAAA,QACA,gBAAAC,OAAC,WAAM,WAAU,uBACf;AAAA,0BAAAA,OAAC,UAAK,WAAU,uCACd;AAAA,4BAAAD,MAAC,UAAK,0BAAY;AAAA,YAClB,gBAAAC,OAAC,UAAK,WAAU,aAAa;AAAA,qBAAO,KAAK,WAAW;AAAA,cAAE;AAAA,eAAE;AAAA,aAC1D;AAAA,UACA,gBAAAD;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,KAAK;AAAA,cACL,KAAK;AAAA,cACL,MAAM;AAAA,cACN,cAAW;AAAA,cACX,OAAO,OAAO,KAAK,WAAW;AAAA,cAC9B,UAAU,CAAC,MAAM,WAAW,4BAA4B,OAAO,IAAI,EAAE,SAAS,OAAO,EAAE,OAAO,KAAK,EAAE,CAAC;AAAA,cACtG,WAAU;AAAA;AAAA,UACZ;AAAA,WACF;AAAA,SACF;AAAA,OAEJ;AAAA,KAEJ;AAEJ;;;ACrLA,SAAgB,aAAAG,YAAW,YAAAC,kBAAgB;AAE3C,SAAS,uBAAuB,6BAA6B,gBAAgB,mBAAmB,mBAAmB,0BAA0B;AAoCnI,gBAAAC,OAYA,QAAAC,cAZA;AA7BV,IAAMC,QAAO,CAAC,OAAgB,iCAAiC,KAAK,6BAA6B,8CAA8C;AAC/I,IAAM,QAAQ,CAAC,GAAW,SAAkB,SAAS,OAAO,KAAK,MAAM,IAAI,EAAE,IAAI,KAAK,KAAK,MAAM,IAAI,GAAG,IAAI;AASrG,IAAM,0BAAkE,CAAC,EAAE,MAAM,UAAU,MAAM;AACtG,QAAM,CAAC,EAAE,OAAO,IAAIH,WAAS,CAAC;AAC9B,EAAAD,WAAU,MAAM,KAAK,UAAU,MAAM,QAAQ,CAAC,MAAM,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC;AACnE,QAAM,MAAM,KAAK,IAAI;AACrB,MAAI,CAAC,KAAK,UAAU,CAAC,IAAK,QAAO;AACjC,QAAM,OAAO,KAAK,QAAQ;AAC1B,QAAM,aAAa,CAAC,KAAyC,QAAgB;AAC3E,UAAM,IAAI,OAAO,GAAG;AACpB,QAAI,IAAI,KAAK,MAAM,MAAM,OAAO,SAAS,CAAC,KAAK,MAAM,KAAK,GAAG,EAAG,MAAK,QAAQ,EAAE,CAAC,GAAG,GAAG,KAAK,IAAI,MAAM,KAAK,IAAI,KAAK,CAAC,CAAC,EAAE,CAAqB;AAAA,EAC9I;AACA,QAAM,QAAQ,CAAC,OAA2B,QAAgB;AACxD,UAAM,IAAI,OAAO,GAAG;AACpB,QAAI,IAAI,KAAK,MAAM,MAAM,OAAO,SAAS,CAAC,KAAK,KAAK,IAAI,IAAI,IAAI,KAAK,CAAC,IAAI,KAAM,MAAK,SAAS,OAAO,CAAC;AAAA,EACxG;AAEA,SACE,gBAAAG,OAAC,SAAI,WAAW,4DAA4D,aAAa,EAAE,IAAI,eAAY,0BAAyB,MAAK,WAAU,cAAW,0BAC5J;AAAA,oBAAAD,MAAC,SAAI,WAAU,cAAa,MAAK,SAAQ,cAAW,kBACjD,sCAA4B,IAAI,CAAC,MAChC,gBAAAA,MAAC,YAAkB,MAAK,UAAS,OAAO,EAAE,OAAO,gBAAc,KAAK,SAAS,EAAE,IAAI,WAAWE,MAAK,KAAK,SAAS,EAAE,EAAE,GAAG,SAAS,MAAM,KAAK,QAAQ,EAAE,EAAE,GACrJ,YAAE,SADQ,EAAE,EAEf,CACD,GACH;AAAA,IACA,gBAAAF,MAAC,SAAI,WAAU,2BAA0B,MAAK,SAAQ,cAAW,mBAC9D,4BAAkB,IAAI,CAAC,MACtB,gBAAAA,MAAC,YAAe,MAAK,UAAS,cAAY,mBAAmB,CAAC,IAAI,OAAO,oBAAoB,CAAC,IAAI,WAAU,2DAA0D,SAAS,MAAM,KAAK,aAAa,CAAC,KAA3L,CAA8L,CAC5M,GACH;AAAA,IACC,KAAK,SAAS,UACb,gBAAAC,OAAC,SAAI,WAAU,qCAAoC,MAAK,SAAQ,cAAW,gBACzE;AAAA,sBAAAA,OAAC,WAAM,WAAU,2BACf;AAAA,wBAAAD,MAAC,UAAK,WAAU,kBAAiB,kBAAI;AAAA,QACrC,gBAAAA,MAAC,YAAO,cAAW,cAAa,OAAO,KAAK,OAAO,UAAU,CAAC,MAAM,KAAK,QAAQ,EAAE,OAAO,EAAE,OAAO,MAA0B,CAAC,GAAG,WAAU,4DACxI,6BAAmB,IAAI,CAAC,MACvB,gBAAAA,MAAC,YAAkB,OAAO,EAAE,IACzB,YAAE,SADQ,EAAE,EAEf,CACD,GACH;AAAA,SACF;AAAA,MACE,CAAC,QAAQ,cAAc,UAAU,EAAY,IAAI,CAAC,MAClD,gBAAAC,OAAC,WAAc,WAAU,2BACvB;AAAA,wBAAAD,MAAC,UAAK,WAAU,kBAAkB,gBAAM,SAAS,SAAS,MAAM,eAAe,MAAM,KAAI;AAAA,QACzF,gBAAAA;AAAA,UAAC;AAAA;AAAA,YAEC,MAAK;AAAA,YACL,cAAY,MAAM,SAAS,yBAAyB,QAAQ,CAAC;AAAA,YAC7D,cAAc,KAAK,CAAC;AAAA,YACpB,KAAK;AAAA,YACL,KAAK;AAAA,YACL,UAAU,KAAK,UAAU;AAAA,YACzB,WAAU;AAAA,YACV,QAAQ,CAAC,MAAM,WAAW,GAAG,EAAE,cAAc,KAAK;AAAA,YAClD,WAAW,CAAC,MAAM;AAChB,kBAAI,EAAE,QAAQ,SAAS;AACrB,kBAAE,eAAe;AACjB,kBAAE,gBAAgB;AAClB,2BAAW,GAAG,EAAE,cAAc,KAAK;AAAA,cACrC;AAAA,YACF;AAAA;AAAA,UAfK,GAAG,CAAC,IAAI,KAAK,CAAC,CAAC;AAAA,QAgBtB;AAAA,QACA,gBAAAA,MAAC,UAAK,WAAU,kBAAiB,eAAC;AAAA,WApBxB,CAqBZ,CACD;AAAA,MACD,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,OAAM;AAAA,UACN,gBAAc,KAAK,gBAAgB;AAAA,UACnC,UAAU,KAAK,UAAU;AAAA,UACzB,WAAWE,MAAK,KAAK,gBAAgB,UAAU;AAAA,UAC/C,SAAS,MAAM,KAAK,QAAQ,EAAE,aAAa,KAAK,gBAAgB,aAAa,eAAe,WAAW,CAAC;AAAA,UACzG;AAAA;AAAA,MAED;AAAA,MACA,gBAAAD,OAAC,WAAM,WAAU,2BACf;AAAA,wBAAAD,MAAC,UAAK,WAAU,kBAAiB,kBAAI;AAAA,QACrC,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,cAAW;AAAA,YACX,OAAO,kBAAkB,KAAK,CAAC,MAAM,EAAE,YAAY,KAAK,WAAW,EAAE,SAAS,KAAK,IAAI,GAAG,MAAM;AAAA,YAChG,UAAU,CAAC,MAAM;AACf,oBAAM,IAAI,kBAAkB,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,KAAK;AAC/D,mBAAK,QAAQ,EAAE,SAAS,EAAE,SAAS,MAAM,EAAE,KAAK,CAAC;AAAA,YACnD;AAAA,YACA,WAAU;AAAA,YAET,4BAAkB,IAAI,CAAC,MACtB,gBAAAA,MAAC,YAAkB,OAAO,EAAE,IACzB,YAAE,SADQ,EAAE,EAEf,CACD;AAAA;AAAA,QACH;AAAA,SACF;AAAA,OACF;AAAA,IAED,KAAK,SAAS,UAAU,sBAAsB,IAAI,CAAC,MAClD,gBAAAC,OAAC,WAAiB,WAAU,2BAA0B,OAAO,EAAE,OAC7D;AAAA,sBAAAD,MAAC,UAAK,WAAU,kBAAkB,YAAE,OAAM;AAAA,MAC1C,gBAAAA;AAAA,QAAC;AAAA;AAAA,UAEC,MAAK;AAAA,UACL,cAAY,EAAE;AAAA,UACd,cAAc,MAAM,IAAI,EAAE,EAAE,GAAG,EAAE,IAAI;AAAA,UACrC,UAAU,CAAC,IAAI;AAAA,UACf,MAAM,EAAE,SAAS,OAAO,IAAI;AAAA,UAC5B,WAAU;AAAA,UACV,QAAQ,CAAC,MAAM,MAAM,EAAE,IAAI,EAAE,cAAc,KAAK;AAAA,UAChD,WAAW,CAAC,MAAM;AAChB,gBAAI,EAAE,QAAQ,SAAS;AACrB,gBAAE,eAAe;AACjB,gBAAE,gBAAgB;AAClB,oBAAM,EAAE,IAAI,EAAE,cAAc,KAAK;AAAA,YACnC;AAAA,UACF;AAAA;AAAA,QAdK,GAAG,EAAE,EAAE,IAAI,MAAM,IAAI,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC;AAAA,MAe1C;AAAA,MACA,gBAAAA,MAAC,UAAK,WAAU,kBAAkB,YAAE,MAAK;AAAA,MACxC,EAAE,OAAO,YACR,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,cAAW;AAAA,UACX,gBAAc,KAAK;AAAA,UACnB,WAAWE,MAAK,KAAK,YAAY;AAAA,UACjC,SAAS,MAAM;AACb,iBAAK,eAAe,CAAC,KAAK;AAC1B,oBAAQ,CAAC,MAAM,IAAI,CAAC;AAAA,UACtB;AAAA,UACD;AAAA;AAAA,MAED;AAAA,SAhCQ,EAAE,EAkCd,CACD;AAAA,IACD,gBAAAD,OAAC,WAAM,WAAU,2BACf;AAAA,sBAAAD,MAAC,UAAK,WAAU,kBAAiB,2BAAa;AAAA,MAC9C,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,cAAW;AAAA,UACX,OAAO,KAAK;AAAA,UACZ,UAAU,CAAC,MAAM,KAAK,iBAAiB,EAAE,OAAO,KAAsB;AAAA,UACtE,WAAU;AAAA,UAET,yBAAe,IAAI,CAAC,MACnB,gBAAAA,MAAC,YAAe,OAAO,GACpB,YAAE,CAAC,EAAE,YAAY,IAAI,EAAE,MAAM,CAAC,KADpB,CAEb,CACD;AAAA;AAAA,MACH;AAAA,OACF;AAAA,IACA,gBAAAA,MAAC,YAAO,MAAK,UAAS,OAAM,kBAAiB,WAAU,oEAAmE,SAAS,MAAM,KAAK,OAAO,GAAG,oBAExJ;AAAA,IACA,gBAAAA,MAAC,YAAO,MAAK,UAAS,OAAM,gBAAe,WAAWE,MAAK,KAAK,GAAG,SAAS,MAAM,KAAK,OAAO,GAAG,oBAEjG;AAAA,IACC,KAAK,SACJ,gBAAAF,MAAC,UAAK,MAAK,SAAQ,WAAU,iBAC1B,eAAK,OACR;AAAA,KAEJ;AAEJ;;;ACnLA,SAAgB,aAAAG,aAAW,YAAAC,kBAAgB;AAE3C,SAAS,kBAAkB,mBAAmB,yBAAyB;AAsC7D,SAyDA,YAAAC,WAzDA,OAAAC,OAMF,QAAAC,cANE;AA7BV,IAAMC,QAAO,CAAC,OAAgB,iCAAiC,KAAK,6BAA6B,8CAA8C;AAOxI,IAAM,kBAAkD,CAAC,EAAE,YAAY,SAAS,UAAU,UAAU,MAAM;AAC/G,QAAM,CAAC,EAAE,OAAO,IAAIJ,WAAS,CAAC;AAC9B,EAAAD,YAAU,MAAM,WAAW,UAAU,MAAM,QAAQ,CAAC,MAAM,IAAI,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC;AAC/E,QAAM,CAAC,OAAO,QAAQ,IAAIC,WAAwB,IAAI;AACtD,QAAM,SAAS,WAAW,eAAe;AACzC,QAAM,UAAU,QAAQ,SAAS,UAAU,OAAO,KAAK;AACvD,QAAM,MAAM,CAAC,WAAsC;AACjD,aAAS,EAAE,GAAG,SAAS,GAAG,OAAO,CAAC;AAClC,QAAI,CAAC,QAAS;AACd,QAAI;AACF,eAAS,IAAI;AACb,wBAAkB,YAAY,SAAS,MAAM;AAAA,IAC/C,SAAS,GAAG;AACV,eAAS,aAAa,QAAQ,EAAE,UAAU,OAAO,CAAC,CAAC;AAAA,IACrD;AAAA,EACF;AACA,QAAM,MAAM,CAAC,GAAW,KAAa,QAAgB,KAAK,IAAI,KAAK,KAAK,IAAI,KAAK,OAAO,CAAC,KAAK,GAAG,CAAC;AAElG,SACE,gBAAAG,OAAC,SAAI,WAAW,8CAA8C,aAAa,EAAE,IAAI,eAAY,iBAC3F;AAAA,oBAAAD,MAAC,SAAI,WAAU,wBAAuB,MAAK,WAAU,cAAW,cAC7D,2BAAiB,IAAI,CAAC,MACrB,gBAAAA,MAAC,YAAe,MAAK,UAAS,gBAAc,QAAQ,SAAS,GAAG,WAAWE,MAAK,QAAQ,SAAS,CAAC,GAAG,SAAS,MAAM,SAAS,EAAE,GAAG,SAAS,MAAM,EAAE,CAAC,GACjJ,4BAAkB,CAAC,KADT,CAEb,CACD,GACH;AAAA,IACA,gBAAAD,OAAC,SAAI,WAAU,qCACb;AAAA,sBAAAA,OAAC,WAAM,WAAU,2BACf;AAAA,wBAAAD,MAAC,WAAM,MAAK,YAAW,cAAW,QAAO,SAAS,QAAQ,SAAS,MAAM,UAAU,CAAC,MAAM,IAAI,EAAE,MAAM,EAAE,OAAO,UAAU,YAAY,KAAK,CAAC,GAAG;AAAA,QAAE;AAAA,QAEhJ,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,cAAW;AAAA,YACX,UAAU,QAAQ,SAAS;AAAA,YAC3B,OAAO,QAAQ,QAAQ;AAAA,YACvB,UAAU,CAAC,MAAM,IAAI,EAAE,MAAM,EAAE,OAAO,MAAM,CAAC;AAAA,YAC7C,WAAU;AAAA;AAAA,QACZ;AAAA,SACF;AAAA,MACA,gBAAAC,OAAC,WAAM,WAAU,2BACf;AAAA,wBAAAD,MAAC,WAAM,MAAK,YAAW,cAAW,UAAS,SAAS,QAAQ,WAAW,MAAM,UAAU,CAAC,MAAM,IAAI,EAAE,QAAQ,EAAE,OAAO,UAAU,YAAY,KAAK,CAAC,GAAG;AAAA,QAAE;AAAA,QAEtJ,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,cAAW;AAAA,YACX,UAAU,QAAQ,WAAW;AAAA,YAC7B,OAAO,QAAQ,UAAU;AAAA,YACzB,UAAU,CAAC,MAAM,IAAI,EAAE,QAAQ,EAAE,OAAO,MAAM,CAAC;AAAA,YAC/C,WAAU;AAAA;AAAA,QACZ;AAAA,SACF;AAAA,MACA,gBAAAC,OAAC,WAAM,WAAU,2BAA0B;AAAA;AAAA,QAEzC,gBAAAD;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,cAAW;AAAA,YACX,KAAK;AAAA,YACL,KAAK;AAAA,YACL,OAAO,QAAQ;AAAA,YACf,UAAU,CAAC,MAAM,IAAI,EAAE,aAAa,IAAI,EAAE,OAAO,OAAO,GAAG,GAAG,EAAE,CAAC;AAAA,YACjE,WAAU;AAAA;AAAA,QACZ;AAAA,SACF;AAAA,OACF;AAAA,IACA,gBAAAC,OAAC,SAAI,WAAU,qCACZ;AAAA,cAAQ,SAAS,UAChB,gBAAAA,OAAC,WAAM,WAAU,2BAA0B;AAAA;AAAA,QAEzC,gBAAAD,MAAC,WAAM,MAAK,UAAS,cAAW,iBAAgB,KAAK,GAAG,KAAK,KAAM,OAAO,QAAQ,QAAQ,UAAU,CAAC,MAAM,IAAI,EAAE,QAAQ,IAAI,EAAE,OAAO,OAAO,GAAG,GAAI,EAAE,CAAC,GAAG,WAAU,iEAAgE;AAAA,SACtO;AAAA,MAED,QAAQ,SAAS,aAChB,gBAAAC,OAAC,WAAM,WAAU,2BAA0B;AAAA;AAAA,QAEzC,gBAAAD,MAAC,WAAM,MAAK,UAAS,cAAW,SAAQ,KAAK,GAAG,KAAK,KAAK,OAAO,QAAQ,OAAO,UAAU,CAAC,MAAM,IAAI,EAAE,OAAO,IAAI,EAAE,OAAO,OAAO,GAAG,GAAG,EAAE,CAAC,GAAG,WAAU,iEAAgE;AAAA,SAC1N;AAAA,MAED,QAAQ,SAAS,UAChB,gBAAAC,OAAAF,WAAA,EACE;AAAA,wBAAAE,OAAC,WAAM,WAAU,2BAA0B;AAAA;AAAA,UAEzC,gBAAAD,MAAC,WAAM,MAAK,UAAS,cAAW,UAAS,KAAK,GAAG,KAAK,KAAK,OAAO,QAAQ,QAAQ,UAAU,CAAC,MAAM,IAAI,EAAE,QAAQ,IAAI,EAAE,OAAO,OAAO,GAAG,GAAG,EAAE,CAAC,GAAG,WAAU,iEAAgE;AAAA,WAC7N;AAAA,QACA,gBAAAC,OAAC,WAAM,WAAU,2BAA0B;AAAA;AAAA,UAEzC,gBAAAD;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,cAAW;AAAA,cACX,KAAK;AAAA,cACL,KAAK;AAAA,cACL,MAAM;AAAA,cACN,OAAO,QAAQ;AAAA,cACf,UAAU,CAAC,MAAM,IAAI,EAAE,YAAY,OAAO,EAAE,OAAO,KAAK,EAAE,CAAC;AAAA,cAC3D,WAAU;AAAA;AAAA,UACZ;AAAA,WACF;AAAA,SACF;AAAA,MAED,QAAQ,SAAS,UAChB,gBAAAC,OAAAF,WAAA,EACE;AAAA,wBAAAE,OAAC,WAAM,WAAU,2BAA0B;AAAA;AAAA,UAEzC,gBAAAD,MAAC,WAAM,MAAK,UAAS,cAAW,eAAc,KAAK,GAAG,KAAK,KAAK,OAAO,QAAQ,QAAQ,UAAU,CAAC,MAAM,IAAI,EAAE,QAAQ,IAAI,EAAE,OAAO,OAAO,GAAG,GAAG,EAAE,CAAC,GAAG,WAAU,iEAAgE;AAAA,WAClO;AAAA,QACA,gBAAAC,OAAC,WAAM,WAAU,2BACf;AAAA,0BAAAD,MAAC,WAAM,MAAK,YAAW,cAAW,aAAY,SAAS,QAAQ,OAAO,UAAU,CAAC,MAAM,IAAI,EAAE,OAAO,EAAE,OAAO,QAAQ,CAAC,GAAG;AAAA,UAAE;AAAA,WAE7H;AAAA,SACF;AAAA,OAEJ;AAAA,IACA,gBAAAA,MAAC,OAAE,WAAU,8BAA6B,oGAAmF;AAAA,IAC5H,SACC,gBAAAA,MAAC,OAAE,MAAK,SAAQ,WAAU,iBACvB,iBACH;AAAA,KAEJ;AAEJ;;;AC1IA,SAAgB,aAAAG,aAAW,YAAAC,kBAAgB;AAE3C,SAAS,mBAAmB;AA4DpB,SAEE,OAAAC,OAFF,QAAAC,cAAA;AAjDR,IAAMC,QAAO,CAAC,OAAgB,iCAAiC,KAAK,6BAA6B,8CAA8C;AAC/I,IAAM,eAA0C,EAAE,MAAM,QAAQ,QAAQ,UAAU,OAAO,SAAS,SAAS,UAAU;AAO9G,IAAM,iBAAgD,CAAC,EAAE,YAAY,SAAS,UAAU,SAAS,UAAU,MAAM;AACtH,QAAM,CAAC,EAAE,OAAO,IAAIH,WAAS,CAAC;AAC9B,EAAAD,YAAU,MAAM,WAAW,UAAU,MAAM,QAAQ,CAAC,MAAM,IAAI,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC;AAC/E,EAAAA,YAAU,MAAM,SAAS,UAAU,MAAM,QAAQ,CAAC,MAAM,IAAI,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC;AAC1E,QAAM,CAAC,OAAO,QAAQ,IAAIC,WAAwB,IAAI;AACtD,QAAM,SAAS,WAAW,eAAe;AACzC,QAAM,SAAS,CAAC,WAAW,QAAQ,SAAS,SAAS,OAAO,KAAK;AACjE,QAAM,OAA2B,SAAS,QAAQ,QAAQ,UAAU,IAAI,CAAC;AACzE,QAAM,QAAyB;AAAA,IAC7B,GAAG;AAAA,IACH,GAAI,KAAK,aAAa,EAAE,YAAY,KAAK,WAAW,IAAI,CAAC;AAAA,IACzD,GAAI,KAAK,WAAW,EAAE,UAAU,KAAK,SAAS,IAAI,CAAC;AAAA,IACnD,GAAI,KAAK,aAAa,EAAE,YAAY,KAAK,WAAW,IAAI,CAAC;AAAA,IACzD,GAAI,SAAS,QAAQ,EAAE,QAAQ,QAAQ,KAAK,MAAM,GAAG,OAAO,KAAK,SAAS,QAAQ,MAAM,IAAI,CAAC;AAAA,EAC/F;AACA,QAAM,QAAQ,WAAW,UAAU;AACnC,QAAM,UAAU,QAAQ,SAAS,SAAS,OAAO,gBAAgB,CAAC,IAAI,CAAC;AAEvE,QAAM,QAAQ,CAAC,WAAqC;AAClD,aAAS,EAAE,GAAG,SAAS,GAAG,OAAO,CAAC;AAClC,UAAM,IAA6B,CAAC;AACpC,eAAW,KAAK,CAAC,cAAc,YAAY,cAAc,UAAU,OAAO,EAAY,KAAI,KAAK,OAAQ,GAAE,CAAC,IAAI,OAAO,CAAC;AACtH,UAAM,IAAI,OAAO,QAAQ,EAAE,OAAO,OAAO,MAAM,IAAI;AACnD,QAAI;AACF,eAAS,IAAI;AACb,UAAI,SAAS,OAAO;AAClB,YAAI,OAAO,KAAK,CAAC,EAAE,OAAQ,SAAQ,SAAS,CAAuB;AACnE,YAAI,EAAG,SAAQ,aAAa,CAAC;AAC7B,YAAI,QAAQ,MAAO,UAAS,QAAQ,KAAK;AAAA,MAC3C,WAAW,QAAQ;AACjB,YAAI,OAAO,KAAK,CAAC,EAAE,OAAQ,YAAW,aAAa,QAAQ,CAAC;AAC5D,YAAI,EAAG,YAAW,kBAAkB,QAAQ,CAAC;AAAA,MAC/C;AAAA,IACF,SAAS,GAAG;AACV,eAAS,aAAa,QAAQ,EAAE,UAAU,OAAO,CAAC,CAAC;AAAA,IACrD;AAAA,EACF;AAEA,SACE,gBAAAE,OAAC,SAAI,WAAW,8CAA8C,aAAa,EAAE,IAAI,eAAY,gBAC3F;AAAA,oBAAAA,OAAC,SAAI,WAAU,qCACb;AAAA,sBAAAA,OAAC,WAAM,WAAU,2BAA0B;AAAA;AAAA,QAEzC,gBAAAD;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,cAAW;AAAA,YACX,OAAO,MAAM;AAAA,YACb,UAAU,CAAC,MAAM,EAAE,OAAO,MAAM,KAAK,KAAK,MAAM,EAAE,YAAY,EAAE,OAAO,MAAM,CAAC;AAAA,YAC9E,WAAU;AAAA;AAAA,QACZ;AAAA,QACA,gBAAAA,MAAC,cAAS,IAAG,uBACV,gBAAM,IAAI,CAAC,MACV,gBAAAA,MAAC,YAAe,OAAO,KAAV,CAAa,CAC3B,GACH;AAAA,SACF;AAAA,MACA,gBAAAC,OAAC,WAAM,WAAU,2BAA0B;AAAA;AAAA,QAEzC,gBAAAD;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,cAAW;AAAA,YACX,KAAK;AAAA,YACL,KAAK;AAAA,YACL,OAAO,KAAK,MAAM,MAAM,WAAW,EAAE,IAAI;AAAA,YACzC,UAAU,CAAC,MAAM,OAAO,EAAE,OAAO,KAAK,IAAI,KAAK,MAAM,EAAE,UAAU,OAAO,EAAE,OAAO,KAAK,EAAE,CAAC;AAAA,YACzF,WAAU;AAAA;AAAA,QACZ;AAAA,SACF;AAAA,MACA,gBAAAA,MAAC,YAAO,MAAK,UAAS,gBAAc,MAAM,cAAc,KAAK,WAAW,GAAGE,MAAK,MAAM,cAAc,GAAG,CAAC,cAAc,SAAS,MAAM,MAAM,EAAE,YAAY,MAAM,cAAc,MAAM,MAAM,IAAI,CAAC,GAAG,eAEjM;AAAA,MACA,gBAAAF,MAAC,YAAO,MAAK,UAAS,gBAAc,MAAM,QAAQ,WAAW,GAAGE,MAAK,MAAM,MAAM,CAAC,WAAW,SAAS,MAAM,MAAM,EAAE,QAAQ,CAAC,MAAM,OAAO,CAAC,GAAG,eAE9I;AAAA,MACA,gBAAAF,MAAC,WAAM,MAAK,SAAQ,cAAW,eAAc,OAAO,MAAM,OAAO,UAAU,CAAC,MAAM,MAAM,EAAE,OAAO,EAAE,OAAO,MAAM,CAAC,GAAG,WAAU,0DAAyD;AAAA,OACzL;AAAA,IACA,gBAAAA,MAAC,SAAI,WAAU,cAAa,MAAK,WAAU,cAAW,aACnD,sBAAY,IAAI,CAAC,MAChB,gBAAAA,MAAC,YAAe,MAAK,UAAS,gBAAc,QAAQ,UAAU,GAAG,WAAWE,MAAK,QAAQ,UAAU,CAAC,GAAG,SAAS,MAAM,MAAM,EAAE,OAAO,EAAE,CAAC,GACrI,uBAAa,CAAC,KADJ,CAEb,CACD,GACH;AAAA,IACA,gBAAAF,MAAC,OAAE,WAAU,8BAA6B,sGAAwF;AAAA,IACjI,QAAQ,SAAS,KAChB,gBAAAC,OAAC,OAAE,MAAK,UAAS,WAAU,kBAAiB,eAAY,sBAAqB;AAAA;AAAA,MAClE,QAAQ,WAAW,IAAI,SAAS;AAAA,MAAQ;AAAA,MAAG,QAAQ,KAAK,IAAI;AAAA,OACvE;AAAA,IAED,SACC,gBAAAD,MAAC,OAAE,MAAK,SAAQ,WAAU,iBACvB,iBACH;AAAA,KAEJ;AAEJ;;;AfwyBU,SAqnBM,YAAAG,WArnBN,OAAAC,OAoFA,QAAAC,cApFA;AAn1BH,IAAM,cAA0C,CAAC;AAAA,EACtD,QAAQ;AAAA,EACR;AAAA,EACA,YAAY;AAAA,EACZ;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,QAAM,iBAAiB,eAAe,EAAE,OAAO,IAAI,CAAC;AACpD,QAAM,SAAS,kBAAkB;AACjC,QAAM,EAAE,OAAO,WAAW,IAAI;AAC9B,aAAW,YAAY,OAAO;AAC9B,QAAM,eAAe,CAAC,CAAC,WAAW,mBAAmB,MAAM,OAAO,KAAK,SAAS,IAAI,GAAY;AAC9F,WAAQ,EAAE,SAAS,WAAW,CAAC,CAAC,EAAE,aAAe,EAAE,SAAS,WAAW,CAAC,CAAC,EAAE,cAAc,QAAQ,KAAK,CAAC,MAAM,EAAE,SAAS,QAAQ,KAAO,EAAE,SAAS,WAAW,EAAE,SAAS,KAAK,GAAG;AAAA,EAClL,CAAC;AACD,QAAM,gBAAgB,wBAAwB,MAAM,YAAY,OAAO,IAAI;AAE3E,QAAM,YAAYC,QAA0B,IAAI;AAChD,QAAM,eAAeA,QAAuB,IAAI;AAChD,QAAM,CAAC,WAAW,YAAY,IAAIC,WAAkB,MAAM;AAC1D,QAAM,CAAC,iBAAiB,kBAAkB,IAAIA,WAAwB,IAAI;AAG1E,QAAM,CAAC,kBAAkB,mBAAmB,IAAIA,WAA+B,8BAA8B;AAC7G,QAAM,sBAAsBD,QAAO,gBAAgB;AACnD,sBAAoB,UAAU;AAC9B,QAAM,sBAAsBA,QAAgC,IAAI;AAChE,MAAI,CAAC,oBAAoB,WAAW,oBAAoB,QAAQ,eAAe,YAAY;AACzF,wBAAoB,UAAU,IAAI,iBAAiB,YAAY,MAAM,oBAAoB,OAAO;AAAA,EAClG;AACA,QAAM,oBAAoBA,QAA4B,IAAI;AAC1D,QAAM,CAAC,gBAAgB,iBAAiB,IAAIC,WAAwB,IAAI;AAGxE,QAAM,kBAAkBD,QAA4B,IAAI;AACxD,QAAM,qBAAqBA,QAAO,UAAU;AAC5C,MAAI,CAAC,gBAAgB,WAAW,mBAAmB,YAAY,YAAY;AACzE,oBAAgB,UAAU,IAAI,aAAa,UAAU;AACrD,uBAAmB,UAAU;AAAA,EAC/B;AACA,QAAM,iBAAiBA,QAA0B,IAAI;AACrD,QAAM,CAAC,YAAY,aAAa,IAAIC,WAAwB,IAAI;AAGhE,QAAM,mBAAmBD,QAAiC,IAAI;AAC9D,QAAM,yBAAyBA,QAAO,UAAU;AAChD,MAAI,CAAC,iBAAiB,WAAW,uBAAuB,YAAY,YAAY;AAC9E,qBAAiB,SAAS,OAAO;AACjC,qBAAiB,UAAU,IAAI,kBAAkB,YAAY;AAAA,MAC3D,UAAU,CAAC,QAAS,OAAO,0BAA0B,cAAc,sBAAsB,GAAG,IAAI,IAAI;AAAA,IACtG,CAAC;AACD,2BAAuB,UAAU;AAAA,EACnC;AACA,QAAM,gBAAgB,iBAAiB;AACvC,QAAM,CAAC,EAAE,gBAAgB,IAAIC,WAAS,CAAC;AACvC,QAAM,CAAC,iBAAiB,kBAAkB,IAAIA,WAAS,SAAS;AAGhE,QAAM,CAAC,cAAc,eAAe,IAAIA,WAA2B,0BAA0B;AAC7F,QAAM,kBAAkBD,QAAO,YAAY;AAC3C,kBAAgB,UAAU;AAC1B,QAAM,CAAC,aAAa,cAAc,IAAIC,WAA0B,yBAAyB;AACzF,QAAM,iBAAiBD,QAAO,WAAW;AACzC,iBAAe,UAAU;AACzB,QAAM,kBAAkBA,QAAgC,IAAI;AAC5D,QAAM,cAAcA,QAA+B,IAAI;AACvD,QAAM,yBAAyBA,QAAO,UAAU;AAChD,MAAI,CAAC,gBAAgB,WAAW,CAAC,YAAY,WAAW,uBAAuB,YAAY,YAAY;AACrG,gBAAY,SAAS,OAAO;AAC5B,oBAAgB,UAAU,IAAI,iBAAiB,YAAY,MAAM,gBAAgB,OAAO;AACxF,gBAAY,UAAU,IAAI,gBAAgB,YAAY,MAAM,eAAe,OAAO;AAClF,2BAAuB,UAAU;AAAA,EACnC;AACA,QAAM,eAAeA,QAA4B,IAAI;AACrD,QAAM,CAAC,aAAa,cAAc,IAAIC,WAAS,YAAY,QAAQ,OAAO;AAC1E,QAAM,CAAC,gBAAgB,iBAAiB,IAAIA,WAAwB,IAAI;AAGxE,QAAM,CAAC,eAAe,gBAAgB,IAAIA,WAAS,EAAE;AACrD,QAAM,CAAC,iBAAiB,kBAAkB,IAAIA,WAAiC,aAAa;AAC5F,QAAM,CAAC,cAAc,eAAe,IAAIA,WAAS,KAAK;AACtD,QAAM,CAAC,cAAc,eAAe,IAAIA,WAAS,KAAK;AACtD,QAAM,CAAC,SAAS,UAAU,IAAIA,WAAwB,IAAI;AAC1D,QAAM,CAAC,WAAW,YAAY,IAAIA,WAAwB,IAAI;AAE9D,QAAM,CAAC,UAAU,WAAW,IAAIA,WAA2C,MAAM;AACjF,QAAM,YAAY,aAAa,SAAS,CAAC,IAAI,EAAE,QAAQ,SAAS;AAEhE,QAAM,qBAAqB,aAAa,SAAS;AACjD,QAAM,sBAAsB,sBAAsB,SAAS;AAE3D,QAAM,yBAAyB,YAAY;AACzC,QAAI,CAAC,qBAAqB;AACxB,iBAAW,2CAA2C;AACtD;AAAA,IACF;AACA,eAAW,IAAI;AACf,iBAAa,IAAI;AACjB,oBAAgB,IAAI;AACpB,QAAI;AAGF,YAAM,eAAe,MAAM,WAAW,iBAAiB,SAAS;AAChE,YAAM,SAAS,MAAM,oBAAoB,EAAE,aAAa,CAAC;AACzD,UAAI,OAAO,WAAW,UAAU;AAC9B,cAAM,OAAO,4BAA4B,QAAQ,SAAS;AAC1D,qBAAa,kCAAkC;AAAA,MACjD,OAAO;AACL,qBAAa,8BAA8B;AAAA,MAC7C;AAAA,IACF,SAAS,KAAU;AACjB,iBAAW,KAAK,WAAW,8BAA8B;AAAA,IAC3D,UAAE;AACA,sBAAgB,KAAK;AAAA,IACvB;AAAA,EACF;AAEA,QAAM,gBAAgB,YAAY;AAChC,QAAI,CAAC,oBAAoB;AACvB,iBAAW,mCAAmC;AAC9C;AAAA,IACF;AACA,QAAI,CAAC,cAAc,KAAK,GAAG;AACzB,iBAAW,oCAAoC;AAC/C;AAAA,IACF;AACA,eAAW,IAAI;AACf,iBAAa,IAAI;AACjB,oBAAgB,IAAI;AACpB,QAAI;AAEF,YAAM,eAAe,MAAM,WAAW,iBAAiB,SAAS;AAChE,YAAM,cAAc,MAAM,OAAO,cAAc;AAAA,QAC7C,gBAAgB,oBAAoB;AAAA,QACpC,SAAS,oBAAoB;AAAA,MAC/B,CAAC;AACD,YAAM,SAAS,MAAM,mBAAmB;AAAA,QACtC,QAAQ,cAAc,KAAK;AAAA,QAC3B;AAAA,QACA;AAAA,QACA,SAAS,oBAAoB,SAAS,OAAO,MAAM,OAAO;AAAA,MAC5D,CAAC;AACD,UAAI,OAAO,WAAW,UAAU;AAC9B,cAAM,OAAO,oBAAoB,QAAQ,SAAS;AAClD,qBAAa,kCAAkC;AAAA,MACjD,OAAO;AACL,qBAAa,sBAAsB;AAAA,MACrC;AAAA,IACF,SAAS,KAAU;AACjB,iBAAW,KAAK,WAAW,6BAA6B;AAAA,IAC1D,UAAE;AACA,sBAAgB,KAAK;AAAA,IACvB;AAAA,EACF;AAGA,QAAM,CAAC,aAAa,cAAc,IAAIA,WAAS,SAAS;AACxD,QAAM,CAAC,aAAa,cAAc,IAAIA,WAAS,CAAC;AAChD,QAAM,CAAC,UAAU,WAAW,IAAIA,WAAS,EAAE;AAC3C,QAAM,CAAC,WAAW,YAAY,IAAIA,WAAS,EAAE;AAG7C,QAAM,qBAAqBD,QAA0B,IAAI;AACzD,QAAM,eAAeA,QAAuB,IAAI;AAChD,QAAM,kBAAkBA,QAKd,IAAI;AACd,QAAM,wBAAwBA,QAIpB,IAAI;AACd,QAAM,eAAeA,QAAO,KAAK;AACjC,QAAM,iBAAiBA,QAAqB,CAAC,CAAC;AAC9C,QAAM,oBAAoBA,QAA0B,IAAI;AAGxD,QAAM,eAAeE;AAAA,IACnB,OAAO,iBAAqC,cAA+B;AACzE,YAAM,SAAS,UAAU;AACzB,YAAM,YAAY,aAAa;AAC/B,UAAI,CAAC,UAAU,CAAC,UAAW;AAE3B,YAAM,UAAU,UAAU,eAAe;AACzC,YAAM,WAAW,UAAU,gBAAgB;AAE3C,YAAM,WAAW,OAAO,QAAQ;AAAA,QAC9B,eAAe;AAAA,QACf,gBAAgB;AAAA,QAChB,iBAAiB,cAAc;AAAA,QAC/B,sBAAsB;AAAA,QACtB,aAAa;AAAA,QACb,iBAAiB,oBAAoB,SAAY,kBAAkB,mBAAmB;AAAA,QACtF,WAAW,cAAc,SAAY,YAAY,aAAa;AAAA,QAC9D,oBAAoB,kBAAkB;AAAA,QACtC,aACE,cAAc,WAAW,eAAe,WAAW,WAAW,SAAS,EAAE,eAAe,UAAU,CAAC,cAAc,SAC7G,EAAE,GAAG,eAAe,SAAS,UAAU,WAAW,SAAS,EAAE,MAAM,MAAM,KAAK,IAC9E;AAAA,QACN,eAAe,cAAc,QAAQ;AAAA,QACrC,UAAU,YAAY,SAAS,SAAS,QAAQ,YAAY,QAAQ,QAAQ,QAAQ,IAAI;AAAA,MAC1F,CAAC;AAAA,IACH;AAAA,IACA,CAAC,YAAY,WAAW,aAAa;AAAA,EACvC;AAGA,EAAAC,YAAU,MAAM,aAAa,UAAU,MAAM,KAAK,aAAa,CAAC,GAAG,CAAC,aAAa,YAAY,CAAC;AAC9F,EAAAA,YAAU,MAAM;AACd,QAAI,cAAc,cAAc,MAAM,eAAe,OAAQ;AAC7D,QAAI,YAAY,SAAS,SAAS;AAChC,kBAAY,QAAQ,OAAO;AAC3B,qBAAe,IAAI;AACnB,WAAK,aAAa;AAAA,IACpB;AAAA,EACF,GAAG,CAAC,WAAW,MAAM,YAAY,YAAY,CAAC;AAC9C,QAAM,eAAe,MAAM;AACzB,gBAAY,SAAS,OAAO;AAC5B,mBAAe,IAAI;AACnB,SAAK,aAAa;AAAA,EACpB;AACA,QAAM,oBAAoB,CAAC,MAAgD;AACzE,UAAM,UAAU,YAAY,SAAS;AACrC,QAAI,CAAC,WAAW,EAAE,YAAY,YAAa;AAC3C,QAAI,EAAE,QAAQ,UAAU;AACtB,QAAE,eAAe;AACjB,mBAAa;AACb;AAAA,IACF;AACA,SAAK,EAAE,WAAW,EAAE,YAAY,CAAC,KAAK,KAAK,KAAK,KAAK,GAAG,EAAE,SAAS,EAAE,IAAI,YAAY,CAAC,EAAG;AACzF,QAAI,QAAQ,UAAU,CAAC,GAAG;AACxB,QAAE,eAAe;AACjB,wBAAkB,QAAQ,KAAK;AAAA,IACjC;AAAA,EACF;AACA,QAAM,kBAAkB,CAAC,MAA4C;AAEnE,UAAM,KAAK,EAAE;AACb,UAAM,UAAU,YAAY,SAAS;AACrC,QAAI,WAAW,GAAG,SAAS,CAAE,EAAE,YAA2B,aAAa;AACrE,cAAQ,OAAO,GAAG,KAAK;AACvB,SAAG,QAAQ;AAAA,IACb;AAAA,EACF;AAEA,EAAAA,YAAU,MAAM,cAAc,UAAU,MAAM;AAC5C,qBAAiB,CAAC,MAAM,IAAI,CAAC;AAC7B,SAAK,aAAa;AAAA,EACpB,CAAC,GAAG,CAAC,eAAe,YAAY,CAAC;AAGjC,QAAM,iBAAiB,CAAC,MAA6C;AACnE,UAAM,SAAS,UAAU;AACzB,UAAM,OAAO,OAAO,sBAAsB;AAC1C,UAAM,KAAK,KAAK,QAAQ,IAAI,OAAO,QAAQ,KAAK,QAAQ;AACxD,UAAM,KAAK,KAAK,SAAS,IAAI,OAAO,SAAS,KAAK,SAAS;AAC3D,UAAM,IAAI,WAAW,SAAS;AAC9B,UAAM,WAAW,cAAc;AAC/B,UAAM,aAAa,sBAAsB,GAAG,OAAO,OAAO,OAAO,QAAQ,QAAQ;AACjF,UAAM,KAAK,mBAAmB,EAAE,IAAI,EAAE,UAAU,KAAK,QAAQ,IAAI,IAAI,EAAE,UAAU,KAAK,OAAO,GAAG,GAAG,GAAG,OAAO,OAAO,OAAO,QAAQ,QAAQ;AAC3I,kBAAc,QAAQ,WAAW,KAAK;AACtC,WAAO,EAAE,IAAI,WAAW,KAAK,WAAW,SAAS,GAAG;AAAA,EACtD;AACA,QAAM,6BAA6B,CAAC,MAAsD;AACxF,QAAI,CAAC,cAAc,OAAQ,QAAO;AAClC,QAAI,EAAE,WAAW,EAAG,QAAO;AAC3B,MAAE,eAAe;AACjB,QAAI;AACF,QAAE,cAAc,oBAAoB,EAAE,SAAS;AAAA,IACjD,QAAQ;AAAA,IAER;AACA,UAAM,EAAE,IAAI,UAAU,IAAI,eAAe,CAAC;AAC1C,kBAAc,KAAK,IAAI,SAAS;AAChC,WAAO;AAAA,EACT;AACA,QAAM,6BAA6B,CAAC,MAAsD;AACxF,QAAI,CAAC,cAAc,OAAQ,QAAO;AAClC,UAAM,EAAE,IAAI,UAAU,IAAI,eAAe,CAAC;AAC1C,QAAI,EAAE,UAAU,EAAG,eAAc,KAAK,IAAI,CAAC;AAAA,SACtC;AACH,YAAM,OAA+B,cAAc,IAAI,IAAI,SAAS;AACpE,yBAAmB,cAAc,OAAO,IAAI,CAAC;AAAA,IAC/C;AACA,WAAO;AAAA,EACT;AACA,QAAM,2BAA2B,MAAe;AAC9C,QAAI,CAAC,cAAc,OAAQ,QAAO;AAClC,kBAAc,GAAG;AACjB,WAAO;AAAA,EACT;AAEA,EAAAA,YAAU,MAAM;AACd,QAAI,OAAO,WAAW,YAAa;AACnC,UAAM,QAAQ,CAAC,MAAqB;AAClC,UAAI,cAAc,IAAI,CAAC,EAAG,GAAE,eAAe;AAAA,IAC7C;AACA,WAAO,iBAAiB,WAAW,KAAK;AACxC,WAAO,MAAM,OAAO,oBAAoB,WAAW,KAAK;AAAA,EAC1D,GAAG,CAAC,aAAa,CAAC;AAGlB,EAAAA,YAAU,MAAM;AACd,UAAM,MACJ,OAAO,0BAA0B,cAC7B,wBACA,CAAC,OAAmB,WAAW,IAAI,CAAC;AAC1C,UAAM,MACJ,OAAO,yBAAyB,cAC5B,uBACA,CAAC,OAAe,aAAa,EAAE;AAErC,UAAM,SAAS,IAAI,MAAM;AACvB,mBAAa;AAAA,IACf,CAAC;AACD,WAAO,MAAM,IAAI,MAAM;AAAA,EACzB,GAAG,CAAC,cAAc,KAAK,CAAC;AAGxB,EAAAA,YAAU,MAAM;AACd,QAAI,cAAc,UAAU,OAAO,MAAM,eAAe,QAAQ;AAC9D,aAAO,QAAQ,MAAM;AAAA,IACvB;AAAA,EACF,GAAG,CAAC,WAAW,MAAM,CAAC;AAGtB,EAAAA,YAAU,MAAM;AACd,UAAM,YAAY,aAAa;AAC/B,QAAI,CAAC,UAAW;AAEhB,QAAI,OAAO,mBAAmB,aAAa;AACzC,YAAM,WAAW,IAAI,eAAe,MAAM;AACxC,qBAAa;AAAA,MACf,CAAC;AACD,eAAS,QAAQ,SAAS;AAC1B,aAAO,MAAM,SAAS,WAAW;AAAA,IACnC,OAAO;AACL,YAAM,eAAe,MAAM,aAAa;AACxC,aAAO,iBAAiB,UAAU,YAAY;AAC9C,aAAO,MAAM,OAAO,oBAAoB,UAAU,YAAY;AAAA,IAChE;AAAA,EACF,GAAG,CAAC,YAAY,CAAC;AAGjB,QAAM,sBAAsB,CAAC,MAAuD;AAClF,UAAM,SAAS,UAAU;AACzB,QAAI,CAAC,OAAQ,QAAO,EAAE,GAAG,GAAG,GAAG,EAAE;AACjC,UAAM,OAAO,OAAO,sBAAsB;AAC1C,UAAM,SAAS,KAAK,QAAQ,IAAI,OAAO,QAAQ,KAAK,QAAQ;AAC5D,UAAM,SAAS,KAAK,SAAS,IAAI,OAAO,SAAS,KAAK,SAAS;AAC/D,WAAO;AAAA,MACL,IAAI,EAAE,UAAU,KAAK,QAAQ;AAAA,MAC7B,IAAI,EAAE,UAAU,KAAK,OAAO;AAAA,IAC9B;AAAA,EACF;AAGA,QAAM,eAAe,CAAC,MAA6C;AACjE,UAAM,SAAS,UAAU;AACzB,UAAM,SAAS,EAAE;AACjB,UAAM,SAAS,OAAO,OAAO,uBAAuB,aAAa,OAAO,mBAAmB,IAAI,CAAC;AAChG,UAAM,OAAO,OAAO,SAAS,SAAS,CAAC,MAAM;AAC7C,UAAM,OAAO,OAAO,sBAAsB;AAC1C,UAAM,KAAK,KAAK,QAAQ,IAAI,OAAO,QAAQ,KAAK,QAAQ;AACxD,UAAM,KAAK,KAAK,SAAS,IAAI,OAAO,SAAS,KAAK,SAAS;AAC3D,UAAM,IAAI,WAAW,SAAS;AAC9B,WAAO,KAAK,IAAI,CAAC,QAAQ;AAAA,MACvB,GAAG,mBAAmB,EAAE,IAAI,GAAG,UAAU,KAAK,QAAQ,IAAI,IAAI,GAAG,UAAU,KAAK,OAAO,GAAG,GAAG,GAAG,OAAO,OAAO,OAAO,QAAQ,KAAK;AAAA,MAClI,UAAU,gBAAgB,EAAE;AAAA,IAC9B,EAAE;AAAA,EACJ;AACA,QAAM,yBAAyB,CAAC,MAA6C;AAC3E,QAAI,2BAA2B,CAAC,EAAG;AACnC,QAAI,cAAc,WAAW,EAAE,WAAW,EAAG;AAC7C,MAAE,eAAe;AACjB,QAAI;AACF,QAAE,cAAc,oBAAoB,EAAE,SAAS;AAAA,IACjD,QAAQ;AAAA,IAER;AACA,UAAM,CAAC,KAAK,IAAI,aAAa,CAAC;AAC9B,kBAAc,gBAAgB,QAAS,KAAK,EAAE,GAAG,OAAO,QAAQ,EAAE,OAAO,CAAC,CAAC;AAAA,EAC7E;AACA,QAAM,yBAAyB,CAAC,MAA6C;AAC3E,QAAI,2BAA2B,CAAC,EAAG;AACnC,QAAI,cAAc,QAAS;AAC3B,UAAM,UAAU,aAAa,CAAC;AAC9B,mBAAe,UAAU,QAAQ,QAAQ,SAAS,CAAC,KAAK;AACxD,QAAI,gBAAgB,QAAS,OAAQ,iBAAgB,QAAS,OAAO,OAAO;AAAA,QACvE,MAAK,aAAa;AAAA,EACzB;AACA,QAAM,uBAAuB,MAAM;AACjC,QAAI,yBAAyB,EAAG;AAChC,QAAI,cAAc,QAAS;AAC3B,UAAM,IAAI,gBAAgB;AAC1B,QAAI,EAAE,QAAQ;AACZ,QAAE,GAAG;AACL,UAAI,EAAE,MAAO,eAAc,EAAE,KAAK;AAAA,IACpC;AAAA,EACF;AAEA,EAAAA,YAAU,MAAM;AACd,QAAI,cAAc,WAAW,OAAO,WAAW,YAAa;AAC5D,UAAM,QAAQ,CAAC,MAAqB;AAClC,UAAI,oBAAoB,YAAY,CAAC,EAAG,GAAE,eAAe;AAAA,IAC3D;AACA,WAAO,iBAAiB,WAAW,KAAK;AACxC,WAAO,MAAM,OAAO,oBAAoB,WAAW,KAAK;AAAA,EAC1D,GAAG,CAAC,WAAW,UAAU,CAAC;AAG1B,QAAM,kBAAkB,CAAC,MAA2C;AAClE,UAAM,SAAS,UAAU;AACzB,QAAI,CAAC,UAAU,cAAc,OAAQ;AACrC,UAAM,WAAW,oBAAoB,CAAC;AAEtC,QAAI,cAAc,UAAU;AAC1B,YAAM,UAAU,oBAAoB;AACpC,YAAM,QAAQ,mBAAmB,UAAU,OAAO,OAAO,OAAO,OAAO,QAAQ,KAAK;AACpF,WAAK,QAAQ,MAAM,OAAO,CAAC,EAAE,KAAK,MAAM,kBAAkB,QAAQ,KAAK,CAAC;AACxE;AAAA,IACF;AAEA,QAAI,cAAc,QAAQ;AACxB,YAAM,aAAa,aAAa,WAAW,MAAM,QAAQ;AAAA,QACvD,GAAG;AAAA,QACH,GAAG;AAAA,QACH,OAAO,MAAM,gBAAgB;AAAA,QAC7B,QAAQ,MAAM,gBAAgB;AAAA,MAChC;AACA,YAAM,SAAS,YAAY,UAAU,OAAO,OAAO,OAAO,OAAO,QAAQ,IAAI,UAAU;AACvF,YAAM,aAAa,mBAAmB,UAAU,OAAO,OAAO,OAAO,OAAO,QAAQ,IAAI;AAExF,UAAI,QAAQ;AACV,wBAAgB,UAAU;AAAA,UACxB;AAAA,UACA,eAAe;AAAA,UACf;AAAA,UACA,WAAW;AAAA,QACb;AAAA,MACF,OAAO;AAEL,wBAAgB,UAAU;AAAA,UACxB,QAAQ;AAAA,UACR,eAAe;AAAA,UACf;AAAA,UACA,WAAW,EAAE,GAAG,WAAW,GAAG,GAAG,WAAW,GAAG,OAAO,GAAG,QAAQ,EAAE;AAAA,QACrE;AAAA,MACF;AACA;AAAA,IACF;AAEA,QAAI,cAAc,eAAe,MAAM,eAAe,WAAW,MAAM,eAAe,SAAS;AAC7F,YAAM,QAAQ,mBAAmB,UAAU,OAAO,OAAO,OAAO,OAAO,QAAQ,KAAK;AACpF,wBAAkB,IAAI;AACtB,UAAI,MAAM,eAAe,QAAS,iBAAgB,QAAS,KAAK,KAAK;AAAA,WAChE;AACH,oBAAY,QAAS,KAAK,OAAO,EAAE,OAAO,EAAE,SAAS,CAAC;AACtD,uBAAe,YAAY,QAAS,OAAO;AAC3C,aAAK,aAAa;AAAA,MACpB;AACA;AAAA,IACF;AAEA,QAAI,cAAc,YAAY;AAC5B,YAAM,QAAQ,mBAAmB,UAAU,OAAO,OAAO,OAAO,OAAO,QAAQ,KAAK;AACpF,wBAAkB,UAAU;AAE5B,UAAI,MAAM,eAAe,UAAU;AACjC,iBAAS,IAAI,MAAM,YAAY,SAAS,GAAG,KAAK,GAAG,KAAK;AACtD,gBAAM,MAAM,MAAM,YAAY,CAAC;AAC/B,cAAI,kBAAkB,OAAO,GAAG,GAAG;AACjC,mBAAO,iBAAiB,IAAI,EAAE;AAC9B,kCAAsB,UAAU;AAAA,cAC9B,OAAO,IAAI;AAAA,cACX,YAAY;AAAA,cACZ,YAAY,EAAE,GAAG,IAAI;AAAA,YACvB;AACA;AAAA,UACF;AAAA,QACF;AACA,eAAO,iBAAiB,IAAI;AAC5B;AAAA,MACF;AAEA,UAAI,MAAM,eAAe,OAAO;AAC9B,qBAAa,UAAU;AACvB,uBAAe,UAAU,CAAC,KAAK;AAC/B,cAAM,QAAoB;AAAA,UACxB,IAAI;AAAA,UACJ,MAAM;AAAA,UACN,GAAG;AAAA,UACH,GAAG;AAAA,UACH,QAAQ,CAAC,KAAK;AAAA,UACd,aAAa;AAAA,UACb;AAAA,QACF;AACA,2BAAmB,UAAU;AAC7B,qBAAa,KAAK;AAAA,MACpB;AAAA,IACF;AAAA,EACF;AAEA,QAAM,kBAAkB,CAAC,MAA2C;AAClE,UAAM,SAAS,UAAU;AACzB,QAAI,CAAC,UAAU,cAAc,OAAQ;AACrC,UAAM,WAAW,oBAAoB,CAAC;AAEtC,QAAI,cAAc,UAAU;AAC1B,YAAM,UAAU,oBAAoB;AACpC,UAAI,QAAQ,UAAU,QAAQ,KAAK,mBAAmB,UAAU,OAAO,OAAO,OAAO,OAAO,QAAQ,KAAK,CAAC,GAAG;AAC3G,0BAAkB,UAAU,QAAQ;AACpC,qBAAa;AAAA,MACf;AACA;AAAA,IACF;AAEA,QAAI,cAAc,QAAQ;AACxB,YAAM,OAAO,gBAAgB;AAC7B,UAAI,MAAM;AACR,cAAM,eAAe,mBAAmB,UAAU,OAAO,OAAO,OAAO,OAAO,QAAQ,IAAI;AAC1F,YAAI;AAEJ,YAAI,KAAK,WAAW,OAAO;AACzB,gBAAM,OAAO,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,WAAW,GAAG,aAAa,CAAC,CAAC;AACpE,gBAAM,OAAO,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,WAAW,GAAG,aAAa,CAAC,CAAC;AACpE,gBAAM,OAAO,KAAK,IAAI,MAAM,gBAAgB,OAAO,KAAK,IAAI,KAAK,WAAW,GAAG,aAAa,CAAC,CAAC;AAC9F,gBAAM,OAAO,KAAK,IAAI,MAAM,gBAAgB,QAAQ,KAAK,IAAI,KAAK,WAAW,GAAG,aAAa,CAAC,CAAC;AAC/F,oBAAU;AAAA,YACR,GAAG,KAAK,MAAM,IAAI;AAAA,YAClB,GAAG,KAAK,MAAM,IAAI;AAAA,YAClB,OAAO,KAAK,MAAM,KAAK,IAAI,IAAI,OAAO,IAAI,CAAC;AAAA,YAC3C,QAAQ,KAAK,MAAM,KAAK,IAAI,IAAI,OAAO,IAAI,CAAC;AAAA,UAC9C;AAAA,QACF,OAAO;AACL,oBAAU;AAAA,YACR,KAAK;AAAA,YACL,KAAK;AAAA,YACL,KAAK;AAAA,YACL;AAAA,YACA,MAAM,gBAAgB;AAAA,YACtB,MAAM,gBAAgB;AAAA,YACtB;AAAA,YACA,MAAM;AAAA,UACR;AAAA,QACF;AAEA,qBAAa,UAAU;AACvB,qBAAa,MAAM,OAAO;AAAA,MAC5B,OAAO;AACL,cAAM,aAAa,aAAa,WAAW,MAAM,QAAQ;AAAA,UACvD,GAAG;AAAA,UACH,GAAG;AAAA,UACH,OAAO,MAAM,gBAAgB;AAAA,UAC7B,QAAQ,MAAM,gBAAgB;AAAA,QAChC;AACA,cAAM,SAAS,YAAY,UAAU,OAAO,OAAO,OAAO,OAAO,QAAQ,IAAI,UAAU;AACvF,eAAO,MAAM,SAAS,cAAc,QAAQ,MAAM,SAAS;AAAA,MAC7D;AACA;AAAA,IACF;AAEA,QAAI,cAAc,cAAc,MAAM,eAAe,SAAS;AAC5D,YAAM,IAAI,gBAAgB;AAC1B,UAAI,EAAE,QAAQ;AACZ,UAAE,KAAK,mBAAmB,UAAU,OAAO,OAAO,OAAO,OAAO,QAAQ,KAAK,GAAG,EAAE,OAAO,EAAE,UAAU,KAAK,EAAE,OAAO,CAAC;AACpH,YAAI,EAAE,MAAO,mBAAkB,EAAE,KAAK;AAAA,MACxC;AACA;AAAA,IACF;AAEA,QAAI,cAAc,YAAY;AAE5B,UAAI,sBAAsB,SAAS;AACjC,cAAM,OAAO,sBAAsB;AACnC,cAAMC,gBAAe,mBAAmB,UAAU,OAAO,OAAO,OAAO,OAAO,QAAQ,KAAK;AAC3F,cAAM,KAAKA,cAAa,IAAI,KAAK,WAAW;AAC5C,cAAM,KAAKA,cAAa,IAAI,KAAK,WAAW;AAC5C,eAAO,iBAAiB,KAAK,OAAO;AAAA,UAClC,GAAG,KAAK,MAAM,KAAK,WAAW,IAAI,EAAE;AAAA,UACpC,GAAG,KAAK,MAAM,KAAK,WAAW,IAAI,EAAE;AAAA,QACtC,CAAC;AACD;AAAA,MACF;AAEA,YAAM,UAAU,kBAAkB;AAClC,UAAI,CAAC,SAAS;AAEZ,YAAI,MAAM,eAAe,UAAU;AACjC,gBAAM,QAAQ,mBAAmB,UAAU,OAAO,OAAO,OAAO,OAAO,QAAQ,KAAK;AACpF,cAAI,UAAU;AACd,mBAAS,IAAI,MAAM,YAAY,SAAS,GAAG,KAAK,GAAG,KAAK;AACtD,gBAAI,kBAAkB,OAAO,MAAM,YAAY,CAAC,CAAC,GAAG;AAClD,wBAAU;AACV;AAAA,YACF;AAAA,UACF;AACA,iBAAO,MAAM,SAAS,UAAU,SAAS;AAAA,QAC3C,OAAO;AACL,iBAAO,MAAM,SAAS;AAAA,QACxB;AACA;AAAA,MACF;AAEA,YAAM,eAAe,mBAAmB,UAAU,OAAO,OAAO,OAAO,OAAO,QAAQ,KAAK;AAE3F,UAAI,MAAM,eAAe,SAAS,aAAa,SAAS;AACtD,uBAAe,QAAQ,KAAK,YAAY;AACxC,cAAM,QAAoB;AAAA,UACxB,IAAI;AAAA,UACJ,MAAM;AAAA,UACN,GAAG;AAAA,UACH,GAAG;AAAA,UACH,QAAQ,CAAC,GAAG,eAAe,OAAO;AAAA,UAClC,aAAa;AAAA,UACb;AAAA,QACF;AACA,2BAAmB,UAAU;AAC7B,qBAAa,KAAK;AAAA,MACpB,WAAW,MAAM,eAAe,QAAQ;AACtC,cAAM,IAAI,aAAa,IAAI,QAAQ;AACnC,cAAM,IAAI,aAAa,IAAI,QAAQ;AACnC,cAAM,QAAoB;AAAA,UACxB,IAAI;AAAA,UACJ,MAAM;AAAA,UACN,GAAG,KAAK,IAAI,QAAQ,GAAG,aAAa,CAAC;AAAA,UACrC,GAAG,KAAK,IAAI,QAAQ,GAAG,aAAa,CAAC;AAAA,UACrC,OAAO,KAAK,IAAI,CAAC;AAAA,UACjB,QAAQ,KAAK,IAAI,CAAC;AAAA,UAClB,aAAa;AAAA,UACb;AAAA,QACF;AACA,2BAAmB,UAAU;AAC7B,qBAAa,KAAK;AAAA,MACpB,WAAW,MAAM,eAAe,UAAU;AACxC,cAAM,KAAK,KAAK,IAAI,aAAa,IAAI,QAAQ,CAAC,IAAI;AAClD,cAAM,KAAK,KAAK,IAAI,aAAa,IAAI,QAAQ,CAAC,IAAI;AAClD,cAAM,QAAoB;AAAA,UACxB,IAAI;AAAA,UACJ,MAAM;AAAA,UACN,GAAG,KAAK,IAAI,QAAQ,GAAG,aAAa,CAAC,IAAI;AAAA,UACzC,GAAG,KAAK,IAAI,QAAQ,GAAG,aAAa,CAAC,IAAI;AAAA,UACzC,SAAS;AAAA,UACT,SAAS;AAAA,UACT,aAAa;AAAA,UACb;AAAA,QACF;AACA,2BAAmB,UAAU;AAC7B,qBAAa,KAAK;AAAA,MACpB,WAAW,MAAM,eAAe,SAAS;AACvC,cAAM,QAAoB;AAAA,UACxB,IAAI;AAAA,UACJ,MAAM;AAAA,UACN,GAAG,QAAQ;AAAA,UACX,GAAG,QAAQ;AAAA,UACX,MAAM,aAAa;AAAA,UACnB,MAAM,aAAa;AAAA,UACnB,aAAa;AAAA,UACb;AAAA,QACF;AACA,2BAAmB,UAAU;AAC7B,qBAAa,KAAK;AAAA,MACpB,WAAW,MAAM,eAAe,QAAQ;AACtC,cAAM,QAAoB;AAAA,UACxB,IAAI;AAAA,UACJ,MAAM;AAAA,UACN,GAAG,QAAQ;AAAA,UACX,GAAG,QAAQ;AAAA,UACX,MAAM,aAAa;AAAA,UACnB,MAAM,aAAa;AAAA,UACnB,aAAa;AAAA,UACb;AAAA,QACF;AACA,2BAAmB,UAAU;AAC7B,qBAAa,KAAK;AAAA,MACpB;AAAA,IACF;AAAA,EACF;AAEA,QAAM,gBAAgB,CAAC,MAA2C;AAChE,UAAM,SAAS,UAAU;AACzB,QAAI,CAAC,UAAU,cAAc,OAAQ;AACrC,UAAM,WAAW,oBAAoB,CAAC;AAEtC,QAAI,cAAc,UAAU;AAC1B,YAAM,UAAU,oBAAoB;AACpC,UAAI,QAAQ,QAAQ;AAClB,gBAAQ,IAAI,mBAAmB,UAAU,OAAO,OAAO,OAAO,OAAO,QAAQ,KAAK,GAAG,CAAC;AACtF,0BAAkB,UAAU;AAC5B,qBAAa;AAAA,MACf;AACA;AAAA,IACF;AAEA,QAAI,cAAc,QAAQ;AACxB,UAAI,gBAAgB,SAAS;AAC3B,YACE,aAAa,WACb,aAAa,QAAQ,SAAS,MAC9B,aAAa,QAAQ,UAAU,IAC/B;AACA,iBAAO,QAAQ,aAAa,SAAS,IAAI;AAAA,QAC3C;AACA,wBAAgB,UAAU;AAC1B,qBAAa,UAAU;AACvB,qBAAa;AAAA,MACf;AACA;AAAA,IACF;AAEA,QAAI,cAAc,cAAc,MAAM,eAAe,SAAS;AAC5D,sBAAgB,QAAS,GAAG;AAC5B;AAAA,IACF;AACA,QAAI,cAAc,cAAc,MAAM,eAAe,QAAQ;AAC3D,YAAM,OAAO,YAAY;AACzB,WAAK,GAAG,mBAAmB,UAAU,OAAO,OAAO,OAAO,OAAO,QAAQ,KAAK,CAAC;AAC/E,qBAAe,KAAK,OAAO;AAC3B,UAAI,KAAK,MAAO,mBAAkB,KAAK,KAAK;AAC5C,WAAK,aAAa;AAElB,UAAI,KAAK,QAAS,YAAW,MAAM,aAAa,SAAS,MAAM,GAAG,CAAC;AACnE;AAAA,IACF;AAEA,QAAI,cAAc,YAAY;AAC5B,UAAI,sBAAsB,SAAS;AACjC,8BAAsB,UAAU;AAChC;AAAA,MACF;AAEA,YAAM,UAAU,kBAAkB;AAClC,UAAI,SAAS;AACX,cAAM,eAAe,mBAAmB,UAAU,OAAO,OAAO,OAAO,OAAO,QAAQ,KAAK;AAE3F,YAAI,MAAM,eAAe,SAAS,aAAa,SAAS;AACtD,cAAI,eAAe,QAAQ,SAAS,GAAG;AACrC,mBAAO,cAAc;AAAA,cACnB,MAAM;AAAA,cACN,GAAG;AAAA,cACH,GAAG;AAAA,cACH,QAAQ,CAAC,GAAG,eAAe,OAAO;AAAA,cAClC,aAAa;AAAA,cACb;AAAA,YACF,CAAC;AAAA,UACH;AACA,uBAAa,UAAU;AACvB,yBAAe,UAAU,CAAC;AAAA,QAC5B,WAAW,MAAM,eAAe,QAAQ;AACtC,gBAAM,IAAI,KAAK,IAAI,aAAa,IAAI,QAAQ,CAAC;AAC7C,gBAAM,IAAI,KAAK,IAAI,aAAa,IAAI,QAAQ,CAAC;AAC7C,cAAI,IAAI,KAAK,IAAI,GAAG;AAClB,mBAAO,cAAc;AAAA,cACnB,MAAM;AAAA,cACN,GAAG,KAAK,IAAI,QAAQ,GAAG,aAAa,CAAC;AAAA,cACrC,GAAG,KAAK,IAAI,QAAQ,GAAG,aAAa,CAAC;AAAA,cACrC,OAAO;AAAA,cACP,QAAQ;AAAA,cACR,aAAa;AAAA,cACb;AAAA,YACF,CAAC;AAAA,UACH;AAAA,QACF,WAAW,MAAM,eAAe,UAAU;AACxC,gBAAM,KAAK,KAAK,IAAI,aAAa,IAAI,QAAQ,CAAC,IAAI;AAClD,gBAAM,KAAK,KAAK,IAAI,aAAa,IAAI,QAAQ,CAAC,IAAI;AAClD,cAAI,KAAK,KAAK,KAAK,GAAG;AACpB,mBAAO,cAAc;AAAA,cACnB,MAAM;AAAA,cACN,GAAG,KAAK,IAAI,QAAQ,GAAG,aAAa,CAAC,IAAI;AAAA,cACzC,GAAG,KAAK,IAAI,QAAQ,GAAG,aAAa,CAAC,IAAI;AAAA,cACzC,SAAS;AAAA,cACT,SAAS;AAAA,cACT,aAAa;AAAA,cACb;AAAA,YACF,CAAC;AAAA,UACH;AAAA,QACF,WAAW,MAAM,eAAe,SAAS;AACvC,cAAI,KAAK,MAAM,aAAa,IAAI,QAAQ,GAAG,aAAa,IAAI,QAAQ,CAAC,IAAI,GAAG;AAC1E,mBAAO,cAAc;AAAA,cACnB,MAAM;AAAA,cACN,GAAG,QAAQ;AAAA,cACX,GAAG,QAAQ;AAAA,cACX,MAAM,aAAa;AAAA,cACnB,MAAM,aAAa;AAAA,cACnB,aAAa;AAAA,cACb;AAAA,YACF,CAAC;AAAA,UACH;AAAA,QACF,WAAW,MAAM,eAAe,QAAQ;AACtC,cAAI,KAAK,MAAM,aAAa,IAAI,QAAQ,GAAG,aAAa,IAAI,QAAQ,CAAC,IAAI,GAAG;AAC1E,mBAAO,cAAc;AAAA,cACnB,MAAM;AAAA,cACN,GAAG,QAAQ;AAAA,cACX,GAAG,QAAQ;AAAA,cACX,MAAM,aAAa;AAAA,cACnB,MAAM,aAAa;AAAA,cACnB,aAAa;AAAA,cACb;AAAA,YACF,CAAC;AAAA,UACH;AAAA,QACF;AAEA,2BAAmB,UAAU;AAC7B,0BAAkB,UAAU;AAC5B,qBAAa;AAAA,MACf;AAAA,IACF;AAAA,EACF;AAEA,QAAM,gBAAgB,MAAM;AAC1B,QAAI,CAAC,UAAU,KAAK,EAAG;AACvB,WAAO,cAAc;AAAA,MACnB,MAAM;AAAA,MACN,GAAG;AAAA,MACH,GAAG;AAAA,MACH,MAAM,UAAU,KAAK;AAAA,MACrB;AAAA,MACA,OAAO;AAAA,IACT,CAAC;AACD,iBAAa,EAAE;AAAA,EACjB;AAEA,QAAM,eAAe,YAAY;AAC/B,UAAM,UAAU,MAAM,OAAO,UAAU,aAAa;AACpD,QAAI,QAAQ;AACV,aAAO,OAAO;AAAA,IAChB,OAAO;AAEL,YAAM,OAAO,SAAS,cAAc,GAAG;AACvC,WAAK,WAAW,gBAAgB,KAAK,IAAI,CAAC;AAC1C,WAAK,OAAO;AACZ,WAAK,MAAM;AAAA,IACb;AAAA,EACF;AAEA,SACE,gBAAAL;AAAA,IAAC;AAAA;AAAA,MACC,WAAW,2GAA2G,SAAS;AAAA,MAC/H;AAAA,MAGA;AAAA,wBAAAA,OAAC,SAAI,WAAU,yGAEb;AAAA,0BAAAA,OAAC,SAAI,WAAU,uFACb;AAAA,4BAAAD;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,SAAS,MAAM;AACb,+BAAa,MAAM;AACnB,yBAAO,QAAQ,MAAM;AAAA,gBACvB;AAAA,gBACA,WAAW,wDACT,cAAc,SAAS,oCAAoC,qCAC7D;AAAA,gBACD;AAAA;AAAA,YAED;AAAA,YACA,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,SAAS,MAAM;AACb,+BAAa,QAAQ;AACrB,yBAAO,QAAQ,QAAQ;AAAA,gBACzB;AAAA,gBACA,WAAW,wDACT,cAAc,WAAW,oCAAoC,qCAC/D;AAAA,gBACD;AAAA;AAAA,YAED;AAAA,YACA,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,SAAS,MAAM;AACb,+BAAa,QAAQ;AACrB,yBAAO,QAAQ,QAAQ;AAAA,gBACzB;AAAA,gBACA,WAAW,wDACT,cAAc,WAAW,oCAAoC,qCAC/D;AAAA,gBACD;AAAA;AAAA,YAED;AAAA,YACA,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,SAAS,MAAM;AACb,+BAAa,OAAO;AACpB,yBAAO,QAAQ,OAAO;AAAA,gBACxB;AAAA,gBACA,WAAW,wDACT,cAAc,UAAU,oCAAoC,qCAC9D;AAAA,gBACD;AAAA;AAAA,YAED;AAAA,YACA,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,SAAS,MAAM;AACb,+BAAa,QAAQ;AACrB,yBAAO,QAAQ,QAAQ;AAAA,gBACzB;AAAA,gBACA,WAAW,wDACT,cAAc,WAAW,oCAAoC,qCAC/D;AAAA,gBACD;AAAA;AAAA,YAED;AAAA,YACA,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,SAAS,MAAM;AACb,+BAAa,UAAU;AACvB,yBAAO,QAAQ,KAAK;AAAA,gBACtB;AAAA,gBACA,WAAW,wDACT,cAAc,aAAa,oCAAoC,qCACjE;AAAA,gBACD;AAAA;AAAA,YAED;AAAA,YACA,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,SAAS,MAAM;AACb,+BAAa,OAAO;AACpB,yBAAO,QAAQ,QAAQ;AAAA,gBACzB;AAAA,gBACA,WAAW,wDACT,cAAc,UAAU,oCAAoC,qCAC9D;AAAA,gBACD;AAAA;AAAA,YAED;AAAA,YACA,gBAAAC;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,SAAS,MAAM;AACb,+BAAa,IAAI;AACjB,yBAAO,QAAQ,QAAQ;AAAA,gBACzB;AAAA,gBACA,WAAW,kFACT,cAAc,OAAO,oCAAoC,qCAC3D;AAAA,gBAEA;AAAA,kCAAAD,MAAC,SAAI,WAAU,eAAc,SAAQ,aAAY,MAAK,QAAO,QAAO,gBAAe,aAAY,KAC7F,0BAAAA,MAAC,UAAK,GAAE,sHAAqH,GAC/H;AAAA,kBAAM;AAAA;AAAA;AAAA,YAER;AAAA,aACF;AAAA,UAGA,gBAAAC,OAAC,SAAI,WAAU,mCACb;AAAA,4BAAAD;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,UAAU,CAAC,OAAO;AAAA,gBAClB,SAAS,MAAM,OAAO,KAAK;AAAA,gBAC3B,WAAU;AAAA,gBACV,OAAM;AAAA,gBACP;AAAA;AAAA,YAED;AAAA,YACA,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,UAAU,CAAC,OAAO;AAAA,gBAClB,SAAS,MAAM,OAAO,KAAK;AAAA,gBAC3B,WAAU;AAAA,gBACV,OAAM;AAAA,gBACP;AAAA;AAAA,YAED;AAAA,YACA,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,SAAS,MAAM,OAAO,MAAM;AAAA,gBAC5B,WAAU;AAAA,gBACX;AAAA;AAAA,YAED;AAAA,YAEA,gBAAAA,MAAC,SAAI,WAAU,8BAA6B;AAAA,YAG5C,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,SAAS,MAAM,OAAO,QAAQ;AAAA,gBAC9B,WAAU;AAAA,gBACV,OAAM;AAAA,gBACP;AAAA;AAAA,YAED;AAAA,YACA,gBAAAC,OAAC,UAAK,WAAU,6CAA6C;AAAA,mBAAK,MAAM,MAAM,OAAO,GAAG;AAAA,cAAE;AAAA,eAAC;AAAA,YAC3F,gBAAAD;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,SAAS,MAAM,OAAO,OAAO;AAAA,gBAC7B,WAAU;AAAA,gBACV,OAAM;AAAA,gBACP;AAAA;AAAA,YAED;AAAA,YAEA,gBAAAA,MAAC,SAAI,WAAU,8BAA6B;AAAA,YAG5C,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,aAAa,MAAM,OAAO,aAAa,IAAI;AAAA,gBAC3C,WAAW,MAAM,OAAO,aAAa,KAAK;AAAA,gBAC1C,cAAc,MAAM,OAAO,aAAa,KAAK;AAAA,gBAC7C,WAAU;AAAA,gBACX;AAAA;AAAA,YAED;AAAA,YAGA,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,SAAS;AAAA,gBACT,WAAU;AAAA,gBACX;AAAA;AAAA,YAED;AAAA,aACF;AAAA,WACF;AAAA,QAGC,cAAc,UAAU,gBAAAA,MAAC,2BAAwB,MAAM,eAAe,WAAU,uDAAsD;AAAA,QACtI,CAAC,cAAc,UAAU,cAAc,SACtC,gBAAAA,MAAC,SAAI,MAAK,SAAQ,WAAU,6EACzB,wBAAc,OACjB;AAAA,QAIF,gBAAAC,OAAC,SAAI,WAAU,+DAEb;AAAA,0BAAAA;AAAA,YAAC;AAAA;AAAA,cACC,KAAK;AAAA,cACL,WAAU;AAAA,cAEV;AAAA,gCAAAD;AAAA,kBAAC;AAAA;AAAA,oBACC,KAAK;AAAA,oBACL,aAAa;AAAA,oBACb,aAAa;AAAA,oBACb,WAAW;AAAA,oBACX,cAAc;AAAA,oBACd,eAAe;AAAA,oBACf,eAAe;AAAA,oBACf,aAAa;AAAA,oBACb,iBAAiB,MAAM,gBAAgB,SAAS,OAAO;AAAA,oBACvD,eAAY;AAAA,oBACZ,OAAO,cAAc,SAAS,EAAE,QAAQ,gBAAgB,IAAI;AAAA,oBAC5D,WAAW,wCAAwC,cAAc,SAAS,eAAe,cAAc,UAAU,gCAAgC,cAAc,cAAc,MAAM,eAAe,SAAS,gBAAgB,cAAc,cAAc,MAAM,eAAe,UAAU,qBAAqB,EAAE;AAAA;AAAA,gBAC/S;AAAA,gBACC,eACC,gBAAAA;AAAA,kBAAC;AAAA;AAAA,oBACC,KAAK;AAAA,oBACL,cAAW;AAAA,oBACX,eAAY;AAAA,oBACZ,gBAAe;AAAA,oBACf,aAAY;AAAA,oBACZ,YAAY;AAAA,oBACZ,WAAW;AAAA,oBACX,SAAS;AAAA,oBACT,kBAAkB,CAAC,MAAM;AACvB,4BAAM,UAAU,YAAY,SAAS;AACrC,0BAAI,WAAW,EAAE,KAAM,SAAQ,OAAO,EAAE,IAAI;AAC5C,wBAAE,cAAc,QAAQ;AAAA,oBAC1B;AAAA,oBACA,WAAU;AAAA;AAAA,gBACZ;AAAA;AAAA;AAAA,UAGJ;AAAA,UAGA,gBAAAC,OAAC,SAAI,WAAU,4IAEZ;AAAA,0BAAc,UACb,gBAAAA,OAAC,SAAI,WAAU,+BACb;AAAA,8BAAAD,MAAC,UAAK,WAAU,qEAAoE,kCAEpF;AAAA,cACA,gBAAAC,OAAC,SAAI,WAAU,0BACb;AAAA,gCAAAD;AAAA,kBAAC;AAAA;AAAA,oBACC,MAAK;AAAA,oBACL,SAAS,MAAM;AACb,yCAAmB,IAAI;AACvB,6BAAO,gBAAgB,IAAI;AAAA,oBAC7B;AAAA,oBACA,WAAW,6CACT,oBAAoB,QAAQ,MAAM,OAC9B,+CACA,iEACN;AAAA,oBACD;AAAA;AAAA,gBAED;AAAA,gBACA,gBAAAA;AAAA,kBAAC;AAAA;AAAA,oBACC,MAAK;AAAA,oBACL,SAAS,MAAM;AACb,yCAAmB,CAAC;AACpB,6BAAO,gBAAgB,CAAC;AAAA,oBAC1B;AAAA,oBACA,WAAW,6CACT,oBAAoB,IAChB,+CACA,iEACN;AAAA,oBACD;AAAA;AAAA,gBAED;AAAA,gBACA,gBAAAA;AAAA,kBAAC;AAAA;AAAA,oBACC,MAAK;AAAA,oBACL,SAAS,MAAM;AACb,yCAAmB,IAAI,CAAC;AACxB,6BAAO,gBAAgB,IAAI,CAAC;AAAA,oBAC9B;AAAA,oBACA,WAAW,6CACT,oBAAoB,IAAI,IACpB,+CACA,iEACN;AAAA,oBACD;AAAA;AAAA,gBAED;AAAA,gBACA,gBAAAA;AAAA,kBAAC;AAAA;AAAA,oBACC,MAAK;AAAA,oBACL,SAAS,MAAM;AACb,yCAAmB,KAAK,CAAC;AACzB,6BAAO,gBAAgB,KAAK,CAAC;AAAA,oBAC/B;AAAA,oBACA,WAAW,6CACT,oBAAoB,KAAK,IACrB,+CACA,iEACN;AAAA,oBACD;AAAA;AAAA,gBAED;AAAA,gBACA,gBAAAA;AAAA,kBAAC;AAAA;AAAA,oBACC,MAAK;AAAA,oBACL,SAAS,MAAM;AACb,yCAAmB,IAAI,CAAC;AACxB,6BAAO,gBAAgB,IAAI,CAAC;AAAA,oBAC9B;AAAA,oBACA,WAAW,6CACT,oBAAoB,IAAI,IACpB,+CACA,iEACN;AAAA,oBACD;AAAA;AAAA,gBAED;AAAA,gBACA,gBAAAA;AAAA,kBAAC;AAAA;AAAA,oBACC,MAAK;AAAA,oBACL,SAAS,MAAM;AACb,yCAAmB,IAAI;AACvB,6BAAO,UAAU;AAAA,oBACnB;AAAA,oBACA,WAAU;AAAA,oBACX;AAAA;AAAA,gBAED;AAAA,iBACF;AAAA,cAEA,gBAAAA,MAAC,SAAI,WAAU,0BAAyB;AAAA,cAExC,gBAAAA,MAAC,UAAK,WAAU,qEAAoE,iCAEpF;AAAA,cACA,gBAAAC,OAAC,SAAI,WAAU,0BACb;AAAA,gCAAAD;AAAA,kBAAC;AAAA;AAAA,oBACC,MAAK;AAAA,oBACL,SAAS,MAAM,OAAO,OAAO,GAAG;AAAA,oBAChC,WAAU;AAAA,oBACX;AAAA;AAAA,gBAED;AAAA,gBACA,gBAAAA;AAAA,kBAAC;AAAA;AAAA,oBACC,MAAK;AAAA,oBACL,SAAS,MAAM,OAAO,OAAO,EAAE;AAAA,oBAC/B,WAAU;AAAA,oBACX;AAAA;AAAA,gBAED;AAAA,gBACA,gBAAAA;AAAA,kBAAC;AAAA;AAAA,oBACC,MAAK;AAAA,oBACL,SAAS,MAAM,OAAO,eAAe;AAAA,oBACrC,WAAW,iDACT,MAAM,UAAU,QACZ,+CACA,iEACN;AAAA,oBACD;AAAA;AAAA,gBAED;AAAA,gBACA,gBAAAA;AAAA,kBAAC;AAAA;AAAA,oBACC,MAAK;AAAA,oBACL,SAAS,MAAM,OAAO,aAAa;AAAA,oBACnC,WAAW,iDACT,MAAM,UAAU,QACZ,+CACA,iEACN;AAAA,oBACD;AAAA;AAAA,gBAED;AAAA,iBACF;AAAA,eACF;AAAA,YAID,cAAc,YACb,gBAAAC,OAAC,SAAI,WAAU,+BACb;AAAA,8BAAAA,OAAC,SAAI,WAAU,qCACb;AAAA,gCAAAD,MAAC,UAAK,WAAU,qEAAoE,+BAEpF;AAAA,gBACA,gBAAAA;AAAA,kBAAC;AAAA;AAAA,oBACC,MAAK;AAAA,oBACL,SAAS,MAAM,OAAO,iBAAiB;AAAA,oBACvC,WAAU;AAAA,oBACX;AAAA;AAAA,gBAED;AAAA,iBACF;AAAA,cAEA,gBAAAA,MAAC,aAAU,WAAW,OAAO,WAAW;AAAA,cAEvC,0BAA0B,IAAI,CAAC,SAC9B,gBAAAC,OAACM,QAAM,UAAN,EACC;AAAA,gCAAAP;AAAA,kBAAC;AAAA;AAAA,oBACC;AAAA,oBACA,OAAO,uBAAuB,MAAM,WAAW,EAAE,KAAK,EAAE;AAAA,oBACxD,UAAU,KAAK,oBAAoB,UAAa;AAAA,oBAChD,UAAU,CAAC,MAAM,OAAO,eAAe,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC;AAAA;AAAA,gBACzD;AAAA,gBACC,KAAK,OAAO,UAAU,iBACrB,gBAAAC;AAAA,kBAAC;AAAA;AAAA,oBACC,WAAU;AAAA,oBACV,eAAY;AAAA,oBAEZ;AAAA,sCAAAD,MAAC,UAAK,2EAA6D;AAAA,sBACnE,gBAAAA;AAAA,wBAAC;AAAA;AAAA,0BACC,MAAK;AAAA,0BACL,SAAS,MAAM,OAAO,eAAe;AAAA,0BACrC,WAAU;AAAA,0BACX;AAAA;AAAA,sBAED;AAAA;AAAA;AAAA,gBACF;AAAA,mBApBiB,KAAK,EAsB1B,CACD;AAAA,cAED,gBAAAA,MAAC,SAAI,WAAU,qCACb,0BAAAA;AAAA,gBAAC;AAAA;AAAA,kBACC;AAAA,kBACA,QAAQ,MAAM,YAAY;AAAA,kBAC1B,WAAW,OAAO;AAAA;AAAA,cACpB,GACF;AAAA,eACF;AAAA,YAID,cAAc,YACb,gBAAAC,OAAC,SAAI,WAAU,+BACb;AAAA,8BAAAD,MAAC,UAAK,WAAU,qEAAoE,oBAAM;AAAA,cAC1F,gBAAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,MAAK;AAAA,kBACL,OAAM;AAAA,kBACN,WAAU;AAAA,kBACV,UAAU,cAAc;AAAA,kBACxB,SAAS,MAAM,cAAc,MAAM;AAAA,kBACpC;AAAA;AAAA,cAED;AAAA,cACA,gBAAAA,MAAC,eAAY,YAAwB;AAAA,cACpC,gBAAgB,gBAAAA,MAAC,6BAA0B,YAAwB,WAAU,qCAAoC;AAAA,cAClH,gBAAAA,MAAC,UAAK,WAAU,qEAAoE,oBAAM;AAAA,cAC1F,gBAAAA,MAAC,qBAAkB,YAAwB;AAAA,eAC7C;AAAA,YAID,cAAc,WACb,gBAAAC,OAAC,SAAI,WAAU,+BACb;AAAA,8BAAAD,MAAC,UAAK,WAAU,qEAAoE,mBAAK;AAAA,cACzF,gBAAAA,MAAC,mBAAgB,YAAwB;AAAA,cACzC,gBAAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,MAAK;AAAA,kBACL,OAAM;AAAA,kBACN,WAAU;AAAA,kBACV,UAAU,cAAc;AAAA,kBACxB,SAAS,MAAM,cAAc,MAAM;AAAA,kBACpC;AAAA;AAAA,cAED;AAAA,cACC,cACC,gBAAAA,MAAC,OAAE,MAAK,SAAQ,WAAU,iBAAgB,eAAY,eACnD,sBACH;AAAA,cAEF,gBAAAA,MAAC,SAAI,WAAU,qCACb,0BAAAA,MAAC,eAAY,YAAwB,GACvC;AAAA,eACF;AAAA,YAID,cAAc,cACb,gBAAAC,OAAC,SAAI,WAAU,+BACb;AAAA,8BAAAD,MAAC,UAAK,WAAU,qEAAoE,iCAAmB;AAAA,cACvG,gBAAAA,MAAC,SAAI,WAAU,4BACX,WAAC,SAAS,MAAM,EAAwB,IAAI,CAAC,MAC7C,gBAAAA;AAAA,gBAAC;AAAA;AAAA,kBAEC,MAAK;AAAA,kBACL,gBAAc,MAAM,eAAe;AAAA,kBACnC,SAAS,MAAM,OAAO,QAAQ,CAAC;AAAA,kBAC/B,WAAW,+DACT,MAAM,eAAe,IAAI,+CAA+C,iEAC1E;AAAA,kBAEC,gBAAM,UAAU,UAAU;AAAA;AAAA,gBARtB;AAAA,cASP,CACD,GACH;AAAA,cACC,MAAM,eAAe,WAAW,gBAAAA,MAAC,mBAAgB,YAAwB,SAAS,cAAc,UAAU,iBAAiB;AAAA,cAC3H,MAAM,eAAe,UACpB,gBAAAA,MAAC,kBAAe,YAAwB,SAAS,aAAa,UAAU,gBAAgB,SAAS,aAAa;AAAA,cAE/G,MAAM,eAAe,UAAU,eAC9B,gBAAAA,MAAC,YAAO,MAAK,UAAS,SAAS,cAAc,WAAU,2FAA0F,+BAEjJ;AAAA,cAED,kBACC,gBAAAA,MAAC,OAAE,MAAK,SAAQ,WAAU,iBAAgB,eAAY,oBACnD,0BACH;AAAA,cAEF,gBAAAA,MAAC,SAAI,WAAU,0BAAyB;AAAA,cAExC,gBAAAA,MAAC,UAAK,WAAU,qEAAoE,6BAEpF;AAAA,cAGA,gBAAAA,MAAC,SAAI,WAAU,4BACX,WAAC,OAAO,QAAQ,UAAU,SAAS,MAAM,EAAwB,IAAI,CAAC,MACtE,gBAAAA;AAAA,gBAAC;AAAA;AAAA,kBAEC,MAAK;AAAA,kBACL,SAAS,MAAM,OAAO,QAAQ,CAAC;AAAA,kBAC/B,WAAW,0EACT,MAAM,eAAe,IACjB,+CACA,iEACN;AAAA,kBAEC;AAAA;AAAA,gBATI;AAAA,cAUP,CACD,GACH;AAAA,cAGA,gBAAAC,OAAC,SAAI,WAAU,gCACb;AAAA,gCAAAD,MAAC,WAAM,WAAU,kBAAiB,oBAAM;AAAA,gBACxC,gBAAAA;AAAA,kBAAC;AAAA;AAAA,oBACC,MAAK;AAAA,oBACL,OAAO;AAAA,oBACP,UAAU,CAAC,MAAM,eAAe,EAAE,OAAO,KAAK;AAAA,oBAC9C,WAAU;AAAA;AAAA,gBACZ;AAAA,gBACA,gBAAAC,OAAC,SAAI,WAAU,eACb;AAAA,kCAAAA,OAAC,SAAI,WAAU,8CACb;AAAA,oCAAAD,MAAC,UAAK,oBAAM;AAAA,oBACZ,gBAAAC,OAAC,UAAK,WAAU,aAAa;AAAA;AAAA,sBAAY;AAAA,uBAAE;AAAA,qBAC7C;AAAA,kBACA,gBAAAD;AAAA,oBAAC;AAAA;AAAA,sBACC,MAAK;AAAA,sBACL,KAAI;AAAA,sBACJ,KAAI;AAAA,sBACJ,OAAO;AAAA,sBACP,UAAU,CAAC,MAAM,eAAe,OAAO,EAAE,OAAO,KAAK,CAAC;AAAA,sBACtD,WAAU;AAAA;AAAA,kBACZ;AAAA,mBACF;AAAA,iBACF;AAAA,cAEA,gBAAAA,MAAC,SAAI,WAAU,0BAAyB;AAAA,cAGxC,gBAAAA,MAAC,UAAK,WAAU,qEAAoE,sBAAQ;AAAA,cAC5F,gBAAAC,OAAC,SAAI,WAAU,cACb;AAAA,gCAAAD;AAAA,kBAAC;AAAA;AAAA,oBACC,MAAK;AAAA,oBACL,aAAY;AAAA,oBACZ,OAAO;AAAA,oBACP,UAAU,CAAC,MAAM,aAAa,EAAE,OAAO,KAAK;AAAA,oBAC5C,WAAW,CAAC,MAAM,EAAE,QAAQ,WAAW,cAAc;AAAA,oBACrD,WAAU;AAAA;AAAA,gBACZ;AAAA,gBACA,gBAAAA;AAAA,kBAAC;AAAA;AAAA,oBACC,MAAK;AAAA,oBACL,SAAS;AAAA,oBACT,WAAU;AAAA,oBACX;AAAA;AAAA,gBAED;AAAA,iBACF;AAAA,cACA,gBAAAC,OAAC,SAAI,WAAU,oDACb;AAAA,gCAAAD,MAAC,UAAK,wBAAU;AAAA,gBAChB,gBAAAC,OAAC,UAAK,WAAU,aAAa;AAAA;AAAA,kBAAS;AAAA,mBAAE;AAAA,iBAC1C;AAAA,cACA,gBAAAD;AAAA,gBAAC;AAAA;AAAA,kBACC,MAAK;AAAA,kBACL,KAAI;AAAA,kBACJ,KAAI;AAAA,kBACJ,OAAO;AAAA,kBACP,UAAU,CAAC,MAAM,YAAY,OAAO,EAAE,OAAO,KAAK,CAAC;AAAA,kBACnD,WAAU;AAAA;AAAA,cACZ;AAAA,cAGA,gBAAAA,MAAC,SAAI,WAAU,0BAAyB;AAAA,cACxC,gBAAAC,OAAC,SAAI,WAAU,qCACb;AAAA,gCAAAA,OAAC,UAAK,WAAU,kBAAiB;AAAA;AAAA,kBAAS,MAAM,YAAY;AAAA,kBAAO;AAAA,mBAAC;AAAA,gBACnE,MAAM,wBACL,gBAAAD;AAAA,kBAAC;AAAA;AAAA,oBACC,MAAK;AAAA,oBACL,SAAS,MAAM,OAAO,iBAAiB,MAAM,oBAAqB;AAAA,oBAClE,WAAU;AAAA,oBACX;AAAA;AAAA,gBAED;AAAA,gBAED,MAAM,YAAY,SAAS,KAC1B,gBAAAA;AAAA,kBAAC;AAAA;AAAA,oBACC,MAAK;AAAA,oBACL,SAAS,MAAM,OAAO,iBAAiB;AAAA,oBACvC,WAAU;AAAA,oBACX;AAAA;AAAA,gBAED;AAAA,iBAEJ;AAAA,eACF;AAAA,YAID,cAAc,WACb,gBAAAC,OAAC,SAAI,WAAU,+BACb;AAAA,8BAAAA,OAAC,SAAI,WAAU,qCACb;AAAA,gCAAAD,MAAC,UAAK,WAAU,qEAAoE,2BAEpF;AAAA,gBACA,gBAAAA;AAAA,kBAAC;AAAA;AAAA,oBACC,MAAK;AAAA,oBACL,SAAS,MAAM,OAAO,eAAe;AAAA,oBACrC,WAAU;AAAA,oBACX;AAAA;AAAA,gBAED;AAAA,iBACF;AAAA,cAEA,gBAAAC,OAAC,WAAM,WAAU,yDACf;AAAA,gCAAAD;AAAA,kBAAC;AAAA;AAAA,oBACC,MAAK;AAAA,oBACL,SAAS,MAAM,UAAU;AAAA,oBACzB,UAAU,CAAC,MAAM,OAAO,aAAa,EAAE,SAAS,EAAE,OAAO,QAAQ,CAAC;AAAA,oBAClE,WAAU;AAAA;AAAA,gBACZ;AAAA,gBACA,gBAAAA,MAAC,UAAK,uCAAyB;AAAA,iBACjC;AAAA,cAEC,MAAM,UAAU,WACf,gBAAAC,OAAAF,WAAA,EACE;AAAA,gCAAAE,OAAC,SACC;AAAA,kCAAAD,MAAC,WAAM,WAAU,6BAA4B,6BAAe;AAAA,kBAC5D,gBAAAA;AAAA,oBAAC;AAAA;AAAA,sBACC,MAAK;AAAA,sBACL,aAAY;AAAA,sBACZ,OAAO,MAAM,UAAU,cAAc;AAAA,sBACrC,UAAU,CAAC,MAAM,OAAO,aAAa,EAAE,YAAY,EAAE,OAAO,SAAS,KAAK,CAAC;AAAA,sBAC3E,WAAU;AAAA;AAAA,kBACZ;AAAA,mBACF;AAAA,gBAEA,gBAAAC,OAAC,SAAI,WAAU,cACb;AAAA,kCAAAD;AAAA,oBAAC;AAAA;AAAA,sBACC,MAAK;AAAA,sBACL,SAAS,MAAM,OAAO,aAAa,EAAE,MAAM,YAAY,CAAC;AAAA,sBACxD,WAAW,uDACT,MAAM,UAAU,SAAS,cACrB,+CACA,8CACN;AAAA,sBACD;AAAA;AAAA,kBAED;AAAA,kBACA,gBAAAA;AAAA,oBAAC;AAAA;AAAA,sBACC,MAAK;AAAA,sBACL,SAAS,MAAM,OAAO,aAAa,EAAE,MAAM,aAAa,CAAC;AAAA,sBACzD,WAAW,uDACT,MAAM,UAAU,SAAS,eACrB,+CACA,8CACN;AAAA,sBACD;AAAA;AAAA,kBAED;AAAA,mBACF;AAAA,gBAEA,gBAAAC,OAAC,SACC;AAAA,kCAAAA,OAAC,SAAI,WAAU,4CACb;AAAA,oCAAAD,MAAC,UAAK,kCAAoB;AAAA,oBAC1B,gBAAAA,MAAC,UAAK,WAAU,aAAa,gBAAM,UAAU,WAAW,CAAC,GAAE;AAAA,qBAC7D;AAAA,kBACA,gBAAAA;AAAA,oBAAC;AAAA;AAAA,sBACC,MAAK;AAAA,sBACL,KAAI;AAAA,sBACJ,KAAI;AAAA,sBACJ,OAAO,MAAM,UAAU,WAAW,CAAC;AAAA,sBACnC,UAAU,CAAC,MACT,OAAO,aAAa;AAAA,wBAClB,YAAY,CAAC,OAAO,EAAE,OAAO,KAAK,GAAG,MAAM,UAAU,WAAW,CAAC,CAAC;AAAA,sBACpE,CAAC;AAAA,sBAEH,WAAU;AAAA;AAAA,kBACZ;AAAA,mBACF;AAAA,gBAEA,gBAAAC,OAAC,SACC;AAAA,kCAAAA,OAAC,SAAI,WAAU,4CACb;AAAA,oCAAAD,MAAC,UAAK,iCAAmB;AAAA,oBACzB,gBAAAA,MAAC,UAAK,WAAU,aAAa,gBAAM,UAAU,WAAW,CAAC,GAAE;AAAA,qBAC7D;AAAA,kBACA,gBAAAA;AAAA,oBAAC;AAAA;AAAA,sBACC,MAAK;AAAA,sBACL,KAAI;AAAA,sBACJ,KAAI;AAAA,sBACJ,OAAO,MAAM,UAAU,WAAW,CAAC;AAAA,sBACnC,UAAU,CAAC,MACT,OAAO,aAAa;AAAA,wBAClB,YAAY,CAAC,MAAM,UAAU,WAAW,CAAC,GAAG,OAAO,EAAE,OAAO,KAAK,CAAC;AAAA,sBACpE,CAAC;AAAA,sBAEH,WAAU;AAAA;AAAA,kBACZ;AAAA,mBACF;AAAA,gBAEA,gBAAAC,OAAC,SACC;AAAA,kCAAAA,OAAC,SAAI,WAAU,4CACb;AAAA,oCAAAD,MAAC,UAAK,uBAAS;AAAA,oBACf,gBAAAA,MAAC,UAAK,WAAU,aAAa,gBAAM,UAAU,UAAS;AAAA,qBACxD;AAAA,kBACA,gBAAAA;AAAA,oBAAC;AAAA;AAAA,sBACC,MAAK;AAAA,sBACL,KAAI;AAAA,sBACJ,KAAI;AAAA,sBACJ,OAAO,MAAM,UAAU;AAAA,sBACvB,UAAU,CAAC,MAAM,OAAO,aAAa,EAAE,UAAU,OAAO,EAAE,OAAO,KAAK,EAAE,CAAC;AAAA,sBACzE,WAAU;AAAA;AAAA,kBACZ;AAAA,mBACF;AAAA,gBAEA,gBAAAC,OAAC,WAAM,WAAU,8DACf;AAAA,kCAAAD;AAAA,oBAAC;AAAA;AAAA,sBACC,MAAK;AAAA,sBACL,SAAS,MAAM,UAAU;AAAA,sBACzB,UAAU,CAAC,MAAM,OAAO,aAAa,EAAE,QAAQ,EAAE,OAAO,QAAQ,CAAC;AAAA,sBACjE,WAAU;AAAA;AAAA,kBACZ;AAAA,kBACA,gBAAAA,MAAC,UAAK,yBAAW;AAAA,mBACnB;AAAA,iBACF;AAAA,eAEJ;AAAA,YAID,cAAc,YACb,gBAAAC,OAAC,SAAI,WAAU,+BACb;AAAA,8BAAAD;AAAA,gBAAC;AAAA;AAAA,kBACC;AAAA,kBACA,SAAS;AAAA,kBACT,iBAAiB;AAAA,kBACjB,WAAW,MAAM,aAAa;AAAA,kBAC9B,WAAW,QAAQ,MAAM,SAAS;AAAA;AAAA,cACpC;AAAA,cACC,kBACC,gBAAAA,MAAC,OAAE,MAAK,SAAQ,WAAU,iBACvB,0BACH;AAAA,cAEF,gBAAAC,OAAC,SAAI,WAAU,cACb;AAAA,gCAAAD;AAAA,kBAAC;AAAA;AAAA,oBACD,MAAK;AAAA,oBACL,OAAM;AAAA,oBACN,WAAU;AAAA,oBACV,UAAU,cAAc;AAAA,oBACxB,SAAS,MAAM,cAAc,MAAM,EAAE,SAAS,oBAAoB,CAAC;AAAA,oBACpE;AAAA;AAAA,gBAED;AAAA,gBACE,gBAAAA;AAAA,kBAAC;AAAA;AAAA,oBACD,MAAK;AAAA,oBACL,OAAM;AAAA,oBACN,WAAU;AAAA,oBACV,UAAU,cAAc;AAAA,oBACxB,SAAS,MAAM,cAAc,MAAM,EAAE,SAAS,YAAY,CAAC;AAAA,oBAC5D;AAAA;AAAA,gBAED;AAAA,iBACA;AAAA,cACA,gBAAAA,MAAC,mBAAgB,YAAwB,WAAW,MAAM,aAAa,MAAM,QAAQ,MAAM,YAAY,QAAQ;AAAA,eACjH;AAAA,YAID,cAAc,QACb,gBAAAC,OAAC,SAAI,WAAU,+BACb;AAAA,8BAAAA,OAAC,WAAM,WAAU,0DACf;AAAA,gCAAAD,MAAC,UAAK,2BAAa;AAAA,gBACnB,gBAAAC;AAAA,kBAAC;AAAA;AAAA,oBACC,cAAW;AAAA,oBACX,OAAO;AAAA,oBACP,UAAU,CAAC,MAAM,YAAY,EAAE,OAAO,KAAwB;AAAA,oBAC9D,WAAU;AAAA,oBAEV;AAAA,sCAAAD,MAAC,YAAO,OAAM,QAAQ,qBAAW,eAAe,qBAAqB,wBAAuB;AAAA,sBAC5F,gBAAAA,MAAC,YAAO,OAAM,aAAY,8BAAgB;AAAA,sBAC1C,gBAAAA,MAAC,YAAO,OAAM,WAAU,2BAAa;AAAA;AAAA;AAAA,gBACvC;AAAA,iBACF;AAAA,cAEA,gBAAAC,OAAC,SAAI,WAAU,gFACb;AAAA,gCAAAA,OAAC,SAAI,WAAU,qCACb;AAAA,kCAAAA,OAAC,UAAK,WAAU,+FACd;AAAA,oCAAAD,MAAC,SAAI,WAAU,+BAA8B,SAAQ,aAAY,MAAK,QAAO,QAAO,gBAAe,aAAY,KAC7G,0BAAAA,MAAC,UAAK,GAAE,+EAA8E,GACxF;AAAA,oBAAM;AAAA,qBAER;AAAA,kBACC,gBACC,gBAAAA,MAAC,UAAK,WAAU,yHAAwH,yBAExI;AAAA,mBAEJ;AAAA,gBAEA,gBAAAA,MAAC,OAAE,WAAU,8CAA6C,iFAE1D;AAAA,gBAEA,gBAAAA;AAAA,kBAAC;AAAA;AAAA,oBACC,MAAK;AAAA,oBACL,SAAS;AAAA,oBACT,UAAU,gBAAgB;AAAA,oBAC1B,WAAU;AAAA,oBAET,yBACC,gBAAAC,OAAAF,WAAA,EACE;AAAA,sCAAAC,MAAC,SAAI,WAAU,iFAAgF;AAAA,sBAAE;AAAA,uBAEnG,IAEA,gBAAAC,OAAAF,WAAA,EACE;AAAA,sCAAAC,MAAC,SAAI,WAAU,eAAc,SAAQ,aAAY,MAAK,QAAO,QAAO,gBAAe,aAAY,KAC7F,0BAAAA,MAAC,UAAK,GAAE,sHAAqH,GAC/H;AAAA,sBAAM;AAAA,uBAER;AAAA;AAAA,gBAEJ;AAAA,iBACF;AAAA,cAGA,gBAAAC,OAAC,SAAI,WAAU,gFACb;AAAA,gCAAAA,OAAC,SAAI,WAAU,qCACb;AAAA,kCAAAA,OAAC,UAAK,WAAU,+FACd;AAAA,oCAAAA,OAAC,SAAI,WAAU,+BAA8B,SAAQ,aAAY,MAAK,QAAO,QAAO,gBAAe,aAAY,KAC7G;AAAA,sCAAAD,MAAC,UAAK,GAAE,8GAA6G;AAAA,sBACrH,gBAAAA,MAAC,UAAK,GAAE,aAAY;AAAA,uBACtB;AAAA,oBAAM;AAAA,qBAER;AAAA,kBACC,gBACC,gBAAAA,MAAC,UAAK,WAAU,yHAAwH,2BAExI;AAAA,mBAEJ;AAAA,gBAEA,gBAAAA,MAAC,OAAE,WAAU,8CAA6C,kGAE1D;AAAA,gBAEA,gBAAAC,OAAC,SAAI,WAAU,uBACb;AAAA,kCAAAD,MAAC,WAAM,SAAQ,2BAA0B,WAAU,0CAAyC,oBAAM;AAAA,kBAClG,gBAAAA;AAAA,oBAAC;AAAA;AAAA,sBACC,IAAG;AAAA,sBACH,OAAO;AAAA,sBACP,UAAU,CAAC,MAAM,iBAAiB,EAAE,OAAO,KAAK;AAAA,sBAChD,aAAY;AAAA,sBACZ,MAAM;AAAA,sBACN,WAAU;AAAA;AAAA,kBACZ;AAAA,mBACF;AAAA,gBAEA,gBAAAC,OAAC,SAAI,WAAU,uBACb;AAAA,kCAAAD,MAAC,UAAK,WAAU,0CAAyC,gCAAkB;AAAA,kBAC3E,gBAAAC,OAAC,SAAI,WAAU,4BACb;AAAA,oCAAAA;AAAA,sBAAC;AAAA;AAAA,wBACC,MAAK;AAAA,wBACL,SAAS,MAAM,mBAAmB,aAAa;AAAA,wBAC/C,WAAW,kFACT,oBAAoB,gBAChB,uDACA,mEACN;AAAA,wBACD;AAAA;AAAA,0BACgB,MAAM,YAAY;AAAA,0BAAO;AAAA;AAAA;AAAA,oBAC1C;AAAA,oBACA,gBAAAA;AAAA,sBAAC;AAAA;AAAA,wBACC,MAAK;AAAA,wBACL,SAAS,MAAM,mBAAmB,MAAM;AAAA,wBACxC,WAAW,kFACT,oBAAoB,SAChB,uDACA,mEACN;AAAA,wBACD;AAAA;AAAA,0BACY,MAAM,OAAO,aAAa;AAAA,0BAAO;AAAA;AAAA;AAAA,oBAC9C;AAAA,qBACF;AAAA,mBACF;AAAA,gBAEA,gBAAAD;AAAA,kBAAC;AAAA;AAAA,oBACC,MAAK;AAAA,oBACL,SAAS;AAAA,oBACT,UAAU,gBAAgB,gBAAgB,CAAC,cAAc,KAAK;AAAA,oBAC9D,WAAU;AAAA,oBAET,yBACC,gBAAAC,OAAAF,WAAA,EACE;AAAA,sCAAAC,MAAC,SAAI,WAAU,iFAAgF;AAAA,sBAAE;AAAA,uBAEnG,IAEA,gBAAAC,OAAAF,WAAA,EACE;AAAA,sCAAAC,MAAC,SAAI,WAAU,eAAc,SAAQ,aAAY,MAAK,QAAO,QAAO,gBAAe,aAAY,KAC7F,0BAAAA,MAAC,UAAK,GAAE,sHAAqH,GAC/H;AAAA,sBAAM;AAAA,uBAER;AAAA;AAAA,gBAEJ;AAAA,iBACF;AAAA,cAEC,WACC,gBAAAA,MAAC,SAAI,WAAU,oFACZ,mBACH;AAAA,cAGD,aACC,gBAAAA,MAAC,SAAI,WAAU,6FACZ,qBACH;AAAA,eAEJ;AAAA,aAEJ;AAAA,WACF;AAAA;AAAA;AAAA,EACF;AAEJ;","names":["options","React","useRef","useEffect","useState","useCallback","useEffect","useMemo","useState","jsx","jsxs","useEffect","useState","useRef","useState","histogramPath","jsx","jsxs","jsx","jsxs","useState","useEffect","useEffect","useRef","useState","useEffect","useRef","useState","jsx","jsxs","BLEND_MODES","jsx","jsxs","useRef","useEffect","useState","React","useEffect","useState","jsx","jsxs","useState","useEffect","React","useEffect","useState","jsx","jsx","jsxs","useState","useEffect","useEffect","useState","Fragment","jsx","jsxs","chip","useState","jsx","jsxs","btn","useState","ADJUSTMENT_KINDS","adjustmentKindLabel","Fragment","jsx","jsxs","button","useEffect","useState","jsx","jsxs","chip","useEffect","useState","Fragment","jsx","jsxs","chip","useEffect","useState","jsx","jsxs","chip","Fragment","jsx","jsxs","useRef","useState","useCallback","useEffect","currentImgPt","React"]}
|