@superbuilders/incept-renderer 0.1.0 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/lib/utils.ts","../../src/html/sanitize.ts","../../src/components/shared/html-content.tsx","../../src/components/feedback-message.tsx","../../src/ui/choice-indicator.tsx","../../src/ui/label.tsx","../../src/ui/field.tsx","../../src/ui/radio-group.tsx","../../src/components/interactions/choice-interaction.tsx","../../src/components/interactions/gap-match-interaction.tsx","../../src/ui/select.tsx","../../src/shared/shuffle.ts","../../src/components/interactions/inline-interaction.tsx","../../src/components/interactions/match-interaction.tsx","../../src/components/interactions/order-interaction.tsx","../../src/components/interactions/text-entry-interaction.tsx","../../src/components/qti-renderer.tsx","../../src/components/qti-feedback-block.tsx"],"names":["React","jsx","cva","RadioGroupPrimitive2","React2","submitted","jsxs","SafeInlineHTML","React4","React5","toQtiResponse","fromQtiResponse","sourceTokenVariants","useDraggable","useDroppable","DndContext","closestCenter","DragOverlay","React6","useSensors","useSensor","PointerSensor","React7","Fragment","React8"],"mappings":"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","file":"index.js","sourcesContent":["import { type ClassValue, clsx } from \"clsx\"\nimport { twMerge } from \"tailwind-merge\"\n\nexport const PALETTES = [\"default\", \"betta\", \"cardinal\", \"bee\", \"owl\", \"macaw\"] as const\nexport type Palette = (typeof PALETTES)[number]\n\nexport function cn(...inputs: ClassValue[]) {\n\treturn twMerge(clsx(inputs))\n}\n","/**\n * Configuration for HTML sanitization.\n * Defines allowed tags and attributes for safe rendering.\n */\ninterface SanitizeConfig {\n\tallowedTags: Set<string>\n\tallowedAttributes: Record<string, Set<string>>\n\tallowDataAttributes: boolean\n\tallowMathML: boolean\n}\n\n/**\n * Default configuration for QTI content sanitization.\n * Allows common HTML tags and MathML for mathematical expressions.\n */\nconst DEFAULT_CONFIG: SanitizeConfig = {\n\t// HTML content tags\n\tallowedTags: new Set([\n\t\t// Text content\n\t\t\"p\",\n\t\t\"span\",\n\t\t\"div\",\n\t\t\"br\",\n\t\t\"hr\",\n\t\t// Formatting\n\t\t\"b\",\n\t\t\"i\",\n\t\t\"u\",\n\t\t\"strong\",\n\t\t\"em\",\n\t\t\"mark\",\n\t\t\"small\",\n\t\t\"sub\",\n\t\t\"sup\",\n\t\t\"code\",\n\t\t\"pre\",\n\t\t\"kbd\",\n\t\t// Lists\n\t\t\"ul\",\n\t\t\"ol\",\n\t\t\"li\",\n\t\t\"dl\",\n\t\t\"dt\",\n\t\t\"dd\",\n\t\t// Tables\n\t\t\"table\",\n\t\t\"thead\",\n\t\t\"tbody\",\n\t\t\"tfoot\",\n\t\t\"tr\",\n\t\t\"th\",\n\t\t\"td\",\n\t\t\"caption\",\n\t\t\"colgroup\",\n\t\t\"col\",\n\t\t// Media\n\t\t\"img\",\n\t\t\"audio\",\n\t\t\"video\",\n\t\t\"source\",\n\t\t\"track\",\n\t\t// Semantic\n\t\t\"article\",\n\t\t\"section\",\n\t\t\"nav\",\n\t\t\"aside\",\n\t\t\"header\",\n\t\t\"footer\",\n\t\t\"main\",\n\t\t\"figure\",\n\t\t\"figcaption\",\n\t\t\"blockquote\",\n\t\t\"cite\",\n\t\t// Links\n\t\t\"a\",\n\t\t// Forms (for future interactive elements)\n\t\t\"label\",\n\t\t\"button\"\n\t]),\n\n\tallowedAttributes: {\n\t\t// Global attributes\n\t\t\"*\": new Set([\"class\", \"id\", \"lang\", \"dir\", \"title\", \"style\"]),\n\t\t// Specific attributes\n\t\timg: new Set([\"src\", \"alt\", \"width\", \"height\", \"style\"]),\n\t\ta: new Set([\"href\", \"target\", \"rel\"]),\n\t\taudio: new Set([\"src\", \"controls\", \"loop\", \"muted\"]),\n\t\tvideo: new Set([\"src\", \"controls\", \"loop\", \"muted\", \"width\", \"height\", \"poster\"]),\n\t\tsource: new Set([\"src\", \"type\"]),\n\t\ttrack: new Set([\"src\", \"kind\", \"srclang\", \"label\"])\n\t},\n\n\tallowDataAttributes: false,\n\tallowMathML: true\n}\n\n/**\n * MathML elements that are allowed for mathematical expressions.\n * Based on MathML 3.0 specification.\n */\nconst MATHML_TAGS = new Set([\n\t// Root\n\t\"math\",\n\t// Token elements\n\t\"mi\",\n\t\"mn\",\n\t\"mo\",\n\t\"mtext\",\n\t\"mspace\",\n\t\"ms\",\n\t// Layout\n\t\"mrow\",\n\t\"mfrac\",\n\t\"msqrt\",\n\t\"mroot\",\n\t\"mstyle\",\n\t\"merror\",\n\t\"mpadded\",\n\t\"mphantom\",\n\t\"mfenced\",\n\t\"menclose\",\n\t// Scripts and limits\n\t\"msub\",\n\t\"msup\",\n\t\"msubsup\",\n\t\"munder\",\n\t\"mover\",\n\t\"munderover\",\n\t\"mmultiscripts\",\n\t\"mprescripts\",\n\t\"none\",\n\t// Tables\n\t\"mtable\",\n\t\"mtr\",\n\t\"mtd\",\n\t\"maligngroup\",\n\t\"malignmark\",\n\t// Elementary math\n\t\"mstack\",\n\t\"mlongdiv\",\n\t\"msgroup\",\n\t\"msrow\",\n\t\"mscarries\",\n\t\"mscarry\",\n\t\"msline\",\n\t// Semantic\n\t\"semantics\",\n\t\"annotation\",\n\t\"annotation-xml\"\n])\n\n/**\n * MathML attributes that are allowed.\n */\nconst _MATHML_ATTRIBUTES = new Set([\n\t// Global MathML attributes\n\t\"id\",\n\t\"class\",\n\t\"style\",\n\t\"href\",\n\t\"mathcolor\",\n\t\"mathbackground\",\n\t\"mathsize\",\n\t\"mathvariant\",\n\t\"dir\",\n\t// Display\n\t\"display\",\n\t\"displaystyle\",\n\t\"scriptlevel\",\n\t// Spacing\n\t\"width\",\n\t\"height\",\n\t\"depth\",\n\t\"lspace\",\n\t\"rspace\",\n\t\"voffset\",\n\t// Fractions\n\t\"linethickness\",\n\t\"numalign\",\n\t\"denomalign\",\n\t\"bevelled\",\n\t// Roots\n\t\"index\",\n\t// Tables\n\t\"align\",\n\t\"rowalign\",\n\t\"columnalign\",\n\t\"groupalign\",\n\t\"alignmentscope\",\n\t\"columnwidth\",\n\t\"rowspacing\",\n\t\"columnspacing\",\n\t\"rowlines\",\n\t\"columnlines\",\n\t\"frame\",\n\t// Fences\n\t\"open\",\n\t\"close\",\n\t\"separators\",\n\t// Operators\n\t\"form\",\n\t\"fence\",\n\t\"separator\",\n\t\"stretchy\",\n\t\"symmetric\",\n\t\"maxsize\",\n\t\"minsize\",\n\t\"largeop\",\n\t\"movablelimits\",\n\t\"accent\",\n\t// Semantic\n\t\"encoding\",\n\t\"definitionURL\"\n])\n\n/**\n * Sanitizes HTML content to prevent XSS attacks.\n * Preserves MathML for mathematical expressions.\n */\nexport function sanitizeHtml(html: string, config: Partial<SanitizeConfig> = {}): string {\n\tconst cfg = { ...DEFAULT_CONFIG, ...config }\n\n\t// Basic XSS prevention patterns\n\tconst dangerousPatterns = [\n\t\t/<script\\b[^<]*(?:(?!<\\/script>)<[^<]*)*<\\/script>/gi,\n\t\t/javascript:/gi,\n\t\t/on\\w+\\s*=/gi, // Event handlers\n\t\t/<iframe\\b/gi,\n\t\t/<embed\\b/gi,\n\t\t/<object\\b/gi,\n\t\t/data:text\\/html/gi\n\t]\n\n\tlet sanitized = html\n\tfor (const pattern of dangerousPatterns) {\n\t\tsanitized = sanitized.replace(pattern, \"\")\n\t}\n\n\t// Parse and rebuild with allowed tags/attributes\n\tconst cleaned = cleanHtml(sanitized, cfg)\n\n\treturn cleaned\n}\n\n/**\n * Performs deep cleaning of HTML by parsing and rebuilding with only allowed elements.\n * Note: This is a simplified regex-based implementation for Node.js environments.\n * In production with browser support, consider using DOMPurify.\n */\nfunction cleanHtml(html: string, config: SanitizeConfig): string {\n\t// For Node.js environment, we use a regex-based approach\n\t// This is less robust than DOM-based cleaning but works in all environments\n\n\tlet cleaned = html\n\n\t// Remove all tags that aren't in the allowlist\n\tconst tagPattern = /<\\/?([a-zA-Z][a-zA-Z0-9-]*)([^>]*)>/g\n\tcleaned = cleaned.replace(tagPattern, (match, tagName, _attrs) => {\n\t\tconst tag = tagName.toLowerCase()\n\t\tconst isMathML = tag === \"math\" || cleaned.includes(\"<math\")\n\n\t\tif (isMathML && config.allowMathML && MATHML_TAGS.has(tag)) {\n\t\t\treturn match // Keep MathML tags\n\t\t}\n\t\tif (config.allowedTags.has(tag)) {\n\t\t\t// Clean attributes for allowed tags\n\t\t\treturn cleanAttributesString(match, tag, config)\n\t\t}\n\n\t\treturn \"\" // Remove disallowed tags\n\t})\n\n\treturn cleaned\n}\n\n/**\n * Cleans attributes from an HTML tag string.\n */\nfunction cleanAttributesString(tagString: string, tagName: string, config: SanitizeConfig): string {\n\tconst attrPattern = /\\s+([a-zA-Z][a-zA-Z0-9-:]*)(?:=\"([^\"]*)\"|'([^']*)'|=([^\\s>]+)|(?=\\s|>))/g\n\n\tlet cleanedTag = `<${tagString.startsWith(\"</\") ? \"/\" : \"\"}${tagName}`\n\n\tlet match = attrPattern.exec(tagString)\n\twhile (match !== null) {\n\t\tconst attrName = (match[1] || \"\").toLowerCase()\n\t\tconst attrValue = match[2] || match[3] || match[4] || \"\"\n\n\t\t// Check if attribute is allowed\n\t\tconst globalAttrs = config.allowedAttributes[\"*\"] || new Set()\n\t\tconst tagAttrs = config.allowedAttributes[tagName] || new Set()\n\n\t\tlet isAllowed = globalAttrs.has(attrName) || tagAttrs.has(attrName)\n\n\t\t// For <img>, strip size/style attributes to prevent stretched images\n\t\tif (tagName === \"img\" && (attrName === \"width\" || attrName === \"height\" || attrName === \"style\")) {\n\t\t\tisAllowed = false\n\t\t}\n\n\t\t// Check data attributes\n\t\tif (!isAllowed && config.allowDataAttributes && attrName.startsWith(\"data-\")) {\n\t\t\tisAllowed = true\n\t\t}\n\n\t\t// Check for dangerous values\n\t\tif (isAllowed && !isDangerousAttributeValue(attrName, attrValue)) {\n\t\t\tcleanedTag += ` ${attrName}=\"${attrValue.replace(/\"/g, \"&quot;\")}\"`\n\t\t}\n\n\t\tmatch = attrPattern.exec(tagString)\n\t}\n\n\tcleanedTag += \">\"\n\treturn cleanedTag\n}\n\n/**\n * Checks if an attribute value contains potentially dangerous content.\n */\nfunction isDangerousAttributeValue(name: string, value: string): boolean {\n\tconst valueLower = value.toLowerCase().trim()\n\n\t// Check for javascript: protocol\n\tif (name === \"href\" || name === \"src\") {\n\t\tif (valueLower.startsWith(\"javascript:\") || valueLower.startsWith(\"data:text/html\")) {\n\t\t\treturn true\n\t\t}\n\t}\n\n\t// Check for event handlers in values (some old XSS techniques)\n\tif (valueLower.includes(\"javascript:\") || valueLower.includes(\"onerror=\")) {\n\t\treturn true\n\t}\n\n\treturn false\n}\n\n/**\n * Sanitizes HTML for safe display, with automatic MathML detection.\n */\nexport function sanitizeForDisplay(html: string): string {\n\t// Auto-detect if content has MathML\n\tconst hasMathML = html.toLowerCase().includes(\"<math\")\n\n\treturn sanitizeHtml(html, {\n\t\tallowMathML: hasMathML,\n\t\tallowDataAttributes: true\n\t})\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport { createPortal } from \"react-dom\"\nimport { sanitizeForDisplay } from \"../../html\"\nimport type { DisplayGap, DisplayInlineEmbed, DisplayTextEmbed } from \"../../shared/types\"\nimport { cn } from \"../../lib/utils\"\n\n/**\n * Renders HTML content with proper MathML support\n * Uses innerHTML assignment to preserve MathML structure\n */\nexport function HTMLContent({\n html,\n className,\n inlineEmbeds,\n textEmbeds,\n gapEmbeds,\n renderInline,\n renderTextEntry,\n renderGap\n}: {\n html: string\n className?: string\n inlineEmbeds?: Record<string, DisplayInlineEmbed>\n textEmbeds?: Record<string, DisplayTextEmbed>\n gapEmbeds?: Record<string, DisplayGap>\n renderInline?: (embed: DisplayInlineEmbed) => React.ReactElement\n renderTextEntry?: (embed: DisplayTextEmbed) => React.ReactElement\n renderGap?: (gap: DisplayGap) => React.ReactElement\n}) {\n // Create a ref to handle MathML fallback if needed\n const containerRef = React.useRef<HTMLDivElement>(null)\n const [targets, setTargets] = React.useState<Record<string, Element>>({})\n\n // Sanitize incoming HTML to strip unsafe and layout-breaking attributes\n const safeHtml = React.useMemo(() => sanitizeForDisplay(html), [html])\n\n // Apply sanitized HTML to the container whenever it changes, and find targets\n React.useEffect(() => {\n const el = containerRef.current\n if (!el) return\n el.innerHTML = safeHtml\n\n const newTargets: Record<string, Element> = {}\n\n // Find inline dropdown placeholders\n if (inlineEmbeds) {\n const nodes = el.querySelectorAll(\"[data-qti-inline]\")\n for (const node of nodes) {\n const responseId = node.getAttribute(\"data-qti-inline\")\n if (responseId && inlineEmbeds[responseId]) {\n newTargets[responseId] = node\n }\n }\n }\n\n // Find text entry placeholders\n if (textEmbeds) {\n const nodes = el.querySelectorAll(\"[data-qti-text-entry]\")\n for (const node of nodes) {\n const responseId = node.getAttribute(\"data-qti-text-entry\")\n if (responseId && textEmbeds[responseId]) {\n newTargets[responseId] = node\n }\n }\n }\n\n // Find gap placeholders (for gap match interactions)\n if (gapEmbeds) {\n const nodes = el.querySelectorAll(\"[data-qti-gap]\")\n for (const node of nodes) {\n const gapId = node.getAttribute(\"data-qti-gap\")\n if (gapId && gapEmbeds[gapId]) {\n newTargets[`gap-${gapId}`] = node\n }\n }\n }\n\n setTargets(newTargets)\n }, [safeHtml, inlineEmbeds, textEmbeds, gapEmbeds]) // Re-scan if structure changes\n\n // Render portals declaratively based on targets\n // This ensures React reconciles them properly even if renderTextEntry changes identity\n const portals = React.useMemo(() => {\n const items: React.ReactNode[] = []\n\n if (inlineEmbeds && renderInline) {\n for (const [id, embed] of Object.entries(inlineEmbeds)) {\n const target = targets[id]\n if (target) {\n items.push(createPortal(renderInline(embed), target, id))\n }\n }\n }\n\n if (textEmbeds && renderTextEntry) {\n for (const [id, embed] of Object.entries(textEmbeds)) {\n const target = targets[id]\n if (target) {\n items.push(createPortal(renderTextEntry(embed), target, id))\n }\n }\n }\n\n if (gapEmbeds && renderGap) {\n for (const [id, gap] of Object.entries(gapEmbeds)) {\n const target = targets[`gap-${id}`]\n if (target) {\n items.push(createPortal(renderGap(gap), target, `gap-${id}`))\n }\n }\n }\n\n return items\n }, [targets, inlineEmbeds, textEmbeds, gapEmbeds, renderInline, renderTextEntry, renderGap])\n\n React.useEffect(() => {\n // Check if MathML is supported\n const checkMathMLSupport = () => {\n const mml = document.createElement(\"math\")\n mml.innerHTML = \"<mspace/>\"\n const firstChild = mml.firstChild\n return firstChild instanceof Element && firstChild.namespaceURI === \"http://www.w3.org/1998/Math/MathML\"\n }\n\n // If MathML is not supported, we could add fallback logic here\n if (!checkMathMLSupport() && containerRef.current?.querySelector(\"math\")) {\n // Intentionally quiet: sanitized HTML is still rendered\n }\n }, [])\n\n return (\n <>\n <div\n ref={containerRef}\n className={cn(\n \"qti-html-content text-foreground text-lg font-medium leading-relaxed\",\n // Ensure images never stretch or overflow\n \"[&_img]:max-w-full [&_img]:h-auto [&_img]:w-auto [&_img]:object-contain [&_img]:block [&_img]:mx-auto\",\n className\n )}\n />\n {portals}\n </>\n )\n}\n\nexport default HTMLContent\n","\"use client\"\n\nimport { HTMLContent } from \"./shared/html-content\"\n\nexport function FeedbackMessage({\n\tresponseId,\n\tshowFeedback,\n\tperResponseFeedback\n}: {\n\tresponseId: string\n\tshowFeedback?: boolean\n\tperResponseFeedback?: Record<string, { isCorrect: boolean; messageHtml?: string }>\n}) {\n\tif (!showFeedback) return null\n\tconst entry = perResponseFeedback?.[responseId]\n\tconst messageHtml = entry?.messageHtml\n\tif (!messageHtml) return null\n\tconst isCorrect = entry?.isCorrect === true\n\treturn (\n\t\t<div className=\"qti-feedback mt-3 p-6\" data-correct={isCorrect}>\n\t\t\t<HTMLContent html={messageHtml} />\n\t\t</div>\n\t)\n}\n\nexport default FeedbackMessage\n","\"use client\"\n\nimport * as React from \"react\"\nimport * as RadioGroupPrimitive from \"@radix-ui/react-radio-group\"\nimport * as CheckboxPrimitive from \"@radix-ui/react-checkbox\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"../lib/utils\"\n\nconst choiceIndicatorVariants = cva(\n [\n \"cursor-pointer shrink-0 rounded-xs size-6 text-xs font-extrabold flex items-center justify-center outline-none\",\n \"disabled:cursor-not-allowed disabled:opacity-50\",\n \"data-[state=unchecked]:bg-background data-[state=unchecked]:border-2 data-[state=unchecked]:border-input data-[state=unchecked]:text-muted-foreground\",\n \"data-[state=checked]:border-2 data-[state=checked]:border-[var(--choice-complement)] data-[state=checked]:text-[var(--choice-foreground)]\",\n \"data-[filled=true]:data-[state=checked]:bg-[var(--choice-complement)]\",\n \"data-[filled=true]:data-[state=checked]:shadow-[inset_0_0_0_2px_rgb(255_255_255)] dark:data-[filled=true]:data-[state=checked]:shadow-[inset_0_0_0_2px_rgb(255_255_255)]\",\n \"focus-visible:ring-[var(--choice-complement)] focus-visible:ring-[3px]\",\n \"aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive\",\n ],\n {\n variants: {\n palette: {\n default: [\n \"[--choice-foreground:var(--color-foreground)]\",\n \"[--choice-complement:var(--color-muted-foreground)]\",\n ],\n betta: [\n \"[--choice-foreground:var(--color-betta)]\",\n \"[--choice-complement:var(--color-butterfly)]\",\n ],\n cardinal: [\n \"[--choice-foreground:var(--color-cardinal)]\",\n \"[--choice-complement:var(--color-fire-ant)]\",\n ],\n bee: [\n \"[--choice-foreground:var(--color-bee)]\",\n \"[--choice-complement:var(--color-lion)]\",\n ],\n owl: [\n \"[--choice-foreground:var(--color-owl)]\",\n \"[--choice-complement:var(--color-tree-frog)]\",\n ],\n macaw: [\n \"[--choice-foreground:var(--color-macaw)]\",\n \"[--choice-complement:var(--color-whale)]\",\n ],\n },\n },\n defaultVariants: {\n palette: \"default\",\n },\n }\n)\n\ninterface ChoiceIndicatorProps extends VariantProps<typeof choiceIndicatorVariants> {\n letter?: string\n type?: \"radio\" | \"checkbox\"\n showLetter?: boolean\n className?: string\n id?: string\n value?: string\n checked?: boolean\n onCheckedChange?: (checked: boolean) => void\n disabled?: boolean\n palette?: \"default\" | \"betta\" | \"cardinal\" | \"bee\" | \"owl\" | \"macaw\"\n}\n\nfunction ChoiceIndicator({\n className,\n palette = \"default\",\n letter,\n type = \"radio\",\n showLetter = true,\n ...props\n}: ChoiceIndicatorProps) {\n const baseClassName = cn(choiceIndicatorVariants({ palette }), className)\n\n if (type === \"checkbox\") {\n const checkboxProps = props as React.ComponentProps<typeof CheckboxPrimitive.Root>\n return (\n <CheckboxPrimitive.Root\n data-slot=\"choice-indicator\"\n data-palette={palette}\n data-filled={!showLetter}\n className={baseClassName}\n {...checkboxProps}\n >\n {showLetter && (\n <span className=\"data-[state=unchecked]:block data-[state=checked]:hidden\">\n {letter}\n </span>\n )}\n </CheckboxPrimitive.Root>\n )\n }\n\n const radioProps = props as React.ComponentProps<typeof RadioGroupPrimitive.Item>\n return (\n <RadioGroupPrimitive.Item\n data-slot=\"choice-indicator\"\n data-palette={palette}\n className={baseClassName}\n {...radioProps}\n >\n {letter}\n </RadioGroupPrimitive.Item>\n )\n}\n\nexport { ChoiceIndicator, choiceIndicatorVariants }\n","\"use client\"\n\nimport * as React from \"react\"\nimport * as LabelPrimitive from \"@radix-ui/react-label\"\n\nimport { cn } from \"../lib/utils\"\n\nfunction Label({\n className,\n ...props\n}: React.ComponentProps<typeof LabelPrimitive.Root>) {\n return (\n <LabelPrimitive.Root\n data-slot=\"label\"\n className={cn(\n \"flex items-center gap-2 text-sm leading-none font-medium select-none group-data-[disabled=true]:pointer-events-none group-data-[disabled=true]:opacity-50 peer-disabled:cursor-not-allowed peer-disabled:opacity-50\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport { Label }\n","\"use client\"\n\nimport { useMemo } from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn, type Palette } from \"../lib/utils\"\nimport { Label } from \"./label\"\nimport { Separator } from \"./separator\"\n\nfunction FieldSet({ className, ...props }: React.ComponentProps<\"fieldset\">) {\n return (\n <fieldset\n data-slot=\"field-set\"\n className={cn(\n \"flex flex-col gap-6\",\n \"has-[>[data-slot=checkbox-group]]:gap-3 has-[>[data-slot=radio-group]]:gap-3\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction FieldLegend({\n className,\n variant = \"legend\",\n ...props\n}: React.ComponentProps<\"legend\"> & { variant?: \"legend\" | \"label\" }) {\n return (\n <legend\n data-slot=\"field-legend\"\n data-variant={variant}\n className={cn(\n \"mb-3 font-medium\",\n \"data-[variant=legend]:text-base\",\n \"data-[variant=label]:text-sm\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction FieldGroup({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"field-group\"\n className={cn(\n \"group/field-group @container/field-group flex w-full flex-col gap-7 data-[slot=checkbox-group]:gap-3 [&>[data-slot=field-group]]:gap-4\",\n className\n )}\n {...props}\n />\n )\n}\n\nconst fieldVariants = cva(\n \"group/field flex w-full gap-3 data-[invalid=true]:text-destructive\",\n {\n variants: {\n orientation: {\n vertical: [\"flex-col [&>*]:w-full [&>.sr-only]:w-auto\"],\n horizontal: [\n \"flex-row items-center\",\n \"[&>[data-slot=field-label]]:flex-auto\",\n \"has-[>[data-slot=field-content]]:items-start has-[>[data-slot=field-content]]:[&>[role=checkbox],[role=radio]]:mt-px\",\n ],\n responsive: [\n \"flex-col [&>*]:w-full [&>.sr-only]:w-auto @md/field-group:flex-row @md/field-group:items-center @md/field-group:[&>*]:w-auto\",\n \"@md/field-group:[&>[data-slot=field-label]]:flex-auto\",\n \"@md/field-group:has-[>[data-slot=field-content]]:items-start @md/field-group:has-[>[data-slot=field-content]]:[&>[role=checkbox],[role=radio]]:mt-px\",\n ],\n },\n },\n defaultVariants: {\n orientation: \"vertical\",\n },\n }\n)\n\nfunction Field({\n className,\n orientation = \"vertical\",\n ...props\n}: React.ComponentProps<\"div\"> & VariantProps<typeof fieldVariants>) {\n return (\n <div\n role=\"group\"\n data-slot=\"field\"\n data-orientation={orientation}\n className={cn(fieldVariants({ orientation }), className)}\n {...props}\n />\n )\n}\n\nfunction FieldContent({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"field-content\"\n className={cn(\n \"group/field-content flex flex-1 flex-col gap-1.5 leading-snug\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction FieldLabel({\n className,\n palette = \"default\",\n ...props\n}: React.ComponentProps<typeof Label> & {\n palette?: Palette\n}) {\n return (\n <Label\n data-slot=\"field-label\"\n data-palette={palette}\n className={cn(\n \"group/field-label peer/field-label flex w-fit gap-2 leading-snug cursor-pointer\",\n \"group-data-[disabled=true]/field:opacity-50\",\n \"has-[>[data-slot=field]]:w-full has-[>[data-slot=field]]:flex-col has-[>[data-slot=field]]:rounded-xs has-[>[data-slot=field]]:p-4\",\n \"has-[>[data-slot=field]]:border-2 has-[>[data-slot=field]]:shadow-[0_2px_0_var(--field-complement)]\",\n \"has-[>[data-slot=field]]:hover:brightness-90 dark:has-[>[data-slot=field]]:hover:brightness-75\",\n \"has-[>[data-slot=field]]:active:shadow-none has-[>[data-slot=field]]:active:translate-y-[2px]\",\n \"[--field-background:var(--color-background)]\",\n \"[--field-complement:var(--color-accent)]\",\n \"has-[>[data-slot=field]]:bg-[var(--field-background)] has-[>[data-slot=field]]:border-accent has-[>[data-slot=field]]:text-foreground\",\n \"has-[>[data-slot=field]]:has-data-[state=checked]:bg-[var(--field-foreground)]/10 has-[>[data-slot=field]]:has-data-[state=checked]:border-[var(--field-complement)] has-[>[data-slot=field]]:has-data-[state=checked]:text-[var(--field-foreground)]\",\n \"has-data-[state=checked]:[--field-complement:var(--field-shadow)]\",\n \"data-[palette=default]:[--field-foreground:var(--color-foreground)] data-[palette=default]:[--field-shadow:var(--color-muted-foreground)]\",\n \"data-[palette=betta]:[--field-foreground:var(--color-betta)] data-[palette=betta]:[--field-shadow:var(--color-butterfly)]\",\n \"data-[palette=cardinal]:[--field-foreground:var(--color-cardinal)] data-[palette=cardinal]:[--field-shadow:var(--color-fire-ant)]\",\n \"data-[palette=bee]:[--field-foreground:var(--color-bee)] data-[palette=bee]:[--field-shadow:var(--color-lion)]\",\n \"data-[palette=owl]:[--field-foreground:var(--color-owl)] data-[palette=owl]:[--field-shadow:var(--color-tree-frog)]\",\n \"data-[palette=macaw]:[--field-foreground:var(--color-macaw)] data-[palette=macaw]:[--field-shadow:var(--color-whale)]\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction FieldTitle({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"field-label\"\n className={cn(\n \"flex w-fit items-center gap-2 text-sm leading-snug font-medium group-data-[disabled=true]/field:opacity-50\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction FieldDescription({ className, ...props }: React.ComponentProps<\"p\">) {\n return (\n <p\n data-slot=\"field-description\"\n className={cn(\n \"text-muted-foreground text-sm leading-normal font-normal group-has-[[data-orientation=horizontal]]/field:text-balance\",\n \"last:mt-0 nth-last-2:-mt-1 [[data-variant=legend]+&]:-mt-1.5\",\n \"[&>a:hover]:text-primary [&>a]:underline [&>a]:underline-offset-4\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction FieldSeparator({\n children,\n className,\n ...props\n}: React.ComponentProps<\"div\"> & {\n children?: React.ReactNode\n}) {\n return (\n <div\n data-slot=\"field-separator\"\n data-content={!!children}\n className={cn(\n \"relative -my-2 h-5 text-sm group-data-[variant=outline]/field-group:-mb-2\",\n className\n )}\n {...props}\n >\n <Separator className=\"absolute inset-0 top-1/2\" />\n {children && (\n <span\n className=\"bg-background text-muted-foreground relative mx-auto block w-fit px-2\"\n data-slot=\"field-separator-content\"\n >\n {children}\n </span>\n )}\n </div>\n )\n}\n\nfunction FieldError({\n className,\n children,\n errors,\n ...props\n}: React.ComponentProps<\"div\"> & {\n errors?: Array<{ message?: string } | undefined>\n}) {\n const content = useMemo(() => {\n if (children) {\n return children\n }\n\n if (!errors?.length) {\n return null\n }\n\n const uniqueErrors = [\n ...new Map(errors.map((error) => [error?.message, error])).values(),\n ]\n\n if (uniqueErrors?.length == 1) {\n return uniqueErrors[0]?.message\n }\n\n return (\n <ul className=\"ml-4 flex list-disc flex-col gap-1\">\n {uniqueErrors.map(\n (error, index) =>\n error?.message && <li key={index}>{error.message}</li>\n )}\n </ul>\n )\n }, [children, errors])\n\n if (!content) {\n return null\n }\n\n return (\n <div\n role=\"alert\"\n data-slot=\"field-error\"\n className={cn(\"text-destructive text-sm font-normal\", className)}\n {...props}\n >\n {content}\n </div>\n )\n}\n\nexport {\n Field,\n FieldLabel,\n FieldDescription,\n FieldError,\n FieldGroup,\n FieldLegend,\n FieldSeparator,\n FieldSet,\n FieldContent,\n FieldTitle,\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport * as RadioGroupPrimitive from \"@radix-ui/react-radio-group\"\nimport { CircleIcon } from \"lucide-react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"../lib/utils\"\n\nconst radioGroupItemVariants = cva(\n [\n \"cursor-pointer\",\n \"hover:brightness-90 dark:hover:brightness-75\",\n \"text-[var(--radio-group-item-foreground)] bg-[var(--radio-group-item-background)] dark:bg-input/30 aspect-square size-4 shrink-0 rounded-full border outline-none\",\n \"disabled:cursor-not-allowed disabled:opacity-50\",\n \"data-[state=unchecked]:border-input\",\n \"data-[state=checked]:border-[var(--radio-group-item-complement)]\",\n \"focus-visible:ring-[var(--radio-group-item-foreground)] focus-visible:ring-[3px]\",\n \"aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive\",\n ],\n {\n variants: {\n palette: {\n default: [\n \"[--radio-group-item-background:var(--color-accent)]\",\n \"[--radio-group-item-foreground:var(--color-foreground)]\",\n \"[--radio-group-item-complement:var(--color-foreground)]\",\n ],\n betta: [\n \"[--radio-group-item-background:var(--color-accent)]\",\n \"[--radio-group-item-foreground:var(--color-betta)]\",\n \"[--radio-group-item-complement:var(--color-butterfly)]\",\n ],\n cardinal: [\n \"[--radio-group-item-background:var(--color-accent)]\",\n \"[--radio-group-item-foreground:var(--color-cardinal)]\",\n \"[--radio-group-item-complement:var(--color-fire-ant)]\",\n ],\n bee: [\n \"[--radio-group-item-background:var(--color-accent)]\",\n \"[--radio-group-item-foreground:var(--color-bee)]\",\n \"[--radio-group-item-complement:var(--color-lion)]\",\n ],\n owl: [\n \"[--radio-group-item-background:var(--color-accent)]\",\n \"[--radio-group-item-foreground:var(--color-owl)]\",\n \"[--radio-group-item-complement:var(--color-tree-frog)]\",\n ],\n macaw: [\n \"[--radio-group-item-background:var(--color-accent)]\",\n \"[--radio-group-item-foreground:var(--color-macaw)]\",\n \"[--radio-group-item-complement:var(--color-whale)]\",\n ],\n },\n },\n defaultVariants: {\n palette: \"default\",\n },\n }\n)\n\nfunction RadioGroup({\n className,\n ...props\n}: React.ComponentProps<typeof RadioGroupPrimitive.Root>) {\n return (\n <RadioGroupPrimitive.Root\n data-slot=\"radio-group\"\n className={cn(\"grid gap-3\", className)}\n {...props}\n />\n )\n}\n\nfunction RadioGroupItem({\n className,\n palette = \"default\",\n ...props\n}: React.ComponentProps<typeof RadioGroupPrimitive.Item> & VariantProps<typeof radioGroupItemVariants>) {\n return (\n <RadioGroupPrimitive.Item\n data-slot=\"radio-group-item\"\n data-palette={palette}\n className={cn(radioGroupItemVariants({ palette, className }))}\n {...props}\n >\n <RadioGroupPrimitive.Indicator\n data-slot=\"radio-group-indicator\"\n className=\"relative flex items-center justify-center\"\n >\n <CircleIcon className=\"fill-[var(--radio-group-item-foreground)] absolute top-1/2 left-1/2 size-2 -translate-x-1/2 -translate-y-1/2\" />\n </RadioGroupPrimitive.Indicator>\n </RadioGroupPrimitive.Item>\n )\n}\n\nexport { RadioGroup, RadioGroupItem, radioGroupItemVariants }\n","\"use client\"\n\nimport * as React from \"react\"\nimport { ChoiceIndicator } from \"../../ui/choice-indicator\"\nimport { Field, FieldContent, FieldGroup, FieldLabel, FieldSet, FieldTitle } from \"../../ui/field\"\nimport { RadioGroup } from \"../../ui/radio-group\"\nimport { cn } from \"../../lib/utils\"\nimport type { ChoiceInteraction } from \"../../schema\"\nimport { HTMLContent } from \"../shared/html-content\"\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface ChoiceInteractionRendererProps {\n\t/** The choice interaction to render */\n\tinteraction: ChoiceInteraction\n\t/** Current user response for this interaction */\n\tresponse?: string | string[]\n\t/** Callback when user selects an answer */\n\tonAnswerSelect?: (value: string | string[]) => void\n\t/** Whether to disable the interaction */\n\tdisabled?: boolean\n\t/** Whether submit occurred; used to lock inputs and color selections */\n\thasSubmitted?: boolean\n\t/** Idle palette (before submit) */\n\tpalette?: \"default\" | \"betta\" | \"cardinal\" | \"bee\" | \"owl\" | \"macaw\"\n\t/** Overall correctness (single-select) used for selected coloring */\n\tisCorrect?: boolean\n\t/** Per-selection correctness (multi-select) for secure highlighting */\n\tselectedChoicesCorrectness?: Array<{ id: string; isCorrect: boolean }>\n}\n\n// ============================================================================\n// Choice Interaction Renderer\n// ============================================================================\n\n/**\n * Renders a choice interaction (single or multiple choice)\n */\nexport function ChoiceInteractionRenderer({\n\tinteraction,\n\tresponse,\n\tonAnswerSelect,\n\tdisabled = false,\n\thasSubmitted,\n\tpalette = \"macaw\",\n\tisCorrect,\n\tselectedChoicesCorrectness\n}: ChoiceInteractionRendererProps) {\n\tconst isMultiple = interaction.maxChoices > 1\n\tconst selectedValues = React.useMemo(() => {\n\t\tif (!response) return []\n\t\treturn Array.isArray(response) ? response : [response]\n\t}, [response])\n\n\t// Detect if all choices are image-only (contains <img> and no text once tags are stripped)\n\tconst isImagesOnly = React.useMemo(() => {\n\t\tconst hasImg = (html: string) => html.toLowerCase().includes(\"<img\")\n\t\tconst stripped = (html: string) => html.replace(/<[^>]*>/g, \"\").trim()\n\t\treturn (\n\t\t\tinteraction.choices.length > 0 &&\n\t\t\tinteraction.choices.every((c) => hasImg(c.contentHtml) && stripped(c.contentHtml) === \"\")\n\t\t)\n\t}, [interaction.choices])\n\n\tconst choiceCount = interaction.choices.length\n\n\t// Grid layout for image-only sets\n\tconst gridClass = React.useMemo(() => {\n\t\tif (!isImagesOnly) return \"space-y-2\"\n\t\tswitch (choiceCount) {\n\t\t\tcase 4:\n\t\t\t\treturn \"grid grid-cols-2 gap-4\"\n\t\t\tcase 3:\n\t\t\t\treturn \"grid grid-cols-3 gap-4\"\n\t\t\tcase 2:\n\t\t\t\treturn \"max-w-3xl mx-auto grid grid-cols-2 gap-6\"\n\t\t\tdefault:\n\t\t\t\treturn \"grid grid-cols-2 md:grid-cols-3 gap-4\"\n\t\t}\n\t}, [isImagesOnly, choiceCount])\n\n\t// Image sizing/centering helpers applied to the content wrapper\n\tconst imageCardClass = React.useMemo(() => {\n\t\tif (!isImagesOnly) return \"\"\n\t\treturn choiceCount === 2\n\t\t\t? \"justify-center text-center [&_img]:max-h-52 md:[&_img]:max-h-60 ![&_img]:w-auto ![&_img]:h-auto ![&_img]:max-w-full ![&_img]:block [&_img]:mx-auto min-h-[220px] px-8 py-8\"\n\t\t\t: \"justify-center text-center [&_img]:max-h-40 md:[&_img]:max-h-48 ![&_img]:w-auto ![&_img]:h-auto ![&_img]:max-w-full ![&_img]:block [&_img]:mx-auto min-h-[180px]\"\n\t}, [isImagesOnly, choiceCount])\n\n\tconst handleSingleChoice = (value: string) => {\n\t\tif (!disabled && onAnswerSelect) {\n\t\t\tonAnswerSelect(value)\n\t\t}\n\t}\n\n\t// Removed unused handler in favor of inline onCheckedChange logic\n\n\t// Render prompt if present\n\tconst promptElement = interaction.promptHtml ? <HTMLContent html={interaction.promptHtml} className=\"mb-4\" /> : null\n\n\t// Single choice (radio) with Field UI\n\tif (!isMultiple) {\n\t\tconst submitted = hasSubmitted === true\n\t\treturn (\n\t\t\t<div className=\"space-y-4\">\n\t\t\t\t{promptElement}\n\t\t\t\t<RadioGroup\n\t\t\t\t\tvalue={selectedValues[0] || \"\"}\n\t\t\t\t\tonValueChange={(value) => handleSingleChoice(value)}\n\t\t\t\t\tdisabled={disabled || submitted}\n\t\t\t\t>\n\t\t\t\t\t<FieldGroup>\n\t\t\t\t\t\t<FieldSet>\n\t\t\t\t\t\t\t{isImagesOnly ? (\n\t\t\t\t\t\t\t\t<div className={gridClass}>\n\t\t\t\t\t\t\t\t\t{interaction.choices.map((choice, index) => {\n\t\t\t\t\t\t\t\t\t\tconst isSelected = selectedValues.includes(choice.identifier)\n\t\t\t\t\t\t\t\t\t\tconst choicePalette = submitted && isSelected ? (isCorrect ? \"owl\" : \"cardinal\") : palette\n\t\t\t\t\t\t\t\t\t\tconst domId = `${interaction.responseIdentifier}-${choice.identifier}`\n\t\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t\t<FieldLabel key={choice.identifier} htmlFor={domId} palette={choicePalette}>\n\t\t\t\t\t\t\t\t\t\t\t\t<Field orientation=\"horizontal\" data-disabled={disabled || submitted}>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<ChoiceIndicator\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tvalue={choice.identifier}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tid={domId}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tletter={String.fromCharCode(65 + index)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tpalette={choicePalette}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tdisabled={disabled || submitted}\n\t\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<FieldContent className={cn(imageCardClass)}>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<FieldTitle>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<HTMLContent html={choice.contentHtml} />\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</FieldTitle>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</FieldContent>\n\t\t\t\t\t\t\t\t\t\t\t\t</Field>\n\t\t\t\t\t\t\t\t\t\t\t</FieldLabel>\n\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\tinteraction.choices.map((choice, index) => {\n\t\t\t\t\t\t\t\t\tconst isSelected = selectedValues.includes(choice.identifier)\n\t\t\t\t\t\t\t\t\tconst choicePalette = submitted && isSelected ? (isCorrect ? \"owl\" : \"cardinal\") : palette\n\t\t\t\t\t\t\t\t\tconst domId = `${interaction.responseIdentifier}-${choice.identifier}`\n\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t<FieldLabel key={choice.identifier} htmlFor={domId} palette={choicePalette}>\n\t\t\t\t\t\t\t\t\t\t\t<Field orientation=\"horizontal\" data-disabled={disabled || submitted}>\n\t\t\t\t\t\t\t\t\t\t\t\t<ChoiceIndicator\n\t\t\t\t\t\t\t\t\t\t\t\t\tvalue={choice.identifier}\n\t\t\t\t\t\t\t\t\t\t\t\t\tid={domId}\n\t\t\t\t\t\t\t\t\t\t\t\t\taria-describedby={\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tsubmitted && isSelected && choice.inlineFeedbackHtml ? `${domId}-fb` : undefined\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\tletter={String.fromCharCode(65 + index)}\n\t\t\t\t\t\t\t\t\t\t\t\t\tpalette={choicePalette}\n\t\t\t\t\t\t\t\t\t\t\t\t\tdisabled={disabled || submitted}\n\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t\t<FieldContent>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<FieldTitle>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<HTMLContent html={choice.contentHtml} />\n\t\t\t\t\t\t\t\t\t\t\t\t\t</FieldTitle>\n\t\t\t\t\t\t\t\t\t\t\t\t\t{submitted && isSelected && choice.inlineFeedbackHtml ? (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<output\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tid={`${domId}-fb`}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\taria-live=\"polite\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"mt-2 pl-3 border-l-4 text-sm text-muted-foreground\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tisCorrect ? \"border-owl\" : \"border-cardinal\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<HTMLContent html={choice.inlineFeedbackHtml} />\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</output>\n\t\t\t\t\t\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t\t\t\t\t\t</FieldContent>\n\t\t\t\t\t\t\t\t\t\t\t</Field>\n\t\t\t\t\t\t\t\t\t\t</FieldLabel>\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</FieldSet>\n\t\t\t\t\t</FieldGroup>\n\t\t\t\t</RadioGroup>\n\t\t\t</div>\n\t\t)\n\t}\n\n\t// Multi-select (checkbox) with Field UI\n\tconst submitted = hasSubmitted === true\n\tconst atMax = selectedValues.length >= interaction.maxChoices\n\treturn (\n\t\t<div className=\"space-y-4\">\n\t\t\t{promptElement}\n\t\t\t<FieldGroup>\n\t\t\t\t<FieldSet>\n\t\t\t\t\t{isImagesOnly ? (\n\t\t\t\t\t\t<div className={gridClass}>\n\t\t\t\t\t\t\t{interaction.choices.map((choice, _index) => {\n\t\t\t\t\t\t\t\tconst isChecked = selectedValues.includes(choice.identifier)\n\t\t\t\t\t\t\t\tconst perSelection = selectedChoicesCorrectness?.find((c) => c.id === choice.identifier)?.isCorrect\n\t\t\t\t\t\t\t\tconst selectedCorrect = perSelection ?? (isChecked ? (isCorrect ?? false) : false)\n\t\t\t\t\t\t\t\tconst choicePalette = submitted && isChecked ? (selectedCorrect ? \"owl\" : \"cardinal\") : palette\n\t\t\t\t\t\t\t\tconst domId = `${interaction.responseIdentifier}-${choice.identifier}`\n\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t<FieldLabel key={choice.identifier} htmlFor={domId} palette={choicePalette}>\n\t\t\t\t\t\t\t\t\t\t<Field orientation=\"horizontal\" data-disabled={disabled || submitted}>\n\t\t\t\t\t\t\t\t\t\t\t<ChoiceIndicator\n\t\t\t\t\t\t\t\t\t\t\t\ttype=\"checkbox\"\n\t\t\t\t\t\t\t\t\t\t\t\tid={domId}\n\t\t\t\t\t\t\t\t\t\t\t\tshowLetter={false}\n\t\t\t\t\t\t\t\t\t\t\t\tpalette={choicePalette}\n\t\t\t\t\t\t\t\t\t\t\t\tchecked={isChecked}\n\t\t\t\t\t\t\t\t\t\t\t\tonCheckedChange={(checked) => {\n\t\t\t\t\t\t\t\t\t\t\t\t\tif (disabled || submitted || !onAnswerSelect) return\n\t\t\t\t\t\t\t\t\t\t\t\t\t// Enforce max choices: do not allow selecting new choices beyond the limit\n\t\t\t\t\t\t\t\t\t\t\t\t\tif (checked === true && !isChecked && atMax) return\n\t\t\t\t\t\t\t\t\t\t\t\t\tconst next =\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tchecked === true\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t? [...selectedValues, choice.identifier]\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t: selectedValues.filter((v) => v !== choice.identifier)\n\t\t\t\t\t\t\t\t\t\t\t\t\tonAnswerSelect(next)\n\t\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\t\tdisabled={disabled || submitted || (!isChecked && atMax)}\n\t\t\t\t\t\t\t\t\t\t\t\taria-describedby={\n\t\t\t\t\t\t\t\t\t\t\t\t\tsubmitted && isChecked && choice.inlineFeedbackHtml ? `${domId}-fb` : undefined\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t<FieldContent className={cn(imageCardClass)}>\n\t\t\t\t\t\t\t\t\t\t\t\t<FieldTitle>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<HTMLContent html={choice.contentHtml} />\n\t\t\t\t\t\t\t\t\t\t\t\t</FieldTitle>\n\t\t\t\t\t\t\t\t\t\t\t\t{submitted && isChecked && choice.inlineFeedbackHtml ? (\n\t\t\t\t\t\t\t\t\t\t\t\t\t<output\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tid={`${domId}-fb`}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\taria-live=\"polite\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"mt-2 pl-3 border-l-4 text-sm text-muted-foreground\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tselectedCorrect ? \"border-owl\" : \"border-cardinal\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<HTMLContent html={choice.inlineFeedbackHtml} />\n\t\t\t\t\t\t\t\t\t\t\t\t\t</output>\n\t\t\t\t\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t\t\t\t\t</FieldContent>\n\t\t\t\t\t\t\t\t\t\t</Field>\n\t\t\t\t\t\t\t\t\t</FieldLabel>\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t) : (\n\t\t\t\t\t\tinteraction.choices.map((choice, _index) => {\n\t\t\t\t\t\t\tconst isChecked = selectedValues.includes(choice.identifier)\n\t\t\t\t\t\t\tconst perSelection = selectedChoicesCorrectness?.find((c) => c.id === choice.identifier)?.isCorrect\n\t\t\t\t\t\t\tconst selectedCorrect = perSelection ?? (isChecked ? (isCorrect ?? false) : false)\n\t\t\t\t\t\t\tconst choicePalette = submitted && isChecked ? (selectedCorrect ? \"owl\" : \"cardinal\") : palette\n\t\t\t\t\t\t\tconst domId = `${interaction.responseIdentifier}-${choice.identifier}`\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t<FieldLabel key={choice.identifier} htmlFor={domId} palette={choicePalette}>\n\t\t\t\t\t\t\t\t\t<Field orientation=\"horizontal\" data-disabled={disabled || submitted}>\n\t\t\t\t\t\t\t\t\t\t<ChoiceIndicator\n\t\t\t\t\t\t\t\t\t\t\ttype=\"checkbox\"\n\t\t\t\t\t\t\t\t\t\t\tid={domId}\n\t\t\t\t\t\t\t\t\t\t\tshowLetter={false}\n\t\t\t\t\t\t\t\t\t\t\tpalette={choicePalette}\n\t\t\t\t\t\t\t\t\t\t\tchecked={isChecked}\n\t\t\t\t\t\t\t\t\t\t\tonCheckedChange={(checked) => {\n\t\t\t\t\t\t\t\t\t\t\t\tif (disabled || submitted || !onAnswerSelect) return\n\t\t\t\t\t\t\t\t\t\t\t\t// Enforce max choices: do not allow selecting new choices beyond the limit\n\t\t\t\t\t\t\t\t\t\t\t\tif (checked === true && !isChecked && atMax) return\n\t\t\t\t\t\t\t\t\t\t\t\tconst next =\n\t\t\t\t\t\t\t\t\t\t\t\t\tchecked === true\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t? [...selectedValues, choice.identifier]\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t: selectedValues.filter((v) => v !== choice.identifier)\n\t\t\t\t\t\t\t\t\t\t\t\tonAnswerSelect(next)\n\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\tdisabled={disabled || submitted || (!isChecked && atMax)}\n\t\t\t\t\t\t\t\t\t\t\taria-describedby={submitted && isChecked && choice.inlineFeedbackHtml ? `${domId}-fb` : undefined}\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t<FieldContent>\n\t\t\t\t\t\t\t\t\t\t\t<FieldTitle>\n\t\t\t\t\t\t\t\t\t\t\t\t<HTMLContent html={choice.contentHtml} />\n\t\t\t\t\t\t\t\t\t\t\t</FieldTitle>\n\t\t\t\t\t\t\t\t\t\t\t{submitted && isChecked && choice.inlineFeedbackHtml ? (\n\t\t\t\t\t\t\t\t\t\t\t\t<output\n\t\t\t\t\t\t\t\t\t\t\t\t\tid={`${domId}-fb`}\n\t\t\t\t\t\t\t\t\t\t\t\t\taria-live=\"polite\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"mt-2 pl-3 border-l-4 text-sm text-muted-foreground\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tselectedCorrect ? \"border-owl\" : \"border-cardinal\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<HTMLContent html={choice.inlineFeedbackHtml} />\n\t\t\t\t\t\t\t\t\t\t\t\t</output>\n\t\t\t\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t\t\t\t</FieldContent>\n\t\t\t\t\t\t\t\t\t</Field>\n\t\t\t\t\t\t\t\t</FieldLabel>\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t})\n\t\t\t\t\t)}\n\t\t\t\t</FieldSet>\n\t\t\t</FieldGroup>\n\t\t</div>\n\t)\n}\n\nexport default ChoiceInteractionRenderer\n","\"use client\"\n\nimport { closestCenter, DndContext, type DragEndEvent, DragOverlay, useDraggable, useDroppable } from \"@dnd-kit/core\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport * as React from \"react\"\nimport type { DisplayGap, DisplayGapMatchInteraction, DisplayGapText } from \"../../shared/types\"\nimport { cn } from \"../../lib/utils\"\nimport { HTMLContent } from \"../shared/html-content\"\n\n// ============================================================================\n// Safe Inline HTML - For rendering sanitized content\n// ============================================================================\n\n/**\n * Renders pre-sanitized HTML content inline.\n * Content is sanitized server-side before being sent to the client.\n */\nfunction SafeInlineHTML({ html, className }: { html: string; className?: string }) {\n\tconst ref = React.useRef<HTMLSpanElement>(null)\n\n\tReact.useLayoutEffect(() => {\n\t\tif (ref.current) {\n\t\t\tref.current.innerHTML = html\n\t\t}\n\t}, [html])\n\n\treturn <span ref={ref} className={className} />\n}\n\n// ============================================================================\n// State Helpers\n// ============================================================================\n\n/** Internal state: Map<gapId, sourceId> */\ntype GapMatchState = Record<string, string>\n\n/** Convert internal state to QTI response format: [\"sourceId gapId\", ...] */\nfunction toQtiResponse(state: GapMatchState): string[] {\n\treturn Object.entries(state).map(([gapId, sourceId]) => `${sourceId} ${gapId}`)\n}\n\n/** Convert QTI response format to internal state */\nfunction fromQtiResponse(response: string[]): GapMatchState {\n\tconst state: GapMatchState = {}\n\tfor (const pair of response) {\n\t\tconst parts = pair.split(\" \")\n\t\tconst sourceId = parts[0]\n\t\tconst gapId = parts[1]\n\t\tif (sourceId && gapId) {\n\t\t\tstate[gapId] = sourceId\n\t\t}\n\t}\n\treturn state\n}\n\n// ============================================================================\n// Palette Variants\n// ============================================================================\n\nconst gapSlotVariants = cva(\n\t[\n\t\t\"inline-flex items-center justify-center\",\n\t\t\"min-w-[4rem] min-h-[1.75rem] px-2 mx-1 my-1\",\n\t\t\"border rounded-xs align-middle\",\n\t\t\"transition-all duration-150\"\n\t],\n\t{\n\t\tvariants: {\n\t\t\tstate: {\n\t\t\t\tempty: \"border-muted-foreground/30 bg-muted/20\",\n\t\t\t\thover: \"border-macaw bg-macaw/10\",\n\t\t\t\tfilled: \"border-macaw bg-macaw/10\",\n\t\t\t\tcorrect: \"border-owl bg-owl/15\",\n\t\t\t\tincorrect: \"border-cardinal bg-cardinal/15\"\n\t\t\t}\n\t\t},\n\t\tdefaultVariants: {\n\t\t\tstate: \"empty\"\n\t\t}\n\t}\n)\n\nconst sourceTokenVariants = cva(\n\t[\n\t\t\"inline-flex items-center justify-center\",\n\t\t\"h-7 px-2 rounded-xs border-2\",\n\t\t\"text-sm font-semibold\",\n\t\t\"transition-all duration-150\",\n\t\t\"select-none\"\n\t],\n\t{\n\t\tvariants: {\n\t\t\tstate: {\n\t\t\t\tidle: \"bg-background border-border shadow-[0_2px_0_var(--color-border)] cursor-grab hover:border-macaw hover:shadow-[0_2px_0_var(--color-macaw)]\",\n\t\t\t\tselected: \"bg-macaw/15 border-macaw shadow-[0_2px_0_var(--color-whale)] ring-2 ring-macaw/30\",\n\t\t\t\tdragging: \"opacity-50 cursor-grabbing\",\n\t\t\t\tdisabled: \"opacity-50 cursor-not-allowed bg-muted/50 border-muted shadow-none\"\n\t\t\t}\n\t\t},\n\t\tdefaultVariants: {\n\t\t\tstate: \"idle\"\n\t\t}\n\t}\n)\n\n// ============================================================================\n// Draggable Source Token\n// ============================================================================\n\ninterface SourceTokenProps {\n\tid: string\n\tcontentHtml: string\n\tdisabled: boolean\n\tisSelected: boolean\n\tonClick: () => void\n\tremainingUses: number\n}\n\nfunction SourceToken({ id, contentHtml, disabled, isSelected, onClick, remainingUses }: SourceTokenProps) {\n\tconst { attributes, listeners, setNodeRef, isDragging } = useDraggable({\n\t\tid: `source-${id}`,\n\t\tdata: { type: \"source\", sourceId: id },\n\t\tdisabled: disabled || remainingUses <= 0\n\t})\n\n\tif (remainingUses <= 0) return null\n\n\t// Don't apply transform here - the DragOverlay handles the visual that follows the cursor.\n\t// The original element stays in place and fades out when dragging.\n\n\tconst getState = (): \"idle\" | \"selected\" | \"dragging\" | \"disabled\" => {\n\t\tif (disabled) return \"disabled\"\n\t\tif (isDragging) return \"dragging\"\n\t\tif (isSelected) return \"selected\"\n\t\treturn \"idle\"\n\t}\n\n\treturn (\n\t\t<button\n\t\t\tref={setNodeRef}\n\t\t\ttype=\"button\"\n\t\t\tonClick={disabled ? undefined : onClick}\n\t\t\tclassName={cn(sourceTokenVariants({ state: getState() }), \"active:cursor-grabbing\")}\n\t\t\tdisabled={disabled}\n\t\t\t{...attributes}\n\t\t\t{...listeners}\n\t\t>\n\t\t\t<SafeInlineHTML html={contentHtml} />\n\t\t\t{remainingUses > 1 && <span className=\"ml-1 text-xs text-muted-foreground\">×{remainingUses}</span>}\n\t\t</button>\n\t)\n}\n\n// ============================================================================\n// Droppable Gap Slot\n// ============================================================================\n\ninterface GapSlotProps {\n\tgapId: string\n\tfilledWith: DisplayGapText | undefined\n\tonClear: () => void\n\tonClick: () => void\n\tdisabled: boolean\n\tisCorrect?: boolean\n\thasSubmitted: boolean\n}\n\nfunction GapSlot({ gapId, filledWith, onClear, onClick, disabled, isCorrect, hasSubmitted }: GapSlotProps) {\n\tconst { setNodeRef, isOver } = useDroppable({\n\t\tid: `gap-${gapId}`,\n\t\tdata: { type: \"gap\", gapId },\n\t\tdisabled\n\t})\n\n\tconst getState = (): VariantProps<typeof gapSlotVariants>[\"state\"] => {\n\t\tif (hasSubmitted && filledWith) {\n\t\t\treturn isCorrect ? \"correct\" : \"incorrect\"\n\t\t}\n\t\tif (isOver) return \"hover\"\n\t\tif (filledWith) return \"filled\"\n\t\treturn \"empty\"\n\t}\n\n\treturn (\n\t\t<span ref={setNodeRef} className={cn(gapSlotVariants({ state: getState() }))}>\n\t\t\t{filledWith ? (\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tonClick={disabled ? undefined : onClear}\n\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"flex items-center gap-1\",\n\t\t\t\t\t\t!disabled && \"hover:text-cardinal cursor-pointer\",\n\t\t\t\t\t\tdisabled && \"cursor-default\"\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t<SafeInlineHTML html={filledWith.contentHtml} />\n\t\t\t\t\t{!disabled && <span className=\"text-xs opacity-60\">×</span>}\n\t\t\t\t</button>\n\t\t\t) : (\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tonClick={disabled ? undefined : onClick}\n\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"w-full h-full min-h-[1.5em] flex items-center justify-center\",\n\t\t\t\t\t\t!disabled && \"cursor-pointer hover:bg-macaw/5\"\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t<span className=\"opacity-30\">___</span>\n\t\t\t\t</button>\n\t\t\t)}\n\t\t</span>\n\t)\n}\n\n// ============================================================================\n// Main Gap Match Interaction Component\n// ============================================================================\n\nexport interface GapMatchInteractionProps {\n\tinteraction: DisplayGapMatchInteraction\n\tresponse?: string[]\n\tonAnswerSelect?: (value: string[]) => void\n\tdisabled?: boolean\n\thasSubmitted?: boolean\n\t/** Per-gap correctness: Record<gapId, isCorrect> */\n\tgapCorrectness?: Record<string, boolean>\n}\n\nexport function GapMatchInteraction({\n\tinteraction,\n\tresponse = [],\n\tonAnswerSelect,\n\tdisabled = false,\n\thasSubmitted = false,\n\tgapCorrectness\n}: GapMatchInteractionProps) {\n\t// Convert QTI response to internal state\n\tconst currentPairs = React.useMemo(() => fromQtiResponse(response), [response])\n\n\t// Track selected source token for click-to-place\n\tconst [selectedSourceId, setSelectedSourceId] = React.useState<string | null>(null)\n\n\t// Track active drag for overlay\n\tconst [activeDragId, setActiveDragId] = React.useState<string | null>(null)\n\tconst activeSource = React.useMemo(\n\t\t() => interaction.gapTexts.find((gt) => gt.id === activeDragId),\n\t\t[activeDragId, interaction.gapTexts]\n\t)\n\n\t// Calculate remaining uses for each source token\n\tconst getRemainingUses = (sourceId: string): number => {\n\t\tconst source = interaction.gapTexts.find((gt) => gt.id === sourceId)\n\t\tif (!source) return 0\n\t\tif (source.matchMax === 0) return 999 // Unlimited\n\t\tconst usedCount = Object.values(currentPairs).filter((id) => id === sourceId).length\n\t\treturn source.matchMax - usedCount\n\t}\n\n\t// Handle source token click (select for click-to-place)\n\tconst handleSourceClick = (sourceId: string) => {\n\t\tif (disabled || hasSubmitted) return\n\t\tsetSelectedSourceId((prev) => (prev === sourceId ? null : sourceId))\n\t}\n\n\t// Handle gap click (place selected token)\n\tconst handleGapClick = (gapId: string) => {\n\t\tif (disabled || hasSubmitted || !selectedSourceId) return\n\n\t\t// Check if source still has remaining uses\n\t\tif (getRemainingUses(selectedSourceId) <= 0) {\n\t\t\tsetSelectedSourceId(null)\n\t\t\treturn\n\t\t}\n\n\t\t// Place the selected token in the gap\n\t\tconst newPairs = { ...currentPairs, [gapId]: selectedSourceId }\n\t\tonAnswerSelect?.(toQtiResponse(newPairs))\n\t\tsetSelectedSourceId(null)\n\t}\n\n\t// Handle clearing a gap\n\tconst handleClearGap = (gapId: string) => {\n\t\tif (disabled || hasSubmitted) return\n\t\tconst newPairs = { ...currentPairs }\n\t\tdelete newPairs[gapId]\n\t\tonAnswerSelect?.(toQtiResponse(newPairs))\n\t}\n\n\t// Handle drag end (drop source on gap)\n\tconst handleDragEnd = (event: DragEndEvent) => {\n\t\tsetActiveDragId(null)\n\t\tconst { active, over } = event\n\t\tif (!over) return\n\n\t\tconst sourceData = active.data.current\n\t\tconst targetData = over.data.current\n\n\t\tif (sourceData?.type === \"source\" && targetData?.type === \"gap\") {\n\t\t\tconst sourceId = sourceData.sourceId\n\t\t\tconst gapId = targetData.gapId\n\n\t\t\tif (typeof sourceId === \"string\" && typeof gapId === \"string\") {\n\t\t\t\t// Check remaining uses\n\t\t\t\tif (getRemainingUses(sourceId) <= 0) return\n\n\t\t\t\tconst newPairs = { ...currentPairs, [gapId]: sourceId }\n\t\t\t\tonAnswerSelect?.(toQtiResponse(newPairs))\n\t\t\t}\n\t\t}\n\t}\n\n\t// Build gap embeds for HTMLContent\n\tconst gapEmbeds = React.useMemo(() => {\n\t\tconst embeds: Record<string, DisplayGap> = {}\n\t\tfor (const gap of interaction.gaps) {\n\t\t\tembeds[gap.id] = gap\n\t\t}\n\t\treturn embeds\n\t}, [interaction.gaps])\n\n\treturn (\n\t\t<DndContext\n\t\t\tcollisionDetection={closestCenter}\n\t\t\tonDragStart={(e) => {\n\t\t\t\tconst id = e.active.id\n\t\t\t\tconst sourceId = typeof id === \"string\" ? id.replace(\"source-\", \"\") : null\n\t\t\t\tsetActiveDragId(sourceId)\n\t\t\t\tsetSelectedSourceId(null) // Clear selection when dragging\n\t\t\t}}\n\t\t\tonDragEnd={handleDragEnd}\n\t\t>\n\t\t\t<div className=\"space-y-6\">\n\t\t\t\t{/* Source Pool */}\n\t\t\t\t<div\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"p-4 rounded-xl border-2 border-dashed\",\n\t\t\t\t\t\t\"flex flex-wrap gap-2 min-h-[3.5rem]\",\n\t\t\t\t\t\tdisabled || hasSubmitted ? \"bg-muted/30 border-muted\" : \"bg-muted/10 border-muted-foreground/20\"\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t{interaction.gapTexts.map((source) => (\n\t\t\t\t\t\t<SourceToken\n\t\t\t\t\t\t\tkey={source.id}\n\t\t\t\t\t\t\tid={source.id}\n\t\t\t\t\t\t\tcontentHtml={source.contentHtml}\n\t\t\t\t\t\t\tdisabled={disabled || hasSubmitted}\n\t\t\t\t\t\t\tisSelected={selectedSourceId === source.id}\n\t\t\t\t\t\t\tonClick={() => handleSourceClick(source.id)}\n\t\t\t\t\t\t\tremainingUses={getRemainingUses(source.id)}\n\t\t\t\t\t\t/>\n\t\t\t\t\t))}\n\t\t\t\t\t{interaction.gapTexts.every((s) => getRemainingUses(s.id) <= 0)}\n\t\t\t\t</div>\n\n\t\t\t\t{/* Hint for click-to-place */}\n\t\t\t\t{selectedSourceId && !disabled && !hasSubmitted && (\n\t\t\t\t\t<p className=\"text-sm text-muted-foreground animate-pulse\">Click a gap to place the selected token</p>\n\t\t\t\t)}\n\n\t\t\t\t{/* Content with Gap Slots */}\n\t\t\t\t<div className=\"leading-relaxed text-lg\">\n\t\t\t\t\t<HTMLContent\n\t\t\t\t\t\thtml={interaction.contentHtml}\n\t\t\t\t\t\tgapEmbeds={gapEmbeds}\n\t\t\t\t\t\trenderGap={(gap) => {\n\t\t\t\t\t\t\tconst sourceId = currentPairs[gap.id]\n\t\t\t\t\t\t\tconst source = interaction.gapTexts.find((gt) => gt.id === sourceId)\n\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t<GapSlot\n\t\t\t\t\t\t\t\t\tgapId={gap.id}\n\t\t\t\t\t\t\t\t\tfilledWith={source}\n\t\t\t\t\t\t\t\t\tonClear={() => handleClearGap(gap.id)}\n\t\t\t\t\t\t\t\t\tonClick={() => handleGapClick(gap.id)}\n\t\t\t\t\t\t\t\t\tdisabled={disabled || hasSubmitted}\n\t\t\t\t\t\t\t\t\tisCorrect={gapCorrectness?.[gap.id]}\n\t\t\t\t\t\t\t\t\thasSubmitted={hasSubmitted}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t}}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t{/* Drag Overlay - dropAnimation={null} prevents the slow settling lag */}\n\t\t\t<DragOverlay dropAnimation={null}>\n\t\t\t\t{activeSource ? (\n\t\t\t\t\t<div className={cn(sourceTokenVariants({ state: \"selected\" }), \"shadow-xl cursor-grabbing\")}>\n\t\t\t\t\t\t<SafeInlineHTML html={activeSource.contentHtml} />\n\t\t\t\t\t</div>\n\t\t\t\t) : null}\n\t\t\t</DragOverlay>\n\t\t</DndContext>\n\t)\n}\n\nexport default GapMatchInteraction\n","\"use client\"\n\nimport * as React from \"react\"\nimport * as SelectPrimitive from \"@radix-ui/react-select\"\nimport { CheckIcon, ChevronDownIcon, ChevronUpIcon } from \"lucide-react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"../lib/utils\"\n\nconst selectTriggerVariants = cva(\n [\n \"cursor-pointer\",\n \"hover:brightness-90 dark:hover:brightness-75\",\n \"border-[var(--select-complement)] text-[var(--select-foreground)] bg-[var(--select-background)] inline-flex items-center justify-between gap-2 align-baseline rounded-xs px-3 py-2 text-sm whitespace-nowrap outline-none\",\n \"data-[placeholder]:text-muted-foreground data-[size=default]:h-9 data-[size=sm]:h-8 *:data-[slot=select-value]:line-clamp-1 *:data-[slot=select-value]:flex *:data-[slot=select-value]:items-center *:data-[slot=select-value]:gap-2\",\n \"[&_svg:not([class*='text-'])]:text-muted-foreground [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n \"disabled:cursor-not-allowed disabled:opacity-50\",\n \"aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive\",\n ],\n {\n variants: {\n palette: {\n default: [\n \"[--select-background:var(--color-background)]\",\n \"[--select-foreground:var(--color-foreground)]\",\n \"[--select-complement:var(--color-accent)]\",\n ],\n betta: [\n \"[--select-background:var(--color-background)]\",\n \"[--select-foreground:var(--color-betta)]\",\n \"[--select-complement:var(--color-butterfly)]\",\n ],\n cardinal: [\n \"[--select-background:var(--color-background)]\",\n \"[--select-foreground:var(--color-cardinal)]\",\n \"[--select-complement:var(--color-fire-ant)]\",\n ],\n bee: [\n \"[--select-background:var(--color-background)]\",\n \"[--select-foreground:var(--color-bee)]\",\n \"[--select-complement:var(--color-lion)]\",\n ],\n owl: [\n \"[--select-background:var(--color-background)]\",\n \"[--select-foreground:var(--color-owl)]\",\n \"[--select-complement:var(--color-tree-frog)]\",\n ],\n macaw: [\n \"[--select-background:var(--color-background)]\",\n \"[--select-foreground:var(--color-macaw)]\",\n \"[--select-complement:var(--color-whale)]\",\n ],\n },\n outline: {\n true: [\"border-2 shadow-[0_2px_0_var(--select-complement)]\"],\n false: [\"border-none shadow-[0_3px_0_var(--select-complement)]\"],\n },\n },\n defaultVariants: {\n palette: \"default\",\n outline: false,\n },\n }\n)\n\nfunction Select({ ...props }: React.ComponentProps<typeof SelectPrimitive.Root>) {\n return <SelectPrimitive.Root data-slot=\"select\" {...props} />\n}\n\nfunction SelectGroup({ ...props }: React.ComponentProps<typeof SelectPrimitive.Group>) {\n return <SelectPrimitive.Group data-slot=\"select-group\" {...props} />\n}\n\nfunction SelectValue({\n className,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Value>) {\n return (\n <SelectPrimitive.Value\n data-slot=\"select-value\"\n className={cn(\"text-[var(--select-foreground)]\", className)}\n {...props}\n />\n )\n}\n\nfunction SelectTrigger({\n className,\n size = \"default\",\n palette = \"default\",\n children,\n outline = true,\n style,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Trigger> &\n VariantProps<typeof selectTriggerVariants> & {\n size?: \"sm\" | \"default\"\n }) {\n return (\n <SelectPrimitive.Trigger\n data-slot=\"select-trigger\"\n data-size={size}\n data-palette={palette}\n className={cn(selectTriggerVariants({ palette, outline, className }))}\n style={{ color: \"var(--select-foreground)\", ...style }}\n {...props}\n >\n {children}\n <SelectPrimitive.Icon asChild>\n <ChevronDownIcon className=\"size-4 opacity-50\" />\n </SelectPrimitive.Icon>\n </SelectPrimitive.Trigger>\n )\n}\n\nfunction SelectContent({\n className,\n children,\n position = \"popper\",\n align = \"center\",\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Content>) {\n return (\n <SelectPrimitive.Portal>\n <SelectPrimitive.Content\n data-slot=\"select-content\"\n className={cn(\n \"bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 relative z-50 max-h-(--radix-select-content-available-height) min-w-[8rem] origin-(--radix-select-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-xs border border-accent shadow-[0_2px_0_var(--color-accent)]\",\n position === \"popper\" &&\n \"data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1\",\n className\n )}\n position={position}\n align={align}\n {...props}\n >\n <SelectScrollUpButton />\n <SelectPrimitive.Viewport\n className={cn(\n \"p-1\",\n position === \"popper\" &&\n \"h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)] scroll-my-1\"\n )}\n >\n {children}\n </SelectPrimitive.Viewport>\n <SelectScrollDownButton />\n </SelectPrimitive.Content>\n </SelectPrimitive.Portal>\n )\n}\n\nfunction SelectLabel({\n className,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Label>) {\n return (\n <SelectPrimitive.Label\n data-slot=\"select-label\"\n className={cn(\"text-muted-foreground px-2 py-1.5 text-xs\", className)}\n {...props}\n />\n )\n}\n\nfunction SelectItem({\n className,\n children,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Item>) {\n return (\n <SelectPrimitive.Item\n data-slot=\"select-item\"\n className={cn(\n \"focus:bg-accent focus:text-accent-foreground [&_svg:not([class*='text-'])]:text-muted-foreground relative flex w-full cursor-pointer items-center gap-2 rounded-xs py-1.5 pr-8 pl-2 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 *:[span]:last:flex *:[span]:last:items-center *:[span]:last:gap-2\",\n className\n )}\n {...props}\n >\n <span className=\"absolute right-2 flex size-3.5 items-center justify-center\">\n <SelectPrimitive.ItemIndicator>\n <CheckIcon className=\"size-4\" />\n </SelectPrimitive.ItemIndicator>\n </span>\n <SelectPrimitive.ItemText>{children}</SelectPrimitive.ItemText>\n </SelectPrimitive.Item>\n )\n}\n\nfunction SelectSeparator({\n className,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Separator>) {\n return (\n <SelectPrimitive.Separator\n data-slot=\"select-separator\"\n className={cn(\"bg-border pointer-events-none -mx-1 my-1 h-px\", className)}\n {...props}\n />\n )\n}\n\nfunction SelectScrollUpButton({\n className,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.ScrollUpButton>) {\n return (\n <SelectPrimitive.ScrollUpButton\n data-slot=\"select-scroll-up-button\"\n className={cn(\"flex cursor-default items-center justify-center py-1\", className)}\n {...props}\n >\n <ChevronUpIcon className=\"size-4\" />\n </SelectPrimitive.ScrollUpButton>\n )\n}\n\nfunction SelectScrollDownButton({\n className,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.ScrollDownButton>) {\n return (\n <SelectPrimitive.ScrollDownButton\n data-slot=\"select-scroll-down-button\"\n className={cn(\"flex cursor-default items-center justify-center py-1\", className)}\n {...props}\n >\n <ChevronDownIcon className=\"size-4\" />\n </SelectPrimitive.ScrollDownButton>\n )\n}\n\nexport {\n Select,\n SelectContent,\n SelectGroup,\n SelectItem,\n SelectLabel,\n SelectScrollDownButton,\n SelectScrollUpButton,\n SelectSeparator,\n SelectTrigger,\n SelectValue,\n}\n","// Deterministic shuffle using a string seed\n\nfunction xmur3(str: string): () => number {\n\tlet h = 1779033703 ^ str.length\n\tfor (let i = 0; i < str.length; i++) {\n\t\th = Math.imul(h ^ str.charCodeAt(i), 3432918353)\n\t\th = (h << 13) | (h >>> 19)\n\t}\n\treturn () => {\n\t\th = Math.imul(h ^ (h >>> 16), 2246822507)\n\t\th = Math.imul(h ^ (h >>> 13), 3266489909)\n\t\tconst shifted = h >>> 16\n\t\th = h ^ shifted\n\t\treturn h >>> 0\n\t}\n}\n\nfunction mulberry32(seed: number): () => number {\n\tlet state = seed\n\treturn () => {\n\t\tstate = state + 0x6d2b79f5\n\t\tlet t = state\n\t\tt = Math.imul(t ^ (t >>> 15), t | 1)\n\t\tt = t ^ (t + Math.imul(t ^ (t >>> 7), t | 61))\n\t\treturn ((t ^ (t >>> 14)) >>> 0) / 4294967296\n\t}\n}\n\nexport function shuffleWithSeed<T>(items: T[], seed: string): T[] {\n\tconst out = items.slice()\n\tconst seedFn = xmur3(seed)\n\tconst rng = mulberry32(seedFn())\n\tfor (let i = out.length - 1; i > 0; i--) {\n\t\tconst j = Math.floor(rng() * (i + 1))\n\t\tconst vi = out[i]\n\t\tconst vj = out[j]\n\t\tif (vi === undefined || vj === undefined) continue\n\t\tout[i] = vj\n\t\tout[j] = vi\n\t}\n\treturn out\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from \"../../ui/select\"\nimport { sanitizeForDisplay } from \"../../html\"\nimport { shuffleWithSeed } from \"../../shared/shuffle\"\nimport type { DisplayInlineEmbed } from \"../../shared/types\"\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface InlineInteractionProps {\n\t/** Inline interaction payload to render */\n\tembed: DisplayInlineEmbed\n\t/** Current user response (single-select) */\n\tresponse?: string\n\t/** Callback when user selects an answer */\n\tonAnswerSelect?: (value: string) => void\n\t/** Whether to disable the interaction */\n\tdisabled?: boolean\n\t/** Whether submit occurred; used to lock inputs and color selections */\n\thasSubmitted?: boolean\n\t/** Idle palette (before submit) */\n\tpalette?: \"default\" | \"betta\" | \"cardinal\" | \"bee\" | \"owl\" | \"macaw\"\n\t/** Overall correctness for the selected value (single-select) */\n\tisCorrect?: boolean\n}\n\n// ============================================================================\n// Safe HTML Renderer (inline variant)\n// ============================================================================\n\n/**\n * Renders sanitized HTML inline. Uses a ref to set innerHTML after sanitization.\n * This avoids React's dangerouslySetInnerHTML prop while maintaining security.\n */\nfunction SafeInlineHTML({ html, className, style }: { html: string; className?: string; style?: React.CSSProperties }) {\n\tconst ref = React.useRef<HTMLSpanElement>(null)\n\n\tReact.useEffect(() => {\n\t\tif (ref.current) {\n\t\t\tref.current.innerHTML = sanitizeForDisplay(html)\n\t\t}\n\t}, [html])\n\n\treturn <span ref={ref} className={className} style={style} />\n}\n\n// ============================================================================\n// Inline Interaction Renderer\n// ============================================================================\n\n/**\n * Renders an inline choice interaction as a compact Select control.\n * Mirrors the UX and color rules used by the selects demo and block choice renderer.\n */\nexport function InlineInteraction({\n\tembed,\n\tresponse,\n\tonAnswerSelect,\n\tdisabled = false,\n\thasSubmitted,\n\tpalette = \"macaw\",\n\tisCorrect\n}: InlineInteractionProps) {\n\tconst hasValue = typeof response === \"string\" && response.length > 0\n\tconst neutralTriggerClass = hasValue ? \"\" : \"border-border shadow-[0_3px_0_var(--color-border)] focus-visible:ring-0\"\n\n\t// Deterministic shuffle for consistent ordering\n\tconst items = React.useMemo(() => {\n\t\treturn embed.shuffle ? shuffleWithSeed(embed.choices, embed.responseId) : embed.choices\n\t}, [embed])\n\n\t// Feedback-driven palette and invalid state\n\tconst feedbackPalette: typeof palette = hasSubmitted && hasValue ? (isCorrect ? \"owl\" : \"cardinal\") : palette\n\tconst ariaInvalid = hasSubmitted && hasValue && isCorrect === false ? true : undefined\n\n\t// Selected label HTML for the trigger (mirror menu label, but we control styling here)\n\tconst selectedLabelHtml = React.useMemo(() => {\n\t\tif (!hasValue) return \"\"\n\t\tconst found = items.find((c) => c.id === response)\n\t\treturn found?.contentHtml ?? \"\"\n\t}, [hasValue, items, response])\n\n\treturn (\n\t\t<Select\n\t\t\tvalue={hasValue ? response : \"\"}\n\t\t\tonValueChange={(value) => {\n\t\t\t\tif (!disabled && onAnswerSelect) onAnswerSelect(value)\n\t\t\t}}\n\t\t\tdisabled={disabled || hasSubmitted}\n\t\t>\n\t\t\t<SelectTrigger\n\t\t\t\tsize=\"sm\"\n\t\t\t\tclassName={neutralTriggerClass}\n\t\t\t\tpalette={hasValue ? feedbackPalette : \"default\"}\n\t\t\t\taria-invalid={ariaInvalid}\n\t\t\t>\n\t\t\t\t<SelectValue placeholder=\"Select...\">\n\t\t\t\t\t{hasValue ? (\n\t\t\t\t\t\t<SafeInlineHTML\n\t\t\t\t\t\t\thtml={selectedLabelHtml}\n\t\t\t\t\t\t\tclassName=\"text-[var(--select-foreground)]\"\n\t\t\t\t\t\t\tstyle={{ color: \"var(--select-foreground)\" }}\n\t\t\t\t\t\t/>\n\t\t\t\t\t) : null}\n\t\t\t\t</SelectValue>\n\t\t\t</SelectTrigger>\n\t\t\t<SelectContent position=\"item-aligned\">\n\t\t\t\t{items.map((c) => (\n\t\t\t\t\t<SelectItem key={c.id} value={c.id}>\n\t\t\t\t\t\t<SafeInlineHTML html={c.contentHtml} />\n\t\t\t\t\t</SelectItem>\n\t\t\t\t))}\n\t\t\t</SelectContent>\n\t\t</Select>\n\t)\n}\n\nexport default InlineInteraction\n","\"use client\"\n\nimport {\n\tclosestCenter,\n\tDndContext,\n\ttype DragEndEvent,\n\tDragOverlay,\n\tPointerSensor,\n\tuseDraggable,\n\tuseDroppable,\n\tuseSensor,\n\tuseSensors\n} from \"@dnd-kit/core\"\nimport { cva } from \"class-variance-authority\"\nimport * as React from \"react\"\nimport type { DisplayAssociableChoice, DisplayMatchInteraction } from \"../../shared/types\"\nimport { cn } from \"../../lib/utils\"\n\n// ============================================================================\n// Safe Inline HTML - For rendering sanitized content\n// ============================================================================\n\nfunction SafeInlineHTML({ html, className }: { html: string; className?: string }) {\n\tconst ref = React.useRef<HTMLSpanElement>(null)\n\n\tReact.useLayoutEffect(() => {\n\t\tif (ref.current) {\n\t\t\tref.current.innerHTML = html\n\t\t}\n\t}, [html])\n\n\treturn <span ref={ref} className={className} />\n}\n\n// ============================================================================\n// State Helpers\n// ============================================================================\n\n/** Internal state: Map<targetId, sourceId[]> */\ntype MatchState = Record<string, string[]>\n\n/** Create pair key for QTI response */\nfunction createPairKey(sourceId: string, targetId: string): string {\n\treturn `${sourceId} ${targetId}`\n}\n\n/** Convert internal state to QTI response format: [\"sourceId targetId\", ...] */\nfunction toQtiResponse(state: MatchState): string[] {\n\tconst pairs: string[] = []\n\tfor (const [targetId, sourceIds] of Object.entries(state)) {\n\t\tfor (const sourceId of sourceIds) {\n\t\t\tpairs.push(createPairKey(sourceId, targetId))\n\t\t}\n\t}\n\treturn pairs\n}\n\n/** Convert QTI response format to internal state */\nfunction fromQtiResponse(response: string[]): MatchState {\n\tconst state: MatchState = {}\n\tfor (const pair of response) {\n\t\tconst parts = pair.split(\" \")\n\t\tconst sourceId = parts[0]\n\t\tconst targetId = parts[1]\n\t\tif (sourceId && targetId) {\n\t\t\tif (!state[targetId]) {\n\t\t\t\tstate[targetId] = []\n\t\t\t}\n\t\t\tstate[targetId].push(sourceId)\n\t\t}\n\t}\n\treturn state\n}\n\n// ============================================================================\n// Variants\n// ============================================================================\n\nconst targetBoxVariants = cva(\n\t[\"flex flex-col gap-2 p-3 min-h-[8rem] min-w-[10rem]\", \"border-2 rounded-xs\", \"transition-all duration-150\"],\n\t{\n\t\tvariants: {\n\t\t\tstate: {\n\t\t\t\tempty: \"border-border border-dashed bg-muted/10\",\n\t\t\t\thover: \"border-macaw border-solid bg-macaw/10 shadow-[0_2px_0_var(--color-macaw)]\",\n\t\t\t\tfilled: \"border-macaw border-solid bg-macaw/5 shadow-[0_2px_0_var(--color-whale)]\",\n\t\t\t\tdisabled: \"opacity-60 bg-muted/30 border-dashed\"\n\t\t\t}\n\t\t},\n\t\tdefaultVariants: {\n\t\t\tstate: \"empty\"\n\t\t}\n\t}\n)\n\nconst sourceTokenVariants = cva(\n\t[\n\t\t\"inline-flex items-center justify-center\",\n\t\t\"h-7 px-2 rounded-xs border-2\",\n\t\t\"text-sm font-semibold\",\n\t\t\"transition-all duration-150\",\n\t\t\"select-none\"\n\t],\n\t{\n\t\tvariants: {\n\t\t\tstate: {\n\t\t\t\tidle: \"bg-background border-border shadow-[0_2px_0_var(--color-border)] cursor-grab hover:border-macaw hover:shadow-[0_2px_0_var(--color-macaw)]\",\n\t\t\t\tdragging: \"opacity-50 cursor-grabbing\",\n\t\t\t\tplaced: \"bg-macaw/10 border-macaw shadow-[0_2px_0_var(--color-whale)]\",\n\t\t\t\tcorrect: \"bg-owl/15 border-owl shadow-[0_2px_0_var(--color-tree-frog)]\",\n\t\t\t\tincorrect: \"bg-cardinal/15 border-cardinal shadow-[0_2px_0_var(--color-fire-ant)]\",\n\t\t\t\tdisabled: \"opacity-50 cursor-not-allowed bg-muted/50 border-muted shadow-none\"\n\t\t\t}\n\t\t},\n\t\tdefaultVariants: {\n\t\t\tstate: \"idle\"\n\t\t}\n\t}\n)\n\n// ============================================================================\n// Draggable Placed Token (can be moved between containers)\n// ============================================================================\n\ninterface PlacedTokenProps {\n\tinstanceId: string\n\tsourceId: string\n\tfromTargetId: string\n\tfromIndex: number\n\tcontentHtml: string\n\tdisabled: boolean\n\tstate: \"placed\" | \"correct\" | \"incorrect\" | \"disabled\"\n\tonRemove: () => void\n}\n\nfunction PlacedToken({\n\tinstanceId,\n\tsourceId,\n\tfromTargetId,\n\tfromIndex,\n\tcontentHtml,\n\tdisabled,\n\tstate,\n\tonRemove\n}: PlacedTokenProps) {\n\tconst canInteract = !disabled && state !== \"correct\" && state !== \"incorrect\"\n\n\tconst { attributes, listeners, setNodeRef, isDragging } = useDraggable({\n\t\tid: instanceId,\n\t\tdata: { type: \"placed\", sourceId, fromTargetId, fromIndex },\n\t\tdisabled: !canInteract\n\t})\n\n\tconst tokenState = isDragging ? \"dragging\" : state\n\n\t// Don't use disabled={} on button - it blocks drag events\n\treturn (\n\t\t<button\n\t\t\ttype=\"button\"\n\t\t\tref={setNodeRef}\n\t\t\t{...attributes}\n\t\t\t{...listeners}\n\t\t\tonClick={canInteract ? onRemove : undefined}\n\t\t\taria-disabled={!canInteract}\n\t\t\tclassName={cn(\n\t\t\t\tsourceTokenVariants({ state: tokenState }),\n\t\t\t\tcanInteract && \"cursor-grab hover:bg-muted/50 group\",\n\t\t\t\t!canInteract && \"cursor-default pointer-events-none\"\n\t\t\t)}\n\t\t>\n\t\t\t<SafeInlineHTML html={contentHtml} />\n\t\t\t{canInteract && <span className=\"text-xs opacity-40 group-hover:opacity-100 ml-1 transition-opacity\">×</span>}\n\t\t</button>\n\t)\n}\n\n// ============================================================================\n// Droppable Target Box\n// ============================================================================\n\ninterface TargetBoxProps {\n\ttarget: DisplayAssociableChoice\n\tplacedSources: Array<{ instanceId: string; source: DisplayAssociableChoice; index: number }>\n\tdisabled: boolean\n\tonRemoveSource: (instanceId: string) => void\n\tpairCorrectness?: Record<string, boolean>\n\thasSubmitted: boolean\n}\n\nfunction TargetBox({ target, placedSources, disabled, onRemoveSource, pairCorrectness, hasSubmitted }: TargetBoxProps) {\n\tconst { setNodeRef, isOver } = useDroppable({\n\t\tid: `target-${target.id}`,\n\t\tdata: { type: \"target\", targetId: target.id },\n\t\tdisabled\n\t})\n\n\tconst hasSources = placedSources.length > 0\n\n\tconst getState = (): \"empty\" | \"hover\" | \"filled\" | \"disabled\" => {\n\t\tif (disabled) return \"disabled\"\n\t\tif (isOver) return \"hover\"\n\t\tif (hasSources) return \"filled\"\n\t\treturn \"empty\"\n\t}\n\n\tconst getTokenState = (sourceId: string): \"placed\" | \"correct\" | \"incorrect\" | \"disabled\" => {\n\t\tif (hasSubmitted) {\n\t\t\tconst pairKey = createPairKey(sourceId, target.id)\n\t\t\tconst isCorrect = pairCorrectness?.[pairKey]\n\t\t\tif (isCorrect === true) return \"correct\"\n\t\t\tif (isCorrect === false) return \"incorrect\"\n\t\t}\n\t\tif (disabled) return \"disabled\"\n\t\treturn \"placed\"\n\t}\n\n\treturn (\n\t\t<div ref={setNodeRef} className={cn(targetBoxVariants({ state: getState() }))}>\n\t\t\t{/* Target Label - Inside at top */}\n\t\t\t<div className=\"text-sm font-semibold text-center pb-2 border-b border-border/50 mb-2\">\n\t\t\t\t<SafeInlineHTML html={target.contentHtml} />\n\t\t\t</div>\n\n\t\t\t{/* Placed tokens or placeholder */}\n\t\t\t{placedSources.length === 0 ? (\n\t\t\t\t<div className=\"flex-1 flex items-center justify-center text-muted-foreground/50 text-sm\">Drop here</div>\n\t\t\t) : (\n\t\t\t\t<div className=\"flex flex-col gap-2\">\n\t\t\t\t\t{placedSources.map(({ instanceId, source, index }) => (\n\t\t\t\t\t\t<PlacedToken\n\t\t\t\t\t\t\tkey={instanceId}\n\t\t\t\t\t\t\tinstanceId={instanceId}\n\t\t\t\t\t\t\tsourceId={source.id}\n\t\t\t\t\t\t\tfromTargetId={target.id}\n\t\t\t\t\t\t\tfromIndex={index}\n\t\t\t\t\t\t\tcontentHtml={source.contentHtml}\n\t\t\t\t\t\t\tdisabled={disabled || hasSubmitted}\n\t\t\t\t\t\t\tstate={getTokenState(source.id)}\n\t\t\t\t\t\t\tonRemove={() => onRemoveSource(instanceId)}\n\t\t\t\t\t\t/>\n\t\t\t\t\t))}\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</div>\n\t)\n}\n\n// ============================================================================\n// Source Pool Token\n// ============================================================================\n\ninterface SourcePoolTokenProps {\n\tsource: DisplayAssociableChoice\n\tremainingUses: number\n\tdisabled: boolean\n}\n\nfunction SourcePoolToken({ source, remainingUses, disabled }: SourcePoolTokenProps) {\n\tconst { attributes, listeners, setNodeRef, isDragging } = useDraggable({\n\t\tid: `pool-${source.id}`,\n\t\tdata: { type: \"source\", sourceId: source.id },\n\t\tdisabled: disabled || remainingUses <= 0\n\t})\n\n\tif (remainingUses <= 0) return null\n\n\tconst getState = (): \"idle\" | \"dragging\" | \"disabled\" => {\n\t\tif (isDragging) return \"dragging\"\n\t\tif (disabled) return \"disabled\"\n\t\treturn \"idle\"\n\t}\n\n\treturn (\n\t\t<div ref={setNodeRef} className={cn(sourceTokenVariants({ state: getState() }))} {...attributes} {...listeners}>\n\t\t\t<SafeInlineHTML html={source.contentHtml} />\n\t\t\t{remainingUses > 1 && <span className=\"ml-2 text-xs text-muted-foreground\">×{remainingUses}</span>}\n\t\t</div>\n\t)\n}\n\n// ============================================================================\n// Droppable Source Pool (for returning tokens)\n// ============================================================================\n\ninterface DroppablePoolProps {\n\tdisabled: boolean\n\tchildren: React.ReactNode\n}\n\nfunction DroppablePool({ disabled, children }: DroppablePoolProps) {\n\tconst { setNodeRef, isOver } = useDroppable({\n\t\tid: \"source-pool\",\n\t\tdata: { type: \"pool\" },\n\t\tdisabled\n\t})\n\n\treturn (\n\t\t<div\n\t\t\tref={setNodeRef}\n\t\t\tclassName={cn(\n\t\t\t\t\"p-4 rounded-xl border-2 border-dashed\",\n\t\t\t\t\"flex flex-wrap justify-center gap-3 min-h-[4rem]\",\n\t\t\t\t\"transition-all duration-150\",\n\t\t\t\tdisabled ? \"bg-muted/30 border-muted\" : \"bg-muted/10 border-muted-foreground/20\",\n\t\t\t\tisOver && !disabled && \"border-macaw bg-macaw/10\"\n\t\t\t)}\n\t\t>\n\t\t\t{children}\n\t\t</div>\n\t)\n}\n\n// ============================================================================\n// Main Match Interaction Component\n// ============================================================================\n\nexport interface MatchInteractionProps {\n\tinteraction: DisplayMatchInteraction\n\tresponse?: string[]\n\tonAnswerSelect?: (value: string[]) => void\n\tdisabled?: boolean\n\thasSubmitted?: boolean\n\tpairCorrectness?: Record<string, boolean>\n}\n\nexport function MatchInteraction({\n\tinteraction,\n\tresponse = [],\n\tonAnswerSelect,\n\tdisabled = false,\n\thasSubmitted = false,\n\tpairCorrectness\n}: MatchInteractionProps) {\n\t// Sensors: require 5px movement before drag starts (allows clicks to work)\n\tconst sensors = useSensors(\n\t\tuseSensor(PointerSensor, {\n\t\t\tactivationConstraint: {\n\t\t\t\tdistance: 5\n\t\t\t}\n\t\t})\n\t)\n\n\t// Convert QTI response to internal state\n\tconst currentState = React.useMemo(() => fromQtiResponse(response), [response])\n\n\t// Track active drag for overlay\n\tconst [activeDragId, setActiveDragId] = React.useState<string | null>(null)\n\tconst activeSource = React.useMemo(() => {\n\t\tif (!activeDragId) return null\n\t\t// Check if it's from pool or already placed\n\t\tconst sourceId = activeDragId.startsWith(\"pool-\") ? activeDragId.replace(\"pool-\", \"\") : activeDragId.split(\"-\")[0] // instanceId format: \"sourceId-targetId-index\"\n\t\treturn interaction.sourceChoices.find((s) => s.id === sourceId)\n\t}, [activeDragId, interaction.sourceChoices])\n\n\t// Count how many times each source is used\n\tconst getSourceUsageCount = (sourceId: string): number => {\n\t\tlet count = 0\n\t\tfor (const sources of Object.values(currentState)) {\n\t\t\tcount += sources.filter((id) => id === sourceId).length\n\t\t}\n\t\treturn count\n\t}\n\n\t// Get remaining uses for a source\n\tconst getRemainingUses = (source: DisplayAssociableChoice): number => {\n\t\tif (source.matchMax === 0) return 999 // Unlimited\n\t\treturn source.matchMax - getSourceUsageCount(source.id)\n\t}\n\n\t// Check if target can accept more\n\tconst canTargetAcceptMore = (target: DisplayAssociableChoice): boolean => {\n\t\tconst placed = currentState[target.id]?.length ?? 0\n\t\tif (target.matchMax === 0) return true // Unlimited\n\t\treturn placed < target.matchMax\n\t}\n\n\t// Handle drag end\n\tconst handleDragEnd = (event: DragEndEvent) => {\n\t\tsetActiveDragId(null)\n\t\tconst { active, over } = event\n\t\tif (!over) return\n\n\t\tconst activeData = active.data.current\n\t\tconst overData = over.data.current\n\n\t\t// Case 1: Dropping on the pool (return to bank)\n\t\tif (overData?.type === \"pool\" && activeData?.type === \"placed\") {\n\t\t\tconst fromTargetId = activeData.fromTargetId\n\t\t\tconst fromIndex = activeData.fromIndex\n\n\t\t\tif (typeof fromTargetId !== \"string\" || typeof fromIndex !== \"number\") return\n\n\t\t\t// Remove from target\n\t\t\tconst newState = { ...currentState }\n\t\t\tconst oldSources = newState[fromTargetId]\n\t\t\tif (oldSources) {\n\t\t\t\tnewState[fromTargetId] = oldSources.filter((_, i) => i !== fromIndex)\n\t\t\t\tif (newState[fromTargetId].length === 0) {\n\t\t\t\t\tdelete newState[fromTargetId]\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tonAnswerSelect?.(toQtiResponse(newState))\n\t\t\treturn\n\t\t}\n\n\t\t// Must be dropping on a target for remaining cases\n\t\tif (overData?.type !== \"target\") return\n\t\tconst toTargetId = overData.targetId\n\t\tif (typeof toTargetId !== \"string\") return\n\n\t\tconst toTarget = interaction.targetChoices.find((t) => t.id === toTargetId)\n\t\tif (!toTarget) return\n\n\t\t// Case 2: Dragging from pool to target\n\t\tif (activeData?.type === \"source\") {\n\t\t\tconst sourceId = activeData.sourceId\n\t\t\tif (typeof sourceId !== \"string\") return\n\n\t\t\tconst source = interaction.sourceChoices.find((s) => s.id === sourceId)\n\t\t\tif (!source) return\n\n\t\t\t// Check if we can add\n\t\t\tif (getRemainingUses(source) <= 0) return\n\t\t\tif (!canTargetAcceptMore(toTarget)) return\n\n\t\t\t// Add to state\n\t\t\tconst newState = { ...currentState }\n\t\t\tif (!newState[toTargetId]) {\n\t\t\t\tnewState[toTargetId] = []\n\t\t\t}\n\t\t\tnewState[toTargetId] = [...newState[toTargetId], sourceId]\n\n\t\t\tonAnswerSelect?.(toQtiResponse(newState))\n\t\t\treturn\n\t\t}\n\n\t\t// Case 3: Dragging from one target to another\n\t\tif (activeData?.type === \"placed\") {\n\t\t\tconst sourceId = activeData.sourceId\n\t\t\tconst fromTargetId = activeData.fromTargetId\n\t\t\tconst fromIndex = activeData.fromIndex\n\n\t\t\tif (typeof sourceId !== \"string\" || typeof fromTargetId !== \"string\" || typeof fromIndex !== \"number\") return\n\n\t\t\t// If dropping on the same target, do nothing\n\t\t\tif (fromTargetId === toTargetId) return\n\n\t\t\t// Check if the destination can accept more\n\t\t\tif (!canTargetAcceptMore(toTarget)) return\n\n\t\t\t// Remove from old target\n\t\t\tconst newState = { ...currentState }\n\t\t\tconst oldSources = newState[fromTargetId]\n\t\t\tif (oldSources) {\n\t\t\t\tnewState[fromTargetId] = oldSources.filter((_, i) => i !== fromIndex)\n\t\t\t\tif (newState[fromTargetId].length === 0) {\n\t\t\t\t\tdelete newState[fromTargetId]\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Add to new target\n\t\t\tif (!newState[toTargetId]) {\n\t\t\t\tnewState[toTargetId] = []\n\t\t\t}\n\t\t\tnewState[toTargetId] = [...newState[toTargetId], sourceId]\n\n\t\t\tonAnswerSelect?.(toQtiResponse(newState))\n\t\t}\n\t}\n\n\t// Handle removing a source from a target\n\tconst handleRemoveSource = (targetId: string, index: number) => {\n\t\tif (disabled || hasSubmitted) return\n\n\t\tconst newState = { ...currentState }\n\t\tconst sources = newState[targetId]\n\t\tif (sources) {\n\t\t\tnewState[targetId] = sources.filter((_, i) => i !== index)\n\t\t\tif (newState[targetId].length === 0) {\n\t\t\t\tdelete newState[targetId]\n\t\t\t}\n\t\t}\n\n\t\tonAnswerSelect?.(toQtiResponse(newState))\n\t}\n\n\t// Build placed sources for each target with instance IDs\n\tconst getPlacedSources = (targetId: string) => {\n\t\tconst sourceIds = currentState[targetId] ?? []\n\t\treturn sourceIds.map((sourceId, index) => {\n\t\t\tconst source = interaction.sourceChoices.find((s) => s.id === sourceId)\n\t\t\treturn {\n\t\t\t\tinstanceId: `${sourceId}-${targetId}-${index}`,\n\t\t\t\tsource: source ?? { id: sourceId, contentHtml: sourceId, matchMax: 1 },\n\t\t\t\tindex\n\t\t\t}\n\t\t})\n\t}\n\n\treturn (\n\t\t<DndContext\n\t\t\tsensors={sensors}\n\t\t\tcollisionDetection={closestCenter}\n\t\t\tonDragStart={(e) => {\n\t\t\t\tsetActiveDragId(String(e.active.id))\n\t\t\t}}\n\t\t\tonDragEnd={handleDragEnd}\n\t\t>\n\t\t\t<div className=\"space-y-6\">\n\t\t\t\t{/* Prompt */}\n\t\t\t\t{interaction.promptHtml && (\n\t\t\t\t\t<div className=\"text-center mb-4\">\n\t\t\t\t\t\t<SafeInlineHTML html={interaction.promptHtml} />\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\n\t\t\t\t{/* Source Pool (Bank) - Now on top, droppable to return tokens */}\n\t\t\t\t{!hasSubmitted && (\n\t\t\t\t\t<DroppablePool disabled={disabled}>\n\t\t\t\t\t\t{interaction.sourceChoices.map((source) => (\n\t\t\t\t\t\t\t<SourcePoolToken\n\t\t\t\t\t\t\t\tkey={source.id}\n\t\t\t\t\t\t\t\tsource={source}\n\t\t\t\t\t\t\t\tremainingUses={getRemainingUses(source)}\n\t\t\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t))}\n\t\t\t\t\t\t{interaction.sourceChoices.every((s) => getRemainingUses(s) <= 0) && (\n\t\t\t\t\t\t\t<div className=\"text-sm text-muted-foreground\">All items placed</div>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</DroppablePool>\n\t\t\t\t)}\n\n\t\t\t\t{/* Target Boxes (Drop zones) - Now below */}\n\t\t\t\t<div className=\"flex flex-wrap justify-center gap-4\">\n\t\t\t\t\t{interaction.targetChoices.map((target) => (\n\t\t\t\t\t\t<TargetBox\n\t\t\t\t\t\t\tkey={target.id}\n\t\t\t\t\t\t\ttarget={target}\n\t\t\t\t\t\t\tplacedSources={getPlacedSources(target.id)}\n\t\t\t\t\t\t\tdisabled={disabled || hasSubmitted}\n\t\t\t\t\t\t\tonRemoveSource={(instanceId) => {\n\t\t\t\t\t\t\t\tconst index = getPlacedSources(target.id).findIndex((p) => p.instanceId === instanceId)\n\t\t\t\t\t\t\t\tif (index !== -1) {\n\t\t\t\t\t\t\t\t\thandleRemoveSource(target.id, index)\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\tpairCorrectness={pairCorrectness}\n\t\t\t\t\t\t\thasSubmitted={hasSubmitted}\n\t\t\t\t\t\t/>\n\t\t\t\t\t))}\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t{/* Drag Overlay */}\n\t\t\t<DragOverlay dropAnimation={null}>\n\t\t\t\t{activeSource ? (\n\t\t\t\t\t<div className={cn(sourceTokenVariants({ state: \"idle\" }), \"shadow-xl cursor-grabbing\")}>\n\t\t\t\t\t\t<SafeInlineHTML html={activeSource.contentHtml} />\n\t\t\t\t\t</div>\n\t\t\t\t) : null}\n\t\t\t</DragOverlay>\n\t\t</DndContext>\n\t)\n}\n\nexport default MatchInteraction\n","\"use client\"\n\nimport {\n\tclosestCenter,\n\tDndContext,\n\ttype DragEndEvent,\n\tDragOverlay,\n\ttype DragStartEvent,\n\ttype DropAnimation,\n\tdefaultDropAnimationSideEffects,\n\tKeyboardSensor,\n\tPointerSensor,\n\tuseSensor,\n\tuseSensors\n} from \"@dnd-kit/core\"\nimport {\n\tarrayMove,\n\thorizontalListSortingStrategy,\n\tSortableContext,\n\tsortableKeyboardCoordinates,\n\tuseSortable,\n\tverticalListSortingStrategy\n} from \"@dnd-kit/sortable\"\nimport { CSS } from \"@dnd-kit/utilities\"\nimport * as React from \"react\"\nimport type { DisplayChoice, DisplayOrderInteraction } from \"../../shared/types\"\nimport { cn } from \"../../lib/utils\"\nimport { HTMLContent } from \"../shared/html-content\"\n\n// --- Drag Handle Icon ---\nfunction DragHandleIcon({ className }: { className?: string }) {\n\treturn (\n\t\t<svg\n\t\t\twidth=\"12\"\n\t\t\theight=\"12\"\n\t\t\tviewBox=\"0 0 15 15\"\n\t\t\tfill=\"none\"\n\t\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\t\tclassName={className}\n\t\t\taria-hidden=\"true\"\n\t\t\trole=\"img\"\n\t\t>\n\t\t\t<title>Drag handle</title>\n\t\t\t<path\n\t\t\t\td=\"M5.5 3C5.5 3.27614 5.27614 3.5 5 3.5C4.72386 3.5 4.5 3.27614 4.5 3C4.5 2.72386 4.72386 2.5 5 2.5C5.27614 2.5 5.5 2.72386 5.5 3ZM5.5 7.5C5.5 7.77614 5.27614 8 5 8C4.72386 8 4.5 7.77614 4.5 7.5C4.5 7.22386 4.72386 7 5 7C5.27614 7 5.5 7.22386 5.5 7.5ZM5.5 12C5.5 12.2761 5.27614 12.5 5 12.5C4.72386 12.5 4.5 12.2761 4.5 12C4.5 11.7239 4.72386 11.5 5 11.5C5.27614 11.5 5.5 11.7239 5.5 12ZM9.5 3C9.5 3.27614 9.27614 3.5 9 3.5C8.72386 3.5 8.5 3.27614 8.5 3C8.5 2.72386 8.72386 2.5 9 2.5C9.27614 2.5 9.5 2.72386 9.5 3ZM9.5 7.5C9.5 7.77614 9.27614 8 9 8C8.72386 8 8.5 7.77614 8.5 7.5C8.5 7.22386 8.72386 7 9 7C9.27614 7 9.5 7.22386 9.5 7.5ZM9.5 12C9.5 12.2761 9.27614 12.5 9 12.5C8.72386 12.5 8.5 12.2761 8.5 12C8.5 11.7239 8.72386 11.5 9 11.5C9.27614 11.5 9.5 11.7239 9.5 12Z\"\n\t\t\t\tfill=\"currentColor\"\n\t\t\t\tfillRule=\"evenodd\"\n\t\t\t\tclipRule=\"evenodd\"\n\t\t\t/>\n\t\t</svg>\n\t)\n}\n\n// --- Sortable Item ---\nfunction SortableItem({\n\tid,\n\tcontentHtml,\n\tdisabled,\n\tisHorizontal\n}: {\n\tid: string\n\tcontentHtml: string\n\tdisabled: boolean\n\tisHorizontal: boolean\n}) {\n\tconst { attributes, listeners, setNodeRef, transform, transition, isDragging } = useSortable({ id, disabled })\n\n\tconst style = {\n\t\ttransform: CSS.Transform.toString(transform),\n\t\ttransition,\n\t\topacity: isDragging ? 0.4 : 1,\n\t\tzIndex: isDragging ? 50 : (\"auto\" as const)\n\t}\n\n\treturn (\n\t\t<div\n\t\t\tref={setNodeRef}\n\t\t\tstyle={style}\n\t\t\t{...attributes}\n\t\t\t{...listeners}\n\t\t\tclassName={cn(\n\t\t\t\t\"bg-background border rounded-lg shadow-sm touch-none select-none\",\n\t\t\t\t// Styling differs based on orientation\n\t\t\t\tisHorizontal\n\t\t\t\t\t? \"px-4 py-2 min-w-[100px] flex items-center justify-center text-center\"\n\t\t\t\t\t: \"p-4 w-full flex items-center gap-3\",\n\t\t\t\tdisabled\n\t\t\t\t\t? \"cursor-default opacity-90 bg-muted/50\"\n\t\t\t\t\t: \"cursor-grab active:cursor-grabbing hover:border-macaw/50 hover:shadow-md\"\n\t\t\t)}\n\t\t>\n\t\t\t{!isHorizontal && (\n\t\t\t\t<div className=\"text-muted-foreground shrink-0\">\n\t\t\t\t\t<DragHandleIcon />\n\t\t\t\t</div>\n\t\t\t)}\n\t\t\t<HTMLContent html={contentHtml} />\n\t\t</div>\n\t)\n}\n\n// --- Drag Overlay Item ---\nfunction DragOverlayItem({ contentHtml, isHorizontal }: { contentHtml: string; isHorizontal: boolean }) {\n\treturn (\n\t\t<div\n\t\t\tclassName={cn(\n\t\t\t\t\"bg-background border-2 border-macaw rounded-lg shadow-xl cursor-grabbing z-50\",\n\t\t\t\tisHorizontal ? \"px-4 py-2 min-w-[100px] flex items-center justify-center\" : \"p-4 w-full flex items-center gap-3\"\n\t\t\t)}\n\t\t>\n\t\t\t{!isHorizontal && (\n\t\t\t\t<div className=\"text-macaw shrink-0\">\n\t\t\t\t\t<DragHandleIcon />\n\t\t\t\t</div>\n\t\t\t)}\n\t\t\t<HTMLContent html={contentHtml} />\n\t\t</div>\n\t)\n}\n\n// --- Main Component ---\nexport interface OrderInteractionProps {\n\tinteraction: DisplayOrderInteraction\n\tresponse?: string[]\n\tonAnswerSelect?: (value: string[]) => void\n\tdisabled?: boolean\n\thasSubmitted?: boolean\n\tisCorrect?: boolean\n}\n\nexport function OrderInteraction({\n\tinteraction,\n\tresponse,\n\tonAnswerSelect,\n\tdisabled,\n\thasSubmitted,\n\tisCorrect\n}: OrderInteractionProps) {\n\t// Use response if available (user state), otherwise fallback to initial shuffled order\n\tconst items = React.useMemo(() => {\n\t\tif (response && response.length > 0) {\n\t\t\t// Re-order the choices array based on the response ID list\n\t\t\tconst mapped: DisplayChoice[] = []\n\t\t\tfor (const id of response) {\n\t\t\t\tconst found = interaction.choices.find((c) => c.id === id)\n\t\t\t\tif (found) mapped.push(found)\n\t\t\t}\n\t\t\treturn mapped\n\t\t}\n\t\treturn interaction.choices\n\t}, [response, interaction.choices])\n\n\t// Local state for active drag item (for overlay)\n\tconst [activeId, setActiveId] = React.useState<string | null>(null)\n\tconst activeItem = React.useMemo(() => items.find((i) => i.id === activeId), [activeId, items])\n\n\tconst sensors = useSensors(\n\t\tuseSensor(PointerSensor),\n\t\tuseSensor(KeyboardSensor, {\n\t\t\tcoordinateGetter: sortableKeyboardCoordinates\n\t\t})\n\t)\n\n\tconst handleDragStart = (event: DragStartEvent) => {\n\t\tconst id = event.active.id\n\t\tsetActiveId(typeof id === \"string\" ? id : String(id))\n\t}\n\n\tconst handleDragEnd = (event: DragEndEvent) => {\n\t\tconst { active, over } = event\n\t\tsetActiveId(null)\n\n\t\tif (over && active.id !== over.id) {\n\t\t\tconst oldIndex = items.findIndex((item) => item.id === active.id)\n\t\t\tconst newIndex = items.findIndex((item) => item.id === over.id)\n\n\t\t\tconst newOrder = arrayMove(items, oldIndex, newIndex)\n\n\t\t\t// Notify parent\n\t\t\tonAnswerSelect?.(newOrder.map((item) => item.id))\n\t\t}\n\t}\n\n\tconst isHorizontal = interaction.orientation === \"horizontal\"\n\tconst strategy = isHorizontal ? horizontalListSortingStrategy : verticalListSortingStrategy\n\n\t// Smooth drop animation configuration\n\tconst dropAnimation: DropAnimation = {\n\t\tsideEffects: defaultDropAnimationSideEffects({\n\t\t\tstyles: { active: { opacity: \"0.4\" } }\n\t\t})\n\t}\n\n\t// Feedback container styles\n\tconst getContainerStyles = () => {\n\t\tif (!hasSubmitted) {\n\t\t\treturn \"bg-muted/30 border-transparent\"\n\t\t}\n\t\tif (isCorrect) {\n\t\t\treturn \"bg-owl/10 border-owl\"\n\t\t}\n\t\treturn \"bg-cardinal/10 border-cardinal\"\n\t}\n\n\treturn (\n\t\t<div className=\"space-y-4\">\n\t\t\t{interaction.promptHtml && <HTMLContent html={interaction.promptHtml} />}\n\n\t\t\t<DndContext\n\t\t\t\tsensors={sensors}\n\t\t\t\tcollisionDetection={closestCenter}\n\t\t\t\tonDragStart={handleDragStart}\n\t\t\t\tonDragEnd={handleDragEnd}\n\t\t\t>\n\t\t\t\t<SortableContext items={items.map((i) => i.id)} strategy={strategy} disabled={disabled || hasSubmitted}>\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\"rounded-xl p-4 transition-colors border-2\",\n\t\t\t\t\t\t\tisHorizontal ? \"flex flex-wrap gap-3\" : \"flex flex-col gap-2\",\n\t\t\t\t\t\t\tgetContainerStyles()\n\t\t\t\t\t\t)}\n\t\t\t\t\t>\n\t\t\t\t\t\t{items.map((item) => (\n\t\t\t\t\t\t\t<SortableItem\n\t\t\t\t\t\t\t\tkey={item.id}\n\t\t\t\t\t\t\t\tid={item.id}\n\t\t\t\t\t\t\t\tcontentHtml={item.contentHtml}\n\t\t\t\t\t\t\t\tdisabled={!!(disabled || hasSubmitted)}\n\t\t\t\t\t\t\t\tisHorizontal={isHorizontal}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</div>\n\t\t\t\t</SortableContext>\n\n\t\t\t\t{/* Portal Overlay for smooth visual while dragging */}\n\t\t\t\t<DragOverlay dropAnimation={dropAnimation}>\n\t\t\t\t\t{activeItem ? <DragOverlayItem contentHtml={activeItem.contentHtml} isHorizontal={isHorizontal} /> : null}\n\t\t\t\t</DragOverlay>\n\t\t\t</DndContext>\n\t\t</div>\n\t)\n}\n\nexport default OrderInteraction\n","\"use client\"\n\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport type { DisplayTextEmbed, DisplayTextInteraction } from \"../../shared/types\"\nimport { cn } from \"../../lib/utils\"\n\n// ============================================================================\n// Palette Variants (mirrors SelectTrigger pattern)\n// ============================================================================\n\nconst textEntryVariants = cva(\n\t[\n\t\t// Base styles matching Select trigger\n\t\t\"inline-flex items-center justify-center\",\n\t\t\"h-7 px-2 rounded-xs text-sm font-semibold\",\n\t\t\"bg-[var(--text-entry-background)] text-[var(--text-entry-foreground)]\",\n\t\t\"border border-[var(--text-entry-complement)]\", // border = 1px width, border-[...] = color\n\t\t\"shadow-[0_3px_0_var(--text-entry-complement)]\",\n\t\t\"transition-all duration-150\",\n\t\t\"hover:brightness-90 dark:hover:brightness-75\",\n\t\t// Placeholder and focus (no ring - matches Select component)\n\t\t\"placeholder:text-muted-foreground/60\",\n\t\t\"focus:outline-none\",\n\t\t// Disabled state\n\t\t\"disabled:cursor-not-allowed disabled:opacity-50\",\n\t\t// Invalid state\n\t\t\"aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive\"\n\t],\n\t{\n\t\tvariants: {\n\t\t\tpalette: {\n\t\t\t\tdefault: [\n\t\t\t\t\t\"[--text-entry-background:var(--color-background)]\",\n\t\t\t\t\t\"[--text-entry-foreground:var(--color-foreground)]\",\n\t\t\t\t\t\"[--text-entry-complement:var(--color-accent)]\"\n\t\t\t\t],\n\t\t\t\tbetta: [\n\t\t\t\t\t\"[--text-entry-background:var(--color-background)]\",\n\t\t\t\t\t\"[--text-entry-foreground:var(--color-betta)]\",\n\t\t\t\t\t\"[--text-entry-complement:var(--color-butterfly)]\"\n\t\t\t\t],\n\t\t\t\tcardinal: [\n\t\t\t\t\t\"[--text-entry-background:hsl(var(--cardinal)/0.15)]\",\n\t\t\t\t\t\"[--text-entry-foreground:var(--color-cardinal)]\",\n\t\t\t\t\t\"[--text-entry-complement:var(--color-fire-ant)]\"\n\t\t\t\t],\n\t\t\t\tbee: [\n\t\t\t\t\t\"[--text-entry-background:var(--color-background)]\",\n\t\t\t\t\t\"[--text-entry-foreground:var(--color-bee)]\",\n\t\t\t\t\t\"[--text-entry-complement:var(--color-lion)]\"\n\t\t\t\t],\n\t\t\t\towl: [\n\t\t\t\t\t\"[--text-entry-background:hsl(var(--owl)/0.15)]\",\n\t\t\t\t\t\"[--text-entry-foreground:var(--color-owl)]\",\n\t\t\t\t\t\"[--text-entry-complement:var(--color-tree-frog)]\"\n\t\t\t\t],\n\t\t\t\tmacaw: [\n\t\t\t\t\t\"[--text-entry-background:var(--color-background)]\",\n\t\t\t\t\t\"[--text-entry-foreground:var(--color-macaw)]\",\n\t\t\t\t\t\"[--text-entry-complement:var(--color-whale)]\"\n\t\t\t\t]\n\t\t\t}\n\t\t},\n\t\tdefaultVariants: {\n\t\t\tpalette: \"default\"\n\t\t}\n\t}\n)\n\nexport type TextEntryPalette = NonNullable<VariantProps<typeof textEntryVariants>[\"palette\"]>\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface TextEntryInteractionProps {\n\t/** Text interaction payload (block-level) */\n\tinteraction: DisplayTextInteraction\n\t/** Current user response */\n\tresponse?: string\n\t/** Callback when user types */\n\tonAnswerSelect?: (value: string) => void\n\t/** Whether to disable the interaction */\n\tdisabled?: boolean\n\t/** Whether submit occurred; used to lock inputs and show feedback */\n\thasSubmitted?: boolean\n\t/** Color palette for the input */\n\tpalette?: TextEntryPalette\n\t/** Overall correctness for the entered value (used to switch palette after submit) */\n\tisCorrect?: boolean\n}\n\nexport interface InlineTextEntryProps {\n\t/** Text entry embed payload (inline within rich stimulus) */\n\tembed: DisplayTextEmbed\n\t/** Current user response */\n\tresponse?: string\n\t/** Callback when user types */\n\tonAnswerSelect?: (value: string) => void\n\t/** Whether to disable the interaction */\n\tdisabled?: boolean\n\t/** Whether submit occurred */\n\thasSubmitted?: boolean\n\t/** Color palette for the input */\n\tpalette?: TextEntryPalette\n\t/** Overall correctness (used to switch palette after submit) */\n\tisCorrect?: boolean\n}\n\n// ============================================================================\n// Block-level Text Entry Renderer\n// ============================================================================\n\n/**\n * Renders a block-level text entry interaction.\n * Used when text entry is a standalone interaction block (rare).\n */\nexport function TextEntryInteraction({\n\tinteraction,\n\tresponse,\n\tonAnswerSelect,\n\tdisabled = false,\n\thasSubmitted,\n\tpalette = \"macaw\",\n\tisCorrect\n}: TextEntryInteractionProps) {\n\tconst value = response ?? \"\"\n\tconst hasValue = value.length > 0\n\n\t// Determine palette based on state:\n\t// - Empty → default (grey/neutral)\n\t// - Has value, not submitted → palette prop (macaw)\n\t// - Submitted correct → owl (green)\n\t// - Submitted incorrect → cardinal (red)\n\tconst getActivePalette = (): TextEntryPalette => {\n\t\tif (hasSubmitted && hasValue) {\n\t\t\treturn isCorrect ? \"owl\" : \"cardinal\"\n\t\t}\n\t\tif (hasValue) {\n\t\t\treturn palette\n\t\t}\n\t\treturn \"default\"\n\t}\n\tconst activePalette = getActivePalette()\n\n\t// Width based on expected length with sensible defaults\n\t// Add 4ch buffer to account for px-2 padding (approx 2ch) and borders\n\tconst charWidth = interaction.expectedLength ?? 10\n\tconst inputWidth = `${Math.max(charWidth, 3) + 4}ch`\n\n\treturn (\n\t\t<div className=\"my-4 inline-block\">\n\t\t\t<input\n\t\t\t\ttype=\"text\"\n\t\t\t\tvalue={value}\n\t\t\t\tonChange={(e) => onAnswerSelect?.(e.target.value)}\n\t\t\t\tdisabled={disabled || hasSubmitted}\n\t\t\t\tplaceholder={interaction.placeholder ?? \"...\"}\n\t\t\t\tpattern={interaction.patternMask}\n\t\t\t\tclassName={cn(textEntryVariants({ palette: activePalette }))}\n\t\t\t\tstyle={{ width: inputWidth, minWidth: \"8ch\" }}\n\t\t\t\taria-invalid={hasSubmitted && hasValue && isCorrect === false ? true : undefined}\n\t\t\t/>\n\t\t</div>\n\t)\n}\n\n// ============================================================================\n// Inline Text Entry Renderer\n// ============================================================================\n\n/**\n * Renders an inline text entry interaction (embedded within rich stimulus).\n * Matches the compact styling of InlineInteraction (Select) for consistency.\n */\nexport function InlineTextEntry({\n\tembed,\n\tresponse,\n\tonAnswerSelect,\n\tdisabled = false,\n\thasSubmitted,\n\tpalette = \"macaw\",\n\tisCorrect\n}: InlineTextEntryProps) {\n\tconst value = response ?? \"\"\n\tconst hasValue = value.length > 0\n\n\t// Determine palette based on state:\n\t// - Empty → default (grey/neutral)\n\t// - Has value, not submitted → palette prop (macaw)\n\t// - Submitted correct → owl (green)\n\t// - Submitted incorrect → cardinal (red)\n\tconst getActivePalette = (): TextEntryPalette => {\n\t\tif (hasSubmitted && hasValue) {\n\t\t\treturn isCorrect ? \"owl\" : \"cardinal\"\n\t\t}\n\t\tif (hasValue) {\n\t\t\treturn palette\n\t\t}\n\t\treturn \"default\"\n\t}\n\tconst activePalette = getActivePalette()\n\n\t// Width based on expected length - keep it tight for inline use\n\t// Add 3ch buffer to account for px-2 padding and visual balance\n\tconst charWidth = embed.expectedLength ?? 4\n\tconst inputWidth = `${Math.max(charWidth, 2) + 3}ch`\n\n\treturn (\n\t\t<input\n\t\t\ttype=\"text\"\n\t\t\tvalue={value}\n\t\t\tonChange={(e) => onAnswerSelect?.(e.target.value)}\n\t\t\tdisabled={disabled || hasSubmitted}\n\t\t\tplaceholder=\"...\"\n\t\t\tpattern={embed.patternMask}\n\t\t\tclassName={cn(textEntryVariants({ palette: activePalette }), \"align-baseline\")}\n\t\t\tstyle={{ width: inputWidth, minWidth: \"6ch\" }}\n\t\t\taria-invalid={hasSubmitted && hasValue && isCorrect === false ? true : undefined}\n\t\t/>\n\t)\n}\n\nexport default TextEntryInteraction\n","\"use client\"\n\nimport * as React from \"react\"\nimport type {\n DisplayBlock,\n DisplayChoiceInteraction,\n DisplayGapMatchInteraction,\n DisplayItem,\n DisplayMatchInteraction,\n DisplayOrderInteraction\n} from \"../shared/types\"\nimport { cn } from \"../lib/utils\"\nimport type { ChoiceInteraction } from \"../schema\"\nimport { FeedbackMessage } from \"./feedback-message\"\nimport { ChoiceInteractionRenderer } from \"./interactions/choice-interaction\"\nimport { GapMatchInteraction } from \"./interactions/gap-match-interaction\"\nimport { InlineInteraction } from \"./interactions/inline-interaction\"\nimport { MatchInteraction } from \"./interactions/match-interaction\"\nimport { OrderInteraction } from \"./interactions/order-interaction\"\nimport { InlineTextEntry, TextEntryInteraction } from \"./interactions/text-entry-interaction\"\nimport { HTMLContent } from \"./shared/html-content\"\n\n// ============================================================================\n// Order Interaction Block (with auto-initialization)\n// ============================================================================\n\n/**\n * Wrapper for OrderInteraction that initializes the response with the displayed\n * order on mount. This ensures that if the user submits without interacting,\n * the current visible order is submitted (not an empty response).\n */\nfunction OrderInteractionBlock({\n interaction,\n responses,\n onAnswerSelect,\n disabled,\n showFeedback,\n perResponseFeedback\n}: {\n interaction: DisplayOrderInteraction\n responses?: Record<string, string | string[]>\n onAnswerSelect?: (responseIdentifier: string, value: string | string[]) => void\n disabled?: boolean\n showFeedback?: boolean\n perResponseFeedback?: Record<string, { isCorrect: boolean; messageHtml?: string }>\n}) {\n const response = responses?.[interaction.responseId]\n const hasInitialized = React.useRef(false)\n\n // Initialize response with displayed order on mount (if not already set)\n React.useEffect(() => {\n // Only initialize once, and only if there's no existing response\n if (hasInitialized.current) return\n if (response) return\n if (interaction.choices.length === 0) return\n if (!onAnswerSelect) return\n\n hasInitialized.current = true\n const initialOrder = interaction.choices.map((c) => c.id)\n onAnswerSelect(interaction.responseId, initialOrder)\n }, [response, interaction.choices, interaction.responseId, onAnswerSelect])\n\n // Safe casting for array response\n let responseArray: string[] = []\n if (Array.isArray(response)) {\n responseArray = response\n } else if (typeof response === \"string\") {\n responseArray = [response]\n }\n\n const feedback = perResponseFeedback?.[interaction.responseId]\n\n return (\n <>\n <OrderInteraction\n interaction={interaction}\n response={responseArray}\n onAnswerSelect={(val) => onAnswerSelect?.(interaction.responseId, val)}\n disabled={disabled}\n hasSubmitted={showFeedback}\n isCorrect={feedback?.isCorrect}\n />\n <FeedbackMessage\n responseId={interaction.responseId}\n showFeedback={showFeedback}\n perResponseFeedback={perResponseFeedback}\n />\n </>\n )\n}\n\n// ============================================================================\n// Gap Match Interaction Block\n// ============================================================================\n\n/**\n * Wrapper for GapMatchInteraction that computes per-gap correctness\n * and handles the directedPair response format.\n */\nfunction GapMatchInteractionBlock({\n interaction,\n responses,\n onAnswerSelect,\n disabled,\n showFeedback,\n perResponseFeedback,\n selectedChoicesByResponse\n}: {\n interaction: DisplayGapMatchInteraction\n responses?: Record<string, string | string[]>\n onAnswerSelect?: (responseIdentifier: string, value: string | string[]) => void\n disabled?: boolean\n showFeedback?: boolean\n perResponseFeedback?: Record<string, { isCorrect: boolean; messageHtml?: string }>\n selectedChoicesByResponse?: Record<string, Array<{ id: string; isCorrect: boolean }>>\n}) {\n const response = responses?.[interaction.responseId]\n\n // Ensure response is array\n let responseArray: string[] = []\n if (Array.isArray(response)) {\n responseArray = response\n } else if (typeof response === \"string\" && response) {\n responseArray = [response]\n }\n\n // Compute per-gap correctness from selectedChoicesByResponse\n // Each entry in selectedChoicesByResponse has id = \"sourceId gapId\" format\n const gapCorrectness = React.useMemo(() => {\n const entries = selectedChoicesByResponse?.[interaction.responseId]\n if (!entries || !showFeedback) return undefined\n\n const result: Record<string, boolean> = {}\n for (const entry of entries) {\n // Parse \"sourceId gapId\" to extract gapId\n const parts = entry.id.split(\" \")\n const gapId = parts[1]\n if (gapId) {\n result[gapId] = entry.isCorrect\n }\n }\n return result\n }, [selectedChoicesByResponse, interaction.responseId, showFeedback])\n\n return (\n <>\n <GapMatchInteraction\n interaction={interaction}\n response={responseArray}\n onAnswerSelect={(val) => onAnswerSelect?.(interaction.responseId, val)}\n disabled={disabled}\n hasSubmitted={showFeedback}\n gapCorrectness={gapCorrectness}\n />\n <FeedbackMessage\n responseId={interaction.responseId}\n showFeedback={showFeedback}\n perResponseFeedback={perResponseFeedback}\n />\n </>\n )\n}\n\n// ============================================================================\n// Match Interaction Block\n// ============================================================================\n\n/**\n * Wrapper for MatchInteraction that computes per-pair correctness\n * and handles the directedPair response format.\n */\nfunction MatchInteractionBlock({\n interaction,\n responses,\n onAnswerSelect,\n disabled,\n showFeedback,\n perResponseFeedback,\n selectedChoicesByResponse\n}: {\n interaction: DisplayMatchInteraction\n responses?: Record<string, string | string[]>\n onAnswerSelect?: (responseIdentifier: string, value: string | string[]) => void\n disabled?: boolean\n showFeedback?: boolean\n perResponseFeedback?: Record<string, { isCorrect: boolean; messageHtml?: string }>\n selectedChoicesByResponse?: Record<string, Array<{ id: string; isCorrect: boolean }>>\n}) {\n const response = responses?.[interaction.responseId]\n\n // Ensure response is array\n let responseArray: string[] = []\n if (Array.isArray(response)) {\n responseArray = response\n } else if (typeof response === \"string\" && response) {\n responseArray = [response]\n }\n\n // Compute per-pair correctness from selectedChoicesByResponse\n // Each entry in selectedChoicesByResponse has id = \"sourceId targetId\" format\n const pairCorrectness = React.useMemo(() => {\n const entries = selectedChoicesByResponse?.[interaction.responseId]\n if (!entries || !showFeedback) return undefined\n\n const result: Record<string, boolean> = {}\n for (const entry of entries) {\n // The id is already \"sourceId targetId\" format\n result[entry.id] = entry.isCorrect\n }\n return result\n }, [selectedChoicesByResponse, interaction.responseId, showFeedback])\n\n return (\n <>\n <MatchInteraction\n interaction={interaction}\n response={responseArray}\n onAnswerSelect={(val) => onAnswerSelect?.(interaction.responseId, val)}\n disabled={disabled}\n hasSubmitted={showFeedback}\n pairCorrectness={pairCorrectness}\n />\n <FeedbackMessage\n responseId={interaction.responseId}\n showFeedback={showFeedback}\n perResponseFeedback={perResponseFeedback}\n />\n </>\n )\n}\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/** Theme options for the QTI renderer */\nexport type QTITheme = \"duolingo\" | \"neobrutalist\" | (string & {})\n\n/** Feedback result for a single response */\nexport interface ResponseFeedback {\n isCorrect: boolean\n messageHtml?: string\n}\n\n/** Correctness info for selected choices */\nexport interface ChoiceCorrectness {\n id: string\n isCorrect: boolean\n}\n\n/**\n * Props for the QTIRenderer component.\n *\n * This is a **controlled, display-only component**. It renders the question\n * and captures user input, but does NOT include submit buttons or flow logic.\n * The consuming app is responsible for:\n * - Providing responses state\n * - Handling submission\n * - Providing feedback after validation\n * - Rendering buttons (Check, Try Again, Continue, etc.)\n */\nexport interface QTIRendererProps {\n /**\n * The display-safe item to render.\n * Use `buildDisplayModel()` to create this from a parsed AssessmentItem.\n */\n item: DisplayItem\n\n /**\n * Current user responses, keyed by response identifier.\n * This is a controlled component - you must manage this state.\n * @example { \"RESPONSE\": \"A\" } or { \"RESPONSE\": [\"A\", \"C\"] }\n */\n responses: Record<string, string | string[]>\n\n /**\n * Callback fired when user selects/changes an answer.\n * Update your responses state in this callback.\n */\n onResponseChange: (responseId: string, value: string | string[]) => void\n\n /**\n * Theme to apply. Defaults to \"duolingo\".\n * Available themes: \"duolingo\", \"neobrutalist\", or any custom theme\n * defined via `[data-qti-theme=\"your-theme\"]` CSS.\n */\n theme?: QTITheme\n\n /**\n * Whether to show feedback states (correct/incorrect styling).\n * Set to true after validation to display results.\n */\n showFeedback?: boolean\n\n /**\n * Whether to disable all interactions.\n * Typically set to true when showFeedback is true.\n */\n disabled?: boolean\n\n /**\n * Per-choice correctness for highlighting selected answers.\n * Keyed by response identifier.\n */\n choiceCorrectness?: Record<string, ChoiceCorrectness[]>\n\n /**\n * Per-response feedback messages to display.\n * Keyed by response identifier.\n */\n responseFeedback?: Record<string, ResponseFeedback>\n\n /**\n * Overall feedback to display at the end of the question.\n */\n overallFeedback?: ResponseFeedback\n\n /**\n * Additional CSS class for the container.\n */\n className?: string\n}\n\nexport interface ContentBlockRendererProps {\n /** The content block to render */\n block: DisplayBlock\n /** Current user responses */\n responses?: Record<string, string | string[]>\n /** Callback when user selects an answer */\n onAnswerSelect?: (responseIdentifier: string, value: string | string[]) => void\n /** Whether to show feedback */\n showFeedback?: boolean\n /** Whether to disable interactions */\n disabled?: boolean\n /** Selected-only correctness mapping for this render pass */\n selectedChoicesByResponse?: Record<string, Array<{ id: string; isCorrect: boolean }>>\n /** Optional per-response feedback messages from server */\n perResponseFeedback?: Record<string, { isCorrect: boolean; messageHtml?: string }>\n}\n\n// ============================================================================\n// Content Block Renderer\n// ============================================================================\n\n/**\n * Renders a single content block (stimulus or interaction)\n */\nexport function ContentBlockRenderer({\n block,\n responses,\n onAnswerSelect,\n showFeedback,\n disabled,\n selectedChoicesByResponse,\n perResponseFeedback\n}: ContentBlockRendererProps) {\n if (block.type === \"stimulus\") {\n return <HTMLContent html={block.html} className=\"mb-6\" />\n }\n if (block.type === \"richStimulus\") {\n // Collect all response IDs for feedback (inline choice + text entry)\n const allResponseIds = [\n ...Object.values(block.inlineEmbeds).map((e) => e.responseId),\n ...Object.values(block.textEmbeds).map((e) => e.responseId)\n ]\n\n return (\n <>\n <HTMLContent\n html={block.html}\n className=\"mb-6\"\n inlineEmbeds={block.inlineEmbeds}\n textEmbeds={block.textEmbeds}\n renderInline={(embed) => {\n const currentValue = (() => {\n const v = responses?.[embed.responseId]\n return typeof v === \"string\" ? v : \"\"\n })()\n // Compute correctness of selected value if available\n const perSelectionEntries = selectedChoicesByResponse?.[embed.responseId]\n const selectedIsCorrect =\n perSelectionEntries && currentValue\n ? perSelectionEntries.find((e) => e.id === currentValue)?.isCorrect\n : undefined\n return (\n <InlineInteraction\n embed={embed}\n response={currentValue}\n onAnswerSelect={(v) => {\n if (onAnswerSelect) onAnswerSelect(embed.responseId, v)\n }}\n disabled={disabled || showFeedback}\n hasSubmitted={showFeedback}\n isCorrect={selectedIsCorrect}\n />\n )\n }}\n renderTextEntry={(embed) => {\n const currentValue = (() => {\n const v = responses?.[embed.responseId]\n return typeof v === \"string\" ? v : \"\"\n })()\n // Text entry correctness from perResponseFeedback\n const feedback = perResponseFeedback?.[embed.responseId]\n return (\n <InlineTextEntry\n key={embed.responseId}\n embed={embed}\n response={currentValue}\n onAnswerSelect={(v) => {\n if (onAnswerSelect) onAnswerSelect(embed.responseId, v)\n }}\n disabled={disabled || showFeedback}\n hasSubmitted={showFeedback}\n isCorrect={feedback?.isCorrect}\n />\n )\n }}\n />\n {allResponseIds.map((responseId) => (\n <FeedbackMessage\n key={`fb-${responseId}`}\n responseId={responseId}\n showFeedback={showFeedback}\n perResponseFeedback={perResponseFeedback}\n />\n ))}\n </>\n )\n }\n\n if (block.type === \"interaction\" && block.interaction) {\n const interaction = block.interaction\n\n // Handle text entry interactions\n if (interaction.type === \"text\") {\n const response = responses?.[interaction.responseId]\n const currentValue = typeof response === \"string\" ? response : \"\"\n const feedback = perResponseFeedback?.[interaction.responseId]\n\n return (\n <>\n <TextEntryInteraction\n interaction={interaction}\n response={currentValue}\n onAnswerSelect={(value) => {\n if (onAnswerSelect) {\n onAnswerSelect(interaction.responseId, value)\n }\n }}\n disabled={disabled}\n hasSubmitted={showFeedback}\n isCorrect={feedback?.isCorrect}\n />\n <FeedbackMessage\n responseId={interaction.responseId}\n showFeedback={showFeedback}\n perResponseFeedback={perResponseFeedback}\n />\n </>\n )\n }\n\n // Handle choice interactions\n if (interaction.type === \"choice\") {\n const response = responses?.[interaction.responseId]\n\n // Derive single-select correctness from selectedChoicesByResponse\n let selected: string[] = []\n if (Array.isArray(response)) {\n selected = response\n } else if (typeof response === \"string\") {\n selected = [response]\n }\n const perSelectionEntries = selectedChoicesByResponse?.[interaction.responseId]\n const perSelectionTable = perSelectionEntries\n ? new Map(perSelectionEntries.map((e) => [e.id, e.isCorrect]))\n : undefined\n let singleIsCorrect: boolean | undefined\n if (interaction.cardinality === \"single\" && selected.length === 1 && perSelectionTable) {\n const firstCandidate = selected[0]\n if (typeof firstCandidate === \"string\") {\n singleIsCorrect = perSelectionTable.get(firstCandidate) === true\n }\n }\n\n const toChoiceInteraction = (d: DisplayChoiceInteraction): ChoiceInteraction => {\n return {\n type: \"choiceInteraction\",\n responseIdentifier: d.responseId,\n shuffle: false,\n minChoices: d.minChoices,\n maxChoices: d.maxChoices,\n promptHtml: d.promptHtml,\n choices: d.choices.map((c) => ({\n identifier: c.id,\n contentHtml: c.contentHtml,\n inlineFeedbackHtml: c.inlineFeedbackHtml\n }))\n }\n }\n\n return (\n <>\n <ChoiceInteractionRenderer\n interaction={toChoiceInteraction(interaction)}\n response={response}\n onAnswerSelect={(value) => {\n if (onAnswerSelect) {\n onAnswerSelect(interaction.responseId, value)\n }\n }}\n disabled={disabled}\n hasSubmitted={showFeedback}\n isCorrect={singleIsCorrect}\n selectedChoicesCorrectness={(() => {\n const entries = selectedChoicesByResponse?.[interaction.responseId]\n if (!entries) return undefined\n const table = new Map(entries.map((e) => [e.id, e.isCorrect]))\n return selected.map((id) => ({ id, isCorrect: table.get(id) === true }))\n })()}\n />\n <FeedbackMessage\n responseId={interaction.responseId}\n showFeedback={showFeedback}\n perResponseFeedback={perResponseFeedback}\n />\n </>\n )\n }\n\n // Handle order interactions (drag-and-drop sorting)\n if (interaction.type === \"order\") {\n return (\n <OrderInteractionBlock\n interaction={interaction}\n responses={responses}\n onAnswerSelect={onAnswerSelect}\n disabled={disabled}\n showFeedback={showFeedback}\n perResponseFeedback={perResponseFeedback}\n />\n )\n }\n\n // Handle gap match interactions (fill-in-the-blank with drag/click)\n if (interaction.type === \"gapMatch\") {\n return (\n <GapMatchInteractionBlock\n interaction={interaction}\n responses={responses}\n onAnswerSelect={onAnswerSelect}\n disabled={disabled}\n showFeedback={showFeedback}\n perResponseFeedback={perResponseFeedback}\n selectedChoicesByResponse={selectedChoicesByResponse}\n />\n )\n }\n\n // Handle match interactions (matrix association)\n if (interaction.type === \"match\") {\n return (\n <MatchInteractionBlock\n interaction={interaction}\n responses={responses}\n onAnswerSelect={onAnswerSelect}\n disabled={disabled}\n showFeedback={showFeedback}\n perResponseFeedback={perResponseFeedback}\n selectedChoicesByResponse={selectedChoicesByResponse}\n />\n )\n }\n }\n\n // Unknown block type\n return null\n}\n\n// ============================================================================\n// Main QTI Renderer\n// ============================================================================\n\n/**\n * A controlled, display-only component for rendering QTI assessment items.\n *\n * **This component does NOT include buttons or submission logic.**\n * The consuming app is responsible for:\n * - Managing `responses` state\n * - Rendering Check/Submit/Try Again buttons\n * - Calling validation APIs\n * - Providing feedback data after validation\n *\n * @example\n * ```tsx\n * const [responses, setResponses] = useState({})\n * const [feedback, setFeedback] = useState(null)\n *\n * <QTIRenderer\n * item={displayItem}\n * responses={responses}\n * onResponseChange={(id, value) => setResponses(prev => ({ ...prev, [id]: value }))}\n * theme=\"neobrutalist\"\n * showFeedback={!!feedback}\n * responseFeedback={feedback?.perResponse}\n * overallFeedback={feedback?.overall}\n * disabled={!!feedback}\n * />\n *\n * <button onClick={handleCheck}>Check Answer</button>\n * ```\n */\nexport function QTIRenderer({\n item,\n responses,\n onResponseChange,\n theme = \"duolingo\",\n showFeedback = false,\n disabled = false,\n choiceCorrectness,\n responseFeedback,\n overallFeedback,\n className\n}: QTIRendererProps) {\n // Determine theme attribute value (empty string for default/duolingo)\n const themeAttr = theme === \"duolingo\" ? undefined : theme\n\n return (\n <div className={cn(\"qti-container\", className)} data-qti-theme={themeAttr}>\n <div className=\"space-y-6\">\n {item.contentBlocks.map((block, index) => (\n <ContentBlockRenderer\n key={index}\n block={block}\n responses={responses}\n onAnswerSelect={onResponseChange}\n showFeedback={showFeedback}\n disabled={disabled}\n selectedChoicesByResponse={choiceCorrectness}\n perResponseFeedback={responseFeedback}\n />\n ))}\n </div>\n\n {/* Overall feedback shown at the end */}\n {showFeedback && overallFeedback?.messageHtml && (\n <div className=\"qti-feedback mt-6 p-6\" data-correct={overallFeedback.isCorrect}>\n <HTMLContent html={overallFeedback.messageHtml} />\n </div>\n )}\n </div>\n )\n}\n\nexport default QTIRenderer\n","\"use client\"\n\nimport * as React from \"react\"\nimport { cn } from \"../lib/utils\"\nimport type { AssessmentItem } from \"../schema\"\nimport type { EvaluationResult } from \"../types\"\nimport { HTMLContent } from \"./shared/html-content\"\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface QtiFeedbackBlockProps {\n\t/** The evaluation result containing feedback info */\n\tresult: EvaluationResult\n\t/** The assessment item containing feedback blocks */\n\titem: AssessmentItem\n\t/** Custom class name */\n\tclassName?: string\n}\n\n// ============================================================================\n// QTI Feedback Block Component\n// ============================================================================\n\n/**\n * Renders the appropriate feedback block based on evaluation results.\n *\n * This component handles:\n * - Finding the correct feedback block to display\n * - Styling based on correct/incorrect status\n * - Sanitizing and rendering the feedback HTML\n */\nexport function QtiFeedbackBlock({ result, item, className }: QtiFeedbackBlockProps) {\n\t// Find the feedback block to show\n\tconst feedbackBlock = React.useMemo(() => {\n\t\tif (!result.feedbackIdentifier) {\n\t\t\treturn null\n\t\t}\n\n\t\treturn item.itemBody.feedbackBlocks.find((fb) => fb.identifier === result.feedbackIdentifier)\n\t}, [result.feedbackIdentifier, item.itemBody.feedbackBlocks])\n\n\t// If no feedback to show, return null\n\tif (!feedbackBlock) {\n\t\treturn null\n\t}\n\n\tconst isCorrect = result.status === \"correct\"\n\n\treturn (\n\t\t<div className={cn(\"qti-feedback p-6\", className)} data-correct={isCorrect}>\n\t\t\t{/* Feedback header */}\n\t\t\t<div className=\"flex items-center gap-3 mb-4\">\n\t\t\t\t<div\n\t\t\t\t\tclassName=\"qti-feedback-icon flex-shrink-0 w-12 h-12 rounded-full flex items-center justify-center\"\n\t\t\t\t\tdata-correct={isCorrect}\n\t\t\t\t>\n\t\t\t\t\t{isCorrect ? (\n\t\t\t\t\t\t<svg className=\"w-8 h-8 text-white\" fill=\"currentColor\" viewBox=\"0 0 24 24\">\n\t\t\t\t\t\t\t<title>Correct</title>\n\t\t\t\t\t\t\t<path d=\"M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41L9 16.17z\" />\n\t\t\t\t\t\t</svg>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<svg className=\"w-8 h-8 text-white\" fill=\"currentColor\" viewBox=\"0 0 24 24\">\n\t\t\t\t\t\t\t<title>Incorrect</title>\n\t\t\t\t\t\t\t<path d=\"M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41z\" />\n\t\t\t\t\t\t</svg>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t\t<div className=\"flex-1\">\n\t\t\t\t\t<h3\n\t\t\t\t\t\tclassName=\"text-xl font-extrabold\"\n\t\t\t\t\t\tstyle={{ color: isCorrect ? \"var(--qti-feedback-correct-text)\" : \"var(--qti-feedback-incorrect-text)\" }}\n\t\t\t\t\t>\n\t\t\t\t\t\t{isCorrect ? \"Correct!\" : \"Incorrect\"}\n\t\t\t\t\t</h3>\n\t\t\t\t\t<p className=\"text-sm text-muted-foreground\">{isCorrect ? \"Nice work!\" : \"Try again\"}</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t{/* Feedback content */}\n\t\t\t<HTMLContent html={feedbackBlock.contentHtml} className=\"text-foreground\" />\n\t\t</div>\n\t)\n}\n\nexport default QtiFeedbackBlock\n"]}
1
+ {"version":3,"sources":["../../src/lib/utils.ts","../../src/html/sanitize.ts","../../src/components/shared/html-content.tsx","../../src/components/feedback-message.tsx","../../src/ui/choice-indicator.tsx","../../src/ui/label.tsx","../../src/ui/field.tsx","../../src/ui/radio-group.tsx","../../src/components/interactions/choice-interaction.tsx","../../src/components/interactions/gap-match-interaction.tsx","../../src/shared/shuffle.ts","../../src/ui/select.tsx","../../src/components/interactions/inline-interaction.tsx","../../src/components/interactions/match-interaction.tsx","../../src/components/interactions/order-interaction.tsx","../../src/components/interactions/text-entry-interaction.tsx","../../src/components/qti-renderer.tsx","../../src/components/qti-feedback-block.tsx"],"names":["React","jsx","cva","RadioGroupPrimitive2","React2","submitted","jsxs","SafeInlineHTML","React4","React5","toQtiResponse","fromQtiResponse","sourceTokenVariants","useDraggable","useDroppable","DndContext","closestCenter","DragOverlay","React6","useSensors","useSensor","PointerSensor","React7","Fragment","React8"],"mappings":";;;;;;;;;;;;;;;;;AAMO,SAAS,MAAM,MAAA,EAAsB;AAC3C,EAAA,OAAO,OAAA,CAAQ,IAAA,CAAK,MAAM,CAAC,CAAA;AAC5B;;;ACOA,IAAM,cAAA,GAAiC;AAAA;AAAA,EAEtC,WAAA,sBAAiB,GAAA,CAAI;AAAA;AAAA,IAEpB,GAAA;AAAA,IACA,MAAA;AAAA,IACA,KAAA;AAAA,IACA,IAAA;AAAA,IACA,IAAA;AAAA;AAAA,IAEA,GAAA;AAAA,IACA,GAAA;AAAA,IACA,GAAA;AAAA,IACA,QAAA;AAAA,IACA,IAAA;AAAA,IACA,MAAA;AAAA,IACA,OAAA;AAAA,IACA,KAAA;AAAA,IACA,KAAA;AAAA,IACA,MAAA;AAAA,IACA,KAAA;AAAA,IACA,KAAA;AAAA;AAAA,IAEA,IAAA;AAAA,IACA,IAAA;AAAA,IACA,IAAA;AAAA,IACA,IAAA;AAAA,IACA,IAAA;AAAA,IACA,IAAA;AAAA;AAAA,IAEA,OAAA;AAAA,IACA,OAAA;AAAA,IACA,OAAA;AAAA,IACA,OAAA;AAAA,IACA,IAAA;AAAA,IACA,IAAA;AAAA,IACA,IAAA;AAAA,IACA,SAAA;AAAA,IACA,UAAA;AAAA,IACA,KAAA;AAAA;AAAA,IAEA,KAAA;AAAA,IACA,OAAA;AAAA,IACA,OAAA;AAAA,IACA,QAAA;AAAA,IACA,OAAA;AAAA;AAAA,IAEA,SAAA;AAAA,IACA,SAAA;AAAA,IACA,KAAA;AAAA,IACA,OAAA;AAAA,IACA,QAAA;AAAA,IACA,QAAA;AAAA,IACA,MAAA;AAAA,IACA,QAAA;AAAA,IACA,YAAA;AAAA,IACA,YAAA;AAAA,IACA,MAAA;AAAA;AAAA,IAEA,GAAA;AAAA;AAAA,IAEA,OAAA;AAAA,IACA;AAAA,GACA,CAAA;AAAA,EAED,iBAAA,EAAmB;AAAA;AAAA,IAElB,GAAA,kBAAK,IAAI,GAAA,CAAI,CAAC,OAAA,EAAS,MAAM,MAAA,EAAQ,KAAA,EAAO,OAAA,EAAS,OAAO,CAAC,CAAA;AAAA;AAAA,IAE7D,GAAA,sBAAS,GAAA,CAAI,CAAC,OAAO,KAAA,EAAO,OAAA,EAAS,QAAA,EAAU,OAAO,CAAC,CAAA;AAAA,IACvD,mBAAG,IAAI,GAAA,CAAI,CAAC,MAAA,EAAQ,QAAA,EAAU,KAAK,CAAC,CAAA;AAAA,IACpC,KAAA,sBAAW,GAAA,CAAI,CAAC,OAAO,UAAA,EAAY,MAAA,EAAQ,OAAO,CAAC,CAAA;AAAA,IACnD,KAAA,kBAAO,IAAI,GAAA,CAAI,CAAC,KAAA,EAAO,UAAA,EAAY,MAAA,EAAQ,OAAA,EAAS,OAAA,EAAS,QAAA,EAAU,QAAQ,CAAC,CAAA;AAAA,IAChF,wBAAQ,IAAI,GAAA,CAAI,CAAC,KAAA,EAAO,MAAM,CAAC,CAAA;AAAA,IAC/B,KAAA,sBAAW,GAAA,CAAI,CAAC,OAAO,MAAA,EAAQ,SAAA,EAAW,OAAO,CAAC;AAAA,GACnD;AAAA,EAEA,mBAAA,EAAqB,KAAA;AAAA,EACrB,WAAA,EAAa;AACd,CAAA;AAMA,IAAM,WAAA,uBAAkB,GAAA,CAAI;AAAA;AAAA,EAE3B,MAAA;AAAA;AAAA,EAEA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,OAAA;AAAA,EACA,QAAA;AAAA,EACA,IAAA;AAAA;AAAA,EAEA,MAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA,UAAA;AAAA,EACA,SAAA;AAAA,EACA,UAAA;AAAA;AAAA,EAEA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA;AAAA,EACA,YAAA;AAAA,EACA,eAAA;AAAA,EACA,aAAA;AAAA,EACA,MAAA;AAAA;AAAA,EAEA,QAAA;AAAA,EACA,KAAA;AAAA,EACA,KAAA;AAAA,EACA,aAAA;AAAA,EACA,YAAA;AAAA;AAAA,EAEA,QAAA;AAAA,EACA,UAAA;AAAA,EACA,SAAA;AAAA,EACA,OAAA;AAAA,EACA,WAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA;AAAA;AAAA,EAEA,WAAA;AAAA,EACA,YAAA;AAAA,EACA;AACD,CAAC,CAAA;AAsEM,SAAS,YAAA,CAAa,IAAA,EAAc,MAAA,GAAkC,EAAC,EAAW;AACxF,EAAA,MAAM,GAAA,GAAM,EAAE,GAAG,cAAA,EAAgB,GAAG,MAAA,EAAO;AAG3C,EAAA,MAAM,iBAAA,GAAoB;AAAA,IACzB,qDAAA;AAAA,IACA,eAAA;AAAA,IACA,aAAA;AAAA;AAAA,IACA,aAAA;AAAA,IACA,YAAA;AAAA,IACA,aAAA;AAAA,IACA;AAAA,GACD;AAEA,EAAA,IAAI,SAAA,GAAY,IAAA;AAChB,EAAA,KAAA,MAAW,WAAW,iBAAA,EAAmB;AACxC,IAAA,SAAA,GAAY,SAAA,CAAU,OAAA,CAAQ,OAAA,EAAS,EAAE,CAAA;AAAA,EAC1C;AAGA,EAAA,MAAM,OAAA,GAAU,SAAA,CAAU,SAAA,EAAW,GAAG,CAAA;AAExC,EAAA,OAAO,OAAA;AACR;AAOA,SAAS,SAAA,CAAU,MAAc,MAAA,EAAgC;AAIhE,EAAA,IAAI,OAAA,GAAU,IAAA;AAGd,EAAA,MAAM,UAAA,GAAa,sCAAA;AACnB,EAAA,OAAA,GAAU,QAAQ,OAAA,CAAQ,UAAA,EAAY,CAAC,KAAA,EAAO,SAAS,MAAA,KAAW;AACjE,IAAA,MAAM,GAAA,GAAM,QAAQ,WAAA,EAAY;AAChC,IAAA,MAAM,QAAA,GAAW,GAAA,KAAQ,MAAA,IAAU,OAAA,CAAQ,SAAS,OAAO,CAAA;AAE3D,IAAA,IAAI,YAAY,MAAA,CAAO,WAAA,IAAe,WAAA,CAAY,GAAA,CAAI,GAAG,CAAA,EAAG;AAC3D,MAAA,OAAO,KAAA;AAAA,IACR;AACA,IAAA,IAAI,MAAA,CAAO,WAAA,CAAY,GAAA,CAAI,GAAG,CAAA,EAAG;AAEhC,MAAA,OAAO,qBAAA,CAAsB,KAAA,EAAO,GAAA,EAAK,MAAM,CAAA;AAAA,IAChD;AAEA,IAAA,OAAO,EAAA;AAAA,EACR,CAAC,CAAA;AAED,EAAA,OAAO,OAAA;AACR;AAKA,SAAS,qBAAA,CAAsB,SAAA,EAAmB,OAAA,EAAiB,MAAA,EAAgC;AAClG,EAAA,MAAM,WAAA,GAAc,0EAAA;AAEpB,EAAA,IAAI,UAAA,GAAa,IAAI,SAAA,CAAU,UAAA,CAAW,IAAI,CAAA,GAAI,GAAA,GAAM,EAAE,CAAA,EAAG,OAAO,CAAA,CAAA;AAEpE,EAAA,IAAI,KAAA,GAAQ,WAAA,CAAY,IAAA,CAAK,SAAS,CAAA;AACtC,EAAA,OAAO,UAAU,IAAA,EAAM;AACtB,IAAA,MAAM,QAAA,GAAA,CAAY,KAAA,CAAM,CAAC,CAAA,IAAK,IAAI,WAAA,EAAY;AAC9C,IAAA,MAAM,SAAA,GAAY,MAAM,CAAC,CAAA,IAAK,MAAM,CAAC,CAAA,IAAK,KAAA,CAAM,CAAC,CAAA,IAAK,EAAA;AAGtD,IAAA,MAAM,cAAc,MAAA,CAAO,iBAAA,CAAkB,GAAG,CAAA,wBAAS,GAAA,EAAI;AAC7D,IAAA,MAAM,WAAW,MAAA,CAAO,iBAAA,CAAkB,OAAO,CAAA,wBAAS,GAAA,EAAI;AAE9D,IAAA,IAAI,YAAY,WAAA,CAAY,GAAA,CAAI,QAAQ,CAAA,IAAK,QAAA,CAAS,IAAI,QAAQ,CAAA;AAGlE,IAAA,IAAI,YAAY,KAAA,KAAU,QAAA,KAAa,WAAW,QAAA,KAAa,QAAA,IAAY,aAAa,OAAA,CAAA,EAAU;AACjG,MAAA,SAAA,GAAY,KAAA;AAAA,IACb;AAGA,IAAA,IAAI,CAAC,SAAA,IAAa,MAAA,CAAO,uBAAuB,QAAA,CAAS,UAAA,CAAW,OAAO,CAAA,EAAG;AAC7E,MAAA,SAAA,GAAY,IAAA;AAAA,IACb;AAGA,IAAA,IAAI,SAAA,IAAa,CAAC,yBAAA,CAA0B,QAAA,EAAU,SAAS,CAAA,EAAG;AACjE,MAAA,UAAA,IAAc,IAAI,QAAQ,CAAA,EAAA,EAAK,UAAU,OAAA,CAAQ,IAAA,EAAM,QAAQ,CAAC,CAAA,CAAA,CAAA;AAAA,IACjE;AAEA,IAAA,KAAA,GAAQ,WAAA,CAAY,KAAK,SAAS,CAAA;AAAA,EACnC;AAEA,EAAA,UAAA,IAAc,GAAA;AACd,EAAA,OAAO,UAAA;AACR;AAKA,SAAS,yBAAA,CAA0B,MAAc,KAAA,EAAwB;AACxE,EAAA,MAAM,UAAA,GAAa,KAAA,CAAM,WAAA,EAAY,CAAE,IAAA,EAAK;AAG5C,EAAA,IAAI,IAAA,KAAS,MAAA,IAAU,IAAA,KAAS,KAAA,EAAO;AACtC,IAAA,IAAI,WAAW,UAAA,CAAW,aAAa,KAAK,UAAA,CAAW,UAAA,CAAW,gBAAgB,CAAA,EAAG;AACpF,MAAA,OAAO,IAAA;AAAA,IACR;AAAA,EACD;AAGA,EAAA,IAAI,WAAW,QAAA,CAAS,aAAa,KAAK,UAAA,CAAW,QAAA,CAAS,UAAU,CAAA,EAAG;AAC1E,IAAA,OAAO,IAAA;AAAA,EACR;AAEA,EAAA,OAAO,KAAA;AACR;AAKO,SAAS,mBAAmB,IAAA,EAAsB;AAExD,EAAA,MAAM,SAAA,GAAY,IAAA,CAAK,WAAA,EAAY,CAAE,SAAS,OAAO,CAAA;AAErD,EAAA,OAAO,aAAa,IAAA,EAAM;AAAA,IACzB,WAAA,EAAa,SAAA;AAAA,IACb,mBAAA,EAAqB;AAAA,GACrB,CAAA;AACF;AChVO,SAAS,WAAA,CAAY;AAAA,EAC3B,IAAA;AAAA,EACA,SAAA;AAAA,EACA,YAAA;AAAA,EACA,UAAA;AAAA,EACA,SAAA;AAAA,EACA,YAAA;AAAA,EACA,eAAA;AAAA,EACA;AACD,CAAA,EASG;AAEF,EAAA,MAAM,YAAA,GAAqBA,cAAuB,IAAI,CAAA;AACtD,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAUA,MAAA,CAAA,QAAA,CAAkC,EAAE,CAAA;AAGxE,EAAA,MAAM,QAAA,GAAiBA,eAAQ,MAAM,kBAAA,CAAmB,IAAI,CAAA,EAAG,CAAC,IAAI,CAAC,CAAA;AAGrE,EAAMA,iBAAU,MAAM;AACrB,IAAA,MAAM,KAAK,YAAA,CAAa,OAAA;AACxB,IAAA,IAAI,CAAC,EAAA,EAAI;AACT,IAAA,EAAA,CAAG,SAAA,GAAY,QAAA;AAEf,IAAA,MAAM,aAAsC,EAAC;AAG7C,IAAA,IAAI,YAAA,EAAc;AACjB,MAAA,MAAM,KAAA,GAAQ,EAAA,CAAG,gBAAA,CAAiB,mBAAmB,CAAA;AACrD,MAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACzB,QAAA,MAAM,UAAA,GAAa,IAAA,CAAK,YAAA,CAAa,iBAAiB,CAAA;AACtD,QAAA,IAAI,UAAA,IAAc,YAAA,CAAa,UAAU,CAAA,EAAG;AAC3C,UAAA,UAAA,CAAW,UAAU,CAAA,GAAI,IAAA;AAAA,QAC1B;AAAA,MACD;AAAA,IACD;AAGA,IAAA,IAAI,UAAA,EAAY;AACf,MAAA,MAAM,KAAA,GAAQ,EAAA,CAAG,gBAAA,CAAiB,uBAAuB,CAAA;AACzD,MAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACzB,QAAA,MAAM,UAAA,GAAa,IAAA,CAAK,YAAA,CAAa,qBAAqB,CAAA;AAC1D,QAAA,IAAI,UAAA,IAAc,UAAA,CAAW,UAAU,CAAA,EAAG;AACzC,UAAA,UAAA,CAAW,UAAU,CAAA,GAAI,IAAA;AAAA,QAC1B;AAAA,MACD;AAAA,IACD;AAGA,IAAA,IAAI,SAAA,EAAW;AACd,MAAA,MAAM,KAAA,GAAQ,EAAA,CAAG,gBAAA,CAAiB,gBAAgB,CAAA;AAClD,MAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACzB,QAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,YAAA,CAAa,cAAc,CAAA;AAC9C,QAAA,IAAI,KAAA,IAAS,SAAA,CAAU,KAAK,CAAA,EAAG;AAC9B,UAAA,UAAA,CAAW,CAAA,IAAA,EAAO,KAAK,CAAA,CAAE,CAAA,GAAI,IAAA;AAAA,QAC9B;AAAA,MACD;AAAA,IACD;AAEA,IAAA,UAAA,CAAW,UAAU,CAAA;AAAA,EACtB,GAAG,CAAC,QAAA,EAAU,YAAA,EAAc,UAAA,EAAY,SAAS,CAAC,CAAA;AAIlD,EAAA,MAAM,OAAA,GAAgBA,eAAQ,MAAM;AACnC,IAAA,MAAM,QAA2B,EAAC;AAElC,IAAA,IAAI,gBAAgB,YAAA,EAAc;AACjC,MAAA,KAAA,MAAW,CAAC,EAAA,EAAI,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,YAAY,CAAA,EAAG;AACvD,QAAA,MAAM,MAAA,GAAS,QAAQ,EAAE,CAAA;AACzB,QAAA,IAAI,MAAA,EAAQ;AACX,UAAA,KAAA,CAAM,KAAK,YAAA,CAAa,YAAA,CAAa,KAAK,CAAA,EAAG,MAAA,EAAQ,EAAE,CAAC,CAAA;AAAA,QACzD;AAAA,MACD;AAAA,IACD;AAEA,IAAA,IAAI,cAAc,eAAA,EAAiB;AAClC,MAAA,KAAA,MAAW,CAAC,EAAA,EAAI,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,UAAU,CAAA,EAAG;AACrD,QAAA,MAAM,MAAA,GAAS,QAAQ,EAAE,CAAA;AACzB,QAAA,IAAI,MAAA,EAAQ;AACX,UAAA,KAAA,CAAM,KAAK,YAAA,CAAa,eAAA,CAAgB,KAAK,CAAA,EAAG,MAAA,EAAQ,EAAE,CAAC,CAAA;AAAA,QAC5D;AAAA,MACD;AAAA,IACD;AAEA,IAAA,IAAI,aAAa,SAAA,EAAW;AAC3B,MAAA,KAAA,MAAW,CAAC,EAAA,EAAI,GAAG,KAAK,MAAA,CAAO,OAAA,CAAQ,SAAS,CAAA,EAAG;AAClD,QAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,CAAA,IAAA,EAAO,EAAE,CAAA,CAAE,CAAA;AAClC,QAAA,IAAI,MAAA,EAAQ;AACX,UAAA,KAAA,CAAM,IAAA,CAAK,aAAa,SAAA,CAAU,GAAG,GAAG,MAAA,EAAQ,CAAA,IAAA,EAAO,EAAE,CAAA,CAAE,CAAC,CAAA;AAAA,QAC7D;AAAA,MACD;AAAA,IACD;AAEA,IAAA,OAAO,KAAA;AAAA,EACR,CAAA,EAAG,CAAC,OAAA,EAAS,YAAA,EAAc,YAAY,SAAA,EAAW,YAAA,EAAc,eAAA,EAAiB,SAAS,CAAC,CAAA;AAE3F,EAAMA,iBAAU,MAAM;AAErB,IAAA,MAAM,qBAAqB,MAAM;AAChC,MAAA,MAAM,GAAA,GAAM,QAAA,CAAS,aAAA,CAAc,MAAM,CAAA;AACzC,MAAA,GAAA,CAAI,SAAA,GAAY,WAAA;AAChB,MAAA,MAAM,aAAa,GAAA,CAAI,UAAA;AACvB,MAAA,OAAO,UAAA,YAAsB,OAAA,IAAW,UAAA,CAAW,YAAA,KAAiB,oCAAA;AAAA,IACrE,CAAA;AAGA,IAAA,IAAI,CAAC,kBAAA,EAAmB,IAAK,aAAa,OAAA,EAAS,aAAA,CAAc,MAAM,CAAA,EAAG;AAE1E,EACD,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,uBACC,IAAA,CAAA,QAAA,EAAA,EACC,QAAA,EAAA;AAAA,oBAAA,GAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACA,GAAA,EAAK,YAAA;AAAA,QACL,SAAA,EAAW,EAAA;AAAA,UACV,sEAAA;AAAA;AAAA,UAEA,uGAAA;AAAA,UACA;AAAA;AACD;AAAA,KACD;AAAA,IACC;AAAA,GAAA,EACF,CAAA;AAEF;AC9IO,SAAS,eAAA,CAAgB;AAAA,EAC/B,UAAA;AAAA,EACA,YAAA;AAAA,EACA;AACD,CAAA,EAIG;AACF,EAAA,IAAI,CAAC,cAAc,OAAO,IAAA;AAC1B,EAAA,MAAM,KAAA,GAAQ,sBAAsB,UAAU,CAAA;AAC9C,EAAA,MAAM,cAAc,KAAA,EAAO,WAAA;AAC3B,EAAA,IAAI,CAAC,aAAa,OAAO,IAAA;AACzB,EAAA,MAAM,SAAA,GAAY,OAAO,SAAA,KAAc,IAAA;AACvC,EAAA,uBACCC,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uBAAA,EAAwB,cAAA,EAAc,SAAA,EACpD,QAAA,kBAAAA,GAAAA,CAAC,WAAA,EAAA,EAAY,IAAA,EAAM,WAAA,EAAa,CAAA,EACjC,CAAA;AAEF;ACdA,IAAM,uBAAA,GAA0B,GAAA;AAAA,EAC/B;AAAA,IACC,gHAAA;AAAA,IACA,iDAAA;AAAA,IACA,uJAAA;AAAA,IACA,2IAAA;AAAA,IACA,uEAAA;AAAA,IACA,0KAAA;AAAA,IACA,wEAAA;AAAA,IACA;AAAA,GACD;AAAA,EACA;AAAA,IACC,QAAA,EAAU;AAAA,MACT,OAAA,EAAS;AAAA,QACR,OAAA,EAAS;AAAA,UACR,+CAAA;AAAA,UACA;AAAA,SACD;AAAA,QACA,KAAA,EAAO,CAAC,0CAAA,EAA4C,8CAA8C,CAAA;AAAA,QAClG,QAAA,EAAU,CAAC,6CAAA,EAA+C,6CAA6C,CAAA;AAAA,QACvG,GAAA,EAAK,CAAC,wCAAA,EAA0C,yCAAyC,CAAA;AAAA,QACzF,GAAA,EAAK,CAAC,wCAAA,EAA0C,8CAA8C,CAAA;AAAA,QAC9F,KAAA,EAAO,CAAC,0CAAA,EAA4C,0CAA0C;AAAA;AAC/F,KACD;AAAA,IACA,eAAA,EAAiB;AAAA,MAChB,OAAA,EAAS;AAAA;AACV;AAEF,CAAA;AAeA,SAAS,eAAA,CAAgB;AAAA,EACxB,SAAA;AAAA,EACA,OAAA,GAAU,SAAA;AAAA,EACV,MAAA;AAAA,EACA,IAAA,GAAO,OAAA;AAAA,EACP,UAAA,GAAa,IAAA;AAAA,EACb,GAAG;AACJ,CAAA,EAAyB;AACxB,EAAA,MAAM,gBAAgB,EAAA,CAAG,uBAAA,CAAwB,EAAE,OAAA,EAAS,GAAG,SAAS,CAAA;AAExE,EAAA,IAAI,SAAS,UAAA,EAAY;AACxB,IAAA,MAAM,aAAA,GAAgB,KAAA;AACtB,IAAA,uBACCA,GAAAA;AAAA,MAAmB,iBAAA,CAAA,IAAA;AAAA,MAAlB;AAAA,QACA,WAAA,EAAU,kBAAA;AAAA,QACV,cAAA,EAAc,OAAA;AAAA,QACd,eAAa,CAAC,UAAA;AAAA,QACd,SAAA,EAAW,aAAA;AAAA,QACV,GAAG,aAAA;AAAA,QAEH,wCAAcA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,4DAA4D,QAAA,EAAA,MAAA,EAAO;AAAA;AAAA,KACnG;AAAA,EAEF;AAEA,EAAA,MAAM,UAAA,GAAa,KAAA;AACnB,EAAA,uBACCA,GAAAA;AAAA,IAAqB,mBAAA,CAAA,IAAA;AAAA,IAApB;AAAA,MACA,WAAA,EAAU,kBAAA;AAAA,MACV,cAAA,EAAc,OAAA;AAAA,MACd,SAAA,EAAW,aAAA;AAAA,MACV,GAAG,UAAA;AAAA,MAEH,QAAA,EAAA;AAAA;AAAA,GACF;AAEF;AClFA,SAAS,KAAA,CAAM,EAAE,SAAA,EAAW,GAAG,OAAM,EAAqD;AACzF,EAAA,uBACCA,GAAAA;AAAA,IAAgB,cAAA,CAAA,IAAA;AAAA,IAAf;AAAA,MACA,WAAA,EAAU,OAAA;AAAA,MACV,SAAA,EAAW,EAAA;AAAA,QACV,qNAAA;AAAA,QACA;AAAA,OACD;AAAA,MACC,GAAG;AAAA;AAAA,GACL;AAEF;ACTA,SAAS,QAAA,CAAS,EAAE,SAAA,EAAW,GAAG,OAAM,EAAqC;AAC5E,EAAA,uBACCA,GAAAA;AAAA,IAAC,UAAA;AAAA,IAAA;AAAA,MACA,WAAA,EAAU,WAAA;AAAA,MACV,SAAA,EAAW,EAAA;AAAA,QACV,qBAAA;AAAA,QACA,8EAAA;AAAA,QACA;AAAA,OACD;AAAA,MACC,GAAG;AAAA;AAAA,GACL;AAEF;AAiBA,SAAS,UAAA,CAAW,EAAE,SAAA,EAAW,GAAG,OAAM,EAAgC;AACzE,EAAA,uBACCA,GAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACA,WAAA,EAAU,aAAA;AAAA,MACV,SAAA,EAAW,EAAA;AAAA,QACV,wIAAA;AAAA,QACA;AAAA,OACD;AAAA,MACC,GAAG;AAAA;AAAA,GACL;AAEF;AAEA,IAAM,aAAA,GAAgBC,IAAI,oEAAA,EAAsE;AAAA,EAC/F,QAAA,EAAU;AAAA,IACT,WAAA,EAAa;AAAA,MACZ,QAAA,EAAU,CAAC,2CAA2C,CAAA;AAAA,MACtD,UAAA,EAAY;AAAA,QACX,uBAAA;AAAA,QACA,uCAAA;AAAA,QACA;AAAA,OACD;AAAA,MACA,UAAA,EAAY;AAAA,QACX,8HAAA;AAAA,QACA,uDAAA;AAAA,QACA;AAAA;AACD;AACD,GACD;AAAA,EACA,eAAA,EAAiB;AAAA,IAChB,WAAA,EAAa;AAAA;AAEf,CAAC,CAAA;AAED,SAAS,KAAA,CAAM;AAAA,EACd,SAAA;AAAA,EACA,WAAA,GAAc,UAAA;AAAA,EACd,GAAG;AACJ,CAAA,EAAqE;AACpE,EAAA,uBACCD,GAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACA,IAAA,EAAK,OAAA;AAAA,MACL,WAAA,EAAU,OAAA;AAAA,MACV,kBAAA,EAAkB,WAAA;AAAA,MAClB,WAAW,EAAA,CAAG,aAAA,CAAc,EAAE,WAAA,EAAa,GAAG,SAAS,CAAA;AAAA,MACtD,GAAG;AAAA;AAAA,GACL;AAEF;AAEA,SAAS,YAAA,CAAa,EAAE,SAAA,EAAW,GAAG,OAAM,EAAgC;AAC3E,EAAA,uBACCA,GAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACA,WAAA,EAAU,eAAA;AAAA,MACV,SAAA,EAAW,EAAA,CAAG,+DAAA,EAAiE,SAAS,CAAA;AAAA,MACvF,GAAG;AAAA;AAAA,GACL;AAEF;AAEA,SAAS,UAAA,CAAW;AAAA,EACnB,SAAA;AAAA,EACA,OAAA,GAAU,SAAA;AAAA,EACV,GAAG;AACJ,CAAA,EAEG;AACF,EAAA,uBACCA,GAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACA,WAAA,EAAU,aAAA;AAAA,MACV,cAAA,EAAc,OAAA;AAAA,MACd,SAAA,EAAW,EAAA;AAAA,QACV,iFAAA;AAAA,QACA,6CAAA;AAAA,QACA,oIAAA;AAAA,QACA,qGAAA;AAAA,QACA,gGAAA;AAAA,QACA,+FAAA;AAAA,QACA,8CAAA;AAAA,QACA,0CAAA;AAAA,QACA,uIAAA;AAAA,QACA,uPAAA;AAAA,QACA,mEAAA;AAAA,QACA,2IAAA;AAAA,QACA,2HAAA;AAAA,QACA,mIAAA;AAAA,QACA,gHAAA;AAAA,QACA,qHAAA;AAAA,QACA,uHAAA;AAAA,QACA;AAAA,OACD;AAAA,MACC,GAAG;AAAA;AAAA,GACL;AAEF;AAEA,SAAS,UAAA,CAAW,EAAE,SAAA,EAAW,GAAG,OAAM,EAAgC;AACzE,EAAA,uBACCA,GAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACA,WAAA,EAAU,aAAA;AAAA,MACV,SAAA,EAAW,EAAA;AAAA,QACV,4GAAA;AAAA,QACA;AAAA,OACD;AAAA,MACC,GAAG;AAAA;AAAA,GACL;AAEF;ACxI+BC,GAAAA;AAAA,EAC9B;AAAA,IACC,gBAAA;AAAA,IACA,8CAAA;AAAA,IACA,mKAAA;AAAA,IACA,iDAAA;AAAA,IACA,qCAAA;AAAA,IACA,kEAAA;AAAA,IACA,kFAAA;AAAA,IACA;AAAA,GACD;AAAA,EACA;AAAA,IACC,QAAA,EAAU;AAAA,MACT,OAAA,EAAS;AAAA,QACR,OAAA,EAAS;AAAA,UACR,qDAAA;AAAA,UACA,yDAAA;AAAA,UACA;AAAA,SACD;AAAA,QACA,KAAA,EAAO;AAAA,UACN,qDAAA;AAAA,UACA,oDAAA;AAAA,UACA;AAAA,SACD;AAAA,QACA,QAAA,EAAU;AAAA,UACT,qDAAA;AAAA,UACA,uDAAA;AAAA,UACA;AAAA,SACD;AAAA,QACA,GAAA,EAAK;AAAA,UACJ,qDAAA;AAAA,UACA,kDAAA;AAAA,UACA;AAAA,SACD;AAAA,QACA,GAAA,EAAK;AAAA,UACJ,qDAAA;AAAA,UACA,kDAAA;AAAA,UACA;AAAA,SACD;AAAA,QACA,KAAA,EAAO;AAAA,UACN,qDAAA;AAAA,UACA,oDAAA;AAAA,UACA;AAAA;AACD;AACD,KACD;AAAA,IACA,eAAA,EAAiB;AAAA,MAChB,OAAA,EAAS;AAAA;AACV;AAEF;AAEA,SAAS,UAAA,CAAW,EAAE,SAAA,EAAW,GAAG,OAAM,EAA0D;AACnG,EAAA,uBAAOD,GAAAA,CAAqBE,mBAAA,CAAA,IAAA,EAApB,EAAyB,WAAA,EAAU,aAAA,EAAc,SAAA,EAAW,EAAA,CAAG,YAAA,EAAc,SAAS,CAAA,EAAI,GAAG,KAAA,EAAO,CAAA;AAC7G;ACvBO,SAAS,yBAAA,CAA0B;AAAA,EACzC,WAAA;AAAA,EACA,QAAA;AAAA,EACA,cAAA;AAAA,EACA,QAAA,GAAW,KAAA;AAAA,EACX,YAAA;AAAA,EACA,OAAA,GAAU,OAAA;AAAA,EACV,SAAA;AAAA,EACA;AACD,CAAA,EAAmC;AAClC,EAAA,MAAM,UAAA,GAAa,YAAY,UAAA,GAAa,CAAA;AAC5C,EAAA,MAAM,cAAA,GAAuBC,eAAQ,MAAM;AAC1C,IAAA,IAAI,CAAC,QAAA,EAAU,OAAO,EAAC;AACvB,IAAA,OAAO,MAAM,OAAA,CAAQ,QAAQ,CAAA,GAAI,QAAA,GAAW,CAAC,QAAQ,CAAA;AAAA,EACtD,CAAA,EAAG,CAAC,QAAQ,CAAC,CAAA;AAGb,EAAA,MAAM,YAAA,GAAqBA,eAAQ,MAAM;AACxC,IAAA,MAAM,SAAS,CAAC,IAAA,KAAiB,KAAK,WAAA,EAAY,CAAE,SAAS,MAAM,CAAA;AACnE,IAAA,MAAM,QAAA,GAAW,CAAC,IAAA,KAAiB,IAAA,CAAK,QAAQ,UAAA,EAAY,EAAE,EAAE,IAAA,EAAK;AACrE,IAAA,OACC,YAAY,OAAA,CAAQ,MAAA,GAAS,CAAA,IAC7B,WAAA,CAAY,QAAQ,KAAA,CAAM,CAAC,CAAA,KAAM,MAAA,CAAO,EAAE,WAAW,CAAA,IAAK,SAAS,CAAA,CAAE,WAAW,MAAM,EAAE,CAAA;AAAA,EAE1F,CAAA,EAAG,CAAC,WAAA,CAAY,OAAO,CAAC,CAAA;AAExB,EAAA,MAAM,WAAA,GAAc,YAAY,OAAA,CAAQ,MAAA;AAGxC,EAAA,MAAM,SAAA,GAAkBA,eAAQ,MAAM;AACrC,IAAA,IAAI,CAAC,cAAc,OAAO,WAAA;AAC1B,IAAA,QAAQ,WAAA;AAAa,MACpB,KAAK,CAAA;AACJ,QAAA,OAAO,wBAAA;AAAA,MACR,KAAK,CAAA;AACJ,QAAA,OAAO,wBAAA;AAAA,MACR,KAAK,CAAA;AACJ,QAAA,OAAO,0CAAA;AAAA,MACR;AACC,QAAA,OAAO,uCAAA;AAAA;AACT,EACD,CAAA,EAAG,CAAC,YAAA,EAAc,WAAW,CAAC,CAAA;AAG9B,EAAA,MAAM,cAAA,GAAuBA,eAAQ,MAAM;AAC1C,IAAA,IAAI,CAAC,cAAc,OAAO,EAAA;AAC1B,IAAA,OAAO,WAAA,KAAgB,IACpB,4KAAA,GACA,kKAAA;AAAA,EACJ,CAAA,EAAG,CAAC,YAAA,EAAc,WAAW,CAAC,CAAA;AAE9B,EAAA,MAAM,kBAAA,GAAqB,CAAC,KAAA,KAAkB;AAC7C,IAAA,IAAI,CAAC,YAAY,cAAA,EAAgB;AAChC,MAAA,cAAA,CAAe,KAAK,CAAA;AAAA,IACrB;AAAA,EACD,CAAA;AAKA,EAAA,MAAM,aAAA,GAAgB,WAAA,CAAY,UAAA,mBAAaH,GAAAA,CAAC,WAAA,EAAA,EAAY,IAAA,EAAM,WAAA,CAAY,UAAA,EAAY,SAAA,EAAU,MAAA,EAAO,CAAA,GAAK,IAAA;AAGhH,EAAA,IAAI,CAAC,UAAA,EAAY;AAChB,IAAA,MAAMI,aAAY,YAAA,KAAiB,IAAA;AACnC,IAAA,uBACCC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACb,QAAA,EAAA;AAAA,MAAA,aAAA;AAAA,sBACDL,GAAAA;AAAA,QAAC,UAAA;AAAA,QAAA;AAAA,UACA,KAAA,EAAO,cAAA,CAAe,CAAC,CAAA,IAAK,EAAA;AAAA,UAC5B,aAAA,EAAe,CAAC,KAAA,KAAU,kBAAA,CAAmB,KAAK,CAAA;AAAA,UAClD,UAAU,QAAA,IAAYI,UAAAA;AAAA,UAEtB,0BAAAJ,GAAAA,CAAC,UAAA,EAAA,EACA,QAAA,kBAAAA,GAAAA,CAAC,YACC,QAAA,EAAA,YAAA,mBACAA,GAAAA,CAAC,KAAA,EAAA,EAAI,WAAW,SAAA,EACd,QAAA,EAAA,WAAA,CAAY,QAAQ,GAAA,CAAI,CAAC,QAAQ,KAAA,KAAU;AAC3C,YAAA,MAAM,UAAA,GAAa,cAAA,CAAe,QAAA,CAAS,MAAA,CAAO,UAAU,CAAA;AAC5D,YAAA,MAAM,aAAA,GAAgBI,UAAAA,IAAa,UAAA,GAAc,SAAA,GAAY,QAAQ,UAAA,GAAc,OAAA;AACnF,YAAA,MAAM,QAAQ,CAAA,EAAG,WAAA,CAAY,kBAAkB,CAAA,CAAA,EAAI,OAAO,UAAU,CAAA,CAAA;AACpE,YAAA,uBACCJ,GAAAA,CAAC,UAAA,EAAA,EAAmC,OAAA,EAAS,OAAO,OAAA,EAAS,aAAA,EAC5D,QAAA,kBAAAK,IAAAA,CAAC,KAAA,EAAA,EAAM,WAAA,EAAY,YAAA,EAAa,eAAA,EAAe,YAAYD,UAAAA,EAC1D,QAAA,EAAA;AAAA,8BAAAJ,GAAAA;AAAA,gBAAC,eAAA;AAAA,gBAAA;AAAA,kBACA,OAAO,MAAA,CAAO,UAAA;AAAA,kBACd,EAAA,EAAI,KAAA;AAAA,kBACJ,MAAA,EAAQ,MAAA,CAAO,YAAA,CAAa,EAAA,GAAK,KAAK,CAAA;AAAA,kBACtC,OAAA,EAAS,aAAA;AAAA,kBACT,UAAU,QAAA,IAAYI;AAAA;AAAA,eACvB;AAAA,8BACAJ,GAAAA,CAAC,YAAA,EAAA,EAAa,SAAA,EAAW,EAAA,CAAG,cAAc,CAAA,EACzC,QAAA,kBAAAA,GAAAA,CAAC,UAAA,EAAA,EACA,0BAAAA,GAAAA,CAAC,WAAA,EAAA,EAAY,MAAM,MAAA,CAAO,WAAA,EAAa,GACxC,CAAA,EACD;AAAA,aAAA,EACD,CAAA,EAAA,EAdgB,OAAO,UAexB,CAAA;AAAA,UAEF,CAAC,GACF,CAAA,GAEA,WAAA,CAAY,QAAQ,GAAA,CAAI,CAAC,QAAQ,KAAA,KAAU;AAC1C,YAAA,MAAM,UAAA,GAAa,cAAA,CAAe,QAAA,CAAS,MAAA,CAAO,UAAU,CAAA;AAC5D,YAAA,MAAM,aAAA,GAAgBI,UAAAA,IAAa,UAAA,GAAc,SAAA,GAAY,QAAQ,UAAA,GAAc,OAAA;AACnF,YAAA,MAAM,QAAQ,CAAA,EAAG,WAAA,CAAY,kBAAkB,CAAA,CAAA,EAAI,OAAO,UAAU,CAAA,CAAA;AACpE,YAAA,uBACCJ,GAAAA,CAAC,UAAA,EAAA,EAAmC,OAAA,EAAS,OAAO,OAAA,EAAS,aAAA,EAC5D,QAAA,kBAAAK,IAAAA,CAAC,KAAA,EAAA,EAAM,WAAA,EAAY,YAAA,EAAa,eAAA,EAAe,YAAYD,UAAAA,EAC1D,QAAA,EAAA;AAAA,8BAAAJ,GAAAA;AAAA,gBAAC,eAAA;AAAA,gBAAA;AAAA,kBACA,OAAO,MAAA,CAAO,UAAA;AAAA,kBACd,EAAA,EAAI,KAAA;AAAA,kBACJ,oBACCI,UAAAA,IAAa,UAAA,IAAc,OAAO,kBAAA,GAAqB,CAAA,EAAG,KAAK,CAAA,GAAA,CAAA,GAAQ,MAAA;AAAA,kBAExE,MAAA,EAAQ,MAAA,CAAO,YAAA,CAAa,EAAA,GAAK,KAAK,CAAA;AAAA,kBACtC,OAAA,EAAS,aAAA;AAAA,kBACT,UAAU,QAAA,IAAYA;AAAA;AAAA,eACvB;AAAA,8BACAC,KAAC,YAAA,EAAA,EACA,QAAA,EAAA;AAAA,gCAAAL,GAAAA,CAAC,cACA,QAAA,kBAAAA,GAAAA,CAAC,eAAY,IAAA,EAAM,MAAA,CAAO,aAAa,CAAA,EACxC,CAAA;AAAA,gBACCI,UAAAA,IAAa,UAAA,IAAc,MAAA,CAAO,kBAAA,mBAClCJ,GAAAA;AAAA,kBAAC,QAAA;AAAA,kBAAA;AAAA,oBACA,EAAA,EAAI,GAAG,KAAK,CAAA,GAAA,CAAA;AAAA,oBACZ,WAAA,EAAU,QAAA;AAAA,oBACV,SAAA,EAAW,EAAA;AAAA,sBACV,oDAAA;AAAA,sBACA,YAAY,YAAA,GAAe;AAAA,qBAC5B;AAAA,oBAEA,QAAA,kBAAAA,GAAAA,CAAC,WAAA,EAAA,EAAY,IAAA,EAAM,OAAO,kBAAA,EAAoB;AAAA;AAAA,iBAC/C,GACG;AAAA,eAAA,EACL;AAAA,aAAA,EACD,CAAA,EAAA,EA7BgB,OAAO,UA8BxB,CAAA;AAAA,UAEF,CAAC,GAEH,CAAA,EACD;AAAA;AAAA;AACD,KAAA,EACD,CAAA;AAAA,EAEF;AAGA,EAAA,MAAM,YAAY,YAAA,KAAiB,IAAA;AACnC,EAAA,MAAM,KAAA,GAAQ,cAAA,CAAe,MAAA,IAAU,WAAA,CAAY,UAAA;AACnD,EAAA,uBACCK,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACb,QAAA,EAAA;AAAA,IAAA,aAAA;AAAA,oBACDL,GAAAA,CAAC,UAAA,EAAA,EACA,QAAA,kBAAAA,GAAAA,CAAC,YACC,QAAA,EAAA,YAAA,mBACAA,GAAAA,CAAC,KAAA,EAAA,EAAI,WAAW,SAAA,EACd,QAAA,EAAA,WAAA,CAAY,QAAQ,GAAA,CAAI,CAAC,QAAQ,MAAA,KAAW;AAC5C,MAAA,MAAM,SAAA,GAAY,cAAA,CAAe,QAAA,CAAS,MAAA,CAAO,UAAU,CAAA;AAC3D,MAAA,MAAM,YAAA,GAAe,4BAA4B,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,EAAA,KAAO,MAAA,CAAO,UAAU,CAAA,EAAG,SAAA;AAC1F,MAAA,MAAM,eAAA,GAAkB,YAAA,KAAiB,SAAA,GAAa,SAAA,IAAa,KAAA,GAAS,KAAA,CAAA;AAC5E,MAAA,MAAM,aAAA,GAAgB,SAAA,IAAa,SAAA,GAAa,eAAA,GAAkB,QAAQ,UAAA,GAAc,OAAA;AACxF,MAAA,MAAM,QAAQ,CAAA,EAAG,WAAA,CAAY,kBAAkB,CAAA,CAAA,EAAI,OAAO,UAAU,CAAA,CAAA;AACpE,MAAA,uBACCA,GAAAA,CAAC,UAAA,EAAA,EAAmC,OAAA,EAAS,OAAO,OAAA,EAAS,aAAA,EAC5D,QAAA,kBAAAK,IAAAA,CAAC,KAAA,EAAA,EAAM,WAAA,EAAY,YAAA,EAAa,eAAA,EAAe,YAAY,SAAA,EAC1D,QAAA,EAAA;AAAA,wBAAAL,GAAAA;AAAA,UAAC,eAAA;AAAA,UAAA;AAAA,YACA,IAAA,EAAK,UAAA;AAAA,YACL,EAAA,EAAI,KAAA;AAAA,YACJ,UAAA,EAAY,KAAA;AAAA,YACZ,OAAA,EAAS,aAAA;AAAA,YACT,OAAA,EAAS,SAAA;AAAA,YACT,eAAA,EAAiB,CAAC,OAAA,KAAY;AAC7B,cAAA,IAAI,QAAA,IAAY,SAAA,IAAa,CAAC,cAAA,EAAgB;AAE9C,cAAA,IAAI,OAAA,KAAY,IAAA,IAAQ,CAAC,SAAA,IAAa,KAAA,EAAO;AAC7C,cAAA,MAAM,IAAA,GACL,OAAA,KAAY,IAAA,GACT,CAAC,GAAG,cAAA,EAAgB,MAAA,CAAO,UAAU,CAAA,GACrC,eAAe,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,KAAM,OAAO,UAAU,CAAA;AACxD,cAAA,cAAA,CAAe,IAAI,CAAA;AAAA,YACpB,CAAA;AAAA,YACA,QAAA,EAAU,QAAA,IAAY,SAAA,IAAc,CAAC,SAAA,IAAa,KAAA;AAAA,YAClD,oBACC,SAAA,IAAa,SAAA,IAAa,OAAO,kBAAA,GAAqB,CAAA,EAAG,KAAK,CAAA,GAAA,CAAA,GAAQ;AAAA;AAAA,SAExE;AAAA,wBACAK,IAAAA,CAAC,YAAA,EAAA,EAAa,SAAA,EAAW,EAAA,CAAG,cAAc,CAAA,EACzC,QAAA,EAAA;AAAA,0BAAAL,GAAAA,CAAC,cACA,QAAA,kBAAAA,GAAAA,CAAC,eAAY,IAAA,EAAM,MAAA,CAAO,aAAa,CAAA,EACxC,CAAA;AAAA,UACC,SAAA,IAAa,SAAA,IAAa,MAAA,CAAO,kBAAA,mBACjCA,GAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACA,EAAA,EAAI,GAAG,KAAK,CAAA,GAAA,CAAA;AAAA,cACZ,WAAA,EAAU,QAAA;AAAA,cACV,SAAA,EAAW,EAAA;AAAA,gBACV,oDAAA;AAAA,gBACA,kBAAkB,YAAA,GAAe;AAAA,eAClC;AAAA,cAEA,QAAA,kBAAAA,GAAAA,CAAC,WAAA,EAAA,EAAY,IAAA,EAAM,OAAO,kBAAA,EAAoB;AAAA;AAAA,WAC/C,GACG;AAAA,SAAA,EACL;AAAA,OAAA,EACD,CAAA,EAAA,EAxCgB,OAAO,UAyCxB,CAAA;AAAA,IAEF,CAAC,GACF,CAAA,GAEA,WAAA,CAAY,QAAQ,GAAA,CAAI,CAAC,QAAQ,MAAA,KAAW;AAC3C,MAAA,MAAM,SAAA,GAAY,cAAA,CAAe,QAAA,CAAS,MAAA,CAAO,UAAU,CAAA;AAC3D,MAAA,MAAM,YAAA,GAAe,4BAA4B,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,EAAA,KAAO,MAAA,CAAO,UAAU,CAAA,EAAG,SAAA;AAC1F,MAAA,MAAM,eAAA,GAAkB,YAAA,KAAiB,SAAA,GAAa,SAAA,IAAa,KAAA,GAAS,KAAA,CAAA;AAC5E,MAAA,MAAM,aAAA,GAAgB,SAAA,IAAa,SAAA,GAAa,eAAA,GAAkB,QAAQ,UAAA,GAAc,OAAA;AACxF,MAAA,MAAM,QAAQ,CAAA,EAAG,WAAA,CAAY,kBAAkB,CAAA,CAAA,EAAI,OAAO,UAAU,CAAA,CAAA;AACpE,MAAA,uBACCA,GAAAA,CAAC,UAAA,EAAA,EAAmC,OAAA,EAAS,OAAO,OAAA,EAAS,aAAA,EAC5D,QAAA,kBAAAK,IAAAA,CAAC,KAAA,EAAA,EAAM,WAAA,EAAY,YAAA,EAAa,eAAA,EAAe,YAAY,SAAA,EAC1D,QAAA,EAAA;AAAA,wBAAAL,GAAAA;AAAA,UAAC,eAAA;AAAA,UAAA;AAAA,YACA,IAAA,EAAK,UAAA;AAAA,YACL,EAAA,EAAI,KAAA;AAAA,YACJ,UAAA,EAAY,KAAA;AAAA,YACZ,OAAA,EAAS,aAAA;AAAA,YACT,OAAA,EAAS,SAAA;AAAA,YACT,eAAA,EAAiB,CAAC,OAAA,KAAY;AAC7B,cAAA,IAAI,QAAA,IAAY,SAAA,IAAa,CAAC,cAAA,EAAgB;AAE9C,cAAA,IAAI,OAAA,KAAY,IAAA,IAAQ,CAAC,SAAA,IAAa,KAAA,EAAO;AAC7C,cAAA,MAAM,IAAA,GACL,OAAA,KAAY,IAAA,GACT,CAAC,GAAG,cAAA,EAAgB,MAAA,CAAO,UAAU,CAAA,GACrC,eAAe,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,KAAM,OAAO,UAAU,CAAA;AACxD,cAAA,cAAA,CAAe,IAAI,CAAA;AAAA,YACpB,CAAA;AAAA,YACA,QAAA,EAAU,QAAA,IAAY,SAAA,IAAc,CAAC,SAAA,IAAa,KAAA;AAAA,YAClD,oBAAkB,SAAA,IAAa,SAAA,IAAa,OAAO,kBAAA,GAAqB,CAAA,EAAG,KAAK,CAAA,GAAA,CAAA,GAAQ;AAAA;AAAA,SACzF;AAAA,wBACAK,KAAC,YAAA,EAAA,EACA,QAAA,EAAA;AAAA,0BAAAL,GAAAA,CAAC,cACA,QAAA,kBAAAA,GAAAA,CAAC,eAAY,IAAA,EAAM,MAAA,CAAO,aAAa,CAAA,EACxC,CAAA;AAAA,UACC,SAAA,IAAa,SAAA,IAAa,MAAA,CAAO,kBAAA,mBACjCA,GAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACA,EAAA,EAAI,GAAG,KAAK,CAAA,GAAA,CAAA;AAAA,cACZ,WAAA,EAAU,QAAA;AAAA,cACV,SAAA,EAAW,EAAA;AAAA,gBACV,oDAAA;AAAA,gBACA,kBAAkB,YAAA,GAAe;AAAA,eAClC;AAAA,cAEA,QAAA,kBAAAA,GAAAA,CAAC,WAAA,EAAA,EAAY,IAAA,EAAM,OAAO,kBAAA,EAAoB;AAAA;AAAA,WAC/C,GACG;AAAA,SAAA,EACL;AAAA,OAAA,EACD,CAAA,EAAA,EAtCgB,OAAO,UAuCxB,CAAA;AAAA,IAEF,CAAC,GAEH,CAAA,EACD;AAAA,GAAA,EACD,CAAA;AAEF;AChSA,SAAS,cAAA,CAAe,EAAE,IAAA,EAAM,SAAA,EAAU,EAAyC;AAClF,EAAA,MAAM,GAAA,GAAY,cAAwB,IAAI,CAAA;AAE9C,EAAM,uBAAgB,MAAM;AAC3B,IAAA,IAAI,IAAI,OAAA,EAAS;AAChB,MAAA,GAAA,CAAI,QAAQ,SAAA,GAAY,IAAA;AAAA,IACzB;AAAA,EACD,CAAA,EAAG,CAAC,IAAI,CAAC,CAAA;AAET,EAAA,uBAAOA,GAAAA,CAAC,MAAA,EAAA,EAAK,GAAA,EAAU,SAAA,EAAsB,CAAA;AAC9C;AAUA,SAAS,cAAc,KAAA,EAAgC;AACtD,EAAA,OAAO,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,CAAE,IAAI,CAAC,CAAC,KAAA,EAAO,QAAQ,CAAA,KAAM,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,KAAK,CAAA,CAAE,CAAA;AAC/E;AAGA,SAAS,gBAAgB,QAAA,EAAmC;AAC3D,EAAA,MAAM,QAAuB,EAAC;AAC9B,EAAA,KAAA,MAAW,QAAQ,QAAA,EAAU;AAC5B,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAC5B,IAAA,MAAM,QAAA,GAAW,MAAM,CAAC,CAAA;AACxB,IAAA,MAAM,KAAA,GAAQ,MAAM,CAAC,CAAA;AACrB,IAAA,IAAI,YAAY,KAAA,EAAO;AACtB,MAAA,KAAA,CAAM,KAAK,CAAA,GAAI,QAAA;AAAA,IAChB;AAAA,EACD;AACA,EAAA,OAAO,KAAA;AACR;AAMA,IAAM,eAAA,GAAkBC,GAAAA;AAAA,EACvB;AAAA,IACC,yCAAA;AAAA,IACA,6CAAA;AAAA,IACA,gCAAA;AAAA,IACA;AAAA,GACD;AAAA,EACA;AAAA,IACC,QAAA,EAAU;AAAA,MACT,KAAA,EAAO;AAAA,QACN,KAAA,EAAO,wCAAA;AAAA,QACP,KAAA,EAAO,0BAAA;AAAA,QACP,MAAA,EAAQ,0BAAA;AAAA,QACR,OAAA,EAAS,sBAAA;AAAA,QACT,SAAA,EAAW;AAAA;AACZ,KACD;AAAA,IACA,eAAA,EAAiB;AAAA,MAChB,KAAA,EAAO;AAAA;AACR;AAEF,CAAA;AAEA,IAAM,mBAAA,GAAsBA,GAAAA;AAAA,EAC3B;AAAA,IACC,yCAAA;AAAA,IACA,8BAAA;AAAA,IACA,uBAAA;AAAA,IACA,6BAAA;AAAA,IACA;AAAA,GACD;AAAA,EACA;AAAA,IACC,QAAA,EAAU;AAAA,MACT,KAAA,EAAO;AAAA,QACN,IAAA,EAAM,2IAAA;AAAA,QACN,QAAA,EAAU,mFAAA;AAAA,QACV,QAAA,EAAU,4BAAA;AAAA,QACV,QAAA,EAAU;AAAA;AACX,KACD;AAAA,IACA,eAAA,EAAiB;AAAA,MAChB,KAAA,EAAO;AAAA;AACR;AAEF,CAAA;AAeA,SAAS,WAAA,CAAY,EAAE,EAAA,EAAI,WAAA,EAAa,UAAU,UAAA,EAAY,OAAA,EAAS,eAAc,EAAqB;AACzG,EAAA,MAAM,EAAE,UAAA,EAAY,SAAA,EAAW,UAAA,EAAY,UAAA,KAAe,YAAA,CAAa;AAAA,IACtE,EAAA,EAAI,UAAU,EAAE,CAAA,CAAA;AAAA,IAChB,IAAA,EAAM,EAAE,IAAA,EAAM,QAAA,EAAU,UAAU,EAAA,EAAG;AAAA,IACrC,QAAA,EAAU,YAAY,aAAA,IAAiB;AAAA,GACvC,CAAA;AAED,EAAA,IAAI,aAAA,IAAiB,GAAG,OAAO,IAAA;AAK/B,EAAA,MAAM,WAAW,MAAqD;AACrE,IAAA,IAAI,UAAU,OAAO,UAAA;AACrB,IAAA,IAAI,YAAY,OAAO,UAAA;AACvB,IAAA,IAAI,YAAY,OAAO,UAAA;AACvB,IAAA,OAAO,MAAA;AAAA,EACR,CAAA;AAEA,EAAA,uBACCI,IAAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACA,GAAA,EAAK,UAAA;AAAA,MACL,IAAA,EAAK,QAAA;AAAA,MACL,OAAA,EAAS,WAAW,MAAA,GAAY,OAAA;AAAA,MAChC,SAAA,EAAW,GAAG,mBAAA,CAAoB,EAAE,OAAO,QAAA,EAAS,EAAG,CAAA,EAAG,wBAAwB,CAAA;AAAA,MAClF,QAAA;AAAA,MACC,GAAG,UAAA;AAAA,MACH,GAAG,SAAA;AAAA,MAEJ,QAAA,EAAA;AAAA,wBAAAL,GAAAA,CAAC,cAAA,EAAA,EAAe,IAAA,EAAM,WAAA,EAAa,CAAA;AAAA,QAClC,gBAAgB,CAAA,oBAAKK,IAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,oCAAA,EAAqC,QAAA,EAAA;AAAA,UAAA,MAAA;AAAA,UAAE;AAAA,SAAA,EAAc;AAAA;AAAA;AAAA,GAC5F;AAEF;AAgBA,SAAS,OAAA,CAAQ,EAAE,KAAA,EAAO,UAAA,EAAY,SAAS,OAAA,EAAS,QAAA,EAAU,SAAA,EAAW,YAAA,EAAa,EAAiB;AAC1G,EAAA,MAAM,EAAE,UAAA,EAAY,MAAA,EAAO,GAAI,YAAA,CAAa;AAAA,IAC3C,EAAA,EAAI,OAAO,KAAK,CAAA,CAAA;AAAA,IAChB,IAAA,EAAM,EAAE,IAAA,EAAM,KAAA,EAAO,KAAA,EAAM;AAAA,IAC3B;AAAA,GACA,CAAA;AAED,EAAA,MAAM,WAAW,MAAqD;AACrE,IAAA,IAAI,gBAAgB,UAAA,EAAY;AAC/B,MAAA,OAAO,YAAY,SAAA,GAAY,WAAA;AAAA,IAChC;AACA,IAAA,IAAI,QAAQ,OAAO,OAAA;AACnB,IAAA,IAAI,YAAY,OAAO,QAAA;AACvB,IAAA,OAAO,OAAA;AAAA,EACR,CAAA;AAEA,EAAA,uBACCL,GAAAA,CAAC,MAAA,EAAA,EAAK,GAAA,EAAK,UAAA,EAAY,WAAW,EAAA,CAAG,eAAA,CAAgB,EAAE,KAAA,EAAO,UAAS,EAAG,CAAC,CAAA,EACzE,uCACAK,IAAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACA,IAAA,EAAK,QAAA;AAAA,MACL,OAAA,EAAS,WAAW,MAAA,GAAY,OAAA;AAAA,MAChC,QAAA;AAAA,MACA,SAAA,EAAW,EAAA;AAAA,QACV,yBAAA;AAAA,QACA,CAAC,QAAA,IAAY,oCAAA;AAAA,QACb,QAAA,IAAY;AAAA,OACb;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAAL,GAAAA,CAAC,cAAA,EAAA,EAAe,IAAA,EAAM,UAAA,CAAW,WAAA,EAAa,CAAA;AAAA,QAC7C,CAAC,QAAA,oBAAYA,IAAC,MAAA,EAAA,EAAK,SAAA,EAAU,sBAAqB,QAAA,EAAA,MAAA,EAAC;AAAA;AAAA;AAAA,sBAGrDA,GAAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACA,IAAA,EAAK,QAAA;AAAA,MACL,OAAA,EAAS,WAAW,MAAA,GAAY,OAAA;AAAA,MAChC,QAAA;AAAA,MACA,SAAA,EAAW,EAAA;AAAA,QACV,8DAAA;AAAA,QACA,CAAC,QAAA,IAAY;AAAA,OACd;AAAA,MAEA,QAAA,kBAAAA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,cAAa,QAAA,EAAA,KAAA,EAAG;AAAA;AAAA,GACjC,EAEF,CAAA;AAEF;AAgBO,SAAS,mBAAA,CAAoB;AAAA,EACnC,WAAA;AAAA,EACA,WAAW,EAAC;AAAA,EACZ,cAAA;AAAA,EACA,QAAA,GAAW,KAAA;AAAA,EACX,YAAA,GAAe,KAAA;AAAA,EACf;AACD,CAAA,EAA6B;AAE5B,EAAA,MAAM,YAAA,GAAqB,eAAQ,MAAM,eAAA,CAAgB,QAAQ,CAAA,EAAG,CAAC,QAAQ,CAAC,CAAA;AAG9E,EAAA,MAAM,CAAC,gBAAA,EAAkB,mBAAmB,CAAA,GAAU,gBAAwB,IAAI,CAAA;AAGlF,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAU,gBAAwB,IAAI,CAAA;AAC1E,EAAA,MAAM,YAAA,GAAqB,MAAA,CAAA,OAAA;AAAA,IAC1B,MAAM,YAAY,QAAA,CAAS,IAAA,CAAK,CAAC,EAAA,KAAO,EAAA,CAAG,OAAO,YAAY,CAAA;AAAA,IAC9D,CAAC,YAAA,EAAc,WAAA,CAAY,QAAQ;AAAA,GACpC;AAGA,EAAA,MAAM,gBAAA,GAAmB,CAAC,QAAA,KAA6B;AACtD,IAAA,MAAM,MAAA,GAAS,YAAY,QAAA,CAAS,IAAA,CAAK,CAAC,EAAA,KAAO,EAAA,CAAG,OAAO,QAAQ,CAAA;AACnE,IAAA,IAAI,CAAC,QAAQ,OAAO,CAAA;AACpB,IAAA,IAAI,MAAA,CAAO,QAAA,KAAa,CAAA,EAAG,OAAO,GAAA;AAClC,IAAA,MAAM,SAAA,GAAY,MAAA,CAAO,MAAA,CAAO,YAAY,CAAA,CAAE,OAAO,CAAC,EAAA,KAAO,EAAA,KAAO,QAAQ,CAAA,CAAE,MAAA;AAC9E,IAAA,OAAO,OAAO,QAAA,GAAW,SAAA;AAAA,EAC1B,CAAA;AAGA,EAAA,MAAM,iBAAA,GAAoB,CAAC,QAAA,KAAqB;AAC/C,IAAA,IAAI,YAAY,YAAA,EAAc;AAC9B,IAAA,mBAAA,CAAoB,CAAC,IAAA,KAAU,IAAA,KAAS,QAAA,GAAW,OAAO,QAAS,CAAA;AAAA,EACpE,CAAA;AAGA,EAAA,MAAM,cAAA,GAAiB,CAAC,KAAA,KAAkB;AACzC,IAAA,IAAI,QAAA,IAAY,YAAA,IAAgB,CAAC,gBAAA,EAAkB;AAGnD,IAAA,IAAI,gBAAA,CAAiB,gBAAgB,CAAA,IAAK,CAAA,EAAG;AAC5C,MAAA,mBAAA,CAAoB,IAAI,CAAA;AACxB,MAAA;AAAA,IACD;AAGA,IAAA,MAAM,WAAW,EAAE,GAAG,cAAc,CAAC,KAAK,GAAG,gBAAA,EAAiB;AAC9D,IAAA,cAAA,GAAiB,aAAA,CAAc,QAAQ,CAAC,CAAA;AACxC,IAAA,mBAAA,CAAoB,IAAI,CAAA;AAAA,EACzB,CAAA;AAGA,EAAA,MAAM,cAAA,GAAiB,CAAC,KAAA,KAAkB;AACzC,IAAA,IAAI,YAAY,YAAA,EAAc;AAC9B,IAAA,MAAM,QAAA,GAAW,EAAE,GAAG,YAAA,EAAa;AACnC,IAAA,OAAO,SAAS,KAAK,CAAA;AACrB,IAAA,cAAA,GAAiB,aAAA,CAAc,QAAQ,CAAC,CAAA;AAAA,EACzC,CAAA;AAGA,EAAA,MAAM,aAAA,GAAgB,CAAC,KAAA,KAAwB;AAC9C,IAAA,eAAA,CAAgB,IAAI,CAAA;AACpB,IAAA,MAAM,EAAE,MAAA,EAAQ,IAAA,EAAK,GAAI,KAAA;AACzB,IAAA,IAAI,CAAC,IAAA,EAAM;AAEX,IAAA,MAAM,UAAA,GAAa,OAAO,IAAA,CAAK,OAAA;AAC/B,IAAA,MAAM,UAAA,GAAa,KAAK,IAAA,CAAK,OAAA;AAE7B,IAAA,IAAI,UAAA,EAAY,IAAA,KAAS,QAAA,IAAY,UAAA,EAAY,SAAS,KAAA,EAAO;AAChE,MAAA,MAAM,WAAW,UAAA,CAAW,QAAA;AAC5B,MAAA,MAAM,QAAQ,UAAA,CAAW,KAAA;AAEzB,MAAA,IAAI,OAAO,QAAA,KAAa,QAAA,IAAY,OAAO,UAAU,QAAA,EAAU;AAE9D,QAAA,IAAI,gBAAA,CAAiB,QAAQ,CAAA,IAAK,CAAA,EAAG;AAErC,QAAA,MAAM,WAAW,EAAE,GAAG,cAAc,CAAC,KAAK,GAAG,QAAA,EAAS;AACtD,QAAA,cAAA,GAAiB,aAAA,CAAc,QAAQ,CAAC,CAAA;AAAA,MACzC;AAAA,IACD;AAAA,EACD,CAAA;AAGA,EAAA,MAAM,SAAA,GAAkB,eAAQ,MAAM;AACrC,IAAA,MAAM,SAAqC,EAAC;AAC5C,IAAA,KAAA,MAAW,GAAA,IAAO,YAAY,IAAA,EAAM;AACnC,MAAA,MAAA,CAAO,GAAA,CAAI,EAAE,CAAA,GAAI,GAAA;AAAA,IAClB;AACA,IAAA,OAAO,MAAA;AAAA,EACR,CAAA,EAAG,CAAC,WAAA,CAAY,IAAI,CAAC,CAAA;AAErB,EAAA,uBACCK,IAAAA;AAAA,IAAC,UAAA;AAAA,IAAA;AAAA,MACA,kBAAA,EAAoB,aAAA;AAAA,MACpB,WAAA,EAAa,CAAC,CAAA,KAAM;AACnB,QAAA,MAAM,EAAA,GAAK,EAAE,MAAA,CAAO,EAAA;AACpB,QAAA,MAAM,QAAA,GAAW,OAAO,EAAA,KAAO,QAAA,GAAW,GAAG,OAAA,CAAQ,SAAA,EAAW,EAAE,CAAA,GAAI,IAAA;AACtE,QAAA,eAAA,CAAgB,QAAQ,CAAA;AACxB,QAAA,mBAAA,CAAoB,IAAI,CAAA;AAAA,MACzB,CAAA;AAAA,MACA,SAAA,EAAW,aAAA;AAAA,MAEX,QAAA,EAAA;AAAA,wBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EAEd,QAAA,EAAA;AAAA,0BAAAA,IAAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACA,SAAA,EAAW,EAAA;AAAA,gBACV,uCAAA;AAAA,gBACA,qCAAA;AAAA,gBACA,QAAA,IAAY,eAAe,0BAAA,GAA6B;AAAA,eACzD;AAAA,cAEC,QAAA,EAAA;AAAA,gBAAA,WAAA,CAAY,QAAA,CAAS,GAAA,CAAI,CAAC,MAAA,qBAC1BL,GAAAA;AAAA,kBAAC,WAAA;AAAA,kBAAA;AAAA,oBAEA,IAAI,MAAA,CAAO,EAAA;AAAA,oBACX,aAAa,MAAA,CAAO,WAAA;AAAA,oBACpB,UAAU,QAAA,IAAY,YAAA;AAAA,oBACtB,UAAA,EAAY,qBAAqB,MAAA,CAAO,EAAA;AAAA,oBACxC,OAAA,EAAS,MAAM,iBAAA,CAAkB,MAAA,CAAO,EAAE,CAAA;AAAA,oBAC1C,aAAA,EAAe,gBAAA,CAAiB,MAAA,CAAO,EAAE;AAAA,mBAAA;AAAA,kBANpC,MAAA,CAAO;AAAA,iBAQb,CAAA;AAAA,gBACA,WAAA,CAAY,SAAS,KAAA,CAAM,CAAC,MAAM,gBAAA,CAAiB,CAAA,CAAE,EAAE,CAAA,IAAK,CAAC;AAAA;AAAA;AAAA,WAC/D;AAAA,UAGC,gBAAA,IAAoB,CAAC,QAAA,IAAY,CAAC,YAAA,oBAClCA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,6CAAA,EAA8C,QAAA,EAAA,yCAAA,EAAuC,CAAA;AAAA,0BAInGA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2BACd,QAAA,kBAAAA,GAAAA;AAAA,YAAC,WAAA;AAAA,YAAA;AAAA,cACA,MAAM,WAAA,CAAY,WAAA;AAAA,cAClB,SAAA;AAAA,cACA,SAAA,EAAW,CAAC,GAAA,KAAQ;AACnB,gBAAA,MAAM,QAAA,GAAW,YAAA,CAAa,GAAA,CAAI,EAAE,CAAA;AACpC,gBAAA,MAAM,MAAA,GAAS,YAAY,QAAA,CAAS,IAAA,CAAK,CAAC,EAAA,KAAO,EAAA,CAAG,OAAO,QAAQ,CAAA;AAEnE,gBAAA,uBACCA,GAAAA;AAAA,kBAAC,OAAA;AAAA,kBAAA;AAAA,oBACA,OAAO,GAAA,CAAI,EAAA;AAAA,oBACX,UAAA,EAAY,MAAA;AAAA,oBACZ,OAAA,EAAS,MAAM,cAAA,CAAe,GAAA,CAAI,EAAE,CAAA;AAAA,oBACpC,OAAA,EAAS,MAAM,cAAA,CAAe,GAAA,CAAI,EAAE,CAAA;AAAA,oBACpC,UAAU,QAAA,IAAY,YAAA;AAAA,oBACtB,SAAA,EAAW,cAAA,GAAiB,GAAA,CAAI,EAAE,CAAA;AAAA,oBAClC;AAAA;AAAA,iBACD;AAAA,cAEF;AAAA;AAAA,WACD,EACD;AAAA,SAAA,EACD,CAAA;AAAA,wBAGAA,GAAAA,CAAC,WAAA,EAAA,EAAY,aAAA,EAAe,IAAA,EAC1B,QAAA,EAAA,YAAA,mBACAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,EAAA,CAAG,mBAAA,CAAoB,EAAE,KAAA,EAAO,UAAA,EAAY,CAAA,EAAG,2BAA2B,CAAA,EACzF,QAAA,kBAAAA,GAAAA,CAAC,cAAA,EAAA,EAAe,IAAA,EAAM,YAAA,CAAa,WAAA,EAAa,CAAA,EACjD,CAAA,GACG,IAAA,EACL;AAAA;AAAA;AAAA,GACD;AAEF;;;AC1YA,SAAS,MAAM,GAAA,EAA2B;AACzC,EAAA,IAAI,CAAA,GAAI,aAAa,GAAA,CAAI,MAAA;AACzB,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,GAAA,CAAI,QAAQ,CAAA,EAAA,EAAK;AACpC,IAAA,CAAA,GAAI,KAAK,IAAA,CAAK,CAAA,GAAI,IAAI,UAAA,CAAW,CAAC,GAAG,UAAU,CAAA;AAC/C,IAAA,CAAA,GAAK,CAAA,IAAK,KAAO,CAAA,KAAM,EAAA;AAAA,EACxB;AACA,EAAA,OAAO,MAAM;AACZ,IAAA,CAAA,GAAI,IAAA,CAAK,IAAA,CAAK,CAAA,GAAK,CAAA,KAAM,IAAK,UAAU,CAAA;AACxC,IAAA,CAAA,GAAI,IAAA,CAAK,IAAA,CAAK,CAAA,GAAK,CAAA,KAAM,IAAK,UAAU,CAAA;AACxC,IAAA,MAAM,UAAU,CAAA,KAAM,EAAA;AACtB,IAAA,CAAA,GAAI,CAAA,GAAI,OAAA;AACR,IAAA,OAAO,CAAA,KAAM,CAAA;AAAA,EACd,CAAA;AACD;AAEA,SAAS,WAAW,IAAA,EAA4B;AAC/C,EAAA,IAAI,KAAA,GAAQ,IAAA;AACZ,EAAA,OAAO,MAAM;AACZ,IAAA,KAAA,GAAQ,KAAA,GAAQ,UAAA;AAChB,IAAA,IAAI,CAAA,GAAI,KAAA;AACR,IAAA,CAAA,GAAI,KAAK,IAAA,CAAK,CAAA,GAAK,CAAA,KAAM,EAAA,EAAK,IAAI,CAAC,CAAA;AACnC,IAAA,CAAA,GAAI,CAAA,GAAK,IAAI,IAAA,CAAK,IAAA,CAAK,IAAK,CAAA,KAAM,CAAA,EAAI,IAAI,EAAE,CAAA;AAC5C,IAAA,OAAA,CAAA,CAAS,CAAA,GAAK,CAAA,KAAM,EAAA,MAAS,CAAA,IAAK,UAAA;AAAA,EACnC,CAAA;AACD;AAEO,SAAS,eAAA,CAAmB,OAAY,IAAA,EAAmB;AACjE,EAAA,MAAM,GAAA,GAAM,MAAM,KAAA,EAAM;AACxB,EAAA,MAAM,MAAA,GAAS,MAAM,IAAI,CAAA;AACzB,EAAA,MAAM,GAAA,GAAM,UAAA,CAAW,MAAA,EAAQ,CAAA;AAC/B,EAAA,KAAA,IAAS,IAAI,GAAA,CAAI,MAAA,GAAS,CAAA,EAAG,CAAA,GAAI,GAAG,CAAA,EAAA,EAAK;AACxC,IAAA,MAAM,IAAI,IAAA,CAAK,KAAA,CAAM,GAAA,EAAI,IAAK,IAAI,CAAA,CAAE,CAAA;AACpC,IAAA,MAAM,EAAA,GAAK,IAAI,CAAC,CAAA;AAChB,IAAA,MAAM,EAAA,GAAK,IAAI,CAAC,CAAA;AAChB,IAAA,IAAI,EAAA,KAAO,MAAA,IAAa,EAAA,KAAO,MAAA,EAAW;AAC1C,IAAA,GAAA,CAAI,CAAC,CAAA,GAAI,EAAA;AACT,IAAA,GAAA,CAAI,CAAC,CAAA,GAAI,EAAA;AAAA,EACV;AACA,EAAA,OAAO,GAAA;AACR;AChCA,IAAM,qBAAA,GAAwBC,GAAAA;AAAA,EAC7B;AAAA,IACC,gBAAA;AAAA,IACA,8CAAA;AAAA,IACA,2NAAA;AAAA,IACA,sOAAA;AAAA,IACA,uIAAA;AAAA,IACA,iDAAA;AAAA,IACA;AAAA,GACD;AAAA,EACA;AAAA,IACC,QAAA,EAAU;AAAA,MACT,OAAA,EAAS;AAAA,QACR,OAAA,EAAS;AAAA,UACR,+CAAA;AAAA,UACA,+CAAA;AAAA,UACA;AAAA,SACD;AAAA,QACA,KAAA,EAAO;AAAA,UACN,+CAAA;AAAA,UACA,0CAAA;AAAA,UACA;AAAA,SACD;AAAA,QACA,QAAA,EAAU;AAAA,UACT,+CAAA;AAAA,UACA,6CAAA;AAAA,UACA;AAAA,SACD;AAAA,QACA,GAAA,EAAK;AAAA,UACJ,+CAAA;AAAA,UACA,wCAAA;AAAA,UACA;AAAA,SACD;AAAA,QACA,GAAA,EAAK;AAAA,UACJ,+CAAA;AAAA,UACA,wCAAA;AAAA,UACA;AAAA,SACD;AAAA,QACA,KAAA,EAAO;AAAA,UACN,+CAAA;AAAA,UACA,0CAAA;AAAA,UACA;AAAA;AACD,OACD;AAAA,MACA,OAAA,EAAS;AAAA,QACR,IAAA,EAAM,CAAC,oDAAoD,CAAA;AAAA,QAC3D,KAAA,EAAO,CAAC,uDAAuD;AAAA;AAChE,KACD;AAAA,IACA,eAAA,EAAiB;AAAA,MAChB,OAAA,EAAS,SAAA;AAAA,MACT,OAAA,EAAS;AAAA;AACV;AAEF,CAAA;AAEA,SAAS,MAAA,CAAO,EAAE,GAAG,KAAA,EAAM,EAAsD;AAChF,EAAA,uBAAOD,GAAAA,CAAiB,eAAA,CAAA,IAAA,EAAhB,EAAqB,WAAA,EAAU,QAAA,EAAU,GAAG,KAAA,EAAO,CAAA;AAC5D;AAMA,SAAS,WAAA,CAAY,EAAE,SAAA,EAAW,GAAG,OAAM,EAAuD;AACjG,EAAA,uBACCA,GAAAA;AAAA,IAAiB,eAAA,CAAA,KAAA;AAAA,IAAhB;AAAA,MACA,WAAA,EAAU,cAAA;AAAA,MACV,SAAA,EAAW,EAAA,CAAG,iCAAA,EAAmC,SAAS,CAAA;AAAA,MACzD,GAAG;AAAA;AAAA,GACL;AAEF;AAEA,SAAS,aAAA,CAAc;AAAA,EACtB,SAAA;AAAA,EACA,IAAA,GAAO,SAAA;AAAA,EACP,OAAA,GAAU,SAAA;AAAA,EACV,QAAA;AAAA,EACA,OAAA,GAAU,IAAA;AAAA,EACV,KAAA;AAAA,EACA,GAAG;AACJ,CAAA,EAGI;AACH,EAAA,uBACCK,IAAAA;AAAA,IAAiB,eAAA,CAAA,OAAA;AAAA,IAAhB;AAAA,MACA,WAAA,EAAU,gBAAA;AAAA,MACV,WAAA,EAAW,IAAA;AAAA,MACX,cAAA,EAAc,OAAA;AAAA,MACd,SAAA,EAAW,GAAG,qBAAA,CAAsB,EAAE,SAAS,OAAA,EAAS,SAAA,EAAW,CAAC,CAAA;AAAA,MACpE,KAAA,EAAO,EAAE,KAAA,EAAO,0BAAA,EAA4B,GAAG,KAAA,EAAM;AAAA,MACpD,GAAG,KAAA;AAAA,MAEH,QAAA,EAAA;AAAA,QAAA,QAAA;AAAA,wBACDL,GAAAA,CAAiB,eAAA,CAAA,IAAA,EAAhB,EAAqB,OAAA,EAAO,IAAA,EAC5B,QAAA,kBAAAA,GAAAA,CAAC,eAAA,EAAA,EAAgB,SAAA,EAAU,mBAAA,EAAoB,CAAA,EAChD;AAAA;AAAA;AAAA,GACD;AAEF;AAEA,SAAS,aAAA,CAAc;AAAA,EACtB,SAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA,GAAW,QAAA;AAAA,EACX,KAAA,GAAQ,QAAA;AAAA,EACR,GAAG;AACJ,CAAA,EAAyD;AACxD,EAAA,uBACCA,GAAAA,CAAiB,eAAA,CAAA,MAAA,EAAhB,EACA,QAAA,kBAAAK,IAAAA;AAAA,IAAiB,eAAA,CAAA,OAAA;AAAA,IAAhB;AAAA,MACA,WAAA,EAAU,gBAAA;AAAA,MACV,SAAA,EAAW,EAAA;AAAA,QACV,wlBAAA;AAAA,QACA,aAAa,QAAA,IACZ,iIAAA;AAAA,QACD;AAAA,OACD;AAAA,MACA,QAAA;AAAA,MACA,KAAA;AAAA,MACC,GAAG,KAAA;AAAA,MAEJ,QAAA,EAAA;AAAA,wBAAAL,IAAC,oBAAA,EAAA,EAAqB,CAAA;AAAA,wBACtBA,GAAAA;AAAA,UAAiB,eAAA,CAAA,QAAA;AAAA,UAAhB;AAAA,YACA,SAAA,EAAW,EAAA;AAAA,cACV,KAAA;AAAA,cACA,aAAa,QAAA,IACZ;AAAA,aACF;AAAA,YAEC;AAAA;AAAA,SACF;AAAA,wBACAA,IAAC,sBAAA,EAAA,EAAuB;AAAA;AAAA;AAAA,GACzB,EACD,CAAA;AAEF;AAYA,SAAS,WAAW,EAAE,SAAA,EAAW,QAAA,EAAU,GAAG,OAAM,EAAsD;AACzG,EAAA,uBACCK,IAAAA;AAAA,IAAiB,eAAA,CAAA,IAAA;AAAA,IAAhB;AAAA,MACA,WAAA,EAAU,aAAA;AAAA,MACV,SAAA,EAAW,EAAA;AAAA,QACV,2aAAA;AAAA,QACA;AAAA,OACD;AAAA,MACC,GAAG,KAAA;AAAA,MAEJ,QAAA,EAAA;AAAA,wBAAAL,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,4DAAA,EACf,0BAAAA,GAAAA,CAAiB,eAAA,CAAA,aAAA,EAAhB,EACA,QAAA,kBAAAA,GAAAA,CAAC,SAAA,EAAA,EAAU,SAAA,EAAU,QAAA,EAAS,GAC/B,CAAA,EACD,CAAA;AAAA,wBACAA,GAAAA,CAAiB,eAAA,CAAA,QAAA,EAAhB,EAA0B,QAAA,EAAS;AAAA;AAAA;AAAA,GACrC;AAEF;AAYA,SAAS,oBAAA,CAAqB,EAAE,SAAA,EAAW,GAAG,OAAM,EAAgE;AACnH,EAAA,uBACCA,GAAAA;AAAA,IAAiB,eAAA,CAAA,cAAA;AAAA,IAAhB;AAAA,MACA,WAAA,EAAU,yBAAA;AAAA,MACV,SAAA,EAAW,EAAA,CAAG,sDAAA,EAAwD,SAAS,CAAA;AAAA,MAC9E,GAAG,KAAA;AAAA,MAEJ,QAAA,kBAAAA,GAAAA,CAAC,aAAA,EAAA,EAAc,SAAA,EAAU,QAAA,EAAS;AAAA;AAAA,GACnC;AAEF;AAEA,SAAS,sBAAA,CAAuB;AAAA,EAC/B,SAAA;AAAA,EACA,GAAG;AACJ,CAAA,EAAkE;AACjE,EAAA,uBACCA,GAAAA;AAAA,IAAiB,eAAA,CAAA,gBAAA;AAAA,IAAhB;AAAA,MACA,WAAA,EAAU,2BAAA;AAAA,MACV,SAAA,EAAW,EAAA,CAAG,sDAAA,EAAwD,SAAS,CAAA;AAAA,MAC9E,GAAG,KAAA;AAAA,MAEJ,QAAA,kBAAAA,GAAAA,CAAC,eAAA,EAAA,EAAgB,SAAA,EAAU,QAAA,EAAS;AAAA;AAAA,GACrC;AAEF;ACjLA,SAASM,eAAAA,CAAe,EAAE,IAAA,EAAM,SAAA,EAAW,OAAM,EAAsE;AACtH,EAAA,MAAM,GAAA,GAAYC,cAAwB,IAAI,CAAA;AAE9C,EAAMA,iBAAU,MAAM;AACrB,IAAA,IAAI,IAAI,OAAA,EAAS;AAChB,MAAA,GAAA,CAAI,OAAA,CAAQ,SAAA,GAAY,kBAAA,CAAmB,IAAI,CAAA;AAAA,IAChD;AAAA,EACD,CAAA,EAAG,CAAC,IAAI,CAAC,CAAA;AAET,EAAA,uBAAOP,GAAAA,CAAC,MAAA,EAAA,EAAK,GAAA,EAAU,WAAsB,KAAA,EAAc,CAAA;AAC5D;AAUO,SAAS,iBAAA,CAAkB;AAAA,EACjC,KAAA;AAAA,EACA,QAAA;AAAA,EACA,cAAA;AAAA,EACA,QAAA,GAAW,KAAA;AAAA,EACX,YAAA;AAAA,EACA,OAAA,GAAU,OAAA;AAAA,EACV;AACD,CAAA,EAA2B;AAC1B,EAAA,MAAM,QAAA,GAAW,OAAO,QAAA,KAAa,QAAA,IAAY,SAAS,MAAA,GAAS,CAAA;AACnE,EAAA,MAAM,mBAAA,GAAsB,WAAW,EAAA,GAAK,yEAAA;AAG5C,EAAA,MAAM,KAAA,GAAcO,eAAQ,MAAM;AACjC,IAAA,OAAO,KAAA,CAAM,UAAU,eAAA,CAAgB,KAAA,CAAM,SAAS,KAAA,CAAM,UAAU,IAAI,KAAA,CAAM,OAAA;AAAA,EACjF,CAAA,EAAG,CAAC,KAAK,CAAC,CAAA;AAGV,EAAA,MAAM,eAAA,GAAkC,YAAA,IAAgB,QAAA,GAAY,SAAA,GAAY,QAAQ,UAAA,GAAc,OAAA;AACtG,EAAA,MAAM,WAAA,GAAc,YAAA,IAAgB,QAAA,IAAY,SAAA,KAAc,QAAQ,IAAA,GAAO,MAAA;AAG7E,EAAA,MAAM,iBAAA,GAA0BA,eAAQ,MAAM;AAC7C,IAAA,IAAI,CAAC,UAAU,OAAO,EAAA;AACtB,IAAA,MAAM,QAAQ,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,QAAQ,CAAA;AACjD,IAAA,OAAO,OAAO,WAAA,IAAe,EAAA;AAAA,EAC9B,CAAA,EAAG,CAAC,QAAA,EAAU,KAAA,EAAO,QAAQ,CAAC,CAAA;AAE9B,EAAA,uBACCF,IAAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACA,KAAA,EAAO,WAAW,QAAA,GAAW,EAAA;AAAA,MAC7B,aAAA,EAAe,CAAC,KAAA,KAAU;AACzB,QAAA,IAAI,CAAC,QAAA,IAAY,cAAA,EAAgB,cAAA,CAAe,KAAK,CAAA;AAAA,MACtD,CAAA;AAAA,MACA,UAAU,QAAA,IAAY,YAAA;AAAA,MAEtB,QAAA,EAAA;AAAA,wBAAAL,GAAAA;AAAA,UAAC,aAAA;AAAA,UAAA;AAAA,YACA,IAAA,EAAK,IAAA;AAAA,YACL,SAAA,EAAW,mBAAA;AAAA,YACX,OAAA,EAAS,WAAW,eAAA,GAAkB,SAAA;AAAA,YACtC,cAAA,EAAc,WAAA;AAAA,YAEd,0BAAAA,GAAAA,CAAC,WAAA,EAAA,EAAY,WAAA,EAAY,WAAA,EACvB,qCACAA,GAAAA;AAAA,cAACM,eAAAA;AAAA,cAAA;AAAA,gBACA,IAAA,EAAM,iBAAA;AAAA,gBACN,SAAA,EAAU,iCAAA;AAAA,gBACV,KAAA,EAAO,EAAE,KAAA,EAAO,0BAAA;AAA2B;AAAA,gBAEzC,IAAA,EACL;AAAA;AAAA,SACD;AAAA,wBACAN,GAAAA,CAAC,aAAA,EAAA,EAAc,QAAA,EAAS,cAAA,EACtB,QAAA,EAAA,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,qBACXA,GAAAA,CAAC,UAAA,EAAA,EAAsB,KAAA,EAAO,EAAE,EAAA,EAC/B,QAAA,kBAAAA,GAAAA,CAACM,eAAAA,EAAA,EAAe,IAAA,EAAM,CAAA,CAAE,WAAA,EAAa,CAAA,EAAA,EADrB,CAAA,CAAE,EAEnB,CACA,CAAA,EACF;AAAA;AAAA;AAAA,GACD;AAEF;AChGA,SAASA,eAAAA,CAAe,EAAE,IAAA,EAAM,SAAA,EAAU,EAAyC;AAClF,EAAA,MAAM,GAAA,GAAYE,cAAwB,IAAI,CAAA;AAE9C,EAAMA,uBAAgB,MAAM;AAC3B,IAAA,IAAI,IAAI,OAAA,EAAS;AAChB,MAAA,GAAA,CAAI,QAAQ,SAAA,GAAY,IAAA;AAAA,IACzB;AAAA,EACD,CAAA,EAAG,CAAC,IAAI,CAAC,CAAA;AAET,EAAA,uBAAOR,GAAAA,CAAC,MAAA,EAAA,EAAK,GAAA,EAAU,SAAA,EAAsB,CAAA;AAC9C;AAUA,SAAS,aAAA,CAAc,UAAkB,QAAA,EAA0B;AAClE,EAAA,OAAO,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAA;AAC/B;AAGA,SAASS,eAAc,KAAA,EAA6B;AACnD,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,KAAA,MAAW,CAAC,QAAA,EAAU,SAAS,KAAK,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,EAAG;AAC1D,IAAA,KAAA,MAAW,YAAY,SAAA,EAAW;AACjC,MAAA,KAAA,CAAM,IAAA,CAAK,aAAA,CAAc,QAAA,EAAU,QAAQ,CAAC,CAAA;AAAA,IAC7C;AAAA,EACD;AACA,EAAA,OAAO,KAAA;AACR;AAGA,SAASC,iBAAgB,QAAA,EAAgC;AACxD,EAAA,MAAM,QAAoB,EAAC;AAC3B,EAAA,KAAA,MAAW,QAAQ,QAAA,EAAU;AAC5B,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAC5B,IAAA,MAAM,QAAA,GAAW,MAAM,CAAC,CAAA;AACxB,IAAA,MAAM,QAAA,GAAW,MAAM,CAAC,CAAA;AACxB,IAAA,IAAI,YAAY,QAAA,EAAU;AACzB,MAAA,IAAI,CAAC,KAAA,CAAM,QAAQ,CAAA,EAAG;AACrB,QAAA,KAAA,CAAM,QAAQ,IAAI,EAAC;AAAA,MACpB;AACA,MAAA,KAAA,CAAM,QAAQ,CAAA,CAAE,IAAA,CAAK,QAAQ,CAAA;AAAA,IAC9B;AAAA,EACD;AACA,EAAA,OAAO,KAAA;AACR;AAMA,IAAM,iBAAA,GAAoBT,GAAAA;AAAA,EACzB,CAAC,oDAAA,EAAsD,qBAAA,EAAuB,6BAA6B,CAAA;AAAA,EAC3G;AAAA,IACC,QAAA,EAAU;AAAA,MACT,KAAA,EAAO;AAAA,QACN,KAAA,EAAO,yCAAA;AAAA,QACP,KAAA,EAAO,2EAAA;AAAA,QACP,MAAA,EAAQ,0EAAA;AAAA,QACR,QAAA,EAAU;AAAA;AACX,KACD;AAAA,IACA,eAAA,EAAiB;AAAA,MAChB,KAAA,EAAO;AAAA;AACR;AAEF,CAAA;AAEA,IAAMU,oBAAAA,GAAsBV,GAAAA;AAAA,EAC3B;AAAA,IACC,yCAAA;AAAA,IACA,8BAAA;AAAA,IACA,uBAAA;AAAA,IACA,6BAAA;AAAA,IACA;AAAA,GACD;AAAA,EACA;AAAA,IACC,QAAA,EAAU;AAAA,MACT,KAAA,EAAO;AAAA,QACN,IAAA,EAAM,2IAAA;AAAA,QACN,QAAA,EAAU,4BAAA;AAAA,QACV,MAAA,EAAQ,8DAAA;AAAA,QACR,OAAA,EAAS,8DAAA;AAAA,QACT,SAAA,EAAW,uEAAA;AAAA,QACX,QAAA,EAAU;AAAA;AACX,KACD;AAAA,IACA,eAAA,EAAiB;AAAA,MAChB,KAAA,EAAO;AAAA;AACR;AAEF,CAAA;AAiBA,SAAS,WAAA,CAAY;AAAA,EACpB,UAAA;AAAA,EACA,QAAA;AAAA,EACA,YAAA;AAAA,EACA,SAAA;AAAA,EACA,WAAA;AAAA,EACA,QAAA;AAAA,EACA,KAAA;AAAA,EACA;AACD,CAAA,EAAqB;AACpB,EAAA,MAAM,WAAA,GAAc,CAAC,QAAA,IAAY,KAAA,KAAU,aAAa,KAAA,KAAU,WAAA;AAElE,EAAA,MAAM,EAAE,UAAA,EAAY,SAAA,EAAW,UAAA,EAAY,UAAA,KAAeW,YAAAA,CAAa;AAAA,IACtE,EAAA,EAAI,UAAA;AAAA,IACJ,MAAM,EAAE,IAAA,EAAM,QAAA,EAAU,QAAA,EAAU,cAAc,SAAA,EAAU;AAAA,IAC1D,UAAU,CAAC;AAAA,GACX,CAAA;AAED,EAAA,MAAM,UAAA,GAAa,aAAa,UAAA,GAAa,KAAA;AAG7C,EAAA,uBACCP,IAAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACA,IAAA,EAAK,QAAA;AAAA,MACL,GAAA,EAAK,UAAA;AAAA,MACJ,GAAG,UAAA;AAAA,MACH,GAAG,SAAA;AAAA,MACJ,OAAA,EAAS,cAAc,QAAA,GAAW,MAAA;AAAA,MAClC,iBAAe,CAAC,WAAA;AAAA,MAChB,SAAA,EAAW,EAAA;AAAA,QACVM,oBAAAA,CAAoB,EAAE,KAAA,EAAO,UAAA,EAAY,CAAA;AAAA,QACzC,WAAA,IAAe,qCAAA;AAAA,QACf,CAAC,WAAA,IAAe;AAAA,OACjB;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAAX,GAAAA,CAACM,eAAAA,EAAA,EAAe,IAAA,EAAM,WAAA,EAAa,CAAA;AAAA,QAClC,+BAAeN,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,sEAAqE,QAAA,EAAA,MAAA,EAAC;AAAA;AAAA;AAAA,GACvG;AAEF;AAeA,SAAS,SAAA,CAAU,EAAE,MAAA,EAAQ,aAAA,EAAe,UAAU,cAAA,EAAgB,eAAA,EAAiB,cAAa,EAAmB;AACtH,EAAA,MAAM,EAAE,UAAA,EAAY,MAAA,EAAO,GAAIa,YAAAA,CAAa;AAAA,IAC3C,EAAA,EAAI,CAAA,OAAA,EAAU,MAAA,CAAO,EAAE,CAAA,CAAA;AAAA,IACvB,MAAM,EAAE,IAAA,EAAM,QAAA,EAAU,QAAA,EAAU,OAAO,EAAA,EAAG;AAAA,IAC5C;AAAA,GACA,CAAA;AAED,EAAA,MAAM,UAAA,GAAa,cAAc,MAAA,GAAS,CAAA;AAE1C,EAAA,MAAM,WAAW,MAAiD;AACjE,IAAA,IAAI,UAAU,OAAO,UAAA;AACrB,IAAA,IAAI,QAAQ,OAAO,OAAA;AACnB,IAAA,IAAI,YAAY,OAAO,QAAA;AACvB,IAAA,OAAO,OAAA;AAAA,EACR,CAAA;AAEA,EAAA,MAAM,aAAA,GAAgB,CAAC,QAAA,KAAsE;AAC5F,IAAA,IAAI,YAAA,EAAc;AACjB,MAAA,MAAM,OAAA,GAAU,aAAA,CAAc,QAAA,EAAU,MAAA,CAAO,EAAE,CAAA;AACjD,MAAA,MAAM,SAAA,GAAY,kBAAkB,OAAO,CAAA;AAC3C,MAAA,IAAI,SAAA,KAAc,MAAM,OAAO,SAAA;AAC/B,MAAA,IAAI,SAAA,KAAc,OAAO,OAAO,WAAA;AAAA,IACjC;AACA,IAAA,IAAI,UAAU,OAAO,UAAA;AACrB,IAAA,OAAO,QAAA;AAAA,EACR,CAAA;AAEA,EAAA,uBACCR,IAAAA,CAAC,KAAA,EAAA,EAAI,GAAA,EAAK,YAAY,SAAA,EAAW,EAAA,CAAG,iBAAA,CAAkB,EAAE,KAAA,EAAO,QAAA,EAAS,EAAG,CAAC,CAAA,EAE3E,QAAA,EAAA;AAAA,oBAAAL,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uEAAA,EACd,QAAA,kBAAAA,GAAAA,CAACM,eAAAA,EAAA,EAAe,IAAA,EAAM,MAAA,CAAO,WAAA,EAAa,CAAA,EAC3C,CAAA;AAAA,IAGC,aAAA,CAAc,WAAW,CAAA,mBACzBN,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0EAAA,EAA2E,QAAA,EAAA,WAAA,EAAS,CAAA,mBAEnGA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qBAAA,EACb,QAAA,EAAA,aAAA,CAAc,GAAA,CAAI,CAAC,EAAE,UAAA,EAAY,MAAA,EAAQ,KAAA,EAAM,qBAC/CA,GAAAA;AAAA,MAAC,WAAA;AAAA,MAAA;AAAA,QAEA,UAAA;AAAA,QACA,UAAU,MAAA,CAAO,EAAA;AAAA,QACjB,cAAc,MAAA,CAAO,EAAA;AAAA,QACrB,SAAA,EAAW,KAAA;AAAA,QACX,aAAa,MAAA,CAAO,WAAA;AAAA,QACpB,UAAU,QAAA,IAAY,YAAA;AAAA,QACtB,KAAA,EAAO,aAAA,CAAc,MAAA,CAAO,EAAE,CAAA;AAAA,QAC9B,QAAA,EAAU,MAAM,cAAA,CAAe,UAAU;AAAA,OAAA;AAAA,MARpC;AAAA,KAUN,CAAA,EACF;AAAA,GAAA,EAEF,CAAA;AAEF;AAYA,SAAS,eAAA,CAAgB,EAAE,MAAA,EAAQ,aAAA,EAAe,UAAS,EAAyB;AACnF,EAAA,MAAM,EAAE,UAAA,EAAY,SAAA,EAAW,UAAA,EAAY,UAAA,KAAeY,YAAAA,CAAa;AAAA,IACtE,EAAA,EAAI,CAAA,KAAA,EAAQ,MAAA,CAAO,EAAE,CAAA,CAAA;AAAA,IACrB,MAAM,EAAE,IAAA,EAAM,QAAA,EAAU,QAAA,EAAU,OAAO,EAAA,EAAG;AAAA,IAC5C,QAAA,EAAU,YAAY,aAAA,IAAiB;AAAA,GACvC,CAAA;AAED,EAAA,IAAI,aAAA,IAAiB,GAAG,OAAO,IAAA;AAE/B,EAAA,MAAM,WAAW,MAAwC;AACxD,IAAA,IAAI,YAAY,OAAO,UAAA;AACvB,IAAA,IAAI,UAAU,OAAO,UAAA;AACrB,IAAA,OAAO,MAAA;AAAA,EACR,CAAA;AAEA,EAAA,uBACCP,IAAAA,CAAC,KAAA,EAAA,EAAI,KAAK,UAAA,EAAY,SAAA,EAAW,GAAGM,oBAAAA,CAAoB,EAAE,KAAA,EAAO,QAAA,IAAY,CAAC,GAAI,GAAG,UAAA,EAAa,GAAG,SAAA,EACpG,QAAA,EAAA;AAAA,oBAAAX,GAAAA,CAACM,eAAAA,EAAA,EAAe,IAAA,EAAM,OAAO,WAAA,EAAa,CAAA;AAAA,IACzC,gBAAgB,CAAA,oBAAKD,IAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,oCAAA,EAAqC,QAAA,EAAA;AAAA,MAAA,MAAA;AAAA,MAAE;AAAA,KAAA,EAAc;AAAA,GAAA,EAC5F,CAAA;AAEF;AAWA,SAAS,aAAA,CAAc,EAAE,QAAA,EAAU,QAAA,EAAS,EAAuB;AAClE,EAAA,MAAM,EAAE,UAAA,EAAY,MAAA,EAAO,GAAIQ,YAAAA,CAAa;AAAA,IAC3C,EAAA,EAAI,aAAA;AAAA,IACJ,IAAA,EAAM,EAAE,IAAA,EAAM,MAAA,EAAO;AAAA,IACrB;AAAA,GACA,CAAA;AAED,EAAA,uBACCb,GAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACA,GAAA,EAAK,UAAA;AAAA,MACL,SAAA,EAAW,EAAA;AAAA,QACV,uCAAA;AAAA,QACA,kDAAA;AAAA,QACA,6BAAA;AAAA,QACA,WAAW,0BAAA,GAA6B,wCAAA;AAAA,QACxC,MAAA,IAAU,CAAC,QAAA,IAAY;AAAA,OACxB;AAAA,MAEC;AAAA;AAAA,GACF;AAEF;AAeO,SAAS,gBAAA,CAAiB;AAAA,EAChC,WAAA;AAAA,EACA,WAAW,EAAC;AAAA,EACZ,cAAA;AAAA,EACA,QAAA,GAAW,KAAA;AAAA,EACX,YAAA,GAAe,KAAA;AAAA,EACf;AACD,CAAA,EAA0B;AAEzB,EAAA,MAAM,OAAA,GAAU,UAAA;AAAA,IACf,UAAU,aAAA,EAAe;AAAA,MACxB,oBAAA,EAAsB;AAAA,QACrB,QAAA,EAAU;AAAA;AACX,KACA;AAAA,GACF;AAGA,EAAA,MAAM,YAAA,GAAqBQ,eAAQ,MAAME,gBAAAA,CAAgB,QAAQ,CAAA,EAAG,CAAC,QAAQ,CAAC,CAAA;AAG9E,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAUF,gBAAwB,IAAI,CAAA;AAC1E,EAAA,MAAM,YAAA,GAAqBA,eAAQ,MAAM;AACxC,IAAA,IAAI,CAAC,cAAc,OAAO,IAAA;AAE1B,IAAA,MAAM,QAAA,GAAW,YAAA,CAAa,UAAA,CAAW,OAAO,IAAI,YAAA,CAAa,OAAA,CAAQ,OAAA,EAAS,EAAE,CAAA,GAAI,YAAA,CAAa,KAAA,CAAM,GAAG,EAAE,CAAC,CAAA;AACjH,IAAA,OAAO,YAAY,aAAA,CAAc,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,QAAQ,CAAA;AAAA,EAC/D,CAAA,EAAG,CAAC,YAAA,EAAc,WAAA,CAAY,aAAa,CAAC,CAAA;AAG5C,EAAA,MAAM,mBAAA,GAAsB,CAAC,QAAA,KAA6B;AACzD,IAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,IAAA,KAAA,MAAW,OAAA,IAAW,MAAA,CAAO,MAAA,CAAO,YAAY,CAAA,EAAG;AAClD,MAAA,KAAA,IAAS,QAAQ,MAAA,CAAO,CAAC,EAAA,KAAO,EAAA,KAAO,QAAQ,CAAA,CAAE,MAAA;AAAA,IAClD;AACA,IAAA,OAAO,KAAA;AAAA,EACR,CAAA;AAGA,EAAA,MAAM,gBAAA,GAAmB,CAAC,MAAA,KAA4C;AACrE,IAAA,IAAI,MAAA,CAAO,QAAA,KAAa,CAAA,EAAG,OAAO,GAAA;AAClC,IAAA,OAAO,MAAA,CAAO,QAAA,GAAW,mBAAA,CAAoB,MAAA,CAAO,EAAE,CAAA;AAAA,EACvD,CAAA;AAGA,EAAA,MAAM,mBAAA,GAAsB,CAAC,MAAA,KAA6C;AACzE,IAAA,MAAM,MAAA,GAAS,YAAA,CAAa,MAAA,CAAO,EAAE,GAAG,MAAA,IAAU,CAAA;AAClD,IAAA,IAAI,MAAA,CAAO,QAAA,KAAa,CAAA,EAAG,OAAO,IAAA;AAClC,IAAA,OAAO,SAAS,MAAA,CAAO,QAAA;AAAA,EACxB,CAAA;AAGA,EAAA,MAAM,aAAA,GAAgB,CAAC,KAAA,KAAwB;AAC9C,IAAA,eAAA,CAAgB,IAAI,CAAA;AACpB,IAAA,MAAM,EAAE,MAAA,EAAQ,IAAA,EAAK,GAAI,KAAA;AACzB,IAAA,IAAI,CAAC,IAAA,EAAM;AAEX,IAAA,MAAM,UAAA,GAAa,OAAO,IAAA,CAAK,OAAA;AAC/B,IAAA,MAAM,QAAA,GAAW,KAAK,IAAA,CAAK,OAAA;AAG3B,IAAA,IAAI,QAAA,EAAU,IAAA,KAAS,MAAA,IAAU,UAAA,EAAY,SAAS,QAAA,EAAU;AAC/D,MAAA,MAAM,eAAe,UAAA,CAAW,YAAA;AAChC,MAAA,MAAM,YAAY,UAAA,CAAW,SAAA;AAE7B,MAAA,IAAI,OAAO,YAAA,KAAiB,QAAA,IAAY,OAAO,cAAc,QAAA,EAAU;AAGvE,MAAA,MAAM,QAAA,GAAW,EAAE,GAAG,YAAA,EAAa;AACnC,MAAA,MAAM,UAAA,GAAa,SAAS,YAAY,CAAA;AACxC,MAAA,IAAI,UAAA,EAAY;AACf,QAAA,QAAA,CAAS,YAAY,IAAI,UAAA,CAAW,MAAA,CAAO,CAAC,CAAA,EAAG,CAAA,KAAM,MAAM,SAAS,CAAA;AACpE,QAAA,IAAI,QAAA,CAAS,YAAY,CAAA,CAAE,MAAA,KAAW,CAAA,EAAG;AACxC,UAAA,OAAO,SAAS,YAAY,CAAA;AAAA,QAC7B;AAAA,MACD;AAEA,MAAA,cAAA,GAAiBC,cAAAA,CAAc,QAAQ,CAAC,CAAA;AACxC,MAAA;AAAA,IACD;AAGA,IAAA,IAAI,QAAA,EAAU,SAAS,QAAA,EAAU;AACjC,IAAA,MAAM,aAAa,QAAA,CAAS,QAAA;AAC5B,IAAA,IAAI,OAAO,eAAe,QAAA,EAAU;AAEpC,IAAA,MAAM,QAAA,GAAW,YAAY,aAAA,CAAc,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,UAAU,CAAA;AAC1E,IAAA,IAAI,CAAC,QAAA,EAAU;AAGf,IAAA,IAAI,UAAA,EAAY,SAAS,QAAA,EAAU;AAClC,MAAA,MAAM,WAAW,UAAA,CAAW,QAAA;AAC5B,MAAA,IAAI,OAAO,aAAa,QAAA,EAAU;AAElC,MAAA,MAAM,MAAA,GAAS,YAAY,aAAA,CAAc,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,QAAQ,CAAA;AACtE,MAAA,IAAI,CAAC,MAAA,EAAQ;AAGb,MAAA,IAAI,gBAAA,CAAiB,MAAM,CAAA,IAAK,CAAA,EAAG;AACnC,MAAA,IAAI,CAAC,mBAAA,CAAoB,QAAQ,CAAA,EAAG;AAGpC,MAAA,MAAM,QAAA,GAAW,EAAE,GAAG,YAAA,EAAa;AACnC,MAAA,IAAI,CAAC,QAAA,CAAS,UAAU,CAAA,EAAG;AAC1B,QAAA,QAAA,CAAS,UAAU,IAAI,EAAC;AAAA,MACzB;AACA,MAAA,QAAA,CAAS,UAAU,CAAA,GAAI,CAAC,GAAG,QAAA,CAAS,UAAU,GAAG,QAAQ,CAAA;AAEzD,MAAA,cAAA,GAAiBA,cAAAA,CAAc,QAAQ,CAAC,CAAA;AACxC,MAAA;AAAA,IACD;AAGA,IAAA,IAAI,UAAA,EAAY,SAAS,QAAA,EAAU;AAClC,MAAA,MAAM,WAAW,UAAA,CAAW,QAAA;AAC5B,MAAA,MAAM,eAAe,UAAA,CAAW,YAAA;AAChC,MAAA,MAAM,YAAY,UAAA,CAAW,SAAA;AAE7B,MAAA,IAAI,OAAO,aAAa,QAAA,IAAY,OAAO,iBAAiB,QAAA,IAAY,OAAO,cAAc,QAAA,EAAU;AAGvG,MAAA,IAAI,iBAAiB,UAAA,EAAY;AAGjC,MAAA,IAAI,CAAC,mBAAA,CAAoB,QAAQ,CAAA,EAAG;AAGpC,MAAA,MAAM,QAAA,GAAW,EAAE,GAAG,YAAA,EAAa;AACnC,MAAA,MAAM,UAAA,GAAa,SAAS,YAAY,CAAA;AACxC,MAAA,IAAI,UAAA,EAAY;AACf,QAAA,QAAA,CAAS,YAAY,IAAI,UAAA,CAAW,MAAA,CAAO,CAAC,CAAA,EAAG,CAAA,KAAM,MAAM,SAAS,CAAA;AACpE,QAAA,IAAI,QAAA,CAAS,YAAY,CAAA,CAAE,MAAA,KAAW,CAAA,EAAG;AACxC,UAAA,OAAO,SAAS,YAAY,CAAA;AAAA,QAC7B;AAAA,MACD;AAGA,MAAA,IAAI,CAAC,QAAA,CAAS,UAAU,CAAA,EAAG;AAC1B,QAAA,QAAA,CAAS,UAAU,IAAI,EAAC;AAAA,MACzB;AACA,MAAA,QAAA,CAAS,UAAU,CAAA,GAAI,CAAC,GAAG,QAAA,CAAS,UAAU,GAAG,QAAQ,CAAA;AAEzD,MAAA,cAAA,GAAiBA,cAAAA,CAAc,QAAQ,CAAC,CAAA;AAAA,IACzC;AAAA,EACD,CAAA;AAGA,EAAA,MAAM,kBAAA,GAAqB,CAAC,QAAA,EAAkB,KAAA,KAAkB;AAC/D,IAAA,IAAI,YAAY,YAAA,EAAc;AAE9B,IAAA,MAAM,QAAA,GAAW,EAAE,GAAG,YAAA,EAAa;AACnC,IAAA,MAAM,OAAA,GAAU,SAAS,QAAQ,CAAA;AACjC,IAAA,IAAI,OAAA,EAAS;AACZ,MAAA,QAAA,CAAS,QAAQ,IAAI,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,EAAG,CAAA,KAAM,MAAM,KAAK,CAAA;AACzD,MAAA,IAAI,QAAA,CAAS,QAAQ,CAAA,CAAE,MAAA,KAAW,CAAA,EAAG;AACpC,QAAA,OAAO,SAAS,QAAQ,CAAA;AAAA,MACzB;AAAA,IACD;AAEA,IAAA,cAAA,GAAiBA,cAAAA,CAAc,QAAQ,CAAC,CAAA;AAAA,EACzC,CAAA;AAGA,EAAA,MAAM,gBAAA,GAAmB,CAAC,QAAA,KAAqB;AAC9C,IAAA,MAAM,SAAA,GAAY,YAAA,CAAa,QAAQ,CAAA,IAAK,EAAC;AAC7C,IAAA,OAAO,SAAA,CAAU,GAAA,CAAI,CAAC,QAAA,EAAU,KAAA,KAAU;AACzC,MAAA,MAAM,MAAA,GAAS,YAAY,aAAA,CAAc,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,QAAQ,CAAA;AACtE,MAAA,OAAO;AAAA,QACN,YAAY,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,QAAQ,IAAI,KAAK,CAAA,CAAA;AAAA,QAC5C,MAAA,EAAQ,UAAU,EAAE,EAAA,EAAI,UAAU,WAAA,EAAa,QAAA,EAAU,UAAU,CAAA,EAAE;AAAA,QACrE;AAAA,OACD;AAAA,IACD,CAAC,CAAA;AAAA,EACF,CAAA;AAEA,EAAA,uBACCJ,IAAAA;AAAA,IAACS,UAAAA;AAAA,IAAA;AAAA,MACA,OAAA;AAAA,MACA,kBAAA,EAAoBC,aAAAA;AAAA,MACpB,WAAA,EAAa,CAAC,CAAA,KAAM;AACnB,QAAA,eAAA,CAAgB,MAAA,CAAO,CAAA,CAAE,MAAA,CAAO,EAAE,CAAC,CAAA;AAAA,MACpC,CAAA;AAAA,MACA,SAAA,EAAW,aAAA;AAAA,MAEX,QAAA,EAAA;AAAA,wBAAAV,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EAEb,QAAA,EAAA;AAAA,UAAA,WAAA,CAAY,UAAA,oBACZL,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kBAAA,EACd,QAAA,kBAAAA,GAAAA,CAACM,eAAAA,EAAA,EAAe,IAAA,EAAM,WAAA,CAAY,YAAY,CAAA,EAC/C,CAAA;AAAA,UAIA,CAAC,YAAA,oBACDD,IAAAA,CAAC,iBAAc,QAAA,EACb,QAAA,EAAA;AAAA,YAAA,WAAA,CAAY,aAAA,CAAc,GAAA,CAAI,CAAC,MAAA,qBAC/BL,GAAAA;AAAA,cAAC,eAAA;AAAA,cAAA;AAAA,gBAEA,MAAA;AAAA,gBACA,aAAA,EAAe,iBAAiB,MAAM,CAAA;AAAA,gBACtC;AAAA,eAAA;AAAA,cAHK,MAAA,CAAO;AAAA,aAKb,CAAA;AAAA,YACA,WAAA,CAAY,aAAA,CAAc,KAAA,CAAM,CAAC,MAAM,gBAAA,CAAiB,CAAC,CAAA,IAAK,CAAC,qBAC/DA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iCAAgC,QAAA,EAAA,kBAAA,EAAgB;AAAA,WAAA,EAEjE,CAAA;AAAA,0BAIDA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qCAAA,EACb,sBAAY,aAAA,CAAc,GAAA,CAAI,CAAC,MAAA,qBAC/BA,GAAAA;AAAA,YAAC,SAAA;AAAA,YAAA;AAAA,cAEA,MAAA;AAAA,cACA,aAAA,EAAe,gBAAA,CAAiB,MAAA,CAAO,EAAE,CAAA;AAAA,cACzC,UAAU,QAAA,IAAY,YAAA;AAAA,cACtB,cAAA,EAAgB,CAAC,UAAA,KAAe;AAC/B,gBAAA,MAAM,KAAA,GAAQ,gBAAA,CAAiB,MAAA,CAAO,EAAE,CAAA,CAAE,UAAU,CAAC,CAAA,KAAM,CAAA,CAAE,UAAA,KAAe,UAAU,CAAA;AACtF,gBAAA,IAAI,UAAU,EAAA,EAAI;AACjB,kBAAA,kBAAA,CAAmB,MAAA,CAAO,IAAI,KAAK,CAAA;AAAA,gBACpC;AAAA,cACD,CAAA;AAAA,cACA,eAAA;AAAA,cACA;AAAA,aAAA;AAAA,YAXK,MAAA,CAAO;AAAA,WAab,CAAA,EACF;AAAA,SAAA,EACD,CAAA;AAAA,wBAGAA,GAAAA,CAACgB,WAAAA,EAAA,EAAY,aAAA,EAAe,IAAA,EAC1B,QAAA,EAAA,YAAA,mBACAhB,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,EAAA,CAAGW,oBAAAA,CAAoB,EAAE,KAAA,EAAO,MAAA,EAAQ,CAAA,EAAG,2BAA2B,CAAA,EACrF,QAAA,kBAAAX,GAAAA,CAACM,eAAAA,EAAA,EAAe,IAAA,EAAM,YAAA,CAAa,WAAA,EAAa,CAAA,EACjD,IACG,IAAA,EACL;AAAA;AAAA;AAAA,GACD;AAEF;ACvhBA,SAAS,cAAA,CAAe,EAAE,SAAA,EAAU,EAA2B;AAC9D,EAAA,uBACCD,IAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACA,KAAA,EAAM,IAAA;AAAA,MACN,MAAA,EAAO,IAAA;AAAA,MACP,OAAA,EAAQ,WAAA;AAAA,MACR,IAAA,EAAK,MAAA;AAAA,MACL,KAAA,EAAM,4BAAA;AAAA,MACN,SAAA;AAAA,MACA,aAAA,EAAY,MAAA;AAAA,MACZ,IAAA,EAAK,KAAA;AAAA,MAEL,QAAA,EAAA;AAAA,wBAAAL,GAAAA,CAAC,WAAM,QAAA,EAAA,aAAA,EAAW,CAAA;AAAA,wBAClBA,GAAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACA,CAAA,EAAE,kwBAAA;AAAA,YACF,IAAA,EAAK,cAAA;AAAA,YACL,QAAA,EAAS,SAAA;AAAA,YACT,QAAA,EAAS;AAAA;AAAA;AACV;AAAA;AAAA,GACD;AAEF;AAGA,SAAS,YAAA,CAAa;AAAA,EACrB,EAAA;AAAA,EACA,WAAA;AAAA,EACA,QAAA;AAAA,EACA;AACD,CAAA,EAKG;AACF,EAAA,MAAM,EAAE,UAAA,EAAY,SAAA,EAAW,UAAA,EAAY,SAAA,EAAW,UAAA,EAAY,UAAA,EAAW,GAAI,WAAA,CAAY,EAAE,EAAA,EAAI,QAAA,EAAU,CAAA;AAE7G,EAAA,MAAM,KAAA,GAAQ;AAAA,IACb,SAAA,EAAW,GAAA,CAAI,SAAA,CAAU,QAAA,CAAS,SAAS,CAAA;AAAA,IAC3C,UAAA;AAAA,IACA,OAAA,EAAS,aAAa,GAAA,GAAM,CAAA;AAAA,IAC5B,MAAA,EAAQ,aAAa,EAAA,GAAM;AAAA,GAC5B;AAEA,EAAA,uBACCK,IAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACA,GAAA,EAAK,UAAA;AAAA,MACL,KAAA;AAAA,MACC,GAAG,UAAA;AAAA,MACH,GAAG,SAAA;AAAA,MACJ,SAAA,EAAW,EAAA;AAAA,QACV,kEAAA;AAAA;AAAA,QAEA,eACG,sEAAA,GACA,oCAAA;AAAA,QACH,WACG,uCAAA,GACA;AAAA,OACJ;AAAA,MAEC,QAAA,EAAA;AAAA,QAAA,CAAC,YAAA,oBACDL,GAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,gCAAA,EACd,QAAA,kBAAAA,GAAAA,CAAC,cAAA,EAAA,EAAe,CAAA,EACjB,CAAA;AAAA,wBAEDA,GAAAA,CAAC,WAAA,EAAA,EAAY,IAAA,EAAM,WAAA,EAAa;AAAA;AAAA;AAAA,GACjC;AAEF;AAGA,SAAS,eAAA,CAAgB,EAAE,WAAA,EAAa,YAAA,EAAa,EAAmD;AACvG,EAAA,uBACCK,IAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACA,SAAA,EAAW,EAAA;AAAA,QACV,+EAAA;AAAA,QACA,eAAe,0DAAA,GAA6D;AAAA,OAC7E;AAAA,MAEC,QAAA,EAAA;AAAA,QAAA,CAAC,YAAA,oBACDL,GAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,qBAAA,EACd,QAAA,kBAAAA,GAAAA,CAAC,cAAA,EAAA,EAAe,CAAA,EACjB,CAAA;AAAA,wBAEDA,GAAAA,CAAC,WAAA,EAAA,EAAY,IAAA,EAAM,WAAA,EAAa;AAAA;AAAA;AAAA,GACjC;AAEF;AAYO,SAAS,gBAAA,CAAiB;AAAA,EAChC,WAAA;AAAA,EACA,QAAA;AAAA,EACA,cAAA;AAAA,EACA,QAAA;AAAA,EACA,YAAA;AAAA,EACA;AACD,CAAA,EAA0B;AAEzB,EAAA,MAAM,KAAA,GAAciB,eAAQ,MAAM;AACjC,IAAA,IAAI,QAAA,IAAY,QAAA,CAAS,MAAA,GAAS,CAAA,EAAG;AAEpC,MAAA,MAAM,SAA0B,EAAC;AACjC,MAAA,KAAA,MAAW,MAAM,QAAA,EAAU;AAC1B,QAAA,MAAM,KAAA,GAAQ,YAAY,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,EAAE,CAAA;AACzD,QAAA,IAAI,KAAA,EAAO,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA;AAAA,MAC7B;AACA,MAAA,OAAO,MAAA;AAAA,IACR;AACA,IAAA,OAAO,WAAA,CAAY,OAAA;AAAA,EACpB,CAAA,EAAG,CAAC,QAAA,EAAU,WAAA,CAAY,OAAO,CAAC,CAAA;AAGlC,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAUA,gBAAwB,IAAI,CAAA;AAClE,EAAA,MAAM,UAAA,GAAmBA,MAAA,CAAA,OAAA,CAAQ,MAAM,KAAA,CAAM,KAAK,CAAC,CAAA,KAAM,CAAA,CAAE,EAAA,KAAO,QAAQ,CAAA,EAAG,CAAC,QAAA,EAAU,KAAK,CAAC,CAAA;AAE9F,EAAA,MAAM,OAAA,GAAUC,UAAAA;AAAA,IACfC,UAAUC,aAAa,CAAA;AAAA,IACvBD,UAAU,cAAA,EAAgB;AAAA,MACzB,gBAAA,EAAkB;AAAA,KAClB;AAAA,GACF;AAEA,EAAA,MAAM,eAAA,GAAkB,CAAC,KAAA,KAA0B;AAClD,IAAA,MAAM,EAAA,GAAK,MAAM,MAAA,CAAO,EAAA;AACxB,IAAA,WAAA,CAAY,OAAO,EAAA,KAAO,QAAA,GAAW,EAAA,GAAK,MAAA,CAAO,EAAE,CAAC,CAAA;AAAA,EACrD,CAAA;AAEA,EAAA,MAAM,aAAA,GAAgB,CAAC,KAAA,KAAwB;AAC9C,IAAA,MAAM,EAAE,MAAA,EAAQ,IAAA,EAAK,GAAI,KAAA;AACzB,IAAA,WAAA,CAAY,IAAI,CAAA;AAEhB,IAAA,IAAI,IAAA,IAAQ,MAAA,CAAO,EAAA,KAAO,IAAA,CAAK,EAAA,EAAI;AAClC,MAAA,MAAM,QAAA,GAAW,MAAM,SAAA,CAAU,CAAC,SAAS,IAAA,CAAK,EAAA,KAAO,OAAO,EAAE,CAAA;AAChE,MAAA,MAAM,QAAA,GAAW,MAAM,SAAA,CAAU,CAAC,SAAS,IAAA,CAAK,EAAA,KAAO,KAAK,EAAE,CAAA;AAE9D,MAAA,MAAM,QAAA,GAAW,SAAA,CAAU,KAAA,EAAO,QAAA,EAAU,QAAQ,CAAA;AAGpD,MAAA,cAAA,GAAiB,SAAS,GAAA,CAAI,CAAC,IAAA,KAAS,IAAA,CAAK,EAAE,CAAC,CAAA;AAAA,IACjD;AAAA,EACD,CAAA;AAEA,EAAA,MAAM,YAAA,GAAe,YAAY,WAAA,KAAgB,YAAA;AACjD,EAAA,MAAM,QAAA,GAAW,eAAe,6BAAA,GAAgC,2BAAA;AAGhE,EAAA,MAAM,aAAA,GAA+B;AAAA,IACpC,aAAa,+BAAA,CAAgC;AAAA,MAC5C,QAAQ,EAAE,MAAA,EAAQ,EAAE,OAAA,EAAS,OAAM;AAAE,KACrC;AAAA,GACF;AAGA,EAAA,MAAM,qBAAqB,MAAM;AAChC,IAAA,IAAI,CAAC,YAAA,EAAc;AAClB,MAAA,OAAO,gCAAA;AAAA,IACR;AACA,IAAA,IAAI,SAAA,EAAW;AACd,MAAA,OAAO,sBAAA;AAAA,IACR;AACA,IAAA,OAAO,gCAAA;AAAA,EACR,CAAA;AAEA,EAAA,uBACCd,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACb,QAAA,EAAA;AAAA,IAAA,WAAA,CAAY,8BAAcL,GAAAA,CAAC,WAAA,EAAA,EAAY,IAAA,EAAM,YAAY,UAAA,EAAY,CAAA;AAAA,oBAEtEK,IAAAA;AAAA,MAACS,UAAAA;AAAA,MAAA;AAAA,QACA,OAAA;AAAA,QACA,kBAAA,EAAoBC,aAAAA;AAAA,QACpB,WAAA,EAAa,eAAA;AAAA,QACb,SAAA,EAAW,aAAA;AAAA,QAEX,QAAA,EAAA;AAAA,0BAAAf,GAAAA,CAAC,eAAA,EAAA,EAAgB,KAAA,EAAO,KAAA,CAAM,IAAI,CAAC,CAAA,KAAM,CAAA,CAAE,EAAE,CAAA,EAAG,QAAA,EAAoB,QAAA,EAAU,QAAA,IAAY,cACzF,QAAA,kBAAAA,GAAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACA,SAAA,EAAW,EAAA;AAAA,gBACV,2CAAA;AAAA,gBACA,eAAe,sBAAA,GAAyB,qBAAA;AAAA,gBACxC,kBAAA;AAAmB,eACpB;AAAA,cAEC,QAAA,EAAA,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,qBACXA,GAAAA;AAAA,gBAAC,YAAA;AAAA,gBAAA;AAAA,kBAEA,IAAI,IAAA,CAAK,EAAA;AAAA,kBACT,aAAa,IAAA,CAAK,WAAA;AAAA,kBAClB,QAAA,EAAU,CAAC,EAAE,QAAA,IAAY,YAAA,CAAA;AAAA,kBACzB;AAAA,iBAAA;AAAA,gBAJK,IAAA,CAAK;AAAA,eAMX;AAAA;AAAA,WACF,EACD,CAAA;AAAA,0BAGAA,GAAAA,CAACgB,WAAAA,EAAA,EAAY,eACX,QAAA,EAAA,UAAA,mBAAahB,GAAAA,CAAC,eAAA,EAAA,EAAgB,WAAA,EAAa,UAAA,CAAW,WAAA,EAAa,YAAA,EAA4B,IAAK,IAAA,EACtG;AAAA;AAAA;AAAA;AACD,GAAA,EACD,CAAA;AAEF;ACvOA,IAAM,iBAAA,GAAoBC,GAAAA;AAAA,EACzB;AAAA;AAAA,IAEC,yCAAA;AAAA,IACA,2CAAA;AAAA,IACA,uEAAA;AAAA,IACA,8CAAA;AAAA;AAAA,IACA,+CAAA;AAAA,IACA,6BAAA;AAAA,IACA,8CAAA;AAAA;AAAA,IAEA,sCAAA;AAAA,IACA,oBAAA;AAAA;AAAA,IAEA,iDAAA;AAAA;AAAA,IAEA;AAAA,GACD;AAAA,EACA;AAAA,IACC,QAAA,EAAU;AAAA,MACT,OAAA,EAAS;AAAA,QACR,OAAA,EAAS;AAAA,UACR,mDAAA;AAAA,UACA,mDAAA;AAAA,UACA;AAAA,SACD;AAAA,QACA,KAAA,EAAO;AAAA,UACN,mDAAA;AAAA,UACA,8CAAA;AAAA,UACA;AAAA,SACD;AAAA,QACA,QAAA,EAAU;AAAA,UACT,qDAAA;AAAA,UACA,iDAAA;AAAA,UACA;AAAA,SACD;AAAA,QACA,GAAA,EAAK;AAAA,UACJ,mDAAA;AAAA,UACA,4CAAA;AAAA,UACA;AAAA,SACD;AAAA,QACA,GAAA,EAAK;AAAA,UACJ,gDAAA;AAAA,UACA,4CAAA;AAAA,UACA;AAAA,SACD;AAAA,QACA,KAAA,EAAO;AAAA,UACN,mDAAA;AAAA,UACA,8CAAA;AAAA,UACA;AAAA;AACD;AACD,KACD;AAAA,IACA,eAAA,EAAiB;AAAA,MAChB,OAAA,EAAS;AAAA;AACV;AAEF,CAAA;AAkDO,SAAS,oBAAA,CAAqB;AAAA,EACpC,WAAA;AAAA,EACA,QAAA;AAAA,EACA,cAAA;AAAA,EACA,QAAA,GAAW,KAAA;AAAA,EACX,YAAA;AAAA,EACA,OAAA,GAAU,OAAA;AAAA,EACV;AACD,CAAA,EAA8B;AAC7B,EAAA,MAAM,QAAQ,QAAA,IAAY,EAAA;AAC1B,EAAA,MAAM,QAAA,GAAW,MAAM,MAAA,GAAS,CAAA;AAOhC,EAAA,MAAM,mBAAmB,MAAwB;AAChD,IAAA,IAAI,gBAAgB,QAAA,EAAU;AAC7B,MAAA,OAAO,YAAY,KAAA,GAAQ,UAAA;AAAA,IAC5B;AACA,IAAA,IAAI,QAAA,EAAU;AACb,MAAA,OAAO,OAAA;AAAA,IACR;AACA,IAAA,OAAO,SAAA;AAAA,EACR,CAAA;AACA,EAAA,MAAM,gBAAgB,gBAAA,EAAiB;AAIvC,EAAA,MAAM,SAAA,GAAY,YAAY,cAAA,IAAkB,EAAA;AAChD,EAAA,MAAM,aAAa,CAAA,EAAG,IAAA,CAAK,IAAI,SAAA,EAAW,CAAC,IAAI,CAAC,CAAA,EAAA,CAAA;AAEhD,EAAA,uBACCD,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qBACd,QAAA,kBAAAA,GAAAA;AAAA,IAAC,OAAA;AAAA,IAAA;AAAA,MACA,IAAA,EAAK,MAAA;AAAA,MACL,KAAA;AAAA,MACA,UAAU,CAAC,CAAA,KAAM,cAAA,GAAiB,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,MAChD,UAAU,QAAA,IAAY,YAAA;AAAA,MACtB,WAAA,EAAa,YAAY,WAAA,IAAe,KAAA;AAAA,MACxC,SAAS,WAAA,CAAY,WAAA;AAAA,MACrB,WAAW,EAAA,CAAG,iBAAA,CAAkB,EAAE,OAAA,EAAS,aAAA,EAAe,CAAC,CAAA;AAAA,MAC3D,KAAA,EAAO,EAAE,KAAA,EAAO,UAAA,EAAY,UAAU,KAAA,EAAM;AAAA,MAC5C,cAAA,EAAc,YAAA,IAAgB,QAAA,IAAY,SAAA,KAAc,QAAQ,IAAA,GAAO;AAAA;AAAA,GACxE,EACD,CAAA;AAEF;AAUO,SAAS,eAAA,CAAgB;AAAA,EAC/B,KAAA;AAAA,EACA,QAAA;AAAA,EACA,cAAA;AAAA,EACA,QAAA,GAAW,KAAA;AAAA,EACX,YAAA;AAAA,EACA,OAAA,GAAU,OAAA;AAAA,EACV;AACD,CAAA,EAAyB;AACxB,EAAA,MAAM,QAAQ,QAAA,IAAY,EAAA;AAC1B,EAAA,MAAM,QAAA,GAAW,MAAM,MAAA,GAAS,CAAA;AAOhC,EAAA,MAAM,mBAAmB,MAAwB;AAChD,IAAA,IAAI,gBAAgB,QAAA,EAAU;AAC7B,MAAA,OAAO,YAAY,KAAA,GAAQ,UAAA;AAAA,IAC5B;AACA,IAAA,IAAI,QAAA,EAAU;AACb,MAAA,OAAO,OAAA;AAAA,IACR;AACA,IAAA,OAAO,SAAA;AAAA,EACR,CAAA;AACA,EAAA,MAAM,gBAAgB,gBAAA,EAAiB;AAIvC,EAAA,MAAM,SAAA,GAAY,MAAM,cAAA,IAAkB,CAAA;AAC1C,EAAA,MAAM,aAAa,CAAA,EAAG,IAAA,CAAK,IAAI,SAAA,EAAW,CAAC,IAAI,CAAC,CAAA,EAAA,CAAA;AAEhD,EAAA,uBACCA,GAAAA;AAAA,IAAC,OAAA;AAAA,IAAA;AAAA,MACA,IAAA,EAAK,MAAA;AAAA,MACL,KAAA;AAAA,MACA,UAAU,CAAC,CAAA,KAAM,cAAA,GAAiB,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,MAChD,UAAU,QAAA,IAAY,YAAA;AAAA,MACtB,WAAA,EAAY,KAAA;AAAA,MACZ,SAAS,KAAA,CAAM,WAAA;AAAA,MACf,SAAA,EAAW,GAAG,iBAAA,CAAkB,EAAE,SAAS,aAAA,EAAe,GAAG,gBAAgB,CAAA;AAAA,MAC7E,KAAA,EAAO,EAAE,KAAA,EAAO,UAAA,EAAY,UAAU,KAAA,EAAM;AAAA,MAC5C,cAAA,EAAc,YAAA,IAAgB,QAAA,IAAY,SAAA,KAAc,QAAQ,IAAA,GAAO;AAAA;AAAA,GACxE;AAEF;AC9LA,SAAS,qBAAA,CAAsB;AAAA,EAC9B,WAAA;AAAA,EACA,SAAA;AAAA,EACA,cAAA;AAAA,EACA,QAAA;AAAA,EACA,YAAA;AAAA,EACA;AACD,CAAA,EAOG;AACF,EAAA,MAAM,QAAA,GAAW,SAAA,GAAY,WAAA,CAAY,UAAU,CAAA;AACnD,EAAA,MAAM,cAAA,GAAuBqB,cAAO,KAAK,CAAA;AAGzC,EAAMA,iBAAU,MAAM;AAErB,IAAA,IAAI,eAAe,OAAA,EAAS;AAC5B,IAAA,IAAI,QAAA,EAAU;AACd,IAAA,IAAI,WAAA,CAAY,OAAA,CAAQ,MAAA,KAAW,CAAA,EAAG;AACtC,IAAA,IAAI,CAAC,cAAA,EAAgB;AAErB,IAAA,cAAA,CAAe,OAAA,GAAU,IAAA;AACzB,IAAA,MAAM,eAAe,WAAA,CAAY,OAAA,CAAQ,IAAI,CAAC,CAAA,KAAM,EAAE,EAAE,CAAA;AACxD,IAAA,cAAA,CAAe,WAAA,CAAY,YAAY,YAAY,CAAA;AAAA,EACpD,CAAA,EAAG,CAAC,QAAA,EAAU,WAAA,CAAY,SAAS,WAAA,CAAY,UAAA,EAAY,cAAc,CAAC,CAAA;AAG1E,EAAA,IAAI,gBAA0B,EAAC;AAC/B,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,QAAQ,CAAA,EAAG;AAC5B,IAAA,aAAA,GAAgB,QAAA;AAAA,EACjB,CAAA,MAAA,IAAW,OAAO,QAAA,KAAa,QAAA,EAAU;AACxC,IAAA,aAAA,GAAgB,CAAC,QAAQ,CAAA;AAAA,EAC1B;AAEA,EAAA,MAAM,QAAA,GAAW,mBAAA,GAAsB,WAAA,CAAY,UAAU,CAAA;AAE7D,EAAA,uBACChB,IAAAA,CAAAiB,QAAAA,EAAA,EACC,QAAA,EAAA;AAAA,oBAAAtB,GAAAA;AAAA,MAAC,gBAAA;AAAA,MAAA;AAAA,QACA,WAAA;AAAA,QACA,QAAA,EAAU,aAAA;AAAA,QACV,gBAAgB,CAAC,GAAA,KAAQ,cAAA,GAAiB,WAAA,CAAY,YAAY,GAAG,CAAA;AAAA,QACrE,QAAA;AAAA,QACA,YAAA,EAAc,YAAA;AAAA,QACd,WAAW,QAAA,EAAU;AAAA;AAAA,KACtB;AAAA,oBACAA,GAAAA;AAAA,MAAC,eAAA;AAAA,MAAA;AAAA,QACA,YAAY,WAAA,CAAY,UAAA;AAAA,QACxB,YAAA;AAAA,QACA;AAAA;AAAA;AACD,GAAA,EACD,CAAA;AAEF;AAUA,SAAS,wBAAA,CAAyB;AAAA,EACjC,WAAA;AAAA,EACA,SAAA;AAAA,EACA,cAAA;AAAA,EACA,QAAA;AAAA,EACA,YAAA;AAAA,EACA,mBAAA;AAAA,EACA;AACD,CAAA,EAQG;AACF,EAAA,MAAM,QAAA,GAAW,SAAA,GAAY,WAAA,CAAY,UAAU,CAAA;AAGnD,EAAA,IAAI,gBAA0B,EAAC;AAC/B,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,QAAQ,CAAA,EAAG;AAC5B,IAAA,aAAA,GAAgB,QAAA;AAAA,EACjB,CAAA,MAAA,IAAW,OAAO,QAAA,KAAa,QAAA,IAAY,QAAA,EAAU;AACpD,IAAA,aAAA,GAAgB,CAAC,QAAQ,CAAA;AAAA,EAC1B;AAIA,EAAA,MAAM,cAAA,GAAuBqB,eAAQ,MAAM;AAC1C,IAAA,MAAM,OAAA,GAAU,yBAAA,GAA4B,WAAA,CAAY,UAAU,CAAA;AAClE,IAAA,IAAI,CAAC,OAAA,IAAW,CAAC,YAAA,EAAc,OAAO,MAAA;AAEtC,IAAA,MAAM,SAAkC,EAAC;AACzC,IAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAE5B,MAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,EAAA,CAAG,KAAA,CAAM,GAAG,CAAA;AAChC,MAAA,MAAM,KAAA,GAAQ,MAAM,CAAC,CAAA;AACrB,MAAA,IAAI,KAAA,EAAO;AACV,QAAA,MAAA,CAAO,KAAK,IAAI,KAAA,CAAM,SAAA;AAAA,MACvB;AAAA,IACD;AACA,IAAA,OAAO,MAAA;AAAA,EACR,GAAG,CAAC,yBAAA,EAA2B,WAAA,CAAY,UAAA,EAAY,YAAY,CAAC,CAAA;AAEpE,EAAA,uBACChB,IAAAA,CAAAiB,QAAAA,EAAA,EACC,QAAA,EAAA;AAAA,oBAAAtB,GAAAA;AAAA,MAAC,mBAAA;AAAA,MAAA;AAAA,QACA,WAAA;AAAA,QACA,QAAA,EAAU,aAAA;AAAA,QACV,gBAAgB,CAAC,GAAA,KAAQ,cAAA,GAAiB,WAAA,CAAY,YAAY,GAAG,CAAA;AAAA,QACrE,QAAA;AAAA,QACA,YAAA,EAAc,YAAA;AAAA,QACd;AAAA;AAAA,KACD;AAAA,oBACAA,GAAAA;AAAA,MAAC,eAAA;AAAA,MAAA;AAAA,QACA,YAAY,WAAA,CAAY,UAAA;AAAA,QACxB,YAAA;AAAA,QACA;AAAA;AAAA;AACD,GAAA,EACD,CAAA;AAEF;AAUA,SAAS,qBAAA,CAAsB;AAAA,EAC9B,WAAA;AAAA,EACA,SAAA;AAAA,EACA,cAAA;AAAA,EACA,QAAA;AAAA,EACA,YAAA;AAAA,EACA,mBAAA;AAAA,EACA;AACD,CAAA,EAQG;AACF,EAAA,MAAM,QAAA,GAAW,SAAA,GAAY,WAAA,CAAY,UAAU,CAAA;AAGnD,EAAA,IAAI,gBAA0B,EAAC;AAC/B,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,QAAQ,CAAA,EAAG;AAC5B,IAAA,aAAA,GAAgB,QAAA;AAAA,EACjB,CAAA,MAAA,IAAW,OAAO,QAAA,KAAa,QAAA,IAAY,QAAA,EAAU;AACpD,IAAA,aAAA,GAAgB,CAAC,QAAQ,CAAA;AAAA,EAC1B;AAIA,EAAA,MAAM,eAAA,GAAwBqB,eAAQ,MAAM;AAC3C,IAAA,MAAM,OAAA,GAAU,yBAAA,GAA4B,WAAA,CAAY,UAAU,CAAA;AAClE,IAAA,IAAI,CAAC,OAAA,IAAW,CAAC,YAAA,EAAc,OAAO,MAAA;AAEtC,IAAA,MAAM,SAAkC,EAAC;AACzC,IAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAE5B,MAAA,MAAA,CAAO,KAAA,CAAM,EAAE,CAAA,GAAI,KAAA,CAAM,SAAA;AAAA,IAC1B;AACA,IAAA,OAAO,MAAA;AAAA,EACR,GAAG,CAAC,yBAAA,EAA2B,WAAA,CAAY,UAAA,EAAY,YAAY,CAAC,CAAA;AAEpE,EAAA,uBACChB,IAAAA,CAAAiB,QAAAA,EAAA,EACC,QAAA,EAAA;AAAA,oBAAAtB,GAAAA;AAAA,MAAC,gBAAA;AAAA,MAAA;AAAA,QACA,WAAA;AAAA,QACA,QAAA,EAAU,aAAA;AAAA,QACV,gBAAgB,CAAC,GAAA,KAAQ,cAAA,GAAiB,WAAA,CAAY,YAAY,GAAG,CAAA;AAAA,QACrE,QAAA;AAAA,QACA,YAAA,EAAc,YAAA;AAAA,QACd;AAAA;AAAA,KACD;AAAA,oBACAA,GAAAA;AAAA,MAAC,eAAA;AAAA,MAAA;AAAA,QACA,YAAY,WAAA,CAAY,UAAA;AAAA,QACxB,YAAA;AAAA,QACA;AAAA;AAAA;AACD,GAAA,EACD,CAAA;AAEF;AAsHO,SAAS,oBAAA,CAAqB;AAAA,EACpC,KAAA;AAAA,EACA,SAAA;AAAA,EACA,cAAA;AAAA,EACA,YAAA;AAAA,EACA,QAAA;AAAA,EACA,yBAAA;AAAA,EACA;AACD,CAAA,EAA8B;AAC7B,EAAA,IAAI,KAAA,CAAM,SAAS,UAAA,EAAY;AAC9B,IAAA,uBAAOA,GAAAA,CAAC,WAAA,EAAA,EAAY,MAAM,KAAA,CAAM,IAAA,EAAM,WAAU,MAAA,EAAO,CAAA;AAAA,EACxD;AACA,EAAA,IAAI,KAAA,CAAM,SAAS,cAAA,EAAgB;AAElC,IAAA,MAAM,cAAA,GAAiB;AAAA,MACtB,GAAG,MAAA,CAAO,MAAA,CAAO,KAAA,CAAM,YAAY,EAAE,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,UAAU,CAAA;AAAA,MAC5D,GAAG,MAAA,CAAO,MAAA,CAAO,KAAA,CAAM,UAAU,EAAE,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,UAAU;AAAA,KAC3D;AAEA,IAAA,uBACCK,IAAAA,CAAAiB,QAAAA,EAAA,EACC,QAAA,EAAA;AAAA,sBAAAtB,GAAAA;AAAA,QAAC,WAAA;AAAA,QAAA;AAAA,UACA,MAAM,KAAA,CAAM,IAAA;AAAA,UACZ,SAAA,EAAU,MAAA;AAAA,UACV,cAAc,KAAA,CAAM,YAAA;AAAA,UACpB,YAAY,KAAA,CAAM,UAAA;AAAA,UAClB,YAAA,EAAc,CAAC,KAAA,KAAU;AACxB,YAAA,MAAM,gBAAgB,MAAM;AAC3B,cAAA,MAAM,CAAA,GAAI,SAAA,GAAY,KAAA,CAAM,UAAU,CAAA;AACtC,cAAA,OAAO,OAAO,CAAA,KAAM,QAAA,GAAW,CAAA,GAAI,EAAA;AAAA,YACpC,CAAA,GAAG;AAEH,YAAA,MAAM,mBAAA,GAAsB,yBAAA,GAA4B,KAAA,CAAM,UAAU,CAAA;AACxE,YAAA,MAAM,iBAAA,GACL,mBAAA,IAAuB,YAAA,GACpB,mBAAA,CAAoB,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,EAAA,KAAO,YAAY,CAAA,EAAG,SAAA,GACxD,MAAA;AACJ,YAAA,uBACCA,GAAAA;AAAA,cAAC,iBAAA;AAAA,cAAA;AAAA,gBACA,KAAA;AAAA,gBACA,QAAA,EAAU,YAAA;AAAA,gBACV,cAAA,EAAgB,CAAC,CAAA,KAAM;AACtB,kBAAA,IAAI,cAAA,EAAgB,cAAA,CAAe,KAAA,CAAM,UAAA,EAAY,CAAC,CAAA;AAAA,gBACvD,CAAA;AAAA,gBACA,UAAU,QAAA,IAAY,YAAA;AAAA,gBACtB,YAAA,EAAc,YAAA;AAAA,gBACd,SAAA,EAAW;AAAA;AAAA,aACZ;AAAA,UAEF,CAAA;AAAA,UACA,eAAA,EAAiB,CAAC,KAAA,KAAU;AAC3B,YAAA,MAAM,gBAAgB,MAAM;AAC3B,cAAA,MAAM,CAAA,GAAI,SAAA,GAAY,KAAA,CAAM,UAAU,CAAA;AACtC,cAAA,OAAO,OAAO,CAAA,KAAM,QAAA,GAAW,CAAA,GAAI,EAAA;AAAA,YACpC,CAAA,GAAG;AAEH,YAAA,MAAM,QAAA,GAAW,mBAAA,GAAsB,KAAA,CAAM,UAAU,CAAA;AACvD,YAAA,uBACCA,GAAAA;AAAA,cAAC,eAAA;AAAA,cAAA;AAAA,gBAEA,KAAA;AAAA,gBACA,QAAA,EAAU,YAAA;AAAA,gBACV,cAAA,EAAgB,CAAC,CAAA,KAAM;AACtB,kBAAA,IAAI,cAAA,EAAgB,cAAA,CAAe,KAAA,CAAM,UAAA,EAAY,CAAC,CAAA;AAAA,gBACvD,CAAA;AAAA,gBACA,UAAU,QAAA,IAAY,YAAA;AAAA,gBACtB,YAAA,EAAc,YAAA;AAAA,gBACd,WAAW,QAAA,EAAU;AAAA,eAAA;AAAA,cARhB,KAAA,CAAM;AAAA,aASZ;AAAA,UAEF;AAAA;AAAA,OACD;AAAA,MACC,cAAA,CAAe,GAAA,CAAI,CAAC,UAAA,qBACpBA,GAAAA;AAAA,QAAC,eAAA;AAAA,QAAA;AAAA,UAEA,UAAA;AAAA,UACA,YAAA;AAAA,UACA;AAAA,SAAA;AAAA,QAHK,MAAM,UAAU,CAAA;AAAA,OAKtB;AAAA,KAAA,EACF,CAAA;AAAA,EAEF;AAEA,EAAA,IAAI,KAAA,CAAM,IAAA,KAAS,aAAA,IAAiB,KAAA,CAAM,WAAA,EAAa;AACtD,IAAA,MAAM,cAAc,KAAA,CAAM,WAAA;AAG1B,IAAA,IAAI,WAAA,CAAY,SAAS,MAAA,EAAQ;AAChC,MAAA,MAAM,QAAA,GAAW,SAAA,GAAY,WAAA,CAAY,UAAU,CAAA;AACnD,MAAA,MAAM,YAAA,GAAe,OAAO,QAAA,KAAa,QAAA,GAAW,QAAA,GAAW,EAAA;AAC/D,MAAA,MAAM,QAAA,GAAW,mBAAA,GAAsB,WAAA,CAAY,UAAU,CAAA;AAE7D,MAAA,uBACCK,IAAAA,CAAAiB,QAAAA,EAAA,EACC,QAAA,EAAA;AAAA,wBAAAtB,GAAAA;AAAA,UAAC,oBAAA;AAAA,UAAA;AAAA,YACA,WAAA;AAAA,YACA,QAAA,EAAU,YAAA;AAAA,YACV,cAAA,EAAgB,CAAC,KAAA,KAAU;AAC1B,cAAA,IAAI,cAAA,EAAgB;AACnB,gBAAA,cAAA,CAAe,WAAA,CAAY,YAAY,KAAK,CAAA;AAAA,cAC7C;AAAA,YACD,CAAA;AAAA,YACA,QAAA;AAAA,YACA,YAAA,EAAc,YAAA;AAAA,YACd,WAAW,QAAA,EAAU;AAAA;AAAA,SACtB;AAAA,wBACAA,GAAAA;AAAA,UAAC,eAAA;AAAA,UAAA;AAAA,YACA,YAAY,WAAA,CAAY,UAAA;AAAA,YACxB,YAAA;AAAA,YACA;AAAA;AAAA;AACD,OAAA,EACD,CAAA;AAAA,IAEF;AAGA,IAAA,IAAI,WAAA,CAAY,SAAS,QAAA,EAAU;AAClC,MAAA,MAAM,QAAA,GAAW,SAAA,GAAY,WAAA,CAAY,UAAU,CAAA;AAGnD,MAAA,IAAI,WAAqB,EAAC;AAC1B,MAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,QAAQ,CAAA,EAAG;AAC5B,QAAA,QAAA,GAAW,QAAA;AAAA,MACZ,CAAA,MAAA,IAAW,OAAO,QAAA,KAAa,QAAA,EAAU;AACxC,QAAA,QAAA,GAAW,CAAC,QAAQ,CAAA;AAAA,MACrB;AACA,MAAA,MAAM,mBAAA,GAAsB,yBAAA,GAA4B,WAAA,CAAY,UAAU,CAAA;AAC9E,MAAA,MAAM,iBAAA,GAAoB,mBAAA,GACvB,IAAI,GAAA,CAAI,oBAAoB,GAAA,CAAI,CAAC,CAAA,KAAM,CAAC,EAAE,EAAA,EAAI,CAAA,CAAE,SAAS,CAAC,CAAC,CAAA,GAC3D,MAAA;AACH,MAAA,IAAI,eAAA;AACJ,MAAA,IAAI,YAAY,WAAA,KAAgB,QAAA,IAAY,QAAA,CAAS,MAAA,KAAW,KAAK,iBAAA,EAAmB;AACvF,QAAA,MAAM,cAAA,GAAiB,SAAS,CAAC,CAAA;AACjC,QAAA,IAAI,OAAO,mBAAmB,QAAA,EAAU;AACvC,UAAA,eAAA,GAAkB,iBAAA,CAAkB,GAAA,CAAI,cAAc,CAAA,KAAM,IAAA;AAAA,QAC7D;AAAA,MACD;AAEA,MAAA,MAAM,mBAAA,GAAsB,CAAC,CAAA,KAAmD;AAC/E,QAAA,OAAO;AAAA,UACN,IAAA,EAAM,mBAAA;AAAA,UACN,oBAAoB,CAAA,CAAE,UAAA;AAAA,UACtB,OAAA,EAAS,KAAA;AAAA,UACT,YAAY,CAAA,CAAE,UAAA;AAAA,UACd,YAAY,CAAA,CAAE,UAAA;AAAA,UACd,YAAY,CAAA,CAAE,UAAA;AAAA,UACd,OAAA,EAAS,CAAA,CAAE,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,YAC9B,YAAY,CAAA,CAAE,EAAA;AAAA,YACd,aAAa,CAAA,CAAE,WAAA;AAAA,YACf,oBAAoB,CAAA,CAAE;AAAA,WACvB,CAAE;AAAA,SACH;AAAA,MACD,CAAA;AAEA,MAAA,uBACCK,IAAAA,CAAAiB,QAAAA,EAAA,EACC,QAAA,EAAA;AAAA,wBAAAtB,GAAAA;AAAA,UAAC,yBAAA;AAAA,UAAA;AAAA,YACA,WAAA,EAAa,oBAAoB,WAAW,CAAA;AAAA,YAC5C,QAAA;AAAA,YACA,cAAA,EAAgB,CAAC,KAAA,KAAU;AAC1B,cAAA,IAAI,cAAA,EAAgB;AACnB,gBAAA,cAAA,CAAe,WAAA,CAAY,YAAY,KAAK,CAAA;AAAA,cAC7C;AAAA,YACD,CAAA;AAAA,YACA,QAAA;AAAA,YACA,YAAA,EAAc,YAAA;AAAA,YACd,SAAA,EAAW,eAAA;AAAA,YACX,6BAA6B,MAAM;AAClC,cAAA,MAAM,OAAA,GAAU,yBAAA,GAA4B,WAAA,CAAY,UAAU,CAAA;AAClE,cAAA,IAAI,CAAC,SAAS,OAAO,MAAA;AACrB,cAAA,MAAM,KAAA,GAAQ,IAAI,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,KAAM,CAAC,CAAA,CAAE,EAAA,EAAI,CAAA,CAAE,SAAS,CAAC,CAAC,CAAA;AAC7D,cAAA,OAAO,QAAA,CAAS,GAAA,CAAI,CAAC,EAAA,MAAQ,EAAE,EAAA,EAAI,SAAA,EAAW,KAAA,CAAM,GAAA,CAAI,EAAE,CAAA,KAAM,IAAA,EAAK,CAAE,CAAA;AAAA,YACxE,CAAA;AAAG;AAAA,SACJ;AAAA,wBACAA,GAAAA;AAAA,UAAC,eAAA;AAAA,UAAA;AAAA,YACA,YAAY,WAAA,CAAY,UAAA;AAAA,YACxB,YAAA;AAAA,YACA;AAAA;AAAA;AACD,OAAA,EACD,CAAA;AAAA,IAEF;AAGA,IAAA,IAAI,WAAA,CAAY,SAAS,OAAA,EAAS;AACjC,MAAA,uBACCA,GAAAA;AAAA,QAAC,qBAAA;AAAA,QAAA;AAAA,UACA,WAAA;AAAA,UACA,SAAA;AAAA,UACA,cAAA;AAAA,UACA,QAAA;AAAA,UACA,YAAA;AAAA,UACA;AAAA;AAAA,OACD;AAAA,IAEF;AAGA,IAAA,IAAI,WAAA,CAAY,SAAS,UAAA,EAAY;AACpC,MAAA,uBACCA,GAAAA;AAAA,QAAC,wBAAA;AAAA,QAAA;AAAA,UACA,WAAA;AAAA,UACA,SAAA;AAAA,UACA,cAAA;AAAA,UACA,QAAA;AAAA,UACA,YAAA;AAAA,UACA,mBAAA;AAAA,UACA;AAAA;AAAA,OACD;AAAA,IAEF;AAGA,IAAA,IAAI,WAAA,CAAY,SAAS,OAAA,EAAS;AACjC,MAAA,uBACCA,GAAAA;AAAA,QAAC,qBAAA;AAAA,QAAA;AAAA,UACA,WAAA;AAAA,UACA,SAAA;AAAA,UACA,cAAA;AAAA,UACA,QAAA;AAAA,UACA,YAAA;AAAA,UACA,mBAAA;AAAA,UACA;AAAA;AAAA,OACD;AAAA,IAEF;AAAA,EACD;AAGA,EAAA,OAAO,IAAA;AACR;AAmCO,SAAS,WAAA,CAAY;AAAA,EAC3B,IAAA;AAAA,EACA,SAAA;AAAA,EACA,gBAAA;AAAA,EACA,KAAA,GAAQ,UAAA;AAAA,EACR,YAAA,GAAe,KAAA;AAAA,EACf,QAAA,GAAW,KAAA;AAAA,EACX,iBAAA;AAAA,EACA,gBAAA;AAAA,EACA,eAAA;AAAA,EACA;AACD,CAAA,EAAqB;AAEpB,EAAA,MAAM,SAAA,GAAY,KAAA,KAAU,UAAA,GAAa,MAAA,GAAY,KAAA;AAErD,EAAA,uBACCK,KAAC,KAAA,EAAA,EAAI,SAAA,EAAW,GAAG,eAAA,EAAiB,SAAS,CAAA,EAAG,gBAAA,EAAgB,SAAA,EAC/D,QAAA,EAAA;AAAA,oBAAAL,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACb,QAAA,EAAA,IAAA,CAAK,cAAc,GAAA,CAAI,CAAC,KAAA,EAAO,KAAA,qBAC/BA,GAAAA;AAAA,MAAC,oBAAA;AAAA,MAAA;AAAA,QAEA,KAAA;AAAA,QACA,SAAA;AAAA,QACA,cAAA,EAAgB,gBAAA;AAAA,QAChB,YAAA;AAAA,QACA,QAAA;AAAA,QACA,yBAAA,EAA2B,iBAAA;AAAA,QAC3B,mBAAA,EAAqB;AAAA,OAAA;AAAA,MAPhB;AAAA,KASN,CAAA,EACF,CAAA;AAAA,IAGC,gBAAgB,eAAA,EAAiB,WAAA,oBACjCA,GAAAA,CAAC,SAAI,SAAA,EAAU,uBAAA,EAAwB,cAAA,EAAc,eAAA,CAAgB,WACpE,QAAA,kBAAAA,GAAAA,CAAC,eAAY,IAAA,EAAM,eAAA,CAAgB,aAAa,CAAA,EACjD;AAAA,GAAA,EAEF,CAAA;AAEF;AC5mBO,SAAS,gBAAA,CAAiB,EAAE,MAAA,EAAQ,IAAA,EAAM,WAAU,EAA0B;AAEpF,EAAA,MAAM,aAAA,GAAsBuB,eAAQ,MAAM;AACzC,IAAA,IAAI,CAAC,OAAO,kBAAA,EAAoB;AAC/B,MAAA,OAAO,IAAA;AAAA,IACR;AAEA,IAAA,OAAO,IAAA,CAAK,SAAS,cAAA,CAAe,IAAA,CAAK,CAAC,EAAA,KAAO,EAAA,CAAG,UAAA,KAAe,MAAA,CAAO,kBAAkB,CAAA;AAAA,EAC7F,GAAG,CAAC,MAAA,CAAO,oBAAoB,IAAA,CAAK,QAAA,CAAS,cAAc,CAAC,CAAA;AAG5D,EAAA,IAAI,CAAC,aAAA,EAAe;AACnB,IAAA,OAAO,IAAA;AAAA,EACR;AAEA,EAAA,MAAM,SAAA,GAAY,OAAO,MAAA,KAAW,SAAA;AAEpC,EAAA,uBACClB,KAAC,KAAA,EAAA,EAAI,SAAA,EAAW,GAAG,kBAAA,EAAoB,SAAS,CAAA,EAAG,cAAA,EAAc,SAAA,EAEhE,QAAA,EAAA;AAAA,oBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8BAAA,EACd,QAAA,EAAA;AAAA,sBAAAL,GAAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACA,SAAA,EAAU,yFAAA;AAAA,UACV,cAAA,EAAc,SAAA;AAAA,UAEb,QAAA,EAAA,SAAA,mBACAK,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,oBAAA,EAAqB,IAAA,EAAK,cAAA,EAAe,OAAA,EAAQ,WAAA,EAC/D,QAAA,EAAA;AAAA,4BAAAL,GAAAA,CAAC,WAAM,QAAA,EAAA,SAAA,EAAO,CAAA;AAAA,4BACdA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,2DAAA,EAA4D;AAAA,WAAA,EACrE,CAAA,mBAEAK,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,oBAAA,EAAqB,IAAA,EAAK,cAAA,EAAe,OAAA,EAAQ,WAAA,EAC/D,QAAA,EAAA;AAAA,4BAAAL,GAAAA,CAAC,WAAM,QAAA,EAAA,WAAA,EAAS,CAAA;AAAA,4BAChBA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,+GAAA,EAAgH;AAAA,WAAA,EACzH;AAAA;AAAA,OAEF;AAAA,sBACAK,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,QAAA,EACd,QAAA,EAAA;AAAA,wBAAAL,GAAAA;AAAA,UAAC,IAAA;AAAA,UAAA;AAAA,YACA,SAAA,EAAU,wBAAA;AAAA,YACV,KAAA,EAAO,EAAE,KAAA,EAAO,SAAA,GAAY,qCAAqC,oCAAA,EAAqC;AAAA,YAErG,sBAAY,UAAA,GAAa;AAAA;AAAA,SAC3B;AAAA,wBACAA,GAAAA,CAAC,GAAA,EAAA,EAAE,WAAU,+BAAA,EAAiC,QAAA,EAAA,SAAA,GAAY,eAAe,WAAA,EAAY;AAAA,OAAA,EACtF;AAAA,KAAA,EACD,CAAA;AAAA,oBAGAA,GAAAA,CAAC,WAAA,EAAA,EAAY,MAAM,aAAA,CAAc,WAAA,EAAa,WAAU,iBAAA,EAAkB;AAAA,GAAA,EAC3E,CAAA;AAEF","file":"index.js","sourcesContent":["import { type ClassValue, clsx } from \"clsx\"\nimport { twMerge } from \"tailwind-merge\"\n\nexport const PALETTES = [\"default\", \"betta\", \"cardinal\", \"bee\", \"owl\", \"macaw\"] as const\nexport type Palette = (typeof PALETTES)[number]\n\nexport function cn(...inputs: ClassValue[]) {\n\treturn twMerge(clsx(inputs))\n}\n","/**\n * Configuration for HTML sanitization.\n * Defines allowed tags and attributes for safe rendering.\n */\ninterface SanitizeConfig {\n\tallowedTags: Set<string>\n\tallowedAttributes: Record<string, Set<string>>\n\tallowDataAttributes: boolean\n\tallowMathML: boolean\n}\n\n/**\n * Default configuration for QTI content sanitization.\n * Allows common HTML tags and MathML for mathematical expressions.\n */\nconst DEFAULT_CONFIG: SanitizeConfig = {\n\t// HTML content tags\n\tallowedTags: new Set([\n\t\t// Text content\n\t\t\"p\",\n\t\t\"span\",\n\t\t\"div\",\n\t\t\"br\",\n\t\t\"hr\",\n\t\t// Formatting\n\t\t\"b\",\n\t\t\"i\",\n\t\t\"u\",\n\t\t\"strong\",\n\t\t\"em\",\n\t\t\"mark\",\n\t\t\"small\",\n\t\t\"sub\",\n\t\t\"sup\",\n\t\t\"code\",\n\t\t\"pre\",\n\t\t\"kbd\",\n\t\t// Lists\n\t\t\"ul\",\n\t\t\"ol\",\n\t\t\"li\",\n\t\t\"dl\",\n\t\t\"dt\",\n\t\t\"dd\",\n\t\t// Tables\n\t\t\"table\",\n\t\t\"thead\",\n\t\t\"tbody\",\n\t\t\"tfoot\",\n\t\t\"tr\",\n\t\t\"th\",\n\t\t\"td\",\n\t\t\"caption\",\n\t\t\"colgroup\",\n\t\t\"col\",\n\t\t// Media\n\t\t\"img\",\n\t\t\"audio\",\n\t\t\"video\",\n\t\t\"source\",\n\t\t\"track\",\n\t\t// Semantic\n\t\t\"article\",\n\t\t\"section\",\n\t\t\"nav\",\n\t\t\"aside\",\n\t\t\"header\",\n\t\t\"footer\",\n\t\t\"main\",\n\t\t\"figure\",\n\t\t\"figcaption\",\n\t\t\"blockquote\",\n\t\t\"cite\",\n\t\t// Links\n\t\t\"a\",\n\t\t// Forms (for future interactive elements)\n\t\t\"label\",\n\t\t\"button\"\n\t]),\n\n\tallowedAttributes: {\n\t\t// Global attributes\n\t\t\"*\": new Set([\"class\", \"id\", \"lang\", \"dir\", \"title\", \"style\"]),\n\t\t// Specific attributes\n\t\timg: new Set([\"src\", \"alt\", \"width\", \"height\", \"style\"]),\n\t\ta: new Set([\"href\", \"target\", \"rel\"]),\n\t\taudio: new Set([\"src\", \"controls\", \"loop\", \"muted\"]),\n\t\tvideo: new Set([\"src\", \"controls\", \"loop\", \"muted\", \"width\", \"height\", \"poster\"]),\n\t\tsource: new Set([\"src\", \"type\"]),\n\t\ttrack: new Set([\"src\", \"kind\", \"srclang\", \"label\"])\n\t},\n\n\tallowDataAttributes: false,\n\tallowMathML: true\n}\n\n/**\n * MathML elements that are allowed for mathematical expressions.\n * Based on MathML 3.0 specification.\n */\nconst MATHML_TAGS = new Set([\n\t// Root\n\t\"math\",\n\t// Token elements\n\t\"mi\",\n\t\"mn\",\n\t\"mo\",\n\t\"mtext\",\n\t\"mspace\",\n\t\"ms\",\n\t// Layout\n\t\"mrow\",\n\t\"mfrac\",\n\t\"msqrt\",\n\t\"mroot\",\n\t\"mstyle\",\n\t\"merror\",\n\t\"mpadded\",\n\t\"mphantom\",\n\t\"mfenced\",\n\t\"menclose\",\n\t// Scripts and limits\n\t\"msub\",\n\t\"msup\",\n\t\"msubsup\",\n\t\"munder\",\n\t\"mover\",\n\t\"munderover\",\n\t\"mmultiscripts\",\n\t\"mprescripts\",\n\t\"none\",\n\t// Tables\n\t\"mtable\",\n\t\"mtr\",\n\t\"mtd\",\n\t\"maligngroup\",\n\t\"malignmark\",\n\t// Elementary math\n\t\"mstack\",\n\t\"mlongdiv\",\n\t\"msgroup\",\n\t\"msrow\",\n\t\"mscarries\",\n\t\"mscarry\",\n\t\"msline\",\n\t// Semantic\n\t\"semantics\",\n\t\"annotation\",\n\t\"annotation-xml\"\n])\n\n/**\n * MathML attributes that are allowed.\n */\nconst _MATHML_ATTRIBUTES = new Set([\n\t// Global MathML attributes\n\t\"id\",\n\t\"class\",\n\t\"style\",\n\t\"href\",\n\t\"mathcolor\",\n\t\"mathbackground\",\n\t\"mathsize\",\n\t\"mathvariant\",\n\t\"dir\",\n\t// Display\n\t\"display\",\n\t\"displaystyle\",\n\t\"scriptlevel\",\n\t// Spacing\n\t\"width\",\n\t\"height\",\n\t\"depth\",\n\t\"lspace\",\n\t\"rspace\",\n\t\"voffset\",\n\t// Fractions\n\t\"linethickness\",\n\t\"numalign\",\n\t\"denomalign\",\n\t\"bevelled\",\n\t// Roots\n\t\"index\",\n\t// Tables\n\t\"align\",\n\t\"rowalign\",\n\t\"columnalign\",\n\t\"groupalign\",\n\t\"alignmentscope\",\n\t\"columnwidth\",\n\t\"rowspacing\",\n\t\"columnspacing\",\n\t\"rowlines\",\n\t\"columnlines\",\n\t\"frame\",\n\t// Fences\n\t\"open\",\n\t\"close\",\n\t\"separators\",\n\t// Operators\n\t\"form\",\n\t\"fence\",\n\t\"separator\",\n\t\"stretchy\",\n\t\"symmetric\",\n\t\"maxsize\",\n\t\"minsize\",\n\t\"largeop\",\n\t\"movablelimits\",\n\t\"accent\",\n\t// Semantic\n\t\"encoding\",\n\t\"definitionURL\"\n])\n\n/**\n * Sanitizes HTML content to prevent XSS attacks.\n * Preserves MathML for mathematical expressions.\n */\nexport function sanitizeHtml(html: string, config: Partial<SanitizeConfig> = {}): string {\n\tconst cfg = { ...DEFAULT_CONFIG, ...config }\n\n\t// Basic XSS prevention patterns\n\tconst dangerousPatterns = [\n\t\t/<script\\b[^<]*(?:(?!<\\/script>)<[^<]*)*<\\/script>/gi,\n\t\t/javascript:/gi,\n\t\t/on\\w+\\s*=/gi, // Event handlers\n\t\t/<iframe\\b/gi,\n\t\t/<embed\\b/gi,\n\t\t/<object\\b/gi,\n\t\t/data:text\\/html/gi\n\t]\n\n\tlet sanitized = html\n\tfor (const pattern of dangerousPatterns) {\n\t\tsanitized = sanitized.replace(pattern, \"\")\n\t}\n\n\t// Parse and rebuild with allowed tags/attributes\n\tconst cleaned = cleanHtml(sanitized, cfg)\n\n\treturn cleaned\n}\n\n/**\n * Performs deep cleaning of HTML by parsing and rebuilding with only allowed elements.\n * Note: This is a simplified regex-based implementation for Node.js environments.\n * In production with browser support, consider using DOMPurify.\n */\nfunction cleanHtml(html: string, config: SanitizeConfig): string {\n\t// For Node.js environment, we use a regex-based approach\n\t// This is less robust than DOM-based cleaning but works in all environments\n\n\tlet cleaned = html\n\n\t// Remove all tags that aren't in the allowlist\n\tconst tagPattern = /<\\/?([a-zA-Z][a-zA-Z0-9-]*)([^>]*)>/g\n\tcleaned = cleaned.replace(tagPattern, (match, tagName, _attrs) => {\n\t\tconst tag = tagName.toLowerCase()\n\t\tconst isMathML = tag === \"math\" || cleaned.includes(\"<math\")\n\n\t\tif (isMathML && config.allowMathML && MATHML_TAGS.has(tag)) {\n\t\t\treturn match // Keep MathML tags\n\t\t}\n\t\tif (config.allowedTags.has(tag)) {\n\t\t\t// Clean attributes for allowed tags\n\t\t\treturn cleanAttributesString(match, tag, config)\n\t\t}\n\n\t\treturn \"\" // Remove disallowed tags\n\t})\n\n\treturn cleaned\n}\n\n/**\n * Cleans attributes from an HTML tag string.\n */\nfunction cleanAttributesString(tagString: string, tagName: string, config: SanitizeConfig): string {\n\tconst attrPattern = /\\s+([a-zA-Z][a-zA-Z0-9-:]*)(?:=\"([^\"]*)\"|'([^']*)'|=([^\\s>]+)|(?=\\s|>))/g\n\n\tlet cleanedTag = `<${tagString.startsWith(\"</\") ? \"/\" : \"\"}${tagName}`\n\n\tlet match = attrPattern.exec(tagString)\n\twhile (match !== null) {\n\t\tconst attrName = (match[1] || \"\").toLowerCase()\n\t\tconst attrValue = match[2] || match[3] || match[4] || \"\"\n\n\t\t// Check if attribute is allowed\n\t\tconst globalAttrs = config.allowedAttributes[\"*\"] || new Set()\n\t\tconst tagAttrs = config.allowedAttributes[tagName] || new Set()\n\n\t\tlet isAllowed = globalAttrs.has(attrName) || tagAttrs.has(attrName)\n\n\t\t// For <img>, strip size/style attributes to prevent stretched images\n\t\tif (tagName === \"img\" && (attrName === \"width\" || attrName === \"height\" || attrName === \"style\")) {\n\t\t\tisAllowed = false\n\t\t}\n\n\t\t// Check data attributes\n\t\tif (!isAllowed && config.allowDataAttributes && attrName.startsWith(\"data-\")) {\n\t\t\tisAllowed = true\n\t\t}\n\n\t\t// Check for dangerous values\n\t\tif (isAllowed && !isDangerousAttributeValue(attrName, attrValue)) {\n\t\t\tcleanedTag += ` ${attrName}=\"${attrValue.replace(/\"/g, \"&quot;\")}\"`\n\t\t}\n\n\t\tmatch = attrPattern.exec(tagString)\n\t}\n\n\tcleanedTag += \">\"\n\treturn cleanedTag\n}\n\n/**\n * Checks if an attribute value contains potentially dangerous content.\n */\nfunction isDangerousAttributeValue(name: string, value: string): boolean {\n\tconst valueLower = value.toLowerCase().trim()\n\n\t// Check for javascript: protocol\n\tif (name === \"href\" || name === \"src\") {\n\t\tif (valueLower.startsWith(\"javascript:\") || valueLower.startsWith(\"data:text/html\")) {\n\t\t\treturn true\n\t\t}\n\t}\n\n\t// Check for event handlers in values (some old XSS techniques)\n\tif (valueLower.includes(\"javascript:\") || valueLower.includes(\"onerror=\")) {\n\t\treturn true\n\t}\n\n\treturn false\n}\n\n/**\n * Sanitizes HTML for safe display, with automatic MathML detection.\n */\nexport function sanitizeForDisplay(html: string): string {\n\t// Auto-detect if content has MathML\n\tconst hasMathML = html.toLowerCase().includes(\"<math\")\n\n\treturn sanitizeHtml(html, {\n\t\tallowMathML: hasMathML,\n\t\tallowDataAttributes: true\n\t})\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport { createPortal } from \"react-dom\"\nimport { sanitizeForDisplay } from \"../../html\"\nimport { cn } from \"../../lib/utils\"\nimport type { DisplayGap, DisplayInlineEmbed, DisplayTextEmbed } from \"../../shared/types\"\n\n/**\n * Renders HTML content with proper MathML support\n * Uses innerHTML assignment to preserve MathML structure\n */\nexport function HTMLContent({\n\thtml,\n\tclassName,\n\tinlineEmbeds,\n\ttextEmbeds,\n\tgapEmbeds,\n\trenderInline,\n\trenderTextEntry,\n\trenderGap\n}: {\n\thtml: string\n\tclassName?: string\n\tinlineEmbeds?: Record<string, DisplayInlineEmbed>\n\ttextEmbeds?: Record<string, DisplayTextEmbed>\n\tgapEmbeds?: Record<string, DisplayGap>\n\trenderInline?: (embed: DisplayInlineEmbed) => React.ReactElement\n\trenderTextEntry?: (embed: DisplayTextEmbed) => React.ReactElement\n\trenderGap?: (gap: DisplayGap) => React.ReactElement\n}) {\n\t// Create a ref to handle MathML fallback if needed\n\tconst containerRef = React.useRef<HTMLDivElement>(null)\n\tconst [targets, setTargets] = React.useState<Record<string, Element>>({})\n\n\t// Sanitize incoming HTML to strip unsafe and layout-breaking attributes\n\tconst safeHtml = React.useMemo(() => sanitizeForDisplay(html), [html])\n\n\t// Apply sanitized HTML to the container whenever it changes, and find targets\n\tReact.useEffect(() => {\n\t\tconst el = containerRef.current\n\t\tif (!el) return\n\t\tel.innerHTML = safeHtml\n\n\t\tconst newTargets: Record<string, Element> = {}\n\n\t\t// Find inline dropdown placeholders\n\t\tif (inlineEmbeds) {\n\t\t\tconst nodes = el.querySelectorAll(\"[data-qti-inline]\")\n\t\t\tfor (const node of nodes) {\n\t\t\t\tconst responseId = node.getAttribute(\"data-qti-inline\")\n\t\t\t\tif (responseId && inlineEmbeds[responseId]) {\n\t\t\t\t\tnewTargets[responseId] = node\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Find text entry placeholders\n\t\tif (textEmbeds) {\n\t\t\tconst nodes = el.querySelectorAll(\"[data-qti-text-entry]\")\n\t\t\tfor (const node of nodes) {\n\t\t\t\tconst responseId = node.getAttribute(\"data-qti-text-entry\")\n\t\t\t\tif (responseId && textEmbeds[responseId]) {\n\t\t\t\t\tnewTargets[responseId] = node\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Find gap placeholders (for gap match interactions)\n\t\tif (gapEmbeds) {\n\t\t\tconst nodes = el.querySelectorAll(\"[data-qti-gap]\")\n\t\t\tfor (const node of nodes) {\n\t\t\t\tconst gapId = node.getAttribute(\"data-qti-gap\")\n\t\t\t\tif (gapId && gapEmbeds[gapId]) {\n\t\t\t\t\tnewTargets[`gap-${gapId}`] = node\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tsetTargets(newTargets)\n\t}, [safeHtml, inlineEmbeds, textEmbeds, gapEmbeds]) // Re-scan if structure changes\n\n\t// Render portals declaratively based on targets\n\t// This ensures React reconciles them properly even if renderTextEntry changes identity\n\tconst portals = React.useMemo(() => {\n\t\tconst items: React.ReactNode[] = []\n\n\t\tif (inlineEmbeds && renderInline) {\n\t\t\tfor (const [id, embed] of Object.entries(inlineEmbeds)) {\n\t\t\t\tconst target = targets[id]\n\t\t\t\tif (target) {\n\t\t\t\t\titems.push(createPortal(renderInline(embed), target, id))\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (textEmbeds && renderTextEntry) {\n\t\t\tfor (const [id, embed] of Object.entries(textEmbeds)) {\n\t\t\t\tconst target = targets[id]\n\t\t\t\tif (target) {\n\t\t\t\t\titems.push(createPortal(renderTextEntry(embed), target, id))\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (gapEmbeds && renderGap) {\n\t\t\tfor (const [id, gap] of Object.entries(gapEmbeds)) {\n\t\t\t\tconst target = targets[`gap-${id}`]\n\t\t\t\tif (target) {\n\t\t\t\t\titems.push(createPortal(renderGap(gap), target, `gap-${id}`))\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn items\n\t}, [targets, inlineEmbeds, textEmbeds, gapEmbeds, renderInline, renderTextEntry, renderGap])\n\n\tReact.useEffect(() => {\n\t\t// Check if MathML is supported\n\t\tconst checkMathMLSupport = () => {\n\t\t\tconst mml = document.createElement(\"math\")\n\t\t\tmml.innerHTML = \"<mspace/>\"\n\t\t\tconst firstChild = mml.firstChild\n\t\t\treturn firstChild instanceof Element && firstChild.namespaceURI === \"http://www.w3.org/1998/Math/MathML\"\n\t\t}\n\n\t\t// If MathML is not supported, we could add fallback logic here\n\t\tif (!checkMathMLSupport() && containerRef.current?.querySelector(\"math\")) {\n\t\t\t// Intentionally quiet: sanitized HTML is still rendered\n\t\t}\n\t}, [])\n\n\treturn (\n\t\t<>\n\t\t\t<div\n\t\t\t\tref={containerRef}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"qti-html-content text-foreground text-lg font-medium leading-relaxed\",\n\t\t\t\t\t// Ensure images never stretch or overflow\n\t\t\t\t\t\"[&_img]:max-w-full [&_img]:h-auto [&_img]:w-auto [&_img]:object-contain [&_img]:block [&_img]:mx-auto\",\n\t\t\t\t\tclassName\n\t\t\t\t)}\n\t\t\t/>\n\t\t\t{portals}\n\t\t</>\n\t)\n}\n\nexport default HTMLContent\n","\"use client\"\n\nimport { HTMLContent } from \"./shared/html-content\"\n\nexport function FeedbackMessage({\n\tresponseId,\n\tshowFeedback,\n\tperResponseFeedback\n}: {\n\tresponseId: string\n\tshowFeedback?: boolean\n\tperResponseFeedback?: Record<string, { isCorrect: boolean; messageHtml?: string }>\n}) {\n\tif (!showFeedback) return null\n\tconst entry = perResponseFeedback?.[responseId]\n\tconst messageHtml = entry?.messageHtml\n\tif (!messageHtml) return null\n\tconst isCorrect = entry?.isCorrect === true\n\treturn (\n\t\t<div className=\"qti-feedback mt-3 p-6\" data-correct={isCorrect}>\n\t\t\t<HTMLContent html={messageHtml} />\n\t\t</div>\n\t)\n}\n\nexport default FeedbackMessage\n","\"use client\"\n\nimport * as CheckboxPrimitive from \"@radix-ui/react-checkbox\"\nimport * as RadioGroupPrimitive from \"@radix-ui/react-radio-group\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport type * as React from \"react\"\n\nimport { cn } from \"../lib/utils\"\n\nconst choiceIndicatorVariants = cva(\n\t[\n\t\t\"cursor-pointer shrink-0 rounded-xs size-6 text-xs font-extrabold flex items-center justify-center outline-none\",\n\t\t\"disabled:cursor-not-allowed disabled:opacity-50\",\n\t\t\"data-[state=unchecked]:bg-background data-[state=unchecked]:border-2 data-[state=unchecked]:border-input data-[state=unchecked]:text-muted-foreground\",\n\t\t\"data-[state=checked]:border-2 data-[state=checked]:border-[var(--choice-complement)] data-[state=checked]:text-[var(--choice-foreground)]\",\n\t\t\"data-[filled=true]:data-[state=checked]:bg-[var(--choice-complement)]\",\n\t\t\"data-[filled=true]:data-[state=checked]:shadow-[inset_0_0_0_2px_rgb(255_255_255)] dark:data-[filled=true]:data-[state=checked]:shadow-[inset_0_0_0_2px_rgb(255_255_255)]\",\n\t\t\"focus-visible:ring-[var(--choice-complement)] focus-visible:ring-[3px]\",\n\t\t\"aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive\"\n\t],\n\t{\n\t\tvariants: {\n\t\t\tpalette: {\n\t\t\t\tdefault: [\n\t\t\t\t\t\"[--choice-foreground:var(--color-foreground)]\",\n\t\t\t\t\t\"[--choice-complement:var(--color-muted-foreground)]\"\n\t\t\t\t],\n\t\t\t\tbetta: [\"[--choice-foreground:var(--color-betta)]\", \"[--choice-complement:var(--color-butterfly)]\"],\n\t\t\t\tcardinal: [\"[--choice-foreground:var(--color-cardinal)]\", \"[--choice-complement:var(--color-fire-ant)]\"],\n\t\t\t\tbee: [\"[--choice-foreground:var(--color-bee)]\", \"[--choice-complement:var(--color-lion)]\"],\n\t\t\t\towl: [\"[--choice-foreground:var(--color-owl)]\", \"[--choice-complement:var(--color-tree-frog)]\"],\n\t\t\t\tmacaw: [\"[--choice-foreground:var(--color-macaw)]\", \"[--choice-complement:var(--color-whale)]\"]\n\t\t\t}\n\t\t},\n\t\tdefaultVariants: {\n\t\t\tpalette: \"default\"\n\t\t}\n\t}\n)\n\ninterface ChoiceIndicatorProps extends VariantProps<typeof choiceIndicatorVariants> {\n\tletter?: string\n\ttype?: \"radio\" | \"checkbox\"\n\tshowLetter?: boolean\n\tclassName?: string\n\tid?: string\n\tvalue?: string\n\tchecked?: boolean\n\tonCheckedChange?: (checked: boolean) => void\n\tdisabled?: boolean\n\tpalette?: \"default\" | \"betta\" | \"cardinal\" | \"bee\" | \"owl\" | \"macaw\"\n}\n\nfunction ChoiceIndicator({\n\tclassName,\n\tpalette = \"default\",\n\tletter,\n\ttype = \"radio\",\n\tshowLetter = true,\n\t...props\n}: ChoiceIndicatorProps) {\n\tconst baseClassName = cn(choiceIndicatorVariants({ palette }), className)\n\n\tif (type === \"checkbox\") {\n\t\tconst checkboxProps = props as React.ComponentProps<typeof CheckboxPrimitive.Root>\n\t\treturn (\n\t\t\t<CheckboxPrimitive.Root\n\t\t\t\tdata-slot=\"choice-indicator\"\n\t\t\t\tdata-palette={palette}\n\t\t\t\tdata-filled={!showLetter}\n\t\t\t\tclassName={baseClassName}\n\t\t\t\t{...checkboxProps}\n\t\t\t>\n\t\t\t\t{showLetter && <span className=\"data-[state=unchecked]:block data-[state=checked]:hidden\">{letter}</span>}\n\t\t\t</CheckboxPrimitive.Root>\n\t\t)\n\t}\n\n\tconst radioProps = props as React.ComponentProps<typeof RadioGroupPrimitive.Item>\n\treturn (\n\t\t<RadioGroupPrimitive.Item\n\t\t\tdata-slot=\"choice-indicator\"\n\t\t\tdata-palette={palette}\n\t\t\tclassName={baseClassName}\n\t\t\t{...radioProps}\n\t\t>\n\t\t\t{letter}\n\t\t</RadioGroupPrimitive.Item>\n\t)\n}\n\nexport { ChoiceIndicator, choiceIndicatorVariants }\n","\"use client\"\n\nimport * as LabelPrimitive from \"@radix-ui/react-label\"\nimport type * as React from \"react\"\n\nimport { cn } from \"../lib/utils\"\n\nfunction Label({ className, ...props }: React.ComponentProps<typeof LabelPrimitive.Root>) {\n\treturn (\n\t\t<LabelPrimitive.Root\n\t\t\tdata-slot=\"label\"\n\t\t\tclassName={cn(\n\t\t\t\t\"flex items-center gap-2 text-sm leading-none font-medium select-none group-data-[disabled=true]:pointer-events-none group-data-[disabled=true]:opacity-50 peer-disabled:cursor-not-allowed peer-disabled:opacity-50\",\n\t\t\t\tclassName\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t)\n}\n\nexport { Label }\n","\"use client\"\n\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport { useMemo } from \"react\"\n\nimport { cn, type Palette } from \"../lib/utils\"\nimport { Label } from \"./label\"\nimport { Separator } from \"./separator\"\n\nfunction FieldSet({ className, ...props }: React.ComponentProps<\"fieldset\">) {\n\treturn (\n\t\t<fieldset\n\t\t\tdata-slot=\"field-set\"\n\t\t\tclassName={cn(\n\t\t\t\t\"flex flex-col gap-6\",\n\t\t\t\t\"has-[>[data-slot=checkbox-group]]:gap-3 has-[>[data-slot=radio-group]]:gap-3\",\n\t\t\t\tclassName\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t)\n}\n\nfunction FieldLegend({\n\tclassName,\n\tvariant = \"legend\",\n\t...props\n}: React.ComponentProps<\"legend\"> & { variant?: \"legend\" | \"label\" }) {\n\treturn (\n\t\t<legend\n\t\t\tdata-slot=\"field-legend\"\n\t\t\tdata-variant={variant}\n\t\t\tclassName={cn(\"mb-3 font-medium\", \"data-[variant=legend]:text-base\", \"data-[variant=label]:text-sm\", className)}\n\t\t\t{...props}\n\t\t/>\n\t)\n}\n\nfunction FieldGroup({ className, ...props }: React.ComponentProps<\"div\">) {\n\treturn (\n\t\t<div\n\t\t\tdata-slot=\"field-group\"\n\t\t\tclassName={cn(\n\t\t\t\t\"group/field-group @container/field-group flex w-full flex-col gap-7 data-[slot=checkbox-group]:gap-3 [&>[data-slot=field-group]]:gap-4\",\n\t\t\t\tclassName\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t)\n}\n\nconst fieldVariants = cva(\"group/field flex w-full gap-3 data-[invalid=true]:text-destructive\", {\n\tvariants: {\n\t\torientation: {\n\t\t\tvertical: [\"flex-col [&>*]:w-full [&>.sr-only]:w-auto\"],\n\t\t\thorizontal: [\n\t\t\t\t\"flex-row items-center\",\n\t\t\t\t\"[&>[data-slot=field-label]]:flex-auto\",\n\t\t\t\t\"has-[>[data-slot=field-content]]:items-start has-[>[data-slot=field-content]]:[&>[role=checkbox],[role=radio]]:mt-px\"\n\t\t\t],\n\t\t\tresponsive: [\n\t\t\t\t\"flex-col [&>*]:w-full [&>.sr-only]:w-auto @md/field-group:flex-row @md/field-group:items-center @md/field-group:[&>*]:w-auto\",\n\t\t\t\t\"@md/field-group:[&>[data-slot=field-label]]:flex-auto\",\n\t\t\t\t\"@md/field-group:has-[>[data-slot=field-content]]:items-start @md/field-group:has-[>[data-slot=field-content]]:[&>[role=checkbox],[role=radio]]:mt-px\"\n\t\t\t]\n\t\t}\n\t},\n\tdefaultVariants: {\n\t\torientation: \"vertical\"\n\t}\n})\n\nfunction Field({\n\tclassName,\n\torientation = \"vertical\",\n\t...props\n}: React.ComponentProps<\"div\"> & VariantProps<typeof fieldVariants>) {\n\treturn (\n\t\t<div\n\t\t\trole=\"group\"\n\t\t\tdata-slot=\"field\"\n\t\t\tdata-orientation={orientation}\n\t\t\tclassName={cn(fieldVariants({ orientation }), className)}\n\t\t\t{...props}\n\t\t/>\n\t)\n}\n\nfunction FieldContent({ className, ...props }: React.ComponentProps<\"div\">) {\n\treturn (\n\t\t<div\n\t\t\tdata-slot=\"field-content\"\n\t\t\tclassName={cn(\"group/field-content flex flex-1 flex-col gap-1.5 leading-snug\", className)}\n\t\t\t{...props}\n\t\t/>\n\t)\n}\n\nfunction FieldLabel({\n\tclassName,\n\tpalette = \"default\",\n\t...props\n}: React.ComponentProps<typeof Label> & {\n\tpalette?: Palette\n}) {\n\treturn (\n\t\t<Label\n\t\t\tdata-slot=\"field-label\"\n\t\t\tdata-palette={palette}\n\t\t\tclassName={cn(\n\t\t\t\t\"group/field-label peer/field-label flex w-fit gap-2 leading-snug cursor-pointer\",\n\t\t\t\t\"group-data-[disabled=true]/field:opacity-50\",\n\t\t\t\t\"has-[>[data-slot=field]]:w-full has-[>[data-slot=field]]:flex-col has-[>[data-slot=field]]:rounded-xs has-[>[data-slot=field]]:p-4\",\n\t\t\t\t\"has-[>[data-slot=field]]:border-2 has-[>[data-slot=field]]:shadow-[0_2px_0_var(--field-complement)]\",\n\t\t\t\t\"has-[>[data-slot=field]]:hover:brightness-90 dark:has-[>[data-slot=field]]:hover:brightness-75\",\n\t\t\t\t\"has-[>[data-slot=field]]:active:shadow-none has-[>[data-slot=field]]:active:translate-y-[2px]\",\n\t\t\t\t\"[--field-background:var(--color-background)]\",\n\t\t\t\t\"[--field-complement:var(--color-accent)]\",\n\t\t\t\t\"has-[>[data-slot=field]]:bg-[var(--field-background)] has-[>[data-slot=field]]:border-accent has-[>[data-slot=field]]:text-foreground\",\n\t\t\t\t\"has-[>[data-slot=field]]:has-data-[state=checked]:bg-[var(--field-foreground)]/10 has-[>[data-slot=field]]:has-data-[state=checked]:border-[var(--field-complement)] has-[>[data-slot=field]]:has-data-[state=checked]:text-[var(--field-foreground)]\",\n\t\t\t\t\"has-data-[state=checked]:[--field-complement:var(--field-shadow)]\",\n\t\t\t\t\"data-[palette=default]:[--field-foreground:var(--color-foreground)] data-[palette=default]:[--field-shadow:var(--color-muted-foreground)]\",\n\t\t\t\t\"data-[palette=betta]:[--field-foreground:var(--color-betta)] data-[palette=betta]:[--field-shadow:var(--color-butterfly)]\",\n\t\t\t\t\"data-[palette=cardinal]:[--field-foreground:var(--color-cardinal)] data-[palette=cardinal]:[--field-shadow:var(--color-fire-ant)]\",\n\t\t\t\t\"data-[palette=bee]:[--field-foreground:var(--color-bee)] data-[palette=bee]:[--field-shadow:var(--color-lion)]\",\n\t\t\t\t\"data-[palette=owl]:[--field-foreground:var(--color-owl)] data-[palette=owl]:[--field-shadow:var(--color-tree-frog)]\",\n\t\t\t\t\"data-[palette=macaw]:[--field-foreground:var(--color-macaw)] data-[palette=macaw]:[--field-shadow:var(--color-whale)]\",\n\t\t\t\tclassName\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t)\n}\n\nfunction FieldTitle({ className, ...props }: React.ComponentProps<\"div\">) {\n\treturn (\n\t\t<div\n\t\t\tdata-slot=\"field-label\"\n\t\t\tclassName={cn(\n\t\t\t\t\"flex w-fit items-center gap-2 text-sm leading-snug font-medium group-data-[disabled=true]/field:opacity-50\",\n\t\t\t\tclassName\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t)\n}\n\nfunction FieldDescription({ className, ...props }: React.ComponentProps<\"p\">) {\n\treturn (\n\t\t<p\n\t\t\tdata-slot=\"field-description\"\n\t\t\tclassName={cn(\n\t\t\t\t\"text-muted-foreground text-sm leading-normal font-normal group-has-[[data-orientation=horizontal]]/field:text-balance\",\n\t\t\t\t\"last:mt-0 nth-last-2:-mt-1 [[data-variant=legend]+&]:-mt-1.5\",\n\t\t\t\t\"[&>a:hover]:text-primary [&>a]:underline [&>a]:underline-offset-4\",\n\t\t\t\tclassName\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t)\n}\n\nfunction FieldSeparator({\n\tchildren,\n\tclassName,\n\t...props\n}: React.ComponentProps<\"div\"> & {\n\tchildren?: React.ReactNode\n}) {\n\treturn (\n\t\t<div\n\t\t\tdata-slot=\"field-separator\"\n\t\t\tdata-content={!!children}\n\t\t\tclassName={cn(\"relative -my-2 h-5 text-sm group-data-[variant=outline]/field-group:-mb-2\", className)}\n\t\t\t{...props}\n\t\t>\n\t\t\t<Separator className=\"absolute inset-0 top-1/2\" />\n\t\t\t{children && (\n\t\t\t\t<span\n\t\t\t\t\tclassName=\"bg-background text-muted-foreground relative mx-auto block w-fit px-2\"\n\t\t\t\t\tdata-slot=\"field-separator-content\"\n\t\t\t\t>\n\t\t\t\t\t{children}\n\t\t\t\t</span>\n\t\t\t)}\n\t\t</div>\n\t)\n}\n\nfunction FieldError({\n\tclassName,\n\tchildren,\n\terrors,\n\t...props\n}: React.ComponentProps<\"div\"> & {\n\terrors?: Array<{ message?: string } | undefined>\n}) {\n\tconst content = useMemo(() => {\n\t\tif (children) {\n\t\t\treturn children\n\t\t}\n\n\t\tif (!errors?.length) {\n\t\t\treturn null\n\t\t}\n\n\t\tconst uniqueErrors = [...new Map(errors.map((error) => [error?.message, error])).values()]\n\n\t\tif (uniqueErrors?.length == 1) {\n\t\t\treturn uniqueErrors[0]?.message\n\t\t}\n\n\t\treturn (\n\t\t\t<ul className=\"ml-4 flex list-disc flex-col gap-1\">\n\t\t\t\t{uniqueErrors.map((error, index) => error?.message && <li key={index}>{error.message}</li>)}\n\t\t\t</ul>\n\t\t)\n\t}, [children, errors])\n\n\tif (!content) {\n\t\treturn null\n\t}\n\n\treturn (\n\t\t<div\n\t\t\trole=\"alert\"\n\t\t\tdata-slot=\"field-error\"\n\t\t\tclassName={cn(\"text-destructive text-sm font-normal\", className)}\n\t\t\t{...props}\n\t\t>\n\t\t\t{content}\n\t\t</div>\n\t)\n}\n\nexport {\n\tField,\n\tFieldLabel,\n\tFieldDescription,\n\tFieldError,\n\tFieldGroup,\n\tFieldLegend,\n\tFieldSeparator,\n\tFieldSet,\n\tFieldContent,\n\tFieldTitle\n}\n","\"use client\"\n\nimport * as RadioGroupPrimitive from \"@radix-ui/react-radio-group\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport { CircleIcon } from \"lucide-react\"\nimport type * as React from \"react\"\n\nimport { cn } from \"../lib/utils\"\n\nconst radioGroupItemVariants = cva(\n\t[\n\t\t\"cursor-pointer\",\n\t\t\"hover:brightness-90 dark:hover:brightness-75\",\n\t\t\"text-[var(--radio-group-item-foreground)] bg-[var(--radio-group-item-background)] dark:bg-input/30 aspect-square size-4 shrink-0 rounded-full border outline-none\",\n\t\t\"disabled:cursor-not-allowed disabled:opacity-50\",\n\t\t\"data-[state=unchecked]:border-input\",\n\t\t\"data-[state=checked]:border-[var(--radio-group-item-complement)]\",\n\t\t\"focus-visible:ring-[var(--radio-group-item-foreground)] focus-visible:ring-[3px]\",\n\t\t\"aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive\"\n\t],\n\t{\n\t\tvariants: {\n\t\t\tpalette: {\n\t\t\t\tdefault: [\n\t\t\t\t\t\"[--radio-group-item-background:var(--color-accent)]\",\n\t\t\t\t\t\"[--radio-group-item-foreground:var(--color-foreground)]\",\n\t\t\t\t\t\"[--radio-group-item-complement:var(--color-foreground)]\"\n\t\t\t\t],\n\t\t\t\tbetta: [\n\t\t\t\t\t\"[--radio-group-item-background:var(--color-accent)]\",\n\t\t\t\t\t\"[--radio-group-item-foreground:var(--color-betta)]\",\n\t\t\t\t\t\"[--radio-group-item-complement:var(--color-butterfly)]\"\n\t\t\t\t],\n\t\t\t\tcardinal: [\n\t\t\t\t\t\"[--radio-group-item-background:var(--color-accent)]\",\n\t\t\t\t\t\"[--radio-group-item-foreground:var(--color-cardinal)]\",\n\t\t\t\t\t\"[--radio-group-item-complement:var(--color-fire-ant)]\"\n\t\t\t\t],\n\t\t\t\tbee: [\n\t\t\t\t\t\"[--radio-group-item-background:var(--color-accent)]\",\n\t\t\t\t\t\"[--radio-group-item-foreground:var(--color-bee)]\",\n\t\t\t\t\t\"[--radio-group-item-complement:var(--color-lion)]\"\n\t\t\t\t],\n\t\t\t\towl: [\n\t\t\t\t\t\"[--radio-group-item-background:var(--color-accent)]\",\n\t\t\t\t\t\"[--radio-group-item-foreground:var(--color-owl)]\",\n\t\t\t\t\t\"[--radio-group-item-complement:var(--color-tree-frog)]\"\n\t\t\t\t],\n\t\t\t\tmacaw: [\n\t\t\t\t\t\"[--radio-group-item-background:var(--color-accent)]\",\n\t\t\t\t\t\"[--radio-group-item-foreground:var(--color-macaw)]\",\n\t\t\t\t\t\"[--radio-group-item-complement:var(--color-whale)]\"\n\t\t\t\t]\n\t\t\t}\n\t\t},\n\t\tdefaultVariants: {\n\t\t\tpalette: \"default\"\n\t\t}\n\t}\n)\n\nfunction RadioGroup({ className, ...props }: React.ComponentProps<typeof RadioGroupPrimitive.Root>) {\n\treturn <RadioGroupPrimitive.Root data-slot=\"radio-group\" className={cn(\"grid gap-3\", className)} {...props} />\n}\n\nfunction RadioGroupItem({\n\tclassName,\n\tpalette = \"default\",\n\t...props\n}: React.ComponentProps<typeof RadioGroupPrimitive.Item> & VariantProps<typeof radioGroupItemVariants>) {\n\treturn (\n\t\t<RadioGroupPrimitive.Item\n\t\t\tdata-slot=\"radio-group-item\"\n\t\t\tdata-palette={palette}\n\t\t\tclassName={cn(radioGroupItemVariants({ palette, className }))}\n\t\t\t{...props}\n\t\t>\n\t\t\t<RadioGroupPrimitive.Indicator\n\t\t\t\tdata-slot=\"radio-group-indicator\"\n\t\t\t\tclassName=\"relative flex items-center justify-center\"\n\t\t\t>\n\t\t\t\t<CircleIcon className=\"fill-[var(--radio-group-item-foreground)] absolute top-1/2 left-1/2 size-2 -translate-x-1/2 -translate-y-1/2\" />\n\t\t\t</RadioGroupPrimitive.Indicator>\n\t\t</RadioGroupPrimitive.Item>\n\t)\n}\n\nexport { RadioGroup, RadioGroupItem, radioGroupItemVariants }\n","\"use client\"\n\nimport * as React from \"react\"\nimport { cn } from \"../../lib/utils\"\nimport type { ChoiceInteraction } from \"../../schema\"\nimport { ChoiceIndicator } from \"../../ui/choice-indicator\"\nimport { Field, FieldContent, FieldGroup, FieldLabel, FieldSet, FieldTitle } from \"../../ui/field\"\nimport { RadioGroup } from \"../../ui/radio-group\"\nimport { HTMLContent } from \"../shared/html-content\"\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface ChoiceInteractionRendererProps {\n\t/** The choice interaction to render */\n\tinteraction: ChoiceInteraction\n\t/** Current user response for this interaction */\n\tresponse?: string | string[]\n\t/** Callback when user selects an answer */\n\tonAnswerSelect?: (value: string | string[]) => void\n\t/** Whether to disable the interaction */\n\tdisabled?: boolean\n\t/** Whether submit occurred; used to lock inputs and color selections */\n\thasSubmitted?: boolean\n\t/** Idle palette (before submit) */\n\tpalette?: \"default\" | \"betta\" | \"cardinal\" | \"bee\" | \"owl\" | \"macaw\"\n\t/** Overall correctness (single-select) used for selected coloring */\n\tisCorrect?: boolean\n\t/** Per-selection correctness (multi-select) for secure highlighting */\n\tselectedChoicesCorrectness?: Array<{ id: string; isCorrect: boolean }>\n}\n\n// ============================================================================\n// Choice Interaction Renderer\n// ============================================================================\n\n/**\n * Renders a choice interaction (single or multiple choice)\n */\nexport function ChoiceInteractionRenderer({\n\tinteraction,\n\tresponse,\n\tonAnswerSelect,\n\tdisabled = false,\n\thasSubmitted,\n\tpalette = \"macaw\",\n\tisCorrect,\n\tselectedChoicesCorrectness\n}: ChoiceInteractionRendererProps) {\n\tconst isMultiple = interaction.maxChoices > 1\n\tconst selectedValues = React.useMemo(() => {\n\t\tif (!response) return []\n\t\treturn Array.isArray(response) ? response : [response]\n\t}, [response])\n\n\t// Detect if all choices are image-only (contains <img> and no text once tags are stripped)\n\tconst isImagesOnly = React.useMemo(() => {\n\t\tconst hasImg = (html: string) => html.toLowerCase().includes(\"<img\")\n\t\tconst stripped = (html: string) => html.replace(/<[^>]*>/g, \"\").trim()\n\t\treturn (\n\t\t\tinteraction.choices.length > 0 &&\n\t\t\tinteraction.choices.every((c) => hasImg(c.contentHtml) && stripped(c.contentHtml) === \"\")\n\t\t)\n\t}, [interaction.choices])\n\n\tconst choiceCount = interaction.choices.length\n\n\t// Grid layout for image-only sets\n\tconst gridClass = React.useMemo(() => {\n\t\tif (!isImagesOnly) return \"space-y-2\"\n\t\tswitch (choiceCount) {\n\t\t\tcase 4:\n\t\t\t\treturn \"grid grid-cols-2 gap-4\"\n\t\t\tcase 3:\n\t\t\t\treturn \"grid grid-cols-3 gap-4\"\n\t\t\tcase 2:\n\t\t\t\treturn \"max-w-3xl mx-auto grid grid-cols-2 gap-6\"\n\t\t\tdefault:\n\t\t\t\treturn \"grid grid-cols-2 md:grid-cols-3 gap-4\"\n\t\t}\n\t}, [isImagesOnly, choiceCount])\n\n\t// Image sizing/centering helpers applied to the content wrapper\n\tconst imageCardClass = React.useMemo(() => {\n\t\tif (!isImagesOnly) return \"\"\n\t\treturn choiceCount === 2\n\t\t\t? \"justify-center text-center [&_img]:max-h-52 md:[&_img]:max-h-60 ![&_img]:w-auto ![&_img]:h-auto ![&_img]:max-w-full ![&_img]:block [&_img]:mx-auto min-h-[220px] px-8 py-8\"\n\t\t\t: \"justify-center text-center [&_img]:max-h-40 md:[&_img]:max-h-48 ![&_img]:w-auto ![&_img]:h-auto ![&_img]:max-w-full ![&_img]:block [&_img]:mx-auto min-h-[180px]\"\n\t}, [isImagesOnly, choiceCount])\n\n\tconst handleSingleChoice = (value: string) => {\n\t\tif (!disabled && onAnswerSelect) {\n\t\t\tonAnswerSelect(value)\n\t\t}\n\t}\n\n\t// Removed unused handler in favor of inline onCheckedChange logic\n\n\t// Render prompt if present\n\tconst promptElement = interaction.promptHtml ? <HTMLContent html={interaction.promptHtml} className=\"mb-4\" /> : null\n\n\t// Single choice (radio) with Field UI\n\tif (!isMultiple) {\n\t\tconst submitted = hasSubmitted === true\n\t\treturn (\n\t\t\t<div className=\"space-y-4\">\n\t\t\t\t{promptElement}\n\t\t\t\t<RadioGroup\n\t\t\t\t\tvalue={selectedValues[0] || \"\"}\n\t\t\t\t\tonValueChange={(value) => handleSingleChoice(value)}\n\t\t\t\t\tdisabled={disabled || submitted}\n\t\t\t\t>\n\t\t\t\t\t<FieldGroup>\n\t\t\t\t\t\t<FieldSet>\n\t\t\t\t\t\t\t{isImagesOnly ? (\n\t\t\t\t\t\t\t\t<div className={gridClass}>\n\t\t\t\t\t\t\t\t\t{interaction.choices.map((choice, index) => {\n\t\t\t\t\t\t\t\t\t\tconst isSelected = selectedValues.includes(choice.identifier)\n\t\t\t\t\t\t\t\t\t\tconst choicePalette = submitted && isSelected ? (isCorrect ? \"owl\" : \"cardinal\") : palette\n\t\t\t\t\t\t\t\t\t\tconst domId = `${interaction.responseIdentifier}-${choice.identifier}`\n\t\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t\t<FieldLabel key={choice.identifier} htmlFor={domId} palette={choicePalette}>\n\t\t\t\t\t\t\t\t\t\t\t\t<Field orientation=\"horizontal\" data-disabled={disabled || submitted}>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<ChoiceIndicator\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tvalue={choice.identifier}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tid={domId}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tletter={String.fromCharCode(65 + index)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tpalette={choicePalette}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tdisabled={disabled || submitted}\n\t\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<FieldContent className={cn(imageCardClass)}>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<FieldTitle>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<HTMLContent html={choice.contentHtml} />\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</FieldTitle>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</FieldContent>\n\t\t\t\t\t\t\t\t\t\t\t\t</Field>\n\t\t\t\t\t\t\t\t\t\t\t</FieldLabel>\n\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\tinteraction.choices.map((choice, index) => {\n\t\t\t\t\t\t\t\t\tconst isSelected = selectedValues.includes(choice.identifier)\n\t\t\t\t\t\t\t\t\tconst choicePalette = submitted && isSelected ? (isCorrect ? \"owl\" : \"cardinal\") : palette\n\t\t\t\t\t\t\t\t\tconst domId = `${interaction.responseIdentifier}-${choice.identifier}`\n\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t<FieldLabel key={choice.identifier} htmlFor={domId} palette={choicePalette}>\n\t\t\t\t\t\t\t\t\t\t\t<Field orientation=\"horizontal\" data-disabled={disabled || submitted}>\n\t\t\t\t\t\t\t\t\t\t\t\t<ChoiceIndicator\n\t\t\t\t\t\t\t\t\t\t\t\t\tvalue={choice.identifier}\n\t\t\t\t\t\t\t\t\t\t\t\t\tid={domId}\n\t\t\t\t\t\t\t\t\t\t\t\t\taria-describedby={\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tsubmitted && isSelected && choice.inlineFeedbackHtml ? `${domId}-fb` : undefined\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\tletter={String.fromCharCode(65 + index)}\n\t\t\t\t\t\t\t\t\t\t\t\t\tpalette={choicePalette}\n\t\t\t\t\t\t\t\t\t\t\t\t\tdisabled={disabled || submitted}\n\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t\t<FieldContent>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<FieldTitle>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<HTMLContent html={choice.contentHtml} />\n\t\t\t\t\t\t\t\t\t\t\t\t\t</FieldTitle>\n\t\t\t\t\t\t\t\t\t\t\t\t\t{submitted && isSelected && choice.inlineFeedbackHtml ? (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<output\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tid={`${domId}-fb`}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\taria-live=\"polite\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"mt-2 pl-3 border-l-4 text-sm text-muted-foreground\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tisCorrect ? \"border-owl\" : \"border-cardinal\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<HTMLContent html={choice.inlineFeedbackHtml} />\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</output>\n\t\t\t\t\t\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t\t\t\t\t\t</FieldContent>\n\t\t\t\t\t\t\t\t\t\t\t</Field>\n\t\t\t\t\t\t\t\t\t\t</FieldLabel>\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</FieldSet>\n\t\t\t\t\t</FieldGroup>\n\t\t\t\t</RadioGroup>\n\t\t\t</div>\n\t\t)\n\t}\n\n\t// Multi-select (checkbox) with Field UI\n\tconst submitted = hasSubmitted === true\n\tconst atMax = selectedValues.length >= interaction.maxChoices\n\treturn (\n\t\t<div className=\"space-y-4\">\n\t\t\t{promptElement}\n\t\t\t<FieldGroup>\n\t\t\t\t<FieldSet>\n\t\t\t\t\t{isImagesOnly ? (\n\t\t\t\t\t\t<div className={gridClass}>\n\t\t\t\t\t\t\t{interaction.choices.map((choice, _index) => {\n\t\t\t\t\t\t\t\tconst isChecked = selectedValues.includes(choice.identifier)\n\t\t\t\t\t\t\t\tconst perSelection = selectedChoicesCorrectness?.find((c) => c.id === choice.identifier)?.isCorrect\n\t\t\t\t\t\t\t\tconst selectedCorrect = perSelection ?? (isChecked ? (isCorrect ?? false) : false)\n\t\t\t\t\t\t\t\tconst choicePalette = submitted && isChecked ? (selectedCorrect ? \"owl\" : \"cardinal\") : palette\n\t\t\t\t\t\t\t\tconst domId = `${interaction.responseIdentifier}-${choice.identifier}`\n\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t<FieldLabel key={choice.identifier} htmlFor={domId} palette={choicePalette}>\n\t\t\t\t\t\t\t\t\t\t<Field orientation=\"horizontal\" data-disabled={disabled || submitted}>\n\t\t\t\t\t\t\t\t\t\t\t<ChoiceIndicator\n\t\t\t\t\t\t\t\t\t\t\t\ttype=\"checkbox\"\n\t\t\t\t\t\t\t\t\t\t\t\tid={domId}\n\t\t\t\t\t\t\t\t\t\t\t\tshowLetter={false}\n\t\t\t\t\t\t\t\t\t\t\t\tpalette={choicePalette}\n\t\t\t\t\t\t\t\t\t\t\t\tchecked={isChecked}\n\t\t\t\t\t\t\t\t\t\t\t\tonCheckedChange={(checked) => {\n\t\t\t\t\t\t\t\t\t\t\t\t\tif (disabled || submitted || !onAnswerSelect) return\n\t\t\t\t\t\t\t\t\t\t\t\t\t// Enforce max choices: do not allow selecting new choices beyond the limit\n\t\t\t\t\t\t\t\t\t\t\t\t\tif (checked === true && !isChecked && atMax) return\n\t\t\t\t\t\t\t\t\t\t\t\t\tconst next =\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tchecked === true\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t? [...selectedValues, choice.identifier]\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t: selectedValues.filter((v) => v !== choice.identifier)\n\t\t\t\t\t\t\t\t\t\t\t\t\tonAnswerSelect(next)\n\t\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\t\tdisabled={disabled || submitted || (!isChecked && atMax)}\n\t\t\t\t\t\t\t\t\t\t\t\taria-describedby={\n\t\t\t\t\t\t\t\t\t\t\t\t\tsubmitted && isChecked && choice.inlineFeedbackHtml ? `${domId}-fb` : undefined\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t<FieldContent className={cn(imageCardClass)}>\n\t\t\t\t\t\t\t\t\t\t\t\t<FieldTitle>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<HTMLContent html={choice.contentHtml} />\n\t\t\t\t\t\t\t\t\t\t\t\t</FieldTitle>\n\t\t\t\t\t\t\t\t\t\t\t\t{submitted && isChecked && choice.inlineFeedbackHtml ? (\n\t\t\t\t\t\t\t\t\t\t\t\t\t<output\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tid={`${domId}-fb`}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\taria-live=\"polite\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"mt-2 pl-3 border-l-4 text-sm text-muted-foreground\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tselectedCorrect ? \"border-owl\" : \"border-cardinal\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<HTMLContent html={choice.inlineFeedbackHtml} />\n\t\t\t\t\t\t\t\t\t\t\t\t\t</output>\n\t\t\t\t\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t\t\t\t\t</FieldContent>\n\t\t\t\t\t\t\t\t\t\t</Field>\n\t\t\t\t\t\t\t\t\t</FieldLabel>\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t) : (\n\t\t\t\t\t\tinteraction.choices.map((choice, _index) => {\n\t\t\t\t\t\t\tconst isChecked = selectedValues.includes(choice.identifier)\n\t\t\t\t\t\t\tconst perSelection = selectedChoicesCorrectness?.find((c) => c.id === choice.identifier)?.isCorrect\n\t\t\t\t\t\t\tconst selectedCorrect = perSelection ?? (isChecked ? (isCorrect ?? false) : false)\n\t\t\t\t\t\t\tconst choicePalette = submitted && isChecked ? (selectedCorrect ? \"owl\" : \"cardinal\") : palette\n\t\t\t\t\t\t\tconst domId = `${interaction.responseIdentifier}-${choice.identifier}`\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t<FieldLabel key={choice.identifier} htmlFor={domId} palette={choicePalette}>\n\t\t\t\t\t\t\t\t\t<Field orientation=\"horizontal\" data-disabled={disabled || submitted}>\n\t\t\t\t\t\t\t\t\t\t<ChoiceIndicator\n\t\t\t\t\t\t\t\t\t\t\ttype=\"checkbox\"\n\t\t\t\t\t\t\t\t\t\t\tid={domId}\n\t\t\t\t\t\t\t\t\t\t\tshowLetter={false}\n\t\t\t\t\t\t\t\t\t\t\tpalette={choicePalette}\n\t\t\t\t\t\t\t\t\t\t\tchecked={isChecked}\n\t\t\t\t\t\t\t\t\t\t\tonCheckedChange={(checked) => {\n\t\t\t\t\t\t\t\t\t\t\t\tif (disabled || submitted || !onAnswerSelect) return\n\t\t\t\t\t\t\t\t\t\t\t\t// Enforce max choices: do not allow selecting new choices beyond the limit\n\t\t\t\t\t\t\t\t\t\t\t\tif (checked === true && !isChecked && atMax) return\n\t\t\t\t\t\t\t\t\t\t\t\tconst next =\n\t\t\t\t\t\t\t\t\t\t\t\t\tchecked === true\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t? [...selectedValues, choice.identifier]\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t: selectedValues.filter((v) => v !== choice.identifier)\n\t\t\t\t\t\t\t\t\t\t\t\tonAnswerSelect(next)\n\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\tdisabled={disabled || submitted || (!isChecked && atMax)}\n\t\t\t\t\t\t\t\t\t\t\taria-describedby={submitted && isChecked && choice.inlineFeedbackHtml ? `${domId}-fb` : undefined}\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t<FieldContent>\n\t\t\t\t\t\t\t\t\t\t\t<FieldTitle>\n\t\t\t\t\t\t\t\t\t\t\t\t<HTMLContent html={choice.contentHtml} />\n\t\t\t\t\t\t\t\t\t\t\t</FieldTitle>\n\t\t\t\t\t\t\t\t\t\t\t{submitted && isChecked && choice.inlineFeedbackHtml ? (\n\t\t\t\t\t\t\t\t\t\t\t\t<output\n\t\t\t\t\t\t\t\t\t\t\t\t\tid={`${domId}-fb`}\n\t\t\t\t\t\t\t\t\t\t\t\t\taria-live=\"polite\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"mt-2 pl-3 border-l-4 text-sm text-muted-foreground\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tselectedCorrect ? \"border-owl\" : \"border-cardinal\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<HTMLContent html={choice.inlineFeedbackHtml} />\n\t\t\t\t\t\t\t\t\t\t\t\t</output>\n\t\t\t\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t\t\t\t</FieldContent>\n\t\t\t\t\t\t\t\t\t</Field>\n\t\t\t\t\t\t\t\t</FieldLabel>\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t})\n\t\t\t\t\t)}\n\t\t\t\t</FieldSet>\n\t\t\t</FieldGroup>\n\t\t</div>\n\t)\n}\n\nexport default ChoiceInteractionRenderer\n","\"use client\"\n\nimport { closestCenter, DndContext, type DragEndEvent, DragOverlay, useDraggable, useDroppable } from \"@dnd-kit/core\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport * as React from \"react\"\nimport { cn } from \"../../lib/utils\"\nimport type { DisplayGap, DisplayGapMatchInteraction, DisplayGapText } from \"../../shared/types\"\nimport { HTMLContent } from \"../shared/html-content\"\n\n// ============================================================================\n// Safe Inline HTML - For rendering sanitized content\n// ============================================================================\n\n/**\n * Renders pre-sanitized HTML content inline.\n * Content is sanitized server-side before being sent to the client.\n */\nfunction SafeInlineHTML({ html, className }: { html: string; className?: string }) {\n\tconst ref = React.useRef<HTMLSpanElement>(null)\n\n\tReact.useLayoutEffect(() => {\n\t\tif (ref.current) {\n\t\t\tref.current.innerHTML = html\n\t\t}\n\t}, [html])\n\n\treturn <span ref={ref} className={className} />\n}\n\n// ============================================================================\n// State Helpers\n// ============================================================================\n\n/** Internal state: Map<gapId, sourceId> */\ntype GapMatchState = Record<string, string>\n\n/** Convert internal state to QTI response format: [\"sourceId gapId\", ...] */\nfunction toQtiResponse(state: GapMatchState): string[] {\n\treturn Object.entries(state).map(([gapId, sourceId]) => `${sourceId} ${gapId}`)\n}\n\n/** Convert QTI response format to internal state */\nfunction fromQtiResponse(response: string[]): GapMatchState {\n\tconst state: GapMatchState = {}\n\tfor (const pair of response) {\n\t\tconst parts = pair.split(\" \")\n\t\tconst sourceId = parts[0]\n\t\tconst gapId = parts[1]\n\t\tif (sourceId && gapId) {\n\t\t\tstate[gapId] = sourceId\n\t\t}\n\t}\n\treturn state\n}\n\n// ============================================================================\n// Palette Variants\n// ============================================================================\n\nconst gapSlotVariants = cva(\n\t[\n\t\t\"inline-flex items-center justify-center\",\n\t\t\"min-w-[4rem] min-h-[1.75rem] px-2 mx-1 my-1\",\n\t\t\"border rounded-xs align-middle\",\n\t\t\"transition-all duration-150\"\n\t],\n\t{\n\t\tvariants: {\n\t\t\tstate: {\n\t\t\t\tempty: \"border-muted-foreground/30 bg-muted/20\",\n\t\t\t\thover: \"border-macaw bg-macaw/10\",\n\t\t\t\tfilled: \"border-macaw bg-macaw/10\",\n\t\t\t\tcorrect: \"border-owl bg-owl/15\",\n\t\t\t\tincorrect: \"border-cardinal bg-cardinal/15\"\n\t\t\t}\n\t\t},\n\t\tdefaultVariants: {\n\t\t\tstate: \"empty\"\n\t\t}\n\t}\n)\n\nconst sourceTokenVariants = cva(\n\t[\n\t\t\"inline-flex items-center justify-center\",\n\t\t\"h-7 px-2 rounded-xs border-2\",\n\t\t\"text-sm font-semibold\",\n\t\t\"transition-all duration-150\",\n\t\t\"select-none\"\n\t],\n\t{\n\t\tvariants: {\n\t\t\tstate: {\n\t\t\t\tidle: \"bg-background border-border shadow-[0_2px_0_var(--color-border)] cursor-grab hover:border-macaw hover:shadow-[0_2px_0_var(--color-macaw)]\",\n\t\t\t\tselected: \"bg-macaw/15 border-macaw shadow-[0_2px_0_var(--color-whale)] ring-2 ring-macaw/30\",\n\t\t\t\tdragging: \"opacity-50 cursor-grabbing\",\n\t\t\t\tdisabled: \"opacity-50 cursor-not-allowed bg-muted/50 border-muted shadow-none\"\n\t\t\t}\n\t\t},\n\t\tdefaultVariants: {\n\t\t\tstate: \"idle\"\n\t\t}\n\t}\n)\n\n// ============================================================================\n// Draggable Source Token\n// ============================================================================\n\ninterface SourceTokenProps {\n\tid: string\n\tcontentHtml: string\n\tdisabled: boolean\n\tisSelected: boolean\n\tonClick: () => void\n\tremainingUses: number\n}\n\nfunction SourceToken({ id, contentHtml, disabled, isSelected, onClick, remainingUses }: SourceTokenProps) {\n\tconst { attributes, listeners, setNodeRef, isDragging } = useDraggable({\n\t\tid: `source-${id}`,\n\t\tdata: { type: \"source\", sourceId: id },\n\t\tdisabled: disabled || remainingUses <= 0\n\t})\n\n\tif (remainingUses <= 0) return null\n\n\t// Don't apply transform here - the DragOverlay handles the visual that follows the cursor.\n\t// The original element stays in place and fades out when dragging.\n\n\tconst getState = (): \"idle\" | \"selected\" | \"dragging\" | \"disabled\" => {\n\t\tif (disabled) return \"disabled\"\n\t\tif (isDragging) return \"dragging\"\n\t\tif (isSelected) return \"selected\"\n\t\treturn \"idle\"\n\t}\n\n\treturn (\n\t\t<button\n\t\t\tref={setNodeRef}\n\t\t\ttype=\"button\"\n\t\t\tonClick={disabled ? undefined : onClick}\n\t\t\tclassName={cn(sourceTokenVariants({ state: getState() }), \"active:cursor-grabbing\")}\n\t\t\tdisabled={disabled}\n\t\t\t{...attributes}\n\t\t\t{...listeners}\n\t\t>\n\t\t\t<SafeInlineHTML html={contentHtml} />\n\t\t\t{remainingUses > 1 && <span className=\"ml-1 text-xs text-muted-foreground\">×{remainingUses}</span>}\n\t\t</button>\n\t)\n}\n\n// ============================================================================\n// Droppable Gap Slot\n// ============================================================================\n\ninterface GapSlotProps {\n\tgapId: string\n\tfilledWith: DisplayGapText | undefined\n\tonClear: () => void\n\tonClick: () => void\n\tdisabled: boolean\n\tisCorrect?: boolean\n\thasSubmitted: boolean\n}\n\nfunction GapSlot({ gapId, filledWith, onClear, onClick, disabled, isCorrect, hasSubmitted }: GapSlotProps) {\n\tconst { setNodeRef, isOver } = useDroppable({\n\t\tid: `gap-${gapId}`,\n\t\tdata: { type: \"gap\", gapId },\n\t\tdisabled\n\t})\n\n\tconst getState = (): VariantProps<typeof gapSlotVariants>[\"state\"] => {\n\t\tif (hasSubmitted && filledWith) {\n\t\t\treturn isCorrect ? \"correct\" : \"incorrect\"\n\t\t}\n\t\tif (isOver) return \"hover\"\n\t\tif (filledWith) return \"filled\"\n\t\treturn \"empty\"\n\t}\n\n\treturn (\n\t\t<span ref={setNodeRef} className={cn(gapSlotVariants({ state: getState() }))}>\n\t\t\t{filledWith ? (\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tonClick={disabled ? undefined : onClear}\n\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"flex items-center gap-1\",\n\t\t\t\t\t\t!disabled && \"hover:text-cardinal cursor-pointer\",\n\t\t\t\t\t\tdisabled && \"cursor-default\"\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t<SafeInlineHTML html={filledWith.contentHtml} />\n\t\t\t\t\t{!disabled && <span className=\"text-xs opacity-60\">×</span>}\n\t\t\t\t</button>\n\t\t\t) : (\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tonClick={disabled ? undefined : onClick}\n\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"w-full h-full min-h-[1.5em] flex items-center justify-center\",\n\t\t\t\t\t\t!disabled && \"cursor-pointer hover:bg-macaw/5\"\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t<span className=\"opacity-30\">___</span>\n\t\t\t\t</button>\n\t\t\t)}\n\t\t</span>\n\t)\n}\n\n// ============================================================================\n// Main Gap Match Interaction Component\n// ============================================================================\n\nexport interface GapMatchInteractionProps {\n\tinteraction: DisplayGapMatchInteraction\n\tresponse?: string[]\n\tonAnswerSelect?: (value: string[]) => void\n\tdisabled?: boolean\n\thasSubmitted?: boolean\n\t/** Per-gap correctness: Record<gapId, isCorrect> */\n\tgapCorrectness?: Record<string, boolean>\n}\n\nexport function GapMatchInteraction({\n\tinteraction,\n\tresponse = [],\n\tonAnswerSelect,\n\tdisabled = false,\n\thasSubmitted = false,\n\tgapCorrectness\n}: GapMatchInteractionProps) {\n\t// Convert QTI response to internal state\n\tconst currentPairs = React.useMemo(() => fromQtiResponse(response), [response])\n\n\t// Track selected source token for click-to-place\n\tconst [selectedSourceId, setSelectedSourceId] = React.useState<string | null>(null)\n\n\t// Track active drag for overlay\n\tconst [activeDragId, setActiveDragId] = React.useState<string | null>(null)\n\tconst activeSource = React.useMemo(\n\t\t() => interaction.gapTexts.find((gt) => gt.id === activeDragId),\n\t\t[activeDragId, interaction.gapTexts]\n\t)\n\n\t// Calculate remaining uses for each source token\n\tconst getRemainingUses = (sourceId: string): number => {\n\t\tconst source = interaction.gapTexts.find((gt) => gt.id === sourceId)\n\t\tif (!source) return 0\n\t\tif (source.matchMax === 0) return 999 // Unlimited\n\t\tconst usedCount = Object.values(currentPairs).filter((id) => id === sourceId).length\n\t\treturn source.matchMax - usedCount\n\t}\n\n\t// Handle source token click (select for click-to-place)\n\tconst handleSourceClick = (sourceId: string) => {\n\t\tif (disabled || hasSubmitted) return\n\t\tsetSelectedSourceId((prev) => (prev === sourceId ? null : sourceId))\n\t}\n\n\t// Handle gap click (place selected token)\n\tconst handleGapClick = (gapId: string) => {\n\t\tif (disabled || hasSubmitted || !selectedSourceId) return\n\n\t\t// Check if source still has remaining uses\n\t\tif (getRemainingUses(selectedSourceId) <= 0) {\n\t\t\tsetSelectedSourceId(null)\n\t\t\treturn\n\t\t}\n\n\t\t// Place the selected token in the gap\n\t\tconst newPairs = { ...currentPairs, [gapId]: selectedSourceId }\n\t\tonAnswerSelect?.(toQtiResponse(newPairs))\n\t\tsetSelectedSourceId(null)\n\t}\n\n\t// Handle clearing a gap\n\tconst handleClearGap = (gapId: string) => {\n\t\tif (disabled || hasSubmitted) return\n\t\tconst newPairs = { ...currentPairs }\n\t\tdelete newPairs[gapId]\n\t\tonAnswerSelect?.(toQtiResponse(newPairs))\n\t}\n\n\t// Handle drag end (drop source on gap)\n\tconst handleDragEnd = (event: DragEndEvent) => {\n\t\tsetActiveDragId(null)\n\t\tconst { active, over } = event\n\t\tif (!over) return\n\n\t\tconst sourceData = active.data.current\n\t\tconst targetData = over.data.current\n\n\t\tif (sourceData?.type === \"source\" && targetData?.type === \"gap\") {\n\t\t\tconst sourceId = sourceData.sourceId\n\t\t\tconst gapId = targetData.gapId\n\n\t\t\tif (typeof sourceId === \"string\" && typeof gapId === \"string\") {\n\t\t\t\t// Check remaining uses\n\t\t\t\tif (getRemainingUses(sourceId) <= 0) return\n\n\t\t\t\tconst newPairs = { ...currentPairs, [gapId]: sourceId }\n\t\t\t\tonAnswerSelect?.(toQtiResponse(newPairs))\n\t\t\t}\n\t\t}\n\t}\n\n\t// Build gap embeds for HTMLContent\n\tconst gapEmbeds = React.useMemo(() => {\n\t\tconst embeds: Record<string, DisplayGap> = {}\n\t\tfor (const gap of interaction.gaps) {\n\t\t\tembeds[gap.id] = gap\n\t\t}\n\t\treturn embeds\n\t}, [interaction.gaps])\n\n\treturn (\n\t\t<DndContext\n\t\t\tcollisionDetection={closestCenter}\n\t\t\tonDragStart={(e) => {\n\t\t\t\tconst id = e.active.id\n\t\t\t\tconst sourceId = typeof id === \"string\" ? id.replace(\"source-\", \"\") : null\n\t\t\t\tsetActiveDragId(sourceId)\n\t\t\t\tsetSelectedSourceId(null) // Clear selection when dragging\n\t\t\t}}\n\t\t\tonDragEnd={handleDragEnd}\n\t\t>\n\t\t\t<div className=\"space-y-6\">\n\t\t\t\t{/* Source Pool */}\n\t\t\t\t<div\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"p-4 rounded-xl border-2 border-dashed\",\n\t\t\t\t\t\t\"flex flex-wrap gap-2 min-h-[3.5rem]\",\n\t\t\t\t\t\tdisabled || hasSubmitted ? \"bg-muted/30 border-muted\" : \"bg-muted/10 border-muted-foreground/20\"\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t{interaction.gapTexts.map((source) => (\n\t\t\t\t\t\t<SourceToken\n\t\t\t\t\t\t\tkey={source.id}\n\t\t\t\t\t\t\tid={source.id}\n\t\t\t\t\t\t\tcontentHtml={source.contentHtml}\n\t\t\t\t\t\t\tdisabled={disabled || hasSubmitted}\n\t\t\t\t\t\t\tisSelected={selectedSourceId === source.id}\n\t\t\t\t\t\t\tonClick={() => handleSourceClick(source.id)}\n\t\t\t\t\t\t\tremainingUses={getRemainingUses(source.id)}\n\t\t\t\t\t\t/>\n\t\t\t\t\t))}\n\t\t\t\t\t{interaction.gapTexts.every((s) => getRemainingUses(s.id) <= 0)}\n\t\t\t\t</div>\n\n\t\t\t\t{/* Hint for click-to-place */}\n\t\t\t\t{selectedSourceId && !disabled && !hasSubmitted && (\n\t\t\t\t\t<p className=\"text-sm text-muted-foreground animate-pulse\">Click a gap to place the selected token</p>\n\t\t\t\t)}\n\n\t\t\t\t{/* Content with Gap Slots */}\n\t\t\t\t<div className=\"leading-relaxed text-lg\">\n\t\t\t\t\t<HTMLContent\n\t\t\t\t\t\thtml={interaction.contentHtml}\n\t\t\t\t\t\tgapEmbeds={gapEmbeds}\n\t\t\t\t\t\trenderGap={(gap) => {\n\t\t\t\t\t\t\tconst sourceId = currentPairs[gap.id]\n\t\t\t\t\t\t\tconst source = interaction.gapTexts.find((gt) => gt.id === sourceId)\n\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t<GapSlot\n\t\t\t\t\t\t\t\t\tgapId={gap.id}\n\t\t\t\t\t\t\t\t\tfilledWith={source}\n\t\t\t\t\t\t\t\t\tonClear={() => handleClearGap(gap.id)}\n\t\t\t\t\t\t\t\t\tonClick={() => handleGapClick(gap.id)}\n\t\t\t\t\t\t\t\t\tdisabled={disabled || hasSubmitted}\n\t\t\t\t\t\t\t\t\tisCorrect={gapCorrectness?.[gap.id]}\n\t\t\t\t\t\t\t\t\thasSubmitted={hasSubmitted}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t}}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t{/* Drag Overlay - dropAnimation={null} prevents the slow settling lag */}\n\t\t\t<DragOverlay dropAnimation={null}>\n\t\t\t\t{activeSource ? (\n\t\t\t\t\t<div className={cn(sourceTokenVariants({ state: \"selected\" }), \"shadow-xl cursor-grabbing\")}>\n\t\t\t\t\t\t<SafeInlineHTML html={activeSource.contentHtml} />\n\t\t\t\t\t</div>\n\t\t\t\t) : null}\n\t\t\t</DragOverlay>\n\t\t</DndContext>\n\t)\n}\n\nexport default GapMatchInteraction\n","// Deterministic shuffle using a string seed\n\nfunction xmur3(str: string): () => number {\n\tlet h = 1779033703 ^ str.length\n\tfor (let i = 0; i < str.length; i++) {\n\t\th = Math.imul(h ^ str.charCodeAt(i), 3432918353)\n\t\th = (h << 13) | (h >>> 19)\n\t}\n\treturn () => {\n\t\th = Math.imul(h ^ (h >>> 16), 2246822507)\n\t\th = Math.imul(h ^ (h >>> 13), 3266489909)\n\t\tconst shifted = h >>> 16\n\t\th = h ^ shifted\n\t\treturn h >>> 0\n\t}\n}\n\nfunction mulberry32(seed: number): () => number {\n\tlet state = seed\n\treturn () => {\n\t\tstate = state + 0x6d2b79f5\n\t\tlet t = state\n\t\tt = Math.imul(t ^ (t >>> 15), t | 1)\n\t\tt = t ^ (t + Math.imul(t ^ (t >>> 7), t | 61))\n\t\treturn ((t ^ (t >>> 14)) >>> 0) / 4294967296\n\t}\n}\n\nexport function shuffleWithSeed<T>(items: T[], seed: string): T[] {\n\tconst out = items.slice()\n\tconst seedFn = xmur3(seed)\n\tconst rng = mulberry32(seedFn())\n\tfor (let i = out.length - 1; i > 0; i--) {\n\t\tconst j = Math.floor(rng() * (i + 1))\n\t\tconst vi = out[i]\n\t\tconst vj = out[j]\n\t\tif (vi === undefined || vj === undefined) continue\n\t\tout[i] = vj\n\t\tout[j] = vi\n\t}\n\treturn out\n}\n","\"use client\"\n\nimport * as SelectPrimitive from \"@radix-ui/react-select\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport { CheckIcon, ChevronDownIcon, ChevronUpIcon } from \"lucide-react\"\nimport type * as React from \"react\"\n\nimport { cn } from \"../lib/utils\"\n\nconst selectTriggerVariants = cva(\n\t[\n\t\t\"cursor-pointer\",\n\t\t\"hover:brightness-90 dark:hover:brightness-75\",\n\t\t\"border-[var(--select-complement)] text-[var(--select-foreground)] bg-[var(--select-background)] inline-flex items-center justify-between gap-2 align-baseline rounded-xs px-3 py-2 text-sm whitespace-nowrap outline-none\",\n\t\t\"data-[placeholder]:text-muted-foreground data-[size=default]:h-9 data-[size=sm]:h-8 *:data-[slot=select-value]:line-clamp-1 *:data-[slot=select-value]:flex *:data-[slot=select-value]:items-center *:data-[slot=select-value]:gap-2\",\n\t\t\"[&_svg:not([class*='text-'])]:text-muted-foreground [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n\t\t\"disabled:cursor-not-allowed disabled:opacity-50\",\n\t\t\"aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive\"\n\t],\n\t{\n\t\tvariants: {\n\t\t\tpalette: {\n\t\t\t\tdefault: [\n\t\t\t\t\t\"[--select-background:var(--color-background)]\",\n\t\t\t\t\t\"[--select-foreground:var(--color-foreground)]\",\n\t\t\t\t\t\"[--select-complement:var(--color-accent)]\"\n\t\t\t\t],\n\t\t\t\tbetta: [\n\t\t\t\t\t\"[--select-background:var(--color-background)]\",\n\t\t\t\t\t\"[--select-foreground:var(--color-betta)]\",\n\t\t\t\t\t\"[--select-complement:var(--color-butterfly)]\"\n\t\t\t\t],\n\t\t\t\tcardinal: [\n\t\t\t\t\t\"[--select-background:var(--color-background)]\",\n\t\t\t\t\t\"[--select-foreground:var(--color-cardinal)]\",\n\t\t\t\t\t\"[--select-complement:var(--color-fire-ant)]\"\n\t\t\t\t],\n\t\t\t\tbee: [\n\t\t\t\t\t\"[--select-background:var(--color-background)]\",\n\t\t\t\t\t\"[--select-foreground:var(--color-bee)]\",\n\t\t\t\t\t\"[--select-complement:var(--color-lion)]\"\n\t\t\t\t],\n\t\t\t\towl: [\n\t\t\t\t\t\"[--select-background:var(--color-background)]\",\n\t\t\t\t\t\"[--select-foreground:var(--color-owl)]\",\n\t\t\t\t\t\"[--select-complement:var(--color-tree-frog)]\"\n\t\t\t\t],\n\t\t\t\tmacaw: [\n\t\t\t\t\t\"[--select-background:var(--color-background)]\",\n\t\t\t\t\t\"[--select-foreground:var(--color-macaw)]\",\n\t\t\t\t\t\"[--select-complement:var(--color-whale)]\"\n\t\t\t\t]\n\t\t\t},\n\t\t\toutline: {\n\t\t\t\ttrue: [\"border-2 shadow-[0_2px_0_var(--select-complement)]\"],\n\t\t\t\tfalse: [\"border-none shadow-[0_3px_0_var(--select-complement)]\"]\n\t\t\t}\n\t\t},\n\t\tdefaultVariants: {\n\t\t\tpalette: \"default\",\n\t\t\toutline: false\n\t\t}\n\t}\n)\n\nfunction Select({ ...props }: React.ComponentProps<typeof SelectPrimitive.Root>) {\n\treturn <SelectPrimitive.Root data-slot=\"select\" {...props} />\n}\n\nfunction SelectGroup({ ...props }: React.ComponentProps<typeof SelectPrimitive.Group>) {\n\treturn <SelectPrimitive.Group data-slot=\"select-group\" {...props} />\n}\n\nfunction SelectValue({ className, ...props }: React.ComponentProps<typeof SelectPrimitive.Value>) {\n\treturn (\n\t\t<SelectPrimitive.Value\n\t\t\tdata-slot=\"select-value\"\n\t\t\tclassName={cn(\"text-[var(--select-foreground)]\", className)}\n\t\t\t{...props}\n\t\t/>\n\t)\n}\n\nfunction SelectTrigger({\n\tclassName,\n\tsize = \"default\",\n\tpalette = \"default\",\n\tchildren,\n\toutline = true,\n\tstyle,\n\t...props\n}: React.ComponentProps<typeof SelectPrimitive.Trigger> &\n\tVariantProps<typeof selectTriggerVariants> & {\n\t\tsize?: \"sm\" | \"default\"\n\t}) {\n\treturn (\n\t\t<SelectPrimitive.Trigger\n\t\t\tdata-slot=\"select-trigger\"\n\t\t\tdata-size={size}\n\t\t\tdata-palette={palette}\n\t\t\tclassName={cn(selectTriggerVariants({ palette, outline, className }))}\n\t\t\tstyle={{ color: \"var(--select-foreground)\", ...style }}\n\t\t\t{...props}\n\t\t>\n\t\t\t{children}\n\t\t\t<SelectPrimitive.Icon asChild>\n\t\t\t\t<ChevronDownIcon className=\"size-4 opacity-50\" />\n\t\t\t</SelectPrimitive.Icon>\n\t\t</SelectPrimitive.Trigger>\n\t)\n}\n\nfunction SelectContent({\n\tclassName,\n\tchildren,\n\tposition = \"popper\",\n\talign = \"center\",\n\t...props\n}: React.ComponentProps<typeof SelectPrimitive.Content>) {\n\treturn (\n\t\t<SelectPrimitive.Portal>\n\t\t\t<SelectPrimitive.Content\n\t\t\t\tdata-slot=\"select-content\"\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 relative z-50 max-h-(--radix-select-content-available-height) min-w-[8rem] origin-(--radix-select-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-xs border border-accent shadow-[0_2px_0_var(--color-accent)]\",\n\t\t\t\t\tposition === \"popper\" &&\n\t\t\t\t\t\t\"data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1\",\n\t\t\t\t\tclassName\n\t\t\t\t)}\n\t\t\t\tposition={position}\n\t\t\t\talign={align}\n\t\t\t\t{...props}\n\t\t\t>\n\t\t\t\t<SelectScrollUpButton />\n\t\t\t\t<SelectPrimitive.Viewport\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"p-1\",\n\t\t\t\t\t\tposition === \"popper\" &&\n\t\t\t\t\t\t\t\"h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)] scroll-my-1\"\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t{children}\n\t\t\t\t</SelectPrimitive.Viewport>\n\t\t\t\t<SelectScrollDownButton />\n\t\t\t</SelectPrimitive.Content>\n\t\t</SelectPrimitive.Portal>\n\t)\n}\n\nfunction SelectLabel({ className, ...props }: React.ComponentProps<typeof SelectPrimitive.Label>) {\n\treturn (\n\t\t<SelectPrimitive.Label\n\t\t\tdata-slot=\"select-label\"\n\t\t\tclassName={cn(\"text-muted-foreground px-2 py-1.5 text-xs\", className)}\n\t\t\t{...props}\n\t\t/>\n\t)\n}\n\nfunction SelectItem({ className, children, ...props }: React.ComponentProps<typeof SelectPrimitive.Item>) {\n\treturn (\n\t\t<SelectPrimitive.Item\n\t\t\tdata-slot=\"select-item\"\n\t\t\tclassName={cn(\n\t\t\t\t\"focus:bg-accent focus:text-accent-foreground [&_svg:not([class*='text-'])]:text-muted-foreground relative flex w-full cursor-pointer items-center gap-2 rounded-xs py-1.5 pr-8 pl-2 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 *:[span]:last:flex *:[span]:last:items-center *:[span]:last:gap-2\",\n\t\t\t\tclassName\n\t\t\t)}\n\t\t\t{...props}\n\t\t>\n\t\t\t<span className=\"absolute right-2 flex size-3.5 items-center justify-center\">\n\t\t\t\t<SelectPrimitive.ItemIndicator>\n\t\t\t\t\t<CheckIcon className=\"size-4\" />\n\t\t\t\t</SelectPrimitive.ItemIndicator>\n\t\t\t</span>\n\t\t\t<SelectPrimitive.ItemText>{children}</SelectPrimitive.ItemText>\n\t\t</SelectPrimitive.Item>\n\t)\n}\n\nfunction SelectSeparator({ className, ...props }: React.ComponentProps<typeof SelectPrimitive.Separator>) {\n\treturn (\n\t\t<SelectPrimitive.Separator\n\t\t\tdata-slot=\"select-separator\"\n\t\t\tclassName={cn(\"bg-border pointer-events-none -mx-1 my-1 h-px\", className)}\n\t\t\t{...props}\n\t\t/>\n\t)\n}\n\nfunction SelectScrollUpButton({ className, ...props }: React.ComponentProps<typeof SelectPrimitive.ScrollUpButton>) {\n\treturn (\n\t\t<SelectPrimitive.ScrollUpButton\n\t\t\tdata-slot=\"select-scroll-up-button\"\n\t\t\tclassName={cn(\"flex cursor-default items-center justify-center py-1\", className)}\n\t\t\t{...props}\n\t\t>\n\t\t\t<ChevronUpIcon className=\"size-4\" />\n\t\t</SelectPrimitive.ScrollUpButton>\n\t)\n}\n\nfunction SelectScrollDownButton({\n\tclassName,\n\t...props\n}: React.ComponentProps<typeof SelectPrimitive.ScrollDownButton>) {\n\treturn (\n\t\t<SelectPrimitive.ScrollDownButton\n\t\t\tdata-slot=\"select-scroll-down-button\"\n\t\t\tclassName={cn(\"flex cursor-default items-center justify-center py-1\", className)}\n\t\t\t{...props}\n\t\t>\n\t\t\t<ChevronDownIcon className=\"size-4\" />\n\t\t</SelectPrimitive.ScrollDownButton>\n\t)\n}\n\nexport {\n\tSelect,\n\tSelectContent,\n\tSelectGroup,\n\tSelectItem,\n\tSelectLabel,\n\tSelectScrollDownButton,\n\tSelectScrollUpButton,\n\tSelectSeparator,\n\tSelectTrigger,\n\tSelectValue\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport { sanitizeForDisplay } from \"../../html\"\nimport { shuffleWithSeed } from \"../../shared/shuffle\"\nimport type { DisplayInlineEmbed } from \"../../shared/types\"\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from \"../../ui/select\"\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface InlineInteractionProps {\n\t/** Inline interaction payload to render */\n\tembed: DisplayInlineEmbed\n\t/** Current user response (single-select) */\n\tresponse?: string\n\t/** Callback when user selects an answer */\n\tonAnswerSelect?: (value: string) => void\n\t/** Whether to disable the interaction */\n\tdisabled?: boolean\n\t/** Whether submit occurred; used to lock inputs and color selections */\n\thasSubmitted?: boolean\n\t/** Idle palette (before submit) */\n\tpalette?: \"default\" | \"betta\" | \"cardinal\" | \"bee\" | \"owl\" | \"macaw\"\n\t/** Overall correctness for the selected value (single-select) */\n\tisCorrect?: boolean\n}\n\n// ============================================================================\n// Safe HTML Renderer (inline variant)\n// ============================================================================\n\n/**\n * Renders sanitized HTML inline. Uses a ref to set innerHTML after sanitization.\n * This avoids React's dangerouslySetInnerHTML prop while maintaining security.\n */\nfunction SafeInlineHTML({ html, className, style }: { html: string; className?: string; style?: React.CSSProperties }) {\n\tconst ref = React.useRef<HTMLSpanElement>(null)\n\n\tReact.useEffect(() => {\n\t\tif (ref.current) {\n\t\t\tref.current.innerHTML = sanitizeForDisplay(html)\n\t\t}\n\t}, [html])\n\n\treturn <span ref={ref} className={className} style={style} />\n}\n\n// ============================================================================\n// Inline Interaction Renderer\n// ============================================================================\n\n/**\n * Renders an inline choice interaction as a compact Select control.\n * Mirrors the UX and color rules used by the selects demo and block choice renderer.\n */\nexport function InlineInteraction({\n\tembed,\n\tresponse,\n\tonAnswerSelect,\n\tdisabled = false,\n\thasSubmitted,\n\tpalette = \"macaw\",\n\tisCorrect\n}: InlineInteractionProps) {\n\tconst hasValue = typeof response === \"string\" && response.length > 0\n\tconst neutralTriggerClass = hasValue ? \"\" : \"border-border shadow-[0_3px_0_var(--color-border)] focus-visible:ring-0\"\n\n\t// Deterministic shuffle for consistent ordering\n\tconst items = React.useMemo(() => {\n\t\treturn embed.shuffle ? shuffleWithSeed(embed.choices, embed.responseId) : embed.choices\n\t}, [embed])\n\n\t// Feedback-driven palette and invalid state\n\tconst feedbackPalette: typeof palette = hasSubmitted && hasValue ? (isCorrect ? \"owl\" : \"cardinal\") : palette\n\tconst ariaInvalid = hasSubmitted && hasValue && isCorrect === false ? true : undefined\n\n\t// Selected label HTML for the trigger (mirror menu label, but we control styling here)\n\tconst selectedLabelHtml = React.useMemo(() => {\n\t\tif (!hasValue) return \"\"\n\t\tconst found = items.find((c) => c.id === response)\n\t\treturn found?.contentHtml ?? \"\"\n\t}, [hasValue, items, response])\n\n\treturn (\n\t\t<Select\n\t\t\tvalue={hasValue ? response : \"\"}\n\t\t\tonValueChange={(value) => {\n\t\t\t\tif (!disabled && onAnswerSelect) onAnswerSelect(value)\n\t\t\t}}\n\t\t\tdisabled={disabled || hasSubmitted}\n\t\t>\n\t\t\t<SelectTrigger\n\t\t\t\tsize=\"sm\"\n\t\t\t\tclassName={neutralTriggerClass}\n\t\t\t\tpalette={hasValue ? feedbackPalette : \"default\"}\n\t\t\t\taria-invalid={ariaInvalid}\n\t\t\t>\n\t\t\t\t<SelectValue placeholder=\"Select...\">\n\t\t\t\t\t{hasValue ? (\n\t\t\t\t\t\t<SafeInlineHTML\n\t\t\t\t\t\t\thtml={selectedLabelHtml}\n\t\t\t\t\t\t\tclassName=\"text-[var(--select-foreground)]\"\n\t\t\t\t\t\t\tstyle={{ color: \"var(--select-foreground)\" }}\n\t\t\t\t\t\t/>\n\t\t\t\t\t) : null}\n\t\t\t\t</SelectValue>\n\t\t\t</SelectTrigger>\n\t\t\t<SelectContent position=\"item-aligned\">\n\t\t\t\t{items.map((c) => (\n\t\t\t\t\t<SelectItem key={c.id} value={c.id}>\n\t\t\t\t\t\t<SafeInlineHTML html={c.contentHtml} />\n\t\t\t\t\t</SelectItem>\n\t\t\t\t))}\n\t\t\t</SelectContent>\n\t\t</Select>\n\t)\n}\n\nexport default InlineInteraction\n","\"use client\"\n\nimport {\n\tclosestCenter,\n\tDndContext,\n\ttype DragEndEvent,\n\tDragOverlay,\n\tPointerSensor,\n\tuseDraggable,\n\tuseDroppable,\n\tuseSensor,\n\tuseSensors\n} from \"@dnd-kit/core\"\nimport { cva } from \"class-variance-authority\"\nimport * as React from \"react\"\nimport { cn } from \"../../lib/utils\"\nimport type { DisplayAssociableChoice, DisplayMatchInteraction } from \"../../shared/types\"\n\n// ============================================================================\n// Safe Inline HTML - For rendering sanitized content\n// ============================================================================\n\nfunction SafeInlineHTML({ html, className }: { html: string; className?: string }) {\n\tconst ref = React.useRef<HTMLSpanElement>(null)\n\n\tReact.useLayoutEffect(() => {\n\t\tif (ref.current) {\n\t\t\tref.current.innerHTML = html\n\t\t}\n\t}, [html])\n\n\treturn <span ref={ref} className={className} />\n}\n\n// ============================================================================\n// State Helpers\n// ============================================================================\n\n/** Internal state: Map<targetId, sourceId[]> */\ntype MatchState = Record<string, string[]>\n\n/** Create pair key for QTI response */\nfunction createPairKey(sourceId: string, targetId: string): string {\n\treturn `${sourceId} ${targetId}`\n}\n\n/** Convert internal state to QTI response format: [\"sourceId targetId\", ...] */\nfunction toQtiResponse(state: MatchState): string[] {\n\tconst pairs: string[] = []\n\tfor (const [targetId, sourceIds] of Object.entries(state)) {\n\t\tfor (const sourceId of sourceIds) {\n\t\t\tpairs.push(createPairKey(sourceId, targetId))\n\t\t}\n\t}\n\treturn pairs\n}\n\n/** Convert QTI response format to internal state */\nfunction fromQtiResponse(response: string[]): MatchState {\n\tconst state: MatchState = {}\n\tfor (const pair of response) {\n\t\tconst parts = pair.split(\" \")\n\t\tconst sourceId = parts[0]\n\t\tconst targetId = parts[1]\n\t\tif (sourceId && targetId) {\n\t\t\tif (!state[targetId]) {\n\t\t\t\tstate[targetId] = []\n\t\t\t}\n\t\t\tstate[targetId].push(sourceId)\n\t\t}\n\t}\n\treturn state\n}\n\n// ============================================================================\n// Variants\n// ============================================================================\n\nconst targetBoxVariants = cva(\n\t[\"flex flex-col gap-2 p-3 min-h-[8rem] min-w-[10rem]\", \"border-2 rounded-xs\", \"transition-all duration-150\"],\n\t{\n\t\tvariants: {\n\t\t\tstate: {\n\t\t\t\tempty: \"border-border border-dashed bg-muted/10\",\n\t\t\t\thover: \"border-macaw border-solid bg-macaw/10 shadow-[0_2px_0_var(--color-macaw)]\",\n\t\t\t\tfilled: \"border-macaw border-solid bg-macaw/5 shadow-[0_2px_0_var(--color-whale)]\",\n\t\t\t\tdisabled: \"opacity-60 bg-muted/30 border-dashed\"\n\t\t\t}\n\t\t},\n\t\tdefaultVariants: {\n\t\t\tstate: \"empty\"\n\t\t}\n\t}\n)\n\nconst sourceTokenVariants = cva(\n\t[\n\t\t\"inline-flex items-center justify-center\",\n\t\t\"h-7 px-2 rounded-xs border-2\",\n\t\t\"text-sm font-semibold\",\n\t\t\"transition-all duration-150\",\n\t\t\"select-none\"\n\t],\n\t{\n\t\tvariants: {\n\t\t\tstate: {\n\t\t\t\tidle: \"bg-background border-border shadow-[0_2px_0_var(--color-border)] cursor-grab hover:border-macaw hover:shadow-[0_2px_0_var(--color-macaw)]\",\n\t\t\t\tdragging: \"opacity-50 cursor-grabbing\",\n\t\t\t\tplaced: \"bg-macaw/10 border-macaw shadow-[0_2px_0_var(--color-whale)]\",\n\t\t\t\tcorrect: \"bg-owl/15 border-owl shadow-[0_2px_0_var(--color-tree-frog)]\",\n\t\t\t\tincorrect: \"bg-cardinal/15 border-cardinal shadow-[0_2px_0_var(--color-fire-ant)]\",\n\t\t\t\tdisabled: \"opacity-50 cursor-not-allowed bg-muted/50 border-muted shadow-none\"\n\t\t\t}\n\t\t},\n\t\tdefaultVariants: {\n\t\t\tstate: \"idle\"\n\t\t}\n\t}\n)\n\n// ============================================================================\n// Draggable Placed Token (can be moved between containers)\n// ============================================================================\n\ninterface PlacedTokenProps {\n\tinstanceId: string\n\tsourceId: string\n\tfromTargetId: string\n\tfromIndex: number\n\tcontentHtml: string\n\tdisabled: boolean\n\tstate: \"placed\" | \"correct\" | \"incorrect\" | \"disabled\"\n\tonRemove: () => void\n}\n\nfunction PlacedToken({\n\tinstanceId,\n\tsourceId,\n\tfromTargetId,\n\tfromIndex,\n\tcontentHtml,\n\tdisabled,\n\tstate,\n\tonRemove\n}: PlacedTokenProps) {\n\tconst canInteract = !disabled && state !== \"correct\" && state !== \"incorrect\"\n\n\tconst { attributes, listeners, setNodeRef, isDragging } = useDraggable({\n\t\tid: instanceId,\n\t\tdata: { type: \"placed\", sourceId, fromTargetId, fromIndex },\n\t\tdisabled: !canInteract\n\t})\n\n\tconst tokenState = isDragging ? \"dragging\" : state\n\n\t// Don't use disabled={} on button - it blocks drag events\n\treturn (\n\t\t<button\n\t\t\ttype=\"button\"\n\t\t\tref={setNodeRef}\n\t\t\t{...attributes}\n\t\t\t{...listeners}\n\t\t\tonClick={canInteract ? onRemove : undefined}\n\t\t\taria-disabled={!canInteract}\n\t\t\tclassName={cn(\n\t\t\t\tsourceTokenVariants({ state: tokenState }),\n\t\t\t\tcanInteract && \"cursor-grab hover:bg-muted/50 group\",\n\t\t\t\t!canInteract && \"cursor-default pointer-events-none\"\n\t\t\t)}\n\t\t>\n\t\t\t<SafeInlineHTML html={contentHtml} />\n\t\t\t{canInteract && <span className=\"text-xs opacity-40 group-hover:opacity-100 ml-1 transition-opacity\">×</span>}\n\t\t</button>\n\t)\n}\n\n// ============================================================================\n// Droppable Target Box\n// ============================================================================\n\ninterface TargetBoxProps {\n\ttarget: DisplayAssociableChoice\n\tplacedSources: Array<{ instanceId: string; source: DisplayAssociableChoice; index: number }>\n\tdisabled: boolean\n\tonRemoveSource: (instanceId: string) => void\n\tpairCorrectness?: Record<string, boolean>\n\thasSubmitted: boolean\n}\n\nfunction TargetBox({ target, placedSources, disabled, onRemoveSource, pairCorrectness, hasSubmitted }: TargetBoxProps) {\n\tconst { setNodeRef, isOver } = useDroppable({\n\t\tid: `target-${target.id}`,\n\t\tdata: { type: \"target\", targetId: target.id },\n\t\tdisabled\n\t})\n\n\tconst hasSources = placedSources.length > 0\n\n\tconst getState = (): \"empty\" | \"hover\" | \"filled\" | \"disabled\" => {\n\t\tif (disabled) return \"disabled\"\n\t\tif (isOver) return \"hover\"\n\t\tif (hasSources) return \"filled\"\n\t\treturn \"empty\"\n\t}\n\n\tconst getTokenState = (sourceId: string): \"placed\" | \"correct\" | \"incorrect\" | \"disabled\" => {\n\t\tif (hasSubmitted) {\n\t\t\tconst pairKey = createPairKey(sourceId, target.id)\n\t\t\tconst isCorrect = pairCorrectness?.[pairKey]\n\t\t\tif (isCorrect === true) return \"correct\"\n\t\t\tif (isCorrect === false) return \"incorrect\"\n\t\t}\n\t\tif (disabled) return \"disabled\"\n\t\treturn \"placed\"\n\t}\n\n\treturn (\n\t\t<div ref={setNodeRef} className={cn(targetBoxVariants({ state: getState() }))}>\n\t\t\t{/* Target Label - Inside at top */}\n\t\t\t<div className=\"text-sm font-semibold text-center pb-2 border-b border-border/50 mb-2\">\n\t\t\t\t<SafeInlineHTML html={target.contentHtml} />\n\t\t\t</div>\n\n\t\t\t{/* Placed tokens or placeholder */}\n\t\t\t{placedSources.length === 0 ? (\n\t\t\t\t<div className=\"flex-1 flex items-center justify-center text-muted-foreground/50 text-sm\">Drop here</div>\n\t\t\t) : (\n\t\t\t\t<div className=\"flex flex-col gap-2\">\n\t\t\t\t\t{placedSources.map(({ instanceId, source, index }) => (\n\t\t\t\t\t\t<PlacedToken\n\t\t\t\t\t\t\tkey={instanceId}\n\t\t\t\t\t\t\tinstanceId={instanceId}\n\t\t\t\t\t\t\tsourceId={source.id}\n\t\t\t\t\t\t\tfromTargetId={target.id}\n\t\t\t\t\t\t\tfromIndex={index}\n\t\t\t\t\t\t\tcontentHtml={source.contentHtml}\n\t\t\t\t\t\t\tdisabled={disabled || hasSubmitted}\n\t\t\t\t\t\t\tstate={getTokenState(source.id)}\n\t\t\t\t\t\t\tonRemove={() => onRemoveSource(instanceId)}\n\t\t\t\t\t\t/>\n\t\t\t\t\t))}\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</div>\n\t)\n}\n\n// ============================================================================\n// Source Pool Token\n// ============================================================================\n\ninterface SourcePoolTokenProps {\n\tsource: DisplayAssociableChoice\n\tremainingUses: number\n\tdisabled: boolean\n}\n\nfunction SourcePoolToken({ source, remainingUses, disabled }: SourcePoolTokenProps) {\n\tconst { attributes, listeners, setNodeRef, isDragging } = useDraggable({\n\t\tid: `pool-${source.id}`,\n\t\tdata: { type: \"source\", sourceId: source.id },\n\t\tdisabled: disabled || remainingUses <= 0\n\t})\n\n\tif (remainingUses <= 0) return null\n\n\tconst getState = (): \"idle\" | \"dragging\" | \"disabled\" => {\n\t\tif (isDragging) return \"dragging\"\n\t\tif (disabled) return \"disabled\"\n\t\treturn \"idle\"\n\t}\n\n\treturn (\n\t\t<div ref={setNodeRef} className={cn(sourceTokenVariants({ state: getState() }))} {...attributes} {...listeners}>\n\t\t\t<SafeInlineHTML html={source.contentHtml} />\n\t\t\t{remainingUses > 1 && <span className=\"ml-2 text-xs text-muted-foreground\">×{remainingUses}</span>}\n\t\t</div>\n\t)\n}\n\n// ============================================================================\n// Droppable Source Pool (for returning tokens)\n// ============================================================================\n\ninterface DroppablePoolProps {\n\tdisabled: boolean\n\tchildren: React.ReactNode\n}\n\nfunction DroppablePool({ disabled, children }: DroppablePoolProps) {\n\tconst { setNodeRef, isOver } = useDroppable({\n\t\tid: \"source-pool\",\n\t\tdata: { type: \"pool\" },\n\t\tdisabled\n\t})\n\n\treturn (\n\t\t<div\n\t\t\tref={setNodeRef}\n\t\t\tclassName={cn(\n\t\t\t\t\"p-4 rounded-xl border-2 border-dashed\",\n\t\t\t\t\"flex flex-wrap justify-center gap-3 min-h-[4rem]\",\n\t\t\t\t\"transition-all duration-150\",\n\t\t\t\tdisabled ? \"bg-muted/30 border-muted\" : \"bg-muted/10 border-muted-foreground/20\",\n\t\t\t\tisOver && !disabled && \"border-macaw bg-macaw/10\"\n\t\t\t)}\n\t\t>\n\t\t\t{children}\n\t\t</div>\n\t)\n}\n\n// ============================================================================\n// Main Match Interaction Component\n// ============================================================================\n\nexport interface MatchInteractionProps {\n\tinteraction: DisplayMatchInteraction\n\tresponse?: string[]\n\tonAnswerSelect?: (value: string[]) => void\n\tdisabled?: boolean\n\thasSubmitted?: boolean\n\tpairCorrectness?: Record<string, boolean>\n}\n\nexport function MatchInteraction({\n\tinteraction,\n\tresponse = [],\n\tonAnswerSelect,\n\tdisabled = false,\n\thasSubmitted = false,\n\tpairCorrectness\n}: MatchInteractionProps) {\n\t// Sensors: require 5px movement before drag starts (allows clicks to work)\n\tconst sensors = useSensors(\n\t\tuseSensor(PointerSensor, {\n\t\t\tactivationConstraint: {\n\t\t\t\tdistance: 5\n\t\t\t}\n\t\t})\n\t)\n\n\t// Convert QTI response to internal state\n\tconst currentState = React.useMemo(() => fromQtiResponse(response), [response])\n\n\t// Track active drag for overlay\n\tconst [activeDragId, setActiveDragId] = React.useState<string | null>(null)\n\tconst activeSource = React.useMemo(() => {\n\t\tif (!activeDragId) return null\n\t\t// Check if it's from pool or already placed\n\t\tconst sourceId = activeDragId.startsWith(\"pool-\") ? activeDragId.replace(\"pool-\", \"\") : activeDragId.split(\"-\")[0] // instanceId format: \"sourceId-targetId-index\"\n\t\treturn interaction.sourceChoices.find((s) => s.id === sourceId)\n\t}, [activeDragId, interaction.sourceChoices])\n\n\t// Count how many times each source is used\n\tconst getSourceUsageCount = (sourceId: string): number => {\n\t\tlet count = 0\n\t\tfor (const sources of Object.values(currentState)) {\n\t\t\tcount += sources.filter((id) => id === sourceId).length\n\t\t}\n\t\treturn count\n\t}\n\n\t// Get remaining uses for a source\n\tconst getRemainingUses = (source: DisplayAssociableChoice): number => {\n\t\tif (source.matchMax === 0) return 999 // Unlimited\n\t\treturn source.matchMax - getSourceUsageCount(source.id)\n\t}\n\n\t// Check if target can accept more\n\tconst canTargetAcceptMore = (target: DisplayAssociableChoice): boolean => {\n\t\tconst placed = currentState[target.id]?.length ?? 0\n\t\tif (target.matchMax === 0) return true // Unlimited\n\t\treturn placed < target.matchMax\n\t}\n\n\t// Handle drag end\n\tconst handleDragEnd = (event: DragEndEvent) => {\n\t\tsetActiveDragId(null)\n\t\tconst { active, over } = event\n\t\tif (!over) return\n\n\t\tconst activeData = active.data.current\n\t\tconst overData = over.data.current\n\n\t\t// Case 1: Dropping on the pool (return to bank)\n\t\tif (overData?.type === \"pool\" && activeData?.type === \"placed\") {\n\t\t\tconst fromTargetId = activeData.fromTargetId\n\t\t\tconst fromIndex = activeData.fromIndex\n\n\t\t\tif (typeof fromTargetId !== \"string\" || typeof fromIndex !== \"number\") return\n\n\t\t\t// Remove from target\n\t\t\tconst newState = { ...currentState }\n\t\t\tconst oldSources = newState[fromTargetId]\n\t\t\tif (oldSources) {\n\t\t\t\tnewState[fromTargetId] = oldSources.filter((_, i) => i !== fromIndex)\n\t\t\t\tif (newState[fromTargetId].length === 0) {\n\t\t\t\t\tdelete newState[fromTargetId]\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tonAnswerSelect?.(toQtiResponse(newState))\n\t\t\treturn\n\t\t}\n\n\t\t// Must be dropping on a target for remaining cases\n\t\tif (overData?.type !== \"target\") return\n\t\tconst toTargetId = overData.targetId\n\t\tif (typeof toTargetId !== \"string\") return\n\n\t\tconst toTarget = interaction.targetChoices.find((t) => t.id === toTargetId)\n\t\tif (!toTarget) return\n\n\t\t// Case 2: Dragging from pool to target\n\t\tif (activeData?.type === \"source\") {\n\t\t\tconst sourceId = activeData.sourceId\n\t\t\tif (typeof sourceId !== \"string\") return\n\n\t\t\tconst source = interaction.sourceChoices.find((s) => s.id === sourceId)\n\t\t\tif (!source) return\n\n\t\t\t// Check if we can add\n\t\t\tif (getRemainingUses(source) <= 0) return\n\t\t\tif (!canTargetAcceptMore(toTarget)) return\n\n\t\t\t// Add to state\n\t\t\tconst newState = { ...currentState }\n\t\t\tif (!newState[toTargetId]) {\n\t\t\t\tnewState[toTargetId] = []\n\t\t\t}\n\t\t\tnewState[toTargetId] = [...newState[toTargetId], sourceId]\n\n\t\t\tonAnswerSelect?.(toQtiResponse(newState))\n\t\t\treturn\n\t\t}\n\n\t\t// Case 3: Dragging from one target to another\n\t\tif (activeData?.type === \"placed\") {\n\t\t\tconst sourceId = activeData.sourceId\n\t\t\tconst fromTargetId = activeData.fromTargetId\n\t\t\tconst fromIndex = activeData.fromIndex\n\n\t\t\tif (typeof sourceId !== \"string\" || typeof fromTargetId !== \"string\" || typeof fromIndex !== \"number\") return\n\n\t\t\t// If dropping on the same target, do nothing\n\t\t\tif (fromTargetId === toTargetId) return\n\n\t\t\t// Check if the destination can accept more\n\t\t\tif (!canTargetAcceptMore(toTarget)) return\n\n\t\t\t// Remove from old target\n\t\t\tconst newState = { ...currentState }\n\t\t\tconst oldSources = newState[fromTargetId]\n\t\t\tif (oldSources) {\n\t\t\t\tnewState[fromTargetId] = oldSources.filter((_, i) => i !== fromIndex)\n\t\t\t\tif (newState[fromTargetId].length === 0) {\n\t\t\t\t\tdelete newState[fromTargetId]\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Add to new target\n\t\t\tif (!newState[toTargetId]) {\n\t\t\t\tnewState[toTargetId] = []\n\t\t\t}\n\t\t\tnewState[toTargetId] = [...newState[toTargetId], sourceId]\n\n\t\t\tonAnswerSelect?.(toQtiResponse(newState))\n\t\t}\n\t}\n\n\t// Handle removing a source from a target\n\tconst handleRemoveSource = (targetId: string, index: number) => {\n\t\tif (disabled || hasSubmitted) return\n\n\t\tconst newState = { ...currentState }\n\t\tconst sources = newState[targetId]\n\t\tif (sources) {\n\t\t\tnewState[targetId] = sources.filter((_, i) => i !== index)\n\t\t\tif (newState[targetId].length === 0) {\n\t\t\t\tdelete newState[targetId]\n\t\t\t}\n\t\t}\n\n\t\tonAnswerSelect?.(toQtiResponse(newState))\n\t}\n\n\t// Build placed sources for each target with instance IDs\n\tconst getPlacedSources = (targetId: string) => {\n\t\tconst sourceIds = currentState[targetId] ?? []\n\t\treturn sourceIds.map((sourceId, index) => {\n\t\t\tconst source = interaction.sourceChoices.find((s) => s.id === sourceId)\n\t\t\treturn {\n\t\t\t\tinstanceId: `${sourceId}-${targetId}-${index}`,\n\t\t\t\tsource: source ?? { id: sourceId, contentHtml: sourceId, matchMax: 1 },\n\t\t\t\tindex\n\t\t\t}\n\t\t})\n\t}\n\n\treturn (\n\t\t<DndContext\n\t\t\tsensors={sensors}\n\t\t\tcollisionDetection={closestCenter}\n\t\t\tonDragStart={(e) => {\n\t\t\t\tsetActiveDragId(String(e.active.id))\n\t\t\t}}\n\t\t\tonDragEnd={handleDragEnd}\n\t\t>\n\t\t\t<div className=\"space-y-6\">\n\t\t\t\t{/* Prompt */}\n\t\t\t\t{interaction.promptHtml && (\n\t\t\t\t\t<div className=\"text-center mb-4\">\n\t\t\t\t\t\t<SafeInlineHTML html={interaction.promptHtml} />\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\n\t\t\t\t{/* Source Pool (Bank) - Now on top, droppable to return tokens */}\n\t\t\t\t{!hasSubmitted && (\n\t\t\t\t\t<DroppablePool disabled={disabled}>\n\t\t\t\t\t\t{interaction.sourceChoices.map((source) => (\n\t\t\t\t\t\t\t<SourcePoolToken\n\t\t\t\t\t\t\t\tkey={source.id}\n\t\t\t\t\t\t\t\tsource={source}\n\t\t\t\t\t\t\t\tremainingUses={getRemainingUses(source)}\n\t\t\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t))}\n\t\t\t\t\t\t{interaction.sourceChoices.every((s) => getRemainingUses(s) <= 0) && (\n\t\t\t\t\t\t\t<div className=\"text-sm text-muted-foreground\">All items placed</div>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</DroppablePool>\n\t\t\t\t)}\n\n\t\t\t\t{/* Target Boxes (Drop zones) - Now below */}\n\t\t\t\t<div className=\"flex flex-wrap justify-center gap-4\">\n\t\t\t\t\t{interaction.targetChoices.map((target) => (\n\t\t\t\t\t\t<TargetBox\n\t\t\t\t\t\t\tkey={target.id}\n\t\t\t\t\t\t\ttarget={target}\n\t\t\t\t\t\t\tplacedSources={getPlacedSources(target.id)}\n\t\t\t\t\t\t\tdisabled={disabled || hasSubmitted}\n\t\t\t\t\t\t\tonRemoveSource={(instanceId) => {\n\t\t\t\t\t\t\t\tconst index = getPlacedSources(target.id).findIndex((p) => p.instanceId === instanceId)\n\t\t\t\t\t\t\t\tif (index !== -1) {\n\t\t\t\t\t\t\t\t\thandleRemoveSource(target.id, index)\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\tpairCorrectness={pairCorrectness}\n\t\t\t\t\t\t\thasSubmitted={hasSubmitted}\n\t\t\t\t\t\t/>\n\t\t\t\t\t))}\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t{/* Drag Overlay */}\n\t\t\t<DragOverlay dropAnimation={null}>\n\t\t\t\t{activeSource ? (\n\t\t\t\t\t<div className={cn(sourceTokenVariants({ state: \"idle\" }), \"shadow-xl cursor-grabbing\")}>\n\t\t\t\t\t\t<SafeInlineHTML html={activeSource.contentHtml} />\n\t\t\t\t\t</div>\n\t\t\t\t) : null}\n\t\t\t</DragOverlay>\n\t\t</DndContext>\n\t)\n}\n\nexport default MatchInteraction\n","\"use client\"\n\nimport {\n\tclosestCenter,\n\tDndContext,\n\ttype DragEndEvent,\n\tDragOverlay,\n\ttype DragStartEvent,\n\ttype DropAnimation,\n\tdefaultDropAnimationSideEffects,\n\tKeyboardSensor,\n\tPointerSensor,\n\tuseSensor,\n\tuseSensors\n} from \"@dnd-kit/core\"\nimport {\n\tarrayMove,\n\thorizontalListSortingStrategy,\n\tSortableContext,\n\tsortableKeyboardCoordinates,\n\tuseSortable,\n\tverticalListSortingStrategy\n} from \"@dnd-kit/sortable\"\nimport { CSS } from \"@dnd-kit/utilities\"\nimport * as React from \"react\"\nimport { cn } from \"../../lib/utils\"\nimport type { DisplayChoice, DisplayOrderInteraction } from \"../../shared/types\"\nimport { HTMLContent } from \"../shared/html-content\"\n\n// --- Drag Handle Icon ---\nfunction DragHandleIcon({ className }: { className?: string }) {\n\treturn (\n\t\t<svg\n\t\t\twidth=\"12\"\n\t\t\theight=\"12\"\n\t\t\tviewBox=\"0 0 15 15\"\n\t\t\tfill=\"none\"\n\t\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\t\tclassName={className}\n\t\t\taria-hidden=\"true\"\n\t\t\trole=\"img\"\n\t\t>\n\t\t\t<title>Drag handle</title>\n\t\t\t<path\n\t\t\t\td=\"M5.5 3C5.5 3.27614 5.27614 3.5 5 3.5C4.72386 3.5 4.5 3.27614 4.5 3C4.5 2.72386 4.72386 2.5 5 2.5C5.27614 2.5 5.5 2.72386 5.5 3ZM5.5 7.5C5.5 7.77614 5.27614 8 5 8C4.72386 8 4.5 7.77614 4.5 7.5C4.5 7.22386 4.72386 7 5 7C5.27614 7 5.5 7.22386 5.5 7.5ZM5.5 12C5.5 12.2761 5.27614 12.5 5 12.5C4.72386 12.5 4.5 12.2761 4.5 12C4.5 11.7239 4.72386 11.5 5 11.5C5.27614 11.5 5.5 11.7239 5.5 12ZM9.5 3C9.5 3.27614 9.27614 3.5 9 3.5C8.72386 3.5 8.5 3.27614 8.5 3C8.5 2.72386 8.72386 2.5 9 2.5C9.27614 2.5 9.5 2.72386 9.5 3ZM9.5 7.5C9.5 7.77614 9.27614 8 9 8C8.72386 8 8.5 7.77614 8.5 7.5C8.5 7.22386 8.72386 7 9 7C9.27614 7 9.5 7.22386 9.5 7.5ZM9.5 12C9.5 12.2761 9.27614 12.5 9 12.5C8.72386 12.5 8.5 12.2761 8.5 12C8.5 11.7239 8.72386 11.5 9 11.5C9.27614 11.5 9.5 11.7239 9.5 12Z\"\n\t\t\t\tfill=\"currentColor\"\n\t\t\t\tfillRule=\"evenodd\"\n\t\t\t\tclipRule=\"evenodd\"\n\t\t\t/>\n\t\t</svg>\n\t)\n}\n\n// --- Sortable Item ---\nfunction SortableItem({\n\tid,\n\tcontentHtml,\n\tdisabled,\n\tisHorizontal\n}: {\n\tid: string\n\tcontentHtml: string\n\tdisabled: boolean\n\tisHorizontal: boolean\n}) {\n\tconst { attributes, listeners, setNodeRef, transform, transition, isDragging } = useSortable({ id, disabled })\n\n\tconst style = {\n\t\ttransform: CSS.Transform.toString(transform),\n\t\ttransition,\n\t\topacity: isDragging ? 0.4 : 1,\n\t\tzIndex: isDragging ? 50 : (\"auto\" as const)\n\t}\n\n\treturn (\n\t\t<div\n\t\t\tref={setNodeRef}\n\t\t\tstyle={style}\n\t\t\t{...attributes}\n\t\t\t{...listeners}\n\t\t\tclassName={cn(\n\t\t\t\t\"bg-background border rounded-lg shadow-sm touch-none select-none\",\n\t\t\t\t// Styling differs based on orientation\n\t\t\t\tisHorizontal\n\t\t\t\t\t? \"px-4 py-2 min-w-[100px] flex items-center justify-center text-center\"\n\t\t\t\t\t: \"p-4 w-full flex items-center gap-3\",\n\t\t\t\tdisabled\n\t\t\t\t\t? \"cursor-default opacity-90 bg-muted/50\"\n\t\t\t\t\t: \"cursor-grab active:cursor-grabbing hover:border-macaw/50 hover:shadow-md\"\n\t\t\t)}\n\t\t>\n\t\t\t{!isHorizontal && (\n\t\t\t\t<div className=\"text-muted-foreground shrink-0\">\n\t\t\t\t\t<DragHandleIcon />\n\t\t\t\t</div>\n\t\t\t)}\n\t\t\t<HTMLContent html={contentHtml} />\n\t\t</div>\n\t)\n}\n\n// --- Drag Overlay Item ---\nfunction DragOverlayItem({ contentHtml, isHorizontal }: { contentHtml: string; isHorizontal: boolean }) {\n\treturn (\n\t\t<div\n\t\t\tclassName={cn(\n\t\t\t\t\"bg-background border-2 border-macaw rounded-lg shadow-xl cursor-grabbing z-50\",\n\t\t\t\tisHorizontal ? \"px-4 py-2 min-w-[100px] flex items-center justify-center\" : \"p-4 w-full flex items-center gap-3\"\n\t\t\t)}\n\t\t>\n\t\t\t{!isHorizontal && (\n\t\t\t\t<div className=\"text-macaw shrink-0\">\n\t\t\t\t\t<DragHandleIcon />\n\t\t\t\t</div>\n\t\t\t)}\n\t\t\t<HTMLContent html={contentHtml} />\n\t\t</div>\n\t)\n}\n\n// --- Main Component ---\nexport interface OrderInteractionProps {\n\tinteraction: DisplayOrderInteraction\n\tresponse?: string[]\n\tonAnswerSelect?: (value: string[]) => void\n\tdisabled?: boolean\n\thasSubmitted?: boolean\n\tisCorrect?: boolean\n}\n\nexport function OrderInteraction({\n\tinteraction,\n\tresponse,\n\tonAnswerSelect,\n\tdisabled,\n\thasSubmitted,\n\tisCorrect\n}: OrderInteractionProps) {\n\t// Use response if available (user state), otherwise fallback to initial shuffled order\n\tconst items = React.useMemo(() => {\n\t\tif (response && response.length > 0) {\n\t\t\t// Re-order the choices array based on the response ID list\n\t\t\tconst mapped: DisplayChoice[] = []\n\t\t\tfor (const id of response) {\n\t\t\t\tconst found = interaction.choices.find((c) => c.id === id)\n\t\t\t\tif (found) mapped.push(found)\n\t\t\t}\n\t\t\treturn mapped\n\t\t}\n\t\treturn interaction.choices\n\t}, [response, interaction.choices])\n\n\t// Local state for active drag item (for overlay)\n\tconst [activeId, setActiveId] = React.useState<string | null>(null)\n\tconst activeItem = React.useMemo(() => items.find((i) => i.id === activeId), [activeId, items])\n\n\tconst sensors = useSensors(\n\t\tuseSensor(PointerSensor),\n\t\tuseSensor(KeyboardSensor, {\n\t\t\tcoordinateGetter: sortableKeyboardCoordinates\n\t\t})\n\t)\n\n\tconst handleDragStart = (event: DragStartEvent) => {\n\t\tconst id = event.active.id\n\t\tsetActiveId(typeof id === \"string\" ? id : String(id))\n\t}\n\n\tconst handleDragEnd = (event: DragEndEvent) => {\n\t\tconst { active, over } = event\n\t\tsetActiveId(null)\n\n\t\tif (over && active.id !== over.id) {\n\t\t\tconst oldIndex = items.findIndex((item) => item.id === active.id)\n\t\t\tconst newIndex = items.findIndex((item) => item.id === over.id)\n\n\t\t\tconst newOrder = arrayMove(items, oldIndex, newIndex)\n\n\t\t\t// Notify parent\n\t\t\tonAnswerSelect?.(newOrder.map((item) => item.id))\n\t\t}\n\t}\n\n\tconst isHorizontal = interaction.orientation === \"horizontal\"\n\tconst strategy = isHorizontal ? horizontalListSortingStrategy : verticalListSortingStrategy\n\n\t// Smooth drop animation configuration\n\tconst dropAnimation: DropAnimation = {\n\t\tsideEffects: defaultDropAnimationSideEffects({\n\t\t\tstyles: { active: { opacity: \"0.4\" } }\n\t\t})\n\t}\n\n\t// Feedback container styles\n\tconst getContainerStyles = () => {\n\t\tif (!hasSubmitted) {\n\t\t\treturn \"bg-muted/30 border-transparent\"\n\t\t}\n\t\tif (isCorrect) {\n\t\t\treturn \"bg-owl/10 border-owl\"\n\t\t}\n\t\treturn \"bg-cardinal/10 border-cardinal\"\n\t}\n\n\treturn (\n\t\t<div className=\"space-y-4\">\n\t\t\t{interaction.promptHtml && <HTMLContent html={interaction.promptHtml} />}\n\n\t\t\t<DndContext\n\t\t\t\tsensors={sensors}\n\t\t\t\tcollisionDetection={closestCenter}\n\t\t\t\tonDragStart={handleDragStart}\n\t\t\t\tonDragEnd={handleDragEnd}\n\t\t\t>\n\t\t\t\t<SortableContext items={items.map((i) => i.id)} strategy={strategy} disabled={disabled || hasSubmitted}>\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\"rounded-xl p-4 transition-colors border-2\",\n\t\t\t\t\t\t\tisHorizontal ? \"flex flex-wrap gap-3\" : \"flex flex-col gap-2\",\n\t\t\t\t\t\t\tgetContainerStyles()\n\t\t\t\t\t\t)}\n\t\t\t\t\t>\n\t\t\t\t\t\t{items.map((item) => (\n\t\t\t\t\t\t\t<SortableItem\n\t\t\t\t\t\t\t\tkey={item.id}\n\t\t\t\t\t\t\t\tid={item.id}\n\t\t\t\t\t\t\t\tcontentHtml={item.contentHtml}\n\t\t\t\t\t\t\t\tdisabled={!!(disabled || hasSubmitted)}\n\t\t\t\t\t\t\t\tisHorizontal={isHorizontal}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</div>\n\t\t\t\t</SortableContext>\n\n\t\t\t\t{/* Portal Overlay for smooth visual while dragging */}\n\t\t\t\t<DragOverlay dropAnimation={dropAnimation}>\n\t\t\t\t\t{activeItem ? <DragOverlayItem contentHtml={activeItem.contentHtml} isHorizontal={isHorizontal} /> : null}\n\t\t\t\t</DragOverlay>\n\t\t\t</DndContext>\n\t\t</div>\n\t)\n}\n\nexport default OrderInteraction\n","\"use client\"\n\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport { cn } from \"../../lib/utils\"\nimport type { DisplayTextEmbed, DisplayTextInteraction } from \"../../shared/types\"\n\n// ============================================================================\n// Palette Variants (mirrors SelectTrigger pattern)\n// ============================================================================\n\nconst textEntryVariants = cva(\n\t[\n\t\t// Base styles matching Select trigger\n\t\t\"inline-flex items-center justify-center\",\n\t\t\"h-7 px-2 rounded-xs text-sm font-semibold\",\n\t\t\"bg-[var(--text-entry-background)] text-[var(--text-entry-foreground)]\",\n\t\t\"border border-[var(--text-entry-complement)]\", // border = 1px width, border-[...] = color\n\t\t\"shadow-[0_3px_0_var(--text-entry-complement)]\",\n\t\t\"transition-all duration-150\",\n\t\t\"hover:brightness-90 dark:hover:brightness-75\",\n\t\t// Placeholder and focus (no ring - matches Select component)\n\t\t\"placeholder:text-muted-foreground/60\",\n\t\t\"focus:outline-none\",\n\t\t// Disabled state\n\t\t\"disabled:cursor-not-allowed disabled:opacity-50\",\n\t\t// Invalid state\n\t\t\"aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive\"\n\t],\n\t{\n\t\tvariants: {\n\t\t\tpalette: {\n\t\t\t\tdefault: [\n\t\t\t\t\t\"[--text-entry-background:var(--color-background)]\",\n\t\t\t\t\t\"[--text-entry-foreground:var(--color-foreground)]\",\n\t\t\t\t\t\"[--text-entry-complement:var(--color-accent)]\"\n\t\t\t\t],\n\t\t\t\tbetta: [\n\t\t\t\t\t\"[--text-entry-background:var(--color-background)]\",\n\t\t\t\t\t\"[--text-entry-foreground:var(--color-betta)]\",\n\t\t\t\t\t\"[--text-entry-complement:var(--color-butterfly)]\"\n\t\t\t\t],\n\t\t\t\tcardinal: [\n\t\t\t\t\t\"[--text-entry-background:hsl(var(--cardinal)/0.15)]\",\n\t\t\t\t\t\"[--text-entry-foreground:var(--color-cardinal)]\",\n\t\t\t\t\t\"[--text-entry-complement:var(--color-fire-ant)]\"\n\t\t\t\t],\n\t\t\t\tbee: [\n\t\t\t\t\t\"[--text-entry-background:var(--color-background)]\",\n\t\t\t\t\t\"[--text-entry-foreground:var(--color-bee)]\",\n\t\t\t\t\t\"[--text-entry-complement:var(--color-lion)]\"\n\t\t\t\t],\n\t\t\t\towl: [\n\t\t\t\t\t\"[--text-entry-background:hsl(var(--owl)/0.15)]\",\n\t\t\t\t\t\"[--text-entry-foreground:var(--color-owl)]\",\n\t\t\t\t\t\"[--text-entry-complement:var(--color-tree-frog)]\"\n\t\t\t\t],\n\t\t\t\tmacaw: [\n\t\t\t\t\t\"[--text-entry-background:var(--color-background)]\",\n\t\t\t\t\t\"[--text-entry-foreground:var(--color-macaw)]\",\n\t\t\t\t\t\"[--text-entry-complement:var(--color-whale)]\"\n\t\t\t\t]\n\t\t\t}\n\t\t},\n\t\tdefaultVariants: {\n\t\t\tpalette: \"default\"\n\t\t}\n\t}\n)\n\nexport type TextEntryPalette = NonNullable<VariantProps<typeof textEntryVariants>[\"palette\"]>\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface TextEntryInteractionProps {\n\t/** Text interaction payload (block-level) */\n\tinteraction: DisplayTextInteraction\n\t/** Current user response */\n\tresponse?: string\n\t/** Callback when user types */\n\tonAnswerSelect?: (value: string) => void\n\t/** Whether to disable the interaction */\n\tdisabled?: boolean\n\t/** Whether submit occurred; used to lock inputs and show feedback */\n\thasSubmitted?: boolean\n\t/** Color palette for the input */\n\tpalette?: TextEntryPalette\n\t/** Overall correctness for the entered value (used to switch palette after submit) */\n\tisCorrect?: boolean\n}\n\nexport interface InlineTextEntryProps {\n\t/** Text entry embed payload (inline within rich stimulus) */\n\tembed: DisplayTextEmbed\n\t/** Current user response */\n\tresponse?: string\n\t/** Callback when user types */\n\tonAnswerSelect?: (value: string) => void\n\t/** Whether to disable the interaction */\n\tdisabled?: boolean\n\t/** Whether submit occurred */\n\thasSubmitted?: boolean\n\t/** Color palette for the input */\n\tpalette?: TextEntryPalette\n\t/** Overall correctness (used to switch palette after submit) */\n\tisCorrect?: boolean\n}\n\n// ============================================================================\n// Block-level Text Entry Renderer\n// ============================================================================\n\n/**\n * Renders a block-level text entry interaction.\n * Used when text entry is a standalone interaction block (rare).\n */\nexport function TextEntryInteraction({\n\tinteraction,\n\tresponse,\n\tonAnswerSelect,\n\tdisabled = false,\n\thasSubmitted,\n\tpalette = \"macaw\",\n\tisCorrect\n}: TextEntryInteractionProps) {\n\tconst value = response ?? \"\"\n\tconst hasValue = value.length > 0\n\n\t// Determine palette based on state:\n\t// - Empty → default (grey/neutral)\n\t// - Has value, not submitted → palette prop (macaw)\n\t// - Submitted correct → owl (green)\n\t// - Submitted incorrect → cardinal (red)\n\tconst getActivePalette = (): TextEntryPalette => {\n\t\tif (hasSubmitted && hasValue) {\n\t\t\treturn isCorrect ? \"owl\" : \"cardinal\"\n\t\t}\n\t\tif (hasValue) {\n\t\t\treturn palette\n\t\t}\n\t\treturn \"default\"\n\t}\n\tconst activePalette = getActivePalette()\n\n\t// Width based on expected length with sensible defaults\n\t// Add 4ch buffer to account for px-2 padding (approx 2ch) and borders\n\tconst charWidth = interaction.expectedLength ?? 10\n\tconst inputWidth = `${Math.max(charWidth, 3) + 4}ch`\n\n\treturn (\n\t\t<div className=\"my-4 inline-block\">\n\t\t\t<input\n\t\t\t\ttype=\"text\"\n\t\t\t\tvalue={value}\n\t\t\t\tonChange={(e) => onAnswerSelect?.(e.target.value)}\n\t\t\t\tdisabled={disabled || hasSubmitted}\n\t\t\t\tplaceholder={interaction.placeholder ?? \"...\"}\n\t\t\t\tpattern={interaction.patternMask}\n\t\t\t\tclassName={cn(textEntryVariants({ palette: activePalette }))}\n\t\t\t\tstyle={{ width: inputWidth, minWidth: \"8ch\" }}\n\t\t\t\taria-invalid={hasSubmitted && hasValue && isCorrect === false ? true : undefined}\n\t\t\t/>\n\t\t</div>\n\t)\n}\n\n// ============================================================================\n// Inline Text Entry Renderer\n// ============================================================================\n\n/**\n * Renders an inline text entry interaction (embedded within rich stimulus).\n * Matches the compact styling of InlineInteraction (Select) for consistency.\n */\nexport function InlineTextEntry({\n\tembed,\n\tresponse,\n\tonAnswerSelect,\n\tdisabled = false,\n\thasSubmitted,\n\tpalette = \"macaw\",\n\tisCorrect\n}: InlineTextEntryProps) {\n\tconst value = response ?? \"\"\n\tconst hasValue = value.length > 0\n\n\t// Determine palette based on state:\n\t// - Empty → default (grey/neutral)\n\t// - Has value, not submitted → palette prop (macaw)\n\t// - Submitted correct → owl (green)\n\t// - Submitted incorrect → cardinal (red)\n\tconst getActivePalette = (): TextEntryPalette => {\n\t\tif (hasSubmitted && hasValue) {\n\t\t\treturn isCorrect ? \"owl\" : \"cardinal\"\n\t\t}\n\t\tif (hasValue) {\n\t\t\treturn palette\n\t\t}\n\t\treturn \"default\"\n\t}\n\tconst activePalette = getActivePalette()\n\n\t// Width based on expected length - keep it tight for inline use\n\t// Add 3ch buffer to account for px-2 padding and visual balance\n\tconst charWidth = embed.expectedLength ?? 4\n\tconst inputWidth = `${Math.max(charWidth, 2) + 3}ch`\n\n\treturn (\n\t\t<input\n\t\t\ttype=\"text\"\n\t\t\tvalue={value}\n\t\t\tonChange={(e) => onAnswerSelect?.(e.target.value)}\n\t\t\tdisabled={disabled || hasSubmitted}\n\t\t\tplaceholder=\"...\"\n\t\t\tpattern={embed.patternMask}\n\t\t\tclassName={cn(textEntryVariants({ palette: activePalette }), \"align-baseline\")}\n\t\t\tstyle={{ width: inputWidth, minWidth: \"6ch\" }}\n\t\t\taria-invalid={hasSubmitted && hasValue && isCorrect === false ? true : undefined}\n\t\t/>\n\t)\n}\n\nexport default TextEntryInteraction\n","\"use client\"\n\nimport * as React from \"react\"\nimport { cn } from \"../lib/utils\"\nimport type { ChoiceInteraction } from \"../schema\"\nimport type {\n\tDisplayBlock,\n\tDisplayChoiceInteraction,\n\tDisplayGapMatchInteraction,\n\tDisplayItem,\n\tDisplayMatchInteraction,\n\tDisplayOrderInteraction\n} from \"../shared/types\"\nimport { FeedbackMessage } from \"./feedback-message\"\nimport { ChoiceInteractionRenderer } from \"./interactions/choice-interaction\"\nimport { GapMatchInteraction } from \"./interactions/gap-match-interaction\"\nimport { InlineInteraction } from \"./interactions/inline-interaction\"\nimport { MatchInteraction } from \"./interactions/match-interaction\"\nimport { OrderInteraction } from \"./interactions/order-interaction\"\nimport { InlineTextEntry, TextEntryInteraction } from \"./interactions/text-entry-interaction\"\nimport { HTMLContent } from \"./shared/html-content\"\n\n// ============================================================================\n// Order Interaction Block (with auto-initialization)\n// ============================================================================\n\n/**\n * Wrapper for OrderInteraction that initializes the response with the displayed\n * order on mount. This ensures that if the user submits without interacting,\n * the current visible order is submitted (not an empty response).\n */\nfunction OrderInteractionBlock({\n\tinteraction,\n\tresponses,\n\tonAnswerSelect,\n\tdisabled,\n\tshowFeedback,\n\tperResponseFeedback\n}: {\n\tinteraction: DisplayOrderInteraction\n\tresponses?: Record<string, string | string[]>\n\tonAnswerSelect?: (responseIdentifier: string, value: string | string[]) => void\n\tdisabled?: boolean\n\tshowFeedback?: boolean\n\tperResponseFeedback?: Record<string, { isCorrect: boolean; messageHtml?: string }>\n}) {\n\tconst response = responses?.[interaction.responseId]\n\tconst hasInitialized = React.useRef(false)\n\n\t// Initialize response with displayed order on mount (if not already set)\n\tReact.useEffect(() => {\n\t\t// Only initialize once, and only if there's no existing response\n\t\tif (hasInitialized.current) return\n\t\tif (response) return\n\t\tif (interaction.choices.length === 0) return\n\t\tif (!onAnswerSelect) return\n\n\t\thasInitialized.current = true\n\t\tconst initialOrder = interaction.choices.map((c) => c.id)\n\t\tonAnswerSelect(interaction.responseId, initialOrder)\n\t}, [response, interaction.choices, interaction.responseId, onAnswerSelect])\n\n\t// Safe casting for array response\n\tlet responseArray: string[] = []\n\tif (Array.isArray(response)) {\n\t\tresponseArray = response\n\t} else if (typeof response === \"string\") {\n\t\tresponseArray = [response]\n\t}\n\n\tconst feedback = perResponseFeedback?.[interaction.responseId]\n\n\treturn (\n\t\t<>\n\t\t\t<OrderInteraction\n\t\t\t\tinteraction={interaction}\n\t\t\t\tresponse={responseArray}\n\t\t\t\tonAnswerSelect={(val) => onAnswerSelect?.(interaction.responseId, val)}\n\t\t\t\tdisabled={disabled}\n\t\t\t\thasSubmitted={showFeedback}\n\t\t\t\tisCorrect={feedback?.isCorrect}\n\t\t\t/>\n\t\t\t<FeedbackMessage\n\t\t\t\tresponseId={interaction.responseId}\n\t\t\t\tshowFeedback={showFeedback}\n\t\t\t\tperResponseFeedback={perResponseFeedback}\n\t\t\t/>\n\t\t</>\n\t)\n}\n\n// ============================================================================\n// Gap Match Interaction Block\n// ============================================================================\n\n/**\n * Wrapper for GapMatchInteraction that computes per-gap correctness\n * and handles the directedPair response format.\n */\nfunction GapMatchInteractionBlock({\n\tinteraction,\n\tresponses,\n\tonAnswerSelect,\n\tdisabled,\n\tshowFeedback,\n\tperResponseFeedback,\n\tselectedChoicesByResponse\n}: {\n\tinteraction: DisplayGapMatchInteraction\n\tresponses?: Record<string, string | string[]>\n\tonAnswerSelect?: (responseIdentifier: string, value: string | string[]) => void\n\tdisabled?: boolean\n\tshowFeedback?: boolean\n\tperResponseFeedback?: Record<string, { isCorrect: boolean; messageHtml?: string }>\n\tselectedChoicesByResponse?: Record<string, Array<{ id: string; isCorrect: boolean }>>\n}) {\n\tconst response = responses?.[interaction.responseId]\n\n\t// Ensure response is array\n\tlet responseArray: string[] = []\n\tif (Array.isArray(response)) {\n\t\tresponseArray = response\n\t} else if (typeof response === \"string\" && response) {\n\t\tresponseArray = [response]\n\t}\n\n\t// Compute per-gap correctness from selectedChoicesByResponse\n\t// Each entry in selectedChoicesByResponse has id = \"sourceId gapId\" format\n\tconst gapCorrectness = React.useMemo(() => {\n\t\tconst entries = selectedChoicesByResponse?.[interaction.responseId]\n\t\tif (!entries || !showFeedback) return undefined\n\n\t\tconst result: Record<string, boolean> = {}\n\t\tfor (const entry of entries) {\n\t\t\t// Parse \"sourceId gapId\" to extract gapId\n\t\t\tconst parts = entry.id.split(\" \")\n\t\t\tconst gapId = parts[1]\n\t\t\tif (gapId) {\n\t\t\t\tresult[gapId] = entry.isCorrect\n\t\t\t}\n\t\t}\n\t\treturn result\n\t}, [selectedChoicesByResponse, interaction.responseId, showFeedback])\n\n\treturn (\n\t\t<>\n\t\t\t<GapMatchInteraction\n\t\t\t\tinteraction={interaction}\n\t\t\t\tresponse={responseArray}\n\t\t\t\tonAnswerSelect={(val) => onAnswerSelect?.(interaction.responseId, val)}\n\t\t\t\tdisabled={disabled}\n\t\t\t\thasSubmitted={showFeedback}\n\t\t\t\tgapCorrectness={gapCorrectness}\n\t\t\t/>\n\t\t\t<FeedbackMessage\n\t\t\t\tresponseId={interaction.responseId}\n\t\t\t\tshowFeedback={showFeedback}\n\t\t\t\tperResponseFeedback={perResponseFeedback}\n\t\t\t/>\n\t\t</>\n\t)\n}\n\n// ============================================================================\n// Match Interaction Block\n// ============================================================================\n\n/**\n * Wrapper for MatchInteraction that computes per-pair correctness\n * and handles the directedPair response format.\n */\nfunction MatchInteractionBlock({\n\tinteraction,\n\tresponses,\n\tonAnswerSelect,\n\tdisabled,\n\tshowFeedback,\n\tperResponseFeedback,\n\tselectedChoicesByResponse\n}: {\n\tinteraction: DisplayMatchInteraction\n\tresponses?: Record<string, string | string[]>\n\tonAnswerSelect?: (responseIdentifier: string, value: string | string[]) => void\n\tdisabled?: boolean\n\tshowFeedback?: boolean\n\tperResponseFeedback?: Record<string, { isCorrect: boolean; messageHtml?: string }>\n\tselectedChoicesByResponse?: Record<string, Array<{ id: string; isCorrect: boolean }>>\n}) {\n\tconst response = responses?.[interaction.responseId]\n\n\t// Ensure response is array\n\tlet responseArray: string[] = []\n\tif (Array.isArray(response)) {\n\t\tresponseArray = response\n\t} else if (typeof response === \"string\" && response) {\n\t\tresponseArray = [response]\n\t}\n\n\t// Compute per-pair correctness from selectedChoicesByResponse\n\t// Each entry in selectedChoicesByResponse has id = \"sourceId targetId\" format\n\tconst pairCorrectness = React.useMemo(() => {\n\t\tconst entries = selectedChoicesByResponse?.[interaction.responseId]\n\t\tif (!entries || !showFeedback) return undefined\n\n\t\tconst result: Record<string, boolean> = {}\n\t\tfor (const entry of entries) {\n\t\t\t// The id is already \"sourceId targetId\" format\n\t\t\tresult[entry.id] = entry.isCorrect\n\t\t}\n\t\treturn result\n\t}, [selectedChoicesByResponse, interaction.responseId, showFeedback])\n\n\treturn (\n\t\t<>\n\t\t\t<MatchInteraction\n\t\t\t\tinteraction={interaction}\n\t\t\t\tresponse={responseArray}\n\t\t\t\tonAnswerSelect={(val) => onAnswerSelect?.(interaction.responseId, val)}\n\t\t\t\tdisabled={disabled}\n\t\t\t\thasSubmitted={showFeedback}\n\t\t\t\tpairCorrectness={pairCorrectness}\n\t\t\t/>\n\t\t\t<FeedbackMessage\n\t\t\t\tresponseId={interaction.responseId}\n\t\t\t\tshowFeedback={showFeedback}\n\t\t\t\tperResponseFeedback={perResponseFeedback}\n\t\t\t/>\n\t\t</>\n\t)\n}\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/** Theme options for the QTI renderer */\nexport type QTITheme = \"duolingo\" | \"neobrutalist\" | (string & {})\n\n/** Feedback result for a single response */\nexport interface ResponseFeedback {\n\tisCorrect: boolean\n\tmessageHtml?: string\n}\n\n/** Correctness info for selected choices */\nexport interface ChoiceCorrectness {\n\tid: string\n\tisCorrect: boolean\n}\n\n/**\n * Props for the QTIRenderer component.\n *\n * This is a **controlled, display-only component**. It renders the question\n * and captures user input, but does NOT include submit buttons or flow logic.\n * The consuming app is responsible for:\n * - Providing responses state\n * - Handling submission\n * - Providing feedback after validation\n * - Rendering buttons (Check, Try Again, Continue, etc.)\n */\nexport interface QTIRendererProps {\n\t/**\n\t * The display-safe item to render.\n\t * Use `buildDisplayModel()` to create this from a parsed AssessmentItem.\n\t */\n\titem: DisplayItem\n\n\t/**\n\t * Current user responses, keyed by response identifier.\n\t * This is a controlled component - you must manage this state.\n\t * @example { \"RESPONSE\": \"A\" } or { \"RESPONSE\": [\"A\", \"C\"] }\n\t */\n\tresponses: Record<string, string | string[]>\n\n\t/**\n\t * Callback fired when user selects/changes an answer.\n\t * Update your responses state in this callback.\n\t */\n\tonResponseChange: (responseId: string, value: string | string[]) => void\n\n\t/**\n\t * Theme to apply. Defaults to \"duolingo\".\n\t * Available themes: \"duolingo\", \"neobrutalist\", or any custom theme\n\t * defined via `[data-qti-theme=\"your-theme\"]` CSS.\n\t */\n\ttheme?: QTITheme\n\n\t/**\n\t * Whether to show feedback states (correct/incorrect styling).\n\t * Set to true after validation to display results.\n\t */\n\tshowFeedback?: boolean\n\n\t/**\n\t * Whether to disable all interactions.\n\t * Typically set to true when showFeedback is true.\n\t */\n\tdisabled?: boolean\n\n\t/**\n\t * Per-choice correctness for highlighting selected answers.\n\t * Keyed by response identifier.\n\t */\n\tchoiceCorrectness?: Record<string, ChoiceCorrectness[]>\n\n\t/**\n\t * Per-response feedback messages to display.\n\t * Keyed by response identifier.\n\t */\n\tresponseFeedback?: Record<string, ResponseFeedback>\n\n\t/**\n\t * Overall feedback to display at the end of the question.\n\t */\n\toverallFeedback?: ResponseFeedback\n\n\t/**\n\t * Additional CSS class for the container.\n\t */\n\tclassName?: string\n}\n\nexport interface ContentBlockRendererProps {\n\t/** The content block to render */\n\tblock: DisplayBlock\n\t/** Current user responses */\n\tresponses?: Record<string, string | string[]>\n\t/** Callback when user selects an answer */\n\tonAnswerSelect?: (responseIdentifier: string, value: string | string[]) => void\n\t/** Whether to show feedback */\n\tshowFeedback?: boolean\n\t/** Whether to disable interactions */\n\tdisabled?: boolean\n\t/** Selected-only correctness mapping for this render pass */\n\tselectedChoicesByResponse?: Record<string, Array<{ id: string; isCorrect: boolean }>>\n\t/** Optional per-response feedback messages from server */\n\tperResponseFeedback?: Record<string, { isCorrect: boolean; messageHtml?: string }>\n}\n\n// ============================================================================\n// Content Block Renderer\n// ============================================================================\n\n/**\n * Renders a single content block (stimulus or interaction)\n */\nexport function ContentBlockRenderer({\n\tblock,\n\tresponses,\n\tonAnswerSelect,\n\tshowFeedback,\n\tdisabled,\n\tselectedChoicesByResponse,\n\tperResponseFeedback\n}: ContentBlockRendererProps) {\n\tif (block.type === \"stimulus\") {\n\t\treturn <HTMLContent html={block.html} className=\"mb-6\" />\n\t}\n\tif (block.type === \"richStimulus\") {\n\t\t// Collect all response IDs for feedback (inline choice + text entry)\n\t\tconst allResponseIds = [\n\t\t\t...Object.values(block.inlineEmbeds).map((e) => e.responseId),\n\t\t\t...Object.values(block.textEmbeds).map((e) => e.responseId)\n\t\t]\n\n\t\treturn (\n\t\t\t<>\n\t\t\t\t<HTMLContent\n\t\t\t\t\thtml={block.html}\n\t\t\t\t\tclassName=\"mb-6\"\n\t\t\t\t\tinlineEmbeds={block.inlineEmbeds}\n\t\t\t\t\ttextEmbeds={block.textEmbeds}\n\t\t\t\t\trenderInline={(embed) => {\n\t\t\t\t\t\tconst currentValue = (() => {\n\t\t\t\t\t\t\tconst v = responses?.[embed.responseId]\n\t\t\t\t\t\t\treturn typeof v === \"string\" ? v : \"\"\n\t\t\t\t\t\t})()\n\t\t\t\t\t\t// Compute correctness of selected value if available\n\t\t\t\t\t\tconst perSelectionEntries = selectedChoicesByResponse?.[embed.responseId]\n\t\t\t\t\t\tconst selectedIsCorrect =\n\t\t\t\t\t\t\tperSelectionEntries && currentValue\n\t\t\t\t\t\t\t\t? perSelectionEntries.find((e) => e.id === currentValue)?.isCorrect\n\t\t\t\t\t\t\t\t: undefined\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t<InlineInteraction\n\t\t\t\t\t\t\t\tembed={embed}\n\t\t\t\t\t\t\t\tresponse={currentValue}\n\t\t\t\t\t\t\t\tonAnswerSelect={(v) => {\n\t\t\t\t\t\t\t\t\tif (onAnswerSelect) onAnswerSelect(embed.responseId, v)\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\tdisabled={disabled || showFeedback}\n\t\t\t\t\t\t\t\thasSubmitted={showFeedback}\n\t\t\t\t\t\t\t\tisCorrect={selectedIsCorrect}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t)\n\t\t\t\t\t}}\n\t\t\t\t\trenderTextEntry={(embed) => {\n\t\t\t\t\t\tconst currentValue = (() => {\n\t\t\t\t\t\t\tconst v = responses?.[embed.responseId]\n\t\t\t\t\t\t\treturn typeof v === \"string\" ? v : \"\"\n\t\t\t\t\t\t})()\n\t\t\t\t\t\t// Text entry correctness from perResponseFeedback\n\t\t\t\t\t\tconst feedback = perResponseFeedback?.[embed.responseId]\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t<InlineTextEntry\n\t\t\t\t\t\t\t\tkey={embed.responseId}\n\t\t\t\t\t\t\t\tembed={embed}\n\t\t\t\t\t\t\t\tresponse={currentValue}\n\t\t\t\t\t\t\t\tonAnswerSelect={(v) => {\n\t\t\t\t\t\t\t\t\tif (onAnswerSelect) onAnswerSelect(embed.responseId, v)\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\tdisabled={disabled || showFeedback}\n\t\t\t\t\t\t\t\thasSubmitted={showFeedback}\n\t\t\t\t\t\t\t\tisCorrect={feedback?.isCorrect}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t)\n\t\t\t\t\t}}\n\t\t\t\t/>\n\t\t\t\t{allResponseIds.map((responseId) => (\n\t\t\t\t\t<FeedbackMessage\n\t\t\t\t\t\tkey={`fb-${responseId}`}\n\t\t\t\t\t\tresponseId={responseId}\n\t\t\t\t\t\tshowFeedback={showFeedback}\n\t\t\t\t\t\tperResponseFeedback={perResponseFeedback}\n\t\t\t\t\t/>\n\t\t\t\t))}\n\t\t\t</>\n\t\t)\n\t}\n\n\tif (block.type === \"interaction\" && block.interaction) {\n\t\tconst interaction = block.interaction\n\n\t\t// Handle text entry interactions\n\t\tif (interaction.type === \"text\") {\n\t\t\tconst response = responses?.[interaction.responseId]\n\t\t\tconst currentValue = typeof response === \"string\" ? response : \"\"\n\t\t\tconst feedback = perResponseFeedback?.[interaction.responseId]\n\n\t\t\treturn (\n\t\t\t\t<>\n\t\t\t\t\t<TextEntryInteraction\n\t\t\t\t\t\tinteraction={interaction}\n\t\t\t\t\t\tresponse={currentValue}\n\t\t\t\t\t\tonAnswerSelect={(value) => {\n\t\t\t\t\t\t\tif (onAnswerSelect) {\n\t\t\t\t\t\t\t\tonAnswerSelect(interaction.responseId, value)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\thasSubmitted={showFeedback}\n\t\t\t\t\t\tisCorrect={feedback?.isCorrect}\n\t\t\t\t\t/>\n\t\t\t\t\t<FeedbackMessage\n\t\t\t\t\t\tresponseId={interaction.responseId}\n\t\t\t\t\t\tshowFeedback={showFeedback}\n\t\t\t\t\t\tperResponseFeedback={perResponseFeedback}\n\t\t\t\t\t/>\n\t\t\t\t</>\n\t\t\t)\n\t\t}\n\n\t\t// Handle choice interactions\n\t\tif (interaction.type === \"choice\") {\n\t\t\tconst response = responses?.[interaction.responseId]\n\n\t\t\t// Derive single-select correctness from selectedChoicesByResponse\n\t\t\tlet selected: string[] = []\n\t\t\tif (Array.isArray(response)) {\n\t\t\t\tselected = response\n\t\t\t} else if (typeof response === \"string\") {\n\t\t\t\tselected = [response]\n\t\t\t}\n\t\t\tconst perSelectionEntries = selectedChoicesByResponse?.[interaction.responseId]\n\t\t\tconst perSelectionTable = perSelectionEntries\n\t\t\t\t? new Map(perSelectionEntries.map((e) => [e.id, e.isCorrect]))\n\t\t\t\t: undefined\n\t\t\tlet singleIsCorrect: boolean | undefined\n\t\t\tif (interaction.cardinality === \"single\" && selected.length === 1 && perSelectionTable) {\n\t\t\t\tconst firstCandidate = selected[0]\n\t\t\t\tif (typeof firstCandidate === \"string\") {\n\t\t\t\t\tsingleIsCorrect = perSelectionTable.get(firstCandidate) === true\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst toChoiceInteraction = (d: DisplayChoiceInteraction): ChoiceInteraction => {\n\t\t\t\treturn {\n\t\t\t\t\ttype: \"choiceInteraction\",\n\t\t\t\t\tresponseIdentifier: d.responseId,\n\t\t\t\t\tshuffle: false,\n\t\t\t\t\tminChoices: d.minChoices,\n\t\t\t\t\tmaxChoices: d.maxChoices,\n\t\t\t\t\tpromptHtml: d.promptHtml,\n\t\t\t\t\tchoices: d.choices.map((c) => ({\n\t\t\t\t\t\tidentifier: c.id,\n\t\t\t\t\t\tcontentHtml: c.contentHtml,\n\t\t\t\t\t\tinlineFeedbackHtml: c.inlineFeedbackHtml\n\t\t\t\t\t}))\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn (\n\t\t\t\t<>\n\t\t\t\t\t<ChoiceInteractionRenderer\n\t\t\t\t\t\tinteraction={toChoiceInteraction(interaction)}\n\t\t\t\t\t\tresponse={response}\n\t\t\t\t\t\tonAnswerSelect={(value) => {\n\t\t\t\t\t\t\tif (onAnswerSelect) {\n\t\t\t\t\t\t\t\tonAnswerSelect(interaction.responseId, value)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\thasSubmitted={showFeedback}\n\t\t\t\t\t\tisCorrect={singleIsCorrect}\n\t\t\t\t\t\tselectedChoicesCorrectness={(() => {\n\t\t\t\t\t\t\tconst entries = selectedChoicesByResponse?.[interaction.responseId]\n\t\t\t\t\t\t\tif (!entries) return undefined\n\t\t\t\t\t\t\tconst table = new Map(entries.map((e) => [e.id, e.isCorrect]))\n\t\t\t\t\t\t\treturn selected.map((id) => ({ id, isCorrect: table.get(id) === true }))\n\t\t\t\t\t\t})()}\n\t\t\t\t\t/>\n\t\t\t\t\t<FeedbackMessage\n\t\t\t\t\t\tresponseId={interaction.responseId}\n\t\t\t\t\t\tshowFeedback={showFeedback}\n\t\t\t\t\t\tperResponseFeedback={perResponseFeedback}\n\t\t\t\t\t/>\n\t\t\t\t</>\n\t\t\t)\n\t\t}\n\n\t\t// Handle order interactions (drag-and-drop sorting)\n\t\tif (interaction.type === \"order\") {\n\t\t\treturn (\n\t\t\t\t<OrderInteractionBlock\n\t\t\t\t\tinteraction={interaction}\n\t\t\t\t\tresponses={responses}\n\t\t\t\t\tonAnswerSelect={onAnswerSelect}\n\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\tshowFeedback={showFeedback}\n\t\t\t\t\tperResponseFeedback={perResponseFeedback}\n\t\t\t\t/>\n\t\t\t)\n\t\t}\n\n\t\t// Handle gap match interactions (fill-in-the-blank with drag/click)\n\t\tif (interaction.type === \"gapMatch\") {\n\t\t\treturn (\n\t\t\t\t<GapMatchInteractionBlock\n\t\t\t\t\tinteraction={interaction}\n\t\t\t\t\tresponses={responses}\n\t\t\t\t\tonAnswerSelect={onAnswerSelect}\n\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\tshowFeedback={showFeedback}\n\t\t\t\t\tperResponseFeedback={perResponseFeedback}\n\t\t\t\t\tselectedChoicesByResponse={selectedChoicesByResponse}\n\t\t\t\t/>\n\t\t\t)\n\t\t}\n\n\t\t// Handle match interactions (matrix association)\n\t\tif (interaction.type === \"match\") {\n\t\t\treturn (\n\t\t\t\t<MatchInteractionBlock\n\t\t\t\t\tinteraction={interaction}\n\t\t\t\t\tresponses={responses}\n\t\t\t\t\tonAnswerSelect={onAnswerSelect}\n\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\tshowFeedback={showFeedback}\n\t\t\t\t\tperResponseFeedback={perResponseFeedback}\n\t\t\t\t\tselectedChoicesByResponse={selectedChoicesByResponse}\n\t\t\t\t/>\n\t\t\t)\n\t\t}\n\t}\n\n\t// Unknown block type\n\treturn null\n}\n\n// ============================================================================\n// Main QTI Renderer\n// ============================================================================\n\n/**\n * A controlled, display-only component for rendering QTI assessment items.\n *\n * **This component does NOT include buttons or submission logic.**\n * The consuming app is responsible for:\n * - Managing `responses` state\n * - Rendering Check/Submit/Try Again buttons\n * - Calling validation APIs\n * - Providing feedback data after validation\n *\n * @example\n * ```tsx\n * const [responses, setResponses] = useState({})\n * const [feedback, setFeedback] = useState(null)\n *\n * <QTIRenderer\n * item={displayItem}\n * responses={responses}\n * onResponseChange={(id, value) => setResponses(prev => ({ ...prev, [id]: value }))}\n * theme=\"neobrutalist\"\n * showFeedback={!!feedback}\n * responseFeedback={feedback?.perResponse}\n * overallFeedback={feedback?.overall}\n * disabled={!!feedback}\n * />\n *\n * <button onClick={handleCheck}>Check Answer</button>\n * ```\n */\nexport function QTIRenderer({\n\titem,\n\tresponses,\n\tonResponseChange,\n\ttheme = \"duolingo\",\n\tshowFeedback = false,\n\tdisabled = false,\n\tchoiceCorrectness,\n\tresponseFeedback,\n\toverallFeedback,\n\tclassName\n}: QTIRendererProps) {\n\t// Determine theme attribute value (empty string for default/duolingo)\n\tconst themeAttr = theme === \"duolingo\" ? undefined : theme\n\n\treturn (\n\t\t<div className={cn(\"qti-container\", className)} data-qti-theme={themeAttr}>\n\t\t\t<div className=\"space-y-6\">\n\t\t\t\t{item.contentBlocks.map((block, index) => (\n\t\t\t\t\t<ContentBlockRenderer\n\t\t\t\t\t\tkey={index}\n\t\t\t\t\t\tblock={block}\n\t\t\t\t\t\tresponses={responses}\n\t\t\t\t\t\tonAnswerSelect={onResponseChange}\n\t\t\t\t\t\tshowFeedback={showFeedback}\n\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\tselectedChoicesByResponse={choiceCorrectness}\n\t\t\t\t\t\tperResponseFeedback={responseFeedback}\n\t\t\t\t\t/>\n\t\t\t\t))}\n\t\t\t</div>\n\n\t\t\t{/* Overall feedback shown at the end */}\n\t\t\t{showFeedback && overallFeedback?.messageHtml && (\n\t\t\t\t<div className=\"qti-feedback mt-6 p-6\" data-correct={overallFeedback.isCorrect}>\n\t\t\t\t\t<HTMLContent html={overallFeedback.messageHtml} />\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</div>\n\t)\n}\n\nexport default QTIRenderer\n","\"use client\"\n\nimport * as React from \"react\"\nimport { cn } from \"../lib/utils\"\nimport type { AssessmentItem } from \"../schema\"\nimport type { EvaluationResult } from \"../types\"\nimport { HTMLContent } from \"./shared/html-content\"\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface QtiFeedbackBlockProps {\n\t/** The evaluation result containing feedback info */\n\tresult: EvaluationResult\n\t/** The assessment item containing feedback blocks */\n\titem: AssessmentItem\n\t/** Custom class name */\n\tclassName?: string\n}\n\n// ============================================================================\n// QTI Feedback Block Component\n// ============================================================================\n\n/**\n * Renders the appropriate feedback block based on evaluation results.\n *\n * This component handles:\n * - Finding the correct feedback block to display\n * - Styling based on correct/incorrect status\n * - Sanitizing and rendering the feedback HTML\n */\nexport function QtiFeedbackBlock({ result, item, className }: QtiFeedbackBlockProps) {\n\t// Find the feedback block to show\n\tconst feedbackBlock = React.useMemo(() => {\n\t\tif (!result.feedbackIdentifier) {\n\t\t\treturn null\n\t\t}\n\n\t\treturn item.itemBody.feedbackBlocks.find((fb) => fb.identifier === result.feedbackIdentifier)\n\t}, [result.feedbackIdentifier, item.itemBody.feedbackBlocks])\n\n\t// If no feedback to show, return null\n\tif (!feedbackBlock) {\n\t\treturn null\n\t}\n\n\tconst isCorrect = result.status === \"correct\"\n\n\treturn (\n\t\t<div className={cn(\"qti-feedback p-6\", className)} data-correct={isCorrect}>\n\t\t\t{/* Feedback header */}\n\t\t\t<div className=\"flex items-center gap-3 mb-4\">\n\t\t\t\t<div\n\t\t\t\t\tclassName=\"qti-feedback-icon flex-shrink-0 w-12 h-12 rounded-full flex items-center justify-center\"\n\t\t\t\t\tdata-correct={isCorrect}\n\t\t\t\t>\n\t\t\t\t\t{isCorrect ? (\n\t\t\t\t\t\t<svg className=\"w-8 h-8 text-white\" fill=\"currentColor\" viewBox=\"0 0 24 24\">\n\t\t\t\t\t\t\t<title>Correct</title>\n\t\t\t\t\t\t\t<path d=\"M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41L9 16.17z\" />\n\t\t\t\t\t\t</svg>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<svg className=\"w-8 h-8 text-white\" fill=\"currentColor\" viewBox=\"0 0 24 24\">\n\t\t\t\t\t\t\t<title>Incorrect</title>\n\t\t\t\t\t\t\t<path d=\"M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41z\" />\n\t\t\t\t\t\t</svg>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t\t<div className=\"flex-1\">\n\t\t\t\t\t<h3\n\t\t\t\t\t\tclassName=\"text-xl font-extrabold\"\n\t\t\t\t\t\tstyle={{ color: isCorrect ? \"var(--qti-feedback-correct-text)\" : \"var(--qti-feedback-incorrect-text)\" }}\n\t\t\t\t\t>\n\t\t\t\t\t\t{isCorrect ? \"Correct!\" : \"Incorrect\"}\n\t\t\t\t\t</h3>\n\t\t\t\t\t<p className=\"text-sm text-muted-foreground\">{isCorrect ? \"Nice work!\" : \"Try again\"}</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t{/* Feedback content */}\n\t\t\t<HTMLContent html={feedbackBlock.contentHtml} className=\"text-foreground\" />\n\t\t</div>\n\t)\n}\n\nexport default QtiFeedbackBlock\n"]}