@otmc/ui 0.1.5 → 0.1.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/editor/MarkdownEditor.tsx","../src/editor/hooks/useEditor.ts","../src/editor/hooks/markdownSerializer.ts","../src/editor/extensions/CodeBlockExtension.ts","../src/editor/blocks/CodeBlock.tsx","../src/editor/components/BlockWrapper.tsx","../src/editor/extensions/TaskItemExtension.ts","../src/editor/blocks/TaskBlock.tsx","../src/editor/extensions/NoticeExtension.ts","../src/editor/blocks/NoticeBlock.tsx","../src/editor/extensions/TimelineExtension.ts","../src/editor/blocks/TimelineBlock.tsx","../src/editor/extensions/DiagramExtension.ts","../src/editor/blocks/DiagramBlock.tsx","../src/editor/extensions/BackgroundColor.ts","../src/editor/extensions/ImageExtension.ts","../src/editor/blocks/ImageBlock.tsx","../src/editor/components/TableOfContentsExtension.ts","../src/editor/components/TableOfContents.tsx","../src/editor/components/ReadingIndicator.tsx","../src/editor/hooks/pasteHandler.ts","../src/modals/DocumentEditor.tsx","../src/editor/components/EditorContent.tsx","../src/editor/components/TableControls.tsx","../src/editor/components/BubbleMenu.tsx","../src/editor/components/SlashCommand.tsx","../src/editor/components/BlockRenderer.tsx","../src/editor/hooks/blockRegistry.tsx","../src/editor/extensions/createBlockNode.ts","../src/editor/utils/contentMigration.ts"],"sourcesContent":["/**\n * @License OTMC License\n * @Copyright (c) 2026 OTMC Softwares. All rights reserved.\n * @Contributors Trung Ng, OTMC Authors.\n**/\nimport { memo, useState, useCallback, useMemo, useEffect } from 'react'\nimport { useMantineColorScheme, useMantineTheme, Card } from '@mantine/core'\nimport { useEditorWithStorage } from './hooks/useEditor'\nimport TableOfContents from './components/TableOfContentsExtension'\nimport { TableOfContentsPanel, type HeadingNode } from './components/TableOfContents'\nimport { resolveColorScheme } from '../contexts/ThemeProvider'\nimport { handlePaste } from './hooks/pasteHandler'\nimport { EditorContent, BubbleMenu, createSlashCommand, getDefaultBlockItems } from './index'\n\ninterface EditorProps {\n initialContent?: string\n onChange?: (content: string) => void\n outputFormat?: 'html' | 'markdown' | 'json'\n showTableOfContents?: boolean\n showHeadingDividers?: boolean\n minHeight?: number\n editable?: boolean\n}\n\nconst MarkdownEditor = memo(function MarkdownEditor({\n initialContent = '<p></p>',\n onChange,\n outputFormat = 'json',\n showTableOfContents = true,\n showHeadingDividers = true,\n minHeight = 200,\n editable = true,\n}: EditorProps) {\n\n const [headings, setHeadings] = useState<HeadingNode[]>([])\n\n const handleHeadingsUpdate = useCallback((newHeadings: HeadingNode[]) => {\n setHeadings(newHeadings)\n }, [])\n\n\n const slashCommand = useMemo(() => {\n return createSlashCommand({\n char: '/',\n items: ({ editor, query }: any) => {\n const blocks = getDefaultBlockItems(editor)\n if (!query) return blocks\n return blocks.filter((item: any) =>\n item.title.toLowerCase().includes(query.toLowerCase()) ||\n item.description?.toLowerCase().includes(query.toLowerCase()) ||\n item.keywords?.some((k: string) => k.toLowerCase().includes(query.toLowerCase()))\n )\n },\n })\n }, [])\n\n const editor = useEditorWithStorage({\n initialContent,\n onContentChange: onChange,\n outputFormat,\n extensions: [\n ...(showHeadingDividers ? [] : []),\n ...(showTableOfContents ? [TableOfContents.configure({ onUpdate: handleHeadingsUpdate })] : []),\n slashCommand,\n ],\n editable,\n editorProps: {\n attributes: {\n spellCheck: 'false',\n style: 'outline:none;border:none;font-size: 15px;',\n },\n handleDOMEvents: {\n paste: (_view, event: ClipboardEvent) => {\n return handlePaste(editor, event)\n },\n },\n },\n })\n\n useEffect(() => {\n if (editor) {\n editor.setEditable(editable)\n }\n }, [editor, editable])\n\n const { colorScheme: rawColorScheme } = useMantineColorScheme()\n const theme = useMantineTheme()\n const colorScheme = resolveColorScheme(rawColorScheme)\n const bgColor = colorScheme === 'dark' ? theme.colors.dark[8] : theme.colors.gray[0]\n\n if (!editor) return null\n\n return (\n <Card shadow=\"sm\" padding=\"md\" radius=\"18px\" bg={bgColor} withBorder style={{ position: 'relative' }}>\n {showTableOfContents && <TableOfContentsPanel headings={headings} editor={editor} />}\n <EditorContent editor={editor} minHeight={minHeight} />\n <BubbleMenu editor={editor} />\n </Card>\n )\n})\n\nMarkdownEditor.displayName = 'MarkdownEditor'\nexport default MarkdownEditor\n","/**\n * @License OTMC License\n * @Copyright (c) 2026 OTMC Softwares. All rights reserved.\n * @Contributors Trung Ng, OTMC Authors.\n**/\nimport type { EditorOptions } from '@tiptap/react'\nimport { useEditor } from '@tiptap/react'\nimport { useEffect, useRef } from 'react'\nimport { serializeToMarkdown } from './markdownSerializer'\nimport StarterKit from '@tiptap/starter-kit'\nimport { CodeBlockExtension } from '../extensions/CodeBlockExtension'\nimport { TaskItemExtension } from '../extensions/TaskItemExtension'\nimport { NoticeExtension } from '../extensions/NoticeExtension'\nimport { TimelineExtension } from '../extensions/TimelineExtension'\nimport { DiagramExtension } from '../extensions/DiagramExtension'\nimport { Color } from '@tiptap/extension-color'\nimport { TextStyle } from '@tiptap/extension-text-style'\nimport { BackgroundColorMark } from '../extensions/BackgroundColor'\nimport TaskList from '@tiptap/extension-task-list'\nimport { Markdown } from 'tiptap-markdown'\nimport { Table, TableRow, TableHeader, TableCell } from '@tiptap/extension-table'\nimport { ImageExtension } from '../extensions/ImageExtension'\nimport BulletList from '@tiptap/extension-bullet-list'\nimport OrderedList from '@tiptap/extension-ordered-list'\nimport ListItem from '@tiptap/extension-list-item'\nimport { debug } from '../../utils/debug';\n\ninterface UseEditorWithStorageOptions extends Partial<EditorOptions> {\n initialContent?: string\n onContentChange?: (content: string) => void\n debounceDelay?: number\n outputFormat?: 'html' | 'markdown' | 'json'\n extensions?: any[]\n}\n\nexport const useEditorWithStorage = ({\n initialContent,\n onContentChange,\n debounceDelay = 500,\n outputFormat = 'html',\n extensions = [],\n ...editorOptions\n}: UseEditorWithStorageOptions) => {\n \n const debounceRef = useRef<ReturnType<typeof setTimeout> | null>(null)\n const initialContentRef = useRef(initialContent)\n const hasSetInitialContent = useRef(false)\n const isUpdatingRef = useRef(false)\n const lastEmittedContentRef = useRef<string>('')\n\n const getContent = (editor: any): string => {\n if (outputFormat === 'json') {\n return JSON.stringify(editor.getJSON())\n }\n const content = outputFormat === 'markdown'\n ? serializeToMarkdown(editor)\n : editor.getHTML()\n return content\n }\n\n const editor = useEditor({\n ...editorOptions,\n extensions: [\n StarterKit.configure({\n codeBlock: false,\n bulletList: false,\n orderedList: false,\n listItem: false,\n }),\n Color,\n TextStyle,\n BackgroundColorMark,\n CodeBlockExtension,\n BulletList.configure({\n itemTypeName: 'listItem',\n }),\n OrderedList.configure({\n itemTypeName: 'listItem',\n }),\n ListItem,\n TaskList.configure({\n itemTypeName: 'taskItem',\n }),\n TaskItemExtension.configure({\n nested: true,\n }),\n NoticeExtension,\n TimelineExtension,\n DiagramExtension,\n Markdown,\n Table.configure({\n resizable: true,\n }),\n TableRow,\n TableHeader,\n TableCell,\n ImageExtension,\n ...extensions,\n ],\n content: (() => {\n if (initialContent) {\n try {\n const parsed = JSON.parse(initialContent);\n if (parsed.type === 'doc') {\n return parsed;\n }\n } catch {\n }\n }\n return initialContent;\n })(),\n onCreate: ({ editor }) => {\n if (outputFormat === 'json') {\n lastEmittedContentRef.current = JSON.stringify(editor.getJSON())\n } else if (outputFormat === 'markdown') {\n lastEmittedContentRef.current = serializeToMarkdown(editor)\n } else {\n lastEmittedContentRef.current = editor.getHTML()\n }\n },\n onUpdate: ({ editor }) => {\n if (!onContentChange || isUpdatingRef.current || !hasSetInitialContent.current) return\n\n if (debounceRef.current) {\n clearTimeout(debounceRef.current)\n }\n\n debounceRef.current = setTimeout(() => {\n const newContent = getContent(editor)\n\n if (newContent === lastEmittedContentRef.current) {\n debug.log('[useEditorWithStorage] Content unchanged, skipping')\n return\n }\n\n lastEmittedContentRef.current = newContent\n onContentChange(newContent)\n }, debounceDelay)\n },\n })\n\n useEffect(() => {\n if (!editor) return\n if (hasSetInitialContent.current) return\n hasSetInitialContent.current = true\n lastEmittedContentRef.current = initialContent || ''\n }, [editor])\n\n useEffect(() => {\n if (!editor || !initialContent) return\n if (hasSetInitialContent.current) return\n\n const currentContent = outputFormat === 'markdown'\n ? serializeToMarkdown(editor)\n : editor.getHTML()\n\n if (currentContent.trim() !== initialContent.trim()) {\n try {\n const jsonContent = JSON.parse(initialContent)\n editor.commands.setContent(jsonContent)\n } catch {\n editor.commands.setContent(initialContent)\n }\n hasSetInitialContent.current = true\n lastEmittedContentRef.current = initialContent\n }\n }, [editor])\n\n useEffect(() => {\n if (!editor || !initialContent) return\n if (initialContent === lastEmittedContentRef.current) return\n\n if (debounceRef.current) {\n clearTimeout(debounceRef.current)\n debounceRef.current = null\n }\n\n isUpdatingRef.current = true\n try {\n const jsonContent = JSON.parse(initialContent)\n editor.commands.setContent(jsonContent)\n } catch {\n editor.commands.setContent(initialContent)\n }\n isUpdatingRef.current = false\n initialContentRef.current = initialContent\n lastEmittedContentRef.current = initialContent\n }, [initialContent, editor])\n\n useEffect(() => {\n return () => {\n if (debounceRef.current) {\n clearTimeout(debounceRef.current)\n }\n }\n }, [])\n\n return editor\n}\n","/**\n * @License OTMC License\n * @Copyright (c) 2026 OTMC Softwares. All rights reserved.\n * @Contributors Trung Ng, OTMC Authors.\n**/\nimport { Editor } from '@tiptap/react';\n\nexport const serializeNode = (node: any, useHtmlForMarks: boolean = false): string => {\n if (!node) return '';\n\n if (node.isText) {\n let text = node.text || '';\n const marks = node.marks || [];\n\n const bold = marks.some((m: any) => m.type.name === 'bold');\n const italic = marks.some((m: any) => m.type.name === 'italic');\n const code = marks.some((m: any) => m.type.name === 'code');\n const link = marks.find((m: any) => m.type.name === 'link');\n const textStyle = marks.find((m: any) => m.type.name === 'textStyle');\n const color = textStyle?.attrs?.color;\n const bgColorMark = marks.find((m: any) => m.type.name === 'backgroundColor');\n const backgroundColor = bgColorMark?.attrs?.color;\n\n if (code) {\n text = `\\`${text}\\``;\n } else {\n if (useHtmlForMarks) {\n if (bold) text = `<strong>${text}</strong>`;\n if (italic) text = `<em>${text}</em>`;\n if (color) text = `<span style=\"color: ${color}\">${text}</span>`;\n if (backgroundColor) text = `<span data-bg-color=\"${backgroundColor}\">${text}</span>`;\n } else {\n if (bold) text = `**${text}**`;\n if (italic) text = `*${text}*`;\n }\n if (link) text = `[${text}](${link.attrs.href})`;\n if (!useHtmlForMarks && color) {\n text = `<span style=\"color: ${color}\">${text}</span>`;\n }\n if (!useHtmlForMarks && backgroundColor) {\n text = `<span data-bg-color=\"${backgroundColor}\">${text}</span>`;\n }\n }\n\n return text;\n }\n\n let content = '';\n if (node.content && node.content.content) {\n content = node.content.content.map((child: any) => serializeNode(child)).join('');\n }\n\n switch (node.type.name) {\n case 'text':\n return content;\n\n case 'paragraph': {\n const backgroundColor = node.attrs?.backgroundColor;\n if (backgroundColor) {\n const content = node.content.content.map((child: any) => serializeNode(child, true)).join('');\n return `<p style=\"background-color: ${backgroundColor}\">${content}</p>`;\n }\n return content;\n }\n\n case 'heading': {\n const level = node.attrs?.level || 1;\n const backgroundColor = node.attrs?.backgroundColor;\n if (backgroundColor) {\n const content = node.content.content.map((child: any) => serializeNode(child, true)).join('');\n return `<h${level} style=\"background-color: ${backgroundColor}\">${content.trim()}</h${level}>`;\n }\n const prefix = '#'.repeat(level);\n return `${prefix} ${content.trim()}`;\n }\n\n case 'bulletList': {\n const items: string[] = [];\n for (const item of node.content?.content || []) {\n const itemText = serializeNode(item).trim();\n items.push(`- ${itemText}`);\n }\n return items.join('\\n');\n }\n\n case 'orderedList': {\n const items: string[] = [];\n let index = node.attrs?.start || 1;\n for (const item of node.content?.content || []) {\n const itemText = serializeNode(item).trim();\n items.push(`${index}. ${itemText}`);\n index++;\n }\n return items.join('\\n');\n }\n\n case 'taskItem': {\n const checked = node.attrs?.checked ? '[x]' : '[ ]';\n const itemText = content.trim();\n return `- ${checked} ${itemText}`;\n }\n\n case 'taskList': {\n const items: string[] = [];\n for (const item of node.content?.content || []) {\n const itemText = serializeNode(item).trim();\n items.push(itemText);\n }\n return items.join('\\n');\n }\n\n case 'blockquote': {\n const lines = content.trim().split('\\n');\n return lines.map(line => `> ${line}`).join('\\n');\n }\n\n case 'codeBlock': {\n const language = node.attrs?.language || '';\n return `\\`\\`\\`${language}\\n${content}\\n\\`\\`\\``;\n }\n\n case 'horizontalRule':\n return '---';\n\n case 'hardBreak':\n return '\\n';\n\n case 'image':\n const src = node.attrs?.src || '';\n const alt = node.attrs?.alt || '';\n return `![${alt}](${src})`;\n\n case 'notice': {\n const variant = node.attrs?.variant || 'info';\n const title = node.attrs?.title || 'Notice';\n const backgroundColor = node.attrs?.backgroundColor;\n const contentText = node.content.content.map((child: any) => serializeNode(child, true)).join('').trim();\n\n let html = `<div data-type=\"notice\" data-variant=\"${variant}\" data-title=\"${title}\"`;\n if (backgroundColor) {\n html += ` style=\"background-color: ${backgroundColor}\"`;\n }\n html += `>${contentText}</div>`;\n return html;\n }\n\n case 'table': {\n const rows: string[] = [];\n let headerIndex = 0;\n for (const row of node.content?.content || []) {\n const cells: string[] = [];\n for (const cell of row.content?.content || []) {\n cells.push(serializeNode(cell).trim());\n }\n rows.push(`| ${cells.join(' | ')} |`);\n\n if (headerIndex === 0) {\n const separators = cells.map(() => '---');\n rows.push(`| ${separators.join(' | ')} |`);\n headerIndex++;\n }\n }\n return rows.join('\\n');\n }\n\n default:\n return content;\n }\n};\n\nexport const serializeToMarkdown = (editor: Editor): string => {\n if (!editor) return '';\n\n const nodes = editor.state.doc.content.content;\n const results: string[] = [];\n\n for (const node of nodes) {\n const serialized = serializeNode(node);\n if (serialized || node.type.name === 'paragraph') {\n results.push(serialized);\n }\n }\n\n return results.join('\\n\\n');\n};\n\nexport const serializeSelectionToMarkdown = (editor: Editor, from: number, to: number): string => {\n if (!editor) return '';\n\n const { doc } = editor.state;\n const $from = doc.resolve(from);\n\n for (let depth = $from.depth; depth > 0; depth--) {\n const node = $from.node(depth);\n if (['bulletList', 'orderedList', 'taskList'].includes(node.type.name)) {\n return serializeNode(node);\n }\n }\n\n const selectionNode = doc.slice(from, to);\n const results: string[] = [];\n\n selectionNode.content.content.forEach((node: any) => {\n const serialized = serializeNode(node);\n if (serialized || node.type.name === 'paragraph') {\n results.push(serialized);\n }\n });\n\n return results.join('\\n\\n');\n};\n","/**\n * @License OTMC License\n * @Copyright (c) 2026 OTMC Softwares. All rights reserved.\n * @Contributors Trung Ng, OTMC Authors.\n**/\nimport { CodeBlockLowlight } from '@tiptap/extension-code-block-lowlight'\nimport { ReactNodeViewRenderer } from '@tiptap/react'\nimport { createLowlight, common } from 'lowlight'\nimport { CodeBlock } from '../blocks/CodeBlock'\nimport { InputRule } from '@tiptap/core'\nimport { TextSelection } from '@tiptap/pm/state'\n\nconst lowlight = createLowlight(common)\n\nexport const CodeBlockExtension = CodeBlockLowlight.extend({\n addAttributes() {\n return {\n language: {\n default: '',\n parseHTML: el => el.getAttribute('data-language') || '',\n renderHTML: attrs =>\n attrs.language ? { 'data-language': attrs.language } : {},\n },\n }\n },\n\n addNodeView() {\n return ReactNodeViewRenderer(CodeBlock as any)\n },\n\n addKeyboardShortcuts() {\n return {\n Backspace: () => {\n const { state } = this.editor\n const { selection, schema } = state\n const { $from, empty } = selection\n\n if (!empty) return false\n\n const node = $from.node()\n if (node.type !== this.type) return false\n\n const isEmpty =\n !node.textContent || node.textContent === '\\u200B'\n\n if (!isEmpty) return false\n\n const pos = $from.before($from.depth)\n const tr = state.tr\n\n tr.deleteRange(pos, pos + node.nodeSize)\n\n const paragraph = schema.nodes.paragraph.create(\n null,\n schema.text('\\u200B')\n )\n\n tr.insert(pos, paragraph)\n tr.setSelection(TextSelection.create(tr.doc, pos + 1))\n\n this.editor.view.dispatch(tr)\n return true\n },\n }\n },\n\n addInputRules() {\n const type = this.type\n\n return [\n new InputRule({\n find: /^```([a-z]*)$/i,\n handler: ({ state, range, match }) => {\n const { tr } = state\n const $start = tr.doc.resolve(range.from)\n\n if (\n !$start\n .node(-1)\n .canReplaceWith($start.index(-1), $start.indexAfter(-1), type)\n ) return\n\n const lang = (match[1] || '').toLowerCase()\n\n tr.delete(range.from, range.to)\n\n const node = type.create(\n { language: lang },\n state.schema.text('\\u200B')\n )\n\n const pos = tr.mapping.map(range.from)\n\n tr.insert(pos, node)\n\n const $pos = tr.doc.resolve(pos + 1)\n tr.setSelection(TextSelection.near($pos))\n\n this.editor.view.dispatch(tr)\n },\n }),\n ]\n },\n}).configure({\n lowlight,\n HTMLAttributes: {\n class: 'code-block-custom',\n },\n})","/**\n * @License OTMC License\n * @Copyright (c) 2026 OTMC Softwares. All rights reserved.\n * @Contributors Trung Ng, OTMC Authors.\n**/\n\nimport { useState, memo, useMemo, useCallback } from 'react'\nimport { NodeViewContent, NodeViewWrapper, type ReactNodeViewProps } from '@tiptap/react'\nimport { ActionIcon, Box, Text, useMantineTheme, Select } from '@mantine/core'\nimport { IconCheck, IconCopy, IconCode, IconChevronDown } from '@tabler/icons-react'\nimport { BlockWrapper } from '../components/BlockWrapper'\nimport { copyToClipboard } from '../../utils/commonUtils'\nimport { useTheme } from '../../contexts/ThemeProvider'\n\nconst COMMON_LANGUAGES = [\n { value: '', label: 'Plain Text' },\n { value: 'bash', label: 'Bash' },\n { value: 'powershell', label: 'PowerShell' },\n { value: 'cpp', label: 'C++' },\n { value: 'c', label: 'C' },\n { value: 'go', label: 'Golang' },\n { value: 'python', label: 'Python' },\n { value: 'rust', label: 'Rust' },\n { value: 'csharp', label: 'C#' },\n { value: 'java', label: 'Java' },\n { value: 'javascript', label: 'JavaScript' },\n { value: 'typescript', label: 'TypeScript' },\n { value: 'php', label: 'PHP' },\n { value: 'ruby', label: 'Ruby' },\n { value: 'swift', label: 'Swift' },\n { value: 'kotlin', label: 'Kotlin' },\n { value: 'sql', label: 'SQL' },\n { value: 'html', label: 'HTML' },\n { value: 'css', label: 'CSS' },\n { value: 'json', label: 'JSON' },\n { value: 'xml', label: 'XML' },\n { value: 'yaml', label: 'YAML' },\n]\n\nconst CodeBlockHeader = memo(\n ({\n language,\n isDark,\n theme,\n }: {\n language: string\n isDark: boolean\n theme: any\n }) => {\n if (!language) return null\n\n return (\n <Text\n pos=\"absolute\"\n top={8}\n left={18}\n size=\"xs\"\n c={isDark ? theme.colors.dark[2] : theme.colors.gray[6]}\n style={{\n zIndex: 1,\n textTransform: 'capitalize',\n fontSize: 12,\n fontWeight: 600,\n display: 'flex',\n alignItems: 'center',\n pointerEvents: 'none',\n gap: 4,\n }}\n >\n <IconCode size={14} />\n {language}\n </Text>\n )\n }\n)\n\nCodeBlockHeader.displayName = 'CodeBlockHeader'\n\nexport function CodeBlock({ node, updateAttributes, selected }: ReactNodeViewProps) {\n const [copied, setCopied] = useState(false)\n\n const { currentTheme } = useTheme()\n const theme = useMantineTheme()\n const isDark = currentTheme === 'dark'\n\n const language = node.attrs?.language || ''\n\n const handleCopy = useCallback(async () => {\n const success = await copyToClipboard(node.textContent)\n if (success) {\n setCopied(true)\n setTimeout(() => setCopied(false), 1500)\n }\n }, [node.textContent])\n\n const handleLanguageChange = useCallback(\n (value: string | null) => {\n updateAttributes({ language: value || '' })\n },\n [updateAttributes]\n )\n\n const preStyle = useMemo<React.CSSProperties>(\n () => ({\n border: `1px solid ${isDark ? theme.colors.dark[5] : theme.colors.gray[3]}`,\n borderRadius: 10,\n padding: '8px 12px',\n overflow: 'auto',\n cursor: 'text',\n background: isDark ? '#0d1117' : '#e8f1fa',\n margin: 0,\n position: 'relative',\n }),\n [isDark, theme]\n )\n\n return (\n <NodeViewWrapper className=\"code-block-wrapper\">\n <BlockWrapper selected={selected}>\n <Box\n pos=\"relative\"\n bg={isDark ? theme.colors.dark[8] : theme.colors.gray[0]}\n style={{ borderRadius: 10 }}\n >\n <Box\n pos=\"absolute\"\n top={5}\n right={50}\n style={{\n zIndex: 2,\n display: 'flex',\n alignItems: 'center',\n gap: 6,\n }}\n >\n <Select\n value={language}\n onChange={handleLanguageChange}\n data={COMMON_LANGUAGES}\n size=\"xs\"\n w={115}\n comboboxProps={{\n position: 'bottom-end',\n withinPortal: true,\n }}\n rightSection={<IconChevronDown size={14} />}\n leftSection={<IconCode size={14} color={isDark ? theme.colors.dark[2] : theme.colors.gray[6]} />}\n placeholder=\"Language\"\n clearable={false}\n searchable={false}\n styles={{\n input: {\n background: isDark ? '#292a2b' : '#f6f8fa',\n borderColor: isDark ? theme.colors.dark[5] : theme.colors.gray[3],\n height: 28,\n minHeight: 28,\n borderRadius: 12,\n },\n dropdown: {\n borderRadius: 12,\n },\n }}\n />\n </Box>\n\n <ActionIcon\n pos=\"absolute\"\n top={5}\n right={5}\n color={isDark ? 'dark' : 'gray'}\n variant=\"subtle\"\n radius=\"md\"\n onClick={handleCopy}\n style={{ zIndex: 2 }}\n title={copied ? 'Copied!' : 'Copy code'}\n >\n {copied ? <IconCheck color=\"green\" size={16} /> : <IconCopy size={16} />}\n </ActionIcon>\n\n <pre style={preStyle} className={isDark ? 'hljs-dark' : 'hljs-light'}>\n <code>\n <NodeViewContent />\n </code>\n </pre>\n </Box>\n </BlockWrapper>\n <style>{`\n .code-block-wrapper .ProseMirror-trailingBreak {\n display: none;\n }\n .hljs-light {\n color: #24292f;\n background: #f3faff !important;\n }\n .hljs-light .hljs-doctag,\n .hljs-light .hljs-keyword,\n .hljs-light .hljs-meta .hljs-keyword,\n .hljs-light .hljs-template-tag,\n .hljs-light .hljs-template-variable,\n .hljs-light .hljs-type,\n .hljs-light .hljs-variable.language_ {\n color: #d73a49;\n }\n .hljs-light .hljs-title,\n .hljs-light .hljs-title.class_,\n .hljs-light .hljs-title.class_.inherited__,\n .hljs-light .hljs-title.function_ {\n color: #6f42c1;\n }\n .hljs-light .hljs-attr,\n .hljs-light .hljs-attribute,\n .hljs-light .hljs-literal,\n .hljs-light .hljs-meta,\n .hljs-light .hljs-number,\n .hljs-light .hljs-operator,\n .hljs-light .hljs-selector-attr,\n .hljs-light .hljs-selector-class,\n .hljs-light .hljs-selector-id,\n .hljs-light .hljs-variable {\n color: #005cc5;\n }\n .hljs-light .hljs-meta .hljs-string,\n .hljs-light .hljs-regexp,\n .hljs-light .hljs-string {\n color: #0a3069;\n }\n .hljs-light .hljs-built_in,\n .hljs-light .hljs-symbol {\n color: #b56b3a;\n }\n .hljs-light .hljs-code,\n .hljs-light .hljs-comment,\n .hljs-light .hljs-formula {\n color: #6a737d;\n }\n .hljs-light .hljs-name,\n .hljs-light .hljs-quote,\n .hljs-light .hljs-selector-pseudo,\n .hljs-light .hljs-selector-tag {\n color: #22863a;\n }\n .hljs-light .hljs-subst {\n color: #24292f;\n }\n .hljs-light .hljs-section {\n color: #005cc5;\n font-weight: 700;\n }\n .hljs-light .hljs-bullet {\n color: #735c0f;\n }\n .hljs-light .hljs-emphasis {\n color: #24292f;\n font-style: italic;\n }\n .hljs-light .hljs-strong {\n color: #24292f;\n font-weight: 700;\n }\n\n .hljs-dark {\n color: #c9d1d9;\n background: #292a2b !important;\n }\n .hljs-dark .hljs-doctag,\n .hljs-dark .hljs-keyword,\n .hljs-dark .hljs-meta .hljs-keyword,\n .hljs-dark .hljs-template-tag,\n .hljs-dark .hljs-template-variable,\n .hljs-dark .hljs-type,\n .hljs-dark .hljs-variable.language_ {\n color: #ff7b72;\n }\n .hljs-dark .hljs-title,\n .hljs-dark .hljs-title.class_,\n .hljs-dark .hljs-title.class_.inherited__,\n .hljs-dark .hljs-title.function_ {\n color: #d2a8ff;\n }\n .hljs-dark .hljs-attr,\n .hljs-dark .hljs-attribute,\n .hljs-dark .hljs-literal,\n .hljs-dark .hljs-meta,\n .hljs-dark .hljs-number,\n .hljs-dark .hljs-operator,\n .hljs-dark .hljs-selector-attr,\n .hljs-dark .hljs-selector-class,\n .hljs-dark .hljs-selector-id,\n .hljs-dark .hljs-variable {\n color: #79c0ff;\n }\n .hljs-dark .hljs-meta .hljs-string,\n .hljs-dark .hljs-regexp,\n .hljs-dark .hljs-string {\n color: #a5d6ff;\n }\n .hljs-dark .hljs-built_in,\n .hljs-dark .hljs-symbol {\n color: #ffa657;\n }\n .hljs-dark .hljs-code,\n .hljs-dark .hljs-comment,\n .hljs-dark .hljs-formula {\n color: #8b949e;\n }\n .hljs-dark .hljs-name,\n .hljs-dark .hljs-quote,\n .hljs-dark .hljs-selector-pseudo,\n .hljs-dark .hljs-selector-tag {\n color: #7ee787;\n }\n .hljs-dark .hljs-subst {\n color: #c9d1d9;\n }\n .hljs-dark .hljs-section {\n color: #1f6feb;\n font-weight: 700;\n }\n .hljs-dark .hljs-bullet {\n color: #f2cc60;\n }\n .hljs-dark .hljs-emphasis {\n color: #c9d1d9;\n font-style: italic;\n }\n .hljs-dark .hljs-strong {\n color: #c9d1d9;\n font-weight: 700;\n }\n `}</style>\n </NodeViewWrapper>\n )\n}","/**\n * @License OTMC License\n * @Copyright (c) 2026 OTMC Softwares. All rights reserved.\n * @Contributors Trung Ng, OTMC Authors.\n**/\nimport { Box, type BoxProps } from '@mantine/core'\n\ninterface BlockWrapperProps extends BoxProps {\n children: React.ReactNode\n selected?: boolean\n}\n\nexport function BlockWrapper({ children, selected, ...props }: BlockWrapperProps) {\n return (\n <Box\n px={0}\n py={4}\n style={{\n borderRadius: 8,\n backgroundColor: selected ? 'var(--mantine-color-blue-light)' : 'transparent',\n transition: 'background-color 0.15s ease',\n }}\n {...props}\n >\n {children}\n </Box>\n )\n}\n","/**\n * @License OTMC License\n * @Copyright (c) 2026 OTMC Softwares. All rights reserved.\n * @Contributors Trung Ng, OTMC Authors.\n**/\nimport TaskItem from '@tiptap/extension-task-item'\nimport { ReactNodeViewRenderer } from '@tiptap/react'\nimport { TaskBlock } from '../blocks/TaskBlock'\n\nexport const TaskItemExtension = TaskItem.extend({\n addNodeView() {\n return ReactNodeViewRenderer(TaskBlock)\n },\n})\n","/**\n * @License OTMC License\n * @Copyright (c) 2026 OTMC Softwares. All rights reserved.\n * @Contributors Trung Ng, OTMC Authors.\n**/\nimport { NodeViewWrapper, NodeViewContent, type ReactNodeViewProps } from '@tiptap/react'\nimport { Checkbox, useMantineTheme, useMantineColorScheme } from '@mantine/core'\nimport { memo, useCallback } from 'react'\n\ninterface TaskItemProps {\n node: any\n updateAttributes: (attrs: any) => void\n}\n\nfunction useToggle(updateAttributes: TaskItemProps['updateAttributes']) {\n return useCallback(\n (checked: boolean) => {\n updateAttributes({ checked })\n },\n [updateAttributes]\n )\n}\n\nexport const TaskBlock = memo(({ node, updateAttributes }: ReactNodeViewProps) => {\n const theme = useMantineTheme()\n const { colorScheme } = useMantineColorScheme()\n const isChecked = node.attrs.checked\n const toggle = useToggle(updateAttributes)\n\n const textColor = isChecked\n ? (colorScheme === 'dark' ? theme.colors.green[2] : theme.colors.green[9])\n : (colorScheme === 'dark' ? theme.colors.blue[2] : theme.colors.blue[9])\n\n return (\n <NodeViewWrapper\n as=\"li\"\n data-type=\"taskItem\"\n data-checked={isChecked}\n style={{\n margin: '6px 0',\n marginLeft: '-1.2em',\n display: 'flex',\n alignItems: 'center',\n gap: 10,\n }}\n >\n <Checkbox\n checked={isChecked}\n onChange={e => toggle(e.currentTarget.checked)}\n size=\"md\"\n styles={{\n root: {\n display: 'flex',\n alignItems: 'center',\n },\n input: {\n cursor: 'pointer',\n width: 22,\n height: 22,\n },\n }}\n />\n\n <NodeViewContent\n as=\"div\"\n style={{\n flex: 1,\n color: textColor,\n fontWeight: 600,\n opacity: isChecked ? 0.7 : 0.9,\n textDecoration: isChecked ? 'line-through' : 'none',\n }}\n />\n\n <style>{`\n div[data-node-view-content] p {\n margin: 0;\n display: inline;\n line-height: 1.8;\n }\n `}</style>\n </NodeViewWrapper>\n )\n})\n\nTaskBlock.displayName = 'TaskBlock'\n","/**\n * @License OTMC License\n * @Copyright (c) 2026 OTMC Softwares. All rights reserved.\n * @Contributors Trung Ng, OTMC Authors.\n**/\nimport { Node, mergeAttributes } from '@tiptap/core'\nimport { ReactNodeViewRenderer } from '@tiptap/react'\nimport { NoticeBlock } from '../blocks/NoticeBlock'\n\nexport const NoticeExtension = Node.create({\n name: 'notice',\n group: 'block',\n content: 'block+',\n defining: true,\n draggable: true,\n\n addAttributes() {\n return {\n variant: {\n default: 'info',\n parseHTML: element => element.getAttribute('data-variant'),\n renderHTML: attributes => ({ 'data-variant': attributes.variant }),\n },\n title: {\n default: 'Note',\n parseHTML: element => element.getAttribute('data-title'),\n renderHTML: attributes => ({ 'data-title': attributes.title }),\n },\n }\n },\n\n parseHTML() {\n return [{ tag: 'div[data-type=\"notice\"]' }]\n },\n\n renderHTML({ HTMLAttributes }) {\n return ['div', mergeAttributes(HTMLAttributes, { 'data-type': 'notice' }), 0]\n },\n\n addNodeView() {\n return ReactNodeViewRenderer(NoticeBlock)\n },\n\n addCommands() {\n return {\n setNotice:\n (attrs?: { variant?: string; title?: string }) =>\n ({ commands }: any) => {\n return commands.insertContent({\n type: this.name,\n attrs,\n content: [{ type: 'paragraph' }],\n })\n },\n toggleNotice: () => ({ commands }: any) => {\n return commands.toggleNode(this.name, 'paragraph')\n },\n } as any\n },\n})\n","/**\n * @License OTMC License\n * @Copyright (c) 2026 OTMC Softwares. All rights reserved.\n * @Contributors Trung Ng, OTMC Authors.\n**/\nimport { NodeViewWrapper, NodeViewContent, type ReactNodeViewProps } from '@tiptap/react'\nimport { Alert, ActionIcon, Menu, TextInput, Box } from '@mantine/core'\nimport {\n IconAlertCircle,\n IconInfoCircle,\n IconCheck,\n IconExclamationMark,\n IconSettings,\n IconTrash,\n} from '@tabler/icons-react'\nimport { BlockWrapper } from '../components/BlockWrapper'\n\nconst VARIANTS = [\n { value: 'info', icon: <IconInfoCircle size={18} />, color: 'blue', label: 'Thông tin' },\n { value: 'success', icon: <IconCheck size={18} />, color: 'teal', label: 'Thành công' },\n { value: 'warning', icon: <IconExclamationMark size={18} />, color: 'orange', label: 'Cảnh báo' },\n { value: 'error', icon: <IconAlertCircle size={18} />, color: 'red', label: 'Lỗi' },\n] as const\n\nexport function NoticeBlock({ node, updateAttributes, deleteNode }: ReactNodeViewProps) {\n const { variant = 'info', title = 'Note' } = (node as any).attrs || {}\n const currentVariant = VARIANTS.find(v => v.value === variant) || VARIANTS[0]\n\n return (\n <NodeViewWrapper className=\"notice-block-wrapper\">\n <BlockWrapper>\n <Box style={{ position: 'relative' }}>\n <div\n style={{\n position: 'absolute',\n top: '8px',\n right: '8px',\n zIndex: 10,\n display: 'flex',\n gap: '4px',\n }}\n >\n <Menu shadow=\"md\" width={180} position=\"bottom-end\" withArrow>\n <Menu.Target>\n <ActionIcon\n variant=\"subtle\"\n color=\"gray\"\n size=\"sm\"\n className=\"notice-settings-btn\"\n style={{ opacity: 0.4 }}\n >\n <IconSettings size={16} />\n </ActionIcon>\n </Menu.Target>\n <Menu.Dropdown>\n <Menu.Label>Loại hiển thị</Menu.Label>\n {VARIANTS.map(v => (\n <Menu.Item\n key={v.value}\n leftSection={v.icon}\n onClick={() => updateAttributes?.({ variant: v.value })}\n style={{ iconSize: 16 }}\n >\n {v.label}\n </Menu.Item>\n ))}\n <Menu.Divider />\n <Menu.Item\n color=\"red\"\n leftSection={<IconTrash size={18} />}\n onClick={() => deleteNode?.()}\n >\n Xóa khối\n </Menu.Item>\n </Menu.Dropdown>\n </Menu>\n </div>\n\n <Alert\n variant=\"light\"\n color={currentVariant.color}\n icon={currentVariant.icon}\n radius=\"md\"\n styles={{\n root: {\n padding: '4px 10px',\n border: 'none',\n backgroundColor: `var(--mantine-color-${currentVariant.color}-light)`,\n borderLeft: `4px solid var(--mantine-color-${currentVariant.color}-filled)`,\n },\n icon: {\n marginRight: '4px',\n marginTop: '10px',\n },\n wrapper: {\n gap: '4px',\n },\n }}\n >\n <TextInput\n placeholder=\"Nhập tiêu đề...\"\n variant=\"unstyled\"\n value={title}\n onChange={e => updateAttributes?.({ title: e.target.value })}\n styles={{\n input: {\n fontWeight: 700,\n fontSize: '1.05rem',\n minHeight: 'auto',\n padding: 0,\n height: 'auto',\n color: `var(--mantine-color-${currentVariant.color}-filled)`,\n letterSpacing: '-0.01em',\n },\n }}\n />\n\n <Box style={{ marginTop: '-6px', marginBottom: '12px', fontSize: '0.95rem', lineHeight: 1.6 }}>\n <NodeViewContent className=\"notice-content-area\" />\n </Box>\n </Alert>\n </Box>\n </BlockWrapper>\n\n <style>{`\n .notice-block-wrapper:hover .notice-settings-btn {\n opacity: 1 !important;\n }\n .notice-content-area {\n min-height: 1.2em;\n }\n .notice-content-area:focus {\n outline: none;\n }\n `}</style>\n </NodeViewWrapper>\n )\n}\n","/**\n * @License OTMC License\n * @Copyright (c) 2026 OTMC Softwares. All rights reserved.\n * @Contributors Trung Ng, OTMC Authors.\n**/\nimport { Node, mergeAttributes } from '@tiptap/core'\nimport { ReactNodeViewRenderer } from '@tiptap/react'\nimport { TimelineBlock } from '../blocks/TimelineBlock'\n\nexport const TimelineExtension = Node.create({\n name: 'timeline',\n group: 'block',\n draggable: true,\n isolating: true,\n\n addAttributes() {\n return {\n items: {\n default: [],\n parseHTML: element => {\n const json = element.getAttribute('data-items')\n return json ? JSON.parse(json) : []\n },\n renderHTML: attributes => ({\n 'data-items': JSON.stringify(attributes.items),\n }),\n },\n active: {\n default: 0,\n parseHTML: element => parseInt(element.getAttribute('data-active') || '0', 10),\n renderHTML: attributes => ({\n 'data-active': attributes.active,\n }),\n },\n }\n },\n\n parseHTML() {\n return [{ tag: 'div[data-type=\"timeline\"]' }]\n },\n\n renderHTML({ HTMLAttributes }) {\n return ['div', mergeAttributes(HTMLAttributes, { 'data-type': 'timeline' })]\n },\n\n addNodeView() {\n return ReactNodeViewRenderer(TimelineBlock)\n },\n\n addCommands() {\n return {\n setTimeline:\n () =>\n ({ commands }: any) => {\n return commands.insertContent({\n type: this.name,\n attrs: {\n items: [],\n active: 0,\n },\n })\n },\n } as any\n },\n})\n","/**\n * @License OTMC License\n * @Copyright (c) 2026 OTMC Softwares. All rights reserved.\n * @Contributors Trung Ng, OTMC Authors.\n**/\nimport { NodeViewWrapper, type ReactNodeViewProps } from '@tiptap/react'\nimport {\n Box,\n ActionIcon,\n Menu,\n TextInput,\n Textarea,\n Button,\n Timeline,\n Group,\n Text,\n Paper,\n Stack,\n Tooltip,\n Badge,\n rem,\n UnstyledButton,\n} from '@mantine/core'\nimport {\n IconSettings,\n IconTrash,\n IconPlus,\n IconCalendar,\n IconEdit,\n IconEye,\n IconCheck,\n} from '@tabler/icons-react'\nimport { BlockWrapper } from '../components/BlockWrapper'\nimport { useState, useCallback } from 'react'\n\ninterface TimelineItem {\n id: string\n title: string\n description: string\n date?: string\n}\n\ninterface TimelineData {\n items: TimelineItem[]\n active?: number\n}\n\nconst generateId = () => Math.random().toString(36).substring(7)\n\nexport function TimelineBlock({ node, updateAttributes, deleteNode }: ReactNodeViewProps) {\n const { items = [], active = 0 } = (node.attrs as TimelineData)\n const [isEditMode, setIsEditMode] = useState(false)\n const [editingItemId, setEditingItemId] = useState<string | null>(null)\n\n const handleUpdateItems = useCallback((newItems: TimelineItem[]) => {\n updateAttributes({ items: newItems })\n }, [updateAttributes])\n\n const addTimelineItem = useCallback(() => {\n const newItem: TimelineItem = {\n id: generateId(),\n title: '',\n description: '',\n date: new Date().toLocaleDateString('vi-VN'),\n }\n handleUpdateItems([...items, newItem])\n setEditingItemId(newItem.id)\n setIsEditMode(true)\n }, [items, handleUpdateItems])\n\n const updateTimelineItem = (index: number, updates: Partial<TimelineItem>) => {\n const newItems = [...items]\n newItems[index] = { ...newItems[index], ...updates }\n handleUpdateItems(newItems)\n }\n\n const deleteTimelineItem = (index: number) => {\n const newItems = items.filter((_, i) => i !== index)\n handleUpdateItems(newItems)\n setEditingItemId(null)\n }\n\n return (\n <NodeViewWrapper className=\"timeline-block\">\n <BlockWrapper>\n <Paper \n withBorder \n p=\"md\" \n radius=\"md\" \n pos=\"relative\"\n style={{ transition: 'border-color 0.2s ease' }}\n >\n <Group \n gap={5} \n pos=\"absolute\" \n top={8} \n right={8} \n style={{ zIndex: 10 }}\n >\n <Tooltip label={isEditMode ? \"Xem trước\" : \"Chỉnh sửa\"}>\n <ActionIcon \n size=\"sm\"\n variant=\"subtle\" \n color={isEditMode ? \"blue\" : \"gray\"}\n onClick={() => {\n setIsEditMode(!isEditMode)\n setEditingItemId(null)\n }}\n >\n {isEditMode ? <IconEye size={16} /> : <IconEdit size={16} />}\n </ActionIcon>\n </Tooltip>\n\n <Menu position=\"bottom-end\" withinPortal shadow=\"md\">\n <Menu.Target>\n <ActionIcon size=\"sm\" variant=\"subtle\" color=\"gray\">\n <IconSettings size={16} />\n </ActionIcon>\n </Menu.Target>\n <Menu.Dropdown>\n <Menu.Item leftSection={<IconPlus size={14}/>} onClick={addTimelineItem}>Thêm sự kiện</Menu.Item>\n <Menu.Divider />\n <Menu.Item color=\"red\" leftSection={<IconTrash size={14}/>} onClick={() => deleteNode()}>Xóa block</Menu.Item>\n </Menu.Dropdown>\n </Menu>\n </Group>\n\n <Timeline active={active} bulletSize={28} lineWidth={2}>\n {items.map((item, index) => {\n const isItemEditing = editingItemId === item.id && isEditMode;\n\n return (\n <Timeline.Item\n key={item.id}\n bullet={\n <UnstyledButton\n onClick={() => updateAttributes({ active: index })}\n style={{\n fontSize: rem(10),\n fontWeight: 800,\n textAlign: 'center',\n width: '100%'\n }}\n >\n {index + 1}\n </UnstyledButton>\n }\n >\n <Box\n p=\"xs\"\n style={{\n borderRadius: 'var(--mantine-radius-sm)',\n border: isItemEditing \n ? '1px solid var(--mantine-color-blue-light)' \n : '1px solid transparent',\n backgroundColor: isItemEditing \n ? 'var(--mantine-color-blue-light-hover)' \n : 'transparent',\n transition: 'all 0.15s ease'\n }}\n >\n {isItemEditing ? (\n <Stack gap=\"xs\">\n <TextInput\n variant=\"unstyled\"\n placeholder=\"Ngày tháng...\"\n value={item.date}\n onChange={(e) => updateTimelineItem(index, { date: e.currentTarget.value })}\n size=\"xs\"\n leftSection={<IconCalendar size={14} />}\n styles={{ input: { minHeight: 0, height: rem(20) }}}\n />\n <TextInput\n variant=\"unstyled\"\n placeholder=\"Tiêu đề...\"\n value={item.title}\n onChange={(e) => updateTimelineItem(index, { title: e.currentTarget.value })}\n fw={700}\n size=\"sm\"\n styles={{ input: { minHeight: 0, height: rem(24), fontSize: rem(15) }}}\n />\n <Textarea\n variant=\"unstyled\"\n placeholder=\"Mô tả...\"\n value={item.description}\n onChange={(e) => updateTimelineItem(index, { description: e.currentTarget.value })}\n size=\"sm\"\n autosize\n minRows={1}\n styles={{ input: { padding: 0, lineHeight: 1.4 }}}\n />\n <Group justify=\"flex-end\" gap={5}>\n <ActionIcon size=\"sm\" color=\"red\" variant=\"subtle\" onClick={() => deleteTimelineItem(index)}>\n <IconTrash size={14} />\n </ActionIcon>\n <ActionIcon size=\"sm\" color=\"blue\" variant=\"light\" onClick={() => setEditingItemId(null)}>\n <IconCheck size={14} />\n </ActionIcon>\n </Group>\n </Stack>\n ) : (\n <Box \n onClick={() => isEditMode && setEditingItemId(item.id)}\n style={{ cursor: isEditMode ? 'pointer' : 'default' }}\n >\n <Group gap={6} mb={2}>\n {item.date ? (\n <Badge size=\"xs\" variant=\"dot\" color=\"blue\">{item.date}</Badge>\n ) : isEditMode && (\n <Text size=\"xs\" c=\"dimmed\" fs=\"italic\">Thêm ngày...</Text>\n )}\n </Group>\n <Text size=\"sm\" fw={700} c={item.title ? 'inherit' : 'dimmed'}>\n {item.title || (isEditMode ? 'Nhấn để nhập tiêu đề...' : 'Sự kiện không tên')}\n </Text>\n <Text size=\"xs\" c=\"dimmed\" lineClamp={2} mt={2}>\n {item.description || (isEditMode ? 'Thêm mô tả...' : '')}\n </Text>\n </Box>\n )}\n </Box>\n </Timeline.Item>\n )\n })}\n </Timeline>\n\n {isEditMode && (\n <Button\n variant=\"subtle\"\n fullWidth\n mt=\"sm\"\n size=\"xs\"\n leftSection={<IconPlus size={14} />}\n onClick={addTimelineItem}\n color=\"blue\"\n >\n Thêm mốc thời gian\n </Button>\n )}\n </Paper>\n </BlockWrapper>\n\n <style>{`\n .timeline-block:hover .timeline-toolbar {\n opacity: 1 !important;\n }\n .timeline-block input, .timeline-block textarea {\n font-family: inherit !important;\n }\n `}</style>\n </NodeViewWrapper>\n )\n}","/**\n * @License OTMC License\n * @Copyright (c) 2026 OTMC Softwares. All rights reserved.\n * @Contributors Trung Ng, OTMC Authors.\n**/\nimport { Node, mergeAttributes } from '@tiptap/core'\nimport { ReactNodeViewRenderer } from '@tiptap/react'\nimport { DiagramBlock } from '../blocks/DiagramBlock'\n\nexport const DiagramExtension = Node.create({\n name: 'diagram',\n group: 'block',\n draggable: true,\n isolating: true,\n\n addAttributes() {\n return {\n code: {\n default: '',\n parseHTML: element => element.getAttribute('data-code') || '',\n renderHTML: attributes => ({\n 'data-code': attributes.code || '',\n }),\n },\n type: {\n default: 'graph',\n parseHTML: element => element.getAttribute('data-type') || 'graph',\n renderHTML: attributes => ({\n 'data-type': attributes.type || 'graph',\n }),\n },\n }\n },\n\n parseHTML() {\n return [{ tag: 'div[data-type=\"diagram\"]' }]\n },\n\n renderHTML({ HTMLAttributes }) {\n return ['div', mergeAttributes(HTMLAttributes, { 'data-type': 'diagram' })]\n },\n\n addNodeView() {\n return ReactNodeViewRenderer(DiagramBlock)\n },\n\n addCommands() {\n return {\n setDiagram:\n () =>\n ({ commands }: any) => {\n return commands.insertContent({\n type: this.name,\n attrs: {\n code: '',\n type: 'graph',\n },\n })\n },\n } as any\n },\n})\n","/**\n * @License OTMC License\n * @Copyright (c) 2026 OTMC Softwares. All rights reserved.\n * @Contributors Trung Ng, OTMC Authors.\n**/\n\nimport { NodeViewWrapper, type ReactNodeViewProps } from '@tiptap/react'\nimport {\n Box,\n ActionIcon,\n Menu,\n Textarea,\n Button,\n Text,\n Select,\n Group,\n Alert,\n Paper,\n Tooltip,\n useComputedColorScheme,\n rem,\n} from '@mantine/core'\nimport {\n IconSettings,\n IconTrash,\n IconChartArea,\n IconEye,\n IconCode,\n IconAlertCircle,\n IconDeviceFloppy,\n IconRefresh,\n} from '@tabler/icons-react'\nimport { BlockWrapper } from '../components/BlockWrapper'\nimport { useState, useEffect, useRef, useCallback } from 'react'\nimport mermaid from 'mermaid'\n\nconst DIAGRAM_TYPES = [\n { value: 'graph', label: 'Flowchart', example: 'graph TD\\n A[Bắt đầu] --> B{Hợp lệ?}\\n B -->|Có| C[Xử lý]\\n B -->|Không| D[Kết thúc]' },\n { value: 'sequenceDiagram', label: 'Sequence Diagram', example: 'sequenceDiagram\\n Client->>Server: Request\\n Server-->>Client: Response' },\n { value: 'classDiagram', label: 'Class Diagram', example: 'classDiagram\\n Animal <|-- Duck\\n Animal : +int age\\n Animal: +isAlive()' },\n { value: 'stateDiagram-v2', label: 'State Diagram', example: 'stateDiagram-v2\\n [*] --> Idle\\n Idle --> Processing\\n Processing --> [*]' },\n { value: 'erDiagram', label: 'ER Diagram', example: 'erDiagram\\n USER ||--o{ POST : writes' },\n { value: 'pie', label: 'Pie Chart', example: 'pie title Thống kê\\n \"Data A\" : 45\\n \"Data B\" : 55' },\n]\n\nexport function DiagramBlock({ node, updateAttributes, deleteNode }: ReactNodeViewProps) {\n const { code = '', type = 'graph' } = node.attrs\n const [isEditing, setIsEditing] = useState(!code)\n const [previewError, setPreviewError] = useState<string | null>(null)\n const [localCode, setLocalCode] = useState(code)\n const mermaidRef = useRef<HTMLDivElement>(null)\n \n const computedColorScheme = useComputedColorScheme('light')\n\n useEffect(() => {\n mermaid.initialize({\n startOnLoad: false,\n theme: computedColorScheme === 'dark' ? 'dark' : 'default',\n securityLevel: 'loose',\n fontFamily: 'inherit',\n look: 'handDrawn',\n })\n }, [computedColorScheme])\n\n const renderMermaid = useCallback(async (codeToRender: string) => {\n if (!mermaidRef.current || !codeToRender.trim()) return\n\n try {\n setPreviewError(null)\n mermaidRef.current.innerHTML = ''\n \n const id = `mermaid-${Math.random().toString(36).substr(2, 9)}`\n const { svg } = await mermaid.render(id, codeToRender)\n \n if (mermaidRef.current) {\n mermaidRef.current.innerHTML = svg\n }\n } catch (error: any) {\n setPreviewError(error?.str || error?.message || 'Lỗi cú pháp Mermaid')\n }\n }, [])\n\n useEffect(() => {\n if (!isEditing && localCode) {\n renderMermaid(localCode)\n }\n }, [isEditing, localCode, renderMermaid, computedColorScheme])\n\n const handleSave = () => {\n updateAttributes({ code: localCode, type })\n setIsEditing(false)\n }\n\n const handleTypeChange = (newType: string | null) => {\n if (!newType) return\n const selected = DIAGRAM_TYPES.find(t => t.value === newType)\n if (selected) {\n setLocalCode(selected.example)\n updateAttributes({ code: selected.example, type: newType })\n }\n }\n\n return (\n <NodeViewWrapper className=\"diagram-block-group\">\n <BlockWrapper>\n <Paper \n withBorder \n radius=\"md\" \n shadow=\"sm\" \n pos=\"relative\"\n style={{ overflow: 'hidden' }}\n >\n <Group \n justify=\"space-between\" \n p=\"xs\" \n bg=\"var(--mantine-color-default-hover)\"\n style={{ borderBottom: '1px solid var(--mantine-color-default-border)' }}\n >\n <Group gap=\"xs\">\n <IconChartArea size={18} color=\"var(--mantine-color-blue-filled)\" />\n <Text size=\"xs\" fw={700} tt=\"uppercase\" c=\"dimmed\">\n {DIAGRAM_TYPES.find(t => t.value === type)?.label || 'Diagram'}\n </Text>\n </Group>\n\n <Group gap={4}>\n <Tooltip label={isEditing ? 'Xem trước' : 'Sửa code'}>\n <ActionIcon \n variant=\"subtle\" \n color=\"gray\" \n onClick={() => setIsEditing(!isEditing)}\n >\n {isEditing ? <IconEye size={18} /> : <IconCode size={18} />}\n </ActionIcon>\n </Tooltip>\n\n <Menu position=\"bottom-end\" withArrow shadow=\"md\">\n <Menu.Target>\n <ActionIcon variant=\"subtle\" color=\"gray\">\n <IconSettings size={18} />\n </ActionIcon>\n </Menu.Target>\n <Menu.Dropdown>\n <Menu.Label>Loại biểu đồ</Menu.Label>\n {DIAGRAM_TYPES.map(t => (\n <Menu.Item key={t.value} onClick={() => handleTypeChange(t.value)}>\n {t.label}\n </Menu.Item>\n ))}\n <Menu.Divider />\n <Menu.Item\n color=\"red\"\n leftSection={<IconTrash size={16} />}\n onClick={() => deleteNode()}\n >\n Xóa biểu đồ\n </Menu.Item>\n </Menu.Dropdown>\n </Menu>\n </Group>\n </Group>\n\n <Box p=\"md\">\n {isEditing ? (\n <Box>\n <Select\n data={DIAGRAM_TYPES}\n value={type}\n onChange={handleTypeChange}\n label=\"Kiểu biểu đồ\"\n size=\"xs\"\n mb=\"sm\"\n />\n <Textarea\n placeholder=\"Nhập code Mermaid tại đây...\"\n value={localCode}\n onChange={(e) => setLocalCode(e.currentTarget.value)}\n minRows={6}\n maxRows={20}\n autosize\n styles={{\n input: {\n fontFamily: 'var(--mantine-font-family-monospace)',\n fontSize: rem(13),\n backgroundColor: 'var(--mantine-color-body)',\n }\n }}\n />\n <Group justify=\"flex-end\" mt=\"md\">\n <Button \n variant=\"light\" \n size=\"xs\" \n leftSection={<IconRefresh size={14} />}\n onClick={() => setLocalCode(code)}\n >\n Hoàn tác\n </Button>\n <Button \n size=\"xs\" \n leftSection={<IconDeviceFloppy size={14} />}\n onClick={handleSave}\n >\n Lưu & Hiển thị\n </Button>\n </Group>\n </Box>\n ) : (\n <Box>\n {previewError ? (\n <Alert icon={<IconAlertCircle size={16} />} title=\"Lỗi cú pháp\" color=\"red\">\n <Text size=\"xs\" style={{ whiteSpace: 'pre-wrap' }}>{previewError}</Text>\n <Button size=\"compact-xs\" color=\"red\" variant=\"light\" mt=\"sm\" onClick={() => setIsEditing(true)}>\n Sửa ngay\n </Button>\n </Alert>\n ) : (\n <Box\n ref={mermaidRef}\n className=\"mermaid-render-container\"\n style={{\n display: 'flex',\n justifyContent: 'center',\n overflowX: 'auto',\n padding: '1rem',\n borderRadius: 'var(--mantine-radius-sm)',\n backgroundColor: computedColorScheme === 'dark' ? 'transparent' : '#fff'\n }}\n />\n )}\n </Box>\n )}\n </Box>\n </Paper>\n </BlockWrapper>\n\n <style>{`\n .mermaid-render-container svg {\n max-width: 100%;\n height: auto;\n }\n .diagram-block-group {\n transition: all 0.2s ease;\n }\n `}</style>\n </NodeViewWrapper>\n )\n}","/**\n * @License OTMC License\n * @Copyright (c) 2026 OTMC Softwares. All rights reserved.\n * @Contributors Trung Ng, OTMC Authors.\n**/\nimport { Mark, mergeAttributes } from '@tiptap/core'\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n backgroundColor: {\n setBackgroundColor: (color: string) => ReturnType\n unsetBackgroundColor: () => ReturnType\n }\n }\n}\n\nexport const BackgroundColorMark = Mark.create({\n name: 'backgroundColor',\n\n addOptions() {\n return {\n HTMLAttributes: {},\n }\n },\n\n addAttributes() {\n return {\n color: {\n default: null,\n parseHTML: element => element.getAttribute('data-bg-color') || null,\n renderHTML: attributes => {\n if (!attributes.color) {\n return {}\n }\n return {\n 'data-bg-color': attributes.color,\n }\n },\n },\n }\n },\n\n parseHTML() {\n return [\n {\n tag: 'span[data-bg-color]',\n },\n ]\n },\n\n renderHTML({ HTMLAttributes, mark }) {\n return [\n 'span',\n mergeAttributes(HTMLAttributes, { 'data-bg-color': mark.attrs.color }),\n 0,\n ]\n },\n\n addCommands() {\n return {\n setBackgroundColor:\n color =>\n ({ commands }) => {\n return commands.setMark(this.name, { color })\n },\n unsetBackgroundColor:\n () =>\n ({ commands }) => {\n return commands.unsetMark(this.name)\n },\n }\n },\n})\n","/**\n * @License OTMC License\n * @Copyright (c) 2026 OTMC Softwares. All rights reserved.\n * @Contributors Trung Ng, OTMC Authors.\n**/\nimport Image from '@tiptap/extension-image'\nimport { ReactNodeViewRenderer } from '@tiptap/react'\nimport { ImageBlock } from '../blocks/ImageBlock'\n\nexport const ImageExtension = Image.extend({\n addNodeView() {\n return ReactNodeViewRenderer(ImageBlock as any)\n },\n\n addAttributes() {\n return {\n src: {\n default: null,\n },\n alt: {\n default: '',\n },\n title: {\n default: '',\n },\n width: {\n default: null,\n parseHTML: el => el.getAttribute('width') || null,\n renderHTML: attrs => {\n if (!attrs.width) {\n return {}\n }\n return {\n width: attrs.width,\n }\n },\n },\n }\n },\n})\n","/**\n * @License OTMC License\n * @Copyright (c) 2026 OTMC Softwares. All rights reserved.\n * @Contributors Trung Ng, OTMC Authors.\n**/\nimport { useState, memo, useCallback, useRef, useEffect } from 'react'\nimport { NodeViewWrapper, type ReactNodeViewProps } from '@tiptap/react'\nimport { ActionIcon, Box, useMantineColorScheme, useMantineTheme, Text } from '@mantine/core'\nimport { IconCheck, IconCopy, IconArrowsMaximize } from '@tabler/icons-react'\nimport { copyToClipboard } from '../../utils/commonUtils'\n\nconst RESIZE_HANDLE_SIZE = 12\n\nconst ImageBlock = memo(function ImageBlock({ node, selected, updateAttributes }: ReactNodeViewProps) {\n const [copied, setCopied] = useState(false)\n const [isResizing, setIsResizing] = useState(false)\n const [resizeStart, setResizeStart] = useState({ x: 0, y: 0, width: 0 })\n const imgRef = useRef<HTMLImageElement>(null)\n const { colorScheme } = useMantineColorScheme()\n const theme = useMantineTheme()\n const isDark = colorScheme === 'dark'\n\n const src = (node as any).attrs?.src || ''\n const alt = (node as any).attrs?.alt || ''\n const width = (node as any).attrs?.width || null\n\n useEffect(() => {\n const handleMouseMove = (e: MouseEvent) => {\n if (!isResizing || !imgRef.current) return\n\n const deltaX = e.clientX - resizeStart.x\n const newWidth = Math.max(100, resizeStart.width + deltaX)\n \n imgRef.current.style.width = `${newWidth}px`\n }\n\n const handleMouseUp = () => {\n if (!isResizing || !imgRef.current) return\n\n const currentWidth = imgRef.current.offsetWidth\n updateAttributes?.({ width: currentWidth })\n setIsResizing(false)\n }\n\n if (isResizing) {\n document.addEventListener('mousemove', handleMouseMove)\n document.addEventListener('mouseup', handleMouseUp)\n document.body.style.cursor = 'ew-resize'\n document.body.style.userSelect = 'none'\n }\n\n return () => {\n document.removeEventListener('mousemove', handleMouseMove)\n document.removeEventListener('mouseup', handleMouseUp)\n document.body.style.cursor = ''\n document.body.style.userSelect = ''\n }\n }, [isResizing, resizeStart, updateAttributes])\n\n const handleResizeStart = useCallback((e: React.MouseEvent) => {\n e.preventDefault()\n e.stopPropagation()\n \n if (!imgRef.current) return\n\n setIsResizing(true)\n setResizeStart({\n x: e.clientX,\n y: e.clientY,\n width: imgRef.current.offsetWidth,\n })\n }, [])\n\n const handleCopy = useCallback(async () => {\n if (!src) return\n\n try {\n const success = await copyToClipboard(src)\n if (success) {\n setCopied(true)\n setTimeout(() => setCopied(false), 1500)\n }\n } catch (err) {\n console.error('Copy failed:', err)\n }\n }, [src])\n\n const handleResetSize = useCallback(() => {\n if (!imgRef.current) return\n imgRef.current.style.width = '100%'\n updateAttributes?.({ width: null })\n }, [updateAttributes])\n\n return (\n <NodeViewWrapper className=\"image-block-wrapper\">\n <Box\n pos=\"relative\"\n display=\"inline-block\"\n style={{\n maxWidth: '100%',\n borderRadius: 8,\n overflow: 'visible',\n }}\n >\n {selected && (\n <>\n <Box\n pos=\"absolute\"\n top={8}\n right={8}\n style={{\n zIndex: 2,\n display: 'flex',\n gap: 4,\n }}\n >\n <ActionIcon\n color={isDark ? 'dark' : 'gray'}\n variant=\"filled\"\n radius=\"md\"\n onClick={handleCopy}\n title={copied ? 'Copied!' : 'Copy image URL'}\n bg={isDark ? theme.colors.dark[7] : theme.white}\n style={{\n boxShadow: '0 2px 8px rgba(0, 0, 0, 0.15)',\n }}\n >\n {copied ? <IconCheck color=\"green\" size={16} /> : <IconCopy size={16} />}\n </ActionIcon>\n <ActionIcon\n color={isDark ? 'dark' : 'gray'}\n variant=\"filled\"\n radius=\"md\"\n onClick={handleResetSize}\n title=\"Reset to original size\"\n bg={isDark ? theme.colors.dark[7] : theme.white}\n style={{\n boxShadow: '0 2px 8px rgba(0, 0, 0, 0.15)',\n }}\n >\n <IconArrowsMaximize size={16} />\n </ActionIcon>\n </Box>\n\n <Box\n pos=\"absolute\"\n bottom={0}\n right={0}\n style={{\n zIndex: 2,\n width: RESIZE_HANDLE_SIZE,\n height: RESIZE_HANDLE_SIZE,\n cursor: 'ew-resize',\n transform: 'translate(50%, 50%)',\n }}\n onMouseDown={handleResizeStart}\n >\n <Box\n w=\"100%\"\n h=\"100%\"\n bg={theme.colors.blue[6]}\n style={{\n borderRadius: '50%',\n border: `2px solid ${theme.white}`,\n boxShadow: '0 1px 4px rgba(0, 0, 0, 0.3)',\n }}\n />\n </Box>\n </>\n )}\n\n <img\n ref={imgRef}\n src={src}\n alt={alt}\n style={{\n display: 'block',\n maxWidth: '100%',\n width: width ? `${width}px` : '100%',\n height: 'auto',\n borderRadius: 8,\n border: selected\n ? `1px solid ${theme.colors.blue[6]}`\n : 'none',\n boxShadow: selected\n ? `0 0 0 1px ${theme.colors.blue[6]}`\n : 'none',\n cursor: isResizing ? 'ew-resize' : 'default',\n transition: isResizing ? 'none' : 'border 0.2s, box-shadow 0.2s',\n }}\n />\n\n {alt && (\n <Text\n size=\"xs\"\n c={isDark ? theme.colors.dark[2] : theme.colors.gray[6]}\n ta=\"center\"\n mt={4}\n style={{\n fontStyle: 'italic',\n }}\n >\n {alt}\n </Text>\n )}\n </Box>\n </NodeViewWrapper>\n )\n})\n\nImageBlock.displayName = 'ImageBlock'\n\nexport { ImageBlock }\n","/**\n * @License OTMC License\n * @Copyright (c) 2026 OTMC Softwares. All rights reserved.\n * @Contributors Trung Ng, OTMC Authors.\n**/\nimport { Extension } from '@tiptap/react';\nimport { Plugin, PluginKey, Transaction } from '@tiptap/pm/state';\nimport type { HeadingNode, TableOfContentsOptions } from './TableOfContents';\n\nconst generateId = (text: string, index: number): string => {\n const base = text.trim().toLowerCase().replace(/\\s+/g, '-').replace(/[^a-z0-9-]/g, '');\n return base ? `heading-${base}-${index}` : `heading-${index}`;\n};\n\nconst TableOfContents = Extension.create<TableOfContentsOptions>({\n name: 'tableOfContents',\n\n addOptions() {\n return {\n onUpdate: undefined,\n };\n },\n\n onBeforeCreate() {\n setTimeout(() => {\n const headings: HeadingNode[] = [];\n const { doc } = this.editor.state;\n const headingCounters: Record<number, number> = {};\n\n doc.descendants((node, pos) => {\n if (node.type.name === 'heading') {\n const level = node.attrs.level || 1;\n if (!headingCounters[level]) {\n headingCounters[level] = 0;\n }\n headingCounters[level]++;\n\n const existingId = node.attrs.id;\n const id = existingId || generateId(node.textContent, headingCounters[level]);\n\n headings.push({\n id,\n text: node.textContent,\n level,\n pos,\n });\n }\n });\n\n if (this.options.onUpdate && headings.length > 0) {\n this.options.onUpdate(headings);\n }\n }, 0);\n },\n\n addProseMirrorPlugins() {\n const { editor } = this;\n\n const getHeadings = (): HeadingNode[] => {\n const headings: HeadingNode[] = [];\n const { doc } = editor.state;\n const headingCounters: Record<number, number> = {};\n\n doc.descendants((node, pos) => {\n if (node.type.name === 'heading') {\n const level = node.attrs.level || 1;\n if (!headingCounters[level]) {\n headingCounters[level] = 0;\n }\n headingCounters[level]++;\n\n const existingId = node.attrs.id;\n const id = existingId || generateId(node.textContent, headingCounters[level]);\n\n headings.push({\n id,\n text: node.textContent,\n level,\n pos,\n });\n }\n });\n\n return headings;\n };\n\n const updateHeadings = () => {\n const headings = getHeadings();\n if (this.options.onUpdate) {\n this.options.onUpdate(headings);\n }\n };\n\n return [\n new Plugin({\n key: new PluginKey('tableOfContents'),\n onTransaction({ transaction }: { transaction: Transaction }) {\n if (transaction.docChanged || transaction.selectionSet) {\n setTimeout(updateHeadings, 0);\n }\n },\n }),\n ];\n },\n});\n\nexport default TableOfContents;\n","/**\n * @License OTMC License\n * @Copyright (c) 2026 OTMC Softwares. All rights reserved.\n * @Contributors Trung Ng, OTMC Authors.\n**/\nimport { memo, useState, useEffect, useRef, useCallback } from 'react';\nimport { Box, Text, ScrollArea, Popover, useMantineTheme } from '@mantine/core';\nimport { IconList } from '@tabler/icons-react';\nimport { useTheme } from '../../contexts/ThemeProvider';\nimport { ReadingIndicator } from './ReadingIndicator';\n\nexport interface HeadingNode {\n id: string;\n text: string;\n level: number;\n pos: number;\n}\n\nexport interface TableOfContentsOptions {\n onUpdate?: (headings: HeadingNode[]) => void;\n}\n\ninterface TableOfContentsPanelProps {\n headings: HeadingNode[];\n editor: any;\n}\n\nexport const TableOfContentsPanel = memo(({ headings, editor }: TableOfContentsPanelProps) => {\n const theme = useMantineTheme();\n const { currentTheme } = useTheme();\n const isDark = currentTheme === 'dark';\n\n const [opened, setOpened] = useState(false);\n const [activeId, setActiveId] = useState<string | null>(null);\n const targetRef = useRef<HTMLDivElement>(null);\n\n const isProgrammaticScrollRef = useRef(false);\n const ignoreBottomDetectionRef = useRef(false);\n const lastClickedHeadingIdRef = useRef<string | null>(null);\n\n const computeActiveHeading = useCallback(() => {\n if (isProgrammaticScrollRef.current) return;\n if (!editor?.view) return;\n\n const editorDom = editor.view.dom as HTMLElement;\n const headingEls = editorDom.querySelectorAll<HTMLElement>('h1,h2,h3,h4,h5,h6');\n if (headingEls.length === 0 || headings.length === 0) return;\n\n const THRESHOLD = 80;\n\n const tops = Array.from(headingEls).map(\n el => el.getBoundingClientRect().top\n );\n\n let isAtBottom = false;\n let parent = editorDom.parentElement;\n while (parent) {\n const style = window.getComputedStyle(parent);\n const overflowY = style.overflowY;\n const isScrollable = overflowY === 'auto' || overflowY === 'scroll';\n if (isScrollable && parent.scrollHeight > parent.clientHeight + 10) {\n if (Math.ceil(parent.scrollTop + parent.clientHeight) >= parent.scrollHeight - 10) {\n isAtBottom = true;\n }\n break;\n }\n parent = parent.parentElement;\n }\n\n if (!isAtBottom || ignoreBottomDetectionRef.current) {\n const docEl = document.documentElement;\n if (docEl.scrollHeight > window.innerHeight + 10) {\n if (Math.ceil(window.innerHeight + window.scrollY) >= docEl.scrollHeight - 10) {\n isAtBottom = true;\n }\n }\n }\n\n let bestIdx = -1;\n if (isAtBottom) {\n if (lastClickedHeadingIdRef.current) {\n const clickedIdx = headings.findIndex(h => h.id === lastClickedHeadingIdRef.current);\n if (clickedIdx !== -1) {\n bestIdx = clickedIdx;\n } else {\n bestIdx = headings.length - 1;\n }\n } else {\n bestIdx = headings.length - 1;\n }\n } else {\n for (let i = tops.length - 1; i >= 0; i--) {\n if (tops[i] <= THRESHOLD) {\n bestIdx = i;\n break;\n }\n }\n\n if (bestIdx === -1) {\n const viewportH = window.innerHeight;\n let closestTop = Infinity;\n for (let i = 0; i < tops.length; i++) {\n if (tops[i] < viewportH && tops[i] < closestTop) {\n closestTop = tops[i];\n bestIdx = i;\n }\n }\n\n if (bestIdx === -1) bestIdx = 0;\n }\n }\n\n const matched = headings[bestIdx];\n if (matched) setActiveId(matched.id);\n }, [editor, headings]);\n\n const computeActiveHeadingByCursor = useCallback(() => {\n if (isProgrammaticScrollRef.current) return;\n if (!editor?.view) return;\n\n const { state } = editor;\n const cursorPos = state.selection.anchor;\n\n let bestIdx = -1;\n for (let i = headings.length - 1; i >= 0; i--) {\n if (headings[i].pos <= cursorPos) {\n bestIdx = i;\n break;\n }\n }\n\n if (bestIdx >= 0 && headings[bestIdx]) {\n setActiveId(headings[bestIdx].id);\n lastClickedHeadingIdRef.current = headings[bestIdx].id;\n }\n }, [editor, headings]);\n\n const computeActiveHeadingRef = useRef(computeActiveHeading);\n const computeActiveHeadingByCursorRef = useRef(computeActiveHeadingByCursor);\n useEffect(() => {\n computeActiveHeadingRef.current = computeActiveHeading;\n computeActiveHeadingByCursorRef.current = computeActiveHeadingByCursor;\n });\n\n useEffect(() => {\n if (!editor?.view) return;\n\n let rafId = 0;\n const onScroll = () => {\n if (rafId) return;\n rafId = requestAnimationFrame(() => {\n computeActiveHeadingRef.current();\n rafId = 0;\n });\n };\n\n window.addEventListener('scroll', onScroll, { capture: true, passive: true });\n window.addEventListener('resize', onScroll, { passive: true });\n\n const initId = setTimeout(() => {\n computeActiveHeadingRef.current();\n }, 200);\n\n return () => {\n clearTimeout(initId);\n if (rafId) cancelAnimationFrame(rafId);\n window.removeEventListener('scroll', onScroll, { capture: true });\n window.removeEventListener('resize', onScroll);\n };\n }, [editor]);\n\n useEffect(() => {\n computeActiveHeadingRef.current();\n }, [headings]);\n\n useEffect(() => {\n if (!editor) return;\n const handler = () => {\n if (!isProgrammaticScrollRef.current) {\n computeActiveHeadingByCursorRef.current();\n }\n };\n editor.on('selectionUpdate', handler);\n return () => editor.off('selectionUpdate', handler);\n }, [editor]);\n\n useEffect(() => {\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape' && opened) setOpened(false);\n };\n document.addEventListener('keydown', onKey);\n return () => document.removeEventListener('keydown', onKey);\n }, [opened]);\n\n useEffect(() => {\n const clearLastClicked = () => {\n lastClickedHeadingIdRef.current = null;\n };\n window.addEventListener('wheel', clearLastClicked, { passive: true });\n window.addEventListener('touchmove', clearLastClicked, { passive: true });\n window.addEventListener('keydown', clearLastClicked, { passive: true });\n window.addEventListener('mousedown', clearLastClicked, { passive: true });\n return () => {\n window.removeEventListener('wheel', clearLastClicked);\n window.removeEventListener('touchmove', clearLastClicked);\n window.removeEventListener('keydown', clearLastClicked);\n window.removeEventListener('mousedown', clearLastClicked);\n };\n }, []);\n\n const handleClick = useCallback((heading: HeadingNode) => {\n if (!editor) return;\n const { pos } = heading;\n\n setActiveId(heading.id);\n lastClickedHeadingIdRef.current = heading.id;\n\n isProgrammaticScrollRef.current = true;\n ignoreBottomDetectionRef.current = true;\n\n editor.chain().focus().setTextSelection(pos).run();\n\n setTimeout(() => {\n const node = editor.view.nodeDOM(pos) as HTMLElement;\n if (node) node.scrollIntoView({ behavior: 'smooth', block: 'start' });\n\n setTimeout(() => {\n isProgrammaticScrollRef.current = false;\n ignoreBottomDetectionRef.current = false;\n computeActiveHeadingRef.current();\n }, 650);\n }, 50);\n }, [editor]);\n\n const getIndent = (level: number) => level === 1 ? 5 : (level - 1) * 12;\n\n const getHeadingPrefix = (level: number, index: number) => {\n const previousHeadings = headings.slice(0, index);\n\n let parentIndex = -1;\n for (let i = previousHeadings.length - 1; i >= 0; i--) {\n if (previousHeadings[i].level < level) {\n parentIndex = i;\n break;\n }\n }\n\n const sameLevelAfterParent = previousHeadings\n .slice(parentIndex + 1)\n .filter(h => h.level === level).length + 1;\n\n switch (level) {\n case 1: return ' ';\n case 2: {\n const roman = ['I', 'II', 'III', 'IV', 'V', 'VI', 'VII', 'VIII', 'IX', 'X'];\n return sameLevelAfterParent <= 10 ? `${roman[sameLevelAfterParent - 1]}.` : `${sameLevelAfterParent}.`;\n }\n case 3: return `${sameLevelAfterParent}.`;\n case 4: return '>';\n case 5: return '-';\n case 6: return '*';\n default: return `${sameLevelAfterParent}.`;\n }\n };\n\n const getHeadingColor = (level: number) => {\n const colors: Record<number, string> = {\n 1: '#cca415', 2: '#2989d8', 3: '#c7701f', 4: '#188831', 5: '#d31f1f', 6: '#149cb1',\n };\n return colors[level] || 'inherit';\n };\n\n const buttonBackground = isDark ? theme.colors.dark[9] : theme.colors.blue[0];\n const buttonBackgroundOpened = isDark ? theme.colors.blue[8] : theme.colors.blue[1];\n const borderColor = isDark ? theme.colors.dark[4] : theme.colors.gray[3];\n const iconColor = isDark ? theme.colors.blue[3] : theme.colors.dark[9];\n const iconColorOpened = isDark ? theme.colors.blue[2] : theme.colors.blue[7];\n const dropdownBackground = isDark ? '#1d1d1d' : '#ffffff';\n const activeItemBackground = isDark ? theme.colors.dark[5] : theme.colors.blue[0];\n const hoverItemBackground = isDark ? theme.colors.dark[6] : theme.colors.gray[1];\n\n const activeIndex = headings.findIndex(h => h.id === activeId);\n\n if (headings.length === 0) return null;\n\n return (\n <>\n <ReadingIndicator\n headings={headings}\n activeIndex={activeIndex}\n isDark={isDark}\n onNavigate={handleClick}\n />\n\n <Popover\n opened={opened}\n onChange={setOpened}\n position=\"left-start\"\n offset={10}\n withArrow\n shadow=\"md\"\n withinPortal\n closeOnClickOutside={true}\n styles={{\n dropdown: {\n padding: 0,\n overflow: 'hidden',\n borderRadius: theme.radius.lg,\n border: `1px solid ${borderColor}`,\n }\n }}\n >\n <Popover.Target>\n <Box\n ref={targetRef}\n onClick={(e) => {\n e.stopPropagation();\n setOpened((o) => !o);\n }}\n style={{\n position: 'fixed',\n right: 18,\n top: 65,\n width: 42,\n height: 42,\n borderRadius: '22px',\n background: opened ? buttonBackgroundOpened : buttonBackground,\n border: `1px solid ${borderColor}`,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n cursor: 'pointer',\n zIndex: 100,\n transition: 'all 0.2s ease',\n boxShadow: opened\n ? `0 2px 8px ${isDark ? 'rgba(0,0,0,0.3)' : 'rgba(0,0,0,0.15)'}`\n : `0 1px 3px ${isDark ? 'rgba(0,0,0,0.3)' : 'rgba(0,0,0,0.1)'}`,\n }}\n title=\"Table of contents\"\n >\n <IconList\n size={20}\n color={opened ? iconColorOpened : iconColor}\n stroke={1.5}\n />\n </Box>\n </Popover.Target>\n\n <Popover.Dropdown bg={dropdownBackground}>\n <Box\n style={{\n width: 'auto',\n minWidth: 400,\n display: 'flex',\n flexDirection: 'column',\n backgroundColor: dropdownBackground,\n }}\n >\n <ScrollArea.Autosize\n mah={520}\n scrollbarSize={4}\n offsetScrollbars={false}\n type=\"hover\"\n styles={{\n scrollbar: {\n '&[data-orientation=\"vertical\"]': { padding: 0, right: 2 },\n },\n thumb: {\n backgroundColor: isDark ? theme.colors.dark[3] : theme.colors.gray[5],\n }\n }}\n >\n <Box px={12} py={15}>\n {headings.map((heading, index) => (\n <Box\n key={`${heading.id}-${index}`}\n style={{\n padding: '5px 5px',\n paddingLeft: `${getIndent(heading.level)}px`,\n borderRadius: theme.radius.md,\n cursor: 'pointer',\n background: activeId === heading.id ? activeItemBackground : 'transparent',\n borderLeft: activeId === heading.id\n ? `3px solid ${theme.colors.blue[6]}`\n : '3px solid transparent',\n transition: 'all 0.15s ease',\n marginBottom: 2,\n }}\n onClick={() => handleClick(heading)}\n onMouseEnter={(e) => {\n if (activeId !== heading.id) e.currentTarget.style.background = hoverItemBackground;\n }}\n onMouseLeave={(e) => {\n if (activeId !== heading.id) e.currentTarget.style.background = 'transparent';\n }}\n >\n <Text\n size=\"sm\"\n truncate\n style={{\n color: getHeadingColor(heading.level),\n fontWeight: heading.level <= 2 ? 600 : 400,\n fontSize: heading.level <= 2 ? '15px' : '13px',\n display: 'flex',\n alignItems: 'center',\n gap: '4px',\n }}\n >\n {getHeadingPrefix(heading.level, index) && (\n <Text\n component=\"span\"\n size=\"xs\"\n style={{\n color: getHeadingColor(heading.level),\n fontWeight: 500,\n whiteSpace: 'nowrap',\n }}\n >\n {getHeadingPrefix(heading.level, index)}\n </Text>\n )}\n {heading.text || '(Empty heading)'}\n </Text>\n </Box>\n ))}\n </Box>\n </ScrollArea.Autosize>\n </Box>\n </Popover.Dropdown>\n </Popover>\n </>\n );\n});\n\nTableOfContentsPanel.displayName = 'TableOfContentsPanel';\n","/**\n * @License OTMC License\n * @Copyright (c) 2026 OTMC Softwares. All rights reserved.\n * @Contributors Trung Ng, OTMC Authors.\n**/\nimport {\n memo,\n useState,\n useRef,\n useCallback,\n useEffect,\n type KeyboardEvent,\n type TouchEvent as ReactTouchEvent,\n} from 'react';\nimport { useMantineTheme } from '@mantine/core';\nimport type { HeadingNode } from './TableOfContents';\n\nconst INDICATOR_RIGHT = 22;\nconst INDICATOR_TOP = 420; \nconst INDICATOR_MAX_H = '44vh';\n\nconst BAR_WIDTH = 38;\nconst BAR_HEIGHT = 5;\nconst BAR_RADIUS = 999;\nconst BAR_GAP = 6;\n\nconst TOOLTIP_GAP = 10;\nconst TOOLTIP_MAX_WIDTH = 240;\n\n\nexport interface ReadingIndicatorProps {\n headings: HeadingNode[];\n activeIndex: number;\n isDark: boolean;\n onNavigate: (heading: HeadingNode) => void;\n}\n\ninterface TooltipState {\n visible: boolean;\n text: string;\n y: number;\n}\n\ninterface HeadingBarProps {\n heading: HeadingNode;\n isActive: boolean;\n isDark: boolean;\n onNavigate: (heading: HeadingNode) => void;\n onHoverEnter: (heading: HeadingNode, el: HTMLElement) => void;\n onHoverLeave: () => void;\n barRef?: (el: HTMLDivElement | null) => void;\n}\n\nconst HeadingBar = memo(function HeadingBar({\n heading,\n isActive,\n isDark,\n onNavigate,\n onHoverEnter,\n onHoverLeave,\n barRef,\n}: HeadingBarProps) {\n const wrapperRef = useRef<HTMLDivElement>(null);\n\n const activeColor = '#D4A017';\n const inactiveColor = isDark ? 'rgba(255,255,255,0.18)' : 'rgba(0,0,0,0.14)';\n\n const handleMouseEnter = useCallback(() => {\n if (wrapperRef.current) onHoverEnter(heading, wrapperRef.current);\n }, [heading, onHoverEnter]);\n\n const handleFocus = useCallback(() => {\n if (wrapperRef.current) onHoverEnter(heading, wrapperRef.current);\n }, [heading, onHoverEnter]);\n\n const handleTouchStart = useCallback((e: ReactTouchEvent) => {\n e.preventDefault();\n if (wrapperRef.current) onHoverEnter(heading, wrapperRef.current);\n }, [heading, onHoverEnter]);\n\n const handleKeyDown = useCallback((e: KeyboardEvent<HTMLDivElement>) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n onNavigate(heading);\n }\n if (e.key === 'Escape') {\n onHoverLeave();\n (e.currentTarget as HTMLElement).blur();\n }\n }, [heading, onNavigate, onHoverLeave]);\n\n return (\n <div\n ref={(el) => {\n wrapperRef.current = el;\n barRef?.(el);\n }}\n role=\"menuitem\"\n tabIndex={0}\n aria-label={heading.text || '(Empty heading)'}\n aria-current={isActive ? 'location' : undefined}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={onHoverLeave}\n onFocus={handleFocus}\n onBlur={onHoverLeave}\n onTouchStart={handleTouchStart}\n onClick={() => onNavigate(heading)}\n onKeyDown={handleKeyDown}\n style={{\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n width: '100%',\n padding: '4px 0',\n cursor: 'pointer',\n outline: 'none',\n WebkitTapHighlightColor: 'transparent',\n boxSizing: 'border-box',\n }}\n >\n <div\n style={{\n width: BAR_WIDTH,\n height: BAR_HEIGHT,\n borderRadius: BAR_RADIUS,\n overflow: 'hidden',\n pointerEvents: 'none',\n boxShadow: isActive\n ? isDark\n ? '0 0 6px rgba(255,140,0,0.45), 0 1px 3px rgba(255,140,0,0.25)'\n : '0 0 5px rgba(255,120,0,0.35), 0 1px 2px rgba(255,120,0,0.20)'\n : 'none',\n }}\n >\n <div\n style={{\n width: '100%',\n height: '100%',\n borderRadius: BAR_RADIUS,\n backgroundColor: isActive ? activeColor : inactiveColor,\n opacity: isActive ? 1 : 0.38,\n transition: 'background-color 200ms ease, opacity 200ms ease, transform 200ms ease',\n transform: isActive ? 'scaleX(1.2)' : 'scaleX(1)',\n transformOrigin: 'center center',\n willChange: 'transform',\n }}\n />\n </div>\n </div>\n );\n});\n\nHeadingBar.displayName = 'HeadingBar';\n\nexport const ReadingIndicator = memo(function ReadingIndicator({\n headings,\n activeIndex,\n isDark,\n onNavigate,\n}: ReadingIndicatorProps) {\n const theme = useMantineTheme();\n\n const navRef = useRef<HTMLElement>(null);\n const barRefs = useRef<Map<number, HTMLDivElement>>(new Map());\n\n const [tooltip, setTooltip] = useState<TooltipState>({ visible: false, text: '', y: 0 });\n const hideTimer = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const handleHoverEnter = useCallback((heading: HeadingNode, el: HTMLElement) => {\n if (hideTimer.current) { clearTimeout(hideTimer.current); hideTimer.current = null; }\n const rect = el.getBoundingClientRect();\n setTooltip({\n visible: true,\n text: heading.text || '(Empty heading)',\n y: rect.top + rect.height / 2,\n });\n }, []);\n\n const handleHoverLeave = useCallback(() => {\n hideTimer.current = setTimeout(() => setTooltip(t => ({ ...t, visible: false })), 160);\n }, []);\n\n useEffect(() => () => {\n if (hideTimer.current) clearTimeout(hideTimer.current);\n }, []);\n\n const setBarRef = useCallback((index: number) => (el: HTMLDivElement | null) => {\n if (el) barRefs.current.set(index, el);\n else barRefs.current.delete(index);\n }, []);\n\n useEffect(() => {\n const nav = navRef.current;\n const el = barRefs.current.get(activeIndex);\n if (!nav || !el || activeIndex < 0) return;\n\n const navRect = nav.getBoundingClientRect();\n const elRect = el.getBoundingClientRect();\n\n const isAbove = elRect.top < navRect.top;\n const isBelow = elRect.bottom > navRect.bottom;\n if (!isAbove && !isBelow) return;\n\n const targetScrollTop =\n nav.scrollTop + (elRect.top - navRect.top) - navRect.height / 2 + elRect.height / 2;\n\n nav.scrollTo({ top: targetScrollTop, behavior: 'smooth' });\n }, [activeIndex]);\n\n const handleContainerKeyDown = useCallback((e: KeyboardEvent<HTMLElement>) => {\n if (e.key !== 'ArrowDown' && e.key !== 'ArrowUp') return;\n e.preventDefault();\n const focused = document.activeElement as HTMLElement;\n const bars = navRef.current?.querySelectorAll<HTMLElement>('[role=\"menuitem\"]');\n if (!bars) return;\n const arr = Array.from(bars);\n const idx = arr.indexOf(focused);\n if (idx === -1) return;\n const next = e.key === 'ArrowDown'\n ? arr[Math.min(idx + 1, arr.length - 1)]\n : arr[Math.max(idx - 1, 0)];\n next?.focus();\n }, []);\n\n useEffect(() => {\n const handleOutside = (e: MouseEvent | TouchEvent) => {\n if (navRef.current?.contains(e.target as Node)) return;\n setTooltip(t => ({ ...t, visible: false }));\n const focused = document.activeElement as HTMLElement;\n if (navRef.current?.contains(focused)) focused.blur();\n };\n document.addEventListener('mousedown', handleOutside, { passive: true });\n document.addEventListener('touchstart', handleOutside, { passive: true });\n return () => {\n document.removeEventListener('mousedown', handleOutside);\n document.removeEventListener('touchstart', handleOutside);\n };\n }, []);\n\n if (headings.length === 0) return null;\n\n const tooltipBg = isDark ? theme.colors.dark[6] : '#ffffff';\n const tooltipBorder = isDark ? theme.colors.dark[4] : theme.colors.gray[3];\n const tooltipText = isDark ? theme.colors.gray[1] : theme.colors.dark[7];\n const tooltipRight = INDICATOR_RIGHT + BAR_WIDTH + TOOLTIP_GAP;\n\n return (\n <>\n <div\n style={{\n position: 'fixed',\n right: INDICATOR_RIGHT,\n top: INDICATOR_TOP,\n width: BAR_WIDTH,\n zIndex: 10,\n display: 'flex',\n flexDirection: 'column',\n pointerEvents: 'none',\n }}\n >\n <style>{`nav.ri-nav::-webkit-scrollbar { display: none; }`}</style>\n\n <nav\n ref={navRef}\n role=\"navigation\"\n aria-label=\"Document section navigator\"\n className=\"ri-nav\"\n onKeyDown={handleContainerKeyDown}\n style={{\n width: BAR_WIDTH,\n maxHeight: INDICATOR_MAX_H,\n overflowY: 'auto',\n overflowX: 'visible',\n overscrollBehavior: 'contain',\n pointerEvents: 'auto',\n scrollbarWidth: 'none',\n msOverflowStyle: 'none',\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'flex-end',\n gap: BAR_GAP,\n paddingTop: 2,\n paddingBottom: 2,\n } as React.CSSProperties}\n >\n {headings.map((heading, index) => (\n <HeadingBar\n key={`${heading.id}-${index}`}\n heading={heading}\n isActive={index === activeIndex}\n isDark={isDark}\n onNavigate={onNavigate}\n onHoverEnter={handleHoverEnter}\n onHoverLeave={handleHoverLeave}\n barRef={setBarRef(index)}\n />\n ))}\n </nav>\n </div>\n\n <div\n role=\"tooltip\"\n aria-live=\"polite\"\n style={{\n position: 'fixed',\n right: tooltipRight,\n top: tooltip.y,\n transform: tooltip.visible\n ? 'translateY(-50%)'\n : 'translateY(-50%) translateX(6px)',\n zIndex: 400,\n pointerEvents: 'none',\n opacity: tooltip.visible ? 1 : 0,\n transition: 'opacity 160ms ease, transform 160ms ease',\n willChange: 'opacity, transform',\n maxWidth: TOOLTIP_MAX_WIDTH,\n whiteSpace: 'nowrap',\n }}\n >\n <div\n style={{\n background: tooltipBg,\n border: `1px solid ${tooltipBorder}`,\n borderRadius: 7,\n padding: '4px 10px',\n boxShadow: isDark\n ? '0 4px 16px rgba(0,0,0,0.5), 0 1px 4px rgba(0,0,0,0.3)'\n : '0 4px 16px rgba(0,0,0,0.10), 0 1px 4px rgba(0,0,0,0.07)',\n color: tooltipText,\n fontSize: 12,\n fontWeight: 500,\n lineHeight: 1.4,\n maxWidth: TOOLTIP_MAX_WIDTH,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n letterSpacing: '0.01em',\n }}\n >\n {tooltip.text}\n </div>\n </div>\n </>\n );\n});\n\nReadingIndicator.displayName = 'ReadingIndicator';\n","/**\n * @License OTMC License\n * @Copyright (c) 2026 OTMC Softwares. All rights reserved.\n * @Contributors Trung Ng, OTMC Authors.\n**/\nimport TurndownService from 'turndown'\nimport type { Editor } from '@tiptap/react'\n\nconst turndown = new TurndownService({\n headingStyle: 'atx',\n codeBlockStyle: 'fenced',\n hr: '---',\n})\n\nturndown.addRule('taskListCheckbox', {\n filter: (node: any) => {\n const hasCheckbox = node.querySelector('input[type=\"checkbox\"]') !== null\n return hasCheckbox\n },\n\n replacement: (content, node: any) => {\n const checkbox = node.querySelector('input[type=\"checkbox\"]')\n const checked = checkbox?.checked || checkbox?.getAttribute('checked') !== null\n const text = content.replace(/^\\s*\\[[ xX]\\]\\s*/, '').trim()\n const contentText = text || '\\u200B'\n return `- [${checked ? 'x' : ' '}] ${contentText}\\n`\n },\n})\n\nturndown.addRule('taskListText', {\n filter: (node: any) => {\n if (node.nodeName !== 'LI') return false\n const text = node.textContent || ''\n return /^\\s*\\[[ xX]\\]/.test(text)\n },\n\n replacement: (_content, node: any) => {\n const text = node.textContent || ''\n const match = text.match(/^\\s*\\[([ xX])\\]\\s*(.*)/)\n\n if (!match) return ''\n\n const checked = match[1].toLowerCase() === 'x'\n const cleanText = match[2].trim()\n\n const content = cleanText || '\\u200B'\n \n return `- [${checked ? 'x' : ' '}] ${content}\\n`\n },\n})\n\nturndown.addRule('listItem', {\n filter: (node: any) => {\n if (node.nodeName !== 'LI') return false\n \n const text = node.textContent || ''\n \n if (/^\\s*\\[[ xX]\\]/.test(text)) return false\n if (node.querySelector('input[type=\"checkbox\"]')) return false\n \n return true\n },\n\n replacement: (content, node: any) => {\n const parent = node.parentNode as HTMLElement\n if (parent.nodeName === 'OL') {\n const startAttr = parent.getAttribute('start')\n let number: number\n if (startAttr) {\n number = parseInt(startAttr, 10)\n } else {\n const items = Array.from(parent.children).filter((child: Element) => child.nodeName === 'LI')\n number = items.indexOf(node) + 1\n }\n return `${number}. ${content.trim()}\\n`\n }\n return '- ' + content.trim() + '\\n'\n },\n})\n\nturndown.addRule('table', {\n filter: 'table',\n replacement: (_content, node: any) => {\n const rows = node.querySelectorAll('tr')\n if (!rows.length) return '\\n\\n'\n\n const markdownRows: string[] = []\n let hasTh = false\n\n for (const row of rows) {\n const cells = row.querySelectorAll('th, td')\n if (!cells.length) continue\n\n const isHeader = !hasTh && row.querySelector('th') !== null\n if (isHeader) hasTh = true\n\n const cellTexts = Array.from(cells, (cell: Element) =>\n (cell.textContent || '').trim().replace(/\\|/g, '\\\\|')\n )\n\n markdownRows.push('| ' + cellTexts.join(' | ') + ' |')\n\n if (isHeader) {\n markdownRows.push('| ' + cellTexts.map(() => '---').join(' | ') + ' |')\n }\n }\n\n if (!hasTh && markdownRows.length > 0) {\n const colCount = rows[0].querySelectorAll('th, td').length\n markdownRows.splice(1, 0, '| ' + Array.from({ length: colCount }, () => '---').join(' | ') + ' |')\n }\n\n return '\\n' + markdownRows.join('\\n') + '\\n'\n },\n})\n\n;['TH', 'TD'].forEach(tag =>\n turndown.addRule(`tableCell_${tag}`, {\n filter: (node: any) => node.nodeName === tag,\n replacement: (content) => content,\n })\n)\n\n;['THEAD', 'TBODY', 'TFOOT', 'TR'].forEach(tag =>\n turndown.addRule(`tableSection_${tag}`, {\n filter: (node: any) => node.nodeName === tag,\n replacement: (content) => content,\n })\n)\n\nturndown.addRule('colorSpan', {\n filter: (node: any) => node.nodeName === 'SPAN' && !!node.style.color,\n replacement: (content, node: any) => {\n return `<span style=\"color: ${node.style.color}\">${content}</span>`\n },\n})\n\nexport const handlePaste = (editor: Editor | null, event: ClipboardEvent): boolean => {\n const clipboard = event.clipboardData\n if (!clipboard) return false\n\n const html = clipboard.getData('text/html')\n const text = clipboard.getData('text/plain')\n\n for (const item of clipboard.items) {\n if (item.type.startsWith('image')) {\n const file = item.getAsFile()\n if (file && editor) {\n const reader = new FileReader()\n reader.onload = (e) => {\n editor.chain().focus().setImage({ src: e.target?.result as string }).run()\n }\n reader.readAsDataURL(file)\n event.preventDefault()\n return true\n }\n }\n }\n\n if (html && editor) {\n const markdown = turndown.turndown(html).replace(/\\n{3,}/g, '\\n\\n')\n editor.chain().focus().insertContent(markdown).run()\n event.preventDefault()\n return true\n }\n\n if (text && editor) {\n editor.chain().focus().insertContent(text).run()\n event.preventDefault()\n return true\n }\n\n return false\n}\n\nexport { turndown }","/**\r\n * @License OTMC License\r\n * @Copyright (c) 2026 OTMC Softwares. All rights reserved.\r\n * @Contributors Trung Ng, OTMC Authors.\r\n**/\r\nimport { useState, useEffect } from 'react'\r\nimport {\r\n Group,\r\n Text,\r\n Box,\r\n Modal,\r\n Button,\r\n Select,\r\n Stack,\r\n Textarea,\r\n Alert,\r\n useMantineTheme,\r\n useMantineColorScheme,\r\n} from '@mantine/core'\r\nimport { IconSparkles, IconAlertCircle } from '@tabler/icons-react'\r\nimport notificationCenter from '../components/common/NotificationCenter'\r\nimport type { Editor } from '@tiptap/react'\r\nimport { llmApi } from '../api/llm'\r\nimport { instructionsApi, type Instruction } from '../api/instructions'\r\nimport { serializeSelectionToMarkdown } from '../editor/hooks/markdownSerializer'\r\n\r\ninterface DocumentEditorProps {\r\n editor: Editor\r\n opened: boolean\r\n onClose: () => void\r\n}\r\n\r\nexport function DocumentEditor({ editor, opened, onClose }: DocumentEditorProps) {\r\n const theme = useMantineTheme()\r\n const { colorScheme } = useMantineColorScheme()\r\n const isDark = colorScheme === 'dark'\r\n\r\n const [aiPrompt, setAiPrompt] = useState('')\r\n const [selectedTemplate, setSelectedTemplate] = useState<string | null>(null)\r\n const [aiLoading, setAiLoading] = useState(false)\r\n const [aiError, setAiError] = useState<string | null>(null)\r\n const [selectedText, setSelectedText] = useState('')\r\n const [instructions, setInstructions] = useState<Instruction[]>([])\r\n const [templatesLoading, setTemplatesLoading] = useState(false)\r\n\r\n useEffect(() => {\r\n if (opened) {\r\n const { from, to } = editor.state.selection\r\n const markdownText = serializeSelectionToMarkdown(editor, from, to)\r\n setSelectedText(markdownText)\r\n\r\n const savedTemplate = localStorage.getItem('ai-rewrite-last-template')\r\n if (savedTemplate) {\r\n setSelectedTemplate(savedTemplate)\r\n } else if (instructions.length > 0) {\r\n const firstTemplate = instructions[0].name.toLowerCase()\r\n setSelectedTemplate(firstTemplate)\r\n }\r\n }\r\n }, [opened, editor, instructions])\r\n\r\n useEffect(() => {\r\n if (!opened) return\r\n\r\n const fetchInstructions = async () => {\r\n try {\r\n setTemplatesLoading(true)\r\n const response = await instructionsApi.getAll()\r\n if (response.success && 'data' in response) {\r\n setInstructions(response.data)\r\n }\r\n } catch (error) {\r\n console.error('Failed to fetch instructions:', error)\r\n } finally {\r\n setTemplatesLoading(false)\r\n }\r\n }\r\n\r\n fetchInstructions()\r\n }, [opened])\r\n\r\n useEffect(() => {\r\n if (selectedTemplate !== null) {\r\n localStorage.setItem('ai-rewrite-last-template', selectedTemplate)\r\n }\r\n }, [selectedTemplate])\r\n\r\n const getTemplateOptions = () => {\r\n return instructions.map(instruction => ({\r\n value: instruction.name.toLowerCase(),\r\n label: instruction.name.charAt(0).toUpperCase() + instruction.name.slice(1)\r\n }))\r\n }\r\n\r\n const handleAISubmit = async () => {\r\n const { from, to } = editor.state.selection\r\n const markdownText = serializeSelectionToMarkdown(editor, from, to)\r\n\r\n if (!markdownText.trim()) {\r\n setAiError('No text selected. Please select some text to rewrite.')\r\n return\r\n }\r\n\r\n if (!aiPrompt.trim() && !selectedTemplate) {\r\n setAiError('Please enter a prompt or select a template.')\r\n return\r\n }\r\n\r\n setAiLoading(true)\r\n setAiError(null)\r\n\r\n try {\r\n let instructionContent = aiPrompt\r\n if (selectedTemplate) {\r\n const instruction = instructions.find(inst =>\r\n inst.name.toLowerCase() === selectedTemplate.toLowerCase()\r\n )\r\n if (instruction) {\r\n instructionContent = instruction.content\r\n }\r\n }\r\n\r\n const response = await llmApi.generate({\r\n type: selectedTemplate || 'custom',\r\n prompt: instructionContent,\r\n content: markdownText,\r\n })\r\n\r\n if (response.success && 'data' in response) {\r\n const rewrittenMarkdown = response.data.response\r\n console.log('Rewritten markdown:', rewrittenMarkdown)\r\n\r\n editor\r\n .chain()\r\n .focus()\r\n .deleteRange({ from, to })\r\n .insertContent(rewrittenMarkdown || '')\r\n .run()\r\n\r\n onClose()\r\n setAiPrompt('')\r\n setSelectedTemplate(null)\r\n\r\n notificationCenter.success({\r\n title: 'Rewrote text with AI',\r\n message: 'Text rewritten successfully',\r\n })\r\n }\r\n } catch (error: any) {\r\n console.error('AI rewrite failed:', error)\r\n setAiError(error.message || 'Failed to generate AI response')\r\n notificationCenter.error({\r\n title: 'AI rewrite failed',\r\n message: error.message || 'Failed to generate AI response',\r\n })\r\n } finally {\r\n setAiLoading(false)\r\n }\r\n }\r\n\r\n const handleClose = () => {\r\n onClose()\r\n setAiPrompt('')\r\n setSelectedTemplate(null)\r\n setAiError(null)\r\n }\r\n\r\n return (\r\n <Modal\r\n opened={opened}\r\n onClose={handleClose}\r\n title={\r\n <Group gap=\"xs\">\r\n <IconSparkles size={20} />\r\n AI Rewrite\r\n </Group>\r\n }\r\n size=\"lg\"\r\n radius=\"lg\"\r\n centered\r\n >\r\n <Stack gap=\"md\">\r\n {selectedText && (\r\n <Box>\r\n <Text size=\"sm\" fw={500} mb=\"xs\">Selected Text</Text>\r\n <Box\r\n p=\"sm\"\r\n bg={isDark ? 'dark.5' : 'gray.0'}\r\n style={{\r\n borderRadius: theme.radius.md,\r\n maxHeight: 250,\r\n overflow: 'auto',\r\n borderLeft: '3px solid var(--mantine-color-gray-6)',\r\n }}\r\n >\r\n <Text size=\"sm\" c=\"blue\" style={{ whiteSpace: 'pre-wrap' }}>\r\n {selectedText.length > 200 ? `${selectedText.substring(0, 200)}...` : selectedText}\r\n </Text>\r\n </Box>\r\n </Box>\r\n )}\r\n\r\n <Select\r\n label=\"Quick Templates\"\r\n radius=\"lg\"\r\n placeholder=\"Select a template or enter custom prompt\"\r\n value={selectedTemplate}\r\n onChange={setSelectedTemplate}\r\n data={getTemplateOptions()}\r\n clearable\r\n disabled={templatesLoading}\r\n styles={{\r\n dropdown: {\r\n borderRadius: \"12px\",\r\n },\r\n }}\r\n />\r\n\r\n <Textarea\r\n label=\"Custom Prompt (Optional)\"\r\n radius=\"lg\"\r\n placeholder=\"e.g., Make it more professional, Add more details, etc.\"\r\n value={aiPrompt}\r\n onChange={(e) => setAiPrompt(e.currentTarget.value)}\r\n minRows={3}\r\n />\r\n\r\n {aiError && (\r\n <Alert icon={<IconAlertCircle size={16} />} title=\"Error\" color=\"red\">\r\n {aiError}\r\n </Alert>\r\n )}\r\n\r\n <Group justify=\"flex-end\" mt=\"md\">\r\n <Button\r\n variant=\"light\"\r\n color=\"gray\"\r\n radius=\"lg\"\r\n onClick={handleClose}\r\n >\r\n Cancel\r\n </Button>\r\n <Button\r\n onClick={handleAISubmit}\r\n loading={aiLoading}\r\n radius=\"lg\"\r\n leftSection={!aiLoading && <IconSparkles size={16} />}\r\n color=\"green.8\"\r\n >\r\n {aiLoading ? 'Generating...' : 'Generate'}\r\n </Button>\r\n </Group>\r\n </Stack>\r\n </Modal>\r\n )\r\n}\r\n","/**\n * @License OTMC License\n * @Copyright (c) 2026 OTMC Softwares. All rights reserved.\n * @Contributors Trung Ng, OTMC Authors.\n**/\nimport { EditorContent as TiptapEditorContent } from '@tiptap/react'\nimport { useMantineColorScheme, useMantineTheme } from '@mantine/core'\nimport { resolveColorScheme } from '../../contexts/ThemeProvider'\nimport { TableControls } from './TableControls'\n\ninterface EditorContentProps {\n editor: any\n minHeight?: number\n}\n\nexport function EditorContent({ editor, minHeight = 200 }: EditorContentProps) {\n const { colorScheme: rawColorScheme } = useMantineColorScheme()\n const theme = useMantineTheme()\n const colorScheme = resolveColorScheme(rawColorScheme)\n\n const tableBorderColor = colorScheme === 'dark' ? theme.colors.dark[4] : theme.colors.gray[3]\n const tableHeaderBg = colorScheme === 'dark' ? theme.colors.dark[5] : theme.colors.gray[1]\n\n const bgColors = {\n red: colorScheme === 'dark' ? theme.colors.red[8] : theme.colors.red[1],\n orange: colorScheme === 'dark' ? theme.colors.orange[8] : theme.colors.orange[1],\n yellow: colorScheme === 'dark' ? theme.colors.yellow[8] : theme.colors.yellow[1],\n green: colorScheme === 'dark' ? theme.colors.green[8] : theme.colors.green[1],\n blue: colorScheme === 'dark' ? theme.colors.blue[8] : theme.colors.blue[1],\n violet: colorScheme === 'dark' ? theme.colors.violet[8] : theme.colors.violet[1],\n pink: colorScheme === 'dark' ? theme.colors.pink[8] : theme.colors.pink[1],\n gray: colorScheme === 'dark' ? theme.colors.gray[8] : theme.colors.gray[1],\n }\n\n const h1Color = colorScheme === 'dark' ? theme.colors.yellow[5] : theme.colors.yellow[8]\n const h2Color = colorScheme === 'dark' ? theme.colors.blue[5] : theme.colors.blue[8]\n const h3Color = colorScheme === 'dark' ? theme.colors.orange[5] : theme.colors.orange[8]\n const h4Color = colorScheme === 'dark' ? theme.colors.green[5] : theme.colors.green[8]\n const h5Color = colorScheme === 'dark' ? theme.colors.red[5] : theme.colors.red[8]\n const h6Color = colorScheme === 'dark' ? theme.colors.cyan[5] : theme.colors.cyan[8]\n\n return (\n <div style={{ position: 'relative' }}>\n <TiptapEditorContent\n editor={editor}\n style={{ minHeight, lineHeight: '1.3', padding: '0 12px' }}\n >\n <style>{`\n .ProseMirror {\n --bg-red: ${bgColors.red};\n --bg-orange: ${bgColors.orange};\n --bg-yellow: ${bgColors.yellow};\n --bg-green: ${bgColors.green};\n --bg-blue: ${bgColors.blue};\n --bg-violet: ${bgColors.violet};\n --bg-pink: ${bgColors.pink};\n --bg-gray: ${bgColors.gray};\n font-family: 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif;\n }\n .ProseMirror ul, .ProseMirror ol { line-height: 1.5; padding-left: 1.6em; margin: 0.6em 0 0.2em 0; }\n .ProseMirror ol li::marker { font-weight: 700; color: ${colorScheme === 'dark' ? theme.colors.blue[4] : theme.colors.blue[7]}; }\n .ProseMirror ol li { color: ${colorScheme === 'dark' ? theme.colors.blue[4] : theme.colors.blue[8]}; }\n .ProseMirror h1 { color: ${h1Color}; font-size: 1.4em; margin-top: 0em; margin-bottom: 0em; font-weight: 700; }\n .ProseMirror h2 { color: ${h2Color}; font-size: 1.3em; margin-top: 1.4em; margin-bottom: 0.3em; font-weight: 600; }\n .ProseMirror h3 { color: ${h3Color}; font-size: 1.2em; margin-top: 1.0em; margin-bottom: 0.2em; font-weight: 600; }\n .ProseMirror h4 { color: ${h4Color}; font-size: 1.1em; margin-top: 0.6em; margin-bottom: 0.2em; font-weight: 500; }\n .ProseMirror h5 { color: ${h5Color}; font-size: 1.0em; margin-top: 0.5em; margin-bottom: 0.1em; font-weight: 500; }\n .ProseMirror h6 { color: ${h6Color}; font-size: 1.0em; margin-top: 0.5em; margin-bottom: 0.1em; font-weight: 500; }\n .ProseMirror p { margin-top: 0.1em; margin-bottom: 0.5em; }\n .ProseMirror blockquote {\n margin: 12px 0;\n padding: 8px 16px;\n border-left: 6px solid ${colorScheme === 'dark' ? theme.colors.gray[5] : theme.colors.gray[3]};\n background-color: ${colorScheme === 'dark' ? theme.colors.dark[6] : theme.colors.gray[1]};\n border-radius: 4px;\n font-style: normal;\n color: ${colorScheme === 'dark' ? theme.colors.gray[3] : theme.colors.gray[7]};\n }\n .ProseMirror blockquote p {\n margin: 4px 0;\n }\n .ProseMirror blockquote p:first-child {\n margin-top: 0;\n }\n .ProseMirror blockquote p:last-child {\n margin-bottom: 0;\n }\n .ProseMirror span[data-bg-color] {\n padding: 0.1em 0.3em;\n border-radius: 3px;\n box-decoration-break: clone;\n }\n .ProseMirror span[data-bg-color=\"red\"] { background-color: var(--bg-red); }\n .ProseMirror span[data-bg-color=\"orange\"] { background-color: var(--bg-orange); }\n .ProseMirror span[data-bg-color=\"yellow\"] { background-color: var(--bg-yellow); }\n .ProseMirror span[data-bg-color=\"green\"] { background-color: var(--bg-green); }\n .ProseMirror span[data-bg-color=\"blue\"] { background-color: var(--bg-blue); }\n .ProseMirror span[data-bg-color=\"violet\"] { background-color: var(--bg-violet); }\n .ProseMirror span[data-bg-color=\"pink\"] { background-color: var(--bg-pink); }\n .ProseMirror span[data-bg-color=\"gray\"] { background-color: var(--bg-gray); }\n .ProseMirror p code,\n .ProseMirror h1 code,\n .ProseMirror h2 code,\n .ProseMirror h3 code,\n .ProseMirror h4 code,\n .ProseMirror h5 code,\n .ProseMirror h6 code,\n .ProseMirror li code,\n .ProseMirror td code,\n .ProseMirror th code,\n .ProseMirror blockquote code {\n font-family: 'SFMono-Regular', 'Consolas', 'Liberation Mono', 'Menlo', monospace;\n font-size: 0.875em;\n padding: 0.2em 0.4em;\n border-radius: 6px;\n background-color: ${colorScheme === 'dark' ? 'rgba(255, 255, 255, 0.1)' : 'rgba(0, 0, 0, 0.06)'};\n color: ${colorScheme === 'dark' ? theme.colors.orange[4] : theme.colors.red[7]};\n border: 1px solid ${colorScheme === 'dark' ? 'rgba(255, 255, 255, 0.06)' : 'rgba(0, 0, 0, 0.08)'};\n box-decoration-break: clone;\n white-space: pre-wrap;\n word-break: break-word;\n }\n .ProseMirror table {\n border-collapse: separate;\n border-spacing: 0;\n width: 100%;\n margin: 8px 0;\n font-size: 14px;\n border: 1px solid ${tableBorderColor};\n border-radius: 8px;\n overflow: hidden;\n }\n .ProseMirror th, .ProseMirror td {\n border: 1px solid ${tableBorderColor};\n padding: 8px 12px;\n vertical-align: top;\n }\n .ProseMirror th {\n background-color: ${tableHeaderBg};\n font-weight: 600;\n text-align: left;\n }\n .ProseMirror td {\n background-color: transparent;\n }\n .ProseMirror .selectedCell {\n border: 2px solid ${theme.colors.blue[6]};\n }\n .ProseMirror hr {\n border: none;\n border-top: 1px solid ${colorScheme === 'dark' ? theme.colors.dark[3] : theme.colors.gray[4]};\n opacity: 0.4;\n margin: 16px 0;\n cursor: pointer;\n }\n .ProseMirror hr.ProseMirror-selectednode {\n opacity: 1;\n border-top: 2px solid ${theme.colors.blue[6]};\n outline: 2px solid ${theme.colors.blue[3]};\n outline-offset: 2px;\n }\n .ProseMirror img.ticket-image {\n max-width: 100%;\n height: auto;\n border-radius: 4px;\n margin: 8px 0;\n cursor: pointer;\n }\n .ProseMirror img.ticket-image.ProseMirror-selectednode {\n outline: 2px solid ${theme.colors.blue[6]};\n outline-offset: 2px;\n }\n .code-block-wrapper .ProseMirror-trailingBreak {\n display: none;\n }\n `}</style>\n <TableControls editor={editor} />\n </TiptapEditorContent>\n </div>\n )\n}\n","/**\n * @License OTMC License\n * @Copyright (c) 2026 OTMC Softwares. All rights reserved.\n * @Contributors Trung Ng, OTMC Authors.\n**/\nimport { useEffect, useState, useCallback, useRef } from 'react'\nimport { Paper, Text, Group } from '@mantine/core'\nimport { IconDotsVertical, IconDots, IconCopy, IconTrash, IconArrowsRightLeft, IconArrowBadgeDown, IconArrowBadgeUp } from '@tabler/icons-react'\nimport type { Editor } from '@tiptap/react'\n\ninterface TableControlsProps {\n editor: Editor\n}\n\nexport function TableControls({ editor }: TableControlsProps) {\n const [isTableActive, setIsTableActive] = useState(false)\n const [colHeaders, setColHeaders] = useState<Array<{ top: number; left: number; width: number }>>([])\n const [rowHeaders, setRowHeaders] = useState<Array<{ top: number; left: number; height: number }>>([])\n const [activeColMenu, setActiveColMenu] = useState<{ index: number; top: number; left: number } | null>(null)\n const [activeRowMenu, setActiveRowMenu] = useState<{ index: number; top: number; left: number } | null>(null)\n const colMenuRef = useRef<HTMLDivElement>(null)\n const rowMenuRef = useRef<HTMLDivElement>(null)\n\n const updatePositions = useCallback(() => {\n if (!editor.isActive('table')) {\n setIsTableActive(false)\n setColHeaders([])\n setRowHeaders([])\n return\n }\n\n const container = document.querySelector('.ProseMirror')\n if (!container) return\n\n const containerRect = container.getBoundingClientRect()\n\n let tableNode: HTMLElement | null = null\n \n const { state } = editor\n const { selection } = state\n const resolvedPos = state.doc.resolve(selection.from)\n\n for (let depth = resolvedPos.depth; depth > 0; depth--) {\n const node = resolvedPos.node(depth)\n if (node.type.name === 'table') {\n const tableStartPos = resolvedPos.start(depth)\n \n const tables = document.querySelectorAll('.ProseMirror table')\n for (const table of tables) {\n try {\n const domPos = editor.view.posAtDOM(table, 0)\n if (domPos === tableStartPos) {\n tableNode = table as HTMLElement\n break\n }\n } catch {\n }\n }\n break\n }\n }\n\n if (!tableNode) {\n const sel = window.getSelection()\n if (sel && sel.rangeCount > 0) {\n const range = sel.getRangeAt(0)\n const container = range.startContainer.parentElement?.closest('.ProseMirror table')\n if (container) {\n tableNode = container as HTMLElement\n }\n }\n }\n\n if (!tableNode) {\n tableNode = document.querySelector('.ProseMirror table')\n }\n\n if (!tableNode) {\n setIsTableActive(false)\n setColHeaders([])\n setRowHeaders([])\n return\n }\n\n setIsTableActive(true)\n\n const firstRow = tableNode.querySelector('tr')\n if (firstRow) {\n const cells = firstRow.querySelectorAll('th, td')\n const positions: Array<{ top: number; left: number; width: number }> = []\n\n cells.forEach((cell) => {\n const cellRect = cell.getBoundingClientRect()\n positions.push({\n top: cellRect.top - containerRect.top,\n left: cellRect.left - containerRect.left,\n width: cellRect.width,\n })\n })\n\n setColHeaders(positions)\n }\n\n const rows = tableNode.querySelectorAll('tr')\n if (rows.length > 0) {\n const positions: Array<{ top: number; left: number; height: number }> = []\n\n rows.forEach((row) => {\n const rowRect = row.getBoundingClientRect()\n positions.push({\n top: rowRect.top - containerRect.top,\n left: rowRect.left - containerRect.left,\n height: rowRect.height,\n })\n })\n\n setRowHeaders(positions)\n }\n }, [editor])\n\n useEffect(() => {\n updatePositions()\n\n const handler = () => updatePositions()\n \n editor.on('selectionUpdate', handler)\n editor.on('transaction', handler)\n\n const observer = new MutationObserver(handler)\n const tableNode = document.querySelector('.ProseMirror table')\n if (tableNode) {\n observer.observe(tableNode.parentElement!, { childList: true, subtree: true })\n }\n\n const handleClickOutside = (e: MouseEvent) => {\n if (colMenuRef.current && !colMenuRef.current.contains(e.target as Node)) {\n setActiveColMenu(null)\n }\n if (rowMenuRef.current && !rowMenuRef.current.contains(e.target as Node)) {\n setActiveRowMenu(null)\n }\n }\n\n if (activeColMenu || activeRowMenu) {\n document.addEventListener('mousedown', handleClickOutside)\n }\n\n return () => {\n editor.off('selectionUpdate', handler)\n editor.off('transaction', handler)\n observer.disconnect()\n document.removeEventListener('mousedown', handleClickOutside)\n }\n }, [editor, updatePositions, activeColMenu, activeRowMenu])\n\n const handleDuplicateColumn = () => {\n ;(editor.chain() as any).focus().addColumnAfter().run()\n setTimeout(updatePositions, 50)\n setActiveColMenu(null)\n }\n\n const handleDeleteColumn = () => {\n ;(editor.chain() as any).focus().deleteColumn().run()\n setActiveColMenu(null)\n }\n\n const handleInsertLeft = () => {\n ;(editor.chain() as any).focus().addColumnBefore().run()\n setTimeout(updatePositions, 50)\n setActiveColMenu(null)\n }\n\n const handleInsertRight = () => {\n ;(editor.chain() as any).focus().addColumnAfter().run()\n setTimeout(updatePositions, 50)\n setActiveColMenu(null)\n }\n\n const handleDuplicateRow = () => {\n ;(editor.chain() as any).focus().addRowAfter().run()\n setTimeout(updatePositions, 50)\n setActiveRowMenu(null)\n }\n\n const handleDeleteRow = () => {\n ;(editor.chain() as any).focus().deleteRow().run()\n setActiveRowMenu(null)\n }\n\n const handleInsertAbove = () => {\n ;(editor.chain() as any).focus().addRowBefore().run()\n setTimeout(updatePositions, 50)\n setActiveRowMenu(null)\n }\n\n const handleInsertBelow = () => {\n ;(editor.chain() as any).focus().addRowAfter().run()\n setTimeout(updatePositions, 50)\n setActiveRowMenu(null)\n }\n\n if (!isTableActive) return null\n\n if (!editor.isEditable) return null\n\n const menuButtonStyle = {\n position: 'absolute' as const,\n zIndex: 999,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: 24,\n height: 24,\n borderRadius: 4,\n backgroundColor: 'var(--mantine-color-body)',\n border: '1px solid var(--mantine-color-default-border)',\n opacity: 0.5,\n transition: 'all 0.15s ease',\n cursor: 'pointer',\n }\n\n return (\n <>\n {rowHeaders.map((pos, index) => (\n <div\n key={index}\n style={{\n ...menuButtonStyle,\n top: `${pos.top + pos.height / 2 - 12}px`,\n left: `${pos.left - 12}px`,\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.opacity = '1'\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.opacity = '0.5'\n }}\n onClick={(e) => {\n e.stopPropagation()\n setActiveRowMenu({\n index,\n top: pos.top + pos.height / 2 - 100,\n left: pos.left + 30,\n })\n }}\n >\n <IconDotsVertical size={14} />\n </div>\n ))}\n\n {colHeaders.map((pos, index) => (\n <div\n key={index}\n style={{\n ...menuButtonStyle,\n top: `${pos.top - 12}px`,\n left: `${pos.left + pos.width / 2 - 12}px`,\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.opacity = '1'\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.opacity = '0.5'\n }}\n onClick={(e) => {\n e.stopPropagation()\n setActiveColMenu({\n index,\n top: pos.top + 30,\n left: pos.left + pos.width / 2 - 100,\n })\n }}\n >\n <IconDots size={14} />\n </div>\n ))}\n\n {activeColMenu && (\n <div\n ref={colMenuRef}\n style={{\n position: 'absolute',\n top: `${activeColMenu.top}px`,\n left: `${activeColMenu.left}px`,\n zIndex: 1001,\n }}\n >\n <Paper\n shadow=\"xl\"\n p=\"xs\"\n radius=\"md\"\n withBorder\n style={{\n minWidth: 200,\n backgroundColor: 'var(--mantine-color-body)',\n }}\n >\n <Group gap={4} wrap=\"nowrap\">\n <Text size=\"xs\" fw={500} style={{ flex: 1 }}>\n Column\n </Text>\n </Group>\n\n <div style={{ marginTop: 8 }}>\n <MenuItem\n icon={<IconArrowsRightLeft size={16} />}\n label=\"Insert Left\"\n onClick={handleInsertLeft}\n />\n <MenuItem\n icon={<IconArrowBadgeDown size={16} style={{ transform: 'rotate(-90deg)' }} />}\n label=\"Insert Right\"\n onClick={handleInsertRight}\n />\n <MenuItem\n icon={<IconCopy size={16} />}\n label=\"Duplicate\"\n onClick={handleDuplicateColumn}\n />\n <div style={{ height: 1, background: 'var(--mantine-color-default-border)', margin: '4px 0' }} />\n <MenuItem\n icon={<IconTrash size={16} />}\n label=\"Delete\"\n onClick={handleDeleteColumn}\n color=\"red\"\n />\n </div>\n </Paper>\n </div>\n )}\n\n {activeRowMenu && (\n <div\n ref={rowMenuRef}\n style={{\n position: 'absolute',\n top: `${activeRowMenu.top}px`,\n left: `${activeRowMenu.left}px`,\n zIndex: 1001,\n }}\n >\n <Paper\n shadow=\"xl\"\n p=\"xs\"\n radius=\"md\"\n withBorder\n style={{\n minWidth: 200,\n backgroundColor: 'var(--mantine-color-body)',\n }}\n >\n <Group gap={4} wrap=\"nowrap\">\n <Text size=\"xs\" fw={500} style={{ flex: 1 }}>\n Row\n </Text>\n </Group>\n\n <div style={{ marginTop: 8 }}>\n <MenuItem\n icon={<IconArrowBadgeUp size={16} />}\n label=\"Insert Above\"\n onClick={handleInsertAbove}\n />\n <MenuItem\n icon={<IconArrowBadgeDown size={16} />}\n label=\"Insert Below\"\n onClick={handleInsertBelow}\n />\n <MenuItem\n icon={<IconCopy size={16} />}\n label=\"Duplicate\"\n onClick={handleDuplicateRow}\n />\n <div style={{ height: 1, background: 'var(--mantine-color-default-border)', margin: '4px 0' }} />\n <MenuItem\n icon={<IconTrash size={16} />}\n label=\"Delete\"\n onClick={handleDeleteRow}\n color=\"red\"\n />\n </div>\n </Paper>\n </div>\n )}\n </>\n )\n}\n\nconst MenuItem = ({ icon, label, onClick, color }: { icon: React.ReactNode; label: string; onClick: () => void; color?: string }) => (\n <div\n onClick={onClick}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 8,\n padding: '6px 8px',\n borderRadius: 4,\n cursor: 'pointer',\n color: color || 'inherit',\n transition: 'background-color 0.1s ease',\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.backgroundColor = 'var(--mantine-color-default-hover)'\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = 'transparent'\n }}\n >\n {icon}\n <Text size=\"sm\">{label}</Text>\n </div>\n)\n","/**\n * @License OTMC License\n * @Copyright (c) 2026 OTMC Softwares. All rights reserved.\n * @Contributors Trung Ng, OTMC Authors.\n**/\nimport { BubbleMenu as TiptapBubbleMenu } from '@tiptap/react/menus'\nimport { useEditorState } from '@tiptap/react'\nimport {\n Group,\n ActionIcon,\n Text,\n Box,\n Menu,\n useMantineTheme,\n useMantineColorScheme,\n} from '@mantine/core'\nimport {\n IconBold,\n IconItalic,\n IconCode,\n IconColorPicker,\n IconQuote,\n IconCodeDots,\n IconHeading,\n IconCheck,\n IconListCheck,\n IconRefreshDot,\n IconPalette,\n IconSparkles,\n} from '@tabler/icons-react'\nimport type { Editor } from '@tiptap/react'\nimport { useState } from 'react'\nimport notificationCenter from '../../components/common/NotificationCenter'\nimport { serializeSelectionToMarkdown } from '../hooks/markdownSerializer'\nimport { DocumentEditor } from '../../modals/DocumentEditor'\n\ninterface BubbleMenuProps {\n editor: Editor\n}\n\nexport function BubbleMenu({ editor }: BubbleMenuProps) {\n const theme = useMantineTheme()\n const { colorScheme } = useMantineColorScheme()\n const isDark = colorScheme === 'dark'\n\n const [aiModalOpen, setAiModalOpen] = useState(false)\n\n const editorState = useEditorState({\n editor,\n selector: ({ editor }) => ({\n textAttrs: editor.getAttributes('textStyle'),\n bgAttrs: editor.getAttributes('backgroundColor'),\n isBold: editor.isActive('bold'),\n isItalic: editor.isActive('italic'),\n isCode: editor.isActive('code'),\n isCodeBlock: editor.isActive('codeBlock'),\n isQuote: editor.isActive('blockquote'),\n isTaskList: editor.isActive('taskList'),\n currentHeadingLevel: (() => {\n for (let level = 1; level <= 6; level++) {\n if (editor.isActive('heading', { level })) {\n return level\n }\n }\n return null\n })(),\n }),\n equalityFn: (a: any, b: any) => JSON.stringify(a) === JSON.stringify(b),\n })\n\n const handleHeadingChange = (level: 1 | 2 | 3 | 4 | 5 | 6) => {\n (editor.chain() as any).focus().toggleHeading({ level: level as 1 | 2 | 3 | 4 | 5 | 6 }).run()\n }\n\n const handleAIRewrite = () => {\n const { from, to } = editor.state.selection\n const markdownText = serializeSelectionToMarkdown(editor, from, to)\n\n if (!markdownText.trim()) {\n notificationCenter.warn({\n title: 'No text selected',\n message: 'Please select some text to rewrite with AI',\n })\n return\n }\n\n setAiModalOpen(true)\n }\n\n return (\n <>\n <TiptapBubbleMenu\n editor={editor}\n shouldShow={({ editor }) => {\n const { from, to } = editor.state.selection\n const hasSelection = from !== to\n\n if (editor.isActive('codeBlock')) {\n return false\n }\n\n if (editor.isActive('image')) {\n return false\n }\n\n if (!editor.isEditable) {\n return false\n }\n\n return hasSelection\n }}\n >\n <Group\n gap={4}\n p=\"xs\"\n bg=\"var(--mantine-color-body)\"\n style={bubbleStyle}\n >\n <ToolbarButton\n onClick={handleAIRewrite}\n icon={<IconSparkles size={12} />}\n color=\"green.8\"\n />\n\n <Divider />\n\n <ToolbarButton\n active={editorState.isBold}\n onClick={() => (editor.chain() as any).focus().toggleBold().run()}\n icon={<IconBold size={12} />}\n />\n\n <ToolbarButton\n active={editorState.isItalic}\n onClick={() => (editor.chain() as any).focus().toggleItalic().run()}\n icon={<IconItalic size={12} />}\n />\n\n <ToolbarButton\n active={editorState.isCode}\n onClick={() => (editor.chain() as any).focus().toggleCode().run()}\n icon={<IconCode size={12} />}\n />\n\n <Divider />\n\n <Menu shadow=\"md\" width={200} withinPortal>\n <Menu.Target>\n <ActionIcon size=\"sm\" variant={editorState.currentHeadingLevel ? 'filled' : 'light'} style={{ minWidth: 40 }}>\n {editorState.currentHeadingLevel ? (\n <Text size=\"xs\" fw={600}>\n H{editorState.currentHeadingLevel}\n </Text>\n ) : (\n <IconHeading size={12} />\n )}\n </ActionIcon>\n </Menu.Target>\n <Menu.Dropdown>\n <Menu.Label>Headings</Menu.Label>\n <Menu.Divider />\n {[1, 2, 3, 4, 5, 6].map(level => (\n <Menu.Item\n key={level}\n component=\"button\"\n onClick={() => handleHeadingChange(level as 1 | 2 | 3 | 4 | 5 | 6)}\n leftSection={editorState.currentHeadingLevel === level ? <IconCheck size={14} /> : null}\n >\n Heading {level}\n </Menu.Item>\n ))}\n </Menu.Dropdown>\n </Menu>\n\n <ToolbarButton\n active={editorState.isCodeBlock}\n onClick={() => (editor.chain() as any).focus().toggleCodeBlock().run()}\n icon={<IconCodeDots size={12} />}\n />\n\n <ToolbarButton\n active={editorState.isQuote}\n onClick={() => (editor.chain() as any).focus().toggleBlockquote().run()}\n icon={<IconQuote size={12} />}\n />\n\n <ToolbarButton\n active={editorState.isTaskList}\n onClick={() => (editor.chain() as any).focus().toggleTaskList().run()}\n icon={<IconListCheck size={12} />}\n />\n\n <Divider />\n\n <Menu shadow=\"md\" width={280} withinPortal>\n <Menu.Target>\n <ActionIcon\n size=\"sm\"\n variant={editorState.textAttrs.color ? 'filled' : 'light'}\n style={{ minWidth: 40 }}\n title=\"Text Color\"\n >\n <IconColorPicker size={12} />\n </ActionIcon>\n </Menu.Target>\n <Menu.Dropdown>\n <Group justify=\"space-between\" align=\"center\" pt=\"5\" pr=\"10\" gap=\"0\">\n <Menu.Label mb={0}>Text Color</Menu.Label>\n <ActionIcon\n size=\"sm\"\n variant=\"subtle\"\n onClick={() => editor.chain().focus().unsetColor().run()}\n title=\"Default\"\n >\n <IconRefreshDot size={16} />\n </ActionIcon>\n </Group>\n <Menu.Divider />\n <Group gap=\"xs\" wrap=\"wrap\" p=\"xs\">\n {['red', 'orange', 'yellow', 'green', 'blue', 'violet', 'pink', 'gray'].map(colorName => (\n <ActionIcon\n key={colorName}\n size=\"sm\"\n variant={editorState.textAttrs.color === theme.colors[colorName][6] ? 'filled' : 'light'}\n onClick={() => editor.chain().focus().setColor(theme.colors[colorName][6]).run()}\n color={colorName}\n title={colorName}\n >\n <IconCheck size={12} />\n </ActionIcon>\n ))}\n </Group>\n </Menu.Dropdown>\n </Menu>\n\n <Menu shadow=\"md\" width={280} withinPortal>\n <Menu.Target>\n <ActionIcon\n size=\"sm\"\n variant={editorState.bgAttrs.color ? 'filled' : 'light'}\n style={{ minWidth: 40 }}\n title=\"Highlight\"\n >\n <IconPalette size={12} />\n </ActionIcon>\n </Menu.Target>\n <Menu.Dropdown>\n <Group justify=\"space-between\" align=\"center\" pt=\"5\" pr=\"10\" gap=\"0\">\n <Menu.Label mb={0}>Background Color</Menu.Label>\n <ActionIcon\n size=\"sm\"\n variant=\"subtle\"\n onClick={() => editor.chain().focus().unsetBackgroundColor().run()}\n title=\"Default\"\n >\n <IconRefreshDot size={16} />\n </ActionIcon>\n </Group>\n <Menu.Divider />\n <Group gap=\"xs\" wrap=\"wrap\" p=\"xs\">\n {['red', 'orange', 'yellow', 'green', 'blue', 'violet', 'pink', 'gray'].map(colorName => (\n <ActionIcon\n key={colorName}\n size=\"sm\"\n variant={editorState.bgAttrs.color === colorName ? 'filled' : 'light'}\n onClick={() => editor.chain().focus().setBackgroundColor(colorName).run()}\n color={colorName}\n title={colorName}\n style={editorState.bgAttrs.color !== colorName ? { backgroundColor: isDark ? theme.colors[colorName][8] : theme.colors[colorName][1] } : undefined}\n >\n <IconCheck size={12} color={editorState.bgAttrs.color === colorName ? (isDark ? theme.white : 'inherit') : (isDark ? theme.white : theme.colors[colorName][9])} />\n </ActionIcon>\n ))}\n </Group>\n </Menu.Dropdown>\n </Menu>\n </Group>\n </TiptapBubbleMenu>\n\n <DocumentEditor\n editor={editor}\n opened={aiModalOpen}\n onClose={() => setAiModalOpen(false)}\n />\n </>\n )\n}\n\nconst ToolbarButton = ({ active, onClick, icon, color }: any) => (\n <ActionIcon\n size=\"sm\"\n variant={active ? 'filled' : 'subtle'}\n onClick={onClick}\n color={color}\n >\n {icon}\n </ActionIcon>\n)\n\nconst Divider = () => <Box w={1} h={16} bg=\"var(--mantine-color-default-border)\" mx={4} />\n\nconst bubbleStyle = {\n borderRadius: 4,\n boxShadow: '0 4px 12px rgba(0,0,0,0.15)',\n}","/**\n * @License OTMC License\n * @Copyright (c) 2026 OTMC Softwares. All rights reserved.\n * @Contributors Trung Ng, OTMC Authors.\n**/\nimport { Extension } from '@tiptap/core'\nimport Suggestion from '@tiptap/suggestion'\nimport { ReactRenderer } from '@tiptap/react'\nimport tippy from 'tippy.js'\nimport type { Instance as TippyInstance } from 'tippy.js'\nimport { forwardRef, useImperativeHandle, useState, useEffect, useRef } from 'react'\nimport { Box, Text, UnstyledButton } from '@mantine/core'\nimport type { CommandItem } from '../hooks/blockRegistry'\n\ninterface SlashCommandListProps {\n items: CommandItem[]\n command: (item: CommandItem) => void\n}\n\nexport const SlashCommandList = forwardRef((props: SlashCommandListProps, ref) => {\n const [selectedIndex, setSelectedIndex] = useState(0)\n const scrollRef = useRef<HTMLDivElement>(null)\n\n useEffect(() => setSelectedIndex(0), [props.items])\n\n const selectItem = (index: number) => {\n const item = props.items[index]\n if (item) {\n props.command(item)\n }\n }\n\n useImperativeHandle(ref, () => ({\n onKeyDown: ({ event }: { event: KeyboardEvent }) => {\n if (event.key === 'ArrowUp') {\n setSelectedIndex(prev => (prev - 1 + props.items.length) % props.items.length)\n return true\n }\n\n if (event.key === 'ArrowDown') {\n setSelectedIndex(prev => (prev + 1) % props.items.length)\n return true\n }\n\n if (event.key === 'Enter' || event.key === 'Tab') {\n selectItem(selectedIndex)\n return true\n }\n\n return false\n },\n }))\n\n useEffect(() => {\n const activeItem = scrollRef.current?.querySelector(`[data-index=\"${selectedIndex}\"]`)\n if (activeItem) {\n activeItem.scrollIntoView({ block: 'nearest', behavior: 'smooth' })\n }\n }, [selectedIndex])\n\n if (props.items.length === 0) {\n return (\n <Box p=\"xs\" bg=\"var(--mantine-color-body)\" style={{ borderRadius: 8, border: '1px solid var(--mantine-color-default-border)' }}>\n <Text size=\"xs\" c=\"dimmed\">\n Không tìm thấy kết quả...\n </Text>\n </Box>\n )\n }\n\n return (\n <Box\n ref={scrollRef}\n style={{\n background: 'var(--mantine-color-body)',\n backdropFilter: 'blur(12px)',\n border: '1px solid var(--mantine-color-default-border)',\n borderRadius: '12px',\n boxShadow: 'var(--mantine-shadow-xl)',\n padding: '4px',\n maxHeight: '320px',\n overflowY: 'auto',\n width: '300px',\n animation: 'slash-in 0.1s ease-out',\n }}\n >\n <style>{`\n @keyframes slash-in {\n from { opacity: 0; transform: translateY(5px); }\n to { opacity: 1; transform: translateY(0); }\n }\n `}</style>\n\n {props.items.map((item, index) => {\n const isSelected = index === selectedIndex\n return (\n <UnstyledButton\n key={item.title}\n data-index={index}\n onClick={() => selectItem(index)}\n onMouseEnter={() => setSelectedIndex(index)}\n style={{\n display: 'flex',\n width: '100%',\n padding: '8px 12px',\n borderRadius: '8px',\n gap: '12px',\n alignItems: 'center',\n backgroundColor: isSelected ? 'var(--mantine-color-blue-light)' : 'transparent',\n transition: 'background-color 0.1s ease',\n }}\n >\n <Box\n style={{\n width: '32px',\n height: '32px',\n borderRadius: '6px',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n backgroundColor: isSelected ? 'var(--mantine-color-default-hover)' : 'var(--mantine-color-default)',\n boxShadow: isSelected ? 'var(--mantine-shadow-xs)' : 'none',\n fontSize: '16px',\n color: isSelected ? 'var(--mantine-color-blue-filled)' : 'var(--mantine-color-default-color)',\n }}\n >\n {item.icon}\n </Box>\n <Box style={{ flex: 1 }}>\n <Text size=\"sm\" fw={isSelected ? 600 : 500} lh={1.2} c={isSelected ? 'var(--mantine-color-blue-filled)' : 'inherit'}>\n {item.title}\n </Text>\n <Text size=\"xs\" c=\"dimmed\" lh={1.2} mt={2}>\n {item.description}\n </Text>\n </Box>\n </UnstyledButton>\n )\n })}\n </Box>\n )\n})\n\nSlashCommandList.displayName = 'SlashCommandList'\n\nconst createSlashCommandRenderer = () => {\n let component: ReactRenderer | null = null\n let popup: TippyInstance | null = null\n\n return {\n onStart: (props: any) => {\n if (popup) {\n popup.destroy()\n popup = null\n }\n if (component) {\n component.destroy()\n component = null\n }\n\n component = new ReactRenderer(SlashCommandList, {\n props,\n editor: props.editor,\n })\n\n if (!props.clientRect) return\n\n popup = tippy('body', {\n getReferenceClientRect: props.clientRect,\n appendTo: () => document.body,\n content: component.element,\n showOnCreate: true,\n interactive: true,\n trigger: 'manual',\n placement: 'bottom-start',\n duration: [150, 0],\n })[0]\n },\n\n onUpdate(props: any) {\n component?.updateProps(props)\n\n if (props.clientRect && popup) {\n popup.setProps({\n getReferenceClientRect: props.clientRect,\n })\n }\n },\n\n onKeyDown(props: any) {\n if (props.event.key === 'Escape') {\n popup?.hide()\n return true\n }\n return (component?.ref as any)?.onKeyDown?.(props)\n },\n\n onExit() {\n popup?.destroy()\n component?.destroy()\n popup = null\n component = null\n },\n }\n}\n\nexport function createSlashCommand(options: {\n char: string\n items: (props: { editor: any; query: string }) => any[]\n}) {\n return Extension.create({\n name: 'slashCommand',\n\n addProseMirrorPlugins() {\n return [\n Suggestion({\n editor: this.editor,\n char: options.char,\n items: options.items,\n render: createSlashCommandRenderer,\n command: ({ editor, range, props }: any) => {\n editor.chain().focus().deleteRange(range).run()\n props.command({ editor, range })\n },\n }),\n ]\n },\n\n onDestroy() {\n },\n })\n}","/**\n * @License OTMC License\n * @Copyright (c) 2026 OTMC Softwares. All rights reserved.\n * @Contributors Trung Ng, OTMC Authors.\n**/\nimport { memo } from 'react'\nimport type { BlockNode } from '../hooks/blockRegistry'\nimport { getBlockByType } from '../hooks/blockRegistry'\n\ninterface BlockRendererProps {\n node: BlockNode\n editor?: any\n updateAttributes?: (attrs: any) => void\n deleteNode?: () => void\n}\n\nexport const BlockRenderer = memo(function BlockRenderer({\n node,\n editor,\n updateAttributes,\n deleteNode,\n}: BlockRendererProps) {\n const block = getBlockByType(node.type.name)\n\n if (!block) {\n return <div>{node.textContent}</div>\n }\n\n const Component = block.render\n\n return (\n <Component\n node={node}\n editor={editor}\n updateAttributes={updateAttributes}\n deleteNode={deleteNode}\n />\n )\n})\n","/**\n * @License OTMC License\n * @Copyright (c) 2026 OTMC Softwares. All rights reserved.\n * @Contributors Trung Ng, OTMC Authors.\n**/\nimport type { Editor } from '@tiptap/react'\nimport type { ComponentType } from 'react'\nimport type { ReactNodeViewProps } from '@tiptap/react'\nimport {\n IconH1,\n IconH2,\n IconH3,\n IconList,\n IconListNumbers,\n IconListCheck,\n IconCode,\n IconQuote,\n IconMinus,\n IconTable,\n IconPhoto,\n IconBold,\n IconItalic,\n IconNote,\n IconTimelineEvent,\n IconChartArea,\n} from '@tabler/icons-react'\n\nexport interface BlockNode {\n type: { name: string }\n attrs: Record<string, any>\n content: any[]\n textContent: string\n}\n\nexport interface BlockConfig {\n type: string\n label: string\n description?: string\n icon: React.ReactNode\n keywords?: string[]\n command: (editor: Editor) => void\n render: ComponentType<{ node: BlockNode; editor?: Editor; updateAttributes?: (attrs: any) => void; deleteNode?: () => void }>\n group?: 'block' | 'inline' | 'mark'\n}\n\nexport type CommandItem = {\n title: string\n description: string\n icon: React.ReactNode\n keywords?: string[]\n command: (props: { editor: Editor; range: any }) => void\n}\n\nexport type BlockComponent = ComponentType<ReactNodeViewProps>\n\nexport const BLOCKS: BlockConfig[] = []\n\nexport function registerBlock(block: BlockConfig) {\n const existingIndex = BLOCKS.findIndex(b => b.type === block.type)\n if (existingIndex !== -1) {\n BLOCKS[existingIndex] = block\n } else {\n BLOCKS.push(block)\n }\n}\n\nexport function getBlockByType(type: string): BlockConfig | undefined {\n return BLOCKS.find(b => b.type === type)\n}\n\nexport function filterBlocks(query: string): BlockConfig[] {\n const lowerQuery = query.toLowerCase()\n return BLOCKS.filter(\n block =>\n block.label.toLowerCase().includes(lowerQuery) ||\n block.description?.toLowerCase().includes(lowerQuery) ||\n block.keywords?.some(keyword => keyword.toLowerCase().includes(lowerQuery))\n )\n}\n\nexport function getDefaultBlockItems(editor: Editor): CommandItem[] {\n return [\n {\n title: 'Heading 1',\n description: 'Large section heading',\n icon: <IconH1 size={20} />,\n keywords: ['heading', 'title', 'h1'],\n command: () => (editor.chain() as any).focus().toggleHeading({ level: 1 }).run(),\n },\n {\n title: 'Heading 2',\n description: 'Medium section heading',\n icon: <IconH2 size={20} />,\n keywords: ['heading', 'subtitle', 'h2'],\n command: () => (editor.chain() as any).focus().toggleHeading({ level: 2 }).run(),\n },\n {\n title: 'Heading 3',\n description: 'Small section heading',\n icon: <IconH3 size={20} />,\n keywords: ['heading', 'subtitle', 'h3'],\n command: () => (editor.chain() as any).focus().toggleHeading({ level: 3 }).run(),\n },\n {\n title: 'Bullet List',\n description: 'Create a simple bullet list',\n icon: <IconList size={20} />,\n keywords: ['bullet', 'list', 'unordered'],\n command: () => (editor.chain() as any).focus().toggleBulletList().run(),\n },\n {\n title: 'Numbered List',\n description: 'Create a numbered list',\n icon: <IconListNumbers size={20} />,\n keywords: ['number', 'ordered', 'list'],\n command: () => (editor.chain() as any).focus().toggleOrderedList().run(),\n },\n {\n title: 'Task List',\n description: 'Create a checklist with checkboxes',\n icon: <IconListCheck size={20} />,\n keywords: ['task', 'checkbox', 'todo', 'checklist'],\n command: () => (editor.chain() as any).focus().toggleTaskList().run(),\n },\n {\n title: 'Code Block',\n description: 'Insert a code block with syntax highlighting',\n icon: <IconCode size={20} />,\n keywords: ['code', 'block', 'pre'],\n command: () => (editor.chain() as any).focus().toggleCodeBlock().run(),\n },\n {\n title: 'Quote',\n description: 'Insert a blockquote',\n icon: <IconQuote size={20} />,\n keywords: ['quote', 'blockquote', 'citation'],\n command: () => (editor.chain() as any).focus().toggleBlockquote().run(),\n },\n {\n title: 'Horizontal Rule',\n description: 'Insert a horizontal divider',\n icon: <IconMinus size={20} />,\n keywords: ['horizontal', 'rule', 'divider', 'line'],\n command: () => (editor.chain() as any).focus().setHorizontalRule().run(),\n },\n {\n title: 'Table',\n description: 'Insert a table',\n icon: <IconTable size={20} />,\n keywords: ['table', 'grid'],\n command: () => (editor.chain() as any).focus().insertTable({ rows: 3, cols: 3, withHeaderRow: true }).run(),\n },\n {\n title: 'Image',\n description: 'Insert an image from URL or file',\n icon: <IconPhoto size={20} />,\n keywords: ['image', 'picture', 'photo'],\n command: ({ editor }: { editor: Editor }) => {\n const choice = window.confirm(\n 'Click OK to select an image file, or Cancel to enter a URL.'\n )\n \n if (choice) {\n const input = document.createElement('input')\n input.type = 'file'\n input.accept = 'image/*'\n input.onchange = (e) => {\n const file = (e.target as HTMLInputElement).files?.[0]\n if (file) {\n const reader = new FileReader()\n reader.onload = (event) => {\n const src = event.target?.result as string\n editor.chain().focus().setImage({ src, alt: file.name }).run()\n }\n reader.readAsDataURL(file)\n }\n }\n input.click()\n } else {\n const url = prompt('Enter image URL:')\n if (url) {\n editor.chain().focus().setImage({ src: url }).run()\n }\n }\n },\n },\n {\n title: 'Bold',\n description: 'Make text bold',\n icon: <IconBold size={20} />,\n keywords: ['bold', 'strong'],\n command: () => (editor.chain() as any).focus().toggleBold().run(),\n },\n {\n title: 'Italic',\n description: 'Make text italic',\n icon: <IconItalic size={20} />,\n keywords: ['italic', 'em'],\n command: () => (editor.chain() as any).focus().toggleItalic().run(),\n },\n {\n title: 'Notice',\n description: 'Insert a notice callout box',\n icon: <IconNote size={20} />,\n keywords: ['info', 'warning', 'callout', 'notice'],\n command: () => {\n (editor.chain() as any).focus().setNotice({ variant: 'warning', title: 'Notice' }).run()\n },\n },\n {\n title: 'Timeline',\n description: 'Create a visual timeline of events',\n icon: <IconTimelineEvent size={20} />,\n keywords: ['timeline', 'events', 'history', 'chronology'],\n command: () => {\n (editor.chain() as any).focus().setTimeline().run()\n },\n },\n {\n title: 'Diagram',\n description: 'Insert a Mermaid diagram (flowchart, sequence, etc.)',\n icon: <IconChartArea size={20} />,\n keywords: ['diagram', 'mermaid', 'flowchart', 'sequence', 'chart', 'graph'],\n command: () => {\n (editor.chain() as any).focus().setDiagram().run()\n },\n },\n ]\n}\n","/**\n * @License OTMC License\n * @Copyright (c) 2026 OTMC Softwares. All rights reserved.\n * @Contributors Trung Ng, OTMC Authors.\n**/\nimport { Node, mergeAttributes } from '@tiptap/core'\nimport { ReactNodeViewRenderer } from '@tiptap/react'\nimport type { BlockComponent } from '../hooks/blockRegistry'\n\nexport interface CreateBlockNodeOptions {\n name: string\n group?: string\n content?: string\n draggable?: boolean\n defining?: boolean\n component?: BlockComponent\n}\n\nexport function createBlockNode(options: CreateBlockNodeOptions) {\n const {\n name,\n group = 'block',\n content = 'inline*',\n draggable = false,\n defining = true,\n component,\n } = options\n\n return Node.create({\n name,\n group,\n content,\n draggable,\n defining,\n\n parseHTML() {\n return [{ tag: `div[data-type=\"${name}\"]` }]\n },\n\n renderHTML({ HTMLAttributes }) {\n return ['div', mergeAttributes(HTMLAttributes, { 'data-type': name }), 0]\n },\n\n addNodeView() {\n if (!component) {\n return null\n }\n return ReactNodeViewRenderer(component)\n },\n\n addAttributes() {\n return {\n variant: {\n default: null,\n parseHTML: element => element.getAttribute('data-variant'),\n renderHTML: attributes => ({ 'data-variant': attributes.variant }),\n },\n title: {\n default: null,\n parseHTML: element => element.getAttribute('data-title'),\n renderHTML: attributes => ({ 'data-title': attributes.title }),\n },\n checked: {\n default: false,\n parseHTML: element => element.getAttribute('data-checked') === 'true',\n renderHTML: attributes => ({ 'data-checked': attributes.checked }),\n },\n language: {\n default: null,\n parseHTML: element => element.getAttribute('data-language'),\n renderHTML: attributes => ({ 'data-language': attributes.language }),\n },\n }\n },\n\n addCommands() {\n return {\n [`set${name.charAt(0).toUpperCase() + name.slice(1)}`]:\n (attrs?: Record<string, any>) =>\n ({ commands }: any) => {\n return commands.insertContent({\n type: this.name,\n attrs,\n content: content ? [{ type: 'paragraph' }] : [],\n })\n },\n } as any\n },\n })\n}\n","/**\n * @License OTMC License\n * @Copyright (c) 2026 OTMC Softwares. All rights reserved.\n * @Contributors Trung Ng, OTMC Authors.\n**/\nimport MarkdownIt from 'markdown-it';\n\nconst md = new MarkdownIt({\n html: true,\n breaks: false,\n linkify: true,\n});\n\nmd.block.ruler.before('paragraph', 'table', (state, startLine, endLine, silent) => {\n const startPos = state.bMarks[startLine] + state.tShift[startLine];\n const endPos = state.eMarks[startLine];\n const firstLine = state.src.slice(startPos, endPos).trim();\n \n if (!firstLine.startsWith('|') && !firstLine.startsWith('|-')) {\n return false;\n }\n \n let nextLine = startLine;\n const rows: string[] = [];\n \n while (nextLine < endLine) {\n const rowStart = state.bMarks[nextLine] + state.tShift[nextLine];\n const rowEnd = state.eMarks[nextLine];\n const rowText = state.src.slice(rowStart, rowEnd).trim();\n \n if (!rowText.startsWith('|')) {\n break;\n }\n \n rows.push(rowText);\n nextLine++;\n }\n \n if (rows.length < 2) {\n return false;\n }\n \n const separatorRow = rows[1].trim();\n if (!/^[\\s|:\\-]+$/.test(separatorRow)) {\n return false;\n }\n \n if (silent) {\n return true;\n }\n \n const parseCells = (row: string, cellType: string) => {\n const cells = row.split('|').filter(c => c.trim() !== '');\n cells.forEach(cellText => {\n state.push(cellType + '_open', cellType, 1);\n const inline = state.push('inline', '', 0);\n inline.content = cellText.trim();\n inline.children = [];\n state.push(cellType + '_close', cellType, -1);\n });\n };\n \n const tableOpen = state.push('table_open', 'table', 1);\n tableOpen.map = [startLine, nextLine];\n \n state.push('thead_open', 'thead', 1);\n state.push('tr_open', 'tr', 1);\n parseCells(rows[0], 'th');\n state.push('tr_close', 'tr', -1);\n state.push('thead_close', 'thead', -1);\n \n state.push('tbody_open', 'tbody', 1);\n for (let i = 2; i < rows.length; i++) {\n state.push('tr_open', 'tr', 1);\n parseCells(rows[i], 'td');\n state.push('tr_close', 'tr', -1);\n }\n state.push('tbody_close', 'tbody', -1);\n \n state.push('table_close', 'table', -1);\n \n state.line = nextLine;\n return true;\n}, { alt: ['paragraph', 'reference', 'blockquote'] });\n\nexport const markdownToTiptapJSON = (markdown: string): string => {\n if (!markdown || !markdown.trim()) {\n return JSON.stringify({ type: 'doc', content: [] });\n }\n\n try {\n const parsed = JSON.parse(markdown);\n if (parsed.type === 'doc') {\n return markdown;\n }\n } catch {\n }\n\n const tokens = md.parse(markdown, {});\n const content: any[] = convertTokensToTiptap(tokens);\n\n return JSON.stringify({ type: 'doc', content });\n};\n\nconst convertTokensToTiptap = (tokens: any[]): any[] => {\n const content: any[] = [];\n let i = 0;\n\n while (i < tokens.length) {\n const token = tokens[i];\n\n switch (token.type) {\n case 'heading_open': {\n const level = parseInt(token.tag.replace('h', ''));\n const inline = tokens[i + 1];\n const text = inline?.content || '';\n content.push({\n type: 'heading',\n attrs: { level },\n content: text ? parseInline(text) : []\n });\n i += 3;\n break;\n }\n\n case 'paragraph_open': {\n const inline = tokens[i + 1];\n if (inline?.type === 'inline' && inline.content?.trim()) {\n content.push({\n type: 'paragraph',\n content: parseInline(inline.content)\n });\n }\n i += 3;\n break;\n }\n\n case 'table_open': {\n const tableContent: any[] = [];\n let j = i + 1;\n \n while (j < tokens.length && tokens[j].type !== 'table_close') {\n const t = tokens[j];\n \n if (t.type === 'tr_open') {\n const rowCells: any[] = [];\n let k = j + 1;\n \n while (k < tokens.length && tokens[k].type !== 'tr_close') {\n const cell = tokens[k];\n if (cell.type === 'th_open' || cell.type === 'td_open') {\n const cellType = cell.type === 'th_open' ? 'tableHeader' : 'tableCell';\n const inline = tokens[k + 1];\n const cellContent: any[] = inline?.content \n ? [{ type: 'paragraph', content: parseInline(inline.content) }]\n : [{ type: 'paragraph', content: [] }];\n \n rowCells.push({\n type: cellType,\n attrs: { colspan: 1, rowspan: 1, colwidth: null },\n content: cellContent\n });\n k += 3;\n } else {\n k++;\n }\n }\n \n tableContent.push({\n type: 'tableRow',\n content: rowCells\n });\n j = k + 1;\n } else {\n j++;\n }\n }\n \n content.push({\n type: 'table',\n content: tableContent\n });\n i = j + 1;\n break;\n }\n\n case 'bullet_list_open': {\n const items: any[] = [];\n let j = i + 1;\n let isTaskList = false;\n\n let peekJ = j;\n while (peekJ < tokens.length && tokens[peekJ].type !== 'bullet_list_close') {\n if (tokens[peekJ].type === 'list_item_open' && tokens[peekJ + 1]?.type === 'paragraph_open') {\n const inline = tokens[peekJ + 2];\n if (inline?.type === 'inline' && inline.content?.match(/^\\[[ xX]\\]/)) {\n isTaskList = true;\n break;\n }\n }\n peekJ++;\n }\n\n while (j < tokens.length && tokens[j].type !== 'bullet_list_close') {\n if (tokens[j].type === 'list_item_open') {\n const itemContent: any[] = [];\n let k = j + 1;\n\n while (k < tokens.length && tokens[k].type !== 'list_item_close') {\n if (tokens[k].type === 'paragraph_open' && tokens[k + 1]?.type === 'inline') {\n const text = tokens[k + 1].content;\n if (text?.trim()) {\n const taskMatch = text.match(/^\\[([ xX])\\]\\s*(.*)/);\n \n if (isTaskList && taskMatch) {\n const checked = taskMatch[1].toLowerCase() === 'x';\n const remainingText = taskMatch[2];\n itemContent.push({\n type: 'taskItem',\n attrs: { checked },\n content: remainingText.trim()\n ? [{ type: 'paragraph', content: parseInline(remainingText) }]\n : [{ type: 'paragraph', content: [] }]\n });\n } else {\n itemContent.push({\n type: 'listItem',\n content: [{\n type: 'paragraph',\n content: parseInline(text)\n }]\n });\n }\n }\n k += 3;\n } else {\n k++;\n }\n }\n\n items.push(...itemContent);\n j = k + 1;\n } else {\n j++;\n }\n }\n\n if (isTaskList) {\n content.push({\n type: 'taskList',\n content: items\n });\n } else {\n content.push({\n type: 'bulletList',\n attrs: { tight: true },\n content: items\n });\n }\n i = j + 1;\n break;\n }\n\n case 'ordered_list_open': {\n const items: any[] = [];\n let j = i + 1;\n \n while (j < tokens.length && tokens[j].type !== 'ordered_list_close') {\n if (tokens[j].type === 'list_item_open') {\n const itemContent: any[] = [];\n let k = j + 1;\n \n while (k < tokens.length && tokens[k].type !== 'list_item_close') {\n if (tokens[k].type === 'paragraph_open' && tokens[k + 1]?.type === 'inline') {\n const text = tokens[k + 1].content;\n if (text?.trim()) {\n itemContent.push({\n type: 'paragraph',\n content: parseInline(text)\n });\n }\n k += 3;\n } else {\n k++;\n }\n }\n \n items.push({\n type: 'listItem',\n content: itemContent.length ? itemContent : [{ type: 'paragraph', content: [] }]\n });\n j = k + 1;\n } else {\n j++;\n }\n }\n \n content.push({\n type: 'orderedList',\n attrs: { start: 1 },\n content: items\n });\n i = j + 1;\n break;\n }\n\n case 'blockquote_open': {\n const quoteContent: any[] = [];\n let j = i + 1;\n \n while (j < tokens.length && tokens[j].type !== 'blockquote_close') {\n if (tokens[j].type === 'paragraph_open' && tokens[j + 1]?.type === 'inline') {\n const text = tokens[j + 1].content;\n quoteContent.push({\n type: 'paragraph',\n content: parseInline(text)\n });\n j += 3;\n } else {\n j++;\n }\n }\n \n content.push({\n type: 'blockquote',\n content: quoteContent\n });\n i = j + 1;\n break;\n }\n\n case 'fence':\n case 'code_block': {\n const language = token.info?.trim() || '';\n content.push({\n type: 'codeBlock',\n attrs: { language },\n content: [{ type: 'text', text: token.content }]\n });\n i++;\n break;\n }\n\n case 'hr':\n content.push({ type: 'horizontalRule' });\n i++;\n break;\n\n default:\n i++;\n }\n }\n\n return content;\n};\n\nconst parseInline = (text: string): any[] => {\n const nodes: any[] = [];\n let remaining = text;\n\n while (remaining.length > 0) {\n const codeMatch = remaining.match(/^`([^`]+)`/);\n if (codeMatch) {\n nodes.push({ type: 'text', text: codeMatch[1], marks: [{ type: 'code' }] });\n remaining = remaining.slice(codeMatch[0].length);\n continue;\n }\n\n const boldItalicMatch = remaining.match(/^\\*\\*\\*([^*]+)\\*\\*\\*/);\n if (boldItalicMatch) {\n nodes.push({\n type: 'text',\n text: boldItalicMatch[1],\n marks: [{ type: 'bold' }, { type: 'italic' }]\n });\n remaining = remaining.slice(boldItalicMatch[0].length);\n continue;\n }\n\n const boldMatch = remaining.match(/^\\*\\*([^*]+)\\*\\*/);\n if (boldMatch) {\n nodes.push({ type: 'text', text: boldMatch[1], marks: [{ type: 'bold' }] });\n remaining = remaining.slice(boldMatch[0].length);\n continue;\n }\n\n const italicMatch = remaining.match(/^\\*([^*]+)\\*/);\n if (italicMatch) {\n nodes.push({ type: 'text', text: italicMatch[1], marks: [{ type: 'italic' }] });\n remaining = remaining.slice(italicMatch[0].length);\n continue;\n }\n\n const linkMatch = remaining.match(/^\\[([^\\]]+)\\]\\(([^)]+)\\)/);\n if (linkMatch) {\n nodes.push({\n type: 'text',\n text: linkMatch[1],\n marks: [{ type: 'link', attrs: { href: linkMatch[2] } }]\n });\n remaining = remaining.slice(linkMatch[0].length);\n continue;\n }\n\n const nextSpecial = remaining.match(/^[^`*\\[\\\\]+/);\n if (nextSpecial) {\n nodes.push({ type: 'text', text: nextSpecial[0] });\n remaining = remaining.slice(nextSpecial[0].length);\n } else {\n nodes.push({ type: 'text', text: remaining[0] });\n remaining = remaining.slice(1);\n }\n }\n\n return nodes.length ? nodes : [{ type: 'text', text }];\n};\n\nexport const isTiptapJSON = (content: string): boolean => {\n if (!content) return false;\n try {\n const parsed = JSON.parse(content);\n return parsed.type === 'doc';\n } catch {\n return false;\n }\n};\n\nexport const migrateToTiptapJSON = (content: string): string => {\n if (isTiptapJSON(content)) {\n return content;\n }\n return markdownToTiptapJSON(content);\n};\n"],"mappings":";;;;;;;;;;;;;;;;;AAKA,SAAS,QAAAA,OAAM,YAAAC,WAAU,eAAAC,cAAa,WAAAC,UAAS,aAAAC,kBAAiB;AAChE,SAAS,yBAAAC,wBAAuB,mBAAAC,kBAAiB,YAAY;;;ACA7D,SAAS,iBAAiB;AAC1B,SAAS,aAAAC,YAAW,UAAAC,eAAc;;;ACA3B,IAAM,gBAAgB,CAAC,MAAW,kBAA2B,UAAkB;AACpF,MAAI,CAAC,KAAM,QAAO;AAElB,MAAI,KAAK,QAAQ;AACf,QAAI,OAAO,KAAK,QAAQ;AACxB,UAAM,QAAQ,KAAK,SAAS,CAAC;AAE7B,UAAM,OAAO,MAAM,KAAK,CAAC,MAAW,EAAE,KAAK,SAAS,MAAM;AAC1D,UAAM,SAAS,MAAM,KAAK,CAAC,MAAW,EAAE,KAAK,SAAS,QAAQ;AAC9D,UAAM,OAAO,MAAM,KAAK,CAAC,MAAW,EAAE,KAAK,SAAS,MAAM;AAC1D,UAAM,OAAO,MAAM,KAAK,CAAC,MAAW,EAAE,KAAK,SAAS,MAAM;AAC1D,UAAM,YAAY,MAAM,KAAK,CAAC,MAAW,EAAE,KAAK,SAAS,WAAW;AACpE,UAAM,QAAQ,WAAW,OAAO;AAChC,UAAM,cAAc,MAAM,KAAK,CAAC,MAAW,EAAE,KAAK,SAAS,iBAAiB;AAC5E,UAAM,kBAAkB,aAAa,OAAO;AAE5C,QAAI,MAAM;AACR,aAAO,KAAK,IAAI;AAAA,IAClB,OAAO;AACL,UAAI,iBAAiB;AACnB,YAAI,KAAM,QAAO,WAAW,IAAI;AAChC,YAAI,OAAQ,QAAO,OAAO,IAAI;AAC9B,YAAI,MAAO,QAAO,uBAAuB,KAAK,KAAK,IAAI;AACvD,YAAI,gBAAiB,QAAO,wBAAwB,eAAe,KAAK,IAAI;AAAA,MAC9E,OAAO;AACL,YAAI,KAAM,QAAO,KAAK,IAAI;AAC1B,YAAI,OAAQ,QAAO,IAAI,IAAI;AAAA,MAC7B;AACA,UAAI,KAAM,QAAO,IAAI,IAAI,KAAK,KAAK,MAAM,IAAI;AAC7C,UAAI,CAAC,mBAAmB,OAAO;AAC7B,eAAO,uBAAuB,KAAK,KAAK,IAAI;AAAA,MAC9C;AACA,UAAI,CAAC,mBAAmB,iBAAiB;AACvC,eAAO,wBAAwB,eAAe,KAAK,IAAI;AAAA,MACzD;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAEA,MAAI,UAAU;AACd,MAAI,KAAK,WAAW,KAAK,QAAQ,SAAS;AACxC,cAAU,KAAK,QAAQ,QAAQ,IAAI,CAAC,UAAe,cAAc,KAAK,CAAC,EAAE,KAAK,EAAE;AAAA,EAClF;AAEA,UAAQ,KAAK,KAAK,MAAM;AAAA,IACtB,KAAK;AACH,aAAO;AAAA,IAET,KAAK,aAAa;AAChB,YAAM,kBAAkB,KAAK,OAAO;AACpC,UAAI,iBAAiB;AACnB,cAAMC,WAAU,KAAK,QAAQ,QAAQ,IAAI,CAAC,UAAe,cAAc,OAAO,IAAI,CAAC,EAAE,KAAK,EAAE;AAC5F,eAAO,+BAA+B,eAAe,KAAKA,QAAO;AAAA,MACnE;AACA,aAAO;AAAA,IACT;AAAA,IAEA,KAAK,WAAW;AACd,YAAM,QAAQ,KAAK,OAAO,SAAS;AACnC,YAAM,kBAAkB,KAAK,OAAO;AACpC,UAAI,iBAAiB;AACnB,cAAMA,WAAU,KAAK,QAAQ,QAAQ,IAAI,CAAC,UAAe,cAAc,OAAO,IAAI,CAAC,EAAE,KAAK,EAAE;AAC5F,eAAO,KAAK,KAAK,6BAA6B,eAAe,KAAKA,SAAQ,KAAK,CAAC,MAAM,KAAK;AAAA,MAC7F;AACA,YAAM,SAAS,IAAI,OAAO,KAAK;AAC/B,aAAO,GAAG,MAAM,IAAI,QAAQ,KAAK,CAAC;AAAA,IACpC;AAAA,IAEA,KAAK,cAAc;AACjB,YAAM,QAAkB,CAAC;AACzB,iBAAW,QAAQ,KAAK,SAAS,WAAW,CAAC,GAAG;AAC9C,cAAM,WAAW,cAAc,IAAI,EAAE,KAAK;AAC1C,cAAM,KAAK,KAAK,QAAQ,EAAE;AAAA,MAC5B;AACA,aAAO,MAAM,KAAK,IAAI;AAAA,IACxB;AAAA,IAEA,KAAK,eAAe;AAClB,YAAM,QAAkB,CAAC;AACzB,UAAI,QAAQ,KAAK,OAAO,SAAS;AACjC,iBAAW,QAAQ,KAAK,SAAS,WAAW,CAAC,GAAG;AAC9C,cAAM,WAAW,cAAc,IAAI,EAAE,KAAK;AAC1C,cAAM,KAAK,GAAG,KAAK,KAAK,QAAQ,EAAE;AAClC;AAAA,MACF;AACA,aAAO,MAAM,KAAK,IAAI;AAAA,IACxB;AAAA,IAEA,KAAK,YAAY;AACf,YAAM,UAAU,KAAK,OAAO,UAAU,QAAQ;AAC9C,YAAM,WAAW,QAAQ,KAAK;AAC9B,aAAO,KAAK,OAAO,IAAI,QAAQ;AAAA,IACjC;AAAA,IAEA,KAAK,YAAY;AACf,YAAM,QAAkB,CAAC;AACzB,iBAAW,QAAQ,KAAK,SAAS,WAAW,CAAC,GAAG;AAC9C,cAAM,WAAW,cAAc,IAAI,EAAE,KAAK;AAC1C,cAAM,KAAK,QAAQ;AAAA,MACrB;AACA,aAAO,MAAM,KAAK,IAAI;AAAA,IACxB;AAAA,IAEA,KAAK,cAAc;AACjB,YAAM,QAAQ,QAAQ,KAAK,EAAE,MAAM,IAAI;AACvC,aAAO,MAAM,IAAI,UAAQ,KAAK,IAAI,EAAE,EAAE,KAAK,IAAI;AAAA,IACjD;AAAA,IAEA,KAAK,aAAa;AAChB,YAAM,WAAW,KAAK,OAAO,YAAY;AACzC,aAAO,SAAS,QAAQ;AAAA,EAAK,OAAO;AAAA;AAAA,IACtC;AAAA,IAEA,KAAK;AACH,aAAO;AAAA,IAET,KAAK;AACH,aAAO;AAAA,IAET,KAAK;AACH,YAAM,MAAM,KAAK,OAAO,OAAO;AAC/B,YAAM,MAAM,KAAK,OAAO,OAAO;AAC/B,aAAO,KAAK,GAAG,KAAK,GAAG;AAAA,IAEzB,KAAK,UAAU;AACb,YAAM,UAAU,KAAK,OAAO,WAAW;AACvC,YAAM,QAAQ,KAAK,OAAO,SAAS;AACnC,YAAM,kBAAkB,KAAK,OAAO;AACpC,YAAM,cAAc,KAAK,QAAQ,QAAQ,IAAI,CAAC,UAAe,cAAc,OAAO,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,KAAK;AAEvG,UAAI,OAAO,yCAAyC,OAAO,iBAAiB,KAAK;AACjF,UAAI,iBAAiB;AACnB,gBAAQ,6BAA6B,eAAe;AAAA,MACtD;AACA,cAAQ,IAAI,WAAW;AACvB,aAAO;AAAA,IACT;AAAA,IAEA,KAAK,SAAS;AACZ,YAAM,OAAiB,CAAC;AACxB,UAAI,cAAc;AAClB,iBAAW,OAAO,KAAK,SAAS,WAAW,CAAC,GAAG;AAC7C,cAAM,QAAkB,CAAC;AACzB,mBAAW,QAAQ,IAAI,SAAS,WAAW,CAAC,GAAG;AAC7C,gBAAM,KAAK,cAAc,IAAI,EAAE,KAAK,CAAC;AAAA,QACvC;AACA,aAAK,KAAK,KAAK,MAAM,KAAK,KAAK,CAAC,IAAI;AAEpC,YAAI,gBAAgB,GAAG;AACrB,gBAAM,aAAa,MAAM,IAAI,MAAM,KAAK;AACxC,eAAK,KAAK,KAAK,WAAW,KAAK,KAAK,CAAC,IAAI;AACzC;AAAA,QACF;AAAA,MACF;AACA,aAAO,KAAK,KAAK,IAAI;AAAA,IACvB;AAAA,IAEA;AACE,aAAO;AAAA,EACX;AACF;AAEO,IAAM,sBAAsB,CAAC,WAA2B;AAC7D,MAAI,CAAC,OAAQ,QAAO;AAEpB,QAAM,QAAQ,OAAO,MAAM,IAAI,QAAQ;AACvC,QAAM,UAAoB,CAAC;AAE3B,aAAW,QAAQ,OAAO;AACxB,UAAM,aAAa,cAAc,IAAI;AACrC,QAAI,cAAc,KAAK,KAAK,SAAS,aAAa;AAChD,cAAQ,KAAK,UAAU;AAAA,IACzB;AAAA,EACF;AAEA,SAAO,QAAQ,KAAK,MAAM;AAC5B;AAEO,IAAM,+BAA+B,CAAC,QAAgB,MAAc,OAAuB;AAChG,MAAI,CAAC,OAAQ,QAAO;AAEpB,QAAM,EAAE,IAAI,IAAI,OAAO;AACvB,QAAM,QAAQ,IAAI,QAAQ,IAAI;AAE9B,WAAS,QAAQ,MAAM,OAAO,QAAQ,GAAG,SAAS;AAChD,UAAM,OAAO,MAAM,KAAK,KAAK;AAC7B,QAAI,CAAC,cAAc,eAAe,UAAU,EAAE,SAAS,KAAK,KAAK,IAAI,GAAG;AACtE,aAAO,cAAc,IAAI;AAAA,IAC3B;AAAA,EACF;AAEA,QAAM,gBAAgB,IAAI,MAAM,MAAM,EAAE;AACxC,QAAM,UAAoB,CAAC;AAE3B,gBAAc,QAAQ,QAAQ,QAAQ,CAAC,SAAc;AACnD,UAAM,aAAa,cAAc,IAAI;AACrC,QAAI,cAAc,KAAK,KAAK,SAAS,aAAa;AAChD,cAAQ,KAAK,UAAU;AAAA,IACzB;AAAA,EACF,CAAC;AAED,SAAO,QAAQ,KAAK,MAAM;AAC5B;;;ADzMA,OAAO,gBAAgB;;;AEJvB,SAAS,yBAAyB;AAClC,SAAS,6BAA6B;AACtC,SAAS,gBAAgB,cAAc;;;ACDvC,SAAS,UAAU,MAAM,SAAS,mBAAmB;AACrD,SAAS,iBAAiB,uBAAgD;AAC1E,SAAS,YAAY,OAAAC,MAAK,MAAM,iBAAiB,cAAc;AAC/D,SAAS,WAAW,UAAU,UAAU,uBAAuB;;;ACJ/D,SAAS,WAA0B;AAS/B;AAFG,SAAS,aAAa,EAAE,UAAU,UAAU,GAAG,MAAM,GAAsB;AAChF,SACE;AAAA,IAAC;AAAA;AAAA,MACC,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,OAAO;AAAA,QACL,cAAc;AAAA,QACd,iBAAiB,WAAW,oCAAoC;AAAA,QAChE,YAAY;AAAA,MACd;AAAA,MACC,GAAG;AAAA,MAEH;AAAA;AAAA,EACH;AAEJ;;;ADyBM,SAiBE,OAAAC,MAjBF;AAtCN,IAAM,mBAAmB;AAAA,EACvB,EAAE,OAAO,IAAI,OAAO,aAAa;AAAA,EACjC,EAAE,OAAO,QAAQ,OAAO,OAAO;AAAA,EAC/B,EAAE,OAAO,cAAc,OAAO,aAAa;AAAA,EAC3C,EAAE,OAAO,OAAO,OAAO,MAAM;AAAA,EAC7B,EAAE,OAAO,KAAK,OAAO,IAAI;AAAA,EACzB,EAAE,OAAO,MAAM,OAAO,SAAS;AAAA,EAC/B,EAAE,OAAO,UAAU,OAAO,SAAS;AAAA,EACnC,EAAE,OAAO,QAAQ,OAAO,OAAO;AAAA,EAC/B,EAAE,OAAO,UAAU,OAAO,KAAK;AAAA,EAC/B,EAAE,OAAO,QAAQ,OAAO,OAAO;AAAA,EAC/B,EAAE,OAAO,cAAc,OAAO,aAAa;AAAA,EAC3C,EAAE,OAAO,cAAc,OAAO,aAAa;AAAA,EAC3C,EAAE,OAAO,OAAO,OAAO,MAAM;AAAA,EAC7B,EAAE,OAAO,QAAQ,OAAO,OAAO;AAAA,EAC/B,EAAE,OAAO,SAAS,OAAO,QAAQ;AAAA,EACjC,EAAE,OAAO,UAAU,OAAO,SAAS;AAAA,EACnC,EAAE,OAAO,OAAO,OAAO,MAAM;AAAA,EAC7B,EAAE,OAAO,QAAQ,OAAO,OAAO;AAAA,EAC/B,EAAE,OAAO,OAAO,OAAO,MAAM;AAAA,EAC7B,EAAE,OAAO,QAAQ,OAAO,OAAO;AAAA,EAC/B,EAAE,OAAO,OAAO,OAAO,MAAM;AAAA,EAC7B,EAAE,OAAO,QAAQ,OAAO,OAAO;AACjC;AAEA,IAAM,kBAAkB;AAAA,EACtB,CAAC;AAAA,IACC;AAAA,IACA;AAAA,IACA;AAAA,EACF,MAIM;AACJ,QAAI,CAAC,SAAU,QAAO;AAEtB,WACE;AAAA,MAAC;AAAA;AAAA,QACC,KAAI;AAAA,QACJ,KAAK;AAAA,QACL,MAAM;AAAA,QACN,MAAK;AAAA,QACL,GAAG,SAAS,MAAM,OAAO,KAAK,CAAC,IAAI,MAAM,OAAO,KAAK,CAAC;AAAA,QACtD,OAAO;AAAA,UACL,QAAQ;AAAA,UACR,eAAe;AAAA,UACf,UAAU;AAAA,UACV,YAAY;AAAA,UACZ,SAAS;AAAA,UACT,YAAY;AAAA,UACZ,eAAe;AAAA,UACf,KAAK;AAAA,QACP;AAAA,QAEA;AAAA,0BAAAA,KAAC,YAAS,MAAM,IAAI;AAAA,UACnB;AAAA;AAAA;AAAA,IACH;AAAA,EAEJ;AACF;AAEA,gBAAgB,cAAc;AAEvB,SAAS,UAAU,EAAE,MAAM,kBAAkB,SAAS,GAAuB;AAClF,QAAM,CAAC,QAAQ,SAAS,IAAI,SAAS,KAAK;AAE1C,QAAM,EAAE,aAAa,IAAI,SAAS;AAClC,QAAM,QAAQ,gBAAgB;AAC9B,QAAM,SAAS,iBAAiB;AAEhC,QAAM,WAAW,KAAK,OAAO,YAAY;AAEzC,QAAM,aAAa,YAAY,YAAY;AACzC,UAAM,UAAU,MAAM,gBAAgB,KAAK,WAAW;AACtD,QAAI,SAAS;AACX,gBAAU,IAAI;AACd,iBAAW,MAAM,UAAU,KAAK,GAAG,IAAI;AAAA,IACzC;AAAA,EACF,GAAG,CAAC,KAAK,WAAW,CAAC;AAErB,QAAM,uBAAuB;AAAA,IAC3B,CAAC,UAAyB;AACxB,uBAAiB,EAAE,UAAU,SAAS,GAAG,CAAC;AAAA,IAC5C;AAAA,IACA,CAAC,gBAAgB;AAAA,EACnB;AAEA,QAAM,WAAW;AAAA,IACf,OAAO;AAAA,MACL,QAAQ,aAAa,SAAS,MAAM,OAAO,KAAK,CAAC,IAAI,MAAM,OAAO,KAAK,CAAC,CAAC;AAAA,MACzE,cAAc;AAAA,MACd,SAAS;AAAA,MACT,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,YAAY,SAAS,YAAY;AAAA,MACjC,QAAQ;AAAA,MACR,UAAU;AAAA,IACZ;AAAA,IACA,CAAC,QAAQ,KAAK;AAAA,EAChB;AAEA,SACE,qBAAC,mBAAgB,WAAU,sBACzB;AAAA,oBAAAA,KAAC,gBAAa,UACZ;AAAA,MAACC;AAAA,MAAA;AAAA,QACC,KAAI;AAAA,QACJ,IAAI,SAAS,MAAM,OAAO,KAAK,CAAC,IAAI,MAAM,OAAO,KAAK,CAAC;AAAA,QACvD,OAAO,EAAE,cAAc,GAAG;AAAA,QAE1B;AAAA,0BAAAD;AAAA,YAACC;AAAA,YAAA;AAAA,cACC,KAAI;AAAA,cACJ,KAAK;AAAA,cACL,OAAO;AAAA,cACP,OAAO;AAAA,gBACL,QAAQ;AAAA,gBACR,SAAS;AAAA,gBACT,YAAY;AAAA,gBACZ,KAAK;AAAA,cACP;AAAA,cAEA,0BAAAD;AAAA,gBAAC;AAAA;AAAA,kBACC,OAAO;AAAA,kBACP,UAAU;AAAA,kBACV,MAAM;AAAA,kBACN,MAAK;AAAA,kBACL,GAAG;AAAA,kBACH,eAAe;AAAA,oBACb,UAAU;AAAA,oBACV,cAAc;AAAA,kBAChB;AAAA,kBACA,cAAc,gBAAAA,KAAC,mBAAgB,MAAM,IAAI;AAAA,kBACzC,aAAa,gBAAAA,KAAC,YAAS,MAAM,IAAI,OAAO,SAAS,MAAM,OAAO,KAAK,CAAC,IAAI,MAAM,OAAO,KAAK,CAAC,GAAG;AAAA,kBAC9F,aAAY;AAAA,kBACZ,WAAW;AAAA,kBACX,YAAY;AAAA,kBACZ,QAAQ;AAAA,oBACN,OAAO;AAAA,sBACL,YAAY,SAAS,YAAY;AAAA,sBACjC,aAAa,SAAS,MAAM,OAAO,KAAK,CAAC,IAAI,MAAM,OAAO,KAAK,CAAC;AAAA,sBAChE,QAAQ;AAAA,sBACR,WAAW;AAAA,sBACX,cAAc;AAAA,oBAChB;AAAA,oBACA,UAAU;AAAA,sBACR,cAAc;AAAA,oBAChB;AAAA,kBACF;AAAA;AAAA,cACF;AAAA;AAAA,UACF;AAAA,UAEA,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACC,KAAI;AAAA,cACJ,KAAK;AAAA,cACL,OAAO;AAAA,cACP,OAAO,SAAS,SAAS;AAAA,cACzB,SAAQ;AAAA,cACR,QAAO;AAAA,cACP,SAAS;AAAA,cACT,OAAO,EAAE,QAAQ,EAAE;AAAA,cACnB,OAAO,SAAS,YAAY;AAAA,cAE3B,mBAAS,gBAAAA,KAAC,aAAU,OAAM,SAAQ,MAAM,IAAI,IAAK,gBAAAA,KAAC,YAAS,MAAM,IAAI;AAAA;AAAA,UACxE;AAAA,UAEA,gBAAAA,KAAC,SAAI,OAAO,UAAU,WAAW,SAAS,cAAc,cACtD,0BAAAA,KAAC,UACC,0BAAAA,KAAC,mBAAgB,GACnB,GACF;AAAA;AAAA;AAAA,IACF,GACF;AAAA,IACE,gBAAAA,KAAC,WAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,SA+IR;AAAA,KACJ;AAEJ;;;ADnUA,SAAS,iBAAiB;AAC1B,SAAS,qBAAqB;AAE9B,IAAM,WAAW,eAAe,MAAM;AAE/B,IAAM,qBAAqB,kBAAkB,OAAO;AAAA,EACzD,gBAAgB;AACd,WAAO;AAAA,MACL,UAAU;AAAA,QACR,SAAS;AAAA,QACT,WAAW,QAAM,GAAG,aAAa,eAAe,KAAK;AAAA,QACrD,YAAY,WACV,MAAM,WAAW,EAAE,iBAAiB,MAAM,SAAS,IAAI,CAAC;AAAA,MAC5D;AAAA,IACF;AAAA,EACF;AAAA,EAEA,cAAc;AACZ,WAAO,sBAAsB,SAAgB;AAAA,EAC/C;AAAA,EAEA,uBAAuB;AACrB,WAAO;AAAA,MACL,WAAW,MAAM;AACf,cAAM,EAAE,MAAM,IAAI,KAAK;AACvB,cAAM,EAAE,WAAW,OAAO,IAAI;AAC9B,cAAM,EAAE,OAAO,MAAM,IAAI;AAEzB,YAAI,CAAC,MAAO,QAAO;AAEnB,cAAM,OAAO,MAAM,KAAK;AACxB,YAAI,KAAK,SAAS,KAAK,KAAM,QAAO;AAEpC,cAAM,UACJ,CAAC,KAAK,eAAe,KAAK,gBAAgB;AAE5C,YAAI,CAAC,QAAS,QAAO;AAErB,cAAM,MAAM,MAAM,OAAO,MAAM,KAAK;AACpC,cAAM,KAAK,MAAM;AAEjB,WAAG,YAAY,KAAK,MAAM,KAAK,QAAQ;AAEvC,cAAM,YAAY,OAAO,MAAM,UAAU;AAAA,UACvC;AAAA,UACA,OAAO,KAAK,QAAQ;AAAA,QACtB;AAEA,WAAG,OAAO,KAAK,SAAS;AACxB,WAAG,aAAa,cAAc,OAAO,GAAG,KAAK,MAAM,CAAC,CAAC;AAErD,aAAK,OAAO,KAAK,SAAS,EAAE;AAC5B,eAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF;AAAA,EAEA,gBAAgB;AACd,UAAM,OAAO,KAAK;AAElB,WAAO;AAAA,MACL,IAAI,UAAU;AAAA,QACZ,MAAM;AAAA,QACN,SAAS,CAAC,EAAE,OAAO,OAAO,MAAM,MAAM;AACpC,gBAAM,EAAE,GAAG,IAAI;AACf,gBAAM,SAAS,GAAG,IAAI,QAAQ,MAAM,IAAI;AAExC,cACE,CAAC,OACE,KAAK,EAAE,EACP,eAAe,OAAO,MAAM,EAAE,GAAG,OAAO,WAAW,EAAE,GAAG,IAAI,EAC/D;AAEF,gBAAM,QAAQ,MAAM,CAAC,KAAK,IAAI,YAAY;AAE1C,aAAG,OAAO,MAAM,MAAM,MAAM,EAAE;AAE9B,gBAAM,OAAO,KAAK;AAAA,YAChB,EAAE,UAAU,KAAK;AAAA,YACjB,MAAM,OAAO,KAAK,QAAQ;AAAA,UAC5B;AAEA,gBAAM,MAAM,GAAG,QAAQ,IAAI,MAAM,IAAI;AAErC,aAAG,OAAO,KAAK,IAAI;AAEnB,gBAAM,OAAO,GAAG,IAAI,QAAQ,MAAM,CAAC;AACnC,aAAG,aAAa,cAAc,KAAK,IAAI,CAAC;AAExC,eAAK,OAAO,KAAK,SAAS,EAAE;AAAA,QAC9B;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AACF,CAAC,EAAE,UAAU;AAAA,EACX;AAAA,EACA,gBAAgB;AAAA,IACd,OAAO;AAAA,EACT;AACF,CAAC;;;AGvGD,OAAO,cAAc;AACrB,SAAS,yBAAAE,8BAA6B;;;ACDtC,SAAS,mBAAAC,kBAAiB,mBAAAC,wBAAgD;AAC1E,SAAS,UAAU,mBAAAC,kBAAiB,6BAA6B;AACjE,SAAS,QAAAC,OAAM,eAAAC,oBAAmB;AA2B9B,SAYE,OAAAC,MAZF,QAAAC,aAAA;AApBJ,SAAS,UAAU,kBAAqD;AACtE,SAAOF;AAAA,IACL,CAAC,YAAqB;AACpB,uBAAiB,EAAE,QAAQ,CAAC;AAAA,IAC9B;AAAA,IACA,CAAC,gBAAgB;AAAA,EACnB;AACF;AAEO,IAAM,YAAYD,MAAK,CAAC,EAAE,MAAM,iBAAiB,MAA0B;AAChF,QAAM,QAAQD,iBAAgB;AAC9B,QAAM,EAAE,YAAY,IAAI,sBAAsB;AAC9C,QAAM,YAAY,KAAK,MAAM;AAC7B,QAAM,SAAS,UAAU,gBAAgB;AAEzC,QAAM,YAAY,YACb,gBAAgB,SAAS,MAAM,OAAO,MAAM,CAAC,IAAI,MAAM,OAAO,MAAM,CAAC,IACrE,gBAAgB,SAAS,MAAM,OAAO,KAAK,CAAC,IAAI,MAAM,OAAO,KAAK,CAAC;AAExE,SACE,gBAAAI;AAAA,IAACN;AAAA,IAAA;AAAA,MACC,IAAG;AAAA,MACH,aAAU;AAAA,MACV,gBAAc;AAAA,MACd,OAAO;AAAA,QACL,QAAQ;AAAA,QACR,YAAY;AAAA,QACZ,SAAS;AAAA,QACT,YAAY;AAAA,QACZ,KAAK;AAAA,MACP;AAAA,MAEA;AAAA,wBAAAK;AAAA,UAAC;AAAA;AAAA,YACC,SAAS;AAAA,YACT,UAAU,OAAK,OAAO,EAAE,cAAc,OAAO;AAAA,YAC7C,MAAK;AAAA,YACL,QAAQ;AAAA,cACN,MAAM;AAAA,gBACJ,SAAS;AAAA,gBACT,YAAY;AAAA,cACd;AAAA,cACA,OAAO;AAAA,gBACL,QAAQ;AAAA,gBACR,OAAO;AAAA,gBACP,QAAQ;AAAA,cACV;AAAA,YACF;AAAA;AAAA,QACF;AAAA,QAEA,gBAAAA;AAAA,UAACJ;AAAA,UAAA;AAAA,YACC,IAAG;AAAA,YACH,OAAO;AAAA,cACL,MAAM;AAAA,cACN,OAAO;AAAA,cACP,YAAY;AAAA,cACZ,SAAS,YAAY,MAAM;AAAA,cAC3B,gBAAgB,YAAY,iBAAiB;AAAA,YAC/C;AAAA;AAAA,QACF;AAAA,QAEA,gBAAAI,KAAC,WAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,SAMN;AAAA;AAAA;AAAA,EACJ;AAEJ,CAAC;AAED,UAAU,cAAc;;;AD5EjB,IAAM,oBAAoB,SAAS,OAAO;AAAA,EAC/C,cAAc;AACZ,WAAOE,uBAAsB,SAAS;AAAA,EACxC;AACF,CAAC;;;AERD,SAAS,MAAM,uBAAuB;AACtC,SAAS,yBAAAC,8BAA6B;;;ACDtC,SAAS,mBAAAC,kBAAiB,mBAAAC,wBAAgD;AAC1E,SAAS,OAAO,cAAAC,aAAY,MAAM,WAAW,OAAAC,YAAW;AACxD;AAAA,EACE;AAAA,EACA;AAAA,EACA,aAAAC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAIkB,gBAAAC,MAoCX,QAAAC,aApCW;AADzB,IAAM,WAAW;AAAA,EACf,EAAE,OAAO,QAAQ,MAAM,gBAAAD,KAAC,kBAAe,MAAM,IAAI,GAAI,OAAO,QAAQ,OAAO,eAAY;AAAA,EACvF,EAAE,OAAO,WAAW,MAAM,gBAAAA,KAACE,YAAA,EAAU,MAAM,IAAI,GAAI,OAAO,QAAQ,OAAO,mBAAa;AAAA,EACtF,EAAE,OAAO,WAAW,MAAM,gBAAAF,KAAC,uBAAoB,MAAM,IAAI,GAAI,OAAO,UAAU,OAAO,mBAAW;AAAA,EAChG,EAAE,OAAO,SAAS,MAAM,gBAAAA,KAAC,mBAAgB,MAAM,IAAI,GAAI,OAAO,OAAO,OAAO,WAAM;AACpF;AAEO,SAAS,YAAY,EAAE,MAAM,kBAAkB,WAAW,GAAuB;AACtF,QAAM,EAAE,UAAU,QAAQ,QAAQ,OAAO,IAAK,KAAa,SAAS,CAAC;AACrE,QAAM,iBAAiB,SAAS,KAAK,OAAK,EAAE,UAAU,OAAO,KAAK,SAAS,CAAC;AAE5E,SACE,gBAAAC,MAACE,kBAAA,EAAgB,WAAU,wBACzB;AAAA,oBAAAH,KAAC,gBACC,0BAAAC,MAACG,MAAA,EAAI,OAAO,EAAE,UAAU,WAAW,GACjC;AAAA,sBAAAJ;AAAA,QAAC;AAAA;AAAA,UACC,OAAO;AAAA,YACL,UAAU;AAAA,YACV,KAAK;AAAA,YACL,OAAO;AAAA,YACP,QAAQ;AAAA,YACR,SAAS;AAAA,YACT,KAAK;AAAA,UACP;AAAA,UAEA,0BAAAC,MAAC,QAAK,QAAO,MAAK,OAAO,KAAK,UAAS,cAAa,WAAS,MAC3D;AAAA,4BAAAD,KAAC,KAAK,QAAL,EACC,0BAAAA;AAAA,cAACK;AAAA,cAAA;AAAA,gBACC,SAAQ;AAAA,gBACR,OAAM;AAAA,gBACN,MAAK;AAAA,gBACL,WAAU;AAAA,gBACV,OAAO,EAAE,SAAS,IAAI;AAAA,gBAEtB,0BAAAL,KAAC,gBAAa,MAAM,IAAI;AAAA;AAAA,YAC1B,GACF;AAAA,YACA,gBAAAC,MAAC,KAAK,UAAL,EACC;AAAA,8BAAAD,KAAC,KAAK,OAAL,EAAW,0CAAa;AAAA,cACxB,SAAS,IAAI,OACZ,gBAAAA;AAAA,gBAAC,KAAK;AAAA,gBAAL;AAAA,kBAEC,aAAa,EAAE;AAAA,kBACf,SAAS,MAAM,mBAAmB,EAAE,SAAS,EAAE,MAAM,CAAC;AAAA,kBACtD,OAAO,EAAE,UAAU,GAAG;AAAA,kBAErB,YAAE;AAAA;AAAA,gBALE,EAAE;AAAA,cAMT,CACD;AAAA,cACD,gBAAAA,KAAC,KAAK,SAAL,EAAa;AAAA,cACd,gBAAAA;AAAA,gBAAC,KAAK;AAAA,gBAAL;AAAA,kBACC,OAAM;AAAA,kBACN,aAAa,gBAAAA,KAAC,aAAU,MAAM,IAAI;AAAA,kBAClC,SAAS,MAAM,aAAa;AAAA,kBAC7B;AAAA;AAAA,cAED;AAAA,eACF;AAAA,aACF;AAAA;AAAA,MACF;AAAA,MAEA,gBAAAC;AAAA,QAAC;AAAA;AAAA,UACC,SAAQ;AAAA,UACR,OAAO,eAAe;AAAA,UACtB,MAAM,eAAe;AAAA,UACrB,QAAO;AAAA,UACP,QAAQ;AAAA,YACN,MAAM;AAAA,cACJ,SAAS;AAAA,cACT,QAAQ;AAAA,cACR,iBAAiB,uBAAuB,eAAe,KAAK;AAAA,cAC5D,YAAY,iCAAiC,eAAe,KAAK;AAAA,YACnE;AAAA,YACA,MAAM;AAAA,cACJ,aAAa;AAAA,cACb,WAAW;AAAA,YACb;AAAA,YACA,SAAS;AAAA,cACP,KAAK;AAAA,YACP;AAAA,UACF;AAAA,UAEA;AAAA,4BAAAD;AAAA,cAAC;AAAA;AAAA,gBACC,aAAY;AAAA,gBACZ,SAAQ;AAAA,gBACR,OAAO;AAAA,gBACP,UAAU,OAAK,mBAAmB,EAAE,OAAO,EAAE,OAAO,MAAM,CAAC;AAAA,gBAC3D,QAAQ;AAAA,kBACN,OAAO;AAAA,oBACL,YAAY;AAAA,oBACZ,UAAU;AAAA,oBACV,WAAW;AAAA,oBACX,SAAS;AAAA,oBACT,QAAQ;AAAA,oBACR,OAAO,uBAAuB,eAAe,KAAK;AAAA,oBAClD,eAAe;AAAA,kBACjB;AAAA,gBACF;AAAA;AAAA,YACF;AAAA,YAEA,gBAAAA,KAACI,MAAA,EAAI,OAAO,EAAE,WAAW,QAAQ,cAAc,QAAQ,UAAU,WAAW,YAAY,IAAI,GAC1F,0BAAAJ,KAACM,kBAAA,EAAgB,WAAU,uBAAsB,GACnD;AAAA;AAAA;AAAA,MACF;AAAA,OACF,GACF;AAAA,IAEA,gBAAAN,KAAC,WAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,SAUN;AAAA,KACJ;AAEJ;;;ADhIO,IAAM,kBAAkB,KAAK,OAAO;AAAA,EACzC,MAAM;AAAA,EACN,OAAO;AAAA,EACP,SAAS;AAAA,EACT,UAAU;AAAA,EACV,WAAW;AAAA,EAEX,gBAAgB;AACd,WAAO;AAAA,MACL,SAAS;AAAA,QACP,SAAS;AAAA,QACT,WAAW,aAAW,QAAQ,aAAa,cAAc;AAAA,QACzD,YAAY,iBAAe,EAAE,gBAAgB,WAAW,QAAQ;AAAA,MAClE;AAAA,MACA,OAAO;AAAA,QACL,SAAS;AAAA,QACT,WAAW,aAAW,QAAQ,aAAa,YAAY;AAAA,QACvD,YAAY,iBAAe,EAAE,cAAc,WAAW,MAAM;AAAA,MAC9D;AAAA,IACF;AAAA,EACF;AAAA,EAEA,YAAY;AACV,WAAO,CAAC,EAAE,KAAK,0BAA0B,CAAC;AAAA,EAC5C;AAAA,EAEA,WAAW,EAAE,eAAe,GAAG;AAC7B,WAAO,CAAC,OAAO,gBAAgB,gBAAgB,EAAE,aAAa,SAAS,CAAC,GAAG,CAAC;AAAA,EAC9E;AAAA,EAEA,cAAc;AACZ,WAAOO,uBAAsB,WAAW;AAAA,EAC1C;AAAA,EAEA,cAAc;AACZ,WAAO;AAAA,MACL,WACE,CAAC,UACD,CAAC,EAAE,SAAS,MAAW;AACrB,eAAO,SAAS,cAAc;AAAA,UAC5B,MAAM,KAAK;AAAA,UACX;AAAA,UACA,SAAS,CAAC,EAAE,MAAM,YAAY,CAAC;AAAA,QACjC,CAAC;AAAA,MACH;AAAA,MACF,cAAc,MAAM,CAAC,EAAE,SAAS,MAAW;AACzC,eAAO,SAAS,WAAW,KAAK,MAAM,WAAW;AAAA,MACnD;AAAA,IACF;AAAA,EACF;AACF,CAAC;;;AEtDD,SAAS,QAAAC,OAAM,mBAAAC,wBAAuB;AACtC,SAAS,yBAAAC,8BAA6B;;;ACDtC,SAAS,mBAAAC,wBAAgD;AACzD;AAAA,EACE,OAAAC;AAAA,EACA,cAAAC;AAAA,EACA,QAAAC;AAAA,EACA,aAAAC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,QAAAC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP;AAAA,EACE,gBAAAC;AAAA,EACA,aAAAC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,aAAAC;AAAA,OACK;AAEP,SAAS,YAAAC,WAAU,eAAAC,oBAAmB;AA4ER,gBAAAC,MAUhB,QAAAC,aAVgB;AA9D9B,IAAM,aAAa,MAAM,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,UAAU,CAAC;AAExD,SAAS,cAAc,EAAE,MAAM,kBAAkB,WAAW,GAAuB;AACxF,QAAM,EAAE,QAAQ,CAAC,GAAG,SAAS,EAAE,IAAK,KAAK;AACzC,QAAM,CAAC,YAAY,aAAa,IAAIH,UAAS,KAAK;AAClD,QAAM,CAAC,eAAe,gBAAgB,IAAIA,UAAwB,IAAI;AAEtE,QAAM,oBAAoBC,aAAY,CAAC,aAA6B;AAClE,qBAAiB,EAAE,OAAO,SAAS,CAAC;AAAA,EACtC,GAAG,CAAC,gBAAgB,CAAC;AAErB,QAAM,kBAAkBA,aAAY,MAAM;AACxC,UAAM,UAAwB;AAAA,MAC5B,IAAI,WAAW;AAAA,MACf,OAAO;AAAA,MACP,aAAa;AAAA,MACb,OAAM,oBAAI,KAAK,GAAE,mBAAmB,OAAO;AAAA,IAC7C;AACA,sBAAkB,CAAC,GAAG,OAAO,OAAO,CAAC;AACrC,qBAAiB,QAAQ,EAAE;AAC3B,kBAAc,IAAI;AAAA,EACpB,GAAG,CAAC,OAAO,iBAAiB,CAAC;AAE7B,QAAM,qBAAqB,CAAC,OAAe,YAAmC;AAC5E,UAAM,WAAW,CAAC,GAAG,KAAK;AAC1B,aAAS,KAAK,IAAI,EAAE,GAAG,SAAS,KAAK,GAAG,GAAG,QAAQ;AACnD,sBAAkB,QAAQ;AAAA,EAC5B;AAEA,QAAM,qBAAqB,CAAC,UAAkB;AAC5C,UAAM,WAAW,MAAM,OAAO,CAAC,GAAG,MAAM,MAAM,KAAK;AACnD,sBAAkB,QAAQ;AAC1B,qBAAiB,IAAI;AAAA,EACvB;AAEA,SACE,gBAAAE,MAACC,kBAAA,EAAgB,WAAU,kBACzB;AAAA,oBAAAF,KAAC,gBACC,0BAAAC;AAAA,MAAC;AAAA;AAAA,QACC,YAAU;AAAA,QACV,GAAE;AAAA,QACF,QAAO;AAAA,QACP,KAAI;AAAA,QACJ,OAAO,EAAE,YAAY,yBAAyB;AAAA,QAE9C;AAAA,0BAAAA;AAAA,YAAC;AAAA;AAAA,cACC,KAAK;AAAA,cACL,KAAI;AAAA,cACJ,KAAK;AAAA,cACL,OAAO;AAAA,cACP,OAAO,EAAE,QAAQ,GAAG;AAAA,cAEpB;AAAA,gCAAAD,KAAC,WAAQ,OAAO,aAAa,wBAAc,uBACzC,0BAAAA;AAAA,kBAACG;AAAA,kBAAA;AAAA,oBACC,MAAK;AAAA,oBACL,SAAQ;AAAA,oBACR,OAAO,aAAa,SAAS;AAAA,oBAC7B,SAAS,MAAM;AACb,oCAAc,CAAC,UAAU;AACzB,uCAAiB,IAAI;AAAA,oBACvB;AAAA,oBAEC,uBAAa,gBAAAH,KAAC,WAAQ,MAAM,IAAI,IAAK,gBAAAA,KAAC,YAAS,MAAM,IAAI;AAAA;AAAA,gBAC5D,GACF;AAAA,gBAEA,gBAAAC,MAACG,OAAA,EAAK,UAAS,cAAa,cAAY,MAAC,QAAO,MAC9C;AAAA,kCAAAJ,KAACI,MAAK,QAAL,EACC,0BAAAJ,KAACG,aAAA,EAAW,MAAK,MAAK,SAAQ,UAAS,OAAM,QAC3C,0BAAAH,KAACK,eAAA,EAAa,MAAM,IAAI,GAC1B,GACF;AAAA,kBACA,gBAAAJ,MAACG,MAAK,UAAL,EACC;AAAA,oCAAAJ,KAACI,MAAK,MAAL,EAAU,aAAa,gBAAAJ,KAAC,YAAS,MAAM,IAAG,GAAI,SAAS,iBAAiB,uCAAY;AAAA,oBACrF,gBAAAA,KAACI,MAAK,SAAL,EAAa;AAAA,oBACd,gBAAAJ,KAACI,MAAK,MAAL,EAAU,OAAM,OAAM,aAAa,gBAAAJ,KAACM,YAAA,EAAU,MAAM,IAAG,GAAI,SAAS,MAAM,WAAW,GAAG,0BAAS;AAAA,qBACpG;AAAA,mBACF;AAAA;AAAA;AAAA,UACF;AAAA,UAEA,gBAAAN,KAAC,YAAS,QAAgB,YAAY,IAAI,WAAW,GAClD,gBAAM,IAAI,CAAC,MAAM,UAAU;AAC1B,kBAAM,gBAAgB,kBAAkB,KAAK,MAAM;AAEnD,mBACE,gBAAAA;AAAA,cAAC,SAAS;AAAA,cAAT;AAAA,gBAEC,QACE,gBAAAA;AAAA,kBAAC;AAAA;AAAA,oBACC,SAAS,MAAM,iBAAiB,EAAE,QAAQ,MAAM,CAAC;AAAA,oBACjD,OAAO;AAAA,sBACL,UAAU,IAAI,EAAE;AAAA,sBAChB,YAAY;AAAA,sBACZ,WAAW;AAAA,sBACX,OAAO;AAAA,oBACT;AAAA,oBAEC,kBAAQ;AAAA;AAAA,gBACX;AAAA,gBAGF,0BAAAA;AAAA,kBAACO;AAAA,kBAAA;AAAA,oBACC,GAAE;AAAA,oBACF,OAAO;AAAA,sBACL,cAAc;AAAA,sBACd,QAAQ,gBACJ,8CACA;AAAA,sBACJ,iBAAiB,gBACb,0CACA;AAAA,sBACJ,YAAY;AAAA,oBACd;AAAA,oBAEC,0BACC,gBAAAN,MAAC,SAAM,KAAI,MACT;AAAA,sCAAAD;AAAA,wBAACQ;AAAA,wBAAA;AAAA,0BACC,SAAQ;AAAA,0BACR,aAAY;AAAA,0BACZ,OAAO,KAAK;AAAA,0BACZ,UAAU,CAAC,MAAM,mBAAmB,OAAO,EAAE,MAAM,EAAE,cAAc,MAAM,CAAC;AAAA,0BAC1E,MAAK;AAAA,0BACL,aAAa,gBAAAR,KAAC,gBAAa,MAAM,IAAI;AAAA,0BACrC,QAAQ,EAAE,OAAO,EAAE,WAAW,GAAG,QAAQ,IAAI,EAAE,EAAE,EAAC;AAAA;AAAA,sBACpD;AAAA,sBACA,gBAAAA;AAAA,wBAACQ;AAAA,wBAAA;AAAA,0BACC,SAAQ;AAAA,0BACR,aAAY;AAAA,0BACZ,OAAO,KAAK;AAAA,0BACZ,UAAU,CAAC,MAAM,mBAAmB,OAAO,EAAE,OAAO,EAAE,cAAc,MAAM,CAAC;AAAA,0BAC3E,IAAI;AAAA,0BACJ,MAAK;AAAA,0BACL,QAAQ,EAAE,OAAO,EAAE,WAAW,GAAG,QAAQ,IAAI,EAAE,GAAG,UAAU,IAAI,EAAE,EAAE,EAAC;AAAA;AAAA,sBACvE;AAAA,sBACA,gBAAAR;AAAA,wBAAC;AAAA;AAAA,0BACC,SAAQ;AAAA,0BACR,aAAY;AAAA,0BACZ,OAAO,KAAK;AAAA,0BACZ,UAAU,CAAC,MAAM,mBAAmB,OAAO,EAAE,aAAa,EAAE,cAAc,MAAM,CAAC;AAAA,0BACjF,MAAK;AAAA,0BACL,UAAQ;AAAA,0BACR,SAAS;AAAA,0BACT,QAAQ,EAAE,OAAO,EAAE,SAAS,GAAG,YAAY,IAAI,EAAC;AAAA;AAAA,sBAClD;AAAA,sBACA,gBAAAC,MAAC,SAAM,SAAQ,YAAW,KAAK,GAC7B;AAAA,wCAAAD,KAACG,aAAA,EAAW,MAAK,MAAK,OAAM,OAAM,SAAQ,UAAS,SAAS,MAAM,mBAAmB,KAAK,GACxF,0BAAAH,KAACM,YAAA,EAAU,MAAM,IAAI,GACvB;AAAA,wBACA,gBAAAN,KAACG,aAAA,EAAW,MAAK,MAAK,OAAM,QAAO,SAAQ,SAAQ,SAAS,MAAM,iBAAiB,IAAI,GACrF,0BAAAH,KAACS,YAAA,EAAU,MAAM,IAAI,GACvB;AAAA,yBACF;AAAA,uBACF,IAEA,gBAAAR;AAAA,sBAACM;AAAA,sBAAA;AAAA,wBACC,SAAS,MAAM,cAAc,iBAAiB,KAAK,EAAE;AAAA,wBACrD,OAAO,EAAE,QAAQ,aAAa,YAAY,UAAU;AAAA,wBAEpD;AAAA,0CAAAP,KAAC,SAAM,KAAK,GAAG,IAAI,GAChB,eAAK,OACJ,gBAAAA,KAAC,SAAM,MAAK,MAAK,SAAQ,OAAM,OAAM,QAAQ,eAAK,MAAK,IACrD,cACF,gBAAAA,KAACU,OAAA,EAAK,MAAK,MAAK,GAAE,UAAS,IAAG,UAAS,gCAAY,GAEvD;AAAA,0BACA,gBAAAV,KAACU,OAAA,EAAK,MAAK,MAAK,IAAI,KAAK,GAAG,KAAK,QAAQ,YAAY,UAClD,eAAK,UAAU,aAAa,6DAA4B,sCAC3D;AAAA,0BACA,gBAAAV,KAACU,OAAA,EAAK,MAAK,MAAK,GAAE,UAAS,WAAW,GAAG,IAAI,GAC1C,eAAK,gBAAgB,aAAa,6BAAkB,KACvD;AAAA;AAAA;AAAA,oBACF;AAAA;AAAA,gBAEJ;AAAA;AAAA,cAvFK,KAAK;AAAA,YAwFZ;AAAA,UAEJ,CAAC,GACH;AAAA,UAEC,cACC,gBAAAV;AAAA,YAAC;AAAA;AAAA,cACC,SAAQ;AAAA,cACR,WAAS;AAAA,cACT,IAAG;AAAA,cACH,MAAK;AAAA,cACL,aAAa,gBAAAA,KAAC,YAAS,MAAM,IAAI;AAAA,cACjC,SAAS;AAAA,cACT,OAAM;AAAA,cACP;AAAA;AAAA,UAED;AAAA;AAAA;AAAA,IAEJ,GACF;AAAA,IAEA,gBAAAA,KAAC,WAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,SAON;AAAA,KACJ;AAEJ;;;ADnPO,IAAM,oBAAoBW,MAAK,OAAO;AAAA,EAC3C,MAAM;AAAA,EACN,OAAO;AAAA,EACP,WAAW;AAAA,EACX,WAAW;AAAA,EAEX,gBAAgB;AACd,WAAO;AAAA,MACL,OAAO;AAAA,QACL,SAAS,CAAC;AAAA,QACV,WAAW,aAAW;AACpB,gBAAM,OAAO,QAAQ,aAAa,YAAY;AAC9C,iBAAO,OAAO,KAAK,MAAM,IAAI,IAAI,CAAC;AAAA,QACpC;AAAA,QACA,YAAY,iBAAe;AAAA,UACzB,cAAc,KAAK,UAAU,WAAW,KAAK;AAAA,QAC/C;AAAA,MACF;AAAA,MACA,QAAQ;AAAA,QACN,SAAS;AAAA,QACT,WAAW,aAAW,SAAS,QAAQ,aAAa,aAAa,KAAK,KAAK,EAAE;AAAA,QAC7E,YAAY,iBAAe;AAAA,UACzB,eAAe,WAAW;AAAA,QAC5B;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,YAAY;AACV,WAAO,CAAC,EAAE,KAAK,4BAA4B,CAAC;AAAA,EAC9C;AAAA,EAEA,WAAW,EAAE,eAAe,GAAG;AAC7B,WAAO,CAAC,OAAOC,iBAAgB,gBAAgB,EAAE,aAAa,WAAW,CAAC,CAAC;AAAA,EAC7E;AAAA,EAEA,cAAc;AACZ,WAAOC,uBAAsB,aAAa;AAAA,EAC5C;AAAA,EAEA,cAAc;AACZ,WAAO;AAAA,MACL,aACE,MACA,CAAC,EAAE,SAAS,MAAW;AACrB,eAAO,SAAS,cAAc;AAAA,UAC5B,MAAM,KAAK;AAAA,UACX,OAAO;AAAA,YACL,OAAO,CAAC;AAAA,YACR,QAAQ;AAAA,UACV;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACJ;AAAA,EACF;AACF,CAAC;;;AE3DD,SAAS,QAAAC,OAAM,mBAAAC,wBAAuB;AACtC,SAAS,yBAAAC,8BAA6B;;;ACAtC,SAAS,mBAAAC,wBAAgD;AACzD;AAAA,EACE,OAAAC;AAAA,EACA,cAAAC;AAAA,EACA,QAAAC;AAAA,EACA,YAAAC;AAAA,EACA,UAAAC;AAAA,EACA,QAAAC;AAAA,EACA,UAAAC;AAAA,EACA,SAAAC;AAAA,EACA,SAAAC;AAAA,EACA,SAAAC;AAAA,EACA,WAAAC;AAAA,EACA;AAAA,EACA,OAAAC;AAAA,OACK;AACP;AAAA,EACE,gBAAAC;AAAA,EACA,aAAAC;AAAA,EACA;AAAA,EACA,WAAAC;AAAA,EACA,YAAAC;AAAA,EACA,mBAAAC;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAEP,SAAS,YAAAC,WAAU,WAAW,QAAQ,eAAAC,oBAAmB;AACzD,OAAO,aAAa;AAoFR,SACE,OAAAC,MADF,QAAAC,aAAA;AAlFZ,IAAM,gBAAgB;AAAA,EACpB,EAAE,OAAO,SAAS,OAAO,aAAa,SAAS,+IAAgG;AAAA,EAC/I,EAAE,OAAO,mBAAmB,OAAO,oBAAoB,SAAS,gFAAgF;AAAA,EAChJ,EAAE,OAAO,gBAAgB,OAAO,iBAAiB,SAAS,oFAAoF;AAAA,EAC9I,EAAE,OAAO,mBAAmB,OAAO,iBAAiB,SAAS,qFAAqF;AAAA,EAClJ,EAAE,OAAO,aAAa,OAAO,cAAc,SAAS,2CAA2C;AAAA,EAC/F,EAAE,OAAO,OAAO,OAAO,aAAa,SAAS,mEAA2D;AAC1G;AAEO,SAAS,aAAa,EAAE,MAAM,kBAAkB,WAAW,GAAuB;AACvF,QAAM,EAAE,OAAO,IAAI,OAAO,QAAQ,IAAI,KAAK;AAC3C,QAAM,CAAC,WAAW,YAAY,IAAIH,UAAS,CAAC,IAAI;AAChD,QAAM,CAAC,cAAc,eAAe,IAAIA,UAAwB,IAAI;AACpE,QAAM,CAAC,WAAW,YAAY,IAAIA,UAAS,IAAI;AAC/C,QAAM,aAAa,OAAuB,IAAI;AAE9C,QAAM,sBAAsB,uBAAuB,OAAO;AAE1D,YAAU,MAAM;AACd,YAAQ,WAAW;AAAA,MACjB,aAAa;AAAA,MACb,OAAO,wBAAwB,SAAS,SAAS;AAAA,MACjD,eAAe;AAAA,MACf,YAAY;AAAA,MACZ,MAAM;AAAA,IACR,CAAC;AAAA,EACH,GAAG,CAAC,mBAAmB,CAAC;AAExB,QAAM,gBAAgBC,aAAY,OAAO,iBAAyB;AAChE,QAAI,CAAC,WAAW,WAAW,CAAC,aAAa,KAAK,EAAG;AAEjD,QAAI;AACF,sBAAgB,IAAI;AACpB,iBAAW,QAAQ,YAAY;AAE/B,YAAM,KAAK,WAAW,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,OAAO,GAAG,CAAC,CAAC;AAC7D,YAAM,EAAE,IAAI,IAAI,MAAM,QAAQ,OAAO,IAAI,YAAY;AAErD,UAAI,WAAW,SAAS;AACtB,mBAAW,QAAQ,YAAY;AAAA,MACjC;AAAA,IACF,SAAS,OAAY;AACnB,sBAAgB,OAAO,OAAO,OAAO,WAAW,gCAAqB;AAAA,IACvE;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,YAAU,MAAM;AACd,QAAI,CAAC,aAAa,WAAW;AAC3B,oBAAc,SAAS;AAAA,IACzB;AAAA,EACF,GAAG,CAAC,WAAW,WAAW,eAAe,mBAAmB,CAAC;AAE7D,QAAM,aAAa,MAAM;AACvB,qBAAiB,EAAE,MAAM,WAAW,KAAK,CAAC;AAC1C,iBAAa,KAAK;AAAA,EACpB;AAEA,QAAM,mBAAmB,CAAC,YAA2B;AACnD,QAAI,CAAC,QAAS;AACd,UAAM,WAAW,cAAc,KAAK,OAAK,EAAE,UAAU,OAAO;AAC5D,QAAI,UAAU;AACZ,mBAAa,SAAS,OAAO;AAC7B,uBAAiB,EAAE,MAAM,SAAS,SAAS,MAAM,QAAQ,CAAC;AAAA,IAC5D;AAAA,EACF;AAEA,SACE,gBAAAE,MAACC,kBAAA,EAAgB,WAAU,uBACzB;AAAA,oBAAAF,KAAC,gBACC,0BAAAC;AAAA,MAACE;AAAA,MAAA;AAAA,QACC,YAAU;AAAA,QACV,QAAO;AAAA,QACP,QAAO;AAAA,QACP,KAAI;AAAA,QACJ,OAAO,EAAE,UAAU,SAAS;AAAA,QAE5B;AAAA,0BAAAF;AAAA,YAACG;AAAA,YAAA;AAAA,cACC,SAAQ;AAAA,cACR,GAAE;AAAA,cACF,IAAG;AAAA,cACH,OAAO,EAAE,cAAc,gDAAgD;AAAA,cAEvE;AAAA,gCAAAH,MAACG,QAAA,EAAM,KAAI,MACT;AAAA,kCAAAJ,KAAC,iBAAc,MAAM,IAAI,OAAM,oCAAmC;AAAA,kBAClE,gBAAAA,KAACK,OAAA,EAAK,MAAK,MAAK,IAAI,KAAK,IAAG,aAAY,GAAE,UACvC,wBAAc,KAAK,OAAK,EAAE,UAAU,IAAI,GAAG,SAAS,WACvD;AAAA,mBACF;AAAA,gBAEA,gBAAAJ,MAACG,QAAA,EAAM,KAAK,GACV;AAAA,kCAAAJ,KAACM,UAAA,EAAQ,OAAO,YAAY,wBAAc,iBACxC,0BAAAN;AAAA,oBAACO;AAAA,oBAAA;AAAA,sBACC,SAAQ;AAAA,sBACR,OAAM;AAAA,sBACN,SAAS,MAAM,aAAa,CAAC,SAAS;AAAA,sBAErC,sBAAY,gBAAAP,KAACQ,UAAA,EAAQ,MAAM,IAAI,IAAK,gBAAAR,KAACS,WAAA,EAAS,MAAM,IAAI;AAAA;AAAA,kBAC3D,GACF;AAAA,kBAEA,gBAAAR,MAACS,OAAA,EAAK,UAAS,cAAa,WAAS,MAAC,QAAO,MAC3C;AAAA,oCAAAV,KAACU,MAAK,QAAL,EACC,0BAAAV,KAACO,aAAA,EAAW,SAAQ,UAAS,OAAM,QACjC,0BAAAP,KAACW,eAAA,EAAa,MAAM,IAAI,GAC1B,GACF;AAAA,oBACA,gBAAAV,MAACS,MAAK,UAAL,EACC;AAAA,sCAAAV,KAACU,MAAK,OAAL,EAAW,8CAAY;AAAA,sBACvB,cAAc,IAAI,OACjB,gBAAAV,KAACU,MAAK,MAAL,EAAwB,SAAS,MAAM,iBAAiB,EAAE,KAAK,GAC7D,YAAE,SADW,EAAE,KAElB,CACD;AAAA,sBACD,gBAAAV,KAACU,MAAK,SAAL,EAAa;AAAA,sBACd,gBAAAV;AAAA,wBAACU,MAAK;AAAA,wBAAL;AAAA,0BACC,OAAM;AAAA,0BACN,aAAa,gBAAAV,KAACY,YAAA,EAAU,MAAM,IAAI;AAAA,0BAClC,SAAS,MAAM,WAAW;AAAA,0BAC3B;AAAA;AAAA,sBAED;AAAA,uBACF;AAAA,qBACF;AAAA,mBACF;AAAA;AAAA;AAAA,UACF;AAAA,UAEA,gBAAAZ,KAACa,MAAA,EAAI,GAAE,MACJ,sBACC,gBAAAZ,MAACY,MAAA,EACC;AAAA,4BAAAb;AAAA,cAACc;AAAA,cAAA;AAAA,gBACC,MAAM;AAAA,gBACN,OAAO;AAAA,gBACP,UAAU;AAAA,gBACV,OAAM;AAAA,gBACN,MAAK;AAAA,gBACL,IAAG;AAAA;AAAA,YACL;AAAA,YACA,gBAAAd;AAAA,cAACe;AAAA,cAAA;AAAA,gBACC,aAAY;AAAA,gBACZ,OAAO;AAAA,gBACP,UAAU,CAAC,MAAM,aAAa,EAAE,cAAc,KAAK;AAAA,gBACnD,SAAS;AAAA,gBACT,SAAS;AAAA,gBACT,UAAQ;AAAA,gBACR,QAAQ;AAAA,kBACN,OAAO;AAAA,oBACL,YAAY;AAAA,oBACZ,UAAUC,KAAI,EAAE;AAAA,oBAChB,iBAAiB;AAAA,kBACnB;AAAA,gBACF;AAAA;AAAA,YACF;AAAA,YACA,gBAAAf,MAACG,QAAA,EAAM,SAAQ,YAAW,IAAG,MAC3B;AAAA,8BAAAJ;AAAA,gBAACiB;AAAA,gBAAA;AAAA,kBACC,SAAQ;AAAA,kBACR,MAAK;AAAA,kBACL,aAAa,gBAAAjB,KAAC,eAAY,MAAM,IAAI;AAAA,kBACpC,SAAS,MAAM,aAAa,IAAI;AAAA,kBACjC;AAAA;AAAA,cAED;AAAA,cACA,gBAAAA;AAAA,gBAACiB;AAAA,gBAAA;AAAA,kBACC,MAAK;AAAA,kBACL,aAAa,gBAAAjB,KAAC,oBAAiB,MAAM,IAAI;AAAA,kBACzC,SAAS;AAAA,kBACV;AAAA;AAAA,cAED;AAAA,eACF;AAAA,aACF,IAEA,gBAAAA,KAACa,MAAA,EACE,yBACC,gBAAAZ,MAACiB,QAAA,EAAM,MAAM,gBAAAlB,KAACmB,kBAAA,EAAgB,MAAM,IAAI,GAAI,OAAM,0BAAc,OAAM,OACpE;AAAA,4BAAAnB,KAACK,OAAA,EAAK,MAAK,MAAK,OAAO,EAAE,YAAY,WAAW,GAAI,wBAAa;AAAA,YACjE,gBAAAL,KAACiB,SAAA,EAAO,MAAK,cAAa,OAAM,OAAM,SAAQ,SAAQ,IAAG,MAAK,SAAS,MAAM,aAAa,IAAI,GAAG,2BAEjG;AAAA,aACF,IAEA,gBAAAjB;AAAA,YAACa;AAAA,YAAA;AAAA,cACC,KAAK;AAAA,cACL,WAAU;AAAA,cACV,OAAO;AAAA,gBACL,SAAS;AAAA,gBACT,gBAAgB;AAAA,gBAChB,WAAW;AAAA,gBACX,SAAS;AAAA,gBACT,cAAc;AAAA,gBACd,iBAAiB,wBAAwB,SAAS,gBAAgB;AAAA,cACpE;AAAA;AAAA,UACF,GAEJ,GAEJ;AAAA;AAAA;AAAA,IACF,GACF;AAAA,IAEA,gBAAAb,KAAC,WAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,SAQN;AAAA,KACJ;AAEJ;;;AD7OO,IAAM,mBAAmBoB,MAAK,OAAO;AAAA,EAC1C,MAAM;AAAA,EACN,OAAO;AAAA,EACP,WAAW;AAAA,EACX,WAAW;AAAA,EAEX,gBAAgB;AACd,WAAO;AAAA,MACL,MAAM;AAAA,QACJ,SAAS;AAAA,QACT,WAAW,aAAW,QAAQ,aAAa,WAAW,KAAK;AAAA,QAC3D,YAAY,iBAAe;AAAA,UACzB,aAAa,WAAW,QAAQ;AAAA,QAClC;AAAA,MACF;AAAA,MACA,MAAM;AAAA,QACJ,SAAS;AAAA,QACT,WAAW,aAAW,QAAQ,aAAa,WAAW,KAAK;AAAA,QAC3D,YAAY,iBAAe;AAAA,UACzB,aAAa,WAAW,QAAQ;AAAA,QAClC;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,YAAY;AACV,WAAO,CAAC,EAAE,KAAK,2BAA2B,CAAC;AAAA,EAC7C;AAAA,EAEA,WAAW,EAAE,eAAe,GAAG;AAC7B,WAAO,CAAC,OAAOC,iBAAgB,gBAAgB,EAAE,aAAa,UAAU,CAAC,CAAC;AAAA,EAC5E;AAAA,EAEA,cAAc;AACZ,WAAOC,uBAAsB,YAAY;AAAA,EAC3C;AAAA,EAEA,cAAc;AACZ,WAAO;AAAA,MACL,YACE,MACA,CAAC,EAAE,SAAS,MAAW;AACrB,eAAO,SAAS,cAAc;AAAA,UAC5B,MAAM,KAAK;AAAA,UACX,OAAO;AAAA,YACL,MAAM;AAAA,YACN,MAAM;AAAA,UACR;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACJ;AAAA,EACF;AACF,CAAC;;;AX9CD,SAAS,aAAa;AACtB,SAAS,iBAAiB;;;AaX1B,SAAS,MAAM,mBAAAC,wBAAuB;AAW/B,IAAM,sBAAsB,KAAK,OAAO;AAAA,EAC7C,MAAM;AAAA,EAEN,aAAa;AACX,WAAO;AAAA,MACL,gBAAgB,CAAC;AAAA,IACnB;AAAA,EACF;AAAA,EAEA,gBAAgB;AACd,WAAO;AAAA,MACL,OAAO;AAAA,QACL,SAAS;AAAA,QACT,WAAW,aAAW,QAAQ,aAAa,eAAe,KAAK;AAAA,QAC/D,YAAY,gBAAc;AACxB,cAAI,CAAC,WAAW,OAAO;AACrB,mBAAO,CAAC;AAAA,UACV;AACA,iBAAO;AAAA,YACL,iBAAiB,WAAW;AAAA,UAC9B;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,YAAY;AACV,WAAO;AAAA,MACL;AAAA,QACE,KAAK;AAAA,MACP;AAAA,IACF;AAAA,EACF;AAAA,EAEA,WAAW,EAAE,gBAAgB,KAAK,GAAG;AACnC,WAAO;AAAA,MACL;AAAA,MACAA,iBAAgB,gBAAgB,EAAE,iBAAiB,KAAK,MAAM,MAAM,CAAC;AAAA,MACrE;AAAA,IACF;AAAA,EACF;AAAA,EAEA,cAAc;AACZ,WAAO;AAAA,MACL,oBACE,WACA,CAAC,EAAE,SAAS,MAAM;AAChB,eAAO,SAAS,QAAQ,KAAK,MAAM,EAAE,MAAM,CAAC;AAAA,MAC9C;AAAA,MACF,sBACE,MACA,CAAC,EAAE,SAAS,MAAM;AAChB,eAAO,SAAS,UAAU,KAAK,IAAI;AAAA,MACrC;AAAA,IACJ;AAAA,EACF;AACF,CAAC;;;AbtDD,OAAO,cAAc;AACrB,SAAS,gBAAgB;AACzB,SAAS,OAAO,UAAU,aAAa,iBAAiB;;;AcfxD,OAAO,WAAW;AAClB,SAAS,yBAAAC,8BAA6B;;;ACDtC,SAAS,YAAAC,WAAU,QAAAC,OAAM,eAAAC,cAAa,UAAAC,SAAQ,aAAAC,kBAAiB;AAC/D,SAAS,mBAAAC,wBAAgD;AACzD,SAAS,cAAAC,aAAY,OAAAC,MAAK,yBAAAC,wBAAuB,mBAAAC,kBAAiB,QAAAC,aAAY;AAC9E,SAAS,aAAAC,YAAW,YAAAC,WAAU,0BAA0B;AAiG9C,mBAsBgB,OAAAC,MArBd,QAAAC,aADF;AA9FV,IAAM,qBAAqB;AAE3B,IAAM,aAAaC,MAAK,SAASC,YAAW,EAAE,MAAM,UAAU,iBAAiB,GAAuB;AACpG,QAAM,CAAC,QAAQ,SAAS,IAAIC,UAAS,KAAK;AAC1C,QAAM,CAAC,YAAY,aAAa,IAAIA,UAAS,KAAK;AAClD,QAAM,CAAC,aAAa,cAAc,IAAIA,UAAS,EAAE,GAAG,GAAG,GAAG,GAAG,OAAO,EAAE,CAAC;AACvE,QAAM,SAASC,QAAyB,IAAI;AAC5C,QAAM,EAAE,YAAY,IAAIC,uBAAsB;AAC9C,QAAM,QAAQC,iBAAgB;AAC9B,QAAM,SAAS,gBAAgB;AAE/B,QAAM,MAAO,KAAa,OAAO,OAAO;AACxC,QAAM,MAAO,KAAa,OAAO,OAAO;AACxC,QAAM,QAAS,KAAa,OAAO,SAAS;AAE5C,EAAAC,WAAU,MAAM;AACd,UAAM,kBAAkB,CAAC,MAAkB;AACzC,UAAI,CAAC,cAAc,CAAC,OAAO,QAAS;AAEpC,YAAM,SAAS,EAAE,UAAU,YAAY;AACvC,YAAM,WAAW,KAAK,IAAI,KAAK,YAAY,QAAQ,MAAM;AAEzD,aAAO,QAAQ,MAAM,QAAQ,GAAG,QAAQ;AAAA,IAC1C;AAEA,UAAM,gBAAgB,MAAM;AAC1B,UAAI,CAAC,cAAc,CAAC,OAAO,QAAS;AAEpC,YAAM,eAAe,OAAO,QAAQ;AACpC,yBAAmB,EAAE,OAAO,aAAa,CAAC;AAC1C,oBAAc,KAAK;AAAA,IACrB;AAEA,QAAI,YAAY;AACd,eAAS,iBAAiB,aAAa,eAAe;AACtD,eAAS,iBAAiB,WAAW,aAAa;AAClD,eAAS,KAAK,MAAM,SAAS;AAC7B,eAAS,KAAK,MAAM,aAAa;AAAA,IACnC;AAEA,WAAO,MAAM;AACX,eAAS,oBAAoB,aAAa,eAAe;AACzD,eAAS,oBAAoB,WAAW,aAAa;AACrD,eAAS,KAAK,MAAM,SAAS;AAC7B,eAAS,KAAK,MAAM,aAAa;AAAA,IACnC;AAAA,EACF,GAAG,CAAC,YAAY,aAAa,gBAAgB,CAAC;AAE9C,QAAM,oBAAoBC,aAAY,CAAC,MAAwB;AAC7D,MAAE,eAAe;AACjB,MAAE,gBAAgB;AAElB,QAAI,CAAC,OAAO,QAAS;AAErB,kBAAc,IAAI;AAClB,mBAAe;AAAA,MACb,GAAG,EAAE;AAAA,MACL,GAAG,EAAE;AAAA,MACL,OAAO,OAAO,QAAQ;AAAA,IACxB,CAAC;AAAA,EACH,GAAG,CAAC,CAAC;AAEL,QAAM,aAAaA,aAAY,YAAY;AACzC,QAAI,CAAC,IAAK;AAEV,QAAI;AACF,YAAM,UAAU,MAAM,gBAAgB,GAAG;AACzC,UAAI,SAAS;AACX,kBAAU,IAAI;AACd,mBAAW,MAAM,UAAU,KAAK,GAAG,IAAI;AAAA,MACzC;AAAA,IACF,SAAS,KAAK;AACZ,cAAQ,MAAM,gBAAgB,GAAG;AAAA,IACnC;AAAA,EACF,GAAG,CAAC,GAAG,CAAC;AAER,QAAM,kBAAkBA,aAAY,MAAM;AACxC,QAAI,CAAC,OAAO,QAAS;AACrB,WAAO,QAAQ,MAAM,QAAQ;AAC7B,uBAAmB,EAAE,OAAO,KAAK,CAAC;AAAA,EACpC,GAAG,CAAC,gBAAgB,CAAC;AAErB,SACE,gBAAAT,KAACU,kBAAA,EAAgB,WAAU,uBACzB,0BAAAT;AAAA,IAACU;AAAA,IAAA;AAAA,MACC,KAAI;AAAA,MACJ,SAAQ;AAAA,MACR,OAAO;AAAA,QACL,UAAU;AAAA,QACV,cAAc;AAAA,QACd,UAAU;AAAA,MACZ;AAAA,MAEC;AAAA,oBACC,gBAAAV,MAAA,YACE;AAAA,0BAAAA;AAAA,YAACU;AAAA,YAAA;AAAA,cACC,KAAI;AAAA,cACJ,KAAK;AAAA,cACL,OAAO;AAAA,cACP,OAAO;AAAA,gBACL,QAAQ;AAAA,gBACR,SAAS;AAAA,gBACT,KAAK;AAAA,cACP;AAAA,cAEA;AAAA,gCAAAX;AAAA,kBAACY;AAAA,kBAAA;AAAA,oBACC,OAAO,SAAS,SAAS;AAAA,oBACzB,SAAQ;AAAA,oBACR,QAAO;AAAA,oBACP,SAAS;AAAA,oBACT,OAAO,SAAS,YAAY;AAAA,oBAC5B,IAAI,SAAS,MAAM,OAAO,KAAK,CAAC,IAAI,MAAM;AAAA,oBAC1C,OAAO;AAAA,sBACL,WAAW;AAAA,oBACb;AAAA,oBAEC,mBAAS,gBAAAZ,KAACa,YAAA,EAAU,OAAM,SAAQ,MAAM,IAAI,IAAK,gBAAAb,KAACc,WAAA,EAAS,MAAM,IAAI;AAAA;AAAA,gBACxE;AAAA,gBACA,gBAAAd;AAAA,kBAACY;AAAA,kBAAA;AAAA,oBACC,OAAO,SAAS,SAAS;AAAA,oBACzB,SAAQ;AAAA,oBACR,QAAO;AAAA,oBACP,SAAS;AAAA,oBACT,OAAM;AAAA,oBACN,IAAI,SAAS,MAAM,OAAO,KAAK,CAAC,IAAI,MAAM;AAAA,oBAC1C,OAAO;AAAA,sBACL,WAAW;AAAA,oBACb;AAAA,oBAEA,0BAAAZ,KAAC,sBAAmB,MAAM,IAAI;AAAA;AAAA,gBAChC;AAAA;AAAA;AAAA,UACF;AAAA,UAEA,gBAAAA;AAAA,YAACW;AAAA,YAAA;AAAA,cACC,KAAI;AAAA,cACJ,QAAQ;AAAA,cACR,OAAO;AAAA,cACP,OAAO;AAAA,gBACL,QAAQ;AAAA,gBACR,OAAO;AAAA,gBACP,QAAQ;AAAA,gBACR,QAAQ;AAAA,gBACR,WAAW;AAAA,cACb;AAAA,cACA,aAAa;AAAA,cAEb,0BAAAX;AAAA,gBAACW;AAAA,gBAAA;AAAA,kBACC,GAAE;AAAA,kBACF,GAAE;AAAA,kBACF,IAAI,MAAM,OAAO,KAAK,CAAC;AAAA,kBACvB,OAAO;AAAA,oBACL,cAAc;AAAA,oBACd,QAAQ,aAAa,MAAM,KAAK;AAAA,oBAChC,WAAW;AAAA,kBACb;AAAA;AAAA,cACF;AAAA;AAAA,UACF;AAAA,WACF;AAAA,QAGF,gBAAAX;AAAA,UAAC;AAAA;AAAA,YACC,KAAK;AAAA,YACL;AAAA,YACA;AAAA,YACA,OAAO;AAAA,cACL,SAAS;AAAA,cACT,UAAU;AAAA,cACV,OAAO,QAAQ,GAAG,KAAK,OAAO;AAAA,cAC9B,QAAQ;AAAA,cACR,cAAc;AAAA,cACd,QAAQ,WACJ,aAAa,MAAM,OAAO,KAAK,CAAC,CAAC,KACjC;AAAA,cACJ,WAAW,WACP,aAAa,MAAM,OAAO,KAAK,CAAC,CAAC,KACjC;AAAA,cACJ,QAAQ,aAAa,cAAc;AAAA,cACnC,YAAY,aAAa,SAAS;AAAA,YACpC;AAAA;AAAA,QACF;AAAA,QAEC,OACC,gBAAAA;AAAA,UAACe;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,GAAG,SAAS,MAAM,OAAO,KAAK,CAAC,IAAI,MAAM,OAAO,KAAK,CAAC;AAAA,YACtD,IAAG;AAAA,YACH,IAAI;AAAA,YACJ,OAAO;AAAA,cACL,WAAW;AAAA,YACb;AAAA,YAEC;AAAA;AAAA,QACH;AAAA;AAAA;AAAA,EAEJ,GACF;AAEJ,CAAC;AAED,WAAW,cAAc;;;ADzMlB,IAAM,iBAAiB,MAAM,OAAO;AAAA,EACzC,cAAc;AACZ,WAAOC,uBAAsB,UAAiB;AAAA,EAChD;AAAA,EAEA,gBAAgB;AACd,WAAO;AAAA,MACL,KAAK;AAAA,QACH,SAAS;AAAA,MACX;AAAA,MACA,KAAK;AAAA,QACH,SAAS;AAAA,MACX;AAAA,MACA,OAAO;AAAA,QACL,SAAS;AAAA,MACX;AAAA,MACA,OAAO;AAAA,QACL,SAAS;AAAA,QACT,WAAW,QAAM,GAAG,aAAa,OAAO,KAAK;AAAA,QAC7C,YAAY,WAAS;AACnB,cAAI,CAAC,MAAM,OAAO;AAChB,mBAAO,CAAC;AAAA,UACV;AACA,iBAAO;AAAA,YACL,OAAO,MAAM;AAAA,UACf;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF,CAAC;;;AdjBD,OAAO,gBAAgB;AACvB,OAAO,iBAAiB;AACxB,OAAO,cAAc;AAWd,IAAM,uBAAuB,CAAC;AAAA,EACnC;AAAA,EACA;AAAA,EACA,gBAAgB;AAAA,EAChB,eAAe;AAAA,EACf,aAAa,CAAC;AAAA,EACd,GAAG;AACL,MAAmC;AAEjC,QAAM,cAAcC,QAA6C,IAAI;AACrE,QAAM,oBAAoBA,QAAO,cAAc;AAC/C,QAAM,uBAAuBA,QAAO,KAAK;AACzC,QAAM,gBAAgBA,QAAO,KAAK;AAClC,QAAM,wBAAwBA,QAAe,EAAE;AAE/C,QAAM,aAAa,CAACC,YAAwB;AAC1C,QAAI,iBAAiB,QAAQ;AAC3B,aAAO,KAAK,UAAUA,QAAO,QAAQ,CAAC;AAAA,IACxC;AACA,UAAM,UAAU,iBAAiB,aAC7B,oBAAoBA,OAAM,IAC1BA,QAAO,QAAQ;AACnB,WAAO;AAAA,EACT;AAEA,QAAM,SAAS,UAAU;AAAA,IACvB,GAAG;AAAA,IACH,YAAY;AAAA,MACV,WAAW,UAAU;AAAA,QACnB,WAAW;AAAA,QACX,YAAY;AAAA,QACZ,aAAa;AAAA,QACb,UAAU;AAAA,MACZ,CAAC;AAAA,MACD;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,WAAW,UAAU;AAAA,QACnB,cAAc;AAAA,MAChB,CAAC;AAAA,MACD,YAAY,UAAU;AAAA,QACpB,cAAc;AAAA,MAChB,CAAC;AAAA,MACD;AAAA,MACA,SAAS,UAAU;AAAA,QACjB,cAAc;AAAA,MAChB,CAAC;AAAA,MACD,kBAAkB,UAAU;AAAA,QAC1B,QAAQ;AAAA,MACV,CAAC;AAAA,MACD;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,MAAM,UAAU;AAAA,QACd,WAAW;AAAA,MACb,CAAC;AAAA,MACD;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,GAAG;AAAA,IACL;AAAA,IACA,UAAU,MAAM;AACd,UAAI,gBAAgB;AAClB,YAAI;AACF,gBAAM,SAAS,KAAK,MAAM,cAAc;AACxC,cAAI,OAAO,SAAS,OAAO;AACzB,mBAAO;AAAA,UACT;AAAA,QACF,QAAQ;AAAA,QACR;AAAA,MACF;AACA,aAAO;AAAA,IACT,GAAG;AAAA,IACH,UAAU,CAAC,EAAE,QAAAA,QAAO,MAAM;AACxB,UAAI,iBAAiB,QAAQ;AAC3B,8BAAsB,UAAU,KAAK,UAAUA,QAAO,QAAQ,CAAC;AAAA,MACjE,WAAW,iBAAiB,YAAY;AACtC,8BAAsB,UAAU,oBAAoBA,OAAM;AAAA,MAC5D,OAAO;AACL,8BAAsB,UAAUA,QAAO,QAAQ;AAAA,MACjD;AAAA,IACF;AAAA,IACA,UAAU,CAAC,EAAE,QAAAA,QAAO,MAAM;AACxB,UAAI,CAAC,mBAAmB,cAAc,WAAW,CAAC,qBAAqB,QAAS;AAEhF,UAAI,YAAY,SAAS;AACvB,qBAAa,YAAY,OAAO;AAAA,MAClC;AAEA,kBAAY,UAAU,WAAW,MAAM;AACrC,cAAM,aAAa,WAAWA,OAAM;AAEpC,YAAI,eAAe,sBAAsB,SAAS;AAChD,gBAAM,IAAI,oDAAoD;AAC9D;AAAA,QACF;AAEA,8BAAsB,UAAU;AAChC,wBAAgB,UAAU;AAAA,MAC5B,GAAG,aAAa;AAAA,IAClB;AAAA,EACF,CAAC;AAED,EAAAC,WAAU,MAAM;AACd,QAAI,CAAC,OAAQ;AACb,QAAI,qBAAqB,QAAS;AAClC,yBAAqB,UAAU;AAC/B,0BAAsB,UAAU,kBAAkB;AAAA,EACpD,GAAG,CAAC,MAAM,CAAC;AAEX,EAAAA,WAAU,MAAM;AACd,QAAI,CAAC,UAAU,CAAC,eAAgB;AAChC,QAAI,qBAAqB,QAAS;AAElC,UAAM,iBAAiB,iBAAiB,aACpC,oBAAoB,MAAM,IAC1B,OAAO,QAAQ;AAEnB,QAAI,eAAe,KAAK,MAAM,eAAe,KAAK,GAAG;AACnD,UAAI;AACF,cAAM,cAAc,KAAK,MAAM,cAAc;AAC7C,eAAO,SAAS,WAAW,WAAW;AAAA,MACxC,QAAQ;AACN,eAAO,SAAS,WAAW,cAAc;AAAA,MAC3C;AACA,2BAAqB,UAAU;AAC/B,4BAAsB,UAAU;AAAA,IAClC;AAAA,EACF,GAAG,CAAC,MAAM,CAAC;AAEX,EAAAA,WAAU,MAAM;AACd,QAAI,CAAC,UAAU,CAAC,eAAgB;AAChC,QAAI,mBAAmB,sBAAsB,QAAS;AAEtD,QAAI,YAAY,SAAS;AACvB,mBAAa,YAAY,OAAO;AAChC,kBAAY,UAAU;AAAA,IACxB;AAEA,kBAAc,UAAU;AACxB,QAAI;AACF,YAAM,cAAc,KAAK,MAAM,cAAc;AAC7C,aAAO,SAAS,WAAW,WAAW;AAAA,IACxC,QAAQ;AACN,aAAO,SAAS,WAAW,cAAc;AAAA,IAC3C;AACA,kBAAc,UAAU;AACxB,sBAAkB,UAAU;AAC5B,0BAAsB,UAAU;AAAA,EAClC,GAAG,CAAC,gBAAgB,MAAM,CAAC;AAE3B,EAAAA,WAAU,MAAM;AACd,WAAO,MAAM;AACX,UAAI,YAAY,SAAS;AACvB,qBAAa,YAAY,OAAO;AAAA,MAClC;AAAA,IACF;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,SAAO;AACT;;;AgBjMA,SAAS,iBAAiB;AAC1B,SAAS,QAAQ,iBAA8B;AAG/C,IAAMC,cAAa,CAAC,MAAc,UAA0B;AAC1D,QAAM,OAAO,KAAK,KAAK,EAAE,YAAY,EAAE,QAAQ,QAAQ,GAAG,EAAE,QAAQ,eAAe,EAAE;AACrF,SAAO,OAAO,WAAW,IAAI,IAAI,KAAK,KAAK,WAAW,KAAK;AAC7D;AAEA,IAAM,kBAAkB,UAAU,OAA+B;AAAA,EAC/D,MAAM;AAAA,EAEN,aAAa;AACX,WAAO;AAAA,MACL,UAAU;AAAA,IACZ;AAAA,EACF;AAAA,EAEA,iBAAiB;AACf,eAAW,MAAM;AACf,YAAM,WAA0B,CAAC;AACjC,YAAM,EAAE,IAAI,IAAI,KAAK,OAAO;AAC5B,YAAM,kBAA0C,CAAC;AAEjD,UAAI,YAAY,CAAC,MAAM,QAAQ;AAC7B,YAAI,KAAK,KAAK,SAAS,WAAW;AAChC,gBAAM,QAAQ,KAAK,MAAM,SAAS;AAClC,cAAI,CAAC,gBAAgB,KAAK,GAAG;AAC3B,4BAAgB,KAAK,IAAI;AAAA,UAC3B;AACA,0BAAgB,KAAK;AAErB,gBAAM,aAAa,KAAK,MAAM;AAC9B,gBAAM,KAAK,cAAcA,YAAW,KAAK,aAAa,gBAAgB,KAAK,CAAC;AAE5E,mBAAS,KAAK;AAAA,YACZ;AAAA,YACA,MAAM,KAAK;AAAA,YACX;AAAA,YACA;AAAA,UACF,CAAC;AAAA,QACH;AAAA,MACF,CAAC;AAED,UAAI,KAAK,QAAQ,YAAY,SAAS,SAAS,GAAG;AAChD,aAAK,QAAQ,SAAS,QAAQ;AAAA,MAChC;AAAA,IACF,GAAG,CAAC;AAAA,EACN;AAAA,EAEA,wBAAwB;AACtB,UAAM,EAAE,OAAO,IAAI;AAEnB,UAAM,cAAc,MAAqB;AACvC,YAAM,WAA0B,CAAC;AACjC,YAAM,EAAE,IAAI,IAAI,OAAO;AACvB,YAAM,kBAA0C,CAAC;AAEjD,UAAI,YAAY,CAAC,MAAM,QAAQ;AAC7B,YAAI,KAAK,KAAK,SAAS,WAAW;AAChC,gBAAM,QAAQ,KAAK,MAAM,SAAS;AAClC,cAAI,CAAC,gBAAgB,KAAK,GAAG;AAC3B,4BAAgB,KAAK,IAAI;AAAA,UAC3B;AACA,0BAAgB,KAAK;AAErB,gBAAM,aAAa,KAAK,MAAM;AAC9B,gBAAM,KAAK,cAAcA,YAAW,KAAK,aAAa,gBAAgB,KAAK,CAAC;AAE5E,mBAAS,KAAK;AAAA,YACZ;AAAA,YACA,MAAM,KAAK;AAAA,YACX;AAAA,YACA;AAAA,UACF,CAAC;AAAA,QACH;AAAA,MACF,CAAC;AAED,aAAO;AAAA,IACT;AAEA,UAAM,iBAAiB,MAAM;AAC3B,YAAM,WAAW,YAAY;AAC7B,UAAI,KAAK,QAAQ,UAAU;AACzB,aAAK,QAAQ,SAAS,QAAQ;AAAA,MAChC;AAAA,IACF;AAEA,WAAO;AAAA,MACL,IAAI,OAAO;AAAA,QACT,KAAK,IAAI,UAAU,iBAAiB;AAAA,QACpC,cAAc,EAAE,YAAY,GAAiC;AAC3D,cAAI,YAAY,cAAc,YAAY,cAAc;AACtD,uBAAW,gBAAgB,CAAC;AAAA,UAC9B;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AACF,CAAC;AAED,IAAO,mCAAQ;;;ACrGf,SAAS,QAAAC,OAAM,YAAAC,WAAU,aAAAC,YAAW,UAAAC,SAAQ,eAAAC,oBAAmB;AAC/D,SAAS,OAAAC,MAAK,QAAAC,OAAM,YAAY,SAAS,mBAAAC,wBAAuB;AAChE,SAAS,gBAAgB;;;ACFzB;AAAA,EACE,QAAAC;AAAA,EACA,YAAAC;AAAA,EACA,UAAAC;AAAA,EACA,eAAAC;AAAA,EACA,aAAAC;AAAA,OAGK;AACP,SAAS,mBAAAC,wBAAuB;AAwHxB,SAiHJ,YAAAC,WAjHI,OAAAC,MAkHF,QAAAC,aAlHE;AArHR,IAAM,kBAAkB;AACxB,IAAM,gBAAgB;AACtB,IAAM,kBAAkB;AAExB,IAAM,YAAY;AAClB,IAAM,aAAa;AACnB,IAAM,aAAa;AACnB,IAAM,UAAU;AAEhB,IAAM,cAAc;AACpB,IAAM,oBAAoB;AA0B1B,IAAM,aAAaR,MAAK,SAASS,YAAW;AAAA,EAC1C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAoB;AAClB,QAAM,aAAaP,QAAuB,IAAI;AAE9C,QAAM,cAAc;AACpB,QAAM,gBAAgB,SAAS,2BAA2B;AAE1D,QAAM,mBAAmBC,aAAY,MAAM;AACzC,QAAI,WAAW,QAAS,cAAa,SAAS,WAAW,OAAO;AAAA,EAClE,GAAG,CAAC,SAAS,YAAY,CAAC;AAE1B,QAAM,cAAcA,aAAY,MAAM;AACpC,QAAI,WAAW,QAAS,cAAa,SAAS,WAAW,OAAO;AAAA,EAClE,GAAG,CAAC,SAAS,YAAY,CAAC;AAE1B,QAAM,mBAAmBA,aAAY,CAAC,MAAuB;AAC3D,MAAE,eAAe;AACjB,QAAI,WAAW,QAAS,cAAa,SAAS,WAAW,OAAO;AAAA,EAClE,GAAG,CAAC,SAAS,YAAY,CAAC;AAE1B,QAAM,gBAAgBA,aAAY,CAAC,MAAqC;AACtE,QAAI,EAAE,QAAQ,WAAW,EAAE,QAAQ,KAAK;AACtC,QAAE,eAAe;AACjB,iBAAW,OAAO;AAAA,IACpB;AACA,QAAI,EAAE,QAAQ,UAAU;AACtB,mBAAa;AACb,MAAC,EAAE,cAA8B,KAAK;AAAA,IACxC;AAAA,EACF,GAAG,CAAC,SAAS,YAAY,YAAY,CAAC;AAEtC,SACE,gBAAAI;AAAA,IAAC;AAAA;AAAA,MACC,KAAK,CAAC,OAAO;AACX,mBAAW,UAAU;AACrB,iBAAS,EAAE;AAAA,MACb;AAAA,MACA,MAAK;AAAA,MACL,UAAU;AAAA,MACV,cAAY,QAAQ,QAAQ;AAAA,MAC5B,gBAAc,WAAW,aAAa;AAAA,MACtC,cAAc;AAAA,MACd,cAAc;AAAA,MACd,SAAS;AAAA,MACT,QAAQ;AAAA,MACR,cAAc;AAAA,MACd,SAAS,MAAM,WAAW,OAAO;AAAA,MACjC,WAAW;AAAA,MACX,OAAO;AAAA,QACL,SAAS;AAAA,QACT,gBAAgB;AAAA,QAChB,YAAY;AAAA,QACZ,OAAO;AAAA,QACP,SAAS;AAAA,QACT,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,yBAAyB;AAAA,QACzB,WAAW;AAAA,MACb;AAAA,MAEA,0BAAAA;AAAA,QAAC;AAAA;AAAA,UACC,OAAO;AAAA,YACL,OAAO;AAAA,YACP,QAAQ;AAAA,YACR,cAAc;AAAA,YACd,UAAU;AAAA,YACV,eAAe;AAAA,YACf,WAAW,WACP,SACE,iEACA,iEACF;AAAA,UACN;AAAA,UAEA,0BAAAA;AAAA,YAAC;AAAA;AAAA,cACC,OAAO;AAAA,gBACL,OAAO;AAAA,gBACP,QAAQ;AAAA,gBACR,cAAc;AAAA,gBACd,iBAAiB,WAAW,cAAc;AAAA,gBAC1C,SAAS,WAAW,IAAI;AAAA,gBACxB,YAAY;AAAA,gBACZ,WAAW,WAAW,gBAAgB;AAAA,gBACtC,iBAAiB;AAAA,gBACjB,YAAY;AAAA,cACd;AAAA;AAAA,UACF;AAAA;AAAA,MACF;AAAA;AAAA,EACF;AAEJ,CAAC;AAED,WAAW,cAAc;AAElB,IAAM,mBAAmBP,MAAK,SAASU,kBAAiB;AAAA,EAC7D;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA0B;AACxB,QAAM,QAAQL,iBAAgB;AAE9B,QAAM,SAASH,QAAoB,IAAI;AACvC,QAAM,UAAUA,QAAoC,oBAAI,IAAI,CAAC;AAE7D,QAAM,CAAC,SAAS,UAAU,IAAID,UAAuB,EAAE,SAAS,OAAO,MAAM,IAAI,GAAG,EAAE,CAAC;AACvF,QAAM,YAAYC,QAA6C,IAAI;AAEnE,QAAM,mBAAmBC,aAAY,CAAC,SAAsB,OAAoB;AAC9E,QAAI,UAAU,SAAS;AAAE,mBAAa,UAAU,OAAO;AAAG,gBAAU,UAAU;AAAA,IAAM;AACpF,UAAM,OAAO,GAAG,sBAAsB;AACtC,eAAW;AAAA,MACT,SAAS;AAAA,MACT,MAAM,QAAQ,QAAQ;AAAA,MACtB,GAAG,KAAK,MAAM,KAAK,SAAS;AAAA,IAC9B,CAAC;AAAA,EACH,GAAG,CAAC,CAAC;AAEL,QAAM,mBAAmBA,aAAY,MAAM;AACzC,cAAU,UAAU,WAAW,MAAM,WAAW,QAAM,EAAE,GAAG,GAAG,SAAS,MAAM,EAAE,GAAG,GAAG;AAAA,EACvF,GAAG,CAAC,CAAC;AAEL,EAAAC,WAAU,MAAM,MAAM;AACpB,QAAI,UAAU,QAAS,cAAa,UAAU,OAAO;AAAA,EACvD,GAAG,CAAC,CAAC;AAEL,QAAM,YAAYD,aAAY,CAAC,UAAkB,CAAC,OAA8B;AAC9E,QAAI,GAAI,SAAQ,QAAQ,IAAI,OAAO,EAAE;AAAA,QAChC,SAAQ,QAAQ,OAAO,KAAK;AAAA,EACnC,GAAG,CAAC,CAAC;AAEL,EAAAC,WAAU,MAAM;AACd,UAAM,MAAM,OAAO;AACnB,UAAM,KAAK,QAAQ,QAAQ,IAAI,WAAW;AAC1C,QAAI,CAAC,OAAO,CAAC,MAAM,cAAc,EAAG;AAEpC,UAAM,UAAU,IAAI,sBAAsB;AAC1C,UAAM,SAAS,GAAG,sBAAsB;AAExC,UAAM,UAAU,OAAO,MAAM,QAAQ;AACrC,UAAM,UAAU,OAAO,SAAS,QAAQ;AACxC,QAAI,CAAC,WAAW,CAAC,QAAS;AAE1B,UAAM,kBACJ,IAAI,aAAa,OAAO,MAAM,QAAQ,OAAO,QAAQ,SAAS,IAAI,OAAO,SAAS;AAEpF,QAAI,SAAS,EAAE,KAAK,iBAAiB,UAAU,SAAS,CAAC;AAAA,EAC3D,GAAG,CAAC,WAAW,CAAC;AAEhB,QAAM,yBAAyBD,aAAY,CAAC,MAAkC;AAC5E,QAAI,EAAE,QAAQ,eAAe,EAAE,QAAQ,UAAW;AAClD,MAAE,eAAe;AACjB,UAAM,UAAU,SAAS;AACzB,UAAM,OAAO,OAAO,SAAS,iBAA8B,mBAAmB;AAC9E,QAAI,CAAC,KAAM;AACX,UAAM,MAAM,MAAM,KAAK,IAAI;AAC3B,UAAM,MAAM,IAAI,QAAQ,OAAO;AAC/B,QAAI,QAAQ,GAAI;AAChB,UAAM,OAAO,EAAE,QAAQ,cACnB,IAAI,KAAK,IAAI,MAAM,GAAG,IAAI,SAAS,CAAC,CAAC,IACrC,IAAI,KAAK,IAAI,MAAM,GAAG,CAAC,CAAC;AAC5B,UAAM,MAAM;AAAA,EACd,GAAG,CAAC,CAAC;AAEL,EAAAC,WAAU,MAAM;AACd,UAAM,gBAAgB,CAAC,MAA+B;AACpD,UAAI,OAAO,SAAS,SAAS,EAAE,MAAc,EAAG;AAChD,iBAAW,QAAM,EAAE,GAAG,GAAG,SAAS,MAAM,EAAE;AAC1C,YAAM,UAAU,SAAS;AACzB,UAAI,OAAO,SAAS,SAAS,OAAO,EAAG,SAAQ,KAAK;AAAA,IACtD;AACA,aAAS,iBAAiB,aAAa,eAAe,EAAE,SAAS,KAAK,CAAC;AACvE,aAAS,iBAAiB,cAAc,eAAe,EAAE,SAAS,KAAK,CAAC;AACxE,WAAO,MAAM;AACX,eAAS,oBAAoB,aAAa,aAAa;AACvD,eAAS,oBAAoB,cAAc,aAAa;AAAA,IAC1D;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,MAAI,SAAS,WAAW,EAAG,QAAO;AAElC,QAAM,YAAY,SAAS,MAAM,OAAO,KAAK,CAAC,IAAI;AAClD,QAAM,gBAAgB,SAAS,MAAM,OAAO,KAAK,CAAC,IAAI,MAAM,OAAO,KAAK,CAAC;AACzE,QAAM,cAAc,SAAS,MAAM,OAAO,KAAK,CAAC,IAAI,MAAM,OAAO,KAAK,CAAC;AACvE,QAAM,eAAe,kBAAkB,YAAY;AAEnD,SACE,gBAAAI,MAAAF,WAAA,EACE;AAAA,oBAAAE;AAAA,MAAC;AAAA;AAAA,QACC,OAAO;AAAA,UACL,UAAU;AAAA,UACV,OAAO;AAAA,UACP,KAAK;AAAA,UACL,OAAO;AAAA,UACP,QAAQ;AAAA,UACR,SAAS;AAAA,UACT,eAAe;AAAA,UACf,eAAe;AAAA,QACjB;AAAA,QAEA;AAAA,0BAAAD,KAAC,WAAO,8DAAmD;AAAA,UAE3D,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACC,KAAK;AAAA,cACL,MAAK;AAAA,cACL,cAAW;AAAA,cACX,WAAU;AAAA,cACV,WAAW;AAAA,cACX,OAAO;AAAA,gBACL,OAAO;AAAA,gBACP,WAAW;AAAA,gBACX,WAAW;AAAA,gBACX,WAAW;AAAA,gBACX,oBAAoB;AAAA,gBACpB,eAAe;AAAA,gBACf,gBAAgB;AAAA,gBAChB,iBAAiB;AAAA,gBACjB,SAAS;AAAA,gBACT,eAAe;AAAA,gBACf,YAAY;AAAA,gBACZ,KAAK;AAAA,gBACL,YAAY;AAAA,gBACZ,eAAe;AAAA,cACjB;AAAA,cAEC,mBAAS,IAAI,CAAC,SAAS,UACtB,gBAAAA;AAAA,gBAAC;AAAA;AAAA,kBAEC;AAAA,kBACA,UAAU,UAAU;AAAA,kBACpB;AAAA,kBACA;AAAA,kBACA,cAAc;AAAA,kBACd,cAAc;AAAA,kBACd,QAAQ,UAAU,KAAK;AAAA;AAAA,gBAPlB,GAAG,QAAQ,EAAE,IAAI,KAAK;AAAA,cAQ7B,CACD;AAAA;AAAA,UACH;AAAA;AAAA;AAAA,IACF;AAAA,IAEA,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,aAAU;AAAA,QACV,OAAO;AAAA,UACL,UAAU;AAAA,UACV,OAAO;AAAA,UACP,KAAK,QAAQ;AAAA,UACb,WAAW,QAAQ,UACf,qBACA;AAAA,UACJ,QAAQ;AAAA,UACR,eAAe;AAAA,UACf,SAAS,QAAQ,UAAU,IAAI;AAAA,UAC/B,YAAY;AAAA,UACZ,YAAY;AAAA,UACZ,UAAU;AAAA,UACV,YAAY;AAAA,QACd;AAAA,QAEA,0BAAAA;AAAA,UAAC;AAAA;AAAA,YACC,OAAO;AAAA,cACL,YAAY;AAAA,cACZ,QAAQ,aAAa,aAAa;AAAA,cAClC,cAAc;AAAA,cACd,SAAS;AAAA,cACT,WAAW,SACP,0DACA;AAAA,cACJ,OAAO;AAAA,cACP,UAAU;AAAA,cACV,YAAY;AAAA,cACZ,YAAY;AAAA,cACZ,UAAU;AAAA,cACV,UAAU;AAAA,cACV,cAAc;AAAA,cACd,eAAe;AAAA,YACjB;AAAA,YAEC,kBAAQ;AAAA;AAAA,QACX;AAAA;AAAA,IACF;AAAA,KACF;AAEJ,CAAC;AAED,iBAAiB,cAAc;;;AD3D3B,qBAAAI,WACE,OAAAC,MA6Gc,QAAAC,aA9GhB;AAnQG,IAAM,uBAAuBC,MAAK,CAAC,EAAE,UAAU,OAAO,MAAiC;AAC5F,QAAM,QAAQC,iBAAgB;AAC9B,QAAM,EAAE,aAAa,IAAI,SAAS;AAClC,QAAM,SAAS,iBAAiB;AAEhC,QAAM,CAAC,QAAQ,SAAS,IAAIC,UAAS,KAAK;AAC1C,QAAM,CAAC,UAAU,WAAW,IAAIA,UAAwB,IAAI;AAC5D,QAAM,YAAYC,QAAuB,IAAI;AAE7C,QAAM,0BAA0BA,QAAO,KAAK;AAC5C,QAAM,2BAA2BA,QAAO,KAAK;AAC7C,QAAM,0BAA0BA,QAAsB,IAAI;AAE1D,QAAM,uBAAuBC,aAAY,MAAM;AAC7C,QAAI,wBAAwB,QAAS;AACrC,QAAI,CAAC,QAAQ,KAAM;AAEnB,UAAM,YAAY,OAAO,KAAK;AAC9B,UAAM,aAAa,UAAU,iBAA8B,mBAAmB;AAC9E,QAAI,WAAW,WAAW,KAAK,SAAS,WAAW,EAAG;AAEtD,UAAM,YAAY;AAElB,UAAM,OAAO,MAAM,KAAK,UAAU,EAAE;AAAA,MAClC,QAAM,GAAG,sBAAsB,EAAE;AAAA,IACnC;AAEA,QAAI,aAAa;AACjB,QAAI,SAAS,UAAU;AACvB,WAAO,QAAQ;AACb,YAAM,QAAQ,OAAO,iBAAiB,MAAM;AAC5C,YAAM,YAAY,MAAM;AACxB,YAAM,eAAe,cAAc,UAAU,cAAc;AAC3D,UAAI,gBAAgB,OAAO,eAAe,OAAO,eAAe,IAAI;AAClE,YAAI,KAAK,KAAK,OAAO,YAAY,OAAO,YAAY,KAAK,OAAO,eAAe,IAAI;AACjF,uBAAa;AAAA,QACf;AACA;AAAA,MACF;AACA,eAAS,OAAO;AAAA,IAClB;AAEA,QAAI,CAAC,cAAc,yBAAyB,SAAS;AACnD,YAAM,QAAQ,SAAS;AACvB,UAAI,MAAM,eAAe,OAAO,cAAc,IAAI;AAChD,YAAI,KAAK,KAAK,OAAO,cAAc,OAAO,OAAO,KAAK,MAAM,eAAe,IAAI;AAC7E,uBAAa;AAAA,QACf;AAAA,MACF;AAAA,IACF;AAEA,QAAI,UAAU;AACd,QAAI,YAAY;AACd,UAAI,wBAAwB,SAAS;AACnC,cAAM,aAAa,SAAS,UAAU,OAAK,EAAE,OAAO,wBAAwB,OAAO;AACnF,YAAI,eAAe,IAAI;AACrB,oBAAU;AAAA,QACZ,OAAO;AACL,oBAAU,SAAS,SAAS;AAAA,QAC9B;AAAA,MACF,OAAO;AACL,kBAAU,SAAS,SAAS;AAAA,MAC9B;AAAA,IACF,OAAO;AACL,eAAS,IAAI,KAAK,SAAS,GAAG,KAAK,GAAG,KAAK;AACzC,YAAI,KAAK,CAAC,KAAK,WAAW;AACxB,oBAAU;AACV;AAAA,QACF;AAAA,MACF;AAEA,UAAI,YAAY,IAAI;AAClB,cAAM,YAAY,OAAO;AACzB,YAAI,aAAa;AACjB,iBAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACpC,cAAI,KAAK,CAAC,IAAI,aAAa,KAAK,CAAC,IAAI,YAAY;AAC/C,yBAAa,KAAK,CAAC;AACnB,sBAAU;AAAA,UACZ;AAAA,QACF;AAEA,YAAI,YAAY,GAAI,WAAU;AAAA,MAChC;AAAA,IACF;AAEA,UAAM,UAAU,SAAS,OAAO;AAChC,QAAI,QAAS,aAAY,QAAQ,EAAE;AAAA,EACrC,GAAG,CAAC,QAAQ,QAAQ,CAAC;AAErB,QAAM,+BAA+BA,aAAY,MAAM;AACrD,QAAI,wBAAwB,QAAS;AACrC,QAAI,CAAC,QAAQ,KAAM;AAEnB,UAAM,EAAE,MAAM,IAAI;AAClB,UAAM,YAAY,MAAM,UAAU;AAElC,QAAI,UAAU;AACd,aAAS,IAAI,SAAS,SAAS,GAAG,KAAK,GAAG,KAAK;AAC7C,UAAI,SAAS,CAAC,EAAE,OAAO,WAAW;AAChC,kBAAU;AACV;AAAA,MACF;AAAA,IACF;AAEA,QAAI,WAAW,KAAK,SAAS,OAAO,GAAG;AACrC,kBAAY,SAAS,OAAO,EAAE,EAAE;AAChC,8BAAwB,UAAU,SAAS,OAAO,EAAE;AAAA,IACtD;AAAA,EACF,GAAG,CAAC,QAAQ,QAAQ,CAAC;AAErB,QAAM,0BAA0BD,QAAO,oBAAoB;AAC3D,QAAM,kCAAkCA,QAAO,4BAA4B;AAC3E,EAAAE,WAAU,MAAM;AACd,4BAAwB,UAAU;AAClC,oCAAgC,UAAU;AAAA,EAC5C,CAAC;AAED,EAAAA,WAAU,MAAM;AACd,QAAI,CAAC,QAAQ,KAAM;AAEnB,QAAI,QAAQ;AACZ,UAAM,WAAW,MAAM;AACrB,UAAI,MAAO;AACX,cAAQ,sBAAsB,MAAM;AAClC,gCAAwB,QAAQ;AAChC,gBAAQ;AAAA,MACV,CAAC;AAAA,IACH;AAEA,WAAO,iBAAiB,UAAU,UAAU,EAAE,SAAS,MAAM,SAAS,KAAK,CAAC;AAC5E,WAAO,iBAAiB,UAAU,UAAU,EAAE,SAAS,KAAK,CAAC;AAE7D,UAAM,SAAS,WAAW,MAAM;AAC9B,8BAAwB,QAAQ;AAAA,IAClC,GAAG,GAAG;AAEN,WAAO,MAAM;AACX,mBAAa,MAAM;AACnB,UAAI,MAAO,sBAAqB,KAAK;AACrC,aAAO,oBAAoB,UAAU,UAAU,EAAE,SAAS,KAAK,CAAC;AAChE,aAAO,oBAAoB,UAAU,QAAQ;AAAA,IAC/C;AAAA,EACF,GAAG,CAAC,MAAM,CAAC;AAEX,EAAAA,WAAU,MAAM;AACd,4BAAwB,QAAQ;AAAA,EAClC,GAAG,CAAC,QAAQ,CAAC;AAEb,EAAAA,WAAU,MAAM;AACd,QAAI,CAAC,OAAQ;AACb,UAAM,UAAU,MAAM;AACpB,UAAI,CAAC,wBAAwB,SAAS;AACpC,wCAAgC,QAAQ;AAAA,MAC1C;AAAA,IACF;AACA,WAAO,GAAG,mBAAmB,OAAO;AACpC,WAAO,MAAM,OAAO,IAAI,mBAAmB,OAAO;AAAA,EACpD,GAAG,CAAC,MAAM,CAAC;AAEX,EAAAA,WAAU,MAAM;AACd,UAAM,QAAQ,CAAC,MAAqB;AAClC,UAAI,EAAE,QAAQ,YAAY,OAAQ,WAAU,KAAK;AAAA,IACnD;AACA,aAAS,iBAAiB,WAAW,KAAK;AAC1C,WAAO,MAAM,SAAS,oBAAoB,WAAW,KAAK;AAAA,EAC5D,GAAG,CAAC,MAAM,CAAC;AAEX,EAAAA,WAAU,MAAM;AACd,UAAM,mBAAmB,MAAM;AAC7B,8BAAwB,UAAU;AAAA,IACpC;AACA,WAAO,iBAAiB,SAAS,kBAAkB,EAAE,SAAS,KAAK,CAAC;AACpE,WAAO,iBAAiB,aAAa,kBAAkB,EAAE,SAAS,KAAK,CAAC;AACxE,WAAO,iBAAiB,WAAW,kBAAkB,EAAE,SAAS,KAAK,CAAC;AACtE,WAAO,iBAAiB,aAAa,kBAAkB,EAAE,SAAS,KAAK,CAAC;AACxE,WAAO,MAAM;AACX,aAAO,oBAAoB,SAAS,gBAAgB;AACpD,aAAO,oBAAoB,aAAa,gBAAgB;AACxD,aAAO,oBAAoB,WAAW,gBAAgB;AACtD,aAAO,oBAAoB,aAAa,gBAAgB;AAAA,IAC1D;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,QAAM,cAAcD,aAAY,CAAC,YAAyB;AACxD,QAAI,CAAC,OAAQ;AACb,UAAM,EAAE,IAAI,IAAI;AAEhB,gBAAY,QAAQ,EAAE;AACtB,4BAAwB,UAAU,QAAQ;AAE1C,4BAAwB,UAAU;AAClC,6BAAyB,UAAU;AAEnC,WAAO,MAAM,EAAE,MAAM,EAAE,iBAAiB,GAAG,EAAE,IAAI;AAEjD,eAAW,MAAM;AACf,YAAM,OAAO,OAAO,KAAK,QAAQ,GAAG;AACpC,UAAI,KAAM,MAAK,eAAe,EAAE,UAAU,UAAU,OAAO,QAAQ,CAAC;AAEpE,iBAAW,MAAM;AACf,gCAAwB,UAAU;AAClC,iCAAyB,UAAU;AACnC,gCAAwB,QAAQ;AAAA,MAClC,GAAG,GAAG;AAAA,IACR,GAAG,EAAE;AAAA,EACP,GAAG,CAAC,MAAM,CAAC;AAEX,QAAM,YAAY,CAAC,UAAkB,UAAU,IAAI,KAAK,QAAQ,KAAK;AAErE,QAAM,mBAAmB,CAAC,OAAe,UAAkB;AACzD,UAAM,mBAAmB,SAAS,MAAM,GAAG,KAAK;AAEhD,QAAI,cAAc;AAClB,aAAS,IAAI,iBAAiB,SAAS,GAAG,KAAK,GAAG,KAAK;AACrD,UAAI,iBAAiB,CAAC,EAAE,QAAQ,OAAO;AACrC,sBAAc;AACd;AAAA,MACF;AAAA,IACF;AAEA,UAAM,uBAAuB,iBAC1B,MAAM,cAAc,CAAC,EACrB,OAAO,OAAK,EAAE,UAAU,KAAK,EAAE,SAAS;AAE3C,YAAQ,OAAO;AAAA,MACb,KAAK;AAAG,eAAO;AAAA,MACf,KAAK,GAAG;AACN,cAAM,QAAQ,CAAC,KAAK,MAAM,OAAO,MAAM,KAAK,MAAM,OAAO,QAAQ,MAAM,GAAG;AAC1E,eAAO,wBAAwB,KAAK,GAAG,MAAM,uBAAuB,CAAC,CAAC,MAAM,GAAG,oBAAoB;AAAA,MACrG;AAAA,MACA,KAAK;AAAG,eAAO,GAAG,oBAAoB;AAAA,MACtC,KAAK;AAAG,eAAO;AAAA,MACf,KAAK;AAAG,eAAO;AAAA,MACf,KAAK;AAAG,eAAO;AAAA,MACf;AAAS,eAAO,GAAG,oBAAoB;AAAA,IACzC;AAAA,EACF;AAEA,QAAM,kBAAkB,CAAC,UAAkB;AACzC,UAAM,SAAiC;AAAA,MACrC,GAAG;AAAA,MAAW,GAAG;AAAA,MAAW,GAAG;AAAA,MAAW,GAAG;AAAA,MAAW,GAAG;AAAA,MAAW,GAAG;AAAA,IAC3E;AACA,WAAO,OAAO,KAAK,KAAK;AAAA,EAC1B;AAEA,QAAM,mBAAmB,SAAS,MAAM,OAAO,KAAK,CAAC,IAAI,MAAM,OAAO,KAAK,CAAC;AAC5E,QAAM,yBAAyB,SAAS,MAAM,OAAO,KAAK,CAAC,IAAI,MAAM,OAAO,KAAK,CAAC;AAClF,QAAM,cAAc,SAAS,MAAM,OAAO,KAAK,CAAC,IAAI,MAAM,OAAO,KAAK,CAAC;AACvE,QAAM,YAAY,SAAS,MAAM,OAAO,KAAK,CAAC,IAAI,MAAM,OAAO,KAAK,CAAC;AACrE,QAAM,kBAAkB,SAAS,MAAM,OAAO,KAAK,CAAC,IAAI,MAAM,OAAO,KAAK,CAAC;AAC3E,QAAM,qBAAqB,SAAS,YAAY;AAChD,QAAM,uBAAuB,SAAS,MAAM,OAAO,KAAK,CAAC,IAAI,MAAM,OAAO,KAAK,CAAC;AAChF,QAAM,sBAAsB,SAAS,MAAM,OAAO,KAAK,CAAC,IAAI,MAAM,OAAO,KAAK,CAAC;AAE/E,QAAM,cAAc,SAAS,UAAU,OAAK,EAAE,OAAO,QAAQ;AAE7D,MAAI,SAAS,WAAW,EAAG,QAAO;AAElC,SACE,gBAAAL,MAAAF,WAAA,EACE;AAAA,oBAAAC;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA;AAAA,QACA;AAAA,QACA,YAAY;AAAA;AAAA,IACd;AAAA,IAEA,gBAAAC;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,UAAU;AAAA,QACV,UAAS;AAAA,QACT,QAAQ;AAAA,QACR,WAAS;AAAA,QACT,QAAO;AAAA,QACP,cAAY;AAAA,QACZ,qBAAqB;AAAA,QACrB,QAAQ;AAAA,UACN,UAAU;AAAA,YACR,SAAS;AAAA,YACT,UAAU;AAAA,YACV,cAAc,MAAM,OAAO;AAAA,YAC3B,QAAQ,aAAa,WAAW;AAAA,UAClC;AAAA,QACF;AAAA,QAEA;AAAA,0BAAAD,KAAC,QAAQ,QAAR,EACC,0BAAAA;AAAA,YAACQ;AAAA,YAAA;AAAA,cACC,KAAK;AAAA,cACL,SAAS,CAAC,MAAM;AACd,kBAAE,gBAAgB;AAClB,0BAAU,CAAC,MAAM,CAAC,CAAC;AAAA,cACrB;AAAA,cACA,OAAO;AAAA,gBACL,UAAU;AAAA,gBACV,OAAO;AAAA,gBACP,KAAK;AAAA,gBACL,OAAO;AAAA,gBACP,QAAQ;AAAA,gBACR,cAAc;AAAA,gBACd,YAAY,SAAS,yBAAyB;AAAA,gBAC9C,QAAQ,aAAa,WAAW;AAAA,gBAChC,SAAS;AAAA,gBACT,YAAY;AAAA,gBACZ,gBAAgB;AAAA,gBAChB,QAAQ;AAAA,gBACR,QAAQ;AAAA,gBACR,YAAY;AAAA,gBACZ,WAAW,SACP,aAAa,SAAS,oBAAoB,kBAAkB,KAC5D,aAAa,SAAS,oBAAoB,iBAAiB;AAAA,cACjE;AAAA,cACA,OAAM;AAAA,cAEN,0BAAAR;AAAA,gBAAC;AAAA;AAAA,kBACC,MAAM;AAAA,kBACN,OAAO,SAAS,kBAAkB;AAAA,kBAClC,QAAQ;AAAA;AAAA,cACV;AAAA;AAAA,UACF,GACF;AAAA,UAEA,gBAAAA,KAAC,QAAQ,UAAR,EAAiB,IAAI,oBACpB,0BAAAA;AAAA,YAACQ;AAAA,YAAA;AAAA,cACC,OAAO;AAAA,gBACL,OAAO;AAAA,gBACP,UAAU;AAAA,gBACV,SAAS;AAAA,gBACT,eAAe;AAAA,gBACf,iBAAiB;AAAA,cACnB;AAAA,cAEA,0BAAAR;AAAA,gBAAC,WAAW;AAAA,gBAAX;AAAA,kBACC,KAAK;AAAA,kBACL,eAAe;AAAA,kBACf,kBAAkB;AAAA,kBAClB,MAAK;AAAA,kBACL,QAAQ;AAAA,oBACN,WAAW;AAAA,sBACT,kCAAkC,EAAE,SAAS,GAAG,OAAO,EAAE;AAAA,oBAC3D;AAAA,oBACA,OAAO;AAAA,sBACL,iBAAiB,SAAS,MAAM,OAAO,KAAK,CAAC,IAAI,MAAM,OAAO,KAAK,CAAC;AAAA,oBACtE;AAAA,kBACF;AAAA,kBAEA,0BAAAA,KAACQ,MAAA,EAAI,IAAI,IAAI,IAAI,IACd,mBAAS,IAAI,CAAC,SAAS,UACtB,gBAAAR;AAAA,oBAACQ;AAAA,oBAAA;AAAA,sBAEC,OAAO;AAAA,wBACL,SAAS;AAAA,wBACT,aAAa,GAAG,UAAU,QAAQ,KAAK,CAAC;AAAA,wBACxC,cAAc,MAAM,OAAO;AAAA,wBAC3B,QAAQ;AAAA,wBACR,YAAY,aAAa,QAAQ,KAAK,uBAAuB;AAAA,wBAC7D,YAAY,aAAa,QAAQ,KAC7B,aAAa,MAAM,OAAO,KAAK,CAAC,CAAC,KACjC;AAAA,wBACJ,YAAY;AAAA,wBACZ,cAAc;AAAA,sBAChB;AAAA,sBACA,SAAS,MAAM,YAAY,OAAO;AAAA,sBAClC,cAAc,CAAC,MAAM;AACnB,4BAAI,aAAa,QAAQ,GAAI,GAAE,cAAc,MAAM,aAAa;AAAA,sBAClE;AAAA,sBACA,cAAc,CAAC,MAAM;AACnB,4BAAI,aAAa,QAAQ,GAAI,GAAE,cAAc,MAAM,aAAa;AAAA,sBAClE;AAAA,sBAEA,0BAAAP;AAAA,wBAACQ;AAAA,wBAAA;AAAA,0BACC,MAAK;AAAA,0BACL,UAAQ;AAAA,0BACR,OAAO;AAAA,4BACL,OAAO,gBAAgB,QAAQ,KAAK;AAAA,4BACpC,YAAY,QAAQ,SAAS,IAAI,MAAM;AAAA,4BACvC,UAAU,QAAQ,SAAS,IAAI,SAAS;AAAA,4BACxC,SAAS;AAAA,4BACT,YAAY;AAAA,4BACZ,KAAK;AAAA,0BACP;AAAA,0BAEC;AAAA,6CAAiB,QAAQ,OAAO,KAAK,KACpC,gBAAAT;AAAA,8BAACS;AAAA,8BAAA;AAAA,gCACC,WAAU;AAAA,gCACV,MAAK;AAAA,gCACL,OAAO;AAAA,kCACL,OAAO,gBAAgB,QAAQ,KAAK;AAAA,kCACpC,YAAY;AAAA,kCACZ,YAAY;AAAA,gCACd;AAAA,gCAEC,2BAAiB,QAAQ,OAAO,KAAK;AAAA;AAAA,4BACxC;AAAA,4BAED,QAAQ,QAAQ;AAAA;AAAA;AAAA,sBACnB;AAAA;AAAA,oBA/CK,GAAG,QAAQ,EAAE,IAAI,KAAK;AAAA,kBAgD7B,CACD,GACH;AAAA;AAAA,cACF;AAAA;AAAA,UACF,GACF;AAAA;AAAA;AAAA,IACF;AAAA,KACF;AAEJ,CAAC;AAED,qBAAqB,cAAc;;;AE7anC,OAAO,qBAAqB;AAG5B,IAAM,WAAW,IAAI,gBAAgB;AAAA,EACnC,cAAc;AAAA,EACd,gBAAgB;AAAA,EAChB,IAAI;AACN,CAAC;AAED,SAAS,QAAQ,oBAAoB;AAAA,EACnC,QAAQ,CAAC,SAAc;AACrB,UAAM,cAAc,KAAK,cAAc,wBAAwB,MAAM;AACrE,WAAO;AAAA,EACT;AAAA,EAEA,aAAa,CAAC,SAAS,SAAc;AACnC,UAAM,WAAW,KAAK,cAAc,wBAAwB;AAC5D,UAAM,UAAU,UAAU,WAAW,UAAU,aAAa,SAAS,MAAM;AAC3E,UAAM,OAAO,QAAQ,QAAQ,oBAAoB,EAAE,EAAE,KAAK;AAC1D,UAAM,cAAc,QAAQ;AAC5B,WAAO,MAAM,UAAU,MAAM,GAAG,KAAK,WAAW;AAAA;AAAA,EAClD;AACF,CAAC;AAED,SAAS,QAAQ,gBAAgB;AAAA,EAC/B,QAAQ,CAAC,SAAc;AACrB,QAAI,KAAK,aAAa,KAAM,QAAO;AACnC,UAAM,OAAO,KAAK,eAAe;AACjC,WAAO,gBAAgB,KAAK,IAAI;AAAA,EAClC;AAAA,EAEA,aAAa,CAAC,UAAU,SAAc;AACpC,UAAM,OAAO,KAAK,eAAe;AACjC,UAAM,QAAQ,KAAK,MAAM,wBAAwB;AAEjD,QAAI,CAAC,MAAO,QAAO;AAEnB,UAAM,UAAU,MAAM,CAAC,EAAE,YAAY,MAAM;AAC3C,UAAM,YAAY,MAAM,CAAC,EAAE,KAAK;AAEhC,UAAM,UAAU,aAAa;AAE7B,WAAO,MAAM,UAAU,MAAM,GAAG,KAAK,OAAO;AAAA;AAAA,EAC9C;AACF,CAAC;AAED,SAAS,QAAQ,YAAY;AAAA,EAC3B,QAAQ,CAAC,SAAc;AACrB,QAAI,KAAK,aAAa,KAAM,QAAO;AAEnC,UAAM,OAAO,KAAK,eAAe;AAEjC,QAAI,gBAAgB,KAAK,IAAI,EAAG,QAAO;AACvC,QAAI,KAAK,cAAc,wBAAwB,EAAG,QAAO;AAEzD,WAAO;AAAA,EACT;AAAA,EAEA,aAAa,CAAC,SAAS,SAAc;AACnC,UAAM,SAAS,KAAK;AACpB,QAAI,OAAO,aAAa,MAAM;AAC5B,YAAM,YAAY,OAAO,aAAa,OAAO;AAC7C,UAAI;AACJ,UAAI,WAAW;AACb,iBAAS,SAAS,WAAW,EAAE;AAAA,MACjC,OAAO;AACL,cAAM,QAAQ,MAAM,KAAK,OAAO,QAAQ,EAAE,OAAO,CAAC,UAAmB,MAAM,aAAa,IAAI;AAC5F,iBAAS,MAAM,QAAQ,IAAI,IAAI;AAAA,MACjC;AACA,aAAO,GAAG,MAAM,KAAK,QAAQ,KAAK,CAAC;AAAA;AAAA,IACrC;AACA,WAAO,OAAO,QAAQ,KAAK,IAAI;AAAA,EACjC;AACF,CAAC;AAED,SAAS,QAAQ,SAAS;AAAA,EACxB,QAAQ;AAAA,EACR,aAAa,CAAC,UAAU,SAAc;AACpC,UAAM,OAAO,KAAK,iBAAiB,IAAI;AACvC,QAAI,CAAC,KAAK,OAAQ,QAAO;AAEzB,UAAM,eAAyB,CAAC;AAChC,QAAI,QAAQ;AAEZ,eAAW,OAAO,MAAM;AACtB,YAAM,QAAQ,IAAI,iBAAiB,QAAQ;AAC3C,UAAI,CAAC,MAAM,OAAQ;AAEnB,YAAM,WAAW,CAAC,SAAS,IAAI,cAAc,IAAI,MAAM;AACvD,UAAI,SAAU,SAAQ;AAEtB,YAAM,YAAY,MAAM;AAAA,QAAK;AAAA,QAAO,CAAC,UAClC,KAAK,eAAe,IAAI,KAAK,EAAE,QAAQ,OAAO,KAAK;AAAA,MACtD;AAEA,mBAAa,KAAK,OAAO,UAAU,KAAK,KAAK,IAAI,IAAI;AAErD,UAAI,UAAU;AACZ,qBAAa,KAAK,OAAO,UAAU,IAAI,MAAM,KAAK,EAAE,KAAK,KAAK,IAAI,IAAI;AAAA,MACxE;AAAA,IACF;AAEA,QAAI,CAAC,SAAS,aAAa,SAAS,GAAG;AACrC,YAAM,WAAW,KAAK,CAAC,EAAE,iBAAiB,QAAQ,EAAE;AACpD,mBAAa,OAAO,GAAG,GAAG,OAAO,MAAM,KAAK,EAAE,QAAQ,SAAS,GAAG,MAAM,KAAK,EAAE,KAAK,KAAK,IAAI,IAAI;AAAA,IACnG;AAEA,WAAO,OAAO,aAAa,KAAK,IAAI,IAAI;AAAA,EAC1C;AACF,CAAC;AAEA,CAAC,MAAM,IAAI,EAAE;AAAA,EAAQ,SACpB,SAAS,QAAQ,aAAa,GAAG,IAAI;AAAA,IACnC,QAAQ,CAAC,SAAc,KAAK,aAAa;AAAA,IACzC,aAAa,CAAC,YAAY;AAAA,EAC5B,CAAC;AACH;AAEC,CAAC,SAAS,SAAS,SAAS,IAAI,EAAE;AAAA,EAAQ,SACzC,SAAS,QAAQ,gBAAgB,GAAG,IAAI;AAAA,IACtC,QAAQ,CAAC,SAAc,KAAK,aAAa;AAAA,IACzC,aAAa,CAAC,YAAY;AAAA,EAC5B,CAAC;AACH;AAEA,SAAS,QAAQ,aAAa;AAAA,EAC5B,QAAQ,CAAC,SAAc,KAAK,aAAa,UAAU,CAAC,CAAC,KAAK,MAAM;AAAA,EAChE,aAAa,CAAC,SAAS,SAAc;AACnC,WAAO,uBAAuB,KAAK,MAAM,KAAK,KAAK,OAAO;AAAA,EAC5D;AACF,CAAC;AAEM,IAAM,cAAc,CAAC,QAAuB,UAAmC;AACpF,QAAM,YAAY,MAAM;AACxB,MAAI,CAAC,UAAW,QAAO;AAEvB,QAAM,OAAO,UAAU,QAAQ,WAAW;AAC1C,QAAM,OAAO,UAAU,QAAQ,YAAY;AAE3C,aAAW,QAAQ,UAAU,OAAO;AAClC,QAAI,KAAK,KAAK,WAAW,OAAO,GAAG;AACjC,YAAM,OAAO,KAAK,UAAU;AAC5B,UAAI,QAAQ,QAAQ;AAClB,cAAM,SAAS,IAAI,WAAW;AAC9B,eAAO,SAAS,CAAC,MAAM;AACrB,iBAAO,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,OAAiB,CAAC,EAAE,IAAI;AAAA,QAC3E;AACA,eAAO,cAAc,IAAI;AACzB,cAAM,eAAe;AACrB,eAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF;AAEA,MAAI,QAAQ,QAAQ;AAClB,UAAM,WAAW,SAAS,SAAS,IAAI,EAAE,QAAQ,WAAW,MAAM;AAClE,WAAO,MAAM,EAAE,MAAM,EAAE,cAAc,QAAQ,EAAE,IAAI;AACnD,UAAM,eAAe;AACrB,WAAO;AAAA,EACT;AAEA,MAAI,QAAQ,QAAQ;AAClB,WAAO,MAAM,EAAE,MAAM,EAAE,cAAc,IAAI,EAAE,IAAI;AAC/C,UAAM,eAAe;AACrB,WAAO;AAAA,EACT;AAEA,SAAO;AACT;;;ApBhFI,SAC0B,OAAAC,OAD1B,QAAAC,aAAA;AArEJ,IAAM,iBAAiBC,MAAK,SAASC,gBAAe;AAAA,EAClD,iBAAiB;AAAA,EACjB;AAAA,EACA,eAAe;AAAA,EACf,sBAAsB;AAAA,EACtB,sBAAsB;AAAA,EACtB,YAAY;AAAA,EACZ,WAAW;AACb,GAAgB;AAEd,QAAM,CAAC,UAAU,WAAW,IAAIC,UAAwB,CAAC,CAAC;AAE1D,QAAM,uBAAuBC,aAAY,CAAC,gBAA+B;AACvE,gBAAY,WAAW;AAAA,EACzB,GAAG,CAAC,CAAC;AAGL,QAAM,eAAeC,SAAQ,MAAM;AACjC,WAAO,mBAAmB;AAAA,MACxB,MAAM;AAAA,MACN,OAAO,CAAC,EAAE,QAAAC,SAAQ,MAAM,MAAW;AACjC,cAAM,SAAS,qBAAqBA,OAAM;AAC1C,YAAI,CAAC,MAAO,QAAO;AACnB,eAAO,OAAO;AAAA,UAAO,CAAC,SACpB,KAAK,MAAM,YAAY,EAAE,SAAS,MAAM,YAAY,CAAC,KACrD,KAAK,aAAa,YAAY,EAAE,SAAS,MAAM,YAAY,CAAC,KAC5D,KAAK,UAAU,KAAK,CAAC,MAAc,EAAE,YAAY,EAAE,SAAS,MAAM,YAAY,CAAC,CAAC;AAAA,QAClF;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH,GAAG,CAAC,CAAC;AAEL,QAAM,SAAS,qBAAqB;AAAA,IAClC;AAAA,IACA,iBAAiB;AAAA,IACjB;AAAA,IACA,YAAY;AAAA,MACV,GAAI,sBAAsB,CAAC,IAAI,CAAC;AAAA,MAChC,GAAI,sBAAsB,CAAC,iCAAgB,UAAU,EAAE,UAAU,qBAAqB,CAAC,CAAC,IAAI,CAAC;AAAA,MAC7F;AAAA,IACF;AAAA,IACA;AAAA,IACA,aAAa;AAAA,MACX,YAAY;AAAA,QACV,YAAY;AAAA,QACZ,OAAO;AAAA,MACT;AAAA,MACA,iBAAiB;AAAA,QACf,OAAO,CAAC,OAAO,UAA0B;AACvC,iBAAO,YAAY,QAAQ,KAAK;AAAA,QAClC;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAC;AAED,EAAAC,WAAU,MAAM;AACd,QAAI,QAAQ;AACV,aAAO,YAAY,QAAQ;AAAA,IAC7B;AAAA,EACF,GAAG,CAAC,QAAQ,QAAQ,CAAC;AAErB,QAAM,EAAE,aAAa,eAAe,IAAIC,uBAAsB;AAC9D,QAAM,QAAQC,iBAAgB;AAC9B,QAAM,cAAc,mBAAmB,cAAc;AACrD,QAAM,UAAU,gBAAgB,SAAS,MAAM,OAAO,KAAK,CAAC,IAAI,MAAM,OAAO,KAAK,CAAC;AAEnF,MAAI,CAAC,OAAQ,QAAO;AAEpB,SACE,gBAAAT,MAAC,QAAK,QAAO,MAAK,SAAQ,MAAK,QAAO,QAAO,IAAI,SAAS,YAAU,MAAC,OAAO,EAAE,UAAU,WAAW,GAChG;AAAA,2BAAuB,gBAAAD,MAAC,wBAAqB,UAAoB,QAAgB;AAAA,IAClF,gBAAAA,MAAC,iBAAc,QAAgB,WAAsB;AAAA,IACrD,gBAAAA,MAAC,cAAW,QAAgB;AAAA,KAC9B;AAEJ,CAAC;AAED,eAAe,cAAc;AAC7B,IAAO,yBAAQ;;;AqBjGf,SAAS,YAAAW,WAAU,aAAAC,kBAAiB;AACpC;AAAA,EACE,SAAAC;AAAA,EACA,QAAAC;AAAA,EACA,OAAAC;AAAA,EACA;AAAA,EACA,UAAAC;AAAA,EACA,UAAAC;AAAA,EACA,SAAAC;AAAA,EACA,YAAAC;AAAA,EACA,SAAAC;AAAA,EACA,mBAAAC;AAAA,EACA,yBAAAC;AAAA,OACK;AACP,SAAS,cAAc,mBAAAC,wBAAuB;AAyJtC,SACE,OAAAC,OADF,QAAAC,cAAA;AA5ID,SAAS,eAAe,EAAE,QAAQ,QAAQ,QAAQ,GAAwB;AAC/E,QAAM,QAAQC,iBAAgB;AAC9B,QAAM,EAAE,YAAY,IAAIC,uBAAsB;AAC9C,QAAM,SAAS,gBAAgB;AAE/B,QAAM,CAAC,UAAU,WAAW,IAAIC,UAAS,EAAE;AAC3C,QAAM,CAAC,kBAAkB,mBAAmB,IAAIA,UAAwB,IAAI;AAC5E,QAAM,CAAC,WAAW,YAAY,IAAIA,UAAS,KAAK;AAChD,QAAM,CAAC,SAAS,UAAU,IAAIA,UAAwB,IAAI;AAC1D,QAAM,CAAC,cAAc,eAAe,IAAIA,UAAS,EAAE;AACnD,QAAM,CAAC,cAAc,eAAe,IAAIA,UAAwB,CAAC,CAAC;AAClE,QAAM,CAAC,kBAAkB,mBAAmB,IAAIA,UAAS,KAAK;AAE9D,EAAAC,WAAU,MAAM;AACd,QAAI,QAAQ;AACV,YAAM,EAAE,MAAM,GAAG,IAAI,OAAO,MAAM;AAClC,YAAM,eAAe,6BAA6B,QAAQ,MAAM,EAAE;AAClE,sBAAgB,YAAY;AAE5B,YAAM,gBAAgB,aAAa,QAAQ,0BAA0B;AACrE,UAAI,eAAe;AACjB,4BAAoB,aAAa;AAAA,MACnC,WAAW,aAAa,SAAS,GAAG;AAClC,cAAM,gBAAgB,aAAa,CAAC,EAAE,KAAK,YAAY;AACvD,4BAAoB,aAAa;AAAA,MACnC;AAAA,IACF;AAAA,EACF,GAAG,CAAC,QAAQ,QAAQ,YAAY,CAAC;AAEjC,EAAAA,WAAU,MAAM;AACd,QAAI,CAAC,OAAQ;AAEb,UAAM,oBAAoB,YAAY;AACpC,UAAI;AACF,4BAAoB,IAAI;AACxB,cAAM,WAAW,MAAM,gBAAgB,OAAO;AAC9C,YAAI,SAAS,WAAW,UAAU,UAAU;AAC1C,0BAAgB,SAAS,IAAI;AAAA,QAC/B;AAAA,MACF,SAAS,OAAO;AACd,gBAAQ,MAAM,iCAAiC,KAAK;AAAA,MACtD,UAAE;AACA,4BAAoB,KAAK;AAAA,MAC3B;AAAA,IACF;AAEA,sBAAkB;AAAA,EACpB,GAAG,CAAC,MAAM,CAAC;AAEX,EAAAA,WAAU,MAAM;AACd,QAAI,qBAAqB,MAAM;AAC7B,mBAAa,QAAQ,4BAA4B,gBAAgB;AAAA,IACnE;AAAA,EACF,GAAG,CAAC,gBAAgB,CAAC;AAErB,QAAM,qBAAqB,MAAM;AAC/B,WAAO,aAAa,IAAI,kBAAgB;AAAA,MACtC,OAAO,YAAY,KAAK,YAAY;AAAA,MACpC,OAAO,YAAY,KAAK,OAAO,CAAC,EAAE,YAAY,IAAI,YAAY,KAAK,MAAM,CAAC;AAAA,IAC5E,EAAE;AAAA,EACJ;AAEA,QAAM,iBAAiB,YAAY;AACjC,UAAM,EAAE,MAAM,GAAG,IAAI,OAAO,MAAM;AAClC,UAAM,eAAe,6BAA6B,QAAQ,MAAM,EAAE;AAElE,QAAI,CAAC,aAAa,KAAK,GAAG;AACxB,iBAAW,uDAAuD;AAClE;AAAA,IACF;AAEA,QAAI,CAAC,SAAS,KAAK,KAAK,CAAC,kBAAkB;AACzC,iBAAW,6CAA6C;AACxD;AAAA,IACF;AAEA,iBAAa,IAAI;AACjB,eAAW,IAAI;AAEf,QAAI;AACF,UAAI,qBAAqB;AACzB,UAAI,kBAAkB;AACpB,cAAM,cAAc,aAAa;AAAA,UAAK,UACpC,KAAK,KAAK,YAAY,MAAM,iBAAiB,YAAY;AAAA,QAC3D;AACA,YAAI,aAAa;AACf,+BAAqB,YAAY;AAAA,QACnC;AAAA,MACF;AAEA,YAAM,WAAW,MAAM,OAAO,SAAS;AAAA,QACrC,MAAM,oBAAoB;AAAA,QAC1B,QAAQ;AAAA,QACR,SAAS;AAAA,MACX,CAAC;AAED,UAAI,SAAS,WAAW,UAAU,UAAU;AAC1C,cAAM,oBAAoB,SAAS,KAAK;AACxC,gBAAQ,IAAI,uBAAuB,iBAAiB;AAEpD,eACG,MAAM,EACN,MAAM,EACN,YAAY,EAAE,MAAM,GAAG,CAAC,EACxB,cAAc,qBAAqB,EAAE,EACrC,IAAI;AAEP,gBAAQ;AACR,oBAAY,EAAE;AACd,4BAAoB,IAAI;AAExB,mCAAmB,QAAQ;AAAA,UACzB,OAAO;AAAA,UACP,SAAS;AAAA,QACX,CAAC;AAAA,MACH;AAAA,IACF,SAAS,OAAY;AACnB,cAAQ,MAAM,sBAAsB,KAAK;AACzC,iBAAW,MAAM,WAAW,gCAAgC;AAC5D,iCAAmB,MAAM;AAAA,QACvB,OAAO;AAAA,QACP,SAAS,MAAM,WAAW;AAAA,MAC5B,CAAC;AAAA,IACH,UAAE;AACA,mBAAa,KAAK;AAAA,IACpB;AAAA,EACF;AAEA,QAAM,cAAc,MAAM;AACxB,YAAQ;AACR,gBAAY,EAAE;AACd,wBAAoB,IAAI;AACxB,eAAW,IAAI;AAAA,EACjB;AAEA,SACE,gBAAAL;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,SAAS;AAAA,MACT,OACE,gBAAAC,OAACK,QAAA,EAAM,KAAI,MACT;AAAA,wBAAAN,MAAC,gBAAa,MAAM,IAAI;AAAA,QAAE;AAAA,SAE5B;AAAA,MAEF,MAAK;AAAA,MACL,QAAO;AAAA,MACP,UAAQ;AAAA,MAER,0BAAAC,OAACM,QAAA,EAAM,KAAI,MACR;AAAA,wBACC,gBAAAN,OAACO,MAAA,EACC;AAAA,0BAAAR,MAACS,OAAA,EAAK,MAAK,MAAK,IAAI,KAAK,IAAG,MAAK,2BAAa;AAAA,UAC9C,gBAAAT;AAAA,YAACQ;AAAA,YAAA;AAAA,cACC,GAAE;AAAA,cACF,IAAI,SAAS,WAAW;AAAA,cACxB,OAAO;AAAA,gBACL,cAAc,MAAM,OAAO;AAAA,gBAC3B,WAAW;AAAA,gBACX,UAAU;AAAA,gBACV,YAAY;AAAA,cACd;AAAA,cAEA,0BAAAR,MAACS,OAAA,EAAK,MAAK,MAAK,GAAE,QAAO,OAAO,EAAE,YAAY,WAAW,GACtD,uBAAa,SAAS,MAAM,GAAG,aAAa,UAAU,GAAG,GAAG,CAAC,QAAQ,cACxE;AAAA;AAAA,UACF;AAAA,WACF;AAAA,QAGF,gBAAAT;AAAA,UAACU;AAAA,UAAA;AAAA,YACC,OAAM;AAAA,YACN,QAAO;AAAA,YACP,aAAY;AAAA,YACZ,OAAO;AAAA,YACP,UAAU;AAAA,YACV,MAAM,mBAAmB;AAAA,YACzB,WAAS;AAAA,YACT,UAAU;AAAA,YACV,QAAQ;AAAA,cACN,UAAU;AAAA,gBACR,cAAc;AAAA,cAChB;AAAA,YACF;AAAA;AAAA,QACF;AAAA,QAEA,gBAAAV;AAAA,UAACW;AAAA,UAAA;AAAA,YACC,OAAM;AAAA,YACN,QAAO;AAAA,YACP,aAAY;AAAA,YACZ,OAAO;AAAA,YACP,UAAU,CAAC,MAAM,YAAY,EAAE,cAAc,KAAK;AAAA,YAClD,SAAS;AAAA;AAAA,QACX;AAAA,QAEC,WACC,gBAAAX,MAACY,QAAA,EAAM,MAAM,gBAAAZ,MAACa,kBAAA,EAAgB,MAAM,IAAI,GAAI,OAAM,SAAQ,OAAM,OAC7D,mBACH;AAAA,QAGF,gBAAAZ,OAACK,QAAA,EAAM,SAAQ,YAAW,IAAG,MAC3B;AAAA,0BAAAN;AAAA,YAACc;AAAA,YAAA;AAAA,cACC,SAAQ;AAAA,cACR,OAAM;AAAA,cACN,QAAO;AAAA,cACP,SAAS;AAAA,cACV;AAAA;AAAA,UAED;AAAA,UACA,gBAAAd;AAAA,YAACc;AAAA,YAAA;AAAA,cACC,SAAS;AAAA,cACT,SAAS;AAAA,cACT,QAAO;AAAA,cACP,aAAa,CAAC,aAAa,gBAAAd,MAAC,gBAAa,MAAM,IAAI;AAAA,cACnD,OAAM;AAAA,cAEL,sBAAY,kBAAkB;AAAA;AAAA,UACjC;AAAA,WACF;AAAA,SACF;AAAA;AAAA,EACF;AAEJ;;;AC1PA,SAAS,iBAAiB,2BAA2B;AACrD,SAAS,yBAAAe,wBAAuB,mBAAAC,wBAAuB;;;ACDvD,SAAS,aAAAC,YAAW,YAAAC,WAAU,eAAAC,cAAa,UAAAC,eAAc;AACzD,SAAS,SAAAC,QAAO,QAAAC,OAAM,SAAAC,cAAa;AACnC,SAAS,kBAAkB,UAAU,YAAAC,WAAU,aAAAC,YAAW,qBAAqB,oBAAoB,wBAAwB;AAuNvH,qBAAAC,WAwBM,OAAAC,OAyDE,QAAAC,cAjFR;AAhNG,SAAS,cAAc,EAAE,OAAO,GAAuB;AAC5D,QAAM,CAAC,eAAe,gBAAgB,IAAIV,UAAS,KAAK;AACxD,QAAM,CAAC,YAAY,aAAa,IAAIA,UAA8D,CAAC,CAAC;AACpG,QAAM,CAAC,YAAY,aAAa,IAAIA,UAA+D,CAAC,CAAC;AACrG,QAAM,CAAC,eAAe,gBAAgB,IAAIA,UAA8D,IAAI;AAC5G,QAAM,CAAC,eAAe,gBAAgB,IAAIA,UAA8D,IAAI;AAC5G,QAAM,aAAaE,QAAuB,IAAI;AAC9C,QAAM,aAAaA,QAAuB,IAAI;AAE9C,QAAM,kBAAkBD,aAAY,MAAM;AACxC,QAAI,CAAC,OAAO,SAAS,OAAO,GAAG;AAC7B,uBAAiB,KAAK;AACtB,oBAAc,CAAC,CAAC;AAChB,oBAAc,CAAC,CAAC;AAChB;AAAA,IACF;AAEA,UAAM,YAAY,SAAS,cAAc,cAAc;AACvD,QAAI,CAAC,UAAW;AAEhB,UAAM,gBAAgB,UAAU,sBAAsB;AAEtD,QAAI,YAAgC;AAEpC,UAAM,EAAE,MAAM,IAAI;AAClB,UAAM,EAAE,UAAU,IAAI;AACtB,UAAM,cAAc,MAAM,IAAI,QAAQ,UAAU,IAAI;AAEpD,aAAS,QAAQ,YAAY,OAAO,QAAQ,GAAG,SAAS;AACtD,YAAM,OAAO,YAAY,KAAK,KAAK;AACnC,UAAI,KAAK,KAAK,SAAS,SAAS;AAC9B,cAAM,gBAAgB,YAAY,MAAM,KAAK;AAE7C,cAAM,SAAS,SAAS,iBAAiB,oBAAoB;AAC7D,mBAAW,SAAS,QAAQ;AAC1B,cAAI;AACF,kBAAM,SAAS,OAAO,KAAK,SAAS,OAAO,CAAC;AAC5C,gBAAI,WAAW,eAAe;AAC5B,0BAAY;AACZ;AAAA,YACF;AAAA,UACF,QAAQ;AAAA,UACR;AAAA,QACF;AACA;AAAA,MACF;AAAA,IACF;AAEA,QAAI,CAAC,WAAW;AACd,YAAM,MAAM,OAAO,aAAa;AAChC,UAAI,OAAO,IAAI,aAAa,GAAG;AAC7B,cAAM,QAAQ,IAAI,WAAW,CAAC;AAC9B,cAAMU,aAAY,MAAM,eAAe,eAAe,QAAQ,oBAAoB;AAClF,YAAIA,YAAW;AACb,sBAAYA;AAAA,QACd;AAAA,MACF;AAAA,IACF;AAEA,QAAI,CAAC,WAAW;AACd,kBAAY,SAAS,cAAc,oBAAoB;AAAA,IACzD;AAEA,QAAI,CAAC,WAAW;AACd,uBAAiB,KAAK;AACtB,oBAAc,CAAC,CAAC;AAChB,oBAAc,CAAC,CAAC;AAChB;AAAA,IACF;AAEA,qBAAiB,IAAI;AAErB,UAAM,WAAW,UAAU,cAAc,IAAI;AAC7C,QAAI,UAAU;AACZ,YAAM,QAAQ,SAAS,iBAAiB,QAAQ;AAChD,YAAM,YAAiE,CAAC;AAExE,YAAM,QAAQ,CAAC,SAAS;AACtB,cAAM,WAAW,KAAK,sBAAsB;AAC5C,kBAAU,KAAK;AAAA,UACb,KAAK,SAAS,MAAM,cAAc;AAAA,UAClC,MAAM,SAAS,OAAO,cAAc;AAAA,UACpC,OAAO,SAAS;AAAA,QAClB,CAAC;AAAA,MACH,CAAC;AAED,oBAAc,SAAS;AAAA,IACzB;AAEA,UAAM,OAAO,UAAU,iBAAiB,IAAI;AAC5C,QAAI,KAAK,SAAS,GAAG;AACnB,YAAM,YAAkE,CAAC;AAEzE,WAAK,QAAQ,CAAC,QAAQ;AACpB,cAAM,UAAU,IAAI,sBAAsB;AAC1C,kBAAU,KAAK;AAAA,UACb,KAAK,QAAQ,MAAM,cAAc;AAAA,UACjC,MAAM,QAAQ,OAAO,cAAc;AAAA,UACnC,QAAQ,QAAQ;AAAA,QAClB,CAAC;AAAA,MACH,CAAC;AAED,oBAAc,SAAS;AAAA,IACzB;AAAA,EACF,GAAG,CAAC,MAAM,CAAC;AAEX,EAAAZ,WAAU,MAAM;AACd,oBAAgB;AAEhB,UAAM,UAAU,MAAM,gBAAgB;AAEtC,WAAO,GAAG,mBAAmB,OAAO;AACpC,WAAO,GAAG,eAAe,OAAO;AAEhC,UAAM,WAAW,IAAI,iBAAiB,OAAO;AAC7C,UAAM,YAAY,SAAS,cAAc,oBAAoB;AAC7D,QAAI,WAAW;AACb,eAAS,QAAQ,UAAU,eAAgB,EAAE,WAAW,MAAM,SAAS,KAAK,CAAC;AAAA,IAC/E;AAEA,UAAM,qBAAqB,CAAC,MAAkB;AAC5C,UAAI,WAAW,WAAW,CAAC,WAAW,QAAQ,SAAS,EAAE,MAAc,GAAG;AACxE,yBAAiB,IAAI;AAAA,MACvB;AACA,UAAI,WAAW,WAAW,CAAC,WAAW,QAAQ,SAAS,EAAE,MAAc,GAAG;AACxE,yBAAiB,IAAI;AAAA,MACvB;AAAA,IACF;AAEA,QAAI,iBAAiB,eAAe;AAClC,eAAS,iBAAiB,aAAa,kBAAkB;AAAA,IAC3D;AAEA,WAAO,MAAM;AACX,aAAO,IAAI,mBAAmB,OAAO;AACrC,aAAO,IAAI,eAAe,OAAO;AACjC,eAAS,WAAW;AACpB,eAAS,oBAAoB,aAAa,kBAAkB;AAAA,IAC9D;AAAA,EACF,GAAG,CAAC,QAAQ,iBAAiB,eAAe,aAAa,CAAC;AAE1D,QAAM,wBAAwB,MAAM;AAClC;AAAC,IAAC,OAAO,MAAM,EAAU,MAAM,EAAE,eAAe,EAAE,IAAI;AACtD,eAAW,iBAAiB,EAAE;AAC9B,qBAAiB,IAAI;AAAA,EACvB;AAEA,QAAM,qBAAqB,MAAM;AAC/B;AAAC,IAAC,OAAO,MAAM,EAAU,MAAM,EAAE,aAAa,EAAE,IAAI;AACpD,qBAAiB,IAAI;AAAA,EACvB;AAEA,QAAM,mBAAmB,MAAM;AAC7B;AAAC,IAAC,OAAO,MAAM,EAAU,MAAM,EAAE,gBAAgB,EAAE,IAAI;AACvD,eAAW,iBAAiB,EAAE;AAC9B,qBAAiB,IAAI;AAAA,EACvB;AAEA,QAAM,oBAAoB,MAAM;AAC9B;AAAC,IAAC,OAAO,MAAM,EAAU,MAAM,EAAE,eAAe,EAAE,IAAI;AACtD,eAAW,iBAAiB,EAAE;AAC9B,qBAAiB,IAAI;AAAA,EACvB;AAEA,QAAM,qBAAqB,MAAM;AAC/B;AAAC,IAAC,OAAO,MAAM,EAAU,MAAM,EAAE,YAAY,EAAE,IAAI;AACnD,eAAW,iBAAiB,EAAE;AAC9B,qBAAiB,IAAI;AAAA,EACvB;AAEA,QAAM,kBAAkB,MAAM;AAC5B;AAAC,IAAC,OAAO,MAAM,EAAU,MAAM,EAAE,UAAU,EAAE,IAAI;AACjD,qBAAiB,IAAI;AAAA,EACvB;AAEA,QAAM,oBAAoB,MAAM;AAC9B;AAAC,IAAC,OAAO,MAAM,EAAU,MAAM,EAAE,aAAa,EAAE,IAAI;AACpD,eAAW,iBAAiB,EAAE;AAC9B,qBAAiB,IAAI;AAAA,EACvB;AAEA,QAAM,oBAAoB,MAAM;AAC9B;AAAC,IAAC,OAAO,MAAM,EAAU,MAAM,EAAE,YAAY,EAAE,IAAI;AACnD,eAAW,iBAAiB,EAAE;AAC9B,qBAAiB,IAAI;AAAA,EACvB;AAEA,MAAI,CAAC,cAAe,QAAO;AAE3B,MAAI,CAAC,OAAO,WAAY,QAAO;AAE/B,QAAM,kBAAkB;AAAA,IACtB,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,gBAAgB;AAAA,IAChB,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,cAAc;AAAA,IACd,iBAAiB;AAAA,IACjB,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,QAAQ;AAAA,EACV;AAEA,SACE,gBAAAW,OAAAF,WAAA,EACG;AAAA,eAAW,IAAI,CAAC,KAAK,UACpB,gBAAAC;AAAA,MAAC;AAAA;AAAA,QAEC,OAAO;AAAA,UACL,GAAG;AAAA,UACH,KAAK,GAAG,IAAI,MAAM,IAAI,SAAS,IAAI,EAAE;AAAA,UACrC,MAAM,GAAG,IAAI,OAAO,EAAE;AAAA,QACxB;AAAA,QACA,cAAc,CAAC,MAAM;AACnB,YAAE,cAAc,MAAM,UAAU;AAAA,QAClC;AAAA,QACA,cAAc,CAAC,MAAM;AACnB,YAAE,cAAc,MAAM,UAAU;AAAA,QAClC;AAAA,QACA,SAAS,CAAC,MAAM;AACd,YAAE,gBAAgB;AAClB,2BAAiB;AAAA,YACf;AAAA,YACA,KAAK,IAAI,MAAM,IAAI,SAAS,IAAI;AAAA,YAChC,MAAM,IAAI,OAAO;AAAA,UACnB,CAAC;AAAA,QACH;AAAA,QAEA,0BAAAA,MAAC,oBAAiB,MAAM,IAAI;AAAA;AAAA,MArBvB;AAAA,IAsBP,CACD;AAAA,IAEA,WAAW,IAAI,CAAC,KAAK,UACpB,gBAAAA;AAAA,MAAC;AAAA;AAAA,QAEC,OAAO;AAAA,UACL,GAAG;AAAA,UACH,KAAK,GAAG,IAAI,MAAM,EAAE;AAAA,UACpB,MAAM,GAAG,IAAI,OAAO,IAAI,QAAQ,IAAI,EAAE;AAAA,QACxC;AAAA,QACA,cAAc,CAAC,MAAM;AACnB,YAAE,cAAc,MAAM,UAAU;AAAA,QAClC;AAAA,QACA,cAAc,CAAC,MAAM;AACnB,YAAE,cAAc,MAAM,UAAU;AAAA,QAClC;AAAA,QACA,SAAS,CAAC,MAAM;AACd,YAAE,gBAAgB;AAClB,2BAAiB;AAAA,YACf;AAAA,YACA,KAAK,IAAI,MAAM;AAAA,YACf,MAAM,IAAI,OAAO,IAAI,QAAQ,IAAI;AAAA,UACnC,CAAC;AAAA,QACH;AAAA,QAEA,0BAAAA,MAAC,YAAS,MAAM,IAAI;AAAA;AAAA,MArBf;AAAA,IAsBP,CACD;AAAA,IAEA,iBACC,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,KAAK;AAAA,QACL,OAAO;AAAA,UACL,UAAU;AAAA,UACV,KAAK,GAAG,cAAc,GAAG;AAAA,UACzB,MAAM,GAAG,cAAc,IAAI;AAAA,UAC3B,QAAQ;AAAA,QACV;AAAA,QAEA,0BAAAC;AAAA,UAACP;AAAA,UAAA;AAAA,YACC,QAAO;AAAA,YACP,GAAE;AAAA,YACF,QAAO;AAAA,YACP,YAAU;AAAA,YACV,OAAO;AAAA,cACL,UAAU;AAAA,cACV,iBAAiB;AAAA,YACnB;AAAA,YAEA;AAAA,8BAAAM,MAACJ,QAAA,EAAM,KAAK,GAAG,MAAK,UAClB,0BAAAI,MAACL,OAAA,EAAK,MAAK,MAAK,IAAI,KAAK,OAAO,EAAE,MAAM,EAAE,GAAG,oBAE7C,GACF;AAAA,cAEA,gBAAAM,OAAC,SAAI,OAAO,EAAE,WAAW,EAAE,GACzB;AAAA,gCAAAD;AAAA,kBAAC;AAAA;AAAA,oBACC,MAAM,gBAAAA,MAAC,uBAAoB,MAAM,IAAI;AAAA,oBACrC,OAAM;AAAA,oBACN,SAAS;AAAA;AAAA,gBACX;AAAA,gBACA,gBAAAA;AAAA,kBAAC;AAAA;AAAA,oBACC,MAAM,gBAAAA,MAAC,sBAAmB,MAAM,IAAI,OAAO,EAAE,WAAW,iBAAiB,GAAG;AAAA,oBAC5E,OAAM;AAAA,oBACN,SAAS;AAAA;AAAA,gBACX;AAAA,gBACA,gBAAAA;AAAA,kBAAC;AAAA;AAAA,oBACC,MAAM,gBAAAA,MAACH,WAAA,EAAS,MAAM,IAAI;AAAA,oBAC1B,OAAM;AAAA,oBACN,SAAS;AAAA;AAAA,gBACX;AAAA,gBACA,gBAAAG,MAAC,SAAI,OAAO,EAAE,QAAQ,GAAG,YAAY,uCAAuC,QAAQ,QAAQ,GAAG;AAAA,gBAC/F,gBAAAA;AAAA,kBAAC;AAAA;AAAA,oBACC,MAAM,gBAAAA,MAACF,YAAA,EAAU,MAAM,IAAI;AAAA,oBAC3B,OAAM;AAAA,oBACN,SAAS;AAAA,oBACT,OAAM;AAAA;AAAA,gBACR;AAAA,iBACF;AAAA;AAAA;AAAA,QACF;AAAA;AAAA,IACF;AAAA,IAGD,iBACC,gBAAAE;AAAA,MAAC;AAAA;AAAA,QACC,KAAK;AAAA,QACL,OAAO;AAAA,UACL,UAAU;AAAA,UACV,KAAK,GAAG,cAAc,GAAG;AAAA,UACzB,MAAM,GAAG,cAAc,IAAI;AAAA,UAC3B,QAAQ;AAAA,QACV;AAAA,QAEA,0BAAAC;AAAA,UAACP;AAAA,UAAA;AAAA,YACC,QAAO;AAAA,YACP,GAAE;AAAA,YACF,QAAO;AAAA,YACP,YAAU;AAAA,YACV,OAAO;AAAA,cACL,UAAU;AAAA,cACV,iBAAiB;AAAA,YACnB;AAAA,YAEA;AAAA,8BAAAM,MAACJ,QAAA,EAAM,KAAK,GAAG,MAAK,UAClB,0BAAAI,MAACL,OAAA,EAAK,MAAK,MAAK,IAAI,KAAK,OAAO,EAAE,MAAM,EAAE,GAAG,iBAE7C,GACF;AAAA,cAEA,gBAAAM,OAAC,SAAI,OAAO,EAAE,WAAW,EAAE,GACzB;AAAA,gCAAAD;AAAA,kBAAC;AAAA;AAAA,oBACC,MAAM,gBAAAA,MAAC,oBAAiB,MAAM,IAAI;AAAA,oBAClC,OAAM;AAAA,oBACN,SAAS;AAAA;AAAA,gBACX;AAAA,gBACA,gBAAAA;AAAA,kBAAC;AAAA;AAAA,oBACC,MAAM,gBAAAA,MAAC,sBAAmB,MAAM,IAAI;AAAA,oBACpC,OAAM;AAAA,oBACN,SAAS;AAAA;AAAA,gBACX;AAAA,gBACA,gBAAAA;AAAA,kBAAC;AAAA;AAAA,oBACC,MAAM,gBAAAA,MAACH,WAAA,EAAS,MAAM,IAAI;AAAA,oBAC1B,OAAM;AAAA,oBACN,SAAS;AAAA;AAAA,gBACX;AAAA,gBACA,gBAAAG,MAAC,SAAI,OAAO,EAAE,QAAQ,GAAG,YAAY,uCAAuC,QAAQ,QAAQ,GAAG;AAAA,gBAC/F,gBAAAA;AAAA,kBAAC;AAAA;AAAA,oBACC,MAAM,gBAAAA,MAACF,YAAA,EAAU,MAAM,IAAI;AAAA,oBAC3B,OAAM;AAAA,oBACN,SAAS;AAAA,oBACT,OAAM;AAAA;AAAA,gBACR;AAAA,iBACF;AAAA;AAAA;AAAA,QACF;AAAA;AAAA,IACF;AAAA,KAEJ;AAEJ;AAEA,IAAM,WAAW,CAAC,EAAE,MAAM,OAAO,SAAS,MAAM,MAC9C,gBAAAG;AAAA,EAAC;AAAA;AAAA,IACC;AAAA,IACA,OAAO;AAAA,MACL,SAAS;AAAA,MACT,YAAY;AAAA,MACZ,KAAK;AAAA,MACL,SAAS;AAAA,MACT,cAAc;AAAA,MACd,QAAQ;AAAA,MACR,OAAO,SAAS;AAAA,MAChB,YAAY;AAAA,IACd;AAAA,IACA,cAAc,CAAC,MAAM;AACnB,QAAE,cAAc,MAAM,kBAAkB;AAAA,IAC1C;AAAA,IACA,cAAc,CAAC,MAAM;AACnB,QAAE,cAAc,MAAM,kBAAkB;AAAA,IAC1C;AAAA,IAEC;AAAA;AAAA,MACD,gBAAAD,MAACL,OAAA,EAAK,MAAK,MAAM,iBAAM;AAAA;AAAA;AACzB;;;AD/WI,SAIA,OAAAQ,OAJA,QAAAC,cAAA;AA5BC,SAAS,cAAc,EAAE,QAAQ,YAAY,IAAI,GAAuB;AAC7E,QAAM,EAAE,aAAa,eAAe,IAAIC,uBAAsB;AAC9D,QAAM,QAAQC,iBAAgB;AAC9B,QAAM,cAAc,mBAAmB,cAAc;AAErD,QAAM,mBAAmB,gBAAgB,SAAS,MAAM,OAAO,KAAK,CAAC,IAAI,MAAM,OAAO,KAAK,CAAC;AAC5F,QAAM,gBAAgB,gBAAgB,SAAS,MAAM,OAAO,KAAK,CAAC,IAAI,MAAM,OAAO,KAAK,CAAC;AAEzF,QAAM,WAAW;AAAA,IACf,KAAK,gBAAgB,SAAS,MAAM,OAAO,IAAI,CAAC,IAAI,MAAM,OAAO,IAAI,CAAC;AAAA,IACtE,QAAQ,gBAAgB,SAAS,MAAM,OAAO,OAAO,CAAC,IAAI,MAAM,OAAO,OAAO,CAAC;AAAA,IAC/E,QAAQ,gBAAgB,SAAS,MAAM,OAAO,OAAO,CAAC,IAAI,MAAM,OAAO,OAAO,CAAC;AAAA,IAC/E,OAAO,gBAAgB,SAAS,MAAM,OAAO,MAAM,CAAC,IAAI,MAAM,OAAO,MAAM,CAAC;AAAA,IAC5E,MAAM,gBAAgB,SAAS,MAAM,OAAO,KAAK,CAAC,IAAI,MAAM,OAAO,KAAK,CAAC;AAAA,IACzE,QAAQ,gBAAgB,SAAS,MAAM,OAAO,OAAO,CAAC,IAAI,MAAM,OAAO,OAAO,CAAC;AAAA,IAC/E,MAAM,gBAAgB,SAAS,MAAM,OAAO,KAAK,CAAC,IAAI,MAAM,OAAO,KAAK,CAAC;AAAA,IACzE,MAAM,gBAAgB,SAAS,MAAM,OAAO,KAAK,CAAC,IAAI,MAAM,OAAO,KAAK,CAAC;AAAA,EAC3E;AAEA,QAAM,UAAU,gBAAgB,SAAS,MAAM,OAAO,OAAO,CAAC,IAAI,MAAM,OAAO,OAAO,CAAC;AACvF,QAAM,UAAU,gBAAgB,SAAS,MAAM,OAAO,KAAK,CAAC,IAAI,MAAM,OAAO,KAAK,CAAC;AACnF,QAAM,UAAU,gBAAgB,SAAS,MAAM,OAAO,OAAO,CAAC,IAAI,MAAM,OAAO,OAAO,CAAC;AACvF,QAAM,UAAU,gBAAgB,SAAS,MAAM,OAAO,MAAM,CAAC,IAAI,MAAM,OAAO,MAAM,CAAC;AACrF,QAAM,UAAU,gBAAgB,SAAS,MAAM,OAAO,IAAI,CAAC,IAAI,MAAM,OAAO,IAAI,CAAC;AACjF,QAAM,UAAU,gBAAgB,SAAS,MAAM,OAAO,KAAK,CAAC,IAAI,MAAM,OAAO,KAAK,CAAC;AAEnF,SACE,gBAAAH,MAAC,SAAI,OAAO,EAAE,UAAU,WAAW,GACjC,0BAAAC;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,OAAO,EAAE,WAAW,YAAY,OAAO,SAAS,SAAS;AAAA,MAE3D;AAAA,wBAAAD,MAAC,WAAO;AAAA;AAAA,sBAEQ,SAAS,GAAG;AAAA,yBACT,SAAS,MAAM;AAAA,yBACf,SAAS,MAAM;AAAA,wBAChB,SAAS,KAAK;AAAA,uBACf,SAAS,IAAI;AAAA,yBACX,SAAS,MAAM;AAAA,uBACjB,SAAS,IAAI;AAAA,uBACb,SAAS,IAAI;AAAA;AAAA;AAAA;AAAA,gEAI4B,gBAAgB,SAAS,MAAM,OAAO,KAAK,CAAC,IAAI,MAAM,OAAO,KAAK,CAAC,CAAC;AAAA,sCAC9F,gBAAgB,SAAS,MAAM,OAAO,KAAK,CAAC,IAAI,MAAM,OAAO,KAAK,CAAC,CAAC;AAAA,mCACvE,OAAO;AAAA,mCACP,OAAO;AAAA,mCACP,OAAO;AAAA,mCACP,OAAO;AAAA,mCACP,OAAO;AAAA,mCACP,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA,mCAKP,gBAAgB,SAAS,MAAM,OAAO,KAAK,CAAC,IAAI,MAAM,OAAO,KAAK,CAAC,CAAC;AAAA,8BACzE,gBAAgB,SAAS,MAAM,OAAO,KAAK,CAAC,IAAI,MAAM,OAAO,KAAK,CAAC,CAAC;AAAA;AAAA;AAAA,mBAG/E,gBAAgB,SAAS,MAAM,OAAO,KAAK,CAAC,IAAI,MAAM,OAAO,KAAK,CAAC,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,8BAuCzD,gBAAgB,SAAS,6BAA6B,qBAAqB;AAAA,mBACtF,gBAAgB,SAAS,MAAM,OAAO,OAAO,CAAC,IAAI,MAAM,OAAO,IAAI,CAAC,CAAC;AAAA,8BAC1D,gBAAgB,SAAS,8BAA8B,qBAAqB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,8BAW5E,gBAAgB;AAAA;AAAA;AAAA;AAAA;AAAA,8BAKhB,gBAAgB;AAAA;AAAA;AAAA;AAAA;AAAA,8BAKhB,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,8BAQb,MAAM,OAAO,KAAK,CAAC,CAAC;AAAA;AAAA;AAAA;AAAA,kCAIhB,gBAAgB,SAAS,MAAM,OAAO,KAAK,CAAC,IAAI,MAAM,OAAO,KAAK,CAAC,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kCAOpE,MAAM,OAAO,KAAK,CAAC,CAAC;AAAA,+BACvB,MAAM,OAAO,KAAK,CAAC,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,+BAWpB,MAAM,OAAO,KAAK,CAAC,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,SAM3C;AAAA,QACF,gBAAAA,MAAC,iBAAc,QAAgB;AAAA;AAAA;AAAA,EACjC,GACA;AAEJ;;;AE/KA,SAAS,cAAc,wBAAwB;AAC/C,SAAS,sBAAsB;AAC/B;AAAA,EACE,SAAAI;AAAA,EACA,cAAAC;AAAA,EACA,QAAAC;AAAA,EACA,OAAAC;AAAA,EACA,QAAAC;AAAA,EACA,mBAAAC;AAAA,EACA,yBAAAC;AAAA,OACK;AACP;AAAA,EACE;AAAA,EACA;AAAA,EACA,YAAAC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,aAAAC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,gBAAAC;AAAA,OACK;AAEP,SAAS,YAAAC,kBAAgB;AA2DrB,qBAAAC,WA8Bc,OAAAC,OA8BA,QAAAC,cA5Dd;AAlDG,SAAS,WAAW,EAAE,OAAO,GAAoB;AACtD,QAAM,QAAQC,iBAAgB;AAC9B,QAAM,EAAE,YAAY,IAAIC,uBAAsB;AAC9C,QAAM,SAAS,gBAAgB;AAE/B,QAAM,CAAC,aAAa,cAAc,IAAIC,WAAS,KAAK;AAEpD,QAAM,cAAc,eAAe;AAAA,IACjC;AAAA,IACA,UAAU,CAAC,EAAE,QAAAC,QAAO,OAAO;AAAA,MACzB,WAAWA,QAAO,cAAc,WAAW;AAAA,MAC3C,SAASA,QAAO,cAAc,iBAAiB;AAAA,MAC/C,QAAQA,QAAO,SAAS,MAAM;AAAA,MAC9B,UAAUA,QAAO,SAAS,QAAQ;AAAA,MAClC,QAAQA,QAAO,SAAS,MAAM;AAAA,MAC9B,aAAaA,QAAO,SAAS,WAAW;AAAA,MACxC,SAASA,QAAO,SAAS,YAAY;AAAA,MACrC,YAAYA,QAAO,SAAS,UAAU;AAAA,MACtC,sBAAsB,MAAM;AAC1B,iBAAS,QAAQ,GAAG,SAAS,GAAG,SAAS;AACvC,cAAIA,QAAO,SAAS,WAAW,EAAE,MAAM,CAAC,GAAG;AACzC,mBAAO;AAAA,UACT;AAAA,QACF;AACA,eAAO;AAAA,MACT,GAAG;AAAA,IACL;AAAA,IACA,YAAY,CAAC,GAAQ,MAAW,KAAK,UAAU,CAAC,MAAM,KAAK,UAAU,CAAC;AAAA,EACxE,CAAC;AAED,QAAM,sBAAsB,CAAC,UAAiC;AAC5D,IAAC,OAAO,MAAM,EAAU,MAAM,EAAE,cAAc,EAAE,MAAsC,CAAC,EAAE,IAAI;AAAA,EAC/F;AAEA,QAAM,kBAAkB,MAAM;AAC5B,UAAM,EAAE,MAAM,GAAG,IAAI,OAAO,MAAM;AAClC,UAAM,eAAe,6BAA6B,QAAQ,MAAM,EAAE;AAElE,QAAI,CAAC,aAAa,KAAK,GAAG;AACxB,iCAAmB,KAAK;AAAA,QACtB,OAAO;AAAA,QACP,SAAS;AAAA,MACX,CAAC;AACD;AAAA,IACF;AAEA,mBAAe,IAAI;AAAA,EACrB;AAEA,SACE,gBAAAJ,OAAAF,WAAA,EACE;AAAA,oBAAAC;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,YAAY,CAAC,EAAE,QAAAK,QAAO,MAAM;AAC1B,gBAAM,EAAE,MAAM,GAAG,IAAIA,QAAO,MAAM;AAClC,gBAAM,eAAe,SAAS;AAE9B,cAAIA,QAAO,SAAS,WAAW,GAAG;AAChC,mBAAO;AAAA,UACT;AAEA,cAAIA,QAAO,SAAS,OAAO,GAAG;AAC5B,mBAAO;AAAA,UACT;AAEA,cAAI,CAACA,QAAO,YAAY;AACtB,mBAAO;AAAA,UACT;AAEA,iBAAO;AAAA,QACT;AAAA,QAEA,0BAAAJ;AAAA,UAACK;AAAA,UAAA;AAAA,YACC,KAAK;AAAA,YACL,GAAE;AAAA,YACF,IAAG;AAAA,YACH,OAAO;AAAA,YAEP;AAAA,8BAAAN;AAAA,gBAAC;AAAA;AAAA,kBACC,SAAS;AAAA,kBACT,MAAM,gBAAAA,MAACO,eAAA,EAAa,MAAM,IAAI;AAAA,kBAC9B,OAAM;AAAA;AAAA,cACR;AAAA,cAEA,gBAAAP,MAAC,WAAQ;AAAA,cAET,gBAAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,QAAQ,YAAY;AAAA,kBACpB,SAAS,MAAO,OAAO,MAAM,EAAU,MAAM,EAAE,WAAW,EAAE,IAAI;AAAA,kBAChE,MAAM,gBAAAA,MAAC,YAAS,MAAM,IAAI;AAAA;AAAA,cAC5B;AAAA,cAEA,gBAAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,QAAQ,YAAY;AAAA,kBACpB,SAAS,MAAO,OAAO,MAAM,EAAU,MAAM,EAAE,aAAa,EAAE,IAAI;AAAA,kBAClE,MAAM,gBAAAA,MAAC,cAAW,MAAM,IAAI;AAAA;AAAA,cAC9B;AAAA,cAEA,gBAAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,QAAQ,YAAY;AAAA,kBACpB,SAAS,MAAO,OAAO,MAAM,EAAU,MAAM,EAAE,WAAW,EAAE,IAAI;AAAA,kBAChE,MAAM,gBAAAA,MAACQ,WAAA,EAAS,MAAM,IAAI;AAAA;AAAA,cAC5B;AAAA,cAEA,gBAAAR,MAAC,WAAQ;AAAA,cAET,gBAAAC,OAACQ,OAAA,EAAK,QAAO,MAAK,OAAO,KAAK,cAAY,MACxC;AAAA,gCAAAT,MAACS,MAAK,QAAL,EACC,0BAAAT,MAACU,aAAA,EAAW,MAAK,MAAK,SAAS,YAAY,sBAAsB,WAAW,SAAS,OAAO,EAAE,UAAU,GAAG,GACxG,sBAAY,sBACX,gBAAAT,OAACU,OAAA,EAAK,MAAK,MAAK,IAAI,KAAK;AAAA;AAAA,kBACrB,YAAY;AAAA,mBAChB,IAEA,gBAAAX,MAAC,eAAY,MAAM,IAAI,GAE3B,GACF;AAAA,gBACA,gBAAAC,OAACQ,MAAK,UAAL,EACC;AAAA,kCAAAT,MAACS,MAAK,OAAL,EAAW,sBAAQ;AAAA,kBACpB,gBAAAT,MAACS,MAAK,SAAL,EAAa;AAAA,kBACb,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC,EAAE,IAAI,WACtB,gBAAAR;AAAA,oBAACQ,MAAK;AAAA,oBAAL;AAAA,sBAEC,WAAU;AAAA,sBACV,SAAS,MAAM,oBAAoB,KAA8B;AAAA,sBACjE,aAAa,YAAY,wBAAwB,QAAQ,gBAAAT,MAACY,YAAA,EAAU,MAAM,IAAI,IAAK;AAAA,sBACpF;AAAA;AAAA,wBACU;AAAA;AAAA;AAAA,oBALJ;AAAA,kBAMP,CACD;AAAA,mBACH;AAAA,iBACF;AAAA,cAEA,gBAAAZ;AAAA,gBAAC;AAAA;AAAA,kBACC,QAAQ,YAAY;AAAA,kBACpB,SAAS,MAAO,OAAO,MAAM,EAAU,MAAM,EAAE,gBAAgB,EAAE,IAAI;AAAA,kBACrE,MAAM,gBAAAA,MAAC,gBAAa,MAAM,IAAI;AAAA;AAAA,cAChC;AAAA,cAEA,gBAAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,QAAQ,YAAY;AAAA,kBACpB,SAAS,MAAO,OAAO,MAAM,EAAU,MAAM,EAAE,iBAAiB,EAAE,IAAI;AAAA,kBACtE,MAAM,gBAAAA,MAAC,aAAU,MAAM,IAAI;AAAA;AAAA,cAC7B;AAAA,cAEA,gBAAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,QAAQ,YAAY;AAAA,kBACpB,SAAS,MAAO,OAAO,MAAM,EAAU,MAAM,EAAE,eAAe,EAAE,IAAI;AAAA,kBACpE,MAAM,gBAAAA,MAAC,iBAAc,MAAM,IAAI;AAAA;AAAA,cACjC;AAAA,cAEA,gBAAAA,MAAC,WAAQ;AAAA,cAET,gBAAAC,OAACQ,OAAA,EAAK,QAAO,MAAK,OAAO,KAAK,cAAY,MACxC;AAAA,gCAAAT,MAACS,MAAK,QAAL,EACC,0BAAAT;AAAA,kBAACU;AAAA,kBAAA;AAAA,oBACC,MAAK;AAAA,oBACL,SAAS,YAAY,UAAU,QAAQ,WAAW;AAAA,oBAClD,OAAO,EAAE,UAAU,GAAG;AAAA,oBACtB,OAAM;AAAA,oBAEN,0BAAAV,MAAC,mBAAgB,MAAM,IAAI;AAAA;AAAA,gBAC7B,GACF;AAAA,gBACA,gBAAAC,OAACQ,MAAK,UAAL,EACC;AAAA,kCAAAR,OAACK,QAAA,EAAM,SAAQ,iBAAgB,OAAM,UAAS,IAAG,KAAI,IAAG,MAAK,KAAI,KAC/D;AAAA,oCAAAN,MAACS,MAAK,OAAL,EAAW,IAAI,GAAG,wBAAU;AAAA,oBAC7B,gBAAAT;AAAA,sBAACU;AAAA,sBAAA;AAAA,wBACC,MAAK;AAAA,wBACL,SAAQ;AAAA,wBACR,SAAS,MAAM,OAAO,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI;AAAA,wBACvD,OAAM;AAAA,wBAEN,0BAAAV,MAAC,kBAAe,MAAM,IAAI;AAAA;AAAA,oBAC5B;AAAA,qBACF;AAAA,kBACA,gBAAAA,MAACS,MAAK,SAAL,EAAa;AAAA,kBACd,gBAAAT,MAACM,QAAA,EAAM,KAAI,MAAK,MAAK,QAAO,GAAE,MAC3B,WAAC,OAAO,UAAU,UAAU,SAAS,QAAQ,UAAU,QAAQ,MAAM,EAAE,IAAI,eAC1E,gBAAAN;AAAA,oBAACU;AAAA,oBAAA;AAAA,sBAEC,MAAK;AAAA,sBACL,SAAS,YAAY,UAAU,UAAU,MAAM,OAAO,SAAS,EAAE,CAAC,IAAI,WAAW;AAAA,sBACjF,SAAS,MAAM,OAAO,MAAM,EAAE,MAAM,EAAE,SAAS,MAAM,OAAO,SAAS,EAAE,CAAC,CAAC,EAAE,IAAI;AAAA,sBAC/E,OAAO;AAAA,sBACP,OAAO;AAAA,sBAEP,0BAAAV,MAACY,YAAA,EAAU,MAAM,IAAI;AAAA;AAAA,oBAPhB;AAAA,kBAQP,CACD,GACH;AAAA,mBACF;AAAA,iBACF;AAAA,cAEA,gBAAAX,OAACQ,OAAA,EAAK,QAAO,MAAK,OAAO,KAAK,cAAY,MACxC;AAAA,gCAAAT,MAACS,MAAK,QAAL,EACC,0BAAAT;AAAA,kBAACU;AAAA,kBAAA;AAAA,oBACC,MAAK;AAAA,oBACL,SAAS,YAAY,QAAQ,QAAQ,WAAW;AAAA,oBAChD,OAAO,EAAE,UAAU,GAAG;AAAA,oBACtB,OAAM;AAAA,oBAEN,0BAAAV,MAAC,eAAY,MAAM,IAAI;AAAA;AAAA,gBACzB,GACF;AAAA,gBACA,gBAAAC,OAACQ,MAAK,UAAL,EACC;AAAA,kCAAAR,OAACK,QAAA,EAAM,SAAQ,iBAAgB,OAAM,UAAS,IAAG,KAAI,IAAG,MAAK,KAAI,KAC/D;AAAA,oCAAAN,MAACS,MAAK,OAAL,EAAW,IAAI,GAAG,8BAAgB;AAAA,oBACnC,gBAAAT;AAAA,sBAACU;AAAA,sBAAA;AAAA,wBACC,MAAK;AAAA,wBACL,SAAQ;AAAA,wBACR,SAAS,MAAM,OAAO,MAAM,EAAE,MAAM,EAAE,qBAAqB,EAAE,IAAI;AAAA,wBACjE,OAAM;AAAA,wBAEN,0BAAAV,MAAC,kBAAe,MAAM,IAAI;AAAA;AAAA,oBAC5B;AAAA,qBACF;AAAA,kBACA,gBAAAA,MAACS,MAAK,SAAL,EAAa;AAAA,kBACd,gBAAAT,MAACM,QAAA,EAAM,KAAI,MAAK,MAAK,QAAO,GAAE,MAC3B,WAAC,OAAO,UAAU,UAAU,SAAS,QAAQ,UAAU,QAAQ,MAAM,EAAE,IAAI,eAC1E,gBAAAN;AAAA,oBAACU;AAAA,oBAAA;AAAA,sBAEC,MAAK;AAAA,sBACL,SAAS,YAAY,QAAQ,UAAU,YAAY,WAAW;AAAA,sBAC9D,SAAS,MAAM,OAAO,MAAM,EAAE,MAAM,EAAE,mBAAmB,SAAS,EAAE,IAAI;AAAA,sBACxE,OAAO;AAAA,sBACP,OAAO;AAAA,sBACP,OAAO,YAAY,QAAQ,UAAU,YAAY,EAAE,iBAAiB,SAAS,MAAM,OAAO,SAAS,EAAE,CAAC,IAAI,MAAM,OAAO,SAAS,EAAE,CAAC,EAAE,IAAI;AAAA,sBAEzI,0BAAAV,MAACY,YAAA,EAAU,MAAM,IAAI,OAAO,YAAY,QAAQ,UAAU,YAAa,SAAS,MAAM,QAAQ,YAAc,SAAS,MAAM,QAAQ,MAAM,OAAO,SAAS,EAAE,CAAC,GAAI;AAAA;AAAA,oBAR3J;AAAA,kBASP,CACD,GACH;AAAA,mBACF;AAAA,iBACF;AAAA;AAAA;AAAA,QACF;AAAA;AAAA,IACF;AAAA,IAEA,gBAAAZ;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,QAAQ;AAAA,QACR,SAAS,MAAM,eAAe,KAAK;AAAA;AAAA,IACrC;AAAA,KACF;AAEJ;AAEA,IAAM,gBAAgB,CAAC,EAAE,QAAQ,SAAS,MAAM,MAAM,MACpD,gBAAAA;AAAA,EAACU;AAAA,EAAA;AAAA,IACC,MAAK;AAAA,IACL,SAAS,SAAS,WAAW;AAAA,IAC7B;AAAA,IACA;AAAA,IAEC;AAAA;AACH;AAGF,IAAM,UAAU,MAAM,gBAAAV,MAACa,MAAA,EAAI,GAAG,GAAG,GAAG,IAAI,IAAG,uCAAsC,IAAI,GAAG;AAExF,IAAM,cAAc;AAAA,EAClB,cAAc;AAAA,EACd,WAAW;AACb;;;AC3SA,SAAS,aAAAC,kBAAiB;AAC1B,OAAO,gBAAgB;AACvB,SAAS,qBAAqB;AAC9B,OAAO,WAAW;AAElB,SAAS,YAAY,qBAAqB,YAAAC,YAAU,aAAAC,YAAW,UAAAC,eAAc;AAC7E,SAAS,OAAAC,OAAK,QAAAC,OAAM,kBAAAC,uBAAsB;AAoDlC,gBAAAC,OAiEI,QAAAC,cAjEJ;AA5CD,IAAM,mBAAmB,WAAW,CAAC,OAA8B,QAAQ;AAChF,QAAM,CAAC,eAAe,gBAAgB,IAAIP,WAAS,CAAC;AACpD,QAAM,YAAYE,QAAuB,IAAI;AAE7C,EAAAD,WAAU,MAAM,iBAAiB,CAAC,GAAG,CAAC,MAAM,KAAK,CAAC;AAElD,QAAM,aAAa,CAAC,UAAkB;AACpC,UAAM,OAAO,MAAM,MAAM,KAAK;AAC9B,QAAI,MAAM;AACR,YAAM,QAAQ,IAAI;AAAA,IACpB;AAAA,EACF;AAEA,sBAAoB,KAAK,OAAO;AAAA,IAC9B,WAAW,CAAC,EAAE,MAAM,MAAgC;AAClD,UAAI,MAAM,QAAQ,WAAW;AAC3B,yBAAiB,WAAS,OAAO,IAAI,MAAM,MAAM,UAAU,MAAM,MAAM,MAAM;AAC7E,eAAO;AAAA,MACT;AAEA,UAAI,MAAM,QAAQ,aAAa;AAC7B,yBAAiB,WAAS,OAAO,KAAK,MAAM,MAAM,MAAM;AACxD,eAAO;AAAA,MACT;AAEA,UAAI,MAAM,QAAQ,WAAW,MAAM,QAAQ,OAAO;AAChD,mBAAW,aAAa;AACxB,eAAO;AAAA,MACT;AAEA,aAAO;AAAA,IACT;AAAA,EACF,EAAE;AAEF,EAAAA,WAAU,MAAM;AACd,UAAM,aAAa,UAAU,SAAS,cAAc,gBAAgB,aAAa,IAAI;AACrF,QAAI,YAAY;AACd,iBAAW,eAAe,EAAE,OAAO,WAAW,UAAU,SAAS,CAAC;AAAA,IACpE;AAAA,EACF,GAAG,CAAC,aAAa,CAAC;AAElB,MAAI,MAAM,MAAM,WAAW,GAAG;AAC5B,WACE,gBAAAK,MAACH,OAAA,EAAI,GAAE,MAAK,IAAG,6BAA4B,OAAO,EAAE,cAAc,GAAG,QAAQ,gDAAgD,GAC3H,0BAAAG,MAACF,OAAA,EAAK,MAAK,MAAK,GAAE,UAAS,4DAE3B,GACF;AAAA,EAEJ;AAEA,SACE,gBAAAG;AAAA,IAACJ;AAAA,IAAA;AAAA,MACC,KAAK;AAAA,MACL,OAAO;AAAA,QACL,YAAY;AAAA,QACZ,gBAAgB;AAAA,QAChB,QAAQ;AAAA,QACR,cAAc;AAAA,QACd,WAAW;AAAA,QACX,SAAS;AAAA,QACT,WAAW;AAAA,QACX,WAAW;AAAA,QACX,OAAO;AAAA,QACP,WAAW;AAAA,MACb;AAAA,MAEA;AAAA,wBAAAG,MAAC,WAAO;AAAA;AAAA;AAAA;AAAA;AAAA,SAKN;AAAA,QAED,MAAM,MAAM,IAAI,CAAC,MAAM,UAAU;AAChC,gBAAM,aAAa,UAAU;AAC7B,iBACE,gBAAAC;AAAA,YAACF;AAAA,YAAA;AAAA,cAEC,cAAY;AAAA,cACZ,SAAS,MAAM,WAAW,KAAK;AAAA,cAC/B,cAAc,MAAM,iBAAiB,KAAK;AAAA,cAC1C,OAAO;AAAA,gBACL,SAAS;AAAA,gBACT,OAAO;AAAA,gBACP,SAAS;AAAA,gBACT,cAAc;AAAA,gBACd,KAAK;AAAA,gBACL,YAAY;AAAA,gBACZ,iBAAiB,aAAa,oCAAoC;AAAA,gBAClE,YAAY;AAAA,cACd;AAAA,cAEA;AAAA,gCAAAC;AAAA,kBAACH;AAAA,kBAAA;AAAA,oBACC,OAAO;AAAA,sBACL,OAAO;AAAA,sBACP,QAAQ;AAAA,sBACR,cAAc;AAAA,sBACd,SAAS;AAAA,sBACT,YAAY;AAAA,sBACZ,gBAAgB;AAAA,sBAChB,iBAAiB,aAAa,uCAAuC;AAAA,sBACrE,WAAW,aAAa,6BAA6B;AAAA,sBACrD,UAAU;AAAA,sBACV,OAAO,aAAa,qCAAqC;AAAA,oBAC3D;AAAA,oBAEC,eAAK;AAAA;AAAA,gBACR;AAAA,gBACA,gBAAAI,OAACJ,OAAA,EAAI,OAAO,EAAE,MAAM,EAAE,GACpB;AAAA,kCAAAG,MAACF,OAAA,EAAK,MAAK,MAAK,IAAI,aAAa,MAAM,KAAK,IAAI,KAAK,GAAG,aAAa,qCAAqC,WACvG,eAAK,OACR;AAAA,kBACA,gBAAAE,MAACF,OAAA,EAAK,MAAK,MAAK,GAAE,UAAS,IAAI,KAAK,IAAI,GACrC,eAAK,aACR;AAAA,mBACF;AAAA;AAAA;AAAA,YAtCK,KAAK;AAAA,UAuCZ;AAAA,QAEJ,CAAC;AAAA;AAAA;AAAA,EACH;AAEJ,CAAC;AAED,iBAAiB,cAAc;AAE/B,IAAM,6BAA6B,MAAM;AACvC,MAAI,YAAkC;AACtC,MAAI,QAA8B;AAElC,SAAO;AAAA,IACL,SAAS,CAAC,UAAe;AACvB,UAAI,OAAO;AACT,cAAM,QAAQ;AACd,gBAAQ;AAAA,MACV;AACA,UAAI,WAAW;AACb,kBAAU,QAAQ;AAClB,oBAAY;AAAA,MACd;AAEA,kBAAY,IAAI,cAAc,kBAAkB;AAAA,QAC9C;AAAA,QACA,QAAQ,MAAM;AAAA,MAChB,CAAC;AAED,UAAI,CAAC,MAAM,WAAY;AAEvB,cAAQ,MAAM,QAAQ;AAAA,QACpB,wBAAwB,MAAM;AAAA,QAC9B,UAAU,MAAM,SAAS;AAAA,QACzB,SAAS,UAAU;AAAA,QACnB,cAAc;AAAA,QACd,aAAa;AAAA,QACb,SAAS;AAAA,QACT,WAAW;AAAA,QACX,UAAU,CAAC,KAAK,CAAC;AAAA,MACnB,CAAC,EAAE,CAAC;AAAA,IACN;AAAA,IAEA,SAAS,OAAY;AACnB,iBAAW,YAAY,KAAK;AAE5B,UAAI,MAAM,cAAc,OAAO;AAC7B,cAAM,SAAS;AAAA,UACb,wBAAwB,MAAM;AAAA,QAChC,CAAC;AAAA,MACH;AAAA,IACF;AAAA,IAEA,UAAU,OAAY;AACpB,UAAI,MAAM,MAAM,QAAQ,UAAU;AAChC,eAAO,KAAK;AACZ,eAAO;AAAA,MACT;AACA,aAAQ,WAAW,KAAa,YAAY,KAAK;AAAA,IACnD;AAAA,IAEA,SAAS;AACP,aAAO,QAAQ;AACf,iBAAW,QAAQ;AACnB,cAAQ;AACR,kBAAY;AAAA,IACd;AAAA,EACF;AACF;AAEO,SAAS,mBAAmB,SAGhC;AACD,SAAOL,WAAU,OAAO;AAAA,IACtB,MAAM;AAAA,IAEN,wBAAwB;AACtB,aAAO;AAAA,QACL,WAAW;AAAA,UACT,QAAQ,KAAK;AAAA,UACb,MAAM,QAAQ;AAAA,UACd,OAAO,QAAQ;AAAA,UACf,QAAQ;AAAA,UACR,SAAS,CAAC,EAAE,QAAQ,OAAO,MAAM,MAAW;AAC1C,mBAAO,MAAM,EAAE,MAAM,EAAE,YAAY,KAAK,EAAE,IAAI;AAC9C,kBAAM,QAAQ,EAAE,QAAQ,MAAM,CAAC;AAAA,UACjC;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AAAA,IAEA,YAAY;AAAA,IACZ;AAAA,EACF,CAAC;AACH;;;AClOA,SAAS,QAAAS,aAAY;;;ACGrB;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA,YAAAC;AAAA,EACA;AAAA,EACA,iBAAAC;AAAA,EACA,YAAAC;AAAA,EACA,aAAAC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,YAAAC;AAAA,EACA,cAAAC;AAAA,EACA;AAAA,EACA;AAAA,EACA,iBAAAC;AAAA,OACK;AA4DK,gBAAAC,aAAA;AA9BL,IAAM,SAAwB,CAAC;AAE/B,SAAS,cAAc,OAAoB;AAChD,QAAM,gBAAgB,OAAO,UAAU,OAAK,EAAE,SAAS,MAAM,IAAI;AACjE,MAAI,kBAAkB,IAAI;AACxB,WAAO,aAAa,IAAI;AAAA,EAC1B,OAAO;AACL,WAAO,KAAK,KAAK;AAAA,EACnB;AACF;AAEO,SAAS,eAAe,MAAuC;AACpE,SAAO,OAAO,KAAK,OAAK,EAAE,SAAS,IAAI;AACzC;AAEO,SAAS,aAAa,OAA8B;AACzD,QAAM,aAAa,MAAM,YAAY;AACrC,SAAO,OAAO;AAAA,IACZ,WACE,MAAM,MAAM,YAAY,EAAE,SAAS,UAAU,KAC7C,MAAM,aAAa,YAAY,EAAE,SAAS,UAAU,KACpD,MAAM,UAAU,KAAK,aAAW,QAAQ,YAAY,EAAE,SAAS,UAAU,CAAC;AAAA,EAC9E;AACF;AAEO,SAAS,qBAAqB,QAA+B;AAClE,SAAO;AAAA,IACL;AAAA,MACE,OAAO;AAAA,MACP,aAAa;AAAA,MACb,MAAM,gBAAAA,MAAC,UAAO,MAAM,IAAI;AAAA,MACxB,UAAU,CAAC,WAAW,SAAS,IAAI;AAAA,MACnC,SAAS,MAAO,OAAO,MAAM,EAAU,MAAM,EAAE,cAAc,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI;AAAA,IACjF;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aAAa;AAAA,MACb,MAAM,gBAAAA,MAAC,UAAO,MAAM,IAAI;AAAA,MACxB,UAAU,CAAC,WAAW,YAAY,IAAI;AAAA,MACtC,SAAS,MAAO,OAAO,MAAM,EAAU,MAAM,EAAE,cAAc,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI;AAAA,IACjF;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aAAa;AAAA,MACb,MAAM,gBAAAA,MAAC,UAAO,MAAM,IAAI;AAAA,MACxB,UAAU,CAAC,WAAW,YAAY,IAAI;AAAA,MACtC,SAAS,MAAO,OAAO,MAAM,EAAU,MAAM,EAAE,cAAc,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI;AAAA,IACjF;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aAAa;AAAA,MACb,MAAM,gBAAAA,MAACP,WAAA,EAAS,MAAM,IAAI;AAAA,MAC1B,UAAU,CAAC,UAAU,QAAQ,WAAW;AAAA,MACxC,SAAS,MAAO,OAAO,MAAM,EAAU,MAAM,EAAE,iBAAiB,EAAE,IAAI;AAAA,IACxE;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aAAa;AAAA,MACb,MAAM,gBAAAO,MAAC,mBAAgB,MAAM,IAAI;AAAA,MACjC,UAAU,CAAC,UAAU,WAAW,MAAM;AAAA,MACtC,SAAS,MAAO,OAAO,MAAM,EAAU,MAAM,EAAE,kBAAkB,EAAE,IAAI;AAAA,IACzE;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aAAa;AAAA,MACb,MAAM,gBAAAA,MAACN,gBAAA,EAAc,MAAM,IAAI;AAAA,MAC/B,UAAU,CAAC,QAAQ,YAAY,QAAQ,WAAW;AAAA,MAClD,SAAS,MAAO,OAAO,MAAM,EAAU,MAAM,EAAE,eAAe,EAAE,IAAI;AAAA,IACtE;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aAAa;AAAA,MACb,MAAM,gBAAAM,MAACL,WAAA,EAAS,MAAM,IAAI;AAAA,MAC1B,UAAU,CAAC,QAAQ,SAAS,KAAK;AAAA,MACjC,SAAS,MAAO,OAAO,MAAM,EAAU,MAAM,EAAE,gBAAgB,EAAE,IAAI;AAAA,IACvE;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aAAa;AAAA,MACb,MAAM,gBAAAK,MAACJ,YAAA,EAAU,MAAM,IAAI;AAAA,MAC3B,UAAU,CAAC,SAAS,cAAc,UAAU;AAAA,MAC5C,SAAS,MAAO,OAAO,MAAM,EAAU,MAAM,EAAE,iBAAiB,EAAE,IAAI;AAAA,IACxE;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aAAa;AAAA,MACb,MAAM,gBAAAI,MAAC,aAAU,MAAM,IAAI;AAAA,MAC3B,UAAU,CAAC,cAAc,QAAQ,WAAW,MAAM;AAAA,MAClD,SAAS,MAAO,OAAO,MAAM,EAAU,MAAM,EAAE,kBAAkB,EAAE,IAAI;AAAA,IACzE;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aAAa;AAAA,MACb,MAAM,gBAAAA,MAAC,aAAU,MAAM,IAAI;AAAA,MAC3B,UAAU,CAAC,SAAS,MAAM;AAAA,MAC1B,SAAS,MAAO,OAAO,MAAM,EAAU,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM,GAAG,eAAe,KAAK,CAAC,EAAE,IAAI;AAAA,IAC5G;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aAAa;AAAA,MACb,MAAM,gBAAAA,MAAC,aAAU,MAAM,IAAI;AAAA,MAC3B,UAAU,CAAC,SAAS,WAAW,OAAO;AAAA,MACtC,SAAS,CAAC,EAAE,QAAAC,QAAO,MAA0B;AAC3C,cAAM,SAAS,OAAO;AAAA,UACpB;AAAA,QACF;AAEA,YAAI,QAAQ;AACV,gBAAM,QAAQ,SAAS,cAAc,OAAO;AAC5C,gBAAM,OAAO;AACb,gBAAM,SAAS;AACf,gBAAM,WAAW,CAAC,MAAM;AACtB,kBAAM,OAAQ,EAAE,OAA4B,QAAQ,CAAC;AACrD,gBAAI,MAAM;AACR,oBAAM,SAAS,IAAI,WAAW;AAC9B,qBAAO,SAAS,CAAC,UAAU;AACzB,sBAAM,MAAM,MAAM,QAAQ;AAC1B,gBAAAA,QAAO,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,KAAK,KAAK,KAAK,CAAC,EAAE,IAAI;AAAA,cAC/D;AACA,qBAAO,cAAc,IAAI;AAAA,YAC3B;AAAA,UACF;AACA,gBAAM,MAAM;AAAA,QACd,OAAO;AACL,gBAAM,MAAM,OAAO,kBAAkB;AACrC,cAAI,KAAK;AACP,YAAAA,QAAO,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,IAAI,CAAC,EAAE,IAAI;AAAA,UACpD;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aAAa;AAAA,MACb,MAAM,gBAAAD,MAACH,WAAA,EAAS,MAAM,IAAI;AAAA,MAC1B,UAAU,CAAC,QAAQ,QAAQ;AAAA,MAC3B,SAAS,MAAO,OAAO,MAAM,EAAU,MAAM,EAAE,WAAW,EAAE,IAAI;AAAA,IAClE;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aAAa;AAAA,MACb,MAAM,gBAAAG,MAACF,aAAA,EAAW,MAAM,IAAI;AAAA,MAC5B,UAAU,CAAC,UAAU,IAAI;AAAA,MACzB,SAAS,MAAO,OAAO,MAAM,EAAU,MAAM,EAAE,aAAa,EAAE,IAAI;AAAA,IACpE;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aAAa;AAAA,MACb,MAAM,gBAAAE,MAAC,YAAS,MAAM,IAAI;AAAA,MAC1B,UAAU,CAAC,QAAQ,WAAW,WAAW,QAAQ;AAAA,MACjD,SAAS,MAAM;AACb,QAAC,OAAO,MAAM,EAAU,MAAM,EAAE,UAAU,EAAE,SAAS,WAAW,OAAO,SAAS,CAAC,EAAE,IAAI;AAAA,MACzF;AAAA,IACF;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aAAa;AAAA,MACb,MAAM,gBAAAA,MAAC,qBAAkB,MAAM,IAAI;AAAA,MACnC,UAAU,CAAC,YAAY,UAAU,WAAW,YAAY;AAAA,MACxD,SAAS,MAAM;AACb,QAAC,OAAO,MAAM,EAAU,MAAM,EAAE,YAAY,EAAE,IAAI;AAAA,MACpD;AAAA,IACF;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aAAa;AAAA,MACb,MAAM,gBAAAA,MAACD,gBAAA,EAAc,MAAM,IAAI;AAAA,MAC/B,UAAU,CAAC,WAAW,WAAW,aAAa,YAAY,SAAS,OAAO;AAAA,MAC1E,SAAS,MAAM;AACb,QAAC,OAAO,MAAM,EAAU,MAAM,EAAE,WAAW,EAAE,IAAI;AAAA,MACnD;AAAA,IACF;AAAA,EACF;AACF;;;AD3MW,gBAAAG,aAAA;AATJ,IAAM,gBAAgBC,MAAK,SAASC,eAAc;AAAA,EACvD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAuB;AACrB,QAAM,QAAQ,eAAe,KAAK,KAAK,IAAI;AAE3C,MAAI,CAAC,OAAO;AACV,WAAO,gBAAAF,MAAC,SAAK,eAAK,aAAY;AAAA,EAChC;AAEA,QAAM,YAAY,MAAM;AAExB,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,EACF;AAEJ,CAAC;;;AEjCD,SAAS,QAAAG,OAAM,mBAAAC,wBAAuB;AACtC,SAAS,yBAAAC,8BAA6B;AAY/B,SAAS,gBAAgB,SAAiC;AAC/D,QAAM;AAAA,IACJ;AAAA,IACA,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,WAAW;AAAA,IACX;AAAA,EACF,IAAI;AAEJ,SAAOF,MAAK,OAAO;AAAA,IACjB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IAEA,YAAY;AACV,aAAO,CAAC,EAAE,KAAK,kBAAkB,IAAI,KAAK,CAAC;AAAA,IAC7C;AAAA,IAEA,WAAW,EAAE,eAAe,GAAG;AAC7B,aAAO,CAAC,OAAOC,iBAAgB,gBAAgB,EAAE,aAAa,KAAK,CAAC,GAAG,CAAC;AAAA,IAC1E;AAAA,IAEA,cAAc;AACZ,UAAI,CAAC,WAAW;AACd,eAAO;AAAA,MACT;AACA,aAAOC,uBAAsB,SAAS;AAAA,IACxC;AAAA,IAEA,gBAAgB;AACd,aAAO;AAAA,QACL,SAAS;AAAA,UACP,SAAS;AAAA,UACT,WAAW,aAAW,QAAQ,aAAa,cAAc;AAAA,UACzD,YAAY,iBAAe,EAAE,gBAAgB,WAAW,QAAQ;AAAA,QAClE;AAAA,QACA,OAAO;AAAA,UACL,SAAS;AAAA,UACT,WAAW,aAAW,QAAQ,aAAa,YAAY;AAAA,UACvD,YAAY,iBAAe,EAAE,cAAc,WAAW,MAAM;AAAA,QAC9D;AAAA,QACA,SAAS;AAAA,UACP,SAAS;AAAA,UACT,WAAW,aAAW,QAAQ,aAAa,cAAc,MAAM;AAAA,UAC/D,YAAY,iBAAe,EAAE,gBAAgB,WAAW,QAAQ;AAAA,QAClE;AAAA,QACA,UAAU;AAAA,UACR,SAAS;AAAA,UACT,WAAW,aAAW,QAAQ,aAAa,eAAe;AAAA,UAC1D,YAAY,iBAAe,EAAE,iBAAiB,WAAW,SAAS;AAAA,QACpE;AAAA,MACF;AAAA,IACF;AAAA,IAEA,cAAc;AACZ,aAAO;AAAA,QACL,CAAC,MAAM,KAAK,OAAO,CAAC,EAAE,YAAY,IAAI,KAAK,MAAM,CAAC,CAAC,EAAE,GACnD,CAAC,UACD,CAAC,EAAE,SAAS,MAAW;AACrB,iBAAO,SAAS,cAAc;AAAA,YAC5B,MAAM,KAAK;AAAA,YACX;AAAA,YACA,SAAS,UAAU,CAAC,EAAE,MAAM,YAAY,CAAC,IAAI,CAAC;AAAA,UAChD,CAAC;AAAA,QACH;AAAA,MACJ;AAAA,IACF;AAAA,EACF,CAAC;AACH;;;ACpFA,OAAO,gBAAgB;AAEvB,IAAM,KAAK,IAAI,WAAW;AAAA,EACxB,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,SAAS;AACX,CAAC;AAED,GAAG,MAAM,MAAM,OAAO,aAAa,SAAS,CAAC,OAAO,WAAW,SAAS,WAAW;AACjF,QAAM,WAAW,MAAM,OAAO,SAAS,IAAI,MAAM,OAAO,SAAS;AACjE,QAAM,SAAS,MAAM,OAAO,SAAS;AACrC,QAAM,YAAY,MAAM,IAAI,MAAM,UAAU,MAAM,EAAE,KAAK;AAEzD,MAAI,CAAC,UAAU,WAAW,GAAG,KAAK,CAAC,UAAU,WAAW,IAAI,GAAG;AAC7D,WAAO;AAAA,EACT;AAEA,MAAI,WAAW;AACf,QAAM,OAAiB,CAAC;AAExB,SAAO,WAAW,SAAS;AACzB,UAAM,WAAW,MAAM,OAAO,QAAQ,IAAI,MAAM,OAAO,QAAQ;AAC/D,UAAM,SAAS,MAAM,OAAO,QAAQ;AACpC,UAAM,UAAU,MAAM,IAAI,MAAM,UAAU,MAAM,EAAE,KAAK;AAEvD,QAAI,CAAC,QAAQ,WAAW,GAAG,GAAG;AAC5B;AAAA,IACF;AAEA,SAAK,KAAK,OAAO;AACjB;AAAA,EACF;AAEA,MAAI,KAAK,SAAS,GAAG;AACnB,WAAO;AAAA,EACT;AAEA,QAAM,eAAe,KAAK,CAAC,EAAE,KAAK;AAClC,MAAI,CAAC,cAAc,KAAK,YAAY,GAAG;AACrC,WAAO;AAAA,EACT;AAEA,MAAI,QAAQ;AACV,WAAO;AAAA,EACT;AAEA,QAAM,aAAa,CAAC,KAAa,aAAqB;AACpD,UAAM,QAAQ,IAAI,MAAM,GAAG,EAAE,OAAO,OAAK,EAAE,KAAK,MAAM,EAAE;AACxD,UAAM,QAAQ,cAAY;AACxB,YAAM,KAAK,WAAW,SAAS,UAAU,CAAC;AAC1C,YAAM,SAAS,MAAM,KAAK,UAAU,IAAI,CAAC;AACzC,aAAO,UAAU,SAAS,KAAK;AAC/B,aAAO,WAAW,CAAC;AACnB,YAAM,KAAK,WAAW,UAAU,UAAU,EAAE;AAAA,IAC9C,CAAC;AAAA,EACH;AAEA,QAAM,YAAY,MAAM,KAAK,cAAc,SAAS,CAAC;AACrD,YAAU,MAAM,CAAC,WAAW,QAAQ;AAEpC,QAAM,KAAK,cAAc,SAAS,CAAC;AACnC,QAAM,KAAK,WAAW,MAAM,CAAC;AAC7B,aAAW,KAAK,CAAC,GAAG,IAAI;AACxB,QAAM,KAAK,YAAY,MAAM,EAAE;AAC/B,QAAM,KAAK,eAAe,SAAS,EAAE;AAErC,QAAM,KAAK,cAAc,SAAS,CAAC;AACnC,WAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACpC,UAAM,KAAK,WAAW,MAAM,CAAC;AAC7B,eAAW,KAAK,CAAC,GAAG,IAAI;AACxB,UAAM,KAAK,YAAY,MAAM,EAAE;AAAA,EACjC;AACA,QAAM,KAAK,eAAe,SAAS,EAAE;AAErC,QAAM,KAAK,eAAe,SAAS,EAAE;AAErC,QAAM,OAAO;AACb,SAAO;AACT,GAAG,EAAE,KAAK,CAAC,aAAa,aAAa,YAAY,EAAE,CAAC;AAE7C,IAAM,uBAAuB,CAAC,aAA6B;AAChE,MAAI,CAAC,YAAY,CAAC,SAAS,KAAK,GAAG;AACjC,WAAO,KAAK,UAAU,EAAE,MAAM,OAAO,SAAS,CAAC,EAAE,CAAC;AAAA,EACpD;AAEA,MAAI;AACF,UAAM,SAAS,KAAK,MAAM,QAAQ;AAClC,QAAI,OAAO,SAAS,OAAO;AACzB,aAAO;AAAA,IACT;AAAA,EACF,QAAQ;AAAA,EACR;AAEA,QAAM,SAAS,GAAG,MAAM,UAAU,CAAC,CAAC;AACpC,QAAM,UAAiB,sBAAsB,MAAM;AAEnD,SAAO,KAAK,UAAU,EAAE,MAAM,OAAO,QAAQ,CAAC;AAChD;AAEA,IAAM,wBAAwB,CAAC,WAAyB;AACtD,QAAM,UAAiB,CAAC;AACxB,MAAI,IAAI;AAER,SAAO,IAAI,OAAO,QAAQ;AACxB,UAAM,QAAQ,OAAO,CAAC;AAEtB,YAAQ,MAAM,MAAM;AAAA,MAClB,KAAK,gBAAgB;AACnB,cAAM,QAAQ,SAAS,MAAM,IAAI,QAAQ,KAAK,EAAE,CAAC;AACjD,cAAM,SAAS,OAAO,IAAI,CAAC;AAC3B,cAAM,OAAO,QAAQ,WAAW;AAChC,gBAAQ,KAAK;AAAA,UACX,MAAM;AAAA,UACN,OAAO,EAAE,MAAM;AAAA,UACf,SAAS,OAAO,YAAY,IAAI,IAAI,CAAC;AAAA,QACvC,CAAC;AACD,aAAK;AACL;AAAA,MACF;AAAA,MAEA,KAAK,kBAAkB;AACrB,cAAM,SAAS,OAAO,IAAI,CAAC;AAC3B,YAAI,QAAQ,SAAS,YAAY,OAAO,SAAS,KAAK,GAAG;AACvD,kBAAQ,KAAK;AAAA,YACX,MAAM;AAAA,YACN,SAAS,YAAY,OAAO,OAAO;AAAA,UACrC,CAAC;AAAA,QACH;AACA,aAAK;AACL;AAAA,MACF;AAAA,MAEA,KAAK,cAAc;AACjB,cAAM,eAAsB,CAAC;AAC7B,YAAI,IAAI,IAAI;AAEZ,eAAO,IAAI,OAAO,UAAU,OAAO,CAAC,EAAE,SAAS,eAAe;AAC5D,gBAAM,IAAI,OAAO,CAAC;AAElB,cAAI,EAAE,SAAS,WAAW;AACxB,kBAAM,WAAkB,CAAC;AACzB,gBAAI,IAAI,IAAI;AAEZ,mBAAO,IAAI,OAAO,UAAU,OAAO,CAAC,EAAE,SAAS,YAAY;AACzD,oBAAM,OAAO,OAAO,CAAC;AACrB,kBAAI,KAAK,SAAS,aAAa,KAAK,SAAS,WAAW;AACtD,sBAAM,WAAW,KAAK,SAAS,YAAY,gBAAgB;AAC3D,sBAAM,SAAS,OAAO,IAAI,CAAC;AAC3B,sBAAM,cAAqB,QAAQ,UAC/B,CAAC,EAAE,MAAM,aAAa,SAAS,YAAY,OAAO,OAAO,EAAE,CAAC,IAC5D,CAAC,EAAE,MAAM,aAAa,SAAS,CAAC,EAAE,CAAC;AAEvC,yBAAS,KAAK;AAAA,kBACZ,MAAM;AAAA,kBACN,OAAO,EAAE,SAAS,GAAG,SAAS,GAAG,UAAU,KAAK;AAAA,kBAChD,SAAS;AAAA,gBACX,CAAC;AACD,qBAAK;AAAA,cACP,OAAO;AACL;AAAA,cACF;AAAA,YACF;AAEA,yBAAa,KAAK;AAAA,cAChB,MAAM;AAAA,cACN,SAAS;AAAA,YACX,CAAC;AACD,gBAAI,IAAI;AAAA,UACV,OAAO;AACL;AAAA,UACF;AAAA,QACF;AAEA,gBAAQ,KAAK;AAAA,UACX,MAAM;AAAA,UACN,SAAS;AAAA,QACX,CAAC;AACD,YAAI,IAAI;AACR;AAAA,MACF;AAAA,MAEA,KAAK,oBAAoB;AACvB,cAAM,QAAe,CAAC;AACtB,YAAI,IAAI,IAAI;AACZ,YAAI,aAAa;AAEjB,YAAI,QAAQ;AACZ,eAAO,QAAQ,OAAO,UAAU,OAAO,KAAK,EAAE,SAAS,qBAAqB;AAC1E,cAAI,OAAO,KAAK,EAAE,SAAS,oBAAoB,OAAO,QAAQ,CAAC,GAAG,SAAS,kBAAkB;AAC3F,kBAAM,SAAS,OAAO,QAAQ,CAAC;AAC/B,gBAAI,QAAQ,SAAS,YAAY,OAAO,SAAS,MAAM,YAAY,GAAG;AACpE,2BAAa;AACb;AAAA,YACF;AAAA,UACF;AACA;AAAA,QACF;AAEA,eAAO,IAAI,OAAO,UAAU,OAAO,CAAC,EAAE,SAAS,qBAAqB;AAClE,cAAI,OAAO,CAAC,EAAE,SAAS,kBAAkB;AACvC,kBAAM,cAAqB,CAAC;AAC5B,gBAAI,IAAI,IAAI;AAEZ,mBAAO,IAAI,OAAO,UAAU,OAAO,CAAC,EAAE,SAAS,mBAAmB;AAChE,kBAAI,OAAO,CAAC,EAAE,SAAS,oBAAoB,OAAO,IAAI,CAAC,GAAG,SAAS,UAAU;AAC3E,sBAAM,OAAO,OAAO,IAAI,CAAC,EAAE;AAC3B,oBAAI,MAAM,KAAK,GAAG;AAChB,wBAAM,YAAY,KAAK,MAAM,qBAAqB;AAElD,sBAAI,cAAc,WAAW;AAC3B,0BAAM,UAAU,UAAU,CAAC,EAAE,YAAY,MAAM;AAC/C,0BAAM,gBAAgB,UAAU,CAAC;AACjC,gCAAY,KAAK;AAAA,sBACf,MAAM;AAAA,sBACN,OAAO,EAAE,QAAQ;AAAA,sBACjB,SAAS,cAAc,KAAK,IACxB,CAAC,EAAE,MAAM,aAAa,SAAS,YAAY,aAAa,EAAE,CAAC,IAC3D,CAAC,EAAE,MAAM,aAAa,SAAS,CAAC,EAAE,CAAC;AAAA,oBACzC,CAAC;AAAA,kBACH,OAAO;AACL,gCAAY,KAAK;AAAA,sBACf,MAAM;AAAA,sBACN,SAAS,CAAC;AAAA,wBACR,MAAM;AAAA,wBACN,SAAS,YAAY,IAAI;AAAA,sBAC3B,CAAC;AAAA,oBACH,CAAC;AAAA,kBACH;AAAA,gBACF;AACA,qBAAK;AAAA,cACP,OAAO;AACL;AAAA,cACF;AAAA,YACF;AAEA,kBAAM,KAAK,GAAG,WAAW;AACzB,gBAAI,IAAI;AAAA,UACV,OAAO;AACL;AAAA,UACF;AAAA,QACF;AAEA,YAAI,YAAY;AACd,kBAAQ,KAAK;AAAA,YACX,MAAM;AAAA,YACN,SAAS;AAAA,UACX,CAAC;AAAA,QACH,OAAO;AACL,kBAAQ,KAAK;AAAA,YACX,MAAM;AAAA,YACN,OAAO,EAAE,OAAO,KAAK;AAAA,YACrB,SAAS;AAAA,UACX,CAAC;AAAA,QACH;AACA,YAAI,IAAI;AACR;AAAA,MACF;AAAA,MAEA,KAAK,qBAAqB;AACxB,cAAM,QAAe,CAAC;AACtB,YAAI,IAAI,IAAI;AAEZ,eAAO,IAAI,OAAO,UAAU,OAAO,CAAC,EAAE,SAAS,sBAAsB;AACnE,cAAI,OAAO,CAAC,EAAE,SAAS,kBAAkB;AACvC,kBAAM,cAAqB,CAAC;AAC5B,gBAAI,IAAI,IAAI;AAEZ,mBAAO,IAAI,OAAO,UAAU,OAAO,CAAC,EAAE,SAAS,mBAAmB;AAChE,kBAAI,OAAO,CAAC,EAAE,SAAS,oBAAoB,OAAO,IAAI,CAAC,GAAG,SAAS,UAAU;AAC3E,sBAAM,OAAO,OAAO,IAAI,CAAC,EAAE;AAC3B,oBAAI,MAAM,KAAK,GAAG;AAChB,8BAAY,KAAK;AAAA,oBACf,MAAM;AAAA,oBACN,SAAS,YAAY,IAAI;AAAA,kBAC3B,CAAC;AAAA,gBACH;AACA,qBAAK;AAAA,cACP,OAAO;AACL;AAAA,cACF;AAAA,YACF;AAEA,kBAAM,KAAK;AAAA,cACT,MAAM;AAAA,cACN,SAAS,YAAY,SAAS,cAAc,CAAC,EAAE,MAAM,aAAa,SAAS,CAAC,EAAE,CAAC;AAAA,YACjF,CAAC;AACD,gBAAI,IAAI;AAAA,UACV,OAAO;AACL;AAAA,UACF;AAAA,QACF;AAEA,gBAAQ,KAAK;AAAA,UACX,MAAM;AAAA,UACN,OAAO,EAAE,OAAO,EAAE;AAAA,UAClB,SAAS;AAAA,QACX,CAAC;AACD,YAAI,IAAI;AACR;AAAA,MACF;AAAA,MAEA,KAAK,mBAAmB;AACtB,cAAM,eAAsB,CAAC;AAC7B,YAAI,IAAI,IAAI;AAEZ,eAAO,IAAI,OAAO,UAAU,OAAO,CAAC,EAAE,SAAS,oBAAoB;AACjE,cAAI,OAAO,CAAC,EAAE,SAAS,oBAAoB,OAAO,IAAI,CAAC,GAAG,SAAS,UAAU;AAC3E,kBAAM,OAAO,OAAO,IAAI,CAAC,EAAE;AAC3B,yBAAa,KAAK;AAAA,cAChB,MAAM;AAAA,cACN,SAAS,YAAY,IAAI;AAAA,YAC3B,CAAC;AACD,iBAAK;AAAA,UACP,OAAO;AACL;AAAA,UACF;AAAA,QACF;AAEA,gBAAQ,KAAK;AAAA,UACX,MAAM;AAAA,UACN,SAAS;AAAA,QACX,CAAC;AACD,YAAI,IAAI;AACR;AAAA,MACF;AAAA,MAEA,KAAK;AAAA,MACL,KAAK,cAAc;AACjB,cAAM,WAAW,MAAM,MAAM,KAAK,KAAK;AACvC,gBAAQ,KAAK;AAAA,UACX,MAAM;AAAA,UACN,OAAO,EAAE,SAAS;AAAA,UAClB,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,MAAM,QAAQ,CAAC;AAAA,QACjD,CAAC;AACD;AACA;AAAA,MACF;AAAA,MAEA,KAAK;AACH,gBAAQ,KAAK,EAAE,MAAM,iBAAiB,CAAC;AACvC;AACA;AAAA,MAEF;AACE;AAAA,IACJ;AAAA,EACF;AAEA,SAAO;AACT;AAEA,IAAM,cAAc,CAAC,SAAwB;AAC3C,QAAM,QAAe,CAAC;AACtB,MAAI,YAAY;AAEhB,SAAO,UAAU,SAAS,GAAG;AAC3B,UAAM,YAAY,UAAU,MAAM,YAAY;AAC9C,QAAI,WAAW;AACb,YAAM,KAAK,EAAE,MAAM,QAAQ,MAAM,UAAU,CAAC,GAAG,OAAO,CAAC,EAAE,MAAM,OAAO,CAAC,EAAE,CAAC;AAC1E,kBAAY,UAAU,MAAM,UAAU,CAAC,EAAE,MAAM;AAC/C;AAAA,IACF;AAEA,UAAM,kBAAkB,UAAU,MAAM,sBAAsB;AAC9D,QAAI,iBAAiB;AACnB,YAAM,KAAK;AAAA,QACT,MAAM;AAAA,QACN,MAAM,gBAAgB,CAAC;AAAA,QACvB,OAAO,CAAC,EAAE,MAAM,OAAO,GAAG,EAAE,MAAM,SAAS,CAAC;AAAA,MAC9C,CAAC;AACD,kBAAY,UAAU,MAAM,gBAAgB,CAAC,EAAE,MAAM;AACrD;AAAA,IACF;AAEA,UAAM,YAAY,UAAU,MAAM,kBAAkB;AACpD,QAAI,WAAW;AACb,YAAM,KAAK,EAAE,MAAM,QAAQ,MAAM,UAAU,CAAC,GAAG,OAAO,CAAC,EAAE,MAAM,OAAO,CAAC,EAAE,CAAC;AAC1E,kBAAY,UAAU,MAAM,UAAU,CAAC,EAAE,MAAM;AAC/C;AAAA,IACF;AAEA,UAAM,cAAc,UAAU,MAAM,cAAc;AAClD,QAAI,aAAa;AACf,YAAM,KAAK,EAAE,MAAM,QAAQ,MAAM,YAAY,CAAC,GAAG,OAAO,CAAC,EAAE,MAAM,SAAS,CAAC,EAAE,CAAC;AAC9E,kBAAY,UAAU,MAAM,YAAY,CAAC,EAAE,MAAM;AACjD;AAAA,IACF;AAEA,UAAM,YAAY,UAAU,MAAM,0BAA0B;AAC5D,QAAI,WAAW;AACb,YAAM,KAAK;AAAA,QACT,MAAM;AAAA,QACN,MAAM,UAAU,CAAC;AAAA,QACjB,OAAO,CAAC,EAAE,MAAM,QAAQ,OAAO,EAAE,MAAM,UAAU,CAAC,EAAE,EAAE,CAAC;AAAA,MACzD,CAAC;AACD,kBAAY,UAAU,MAAM,UAAU,CAAC,EAAE,MAAM;AAC/C;AAAA,IACF;AAEA,UAAM,cAAc,UAAU,MAAM,aAAa;AACjD,QAAI,aAAa;AACf,YAAM,KAAK,EAAE,MAAM,QAAQ,MAAM,YAAY,CAAC,EAAE,CAAC;AACjD,kBAAY,UAAU,MAAM,YAAY,CAAC,EAAE,MAAM;AAAA,IACnD,OAAO;AACL,YAAM,KAAK,EAAE,MAAM,QAAQ,MAAM,UAAU,CAAC,EAAE,CAAC;AAC/C,kBAAY,UAAU,MAAM,CAAC;AAAA,IAC/B;AAAA,EACF;AAEA,SAAO,MAAM,SAAS,QAAQ,CAAC,EAAE,MAAM,QAAQ,KAAK,CAAC;AACvD;AAEO,IAAM,eAAe,CAAC,YAA6B;AACxD,MAAI,CAAC,QAAS,QAAO;AACrB,MAAI;AACF,UAAM,SAAS,KAAK,MAAM,OAAO;AACjC,WAAO,OAAO,SAAS;AAAA,EACzB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,IAAM,sBAAsB,CAAC,YAA4B;AAC9D,MAAI,aAAa,OAAO,GAAG;AACzB,WAAO;AAAA,EACT;AACA,SAAO,qBAAqB,OAAO;AACrC;","names":["memo","useState","useCallback","useMemo","useEffect","useMantineColorScheme","useMantineTheme","useEffect","useRef","content","Box","jsx","Box","ReactNodeViewRenderer","NodeViewWrapper","NodeViewContent","useMantineTheme","memo","useCallback","jsx","jsxs","ReactNodeViewRenderer","ReactNodeViewRenderer","NodeViewWrapper","NodeViewContent","ActionIcon","Box","IconCheck","jsx","jsxs","IconCheck","NodeViewWrapper","Box","ActionIcon","NodeViewContent","ReactNodeViewRenderer","Node","mergeAttributes","ReactNodeViewRenderer","NodeViewWrapper","Box","ActionIcon","Menu","TextInput","Text","IconSettings","IconTrash","IconCheck","useState","useCallback","jsx","jsxs","NodeViewWrapper","ActionIcon","Menu","IconSettings","IconTrash","Box","TextInput","IconCheck","Text","Node","mergeAttributes","ReactNodeViewRenderer","Node","mergeAttributes","ReactNodeViewRenderer","NodeViewWrapper","Box","ActionIcon","Menu","Textarea","Button","Text","Select","Group","Alert","Paper","Tooltip","rem","IconSettings","IconTrash","IconEye","IconCode","IconAlertCircle","useState","useCallback","jsx","jsxs","NodeViewWrapper","Paper","Group","Text","Tooltip","ActionIcon","IconEye","IconCode","Menu","IconSettings","IconTrash","Box","Select","Textarea","rem","Button","Alert","IconAlertCircle","Node","mergeAttributes","ReactNodeViewRenderer","mergeAttributes","ReactNodeViewRenderer","useState","memo","useCallback","useRef","useEffect","NodeViewWrapper","ActionIcon","Box","useMantineColorScheme","useMantineTheme","Text","IconCheck","IconCopy","jsx","jsxs","memo","ImageBlock","useState","useRef","useMantineColorScheme","useMantineTheme","useEffect","useCallback","NodeViewWrapper","Box","ActionIcon","IconCheck","IconCopy","Text","ReactNodeViewRenderer","useRef","editor","useEffect","generateId","memo","useState","useEffect","useRef","useCallback","Box","Text","useMantineTheme","memo","useState","useRef","useCallback","useEffect","useMantineTheme","Fragment","jsx","jsxs","HeadingBar","ReadingIndicator","Fragment","jsx","jsxs","memo","useMantineTheme","useState","useRef","useCallback","useEffect","Box","Text","jsx","jsxs","memo","MarkdownEditor","useState","useCallback","useMemo","editor","useEffect","useMantineColorScheme","useMantineTheme","useState","useEffect","Group","Text","Box","Button","Select","Stack","Textarea","Alert","useMantineTheme","useMantineColorScheme","IconAlertCircle","jsx","jsxs","useMantineTheme","useMantineColorScheme","useState","useEffect","Group","Stack","Box","Text","Select","Textarea","Alert","IconAlertCircle","Button","useMantineColorScheme","useMantineTheme","useEffect","useState","useCallback","useRef","Paper","Text","Group","IconCopy","IconTrash","Fragment","jsx","jsxs","container","jsx","jsxs","useMantineColorScheme","useMantineTheme","Group","ActionIcon","Text","Box","Menu","useMantineTheme","useMantineColorScheme","IconCode","IconCheck","IconSparkles","useState","Fragment","jsx","jsxs","useMantineTheme","useMantineColorScheme","useState","editor","Group","IconSparkles","IconCode","Menu","ActionIcon","Text","IconCheck","Box","Extension","useState","useEffect","useRef","Box","Text","UnstyledButton","jsx","jsxs","memo","IconList","IconListCheck","IconCode","IconQuote","IconBold","IconItalic","IconChartArea","jsx","editor","jsx","memo","BlockRenderer","Node","mergeAttributes","ReactNodeViewRenderer"]}