teamsync-pdf-viewer 1.0.3 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +53 -0
- package/LICENSE +96 -1
- package/README.md +166 -165
- package/dist/src/annotations/types.d.ts +45 -0
- package/dist/src/components/AboutModal.d.ts +6 -0
- package/dist/src/components/AnnotationContextMenu.d.ts +17 -0
- package/dist/src/components/DocumentViewer.d.ts +47 -0
- package/dist/src/components/Header.d.ts +35 -0
- package/dist/src/components/InsertLinkModal.d.ts +10 -0
- package/dist/src/components/LeftSidebar.d.ts +10 -0
- package/dist/src/components/PageContextMenu.d.ts +20 -0
- package/dist/src/components/PageRenderer.d.ts +40 -0
- package/dist/src/components/SettingsModal.d.ts +8 -0
- package/dist/src/components/Sidebar.d.ts +18 -0
- package/dist/src/components/TeamSyncViewer.d.ts +35 -0
- package/dist/src/components/TextSelectionMenu.d.ts +18 -0
- package/dist/src/core/ViewerInstance.d.ts +92 -0
- package/dist/src/core/busContext.d.ts +3 -0
- package/dist/src/core/createWebViewer.d.ts +5 -0
- package/dist/src/core/eventBus.d.ts +25 -0
- package/dist/src/core/export.d.ts +20 -0
- package/dist/src/core/pdfAssets.d.ts +27 -0
- package/dist/src/core/types.d.ts +103 -0
- package/dist/src/hooks/usePdfSearch.d.ts +23 -0
- package/dist/src/hooks/useShortcuts.d.ts +13 -0
- package/dist/src/hooks/useViewerBus.d.ts +7 -0
- package/dist/src/index.d.ts +20 -0
- package/dist/src/plugins/index.d.ts +1 -0
- package/dist/src/plugins/types.d.ts +26 -0
- package/dist/src/utils/findRegexRedactions.d.ts +6 -0
- package/dist/src/utils/rotationUtils.d.ts +32 -0
- package/dist/style.css +2 -0
- package/dist/teamsync-pdf-viewer.js +5086 -0
- package/dist/teamsync-pdf-viewer.js.map +1 -0
- package/package.json +48 -15
- package/dist/TeamSync.pdf +0 -0
- package/dist/ThirdPartyNotices.txt +0 -639
- package/dist/favicon.svg +0 -16
- package/dist/icons.svg +0 -24
- package/dist/index.d.ts +0 -1
- package/dist/teamsync-pdf-viewer.css +0 -2
- package/dist/teamsync-pdf-viewer.es.js +0 -51524
- package/dist/teamsync-pdf-viewer.umd.cjs +0 -327
- package/dist/webviewer.js +0 -92
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"teamsync-pdf-viewer.js","names":[],"sources":["../src/core/busContext.ts","../src/hooks/useViewerBus.ts","../src/components/Header.tsx","../src/components/AnnotationContextMenu.tsx","../src/components/InsertLinkModal.tsx","../src/hooks/useShortcuts.ts","../src/hooks/usePdfSearch.ts","../src/components/Sidebar.tsx","../src/components/LeftSidebar.tsx","../src/utils/rotationUtils.ts","../src/components/PageRenderer.tsx","../src/utils/findRegexRedactions.ts","../src/core/pdfAssets.ts","../src/components/DocumentViewer.tsx","../src/components/SettingsModal.tsx","../src/components/AboutModal.tsx","../src/core/eventBus.ts","../src/core/export.ts","../src/core/ViewerInstance.ts","../src/components/TeamSyncViewer.tsx","../src/core/createWebViewer.tsx"],"sourcesContent":["/**\n * © 2026 AngelBot Ai Pvt Ltd. All rights reserved.\n */\nimport { createContext } from 'react';\nimport type { ViewerBus } from './eventBus';\n\n/** Provided by <TeamSyncViewer>; every internal component reads its bus from here. */\nexport const ViewerBusContext = createContext<ViewerBus | null>(null);\n","/**\n * © 2026 AngelBot Ai Pvt Ltd. All rights reserved.\n */\nimport { useContext, useEffect, useRef } from 'react';\nimport { ViewerBusContext } from '../core/busContext';\nimport type { ViewerBus, BusListener } from '../core/eventBus';\n\nexport function useViewerBus(): ViewerBus {\n const bus = useContext(ViewerBusContext);\n if (!bus) {\n throw new Error('[teamsync-pdf-viewer] useViewerBus() must be used inside <TeamSyncViewer>.');\n }\n return bus;\n}\n\n/**\n * Subscribe to a bus event for the lifetime of the component.\n * The latest `listener` is always invoked (no stale closures) without re-subscribing on every render.\n */\nexport function useBusEvent<T = unknown>(type: string, listener: BusListener<T>): void {\n const bus = useViewerBus();\n const ref = useRef(listener);\n ref.current = listener;\n useEffect(() => bus.on<T>(type, (detail) => ref.current(detail)), [bus, type]);\n}\n","/**\n * © 2026 AngelBot Ai Pvt Ltd. All rights reserved.\n */\nimport React, { useState, useRef, useEffect } from 'react';\nimport { \n Menu, PanelLeft,\n Hand, Search, MessageSquare, \n FileText, Download, Maximize, Save, Printer, Settings, Info,\n MinusCircle, PlusCircle, Maximize2, MoveHorizontal, ChevronUp, ChevronDown, ScanSearch,\n FileCode2, File, Copy, Expand, RotateCw, RotateCcw, ShieldCheck, Pen\n} from 'lucide-react';\n\nimport type { SDKPermissions } from '../core/types';\nimport type { ViewerPlugin } from '../plugins/types';\nimport { useViewerBus, useBusEvent } from '../hooks/useViewerBus';\n\ninterface HeaderProps {\n activeTab: string;\n setActiveTab: (tab: string) => void;\n leftSidebarOpen: boolean;\n setLeftSidebarOpen: (open: boolean) => void;\n rightSidebarOpen: boolean;\n setRightSidebarOpen: (open: boolean) => void;\n sidebarTab: 'Comments' | 'Search';\n scale: number;\n onZoomIn: () => void;\n onZoomOut: () => void;\n onZoomSet: (scale: number) => void;\n onDownload: () => void;\n onFullScreen: () => void;\n onSaveAs: () => void;\n onOpenSettings: () => void;\n onOpenAbout: () => void;\n onOpenSidebarTab: (tab: 'Comments' | 'Search') => void;\n pageTransition: 'continuous' | 'page-by-page';\n setPageTransition: (t: 'continuous' | 'page-by-page') => void;\n pageLayout: 'single' | 'double' | 'cover-facing';\n setPageLayout: (l: 'single' | 'double' | 'cover-facing') => void;\n rotation: number;\n setRotation: (r: number) => void;\n signatureCount?: number;\n enableAnnotations?: boolean;\n enableSign?: boolean;\n plugins?: ViewerPlugin[];\n permissions?: SDKPermissions;\n}\n\nconst TABS = [\n 'View', 'Annotate'\n];\n\nexport default function Header({ \n activeTab, setActiveTab, \n leftSidebarOpen, setLeftSidebarOpen,\n rightSidebarOpen, setRightSidebarOpen: _setRightSidebarOpen,\n sidebarTab,\n scale, onZoomIn, onZoomOut, onZoomSet,\n onDownload, onFullScreen, onSaveAs, onOpenSettings, onOpenAbout, onOpenSidebarTab,\n pageTransition, setPageTransition, pageLayout, setPageLayout, rotation, setRotation,\n signatureCount = 0,\n enableAnnotations,\n enableSign = false,\n plugins,\n permissions\n}: HeaderProps) {\n const hasSignPlugin = plugins && plugins.some(p => p.id && p.id.toLowerCase().includes('sign'));\n const isSignVisible = enableSign === true && Boolean(hasSignPlugin);\n const [isMenuOpen, setIsMenuOpen] = useState(false);\n const [isZoomMenuOpen, setIsZoomMenuOpen] = useState(false);\n const [isViewSettingsOpen, setIsViewSettingsOpen] = useState(false);\n const [headerTool, setHeaderTool] = useState<string | null>('pan');\n const menuRef = useRef<HTMLDivElement>(null);\n const zoomMenuRef = useRef<HTMLDivElement>(null);\n const viewSettingsRef = useRef<HTMLDivElement>(null);\n const bus = useViewerBus();\n\n useBusEvent<{ tool: string | null }>('action-tool-changed', (d) => setHeaderTool(d?.tool ?? null));\n\n useEffect(() => {\n function handleClickOutside(event: MouseEvent) {\n if (menuRef.current && !menuRef.current.contains(event.target as Node)) {\n setIsMenuOpen(false);\n }\n if (zoomMenuRef.current && !zoomMenuRef.current.contains(event.target as Node)) {\n setIsZoomMenuOpen(false);\n }\n if (viewSettingsRef.current && !viewSettingsRef.current.contains(event.target as Node)) {\n setIsViewSettingsOpen(false);\n }\n }\n document.addEventListener(\"mousedown\", handleClickOutside);\n return () => {\n document.removeEventListener(\"mousedown\", handleClickOutside);\n };\n }, []);\n\n return (\n <div style={{ \n display: 'flex', \n flexDirection: 'column',\n borderBottom: '1px solid var(--border-color)',\n backgroundColor: 'var(--toolbar-bg)',\n color: 'var(--text-color)'\n }}>\n <div style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n height: '48px',\n padding: '0 8px'\n }}>\n {/* Left Section */}\n <div style={{ display: 'flex', alignItems: 'center', gap: '8px' }}>\n <div ref={menuRef} style={{ position: 'relative' }}>\n <IconButton icon={<Menu size={18} />} title=\"Menu\" onClick={() => setIsMenuOpen(!isMenuOpen)} active={isMenuOpen} />\n {isMenuOpen && (\n <div style={{ \n position: 'absolute', top: '100%', left: 0, marginTop: '4px',\n backgroundColor: '#fff', borderRadius: '4px', boxShadow: '0 4px 12px rgba(0,0,0,0.15)',\n width: '220px', zIndex: 1000, display: 'flex', flexDirection: 'column',\n border: '1px solid var(--border-color)', overflow: 'hidden'\n }}>\n <MenuOption icon={<Download size={16} />} label=\"Download\" onClick={() => { onDownload(); setIsMenuOpen(false); }} />\n <MenuOption icon={<Maximize size={16} />} label=\"Enter Full Screen\" onClick={() => { onFullScreen(); setIsMenuOpen(false); }} />\n <MenuOption icon={<Save size={16} />} label=\"Save As\" onClick={() => { onSaveAs(); setIsMenuOpen(false); }} />\n <MenuOption icon={<Printer size={16} />} label=\"Print\" disabled />\n <div style={{ height: '1px', backgroundColor: 'var(--border-color)', margin: '4px 0' }} />\n <MenuOption icon={<Settings size={16} />} label=\"Settings\" onClick={() => { onOpenSettings(); setIsMenuOpen(false); }} />\n </div>\n )}\n </div>\n <IconButton \n icon={<PanelLeft size={18} />} \n title=\"Toggle Left Panel\"\n active={leftSidebarOpen}\n onClick={() => setLeftSidebarOpen(!leftSidebarOpen)} \n />\n <div style={{ width: '1px', height: '24px', backgroundColor: 'var(--border-color)', margin: '0 4px' }} />\n <div ref={viewSettingsRef} style={{ position: 'relative' }}>\n <div style={{ position: 'relative' }}>\n <IconButton \n icon={\n <div style={{ position: 'relative', display: 'flex', alignItems: 'center', justifyContent: 'center' }}>\n <FileText size={18} />\n <div style={{ position: 'absolute', right: '-4px', bottom: '-4px', backgroundColor: '#fff', borderRadius: '50%', padding: '1px' }}>\n <Settings size={10} color=\"var(--primary)\" />\n </div>\n </div>\n } \n title=\"View Settings\"\n active={isViewSettingsOpen}\n onClick={() => setIsViewSettingsOpen(!isViewSettingsOpen)} \n />\n </div>\n {isViewSettingsOpen && (\n <div style={{ \n position: 'absolute', top: '100%', left: 0, marginTop: '4px',\n backgroundColor: '#fff', borderRadius: '4px', boxShadow: '0 4px 16px rgba(0,0,0,0.15)',\n width: '240px', zIndex: 1000, display: 'flex', flexDirection: 'column',\n border: '1px solid var(--border-color)', overflow: 'hidden'\n }}>\n <div style={{ padding: '12px 16px 8px', fontSize: '12px', fontWeight: 600, color: '#374151' }}>Page Transition</div>\n <MenuOption \n icon={<FileCode2 size={16} />} \n label=\"Continuous Page\" \n selected={pageTransition === 'continuous'}\n onClick={() => { setPageTransition('continuous'); setIsViewSettingsOpen(false); }} \n />\n <MenuOption \n icon={<File size={16} />} \n label=\"Page By Page\" \n selected={pageTransition === 'page-by-page'}\n onClick={() => { setPageTransition('page-by-page'); setIsViewSettingsOpen(false); }} \n />\n \n <div style={{ height: '1px', backgroundColor: 'var(--border-color)', margin: '4px 0' }} />\n \n <div style={{ padding: '12px 16px 8px', fontSize: '12px', fontWeight: 600, color: '#374151' }}>Page Orientation</div>\n <MenuOption \n icon={<RotateCw size={16} />} \n label=\"Rotate Clockwise\" \n onClick={() => { setRotation((rotation + 90) % 360); setIsViewSettingsOpen(false); }} \n />\n <MenuOption \n icon={<RotateCcw size={16} />} \n label=\"Rotate Counterclockwise\" \n onClick={() => { setRotation((rotation - 90 + 360) % 360); setIsViewSettingsOpen(false); }} \n />\n \n <div style={{ height: '1px', backgroundColor: 'var(--border-color)', margin: '4px 0' }} />\n\n <div style={{ padding: '12px 16px 8px', fontSize: '12px', fontWeight: 600, color: '#374151' }}>Page Layout</div>\n <MenuOption \n icon={<File size={16} />} \n label=\"Single Page\" \n selected={pageLayout === 'single'}\n onClick={() => { setPageLayout('single'); setIsViewSettingsOpen(false); }} \n />\n <MenuOption \n icon={<Copy size={16} />} \n label=\"Double Page\" \n selected={pageLayout === 'double'}\n onClick={() => { setPageLayout('double'); setIsViewSettingsOpen(false); }} \n />\n <MenuOption \n icon={<FileText size={16} />} \n label=\"Cover Facing Page\" \n selected={pageLayout === 'cover-facing'}\n onClick={() => { setPageLayout('cover-facing'); setIsViewSettingsOpen(false); }} \n />\n\n <div style={{ height: '1px', backgroundColor: 'var(--border-color)', margin: '4px 0' }} />\n\n <MenuOption \n icon={<Expand size={16} />} \n label=\"Enter Full Screen\" \n onClick={() => { onFullScreen(); setIsViewSettingsOpen(false); }} \n />\n </div>\n )}\n </div>\n <div style={{ display: 'flex', alignItems: 'center', gap: '4px' }}>\n <div ref={zoomMenuRef} style={{ position: 'relative', display: 'flex', alignItems: 'center' }}>\n <div style={{\n display: 'flex', alignItems: 'center', backgroundColor: '#f3f4f6', \n borderRadius: '4px', border: isZoomMenuOpen ? '1px solid var(--primary)' : '1px solid transparent',\n cursor: 'pointer', userSelect: 'none', height: '32px'\n }}>\n <div \n onClick={() => setIsZoomMenuOpen(!isZoomMenuOpen)}\n style={{ \n padding: '0 8px 0 12px', fontSize: '13px', fontWeight: 500, \n display: 'flex', alignItems: 'center', height: '100%'\n }}\n >\n {Math.round(scale * 100)}%\n </div>\n <div \n onClick={() => setIsZoomMenuOpen(!isZoomMenuOpen)}\n style={{ \n padding: '0 8px', display: 'flex', alignItems: 'center', height: '100%',\n borderLeft: '1px solid #e5e7eb', color: isZoomMenuOpen ? 'var(--primary)' : 'var(--text-color)'\n }}\n >\n {isZoomMenuOpen ? <ChevronUp size={14} /> : <ChevronDown size={14} />}\n </div>\n </div>\n \n {isZoomMenuOpen && (\n <div style={{ \n position: 'absolute', top: '100%', left: 0, marginTop: '4px',\n backgroundColor: '#fff', borderRadius: '4px', boxShadow: '0 4px 16px rgba(0,0,0,0.15)',\n width: '180px', zIndex: 1000, display: 'flex', flexDirection: 'column',\n border: '1px solid var(--border-color)', overflow: 'hidden', padding: '8px 0'\n }}>\n <MenuOption icon={<MoveHorizontal size={16} />} label=\"Fit To Width\" onClick={() => { bus.emit('action-fit-to-width'); setIsZoomMenuOpen(false); }} />\n <MenuOption icon={<Maximize2 size={16} />} label=\"Fit To Page\" onClick={() => { bus.emit('action-fit-to-page'); setIsZoomMenuOpen(false); }} />\n <div style={{ height: '1px', backgroundColor: 'var(--border-color)', margin: '4px 0' }} />\n {[0.1, 0.25, 0.5, 1, 1.25, 1.5, 2, 4, 8, 16, 32, 64].map(zoomLevel => (\n <div \n key={zoomLevel}\n onClick={() => { if(onZoomSet) onZoomSet(zoomLevel); setIsZoomMenuOpen(false); }}\n style={{ \n padding: '6px 44px', fontSize: '13px', cursor: 'pointer', \n backgroundColor: scale === zoomLevel ? '#f3f4f6' : '#fff'\n }}\n onMouseEnter={(e) => e.currentTarget.style.backgroundColor = '#f3f4f6'}\n onMouseLeave={(e) => e.currentTarget.style.backgroundColor = scale === zoomLevel ? '#f3f4f6' : '#fff'}\n >\n {Math.round(zoomLevel * 100)}%\n </div>\n ))}\n <div style={{ height: '1px', backgroundColor: 'var(--border-color)', margin: '4px 0' }} />\n <MenuOption icon={<ScanSearch size={16} />} label=\"Marquee Zoom\" onClick={() => setIsZoomMenuOpen(false)} />\n </div>\n )}\n </div>\n <IconButton icon={<MinusCircle size={18} color=\"var(--text-muted)\" />} title=\"Zoom Out\" onClick={onZoomOut} />\n <IconButton icon={<PlusCircle size={18} color=\"var(--text-muted)\" />} title=\"Zoom In\" onClick={onZoomIn} />\n </div>\n <div style={{ width: '1px', height: '24px', backgroundColor: 'var(--border-color)', margin: '0 4px' }} />\n <IconButton icon={<Hand size={18} />} title=\"Pan Tool\" active={headerTool === 'pan'} onClick={() => bus.emit('action-set-tool', { tool: 'pan' })} />\n </div>\n\n {/* Center Section: Tabs */}\n <div style={{ display: 'flex', alignItems: 'flex-end', height: '100%', gap: '16px' }}>\n {TABS.filter(tab => !(tab === 'Annotate' && (enableAnnotations === false || permissions?.canAddAnnotations === false))).map(tab => (\n <div \n key={tab}\n onClick={() => setActiveTab(tab)}\n style={{\n fontSize: '13px',\n fontWeight: activeTab === tab ? 500 : 400,\n color: activeTab === tab ? 'var(--primary)' : 'var(--text-muted)',\n cursor: 'pointer',\n height: '100%',\n display: 'flex',\n alignItems: 'center',\n borderBottom: activeTab === tab ? '2px solid var(--primary)' : '2px solid transparent',\n padding: '0 4px'\n }}\n >\n {tab}\n </div>\n ))}\n </div>\n\n {/* Right Section */}\n <div style={{ display: 'flex', alignItems: 'center', gap: '8px' }}>\n \n {/* Sign Button */}\n {isSignVisible && (\n <button \n onClick={() => bus.emit('action-sign')}\n style={{ \n background: '#fff0f0', border: '1px solid #d32f2f', color: '#d32f2f', \n display: 'flex', alignItems: 'center', justifyContent: 'center', gap: '6px',\n height: '32px', padding: '0 12px', borderRadius: '4px', cursor: 'pointer',\n fontWeight: 600, fontSize: '13px'\n }}\n >\n <Pen size={14} color=\"#d32f2f\" fill=\"#d32f2f\" />\n Sign\n </button>\n )}\n \n {/* Verify Button (Only visible if signed) */}\n {signatureCount > 0 && (\n <div \n onClick={() => bus.emit('action-verify')}\n style={{ \n backgroundColor: '#10b981', color: '#000', \n borderRadius: '16px', padding: '4px 12px', \n display: 'flex', alignItems: 'center', gap: '6px', \n cursor: 'pointer', fontWeight: 600, fontSize: '13px'\n }}\n title=\"Verify Signatures\"\n >\n <ShieldCheck size={16} /> Signed · {signatureCount}\n </div>\n )}\n\n <div style={{ width: '1px', height: '24px', backgroundColor: 'var(--border-color)', margin: '0 4px' }} />\n\n <IconButton \n icon={<Info size={18} />} \n title=\"About / Info\"\n onClick={onOpenAbout} \n />\n\n <IconButton \n icon={<Search size={18} />} \n title=\"Search\"\n active={rightSidebarOpen && sidebarTab === 'Search'}\n onClick={() => onOpenSidebarTab('Search')} \n />\n <IconButton \n icon={<MessageSquare size={18} />} \n title=\"Comments\"\n active={rightSidebarOpen && sidebarTab === 'Comments'}\n onClick={() => onOpenSidebarTab('Comments')} \n />\n </div>\n </div>\n </div>\n );\n}\n\nfunction IconButton({ icon, onClick, active = false, title }: { icon: React.ReactNode, onClick?: () => void, active?: boolean, title?: string }) {\n return (\n <button \n title={title}\n onClick={onClick}\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '32px',\n height: '32px',\n border: 'none',\n borderRadius: '4px',\n backgroundColor: active ? '#e6f0fa' : 'transparent',\n color: active ? 'var(--primary)' : 'inherit',\n cursor: 'pointer',\n outline: 'none',\n }}\n onMouseOver={(e) => {\n if (!active) e.currentTarget.style.backgroundColor = 'var(--hover-bg)';\n }}\n onMouseOut={(e) => {\n if (!active) e.currentTarget.style.backgroundColor = 'transparent';\n }}\n >\n {icon}\n </button>\n );\n}\n\nfunction MenuOption({ icon, label, onClick, disabled = false, selected = false }: { icon: React.ReactNode, label: string, onClick?: () => void, disabled?: boolean, selected?: boolean }) {\n const [hovered, setHovered] = useState(false);\n return (\n <div \n onClick={disabled ? undefined : onClick}\n onMouseEnter={() => setHovered(!disabled)}\n onMouseLeave={() => setHovered(false)}\n style={{ \n display: 'flex', alignItems: 'center', gap: '12px', padding: '10px 16px', \n cursor: disabled ? 'default' : 'pointer', color: disabled ? '#ccc' : (selected ? '#fff' : 'var(--text-color)'),\n backgroundColor: disabled ? 'transparent' : (selected ? 'var(--primary)' : (hovered ? '#f5f5f5' : 'transparent')),\n fontSize: '13px'\n }}\n >\n <div style={{ color: disabled ? '#ccc' : (selected ? '#fff' : 'var(--text-muted)') }}>{icon}</div>\n <span>{label}</span>\n </div>\n );\n}\n","/**\n * © 2026 AngelBot Ai Pvt Ltd. All rights reserved.\n */\nimport React from 'react';\nimport { Copy, Trash2, Link as LinkIcon, Edit2 } from 'lucide-react';\nimport type { Annotation } from '../annotations/types';\n\nimport type { SDKPermissions } from '../core/types';\n\ninterface AnnotationContextMenuProps {\n annotation: Annotation;\n position: { top: number; left: number };\n onCopy: () => void;\n onDelete: () => void;\n onUpdateColor: (color: string) => void;\n onOpenLinkModal: () => void;\n permissions?: SDKPermissions;\n}\n\nexport default function AnnotationContextMenu({\n annotation,\n position,\n onCopy,\n onDelete,\n onUpdateColor,\n onOpenLinkModal,\n permissions\n}: AnnotationContextMenuProps) {\n const canAdd = permissions?.canAddAnnotations !== false;\n const canEdit = permissions?.canEditAnnotations !== false;\n const canDelete = permissions?.canDeleteAnnotations !== false;\n\n // Simple predefined colors for quick selection\n const COLORS = ['#ef4444', '#f59e0b', '#10b981', '#3b82f6', '#8b5cf6', '#000000'];\n\n return (\n <div\n style={{\n position: 'absolute',\n top: `${position.top}px`,\n left: `${position.left}px`,\n backgroundColor: '#ffffff',\n border: '1px solid #e5e7eb',\n borderRadius: '6px',\n boxShadow: '0 4px 12px rgba(0,0,0,0.1)',\n display: 'flex',\n alignItems: 'center',\n padding: '4px',\n gap: '4px',\n zIndex: 2000,\n transform: 'translateY(8px)' // Slight offset below the element\n }}\n onClick={(e) => e.stopPropagation()}\n >\n {canAdd && (\n <>\n <MenuButton icon={<Copy size={16} />} title=\"Duplicate\" onClick={onCopy} />\n <div style={{ width: '1px', height: '20px', backgroundColor: '#e5e7eb', margin: '0 4px' }} />\n </>\n )}\n \n {canEdit && (\n <>\n <div style={{ display: 'flex', alignItems: 'center', gap: '2px', padding: '0 4px' }}>\n {COLORS.map(c => (\n <div\n key={c}\n onClick={() => onUpdateColor(c)}\n style={{\n width: '16px',\n height: '16px',\n borderRadius: '50%',\n backgroundColor: c,\n cursor: 'pointer',\n border: annotation.color === c ? '2px solid #374151' : '1px solid transparent'\n }}\n title={`Set color ${c}`}\n />\n ))}\n </div>\n <div style={{ width: '1px', height: '20px', backgroundColor: '#e5e7eb', margin: '0 4px' }} />\n </>\n )}\n\n {canEdit && (\n annotation.type === 'link' ? (\n <button\n title={annotation.linkUrl ? `Edit Link (${annotation.linkUrl})` : 'Edit Link'}\n onClick={onOpenLinkModal}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: '4px',\n height: '32px',\n borderRadius: '4px',\n border: 'none',\n backgroundColor: '#eef2ff',\n cursor: 'pointer',\n color: '#4338ca',\n padding: '0 10px',\n fontSize: '12px',\n fontWeight: 500\n }}\n onMouseEnter={(e) => e.currentTarget.style.backgroundColor = '#e0e7ff'}\n onMouseLeave={(e) => e.currentTarget.style.backgroundColor = '#eef2ff'}\n >\n <Edit2 size={14} />\n Edit Link\n </button>\n ) : (\n <MenuButton icon={<LinkIcon size={16} />} title=\"Link URL or Page\" onClick={onOpenLinkModal} />\n )\n )}\n\n {canDelete && (\n <MenuButton icon={<Trash2 size={16} />} title=\"Delete\" onClick={onDelete} color=\"#ef4444\" />\n )}\n </div>\n );\n}\n\nfunction MenuButton({ icon, title, onClick, color = '#4b5563' }: { icon: React.ReactNode, title: string, onClick: () => void, color?: string }) {\n return (\n <button\n title={title}\n onClick={onClick}\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '32px',\n height: '32px',\n borderRadius: '4px',\n border: 'none',\n backgroundColor: 'transparent',\n cursor: 'pointer',\n color: color\n }}\n onMouseEnter={(e) => e.currentTarget.style.backgroundColor = '#f3f4f6'}\n onMouseLeave={(e) => e.currentTarget.style.backgroundColor = 'transparent'}\n >\n {icon}\n </button>\n );\n}\n","/**\n * © 2026 AngelBot Ai Pvt Ltd. All rights reserved.\n */\nimport React, { useState } from 'react';\nimport { X } from 'lucide-react';\n\ninterface InsertLinkModalProps {\n initialUrl?: string;\n initialText?: string;\n showTextInput?: boolean;\n onClose: () => void;\n onSave: (url: string, text?: string) => void;\n}\n\nexport default function InsertLinkModal({ initialUrl = '', initialText = '', showTextInput = false, onClose, onSave }: InsertLinkModalProps) {\n const isInitialPage = initialUrl.startsWith('#page=');\n const [activeTab, setActiveTab] = useState<'url' | 'page'>(isInitialPage ? 'page' : 'url');\n const [url, setUrl] = useState(isInitialPage ? '' : initialUrl);\n const [page, setPage] = useState(isInitialPage ? initialUrl.replace('#page=', '') : '1');\n const [text, setText] = useState(initialText);\n\n const isSaveDisabled = activeTab === 'url' ? !url.trim() : !page.trim();\n\n const handleSave = () => {\n if (isSaveDisabled) return;\n const finalUrl = activeTab === 'page' ? `#page=${page}` : url;\n if (showTextInput) {\n onSave(finalUrl, text.trim() || finalUrl);\n } else {\n onSave(finalUrl);\n }\n };\n\n return (\n <div style={{\n position: 'fixed', top: 0, left: 0, right: 0, bottom: 0,\n backgroundColor: 'rgba(0,0,0,0.5)', display: 'flex', alignItems: 'center', justifyContent: 'center',\n zIndex: 3000\n }}>\n <div style={{\n backgroundColor: '#fff',\n color: '#333',\n borderRadius: '8px',\n width: '400px',\n boxShadow: '0 10px 25px rgba(0,0,0,0.2)',\n fontFamily: 'sans-serif',\n overflow: 'hidden',\n display: 'flex',\n flexDirection: 'column'\n }}>\n {/* Header */}\n <div style={{ \n padding: '16px', borderBottom: '1px solid #e5e7eb', \n display: 'flex', alignItems: 'center', justifyContent: 'space-between'\n }}>\n <h2 style={{ margin: 0, fontSize: '16px', fontWeight: 600 }}>Insert Link or Page</h2>\n <button \n onClick={onClose}\n style={{ background: 'none', border: 'none', cursor: 'pointer', color: '#6b7280' }}\n >\n <X size={20} />\n </button>\n </div>\n\n {/* Content */}\n <div style={{ padding: '16px' }}>\n {/* Tabs */}\n <div style={{ display: 'flex', border: '1px solid #2b76b9', borderRadius: '4px', overflow: 'hidden', marginBottom: '16px' }}>\n <div \n onClick={() => setActiveTab('url')}\n style={{ flex: 1, textAlign: 'center', padding: '8px', backgroundColor: activeTab === 'url' ? '#2b76b9' : '#fff', color: activeTab === 'url' ? '#fff' : '#6b7280', fontWeight: 500, fontSize: '13px', cursor: 'pointer' }}>\n URL\n </div>\n <div \n onClick={() => setActiveTab('page')}\n style={{ flex: 1, textAlign: 'center', padding: '8px', backgroundColor: activeTab === 'page' ? '#2b76b9' : '#fff', color: activeTab === 'page' ? '#fff' : '#6b7280', fontWeight: 500, fontSize: '13px', cursor: 'pointer' }}>\n Page\n </div>\n </div>\n\n {/* URL or Page input (mandatory) */}\n {activeTab === 'url' ? (\n <div style={{ marginBottom: showTextInput ? '16px' : '0' }}>\n <label style={{ display: 'block', marginBottom: '8px', fontSize: '13px', fontWeight: 600, color: '#374151' }}>\n Enter URL <span style={{ color: '#ef4444' }}>*</span>\n </label>\n <input \n type=\"text\" \n value={url}\n onChange={(e) => setUrl(e.target.value)}\n placeholder=\"https://...\"\n style={{\n width: '100%', padding: '10px', boxSizing: 'border-box',\n border: `1px solid ${!url.trim() ? '#fca5a5' : '#d1d5db'}`, borderRadius: '4px', fontSize: '14px'\n }}\n onKeyDown={(e) => {\n if (e.key === 'Enter') handleSave();\n }}\n autoFocus\n />\n </div>\n ) : (\n <div style={{ marginBottom: showTextInput ? '16px' : '0' }}>\n <label style={{ display: 'block', marginBottom: '8px', fontSize: '13px', fontWeight: 600, color: '#374151' }}>\n Enter Page Number <span style={{ color: '#ef4444' }}>*</span>\n </label>\n <input \n type=\"number\" \n value={page}\n min=\"1\"\n onChange={(e) => setPage(e.target.value)}\n placeholder=\"10\"\n style={{\n width: '100%', padding: '10px', boxSizing: 'border-box',\n border: `1px solid ${!page.trim() ? '#fca5a5' : '#d1d5db'}`, borderRadius: '4px', fontSize: '14px'\n }}\n onKeyDown={(e) => {\n if (e.key === 'Enter') handleSave();\n }}\n autoFocus\n />\n </div>\n )}\n\n {/* Text to Display (optional, below URL/Page) */}\n {showTextInput && (\n <div>\n <label style={{ display: 'block', marginBottom: '8px', fontSize: '13px', fontWeight: 600, color: '#374151' }}>\n Text to Display <span style={{ color: '#9ca3af', fontWeight: 400, fontSize: '12px' }}>(optional — defaults to URL/page)</span>\n </label>\n <input \n type=\"text\" \n value={text}\n onChange={(e) => setText(e.target.value)}\n placeholder={activeTab === 'url' ? url || 'Link text...' : `Page ${page}`}\n style={{\n width: '100%', padding: '10px', boxSizing: 'border-box',\n border: '1px solid #d1d5db', borderRadius: '4px', fontSize: '14px'\n }}\n onKeyDown={(e) => {\n if (e.key === 'Enter') handleSave();\n }}\n />\n </div>\n )}\n </div>\n \n {/* Footer */}\n <div style={{ padding: '16px', borderTop: '1px solid #e5e7eb', display: 'flex', justifyContent: 'flex-end', backgroundColor: '#f9fafb' }}>\n <button \n onClick={handleSave}\n disabled={isSaveDisabled}\n style={{ \n backgroundColor: isSaveDisabled ? '#93c5fd' : '#2b76b9', color: '#fff', border: 'none', borderRadius: '4px',\n padding: '8px 24px', fontSize: '14px', fontWeight: 500, cursor: isSaveDisabled ? 'not-allowed' : 'pointer'\n }}\n >\n Link\n </button>\n </div>\n </div>\n </div>\n );\n}\n","/**\n * © 2026 AngelBot Ai Pvt Ltd. All rights reserved.\n */\nimport { useState, useEffect } from 'react';\n\nexport type ActionType = 'ROTATE_CW' | 'ROTATE_CCW' | 'UNDO' | 'REDO' | 'DELETE' | 'COPY' | 'PASTE' | 'FILE_PICKER' | 'SEARCH';\n\nexport interface Shortcut {\n action: ActionType;\n description: string;\n defaultCommand: string;\n command: string;\n}\n\nconst DEFAULT_SHORTCUTS: Shortcut[] = [\n { action: 'ROTATE_CW', description: 'Rotate the document clockwise', defaultCommand: 'Meta+Shift+=', command: 'Meta+Shift+=' },\n { action: 'ROTATE_CCW', description: 'Rotate the document counterclockwise', defaultCommand: 'Meta+Shift+-', command: 'Meta+Shift+-' },\n { action: 'COPY', description: 'Copy selected text or annotations', defaultCommand: 'Meta+C', command: 'Meta+C' },\n { action: 'PASTE', description: 'Paste text or annotations', defaultCommand: 'Meta+V', command: 'Meta+V' },\n { action: 'UNDO', description: 'Undo an annotation change', defaultCommand: 'Meta+Z', command: 'Meta+Z' },\n { action: 'REDO', description: 'Redo an annotation change', defaultCommand: 'Meta+Shift+Z', command: 'Meta+Shift+Z' },\n { action: 'FILE_PICKER', description: 'Open the file picker', defaultCommand: 'Meta+O', command: 'Meta+O' },\n { action: 'SEARCH', description: 'Open the search overlay', defaultCommand: 'Meta+F', command: 'Meta+F' },\n { action: 'DELETE', description: 'Delete selected annotation', defaultCommand: 'Delete', command: 'Delete' },\n];\n\nexport function useShortcuts() {\n const [shortcuts, setShortcuts] = useState<Shortcut[]>([]);\n\n useEffect(() => {\n const saved = localStorage.getItem('pdfviewer_shortcuts');\n if (saved) {\n try {\n const parsed = JSON.parse(saved);\n // Merge with defaults to ensure new actions are included\n const merged = DEFAULT_SHORTCUTS.map(def => {\n const found = parsed.find((p: Shortcut) => p.action === def.action);\n return found ? { ...def, command: found.command } : def;\n });\n setShortcuts(merged);\n } catch {\n setShortcuts(DEFAULT_SHORTCUTS);\n }\n } else {\n setShortcuts(DEFAULT_SHORTCUTS);\n }\n }, []);\n\n const updateShortcut = (action: ActionType, newCommand: string) => {\n const updated = shortcuts.map(s => s.action === action ? { ...s, command: newCommand } : s);\n setShortcuts(updated);\n localStorage.setItem('pdfviewer_shortcuts', JSON.stringify(updated));\n };\n\n const getCommand = (action: ActionType) => {\n const s = shortcuts.find(s => s.action === action);\n return s ? s.command : '';\n };\n\n return { shortcuts, updateShortcut, getCommand };\n}\n\n// Utility to match KeyboardEvent against a command string\nexport function matchShortcut(e: KeyboardEvent, commandString: string): boolean {\n if (!commandString) return false;\n \n const parts = commandString.toLowerCase().split('+');\n const needsMeta = parts.includes('meta') || parts.includes('cmd') || parts.includes('ctrl');\n const needsShift = parts.includes('shift');\n const needsAlt = parts.includes('alt');\n \n const isMetaPressed = e.metaKey || e.ctrlKey;\n \n if (needsMeta !== isMetaPressed) return false;\n if (needsShift !== e.shiftKey) return false;\n if (needsAlt !== e.altKey) return false;\n\n const key = parts[parts.length - 1];\n \n // Special keys mapping\n if (key === 'delete' && (e.key === 'Delete' || e.key === 'Backspace')) return true;\n if (e.key.toLowerCase() === key) return true;\n \n return false;\n}\n","/**\n * © 2026 AngelBot Ai Pvt Ltd. All rights reserved.\n */\nimport { useState, useCallback } from 'react';\nimport * as pdfjsLib from 'pdfjs-dist';\nimport type { Redaction } from '../core/types';\n\nexport interface SearchBounds {\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\nexport interface SearchResult {\n id: string;\n pageIndex: number;\n snippet: string;\n matchStartIndex: number;\n matchLength: number;\n bounds: SearchBounds[];\n}\n\nexport function usePdfSearch(pdfDoc: pdfjsLib.PDFDocumentProxy | null, redactions: Redaction[] = []) {\n const [isSearching, setIsSearching] = useState(false);\n const [searchResults, setSearchResults] = useState<SearchResult[]>([]);\n const [searchProgress, setSearchProgress] = useState(0);\n\n const search = useCallback(async (query: string) => {\n if (!pdfDoc || !query.trim()) {\n setSearchResults([]);\n return;\n }\n\n setIsSearching(true);\n setSearchProgress(0);\n const results: SearchResult[] = [];\n const lowerQuery = query.toLowerCase();\n\n try {\n const numPages = pdfDoc.numPages;\n \n const batchSize = 10;\n \n for (let batchStart = 1; batchStart <= numPages; batchStart += batchSize) {\n const batchPromises = [];\n const batchEnd = Math.min(batchStart + batchSize - 1, numPages);\n \n for (let pageNum = batchStart; pageNum <= batchEnd; pageNum++) {\n batchPromises.push(\n (async () => {\n const page = await pdfDoc.getPage(pageNum);\n const textContent = await page.getTextContent();\n \n // --- Text Layer Sanitization ---\n let items = textContent.items as any[];\n if (redactions && redactions.length > 0) {\n const pageRedactions = redactions.filter(r => r.pageIndex === pageNum);\n if (pageRedactions.length > 0) {\n const vp = page.getViewport({ scale: 1 });\n items = items.filter((item: any) => {\n if (!item.str || item.str.trim() === '') return true;\n \n const itemX = item.transform[4];\n const itemY = item.transform[5];\n const itemW = item.width;\n const itemH = item.height || Math.abs(item.transform[3]);\n const itemTopY = vp.height - itemY - itemH;\n \n for (const red of pageRedactions) {\n const intersectX = Math.max(itemX, red.x) < Math.min(itemX + itemW, red.x + red.width);\n const intersectY = Math.max(itemTopY, red.y) < Math.min(itemTopY + itemH, red.y + red.height);\n \n if (intersectX && intersectY) {\n return false; // Intersects redacted region, exclude from search results!\n }\n }\n return true;\n });\n }\n }\n \n let fullText = '';\n const itemIndices: number[] = [];\n const charIndices: number[] = [];\n \n items.forEach((item, index) => {\n const str = item.str;\n for (let i = 0; i < str.length; i++) {\n itemIndices.push(index);\n charIndices.push(i);\n }\n fullText += str;\n \n if (item.hasEOL) {\n fullText += '\\n';\n itemIndices.push(-1);\n charIndices.push(-1);\n } else {\n fullText += ' ';\n itemIndices.push(-1);\n charIndices.push(-1);\n }\n });\n\n const lowerFullText = fullText.toLowerCase();\n let startIndex = 0;\n const pageResults: SearchResult[] = [];\n\n while ((startIndex = lowerFullText.indexOf(lowerQuery, startIndex)) !== -1) {\n // Extract snippet\n const snippetStart = Math.max(0, startIndex - 30);\n const snippetEnd = Math.min(fullText.length, startIndex + query.length + 30);\n let snippet = fullText.substring(snippetStart, snippetEnd);\n snippet = snippet.replace(/\\n/g, ' ');\n\n // Find involved TextItems and track exact character match range per item\n const itemMatches = new Map<number, { min: number, max: number }>();\n for (let i = startIndex; i < startIndex + query.length; i++) {\n const itemIdx = itemIndices[i];\n const charIdx = charIndices[i];\n if (itemIdx !== undefined && itemIdx !== -1) {\n const existing = itemMatches.get(itemIdx);\n if (existing) {\n existing.min = Math.min(existing.min, charIdx);\n existing.max = Math.max(existing.max, charIdx);\n } else {\n itemMatches.set(itemIdx, { min: charIdx, max: charIdx });\n }\n }\n }\n\n const bounds: SearchBounds[] = [];\n \n itemMatches.forEach((match, itemIndex) => {\n const item = items[itemIndex];\n if (!item || !item.transform) return;\n \n const x = item.transform[4];\n const y = item.transform[5];\n const width = item.width;\n const height = item.height || Math.abs(item.transform[3]);\n const strLen = item.str.length;\n \n if (strLen > 0) {\n // Approximate accurate bounding box by interpolating string character positions\n const charWidth = width / strLen;\n const startX = x + (match.min * charWidth);\n const matchWidth = (match.max - match.min + 1) * charWidth;\n bounds.push({ x: startX, y, width: matchWidth, height });\n } else {\n bounds.push({ x, y, width, height });\n }\n });\n\n pageResults.push({\n id: `p${pageNum}-idx${startIndex}`,\n pageIndex: pageNum,\n snippet,\n matchStartIndex: startIndex - snippetStart,\n matchLength: query.length,\n bounds\n });\n\n startIndex += query.length;\n }\n page.cleanup();\n return pageResults;\n })()\n );\n }\n \n const batchResultsArray = await Promise.all(batchPromises);\n batchResultsArray.forEach(pageResults => results.push(...pageResults));\n \n // Sort results to maintain sequential page order since Promise.all resolves concurrently\n results.sort((a, b) => a.pageIndex !== b.pageIndex ? a.pageIndex - b.pageIndex : a.matchStartIndex - b.matchStartIndex);\n \n setSearchProgress(Math.round((batchEnd / numPages) * 100));\n // Yield to main thread to allow UI to render progress bar\n await new Promise(resolve => setTimeout(resolve, 10));\n }\n\n setSearchResults(results);\n } catch (error) {\n console.error(\"Search error:\", error);\n } finally {\n setIsSearching(false);\n setSearchProgress(100);\n }\n }, [pdfDoc, redactions]);\n\n return { search, searchResults, isSearching, searchProgress, clearSearch: () => setSearchResults([]) };\n}\n","/**\n * © 2026 AngelBot Ai Pvt Ltd. All rights reserved.\n */\nimport React, { useState, useEffect, useRef } from 'react';\nimport { Trash2, MessageSquare, MessageCircle, Type, Search, X, Link as LinkIcon } from 'lucide-react';\nimport { type SearchResult } from '../hooks/usePdfSearch';\nimport { useBusEvent } from '../hooks/useViewerBus';\n\ninterface SidebarProps {\n isOpen: boolean;\n annotations: any[];\n setAnnotations: (anns: any[]) => void;\n selectedAnnotationId: string | null;\n setSelectedAnnotationId: (id: string | null) => void;\n // Search Props\n onSearch: (query: string) => void;\n searchResults: SearchResult[];\n isSearching: boolean;\n searchProgress: number;\n onResultClick: (result: SearchResult) => void;\n activeTab: 'Comments' | 'Search';\n setActiveTab: (tab: 'Comments' | 'Search') => void;\n}\n\nexport default function Sidebar({ \n isOpen, annotations, setAnnotations, selectedAnnotationId, setSelectedAnnotationId,\n onSearch, searchResults, isSearching, searchProgress, onResultClick,\n activeTab, setActiveTab\n}: SidebarProps) {\n const [searchQuery, setSearchQuery] = useState('');\n const [sidebarWidth, setSidebarWidth] = useState(320);\n const [isResizing, setIsResizing] = useState(false);\n const searchInputRef = useRef<HTMLInputElement>(null);\n\n useEffect(() => {\n const handleMouseMove = (e: MouseEvent) => {\n if (!isResizing) return;\n const newWidth = Math.min(Math.max(e.clientX, 200), 600);\n setSidebarWidth(newWidth);\n };\n const handleMouseUp = () => setIsResizing(false);\n \n if (isResizing) {\n document.body.style.cursor = 'col-resize';\n document.body.style.userSelect = 'none';\n window.addEventListener('mousemove', handleMouseMove);\n window.addEventListener('mouseup', handleMouseUp);\n } else {\n document.body.style.cursor = '';\n document.body.style.userSelect = '';\n }\n return () => {\n window.removeEventListener('mousemove', handleMouseMove);\n window.removeEventListener('mouseup', handleMouseUp);\n };\n }, [isResizing]);\n\n useEffect(() => {\n const handler = setTimeout(() => {\n onSearch(searchQuery);\n }, 500);\n return () => clearTimeout(handler);\n }, [searchQuery, onSearch]);\n\n useBusEvent('action-focus-search', () => {\n if (searchInputRef.current) {\n searchInputRef.current.focus();\n searchInputRef.current.select();\n }\n });\n\n const comments = annotations.filter(a => ['note', 'callout', 'text', 'link'].includes(a.type));\n\n const handleDelete = (id: string) => {\n setAnnotations(annotations.filter(a => a.id !== id));\n if (selectedAnnotationId === id) setSelectedAnnotationId(null);\n };\n\n return (\n <div style={{\n width: isOpen ? `${sidebarWidth}px` : '0px',\n height: '100%',\n backgroundColor: '#f9fafb',\n display: 'flex',\n flexShrink: 0,\n zIndex: 10,\n transition: isResizing ? 'none' : 'width 0.3s cubic-bezier(0.4, 0, 0.2, 1)',\n position: 'relative'\n }}>\n {/* Inner container to clip content smoothly */}\n <div style={{\n width: `${sidebarWidth}px`,\n height: '100%',\n display: 'flex',\n flexDirection: 'column',\n overflow: 'hidden'\n }}>\n <div style={{\n padding: '16px',\n borderBottom: '1px solid var(--border-color)',\n backgroundColor: '#fff',\n display: 'flex',\n flexDirection: 'column',\n gap: '12px',\n flexShrink: 0\n }}>\n <div style={{ display: 'flex', gap: '16px' }}>\n <button \n onClick={() => setActiveTab('Search')}\n style={{ \n background: 'none', border: 'none', padding: '4px 0', cursor: 'pointer', fontSize: '14px',\n fontWeight: activeTab === 'Search' ? 600 : 400, color: activeTab === 'Search' ? 'var(--primary)' : 'var(--text-muted)',\n borderBottom: activeTab === 'Search' ? '2px solid var(--primary)' : '2px solid transparent'\n }}\n >\n Search\n </button>\n <button \n onClick={() => setActiveTab('Comments')}\n style={{ \n background: 'none', border: 'none', padding: '4px 0', cursor: 'pointer', fontSize: '14px',\n fontWeight: activeTab === 'Comments' ? 600 : 400, color: activeTab === 'Comments' ? 'var(--primary)' : 'var(--text-muted)',\n borderBottom: activeTab === 'Comments' ? '2px solid var(--primary)' : '2px solid transparent'\n }}\n >\n Comments\n </button>\n </div>\n\n {activeTab === 'Search' && (\n <div style={{ position: 'relative', marginBottom: '16px' }}>\n <Search size={16} color=\"#64748b\" style={{ position: 'absolute', left: '12px', top: '10px' }} />\n <input \n ref={searchInputRef}\n type=\"text\" \n placeholder=\"Search...\" \n value={searchQuery}\n onChange={e => setSearchQuery(e.target.value)}\n style={{\n width: '100%', padding: '8px 32px', border: '1px solid var(--border-color)', borderRadius: '4px', fontSize: '13px', outline: 'none'\n }}\n />\n {searchQuery && (\n <button \n onClick={() => setSearchQuery('')}\n style={{ position: 'absolute', right: '10px', top: '50%', transform: 'translateY(-50%)', background: 'none', border: 'none', cursor: 'pointer', padding: 0, color: 'var(--text-muted)' }}\n >\n <X size={14} />\n </button>\n )}\n </div>\n )}\n </div>\n\n <div style={{ flex: 1, overflowY: 'auto', padding: '12px', display: 'flex', flexDirection: 'column', gap: '8px' }}>\n \n {activeTab === 'Comments' && (\n <>\n {comments.length === 0 && (\n <div style={{ color: 'var(--text-muted)', fontSize: '13px', textAlign: 'center', marginTop: '24px' }}>\n No comments on this document.\n </div>\n )}\n {comments.map(comment => (\n <div \n key={comment.id}\n onClick={() => setSelectedAnnotationId(comment.id)}\n style={{\n padding: '12px',\n backgroundColor: '#fff',\n border: selectedAnnotationId === comment.id ? '2px solid var(--primary)' : '1px solid var(--border-color)',\n borderRadius: '6px',\n cursor: 'pointer',\n boxShadow: '0 1px 2px rgba(0,0,0,0.05)'\n }}\n >\n <div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center', marginBottom: '8px' }}>\n <div style={{ display: 'flex', alignItems: 'center', gap: '6px', color: 'var(--text-muted)' }}>\n {comment.type === 'note' && <MessageSquare size={14} />}\n {comment.type === 'callout' && <MessageCircle size={14} />}\n {comment.type === 'text' && <Type size={14} />}\n {comment.type === 'link' && <LinkIcon size={14} />}\n <span style={{ fontSize: '12px', textTransform: 'capitalize' }}>{comment.type}</span>\n </div>\n <button \n onClick={(e) => { e.stopPropagation(); handleDelete(comment.id); }}\n style={{ background: 'none', border: 'none', color: '#ef4444', cursor: 'pointer', padding: '4px' }}\n title=\"Delete Comment\"\n >\n <Trash2 size={14} />\n </button>\n </div>\n \n <div style={{ fontSize: '14px', color: 'var(--text-color)', whiteSpace: 'pre-wrap', wordBreak: 'break-word' }}>\n {comment.type === 'link' ? (\n <a href={comment.linkUrl} target=\"_blank\" rel=\"noopener noreferrer\" style={{ color: 'var(--primary)', textDecoration: 'none' }}>\n {comment.linkUrl || <span style={{ fontStyle: 'italic', color: 'var(--text-muted)' }}>Empty link</span>}\n </a>\n ) : (\n comment.text || <span style={{ fontStyle: 'italic', color: 'var(--text-muted)' }}>Empty comment</span>\n )}\n </div>\n </div>\n ))}\n </>\n )}\n\n {activeTab === 'Search' && (\n <>\n {isSearching && (\n <div style={{ fontSize: '13px', color: 'var(--text-muted)', textAlign: 'center', marginTop: '16px' }}>\n Searching... {searchProgress}%\n </div>\n )}\n {!isSearching && searchQuery && searchResults.length === 0 && (\n <div style={{ fontSize: '13px', color: 'var(--text-muted)', textAlign: 'center', marginTop: '16px' }}>\n No results found.\n </div>\n )}\n {!isSearching && searchResults.length > 0 && (\n <div style={{ fontSize: '12px', color: 'var(--text-muted)', marginBottom: '8px' }}>\n {searchResults.length} results found\n </div>\n )}\n \n {/* Group results by page */}\n {!isSearching && Array.from(new Set(searchResults.map(r => r.pageIndex))).map(pageNum => {\n const pageResults = searchResults.filter(r => r.pageIndex === pageNum);\n return (\n <div key={`page-${pageNum}`} style={{ marginBottom: '16px' }}>\n <div style={{ fontSize: '12px', color: 'var(--text-muted)', marginBottom: '4px' }}>Page {pageNum}</div>\n <div style={{ display: 'flex', flexDirection: 'column', gap: '4px' }}>\n {pageResults.map(result => (\n <div \n key={result.id} \n onClick={() => onResultClick(result)}\n style={{\n padding: '8px',\n backgroundColor: '#fff',\n border: '1px solid var(--border-color)',\n borderRadius: '4px',\n cursor: 'pointer',\n fontSize: '13px',\n color: 'var(--text-color)'\n }}\n >\n {result.snippet.substring(0, result.matchStartIndex)}\n <span style={{ fontWeight: 700, color: 'var(--primary)' }}>\n {result.snippet.substring(result.matchStartIndex, result.matchStartIndex + result.matchLength)}\n </span>\n {result.snippet.substring(result.matchStartIndex + result.matchLength)}\n </div>\n ))}\n </div>\n </div>\n );\n })}\n </>\n )}\n \n </div>\n \n </div>\n\n {/* Resizer Handle */}\n {isOpen && (\n <div \n onMouseDown={() => setIsResizing(true)}\n style={{\n position: 'absolute',\n top: 0,\n right: 0,\n width: '6px',\n height: '100%',\n cursor: 'col-resize',\n zIndex: 20,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n backgroundColor: 'transparent'\n }}\n >\n {/* Vertical Pill */}\n <div style={{\n width: '6px',\n height: '40px',\n backgroundColor: '#fff',\n border: '1px solid #d1d5db',\n borderRadius: '4px',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: '1px',\n boxShadow: '0 1px 3px rgba(0,0,0,0.1)'\n }}>\n <div style={{ width: '1px', height: '16px', backgroundColor: '#9ca3af' }} />\n <div style={{ width: '1px', height: '16px', backgroundColor: '#9ca3af' }} />\n </div>\n <div style={{ position: 'absolute', top: 0, right: 0, width: '1px', height: '100%', backgroundColor: 'var(--border-color)', zIndex: -1 }} />\n </div>\n )}\n </div>\n );\n}\n","/**\n * © 2026 AngelBot Ai Pvt Ltd. All rights reserved.\n */\nimport React, { useState, useEffect, useRef } from 'react';\nimport * as pdfjsLib from 'pdfjs-dist';\nimport { Copy, List, Bookmark, MoreHorizontal, CheckSquare, Minus, Plus } from 'lucide-react';\n\ninterface ThumbnailProps {\n pdfDoc: pdfjsLib.PDFDocumentProxy;\n pageIndex: number;\n isActive: boolean;\n onClick: () => void;\n scale: number;\n}\n\nconst Thumbnail = ({ pdfDoc, pageIndex, isActive, onClick, scale }: ThumbnailProps) => {\n const containerRef = useRef<HTMLDivElement>(null);\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const [isVisible, setIsVisible] = useState(false);\n const [aspectRatio, setAspectRatio] = useState<number>(0.77); // Default to roughly 8.5x11\n\n // Use IntersectionObserver to only render thumbnails that are near the viewport\n useEffect(() => {\n const observer = new IntersectionObserver((entries) => {\n if (entries[0].isIntersecting) {\n setIsVisible(true);\n } else {\n setIsVisible(false);\n }\n }, { rootMargin: '500px' });\n \n if (containerRef.current) observer.observe(containerRef.current);\n return () => observer.disconnect();\n }, []);\n\n useEffect(() => {\n if (!isVisible) return;\n\n let renderTask: any = null;\n let isCancelled = false;\n\n const renderPage = async () => {\n try {\n const page = await pdfDoc.getPage(pageIndex);\n if (isCancelled) return;\n \n // Update aspect ratio based on actual page size\n const vp = page.getViewport({ scale: 1 });\n setAspectRatio(vp.width / vp.height);\n\n const viewport = page.getViewport({ scale });\n const canvas = canvasRef.current;\n if (!canvas) return;\n \n const ctx = canvas.getContext('2d');\n if (!ctx) return;\n \n const outputScale = window.devicePixelRatio || 1;\n canvas.width = Math.floor(viewport.width * outputScale);\n canvas.height = Math.floor(viewport.height * outputScale);\n canvas.style.width = `${viewport.width}px`;\n canvas.style.height = `${viewport.height}px`;\n\n renderTask = page.render({\n canvasContext: ctx,\n canvas: canvas,\n transform: [outputScale, 0, 0, outputScale, 0, 0],\n viewport: viewport\n });\n await renderTask.promise;\n } catch (e: any) {\n if (e.name !== 'RenderingCancelledException') {\n console.error(\"Thumbnail render error\", e);\n }\n }\n };\n \n renderPage();\n \n return () => {\n isCancelled = true;\n if (renderTask) {\n renderTask.cancel();\n }\n };\n }, [pdfDoc, pageIndex, scale, isVisible]);\n\n // Base width is usually around 800 at scale 1. So we calculate a dummy width based on scale.\n const estimatedWidth = 800 * scale;\n const estimatedHeight = estimatedWidth / aspectRatio;\n\n return (\n <div \n ref={containerRef}\n onClick={onClick}\n style={{\n display: 'flex', flexDirection: 'column', alignItems: 'center', cursor: 'pointer',\n padding: '8px', boxSizing: 'border-box',\n minHeight: `${estimatedHeight + 30}px` // +30 for the text label\n }}\n >\n {isVisible ? (\n <div style={{\n border: isActive ? '2px solid var(--primary)' : '1px solid #ccc',\n padding: '2px', backgroundColor: '#fff',\n boxShadow: '0 2px 4px rgba(0,0,0,0.1)'\n }}>\n <canvas ref={canvasRef} style={{ display: 'block', backgroundColor: '#fff' }} />\n </div>\n ) : (\n <div style={{\n width: `${estimatedWidth}px`, height: `${estimatedHeight}px`,\n backgroundColor: '#eaeaea', border: '1px solid #ccc'\n }} />\n )}\n <span style={{ marginTop: '8px', fontSize: '12px', color: isActive ? 'var(--primary)' : '#555', fontWeight: isActive ? 'bold' : 'normal' }}>\n {pageIndex}\n </span>\n </div>\n );\n};\n\ninterface LeftSidebarProps {\n isOpen: boolean;\n pdfDoc: pdfjsLib.PDFDocumentProxy | null;\n pageNum: number;\n setPageNum: (p: number) => void;\n}\n\nexport default function LeftSidebar({ isOpen, pdfDoc, pageNum, setPageNum }: LeftSidebarProps) {\n const [activeTab, setActiveTab] = useState<'Thumbnails' | 'Outline' | 'Bookmarks'>('Thumbnails');\n const [sidebarWidth, setSidebarWidth] = useState(250);\n const [isResizing, setIsResizing] = useState(false);\n \n // Slider goes from 0 (small) to 100 (large)\n const [zoomPercent, setZoomPercent] = useState(30); \n \n // Convert 0-100 to a pdfjs scale (e.g. 0.1 to 0.4)\n const thumbScale = 0.1 + (zoomPercent / 100) * 0.3;\n\n useEffect(() => {\n const handleMouseMove = (e: MouseEvent) => {\n if (!isResizing) return;\n const newWidth = Math.min(Math.max(e.clientX, 150), 500);\n setSidebarWidth(newWidth);\n };\n const handleMouseUp = () => setIsResizing(false);\n \n if (isResizing) {\n document.body.style.cursor = 'col-resize';\n document.body.style.userSelect = 'none';\n window.addEventListener('mousemove', handleMouseMove);\n window.addEventListener('mouseup', handleMouseUp);\n } else {\n document.body.style.cursor = '';\n document.body.style.userSelect = '';\n }\n return () => {\n window.removeEventListener('mousemove', handleMouseMove);\n window.removeEventListener('mouseup', handleMouseUp);\n };\n }, [isResizing]);\n\n const numPages = pdfDoc ? pdfDoc.numPages : 0;\n \n // Generate array [1, 2, ..., numPages]\n const pagesArray = Array.from({ length: numPages }, (_, i) => i + 1);\n\n return (\n <div style={{\n width: isOpen ? `${sidebarWidth}px` : '0px',\n height: '100%',\n backgroundColor: '#f9fafb',\n display: 'flex',\n flexShrink: 0,\n zIndex: 10,\n transition: isResizing ? 'none' : 'width 0.3s cubic-bezier(0.4, 0, 0.2, 1)',\n position: 'relative',\n borderRight: isOpen ? '1px solid var(--border-color)' : 'none'\n }}>\n <div style={{\n width: `${sidebarWidth}px`,\n height: '100%',\n display: 'flex',\n flexDirection: 'column',\n overflow: 'hidden'\n }}>\n {/* Top Tabs */}\n <div style={{\n display: 'flex', borderBottom: '1px solid var(--border-color)', backgroundColor: '#fff', padding: '4px'\n }}>\n <button \n onClick={() => setActiveTab('Thumbnails')}\n style={{ flex: 1, padding: '8px', background: activeTab === 'Thumbnails' ? 'var(--primary)' : 'none', color: activeTab === 'Thumbnails' ? '#fff' : 'var(--text-muted)', border: 'none', borderRadius: '4px', cursor: 'pointer', display: 'flex', justifyContent: 'center' }}\n title=\"Page Thumbnails\"\n >\n <Copy size={16} />\n </button>\n <button \n onClick={() => setActiveTab('Outline')}\n style={{ flex: 1, padding: '8px', background: activeTab === 'Outline' ? 'var(--primary)' : 'none', color: activeTab === 'Outline' ? '#fff' : 'var(--text-muted)', border: 'none', borderRadius: '4px', cursor: 'pointer', display: 'flex', justifyContent: 'center' }}\n title=\"Document Outline\"\n >\n <List size={16} />\n </button>\n <button \n onClick={() => setActiveTab('Bookmarks')}\n style={{ flex: 1, padding: '8px', background: activeTab === 'Bookmarks' ? 'var(--primary)' : 'none', color: activeTab === 'Bookmarks' ? '#fff' : 'var(--text-muted)', border: 'none', borderRadius: '4px', cursor: 'pointer', display: 'flex', justifyContent: 'center' }}\n title=\"Bookmarks\"\n >\n <Bookmark size={16} />\n </button>\n <button \n style={{ flex: 1, padding: '8px', background: 'none', color: 'var(--text-muted)', border: 'none', borderRadius: '4px', cursor: 'pointer', display: 'flex', justifyContent: 'center' }}\n title=\"More Options\"\n >\n <MoreHorizontal size={16} />\n </button>\n </div>\n\n {activeTab === 'Thumbnails' && (\n <>\n {/* Zoom Slider */}\n <div style={{ display: 'flex', alignItems: 'center', padding: '12px 16px', gap: '8px', borderBottom: '1px solid var(--border-color)', backgroundColor: '#fff' }}>\n <Minus size={14} color=\"var(--text-muted)\" style={{ cursor: 'pointer' }} onClick={() => setZoomPercent(Math.max(0, zoomPercent - 10))} />\n <input \n type=\"range\" \n min=\"0\" max=\"100\" \n value={zoomPercent} \n onChange={(e) => setZoomPercent(parseInt(e.target.value))}\n style={{ flex: 1, height: '4px', accentColor: 'var(--primary)' }}\n />\n <Plus size={14} color=\"var(--text-muted)\" style={{ cursor: 'pointer' }} onClick={() => setZoomPercent(Math.min(100, zoomPercent + 10))} />\n </div>\n\n {/* Thumbnails List */}\n <div style={{ flex: 1, overflowY: 'auto', padding: '8px 0', backgroundColor: '#f1f1f1' }}>\n {pdfDoc && pagesArray.map(p => (\n <Thumbnail \n key={p} \n pdfDoc={pdfDoc} \n pageIndex={p} \n isActive={p === pageNum} \n onClick={() => setPageNum(p)}\n scale={thumbScale}\n />\n ))}\n {!pdfDoc && (\n <div style={{ padding: '20px', textAlign: 'center', color: '#888', fontSize: '13px' }}>\n No document loaded\n </div>\n )}\n </div>\n\n {/* Multi-Select Footer */}\n <div style={{ borderTop: '1px solid var(--border-color)', padding: '16px', backgroundColor: '#fff' }}>\n <div style={{ fontSize: '12px', color: 'var(--text-color)', marginBottom: '8px' }}>\n Multi-Select Pages - e.g. 1, 3, 5-10\n </div>\n <div style={{ display: 'flex', gap: '8px' }}>\n <input \n type=\"text\"\n placeholder=\"e.g. 1, 3, 5-10\"\n style={{ flex: 1, padding: '6px 8px', fontSize: '13px', border: '1px solid #ccc', borderRadius: '4px', outline: 'none' }}\n />\n <button style={{ padding: '6px 8px', background: '#fff', border: '1px solid #ccc', borderRadius: '4px', cursor: 'pointer', display: 'flex', alignItems: 'center' }}>\n <CheckSquare size={16} color=\"var(--text-color)\" />\n </button>\n </div>\n </div>\n </>\n )}\n \n {activeTab !== 'Thumbnails' && (\n <div style={{ padding: '20px', textAlign: 'center', color: '#888', fontSize: '13px' }}>\n No content available for {activeTab}.\n </div>\n )}\n </div>\n\n {/* Resize Handle */}\n <div \n onMouseDown={() => setIsResizing(true)}\n style={{\n width: '6px',\n height: '100%',\n position: 'absolute',\n right: '-3px',\n cursor: 'col-resize',\n zIndex: 20\n }}\n />\n </div>\n );\n}\n","/**\n * © 2026 AngelBot Ai Pvt Ltd. All rights reserved.\n */\n\n/**\n * Converts screen/canvas coordinates in rotated page space to canonical unrotated page space.\n */\nexport function convertToUnrotated(rawX: number, rawY: number, rotation: number, unW: number, unH: number) {\n const normRot = ((rotation % 360) + 360) % 360;\n if (normRot === 90) {\n return { x: rawY, y: unH - rawX };\n }\n if (normRot === 180) {\n return { x: unW - rawX, y: unH - rawY };\n }\n if (normRot === 270) {\n return { x: unW - rawY, y: rawX };\n }\n return { x: rawX, y: rawY };\n}\n\n/**\n * Converts canonical unrotated page coordinates to rotated page space.\n */\nexport function convertToRotated(unX: number, unY: number, rotation: number, unW: number, unH: number) {\n const normRot = ((rotation % 360) + 360) % 360;\n if (normRot === 90) {\n return { x: unH - unY, y: unX };\n }\n if (normRot === 180) {\n return { x: unW - unX, y: unH - unY };\n }\n if (normRot === 270) {\n return { x: unY, y: unW - unX };\n }\n return { x: unX, y: unY };\n}\n\n/**\n * Converts a rectangle from unrotated page space to rotated page space.\n */\nexport function convertToRotatedRect(x: number, y: number, width: number, height: number, rotation: number, unW: number, unH: number) {\n const normRot = ((rotation % 360) + 360) % 360;\n if (normRot === 90) {\n return { x: unH - (y + height), y: x, width: height, height: width };\n }\n if (normRot === 180) {\n return { x: unW - (x + width), y: unH - (y + height), width, height };\n }\n if (normRot === 270) {\n return { x: y, y: unW - (x + width), width: height, height: width };\n }\n return { x, y, width, height };\n}\n\n/**\n * Returns SVG transform string for SVG groups to match page rotation.\n */\nexport function getRotationTransform(rotation: number, unW: number, unH: number): string | undefined {\n const normRot = ((rotation % 360) + 360) % 360;\n if (normRot === 90) return `translate(${unH}, 0) rotate(90)`;\n if (normRot === 180) return `translate(${unW}, ${unH}) rotate(180)`;\n if (normRot === 270) return `translate(0, ${unW}) rotate(270)`;\n return undefined;\n}\n\n/** Normalizes any degree value into [0, 360). */\nexport function normalizeRotation(rotation: number): number {\n return ((rotation % 360) + 360) % 360;\n}\n","/**\n * © 2026 AngelBot Ai Pvt Ltd. All rights reserved.\n */\nimport React, { useEffect, useRef, useState } from 'react';\nimport * as pdfjsLib from 'pdfjs-dist';\nimport { type SearchResult } from '../hooks/usePdfSearch';\nimport type { Redaction, WatermarkOptions } from '../core/types';\nimport type { Annotation } from '../annotations/types';\nimport { getRotationTransform, convertToRotatedRect, normalizeRotation } from '../utils/rotationUtils';\n\nexport type { Annotation };\n\ninterface PageRendererProps {\n pageNum: number;\n pdfDoc: pdfjsLib.PDFDocumentProxy;\n scale: number;\n rotation: number;\n containerWidth: number;\n containerHeight: number;\n scrollTop: number;\n scrollLeft: number;\n pageTop: number;\n pageLeft?: number;\n basePageWidth: number;\n basePageHeight: number;\n \n // App state\n activeTab: string;\n activeTool: string | null;\n annotations: Annotation[];\n selectedAnnotationId: string | null;\n activeSearchResult: SearchResult | null;\n\n // Handlers\n onMouseDown: (e: React.MouseEvent<Element>, pageNum: number) => void;\n onMouseMove: (e: React.MouseEvent<Element>, pageNum: number) => void;\n onMouseUp: (e: React.MouseEvent<Element>, pageNum: number) => void;\n onAnnotationClick: (id: string, e: React.MouseEvent) => void;\n onAnnotationMouseEnter: (id: string) => void;\n onClearSelection: () => void;\n watermark?: WatermarkOptions;\n watermarkText?: string;\n redactions?: Redaction[];\n onDiscardRedaction?: (redaction: Redaction) => void;\n /** Called after the page canvas has been painted (used for first-page-rendered telemetry). */\n onRendered?: (pageNum: number) => void;\n}\n\nfunction PageRendererComponent({\n pageNum, pdfDoc, scale, rotation, containerWidth: _containerWidth, containerHeight: _containerHeight,\n scrollTop: _scrollTop, scrollLeft: _scrollLeft, pageTop, pageLeft = 0, basePageWidth, basePageHeight,\n activeTab, activeTool, annotations, selectedAnnotationId, activeSearchResult,\n onMouseDown, onMouseMove, onMouseUp, onAnnotationClick, onAnnotationMouseEnter, onClearSelection,\n watermark, watermarkText, redactions, onDiscardRedaction, onRendered\n}: PageRendererProps) {\n const onRenderedRef = useRef(onRendered);\n onRenderedRef.current = onRendered;\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const textLayerRef = useRef<HTMLDivElement>(null);\n const renderTaskRef = useRef<any>(null);\n const pageProxyRef = useRef<pdfjsLib.PDFPageProxy | null>(null);\n const [textContent, setTextContent] = useState<any>(null);\n\n const scaledWidth = basePageWidth * scale;\n const scaledHeight = basePageHeight * scale;\n\n // Intersection logic for canvas rendering (tile rendering to save memory)\n useEffect(() => {\n let isCancelled = false;\n let timer: any = null;\n\n const renderCanvas = async () => {\n if (!canvasRef.current || !pdfDoc) return;\n if (renderTaskRef.current) {\n renderTaskRef.current.cancel();\n }\n\n try {\n const page = await pdfDoc.getPage(pageNum);\n if (isCancelled) return;\n\n let outputScale = window.devicePixelRatio || 1;\n // Compose UI rotation with the page's intrinsic /Rotate (pdf.js replaces it otherwise).\n const viewport = page.getViewport({ scale: scale * outputScale, rotation: normalizeRotation(page.rotate + rotation) });\n\n const tempCanvas = document.createElement('canvas');\n tempCanvas.width = Math.floor(viewport.width);\n tempCanvas.height = Math.floor(viewport.height);\n const ctx = tempCanvas.getContext('2d');\n if (!ctx || isCancelled) return;\n\n renderTaskRef.current = page.render({\n canvasContext: ctx,\n canvas: tempCanvas,\n viewport: viewport\n });\n await renderTaskRef.current.promise;\n \n // --- Pixel Masking (Redactions) ---\n if (redactions && redactions.length > 0) {\n ctx.save();\n ctx.setTransform(1, 0, 0, 1, 0, 0);\n const unW = rotation % 180 === 0 ? basePageWidth : basePageHeight;\n const unH = rotation % 180 === 0 ? basePageHeight : basePageWidth;\n \n for (const redaction of redactions) {\n if (redaction.pageIndex === pageNum) {\n const rotRect = convertToRotatedRect(redaction.x, redaction.y, redaction.width, redaction.height, rotation, unW, unH);\n const vX = rotRect.x * scale * outputScale;\n const vY = rotRect.y * scale * outputScale;\n const vW = rotRect.width * scale * outputScale;\n const vH = rotRect.height * scale * outputScale;\n \n if (redaction.status === 'applied' || redaction.status === undefined) {\n ctx.fillStyle = '#000000';\n ctx.fillRect(Math.floor(vX), Math.floor(vY), Math.ceil(vW), Math.ceil(vH));\n } else {\n ctx.fillStyle = 'rgba(0, 0, 0, 0.45)';\n ctx.fillRect(Math.floor(vX), Math.floor(vY), Math.ceil(vW), Math.ceil(vH));\n ctx.lineWidth = 2 * outputScale;\n ctx.strokeStyle = '#dc2626';\n ctx.strokeRect(Math.floor(vX), Math.floor(vY), Math.ceil(vW), Math.ceil(vH));\n }\n }\n }\n ctx.restore();\n }\n\n // --- Forensic Watermark Rendering ---\n const wm = watermark || (watermarkText ? { text: watermarkText, opacity: 0.15, size: 24, mode: 'tiled', color: '#000000' } : undefined);\n if (wm && wm.text) {\n ctx.save();\n ctx.setTransform(1, 0, 0, 1, 0, 0);\n \n const opacity = wm.opacity ?? 0.15;\n const mode = wm.mode ?? 'tiled';\n const defaultSize = mode === 'single' ? 48 : 18;\n const size = (wm.size ?? defaultSize) * scale * outputScale;\n const text = wm.text;\n \n ctx.fillStyle = wm.color ?? '#000000';\n ctx.globalAlpha = opacity;\n ctx.font = `600 ${size}px sans-serif`;\n ctx.textAlign = 'center';\n ctx.textBaseline = 'middle';\n \n const canvasW = tempCanvas.width;\n const canvasH = tempCanvas.height;\n \n if (mode === 'single') {\n ctx.translate(canvasW / 2, canvasH / 2);\n ctx.rotate(-Math.PI / 4);\n ctx.fillText(text, 0, 0);\n } else {\n const stepX = size * text.length * 0.8 + 100 * scale * outputScale;\n const stepY = 180 * scale * outputScale;\n const diag = Math.sqrt(canvasW * canvasW + canvasH * canvasH);\n \n ctx.translate(canvasW / 2, canvasH / 2);\n ctx.rotate(-Math.PI / 4);\n \n for (let y = -diag; y < diag; y += stepY) {\n const rowOffset = (Math.abs(y / stepY) % 2) * (stepX / 2);\n for (let x = -diag; x < diag; x += stepX) {\n ctx.fillText(text, x + rowOffset, y);\n }\n }\n }\n ctx.restore();\n }\n\n // Transfer rendered contents to displayed canvas element\n const destCanvas = canvasRef.current;\n if (destCanvas && !isCancelled) {\n destCanvas.width = tempCanvas.width;\n destCanvas.height = tempCanvas.height;\n const destCtx = destCanvas.getContext('2d');\n if (destCtx) {\n destCtx.drawImage(tempCanvas, 0, 0);\n }\n onRenderedRef.current?.(pageNum);\n }\n } catch (err: any) {\n if (err?.name !== 'RenderingCancelledException') {\n console.error(`Page ${pageNum} render failed:`, err);\n }\n }\n };\n\n // 60ms debounce allows live zoom gestures to scale smoothly at 60 FPS via GPU CSS\n // while PDF.js vector rendering fires once the zoom motion settles.\n timer = setTimeout(renderCanvas, 60);\n\n const currentRenderTask = renderTaskRef.current;\n const currentPageProxy = pageProxyRef.current;\n\n return () => {\n isCancelled = true;\n if (timer) clearTimeout(timer);\n if (currentRenderTask) {\n try { currentRenderTask.cancel(); } catch {}\n }\n if (currentPageProxy) {\n try { currentPageProxy.cleanup(); } catch {}\n }\n };\n }, [pageNum, pdfDoc, scale, rotation, scaledWidth, scaledHeight, watermark, watermarkText, redactions]);\n\n // Load TextContent independently\n useEffect(() => {\n let isCancelled = false;\n const fetchText = async () => {\n try {\n const page = await pdfDoc.getPage(pageNum);\n const text = await page.getTextContent();\n \n // --- Text Layer Sanitization (Anti-Copy/Paste) ---\n if (redactions && redactions.length > 0) {\n const pageRedactions = redactions.filter(r => r.pageIndex === pageNum);\n if (pageRedactions.length > 0) {\n // Filter out text items that intersect with redactions\n text.items = text.items.filter((item: any) => {\n if (item.str.trim() === '') return true; // Keep whitespace items for layout\n\n // item.transform: [scaleX, skewY, skewX, scaleY, tx, ty]\n // tx, ty are PDF coordinates (bottom-left origin)\n const itemX = item.transform[4];\n const itemY = item.transform[5];\n const itemW = item.width;\n const itemH = item.height; // Approximate height\n\n for (const red of pageRedactions) {\n // Check AABB intersection\n const intersectX = Math.max(itemX, red.x) < Math.min(itemX + itemW, red.x + red.width);\n const intersectY = Math.max(itemY, red.y) < Math.min(itemY + itemH, red.y + red.height);\n \n if (intersectX && intersectY) {\n return false; // Intersects, permanently remove from DOM\n }\n }\n return true;\n });\n }\n }\n \n if (!isCancelled) setTextContent(text);\n } catch {}\n };\n fetchText();\n return () => { isCancelled = true; };\n }, [pdfDoc, pageNum, redactions]);\n\n // Render TextLayer\n useEffect(() => {\n const container = textLayerRef.current;\n if (!textContent || !container) return;\n const renderText = async () => {\n try {\n const page = await pdfDoc.getPage(pageNum);\n const viewport = page.getViewport({ scale: 1, rotation: normalizeRotation(page.rotate + rotation) });\n\n let sanitizedTextContent = textContent;\n if (redactions && redactions.length > 0) {\n const pageRedactions = redactions.filter(r => r.pageIndex === pageNum);\n if (pageRedactions.length > 0) {\n const filteredItems = textContent.items.filter((item: any) => {\n if (!item.str || item.str.trim() === '') return true;\n const itemX = item.transform[4];\n const itemY = item.transform[5];\n const itemW = item.width;\n const itemH = item.height || Math.abs(item.transform[3]);\n const itemTopY = viewport.height - itemY - itemH;\n\n for (const red of pageRedactions) {\n const intersectX = Math.max(itemX, red.x) < Math.min(itemX + itemW, red.x + red.width);\n const intersectY = Math.max(itemTopY, red.y) < Math.min(itemTopY + itemH, red.y + red.height);\n if (intersectX && intersectY) {\n return false;\n }\n }\n return true;\n });\n sanitizedTextContent = { ...textContent, items: filteredItems };\n }\n }\n\n container.innerHTML = '';\n const textLayer = new pdfjsLib.TextLayer({\n textContentSource: sanitizedTextContent,\n container: container,\n viewport: viewport\n });\n await textLayer.render();\n } catch (e) {\n console.error(\"TextLayer render failed:\", e);\n }\n };\n renderText();\n }, [textContent, pdfDoc, pageNum, rotation, redactions]);\n const pageAnnotations = annotations.filter(a => a.pageIndex === pageNum);\n\n return (\n <div \n id={`pdf-page-${pageNum}`}\n className=\"pdf-page-container\"\n onClick={() => { if (activeTool === null) onClearSelection(); }}\n style={{\n position: 'absolute',\n top: `${pageTop}px`,\n left: pageLeft !== undefined ? `${pageLeft}px` : '0px',\n width: `${scaledWidth}px`,\n height: `${scaledHeight}px`,\n backgroundColor: '#fff',\n boxShadow: '0 2px 10px rgba(0,0,0,0.1)',\n marginBottom: '16px'\n }}\n >\n <canvas ref={canvasRef} style={{ position: 'absolute', width: '100%', height: '100%', left: 0, top: 0 }} />\n \n <div \n ref={textLayerRef}\n className=\"textLayer\"\n style={{\n position: 'absolute',\n top: 0, left: 0,\n transform: `scale(${scale})`,\n transformOrigin: 'top left',\n pointerEvents: 'auto',\n opacity: 1,\n width: `${basePageWidth}px`,\n height: `${basePageHeight}px`\n }}\n />\n\n {/* Custom Search Highlighting Layer */}\n {activeSearchResult && activeSearchResult.pageIndex === pageNum && (\n <div style={{ position: 'absolute', top: 0, left: 0, width: '100%', height: '100%', pointerEvents: 'none', zIndex: 5 }}>\n {activeSearchResult.bounds.map((b, idx) => (\n <div key={idx} style={{\n position: 'absolute',\n left: `${b.x * scale}px`,\n bottom: `${b.y * scale}px`,\n width: `${b.width * scale}px`,\n height: `${b.height * scale}px`,\n backgroundColor: 'rgba(255, 255, 0, 0.4)',\n border: '1px solid rgba(255, 255, 0, 0.8)',\n borderRadius: '2px',\n boxShadow: '0 0 4px rgba(255, 255, 0, 0.5)'\n }} />\n ))}\n </div>\n )}\n \n {/* SVG Annotation Overlay */}\n {(() => {\n const unW = rotation % 180 === 0 ? basePageWidth : basePageHeight;\n const unH = rotation % 180 === 0 ? basePageHeight : basePageWidth;\n const rotTransform = getRotationTransform(rotation, unW, unH);\n return (\n <svg \n style={{ \n position: 'absolute', top: 0, left: 0, width: '100%', height: '100%', \n cursor: ['Annotate', 'Shapes'].includes(activeTab) && activeTool ? (activeTool === 'eraser' ? 'cell' : 'crosshair') : 'default', \n pointerEvents: (activeTool === null || activeTool === 'pan') ? 'none' : 'auto',\n zIndex: 10\n }}\n viewBox={`0 0 ${basePageWidth} ${basePageHeight}`}\n onMouseDown={(e) => onMouseDown(e, pageNum)}\n onMouseMove={(e) => onMouseMove(e, pageNum)}\n onMouseUp={(e) => onMouseUp(e, pageNum)}\n onMouseLeave={(e) => onMouseUp(e, pageNum)}\n >\n <g transform={rotTransform}>\n <React.Fragment>\n {pageAnnotations.map(ann => {\n const fillColor = (ann.type === 'text' || ann.type === 'callout') ? 'transparent' : `${ann.color}${Math.floor(ann.opacity * 255).toString(16).padStart(2, '0')}`;\n const strokeColor = ann.color;\n const isSelected = selectedAnnotationId === ann.id;\n const blendMode = (ann.type === 'highlight' || ann.opacity < 1) && !['text', 'note', 'callout', 'signature'].includes(ann.type) ? 'multiply' : 'normal';\n\n const interactionProps = {\n onMouseEnter: () => onAnnotationMouseEnter(ann.id),\n onClick: (e: React.MouseEvent) => {\n onAnnotationClick(ann.id, e);\n },\n style: { \n pointerEvents: 'all' as any,\n cursor: activeTool === 'eraser' ? 'pointer' : 'pointer'\n }\n };\n\n let shape = null;\n\n if (ann.type === 'rectangle') {\n shape = <rect x={ann.x} y={ann.y} width={ann.width} height={ann.height} fill={fillColor} stroke={strokeColor} strokeWidth={ann.strokeWidth} style={{ mixBlendMode: blendMode }} />;\n } else if (ann.type === 'text' && ann.text) {\n shape = <text x={ann.x} y={ann.y + 16} fill={strokeColor} fontSize=\"16px\" fontFamily=\"sans-serif\">{ann.text}</text>;\n } else if (ann.type === 'ellipse') {\n shape = <ellipse cx={ann.x + ann.width/2} cy={ann.y + ann.height/2} rx={ann.width/2} ry={ann.height/2} fill={fillColor} stroke={strokeColor} strokeWidth={ann.strokeWidth} style={{ mixBlendMode: blendMode }} />;\n } else if (ann.type === 'line' && ann.points) {\n shape = (\n <g style={{ mixBlendMode: blendMode }}>\n <line x1={ann.points[0].x} y1={ann.points[0].y} x2={ann.points[1].x} y2={ann.points[1].y} stroke=\"transparent\" strokeWidth={Math.max(10, ann.strokeWidth * 3)} />\n <line x1={ann.points[0].x} y1={ann.points[0].y} x2={ann.points[1].x} y2={ann.points[1].y} stroke={strokeColor} strokeWidth={ann.strokeWidth} />\n </g>\n );\n } else if (ann.type === 'arrow' && ann.points) {\n const [p1, p2] = ann.points;\n const angle = Math.atan2(p2.y - p1.y, p2.x - p1.x);\n const headLen = 15 + ann.strokeWidth;\n const h1 = { x: p2.x - headLen * Math.cos(angle - Math.PI / 6), y: p2.y - headLen * Math.sin(angle - Math.PI / 6) };\n const h2 = { x: p2.x - headLen * Math.cos(angle + Math.PI / 6), y: p2.y - headLen * Math.sin(angle + Math.PI / 6) };\n shape = (\n <g style={{ mixBlendMode: blendMode }}>\n <line x1={p1.x} y1={p1.y} x2={p2.x} y2={p2.y} stroke=\"transparent\" strokeWidth={Math.max(10, ann.strokeWidth * 3)} />\n <line x1={p1.x} y1={p1.y} x2={p2.x} y2={p2.y} stroke={strokeColor} strokeWidth={ann.strokeWidth} />\n <path d={`M ${h1.x} ${h1.y} L ${p2.x} ${p2.y} L ${h2.x} ${h2.y}`} fill=\"none\" stroke={strokeColor} strokeWidth={ann.strokeWidth} strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </g>\n );\n } else if (ann.type === 'highlight' && ann.width !== undefined && ann.height !== undefined) {\n shape = <rect x={ann.x} y={ann.y} width={ann.width} height={ann.height} fill={strokeColor} opacity={ann.opacity} style={{ mixBlendMode: 'multiply' }} />;\n } else if (ann.type === 'link' && ann.width !== undefined && ann.height !== undefined) {\n if (ann.text) {\n const linkColor = ann.color && ann.color !== 'transparent' ? strokeColor : '#007bff';\n shape = (\n <text x={ann.x} y={ann.y + 16} fill={linkColor} fontSize=\"16px\" fontFamily=\"sans-serif\" textDecoration=\"underline\" style={{ cursor: 'pointer' }}>\n {ann.text}\n </text>\n );\n } else {\n const borderColor = ann.color && ann.color !== 'transparent' ? strokeColor : '#007bff';\n shape = <rect x={ann.x} y={ann.y} width={ann.width} height={ann.height} fill=\"transparent\" stroke={isSelected ? borderColor : `${borderColor}80`} strokeWidth={isSelected ? \"2\" : \"1\"} strokeDasharray={isSelected ? \"none\" : \"4\"} />;\n }\n } else if (ann.type === 'freehand' && ann.points) {\n const d = `M ${ann.points.map(p => `${p.x},${p.y}`).join(' L ')}`;\n shape = (\n <g style={{ mixBlendMode: blendMode }}>\n <path d={d} fill=\"none\" stroke=\"transparent\" strokeWidth={Math.max(10, ann.strokeWidth * 3)} strokeLinejoin=\"round\" strokeLinecap=\"round\" />\n <path d={d} fill=\"none\" stroke={strokeColor} strokeWidth={ann.strokeWidth} strokeLinejoin=\"round\" strokeLinecap=\"round\" />\n </g>\n );\n } else if (ann.type === 'note') {\n shape = (\n <g transform={`translate(${ann.x}, ${ann.y})`}>\n <rect width=\"24\" height=\"24\" rx=\"4\" fill={fillColor} stroke={strokeColor} strokeWidth={ann.strokeWidth} />\n <path d=\"M6 12h12M6 8h12M6 16h8\" stroke=\"#fff\" strokeWidth=\"2\" strokeLinecap=\"round\" />\n </g>\n );\n } else if (ann.type === 'callout' && ann.points) {\n shape = (\n <g>\n <line x1={ann.points[0].x} y1={ann.points[0].y} x2={ann.points[1].x} y2={ann.points[1].y} stroke={strokeColor} strokeWidth={ann.strokeWidth} strokeDasharray=\"4\" />\n <rect x={ann.points[1].x} y={ann.points[1].y} width={ann.text ? ann.text.length * 8 + 20 : 100} height=\"24\" fill=\"#fff\" stroke={strokeColor} strokeWidth={ann.strokeWidth} />\n <text x={ann.points[1].x + 10} y={ann.points[1].y + 16} fill={strokeColor} fontSize=\"14px\" fontFamily=\"sans-serif\">{ann.text}</text>\n </g>\n );\n } else if (ann.type === 'signature' && ann.imageUrl) {\n const dateStr = ann.timestamp ? new Date(ann.timestamp).toLocaleDateString('en-GB', { day: 'numeric', month: 'short', year: 'numeric' }) : '';\n const signerText = ann.signer ? `Digitally signed by ${ann.signer} · ${dateStr}` : '';\n \n shape = (\n <g>\n <image href={ann.imageUrl} x={ann.x} y={ann.y} width={ann.width} height={ann.height} preserveAspectRatio=\"xMidYMid meet\" />\n {signerText && (\n <text \n x={(ann.x || 0) + (ann.width || 200) / 2} \n y={(ann.y || 0) + (ann.height || 60) + 16} \n fill=\"#666\" \n fontSize=\"11px\" \n fontFamily=\"sans-serif\" \n textAnchor=\"middle\"\n >\n {signerText}\n </text>\n )}\n </g>\n );\n } else if (ann.type === 'digital_signature_placeholder') {\n const dateStr = ann.timestamp ? new Date(ann.timestamp).toLocaleString('en-GB') : '';\n const ax = ann.x || 0;\n const ay = ann.y || 0;\n const aw = ann.width || 350;\n const ah = ann.height || 70;\n const iconW = aw * 0.15;\n \n shape = (\n <g>\n <rect x={ax} y={ay} width={aw} height={ah} fill=\"rgba(255, 255, 255, 0.9)\" stroke=\"#94a3b8\" strokeWidth=\"1\" />\n <line x1={ax + iconW} y1={ay} x2={ax + iconW} y2={ay + ah} stroke=\"#e2e8f0\" strokeWidth=\"1\" />\n \n {/* Shield Icon Approximation */}\n <g transform={`translate(${ax + iconW/2 - 12}, ${ay + ah/2 - 14})`}>\n <path d=\"M22 6 L22 14 Q22 20 12 24 Q2 20 2 14 L2 6 L12 2 Z\" fill=\"none\" stroke=\"#0284c7\" strokeWidth=\"2\" strokeLinejoin=\"round\" />\n <path d=\"M7 13 L10 16 L17 8\" fill=\"none\" stroke=\"#0284c7\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </g>\n \n <text x={ax + iconW + 10} y={ay + 25} fill=\"#0f172a\" fontSize=\"11.5px\" fontWeight=\"bold\" fontFamily=\"sans-serif\">\n Digitally signed by {ann.signer || 'sanjiv@costacloud.com'}\n </text>\n <text x={ax + iconW + 10} y={ay + 42} fill=\"#334155\" fontSize=\"10px\" fontFamily=\"sans-serif\">\n Date: {dateStr}\n </text>\n <text x={ax + iconW + 10} y={ay + 57} fill=\"#334155\" fontSize=\"10px\" fontFamily=\"sans-serif\">\n Reason: Document Approval\n </text>\n </g>\n );\n }\n\n return (\n <g key={ann.id} {...interactionProps}>\n {shape}\n {isSelected && (\n <rect \n x={ann.x - 4} y={ann.y - 4} \n width={ann.width ? ann.width + 8 : 32} \n height={ann.height ? ann.height + 8 : 32} \n fill=\"none\" stroke=\"var(--primary)\" strokeWidth=\"2\" strokeDasharray=\"4\" \n />\n )}\n </g>\n );\n })}\n\n {redactions && redactions.filter(r => r.pageIndex === pageNum && r.status === 'pending').map((r, idx) => (\n <g \n key={r.id || `pending-${idx}`} \n style={{ cursor: 'pointer' }}\n onClick={(e) => {\n e.stopPropagation();\n onDiscardRedaction?.(r);\n }}\n >\n <title>Click to discard this redaction</title>\n <rect \n x={r.x} \n y={r.y} \n width={r.width} \n height={r.height} \n fill=\"rgba(0, 0, 0, 0.45)\" \n stroke=\"#dc2626\" \n strokeWidth={2} \n strokeDasharray=\"4\"\n />\n <text \n x={r.x + 4} \n y={r.y + Math.min(r.height - 2, 14)} \n fill=\"#ef4444\" \n fontSize=\"10px\" \n fontWeight=\"bold\"\n letterSpacing=\"0.5px\"\n >\n PENDING REDACTION\n </text>\n {/* Top-right Discard X Badge */}\n {r.width > 24 && r.height > 16 && (\n <g transform={`translate(${r.x + r.width - 18}, ${r.y + 2})`}>\n <rect width=\"16\" height=\"16\" rx=\"4\" fill=\"#dc2626\" />\n <path d=\"M4.5 4.5 L11.5 11.5 M11.5 4.5 L4.5 11.5\" stroke=\"#ffffff\" strokeWidth=\"2\" strokeLinecap=\"round\" />\n </g>\n )}\n </g>\n ))}\n </React.Fragment>\n </g>\n </svg>\n );\n })()}\n </div>\n );\n}\n\nconst PageRenderer = React.memo(PageRendererComponent, (prevProps, nextProps) => {\n // If scale is <= 4, tiling is disabled. We can completely ignore scrollTop and scrollLeft changes!\n if (nextProps.scale <= 4 && prevProps.scale <= 4) {\n // Check all other props for equality\n return prevProps.pageNum === nextProps.pageNum &&\n prevProps.scale === nextProps.scale &&\n prevProps.rotation === nextProps.rotation &&\n prevProps.basePageWidth === nextProps.basePageWidth &&\n prevProps.basePageHeight === nextProps.basePageHeight &&\n prevProps.containerWidth === nextProps.containerWidth &&\n prevProps.containerHeight === nextProps.containerHeight &&\n prevProps.activeTab === nextProps.activeTab &&\n prevProps.activeTool === nextProps.activeTool &&\n prevProps.selectedAnnotationId === nextProps.selectedAnnotationId &&\n prevProps.activeSearchResult === nextProps.activeSearchResult &&\n prevProps.watermarkText === nextProps.watermarkText &&\n prevProps.redactions === nextProps.redactions &&\n prevProps.annotations === nextProps.annotations; // Assume reference equality for annotations is maintained\n }\n \n // If scale > 4, tiling is active, so we MUST re-render if scroll position changes significantly\n // (We check if it crossed an 800px boundary in the PageRenderer effect anyway, \n // but to be safe we'll let React do its normal shallow compare if scale > 4)\n return prevProps.pageNum === nextProps.pageNum &&\n prevProps.scale === nextProps.scale &&\n prevProps.rotation === nextProps.rotation &&\n prevProps.basePageWidth === nextProps.basePageWidth &&\n prevProps.basePageHeight === nextProps.basePageHeight &&\n prevProps.containerWidth === nextProps.containerWidth &&\n prevProps.containerHeight === nextProps.containerHeight &&\n prevProps.scrollTop === nextProps.scrollTop &&\n prevProps.scrollLeft === nextProps.scrollLeft &&\n prevProps.activeTab === nextProps.activeTab &&\n prevProps.activeTool === nextProps.activeTool &&\n prevProps.selectedAnnotationId === nextProps.selectedAnnotationId &&\n prevProps.activeSearchResult === nextProps.activeSearchResult &&\n prevProps.watermarkText === nextProps.watermarkText &&\n prevProps.redactions === nextProps.redactions &&\n prevProps.annotations === nextProps.annotations;\n});\n\nexport default PageRenderer;\n","/**\n * © 2026 AngelBot Ai Pvt Ltd. All rights reserved.\n */\nimport * as pdfjsLib from 'pdfjs-dist';\nimport type { Redaction } from '../core/types';\n\nexport async function findRegexRedactions(\n pdfDoc: pdfjsLib.PDFDocumentProxy,\n regexes: RegExp[]\n): Promise<Redaction[]> {\n const redactions: Redaction[] = [];\n if (!pdfDoc || !regexes || regexes.length === 0) return redactions;\n\n const numPages = pdfDoc.numPages;\n // Pre-compile global regex instances once outside the page loop\n const globalRegexes = regexes.map(r => new RegExp(r, r.flags.includes('g') ? r.flags : r.flags + 'g'));\n\n for (let pageNum = 1; pageNum <= numPages; pageNum++) {\n try {\n const page = await pdfDoc.getPage(pageNum);\n const textContent = await page.getTextContent();\n const items = textContent.items as any[];\n \n let fullText = '';\n // Flat arrays to eliminate object allocation per character\n const itemIndices: number[] = [];\n const charIndices: number[] = [];\n \n // Reconstruct text and build source map\n items.forEach((item, index) => {\n const str = item.str;\n for (let i = 0; i < str.length; i++) {\n itemIndices.push(index);\n charIndices.push(i);\n }\n fullText += str;\n \n if (item.hasEOL) {\n fullText += '\\n';\n itemIndices.push(-1);\n charIndices.push(-1);\n } else {\n // Add a space to simulate visual gap, unless it's the very end\n fullText += ' ';\n itemIndices.push(-1);\n charIndices.push(-1);\n }\n });\n\n // Find matches for each pre-compiled regex\n for (const globalRegex of globalRegexes) {\n globalRegex.lastIndex = 0; // Reset state for global regex reuse\n const matches = [...fullText.matchAll(globalRegex)];\n\n for (const match of matches) {\n if (match.index === undefined) continue;\n \n const matchStart = match.index;\n const matchLength = match[0].length;\n \n // Track involved TextItems\n const itemMatches = new Map<number, { min: number; max: number }>();\n for (let i = matchStart; i < matchStart + matchLength; i++) {\n const itemIdx = itemIndices[i];\n const charIdx = charIndices[i];\n if (itemIdx !== undefined && itemIdx !== -1) {\n const existing = itemMatches.get(itemIdx);\n if (existing) {\n existing.min = Math.min(existing.min, charIdx);\n existing.max = Math.max(existing.max, charIdx);\n } else {\n itemMatches.set(itemIdx, { min: charIdx, max: charIdx });\n }\n }\n }\n \n // Calculate bounding boxes for each involved item\n itemMatches.forEach((matchInfo, itemIndex) => {\n const item = items[itemIndex];\n \n // TextItem transforms: [scaleX, skewY, skewX, scaleY, tx, ty]\n // PDF origin is bottom-left\n const tx = item.transform[4];\n const ty = item.transform[5];\n const scaleY = item.transform[3];\n \n // Approximate width per character (assuming monospaced or average width)\n // A more robust solution uses font width metrics, but this works well for standard texts\n const charWidth = item.width / item.str.length;\n \n const startX = tx + (matchInfo.min * charWidth);\n const matchWidth = ((matchInfo.max - matchInfo.min) + 1) * charWidth;\n const matchHeight = item.height || scaleY; // Use item.height or scaleY fallback\n \n const padding = 2;\n const viewport = page.getViewport({ scale: 1 });\n const topY = viewport.height - ty - matchHeight;\n \n redactions.push({\n id: `regex-${pageNum}-${Math.random().toString(36).substr(2, 9)}`,\n pageIndex: pageNum,\n x: startX - padding,\n y: topY - padding,\n width: matchWidth + (padding * 2),\n height: matchHeight + (padding * 2),\n status: 'pending'\n });\n });\n }\n }\n \n // Memory Management: Clear parsed text structures for this page to prevent >1GB OOM crashes\n page.cleanup();\n \n // Thread Management: Yield to the main thread every 10 pages so the UI doesn't freeze\n if (pageNum % 10 === 0) {\n await new Promise(resolve => setTimeout(resolve, 0));\n }\n } catch (e) {\n console.error(`Failed to process page ${pageNum} for regex redaction`, e);\n }\n }\n\n return redactions;\n}\n","/**\n * © 2026 AngelBot Ai Pvt Ltd. All rights reserved.\n * pdf.js asset configuration.\n *\n * The library never bundles or inlines the pdf.js worker (that produced a 5 MB bundle with a\n * `data:` URL worker, which strict Content-Security-Policies reject). Hosts serve the worker,\n * CMaps, standard fonts and wasm decoders from their own origin and tell us where they live.\n *\n * Next.js example (copy from node_modules/pdfjs-dist into public/pdfjs/):\n * configurePdfAssets({\n * workerSrc: '/pdfjs/pdf.worker.min.mjs',\n * cMapUrl: '/pdfjs/cmaps/',\n * standardFontDataUrl: '/pdfjs/standard_fonts/',\n * wasmUrl: '/pdfjs/wasm/',\n * });\n *\n * Vite example:\n * import workerSrc from 'pdfjs-dist/build/pdf.worker.min.mjs?url';\n * configurePdfAssets({ workerSrc });\n */\nimport * as pdfjsLib from 'pdfjs-dist';\nimport type { DocumentInitParameters } from 'pdfjs-dist/types/src/display/api';\n\nexport interface PdfAssetPaths {\n /** URL of `pdf.worker.min.mjs` matching the installed pdfjs-dist version. REQUIRED. */\n workerSrc?: string;\n /** Directory URL (trailing slash) of the packed CMaps — needed for CJK/Indic text. */\n cMapUrl?: string;\n /** Directory URL (trailing slash) of the standard 14 font substitutes. */\n standardFontDataUrl?: string;\n /** Directory URL (trailing slash) of the wasm decoders (JPX/OpenJPEG, qcms). */\n wasmUrl?: string;\n /** Directory URL (trailing slash) of ICC profiles. */\n iccUrl?: string;\n}\n\nlet configured: PdfAssetPaths = {};\n\nexport function configurePdfAssets(paths: PdfAssetPaths): void {\n configured = { ...configured, ...paths };\n if (paths.workerSrc) {\n pdfjsLib.GlobalWorkerOptions.workerSrc = paths.workerSrc;\n }\n}\n\nexport function getPdfAssetPaths(): Readonly<PdfAssetPaths> {\n return configured;\n}\n\n/** True once a worker URL has been configured (either via configurePdfAssets or directly on pdf.js). */\nexport function isWorkerConfigured(): boolean {\n return Boolean(configured.workerSrc || pdfjsLib.GlobalWorkerOptions.workerSrc);\n}\n\n/**\n * Throws a descriptive error when the worker has not been configured. Called lazily right before\n * the first `getDocument()` — never at module scope, so importing the package is side-effect free\n * and safe under SSR.\n */\nexport function assertWorkerConfigured(): void {\n if (isWorkerConfigured()) return;\n throw new Error(\n '[teamsync-pdf-viewer] pdf.js worker not configured. Call configurePdfAssets({ workerSrc }) ' +\n 'with the URL of pdf.worker.min.mjs (same pdfjs-dist version) before loading a document, or ' +\n 'pass `assets={{ workerSrc }}` to <TeamSyncViewer>.'\n );\n}\n\n/** Extra `getDocument()` parameters derived from the configured asset paths. */\nexport function getDocumentParams(): Partial<DocumentInitParameters> {\n const params: Partial<DocumentInitParameters> = {};\n if (configured.cMapUrl) {\n params.cMapUrl = configured.cMapUrl;\n params.cMapPacked = true;\n }\n if (configured.standardFontDataUrl) params.standardFontDataUrl = configured.standardFontDataUrl;\n if (configured.wasmUrl) params.wasmUrl = configured.wasmUrl;\n if (configured.iccUrl) params.iccUrl = configured.iccUrl;\n return params;\n}\n\n/** pdfjs-dist version this build was compiled against (useful for worker-version mismatch checks). */\nexport const pdfjsVersion: string = pdfjsLib.version;\n","/**\n * © 2026 AngelBot Ai Pvt Ltd. All rights reserved.\n */\nimport React, { useEffect, useRef, useState, useCallback, useMemo } from 'react';\nimport * as pdfjsLib from 'pdfjs-dist';\nimport 'pdfjs-dist/web/pdf_viewer.css';\nimport { Pen, Type, Minus, Eraser, Square, Circle as CircleIcon, Highlighter, ChevronLeft, ChevronRight, Brush, MessageSquareQuote, ArrowUpRight, ShieldCheck, Link as LinkIcon, EyeOff, Trash2 } from 'lucide-react';\nimport AnnotationContextMenu from './AnnotationContextMenu';\nimport InsertLinkModal from './InsertLinkModal';\nimport { matchShortcut, useShortcuts } from '../hooks/useShortcuts';\nimport Sidebar from './Sidebar';\nimport LeftSidebar from './LeftSidebar';\nimport { usePdfSearch, type SearchResult } from '../hooks/usePdfSearch';\nimport PageRenderer from './PageRenderer';\nimport type { Annotation } from '../annotations/types';\nimport type { Redaction, WatermarkOptions, SDKPermissions, PdfAssetPaths } from '../core/types';\nimport { findRegexRedactions } from '../utils/findRegexRedactions';\nimport { convertToUnrotated, convertToRotated, normalizeRotation } from '../utils/rotationUtils';\nimport { useViewerBus, useBusEvent } from '../hooks/useViewerBus';\nimport { assertWorkerConfigured, configurePdfAssets, getDocumentParams } from '../core/pdfAssets';\n\nexport interface DocumentLoadErrorInfo {\n url: string;\n passwordRequired: boolean;\n}\n\ninterface DocumentViewerProps {\n leftSidebarOpen: boolean;\n rightSidebarOpen: boolean;\n activeTab: string;\n initialDoc?: string;\n /** Bump to force a reload of the same URL (retry after a load error). */\n loadNonce?: number;\n /** Send cookies with the document request. */\n withCredentials?: boolean;\n /** pdf.js asset locations, applied right before the document is opened. */\n assets?: PdfAssetPaths;\n /** Render the thumbnails (left) and comments/search (right) panels. Default true. */\n sidebars?: boolean;\n redactions?: Redaction[];\n regexRedactions?: RegExp[];\n scale: number;\n setScale: (scale: number | ((prev: number) => number)) => void;\n sidebarTab: 'Comments' | 'Search';\n setSidebarTab: (tab: 'Comments' | 'Search') => void;\n onAnnotationsChange?: (annotations: Annotation[]) => void;\n /** Reports the combined (prop + regex + manual) redaction list whenever it changes. */\n onRedactionsChange?: (redactions: Redaction[]) => void;\n onDocumentLoaded?: (doc: pdfjsLib.PDFDocumentProxy, url: string) => void;\n onLoadError?: (error: Error, info: DocumentLoadErrorInfo) => void;\n /** Fires once per loaded document, after the first page canvas has been painted. */\n onFirstPageRendered?: (pageNumber: number) => void;\n onPageChange?: (pageNumber: number, numPages: number) => void;\n pageTransition: 'continuous' | 'page-by-page';\n pageLayout: 'single' | 'double' | 'cover-facing';\n rotation: number;\n setRotation: (r: number | ((prev: number) => number)) => void;\n watermark?: WatermarkOptions;\n watermarkText?: string;\n enableAnnotations?: boolean;\n initialPage?: number;\n permissions?: SDKPermissions;\n}\n\nexport default function DocumentViewer({\n leftSidebarOpen, rightSidebarOpen, activeTab, initialDoc, loadNonce = 0, withCredentials = false, assets, sidebars = true,\n redactions, regexRedactions, scale, setScale, sidebarTab, setSidebarTab, onAnnotationsChange, onRedactionsChange,\n onDocumentLoaded, onLoadError, onFirstPageRendered, onPageChange,\n pageTransition, pageLayout, rotation, setRotation, watermark, watermarkText, enableAnnotations: _enableAnnotations, initialPage, permissions\n}: DocumentViewerProps) {\n const containerRef = useRef<HTMLDivElement>(null);\n const bus = useViewerBus();\n const [pdfDoc, setPdfDoc] = useState<pdfjsLib.PDFDocumentProxy | null>(null);\n const [loadError, setLoadError] = useState<Error | null>(null);\n const [pageNum, setPageNum] = useState(1);\n const [manualRedactions, setManualRedactions] = useState<Redaction[]>([]);\n const { getCommand } = useShortcuts();\n\n // Latest-callback refs: parents may pass inline functions without re-triggering effects.\n const callbacksRef = useRef({ onRedactionsChange, onDocumentLoaded, onLoadError, onFirstPageRendered, onPageChange });\n callbacksRef.current = { onRedactionsChange, onDocumentLoaded, onLoadError, onFirstPageRendered, onPageChange };\n const assetsRef = useRef(assets);\n assetsRef.current = assets;\n\n // Provide combinedRedactions to usePdfSearch but wait, combinedRedactions is computed later in the file.\n // We can just move the combinedRedactions useMemo up before usePdfSearch, \n // or we can pass an empty array initially and it will update.\n // Let's just move usePdfSearch below combinedRedactions.\n const [activeSearchResult, setActiveSearchResult] = useState<SearchResult | null>(null);\n\n const [basePageDims, setBasePageDims] = useState({ width: 800, height: 1100 });\n const [scrollPos, setScrollPos] = useState({ top: 0, left: 0 });\n const [isPanning, setIsPanning] = useState(false);\n const panStartRef = useRef<{ x: number, y: number, scrollLeft: number, scrollTop: number } | null>(null);\n\n const handleSearchResultClick = (result: SearchResult) => {\n setPageNum(result.pageIndex);\n setActiveSearchResult(result);\n if (containerRef.current) {\n const GAP = 16;\n const scaledPageHeight = basePageDims.height * scale + GAP;\n containerRef.current.scrollTop = (result.pageIndex - 1) * scaledPageHeight;\n }\n };\n\n const [annotations, setAnnotations] = useState<Annotation[]>([]);\n const [past, setPast] = useState<Annotation[][]>([]);\n const [future, setFuture] = useState<Annotation[][]>([]);\n const [activeTool, setActiveTool] = useState<'rectangle' | 'ellipse' | 'line' | 'arrow' | 'freehand' | 'highlight' | 'text' | 'eraser' | 'note' | 'callout' | 'signature' | 'digital_signature' | 'pan' | 'link' | 'redaction' | null>('pan');\n \n // Set default tools when switching tabs\n useEffect(() => {\n if (activeTab === 'Annotate') {\n setActiveTool('highlight');\n setCurrentColor('#fbc02d');\n setCurrentOpacity(0.5);\n setCurrentStrokeWidth(16);\n } else if (activeTab === 'Shapes') {\n setActiveTool('rectangle');\n setCurrentOpacity(1);\n setCurrentStrokeWidth(2);\n } else if (activeTab === 'Fill and Sign') {\n setActiveTool('signature');\n } else if (activeTab === 'View') {\n setActiveTool('pan');\n }\n }, [activeTab]);\n\n useEffect(() => {\n bus.emit('action-tool-changed', { tool: activeTool });\n }, [activeTool, bus]);\n \n\n\n // Style State\n const [currentColor, setCurrentColor] = useState('#d32f2f');\n const [currentStrokeWidth, setCurrentStrokeWidth] = useState(2);\n const [currentOpacity, setCurrentOpacity] = useState(0.8);\n\n const [isDrawing, setIsDrawing] = useState(false);\n const [activeDrawingPageNum, setActiveDrawingPageNum] = useState<number | null>(null);\n const [startPos, setStartPos] = useState({ x: 0, y: 0 });\n const [currentPos, setCurrentPos] = useState({ x: 0, y: 0 });\n const [freehandPoints, setFreehandPoints] = useState<{ x: number, y: number }[]>([]);\n \n // Text Tool State\n const [activeTextEditor, setActiveTextEditor] = useState<{ x: number, y: number, type: 'text' | 'note' | 'callout' | 'link', annId?: string, points?: {x: number, y: number}[], pageIndex: number } | null>(null);\n const [currentText, setCurrentText] = useState('');\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n\n const [selectedAnnotationId, setSelectedAnnotationId] = useState<string | null>(null);\n const [contextMenuPos, setContextMenuPos] = useState<{ top: number; left: number } | null>(null);\n const [isLinkModalOpen, setIsLinkModalOpen] = useState(false);\n const justCreatedLinkRef = useRef(false);\n\n\n useBusEvent<{ tool: typeof activeTool }>('action-set-tool', (d) => setActiveTool(d?.tool ?? null));\n\n const zoomFocusRef = useRef<{vx: number | null, vy: number | null}>({ vx: null, vy: null });\n const prevScaleRef = useRef(scale);\n\n // Unified scroll offset maintenance for any scale change (wheel or toolbar)\n useEffect(() => {\n if (prevScaleRef.current !== scale) {\n const s = prevScaleRef.current;\n const newScale = scale;\n prevScaleRef.current = scale;\n \n const container = containerRef.current;\n if (container) {\n const cW = container.clientWidth;\n const cH = container.clientHeight;\n \n let vx = cW / 2;\n let vy = cH / 2;\n if (zoomFocusRef.current.vx !== null && zoomFocusRef.current.vy !== null) {\n vx = zoomFocusRef.current.vx;\n vy = zoomFocusRef.current.vy;\n zoomFocusRef.current = { vx: null, vy: null };\n }\n \n const x = vx + container.scrollLeft;\n const y = vy + container.scrollTop;\n \n const baseW = basePageDims.width;\n const pLeft1 = Math.max(0, cW / 2 - (baseW * s) / 2);\n const pLeft2 = Math.max(0, cW / 2 - (baseW * newScale) / 2);\n \n const pageX = x - pLeft1;\n const newPageX = pageX * (newScale / s);\n const newX = pLeft2 + newPageX;\n \n container.scrollLeft = newX - vx;\n container.scrollTop = (y * (newScale / s)) - vy;\n }\n }\n }, [scale, basePageDims.width]);\n\n useEffect(() => {\n const container = containerRef.current;\n if (!container) return;\n if (!container) return;\n\n const handleWheel = (e: WheelEvent) => {\n if (e.metaKey || e.ctrlKey) {\n e.preventDefault();\n \n const rect = container.getBoundingClientRect();\n const clientX = e.clientX;\n const clientY = e.clientY;\n \n const multiplier = Math.exp(-e.deltaY * 0.002);\n \n setScale(s => {\n const newScale = Math.min(Math.max(s * multiplier, 0.5), 64);\n if (newScale !== s) {\n zoomFocusRef.current = { \n vx: clientX - rect.left, \n vy: clientY - rect.top \n };\n }\n return newScale;\n });\n }\n };\n\n container.addEventListener('wheel', handleWheel, { passive: false });\n return () => container.removeEventListener('wheel', handleWheel);\n }, [setScale]);\n\n // Function to commit new annotations and push to history\n const commitAnnotations = useCallback((newAnns: Annotation[]) => {\n setPast(prev => [...prev, annotations]);\n setFuture([]);\n setAnnotations(newAnns);\n }, [annotations]);\n\n useBusEvent<{ tempAnn: Annotation }>('action-commit-digital-signature-local', (d) => {\n if (d?.tempAnn) commitAnnotations([...annotations, d.tempAnn]);\n });\n\n const handleUndo = useCallback(() => {\n if (past.length === 0) return;\n const previous = past[past.length - 1];\n setFuture(prev => [annotations, ...prev]);\n setAnnotations(previous);\n setPast(prev => prev.slice(0, -1));\n }, [annotations, past]);\n\n const handleRedo = useCallback(() => {\n if (future.length === 0) return;\n const next = future[0];\n setPast(prev => [...prev, annotations]);\n setAnnotations(next);\n setFuture(prev => prev.slice(1));\n }, [annotations, future]);\n\n // Keyboard shortcuts are delivered by <TeamSyncViewer> from its root element, so they only apply\n // to the viewer instance that currently has focus (several viewers can share a page).\n useBusEvent<KeyboardEvent>('viewer-keydown', (e) => {\n const isInput = document.activeElement?.tagName === 'TEXTAREA' || document.activeElement?.tagName === 'INPUT';\n\n if (matchShortcut(e, getCommand('ROTATE_CW'))) {\n e.preventDefault();\n setRotation(r => (r + 90) % 360);\n return;\n }\n if (matchShortcut(e, getCommand('ROTATE_CCW'))) {\n e.preventDefault();\n setRotation(r => (r - 90) % 360);\n return;\n }\n if (matchShortcut(e, getCommand('UNDO'))) {\n e.preventDefault();\n handleUndo();\n return;\n }\n if (matchShortcut(e, getCommand('REDO'))) {\n e.preventDefault();\n handleRedo();\n return;\n }\n\n // Don't delete if we are actively typing in a textarea\n if (!isInput && !activeTextEditor) {\n if (matchShortcut(e, getCommand('DELETE')) && selectedAnnotationId) {\n e.preventDefault();\n commitAnnotations(annotations.filter(a => a.id !== selectedAnnotationId));\n setSelectedAnnotationId(null);\n }\n }\n });\n\n useEffect(() => {\n if (activeTextEditor && textareaRef.current) {\n setTimeout(() => {\n textareaRef.current?.focus();\n }, 10);\n }\n }, [activeTextEditor]);\n\n useEffect(() => {\n if (onAnnotationsChange) {\n onAnnotationsChange(annotations);\n }\n }, [annotations, onAnnotationsChange]);\n\n // --- Dynamic Regex Redactions ---\n const [autoRedactions, setAutoRedactions] = useState<Redaction[]>([]);\n \n useEffect(() => {\n if (pdfDoc && regexRedactions && regexRedactions.length > 0) {\n let cancelled = false;\n findRegexRedactions(pdfDoc, regexRedactions).then(results => {\n if (!cancelled) setAutoRedactions(results);\n });\n return () => { cancelled = true; };\n } else {\n setAutoRedactions([]);\n }\n }, [pdfDoc, regexRedactions]);\n\n const [isCommitModalOpen, setIsCommitModalOpen] = useState(false);\n\n const combinedRedactions = useMemo(() => {\n return [...(redactions || []), ...autoRedactions, ...manualRedactions];\n }, [redactions, autoRedactions, manualRedactions]);\n\n // Share the live redaction list with the instance (export needs it) instead of window globals.\n useEffect(() => {\n callbacksRef.current.onRedactionsChange?.(combinedRedactions);\n }, [combinedRedactions]);\n\n const pendingRedactionsCount = useMemo(() => {\n return combinedRedactions.filter(r => r.status === 'pending').length;\n }, [combinedRedactions]);\n\n const handleDiscardAllRedactions = useCallback(() => {\n setManualRedactions(prev => prev.filter(r => r.status === 'applied'));\n setAutoRedactions(prev => prev.filter(r => r.status === 'applied'));\n }, []);\n\n const handleDiscardRedaction = useCallback((red: Redaction) => {\n setManualRedactions(prev => prev.filter(r => r !== red && r.id !== red.id));\n setAutoRedactions(prev => prev.filter(r => r !== red && r.id !== red.id));\n }, []);\n\n const { search, searchResults, isSearching, searchProgress } = usePdfSearch(pdfDoc, combinedRedactions);\n\n // Load the document. Re-runs when the URL or the reload nonce changes; the previous loading task\n // (and its worker transport) is destroyed on cleanup so documents never leak across loads.\n const firstPageRenderedRef = useRef(false);\n useEffect(() => {\n setPdfDoc(null);\n setLoadError(null);\n setPageNum(1);\n firstPageRenderedRef.current = false;\n if (!initialDoc) return;\n\n const url = initialDoc;\n let cancelled = false;\n let loadingTask: pdfjsLib.PDFDocumentLoadingTask | null = null;\n\n const loadPdf = async () => {\n try {\n if (assetsRef.current) configurePdfAssets(assetsRef.current);\n assertWorkerConfigured();\n loadingTask = pdfjsLib.getDocument({ url, withCredentials, ...getDocumentParams() });\n const doc = await loadingTask.promise;\n // If the effect was cleaned up meanwhile, the loading task (and its worker transport)\n // has already been destroyed by the cleanup function.\n if (cancelled) return;\n setPdfDoc(doc);\n callbacksRef.current.onDocumentLoaded?.(doc, url);\n } catch (error: any) {\n if (cancelled) return;\n const err = error instanceof Error ? error : new Error(String(error?.message ?? error));\n const passwordRequired = error?.name === 'PasswordException';\n console.error('[teamsync-pdf-viewer] Error loading PDF:', err.message, err);\n setLoadError(err);\n callbacksRef.current.onLoadError?.(err, { url, passwordRequired });\n }\n };\n loadPdf();\n\n return () => {\n cancelled = true;\n if (loadingTask) {\n loadingTask.destroy().catch(() => {});\n }\n };\n }, [initialDoc, loadNonce, withCredentials]);\n\n const handlePageRendered = useCallback((renderedPage: number) => {\n if (firstPageRenderedRef.current) return;\n firstPageRenderedRef.current = true;\n callbacksRef.current.onFirstPageRendered?.(renderedPage);\n }, []);\n\n useEffect(() => {\n if (pdfDoc) callbacksRef.current.onPageChange?.(pageNum, pdfDoc.numPages);\n }, [pageNum, pdfDoc]);\n\n // Scroll to initial page\n useEffect(() => {\n if (pdfDoc && initialPage && initialPage > 1 && containerRef.current) {\n setTimeout(() => {\n const GAP = 16;\n const scaledPageHeight = basePageDims.height * scale + GAP;\n containerRef.current!.scrollTop = (initialPage - 1) * scaledPageHeight;\n }, 100);\n }\n }, [pdfDoc, initialPage, basePageDims.height, scale]);\n\n // Recalculate basePageDims when pdfDoc or rotation changes\n useEffect(() => {\n if (pdfDoc) {\n const updateDims = async () => {\n const page = await pdfDoc.getPage(1);\n // UI rotation composes on top of the page's intrinsic /Rotate (pdf.js replaces it when an\n // explicit `rotation` is passed). Dimensions swap for 90/270 so layout stays correct.\n const vp = page.getViewport({ scale: 1, rotation: normalizeRotation(page.rotate + rotation) });\n setBasePageDims({ width: vp.width, height: vp.height });\n };\n updateDims();\n }\n }, [pdfDoc, rotation]);\n\n // Dynamic Fit to Width calculation\n const handleFitToWidth = useCallback(() => {\n if (!containerRef.current || !basePageDims.width) return;\n const availableWidth = containerRef.current.clientWidth - 48;\n if (availableWidth > 0 && basePageDims.width > 0) {\n const newScale = availableWidth / basePageDims.width;\n const clampedScale = Math.max(0.1, Math.min(32, parseFloat(newScale.toFixed(2))));\n setScale(clampedScale);\n }\n }, [basePageDims.width, setScale]);\n\n // Dynamic Fit to Page calculation\n const handleFitToPage = useCallback(() => {\n if (!containerRef.current || !basePageDims.width || !basePageDims.height) return;\n const availableWidth = containerRef.current.clientWidth - 48;\n const availableHeight = containerRef.current.clientHeight - 48;\n if (availableWidth > 0 && availableHeight > 0 && basePageDims.width > 0 && basePageDims.height > 0) {\n const scaleX = availableWidth / basePageDims.width;\n const scaleY = availableHeight / basePageDims.height;\n const newScale = Math.min(scaleX, scaleY);\n const clampedScale = Math.max(0.1, Math.min(32, parseFloat(newScale.toFixed(2))));\n setScale(clampedScale);\n }\n }, [basePageDims.width, basePageDims.height, setScale]);\n\n useBusEvent('action-fit-to-width', () => handleFitToWidth());\n useBusEvent('action-fit-to-page', () => handleFitToPage());\n\n const getUnrotatedPoint = (e: React.MouseEvent<Element>) => {\n const rect = e.currentTarget.getBoundingClientRect();\n const rawX = (e.clientX - rect.left) / scale;\n const rawY = (e.clientY - rect.top) / scale;\n const unW = rotation % 180 === 0 ? basePageDims.width : basePageDims.height;\n const unH = rotation % 180 === 0 ? basePageDims.height : basePageDims.width;\n return convertToUnrotated(rawX, rawY, rotation, unW, unH);\n };\n\n const handleMouseDown = (e: React.MouseEvent<Element>, targetPageNum: number) => {\n if (!activeTool) return;\n \n const { x, y } = getUnrotatedPoint(e);\n\n if (activeTool === 'text' || activeTool === 'note') {\n e.preventDefault();\n return;\n }\n\n if (activeTool === 'eraser') {\n setIsDrawing(true);\n return;\n }\n\n setStartPos({ x, y });\n setCurrentPos({ x, y });\n if (activeTool === 'freehand') {\n setIsDrawing(true);\n setFreehandPoints([{ x, y }]);\n setActiveDrawingPageNum(targetPageNum);\n } else if (['rectangle', 'ellipse', 'line', 'arrow', 'highlight', 'redaction'].includes(activeTool)) {\n setIsDrawing(true);\n setActiveDrawingPageNum(targetPageNum);\n } else if (['callout', 'link'].includes(activeTool)) {\n setIsDrawing(true);\n setActiveDrawingPageNum(targetPageNum);\n }\n };\n\n const commitTextAnnotation = () => {\n if (activeTextEditor && currentText.trim()) {\n if (activeTextEditor.annId) {\n commitAnnotations(annotations.map(a => \n a.id === activeTextEditor.annId ? { ...a, text: currentText } : a\n ));\n } else {\n const annId = Date.now().toString();\n commitAnnotations([...annotations, {\n id: annId,\n type: activeTextEditor.type,\n pageIndex: activeTextEditor.pageIndex,\n x: activeTextEditor.x,\n y: activeTextEditor.y,\n width: Math.max(100, currentText.length * 8 + 20),\n height: 30,\n text: currentText,\n points: activeTextEditor.points,\n color: currentColor, strokeWidth: currentStrokeWidth, opacity: currentOpacity\n }]);\n }\n }\n setActiveTextEditor(null);\n setCurrentText('');\n if (activeTool === 'text') {\n setActiveTool(null);\n }\n };\n\n const handleMouseMove = (e: React.MouseEvent<Element>, _targetPageNum: number) => {\n if (!isDrawing) return;\n const { x, y } = getUnrotatedPoint(e);\n setCurrentPos({ x, y });\n if (activeTool === 'freehand') {\n setFreehandPoints(prev => [...prev, { x, y }]);\n }\n };\n\n const handleMouseUp = (e: React.MouseEvent<Element>, targetPageNum: number) => {\n if (activeTool === 'text' || activeTool === 'note' || activeTool === 'digital_signature' || activeTool === 'link') {\n const { x, y } = getUnrotatedPoint(e);\n \n if (activeTool === 'link') {\n let width = Math.abs(currentPos.x - startPos.x);\n let height = Math.abs(currentPos.y - startPos.y);\n let linkX = Math.min(startPos.x, currentPos.x);\n let linkY = Math.min(startPos.y, currentPos.y);\n\n if (width < 5 || height < 5) {\n linkX = x;\n linkY = y;\n width = 120;\n height = 35;\n }\n\n const annId = Date.now().toString();\n commitAnnotations([...annotations, { \n id: annId, type: 'link', pageIndex: targetPageNum, x: linkX, y: linkY, width, height, points: [],\n color: 'transparent', strokeWidth: 0, opacity: 1, text: ''\n }]);\n setIsDrawing(false);\n setActiveDrawingPageNum(null);\n justCreatedLinkRef.current = true;\n setSelectedAnnotationId(annId);\n setIsLinkModalOpen(true);\n setActiveTool(null);\n return;\n } else if (activeTool === 'text' || activeTool === 'note') {\n if (activeTextEditor) {\n commitTextAnnotation();\n }\n setActiveTextEditor({ x, y, type: activeTool as any, pageIndex: targetPageNum });\n setCurrentText('');\n }\n return;\n }\n\n if (!isDrawing) return;\n setIsDrawing(false);\n setActiveDrawingPageNum(null);\n if (!activeTool) return;\n \n if (activeTool === 'freehand') {\n if (freehandPoints.length > 2) {\n // Calculate bounding box for freehand to store x, y, width, height (simplified)\n const xs = freehandPoints.map(p => p.x);\n const ys = freehandPoints.map(p => p.y);\n const minX = Math.min(...xs);\n const maxX = Math.max(...xs);\n const minY = Math.min(...ys);\n const maxY = Math.max(...ys);\n \n commitAnnotations([...annotations, { \n id: Date.now().toString(), type: activeTool as any, pageIndex: targetPageNum,\n x: minX, y: minY, width: maxX - minX, height: maxY - minY,\n points: [...freehandPoints],\n color: currentColor, strokeWidth: currentStrokeWidth, opacity: currentOpacity\n }]);\n }\n setFreehandPoints([]);\n } else {\n let width = Math.abs(currentPos.x - startPos.x);\n let height = Math.abs(currentPos.y - startPos.y);\n if (width > 5 || height > 5) {\n let x = Math.min(startPos.x, currentPos.x);\n let y = Math.min(startPos.y, currentPos.y);\n const points = (activeTool === 'line' || activeTool === 'arrow' || activeTool === 'callout') ? [startPos, currentPos] : undefined;\n \n if ((activeTool === 'highlight' || activeTool === 'redaction') && height < 18) {\n height = Math.max(18, height);\n y = startPos.y - 9; // Center the highlight or redaction on the mouse path\n }\n \n if (activeTool === 'callout') {\n if (permissions?.canAddAnnotations === false) return;\n setActiveTextEditor({ x: currentPos.x, y: currentPos.y, type: 'callout', points, pageIndex: targetPageNum });\n setCurrentText('');\n return;\n }\n\n if (activeTool === 'redaction') {\n if (permissions?.canRedact === false) return;\n setManualRedactions(prev => [...prev, {\n id: `manual-${Date.now()}-${Math.random().toString(36).substr(2, 6)}`,\n pageIndex: targetPageNum,\n x,\n y,\n width,\n height,\n status: 'pending'\n }]);\n return;\n }\n\n if (permissions?.canAddAnnotations === false) return;\n\n commitAnnotations([...annotations, { \n id: Date.now().toString(), type: activeTool as any, pageIndex: targetPageNum, x, y, width, height, points,\n color: currentColor, strokeWidth: currentStrokeWidth, opacity: currentOpacity\n }]);\n }\n }\n };\n\n const handleEraserMove = (id: string) => {\n if (activeTool === 'eraser' && isDrawing) {\n commitAnnotations(annotations.filter(a => a.id !== id));\n }\n };\n\n const handleEraserClick = (id: string, e: React.MouseEvent) => {\n e.stopPropagation();\n if (activeTool === 'eraser') {\n if (permissions?.canDeleteAnnotations === false) return;\n commitAnnotations(annotations.filter(a => a.id !== id));\n if (selectedAnnotationId === id) {\n setSelectedAnnotationId(null);\n setContextMenuPos(null);\n }\n } else if (activeTool === null || activeTool === 'pan') {\n const ann = annotations.find(a => a.id === id);\n if (ann && ann.linkUrl && activeTab === 'View') {\n if (ann.linkUrl.startsWith('#page=')) {\n const targetPage = parseInt(ann.linkUrl.split('=')[1]);\n const GAP = 16;\n const scaledPageHeight = basePageDims.height * scale + GAP;\n if (containerRef.current) containerRef.current.scrollTop = (targetPage - 1) * scaledPageHeight;\n } else {\n let linkHref = ann.linkUrl;\n if (!/^https?:\\/\\//i.test(linkHref)) {\n linkHref = 'https://' + linkHref;\n }\n const win = window.open(linkHref, '_blank', 'noopener,noreferrer');\n if (win) win.opener = null;\n }\n return;\n } else if (ann && (ann.type === 'note' || ann.type === 'callout' || ann.type === 'text')) {\n if (permissions?.canEditAnnotations === false) return;\n // Open edit mode for text-based annotations\n setActiveTextEditor({ x: ann.x, y: ann.y, type: ann.type as any, annId: ann.id, points: ann.points, pageIndex: ann.pageIndex });\n setCurrentText(ann.text || '');\n if (ann.color) setCurrentColor(ann.color);\n } else if (ann && ann.type === 'link') {\n if (permissions?.canEditAnnotations === false) return;\n setIsLinkModalOpen(true);\n }\n setSelectedAnnotationId(id);\n \n const container = containerRef.current;\n const containerRect = container?.getBoundingClientRect();\n if (containerRect && container) {\n setContextMenuPos({\n top: e.clientY - containerRect.top + container.scrollTop,\n left: e.clientX - containerRect.left + container.scrollLeft\n });\n }\n }\n };\n\n const visibleRowRef = useRef(0);\n\n const handleScroll = (e: React.UIEvent<HTMLDivElement>) => {\n setScrollPos({\n top: e.currentTarget.scrollTop,\n left: e.currentTarget.scrollLeft\n });\n if (basePageDims.height > 0) {\n visibleRowRef.current = Math.floor(e.currentTarget.scrollTop / (basePageDims.height * scale + 16));\n }\n };\n\n const rows = React.useMemo(() => {\n const r: number[][] = [];\n if (!pdfDoc) return r;\n if (pageLayout === 'single') {\n for (let i = 1; i <= pdfDoc.numPages; i++) r.push([i]);\n } else if (pageLayout === 'double') {\n for (let i = 1; i <= pdfDoc.numPages; i += 2) {\n r.push([i, i + 1].filter(p => p <= pdfDoc.numPages));\n }\n } else if (pageLayout === 'cover-facing') {\n r.push([1]);\n for (let i = 2; i <= pdfDoc.numPages; i += 2) {\n r.push([i, i + 1].filter(p => p <= pdfDoc.numPages));\n }\n }\n return r;\n }, [pdfDoc, pageLayout]);\n\n const GAP = 16;\n const scaledPageHeight = basePageDims.height * scale + GAP;\n const scaledPageWidth = basePageDims.width * scale;\n\n useEffect(() => {\n if (pdfDoc && containerRef.current && pageTransition === 'continuous') {\n const midPoint = scrollPos.top + containerRef.current.clientHeight / 2;\n const cRowIndex = Math.max(0, Math.min(rows.length - 1, Math.floor(midPoint / scaledPageHeight)));\n const currentPage = rows[cRowIndex] ? rows[cRowIndex][0] : 1;\n if (currentPage !== pageNum) {\n setPageNum(currentPage);\n }\n }\n }, [scrollPos.top, scale, pdfDoc, pageNum, scaledPageHeight, pageTransition, rows]);\n\n return (\n <div style={{ flex: 1, display: 'flex', minHeight: 0, backgroundColor: 'var(--bg-color)', overflow: 'hidden' }}>\n {sidebars && (\n <LeftSidebar\n isOpen={leftSidebarOpen}\n pdfDoc={pdfDoc}\n pageNum={pageNum}\n setPageNum={setPageNum}\n />\n )}\n <div style={{ flex: 1, display: 'flex', flexDirection: 'column', minWidth: 0, backgroundColor: 'var(--bg-color)', overflow: 'hidden' }}>\n {/* Sub-toolbar */}\n {activeTab === 'Annotate' && (\n <div style={{ display: 'flex', alignItems: 'center', gap: '8px', padding: '8px 16px', backgroundColor: '#fff', borderBottom: '1px solid var(--border-color)', height: '40px' }}>\n <ToolButton icon={<Highlighter size={16} />} active={activeTool === 'highlight'} onClick={() => { setActiveTool('highlight'); setCurrentColor('#fbc02d'); setCurrentOpacity(0.5); setCurrentStrokeWidth(16); }} label=\"Text Highlight\" />\n <ToolButton icon={<Brush size={16} />} active={activeTool === 'freehand'} onClick={() => { setActiveTool('freehand'); setCurrentColor('#000000'); setCurrentOpacity(1); setCurrentStrokeWidth(2); }} label=\"Marker\" />\n <ToolButton icon={<Type size={16} />} active={activeTool === 'text'} onClick={() => { setActiveTool('text'); setCurrentColor('#000000'); setCurrentOpacity(1); }} label=\"Text\" />\n {permissions?.canRedact !== false && (\n <ToolButton icon={<EyeOff size={16} />} active={activeTool === 'redaction'} onClick={() => { setActiveTool('redaction'); setCurrentColor('#000000'); setCurrentOpacity(1); }} label=\"Redact\" />\n )}\n \n <div style={{ width: '1px', height: '24px', backgroundColor: 'var(--border-color)', margin: '0 8px' }} />\n \n\n <div style={{ display: 'flex', gap: '4px', borderRight: '1px solid var(--border-color)', paddingRight: '8px' }}>\n <ToolButton icon={<MessageSquareQuote size={16} />} active={activeTool === 'callout'} onClick={() => { setActiveTool('callout'); setCurrentOpacity(1); setCurrentStrokeWidth(2); }} label=\"Callout\" />\n </div>\n <div style={{ display: 'flex', gap: '4px' }}>\n <ToolButton icon={<Pen size={16} />} active={activeTool === 'freehand' && currentOpacity === 1} onClick={() => { setActiveTool('freehand'); setCurrentOpacity(1); setCurrentStrokeWidth(2); }} label=\"Freehand\" />\n {permissions?.canDeleteAnnotations !== false && (\n <ToolButton icon={<Eraser size={16} />} active={activeTool === 'eraser'} onClick={() => setActiveTool('eraser')} label=\"Eraser\" />\n )}\n </div>\n\n <div style={{ width: '1px', height: '24px', backgroundColor: 'var(--border-color)', margin: '0 8px' }} />\n\n <div style={{ display: 'flex', gap: '4px' }}>\n <ToolButton icon={<Minus size={16} />} active={activeTool === 'line'} onClick={() => setActiveTool('line')} label=\"Line\" />\n <ToolButton icon={<ArrowUpRight size={16} />} active={activeTool === 'arrow'} onClick={() => setActiveTool('arrow')} label=\"Arrow\" />\n <ToolButton icon={<Square size={16} />} active={activeTool === 'rectangle'} onClick={() => setActiveTool('rectangle')} label=\"Rectangle\" />\n <ToolButton icon={<CircleIcon size={16} />} active={activeTool === 'ellipse'} onClick={() => setActiveTool('ellipse')} label=\"Ellipse\" />\n <ToolButton icon={<LinkIcon size={16} />} active={activeTool === 'link'} onClick={() => setActiveTool('link')} label=\"Link\" />\n </div>\n \n <div style={{ flex: 1 }} />\n \n <div style={{ display: 'flex', alignItems: 'center', gap: '12px' }}>\n {['line', 'arrow', 'rectangle', 'ellipse', 'freehand', 'highlight'].includes(activeTool || '') && (\n <div style={{ display: 'flex', alignItems: 'center', gap: '8px', borderRight: '1px solid var(--border-color)', paddingRight: '12px' }}>\n <span style={{ fontSize: '12px', color: '#666', minWidth: '85px' }}>Thickness: <strong>{currentStrokeWidth}px</strong></span>\n <input \n type=\"range\" \n min=\"1\" \n max=\"24\" \n value={Math.min(24, Math.max(1, currentStrokeWidth))} \n onMouseDown={(e) => e.stopPropagation()}\n onChange={(e) => {\n const val = parseInt(e.target.value, 10);\n setCurrentStrokeWidth(val);\n if (selectedAnnotationId && !activeTextEditor) {\n commitAnnotations(annotations.map(a => a.id === selectedAnnotationId ? { ...a, strokeWidth: val } : a));\n }\n }}\n style={{ width: '90px', cursor: 'pointer' }}\n />\n </div>\n )}\n <div style={{ display: 'flex', gap: '4px' }}>\n {['#d32f2f', '#f57c00', '#fbc02d', '#388e3c', '#1976d2', '#7b1fa2', '#000000'].map(color => (\n <button\n key={color}\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => {\n setCurrentColor(color);\n // If an annotation is selected but not actively being edited, update its color instantly\n if (selectedAnnotationId && !activeTextEditor) {\n commitAnnotations(annotations.map(a => a.id === selectedAnnotationId ? { ...a, color } : a));\n }\n }}\n style={{\n width: '18px', height: '18px', borderRadius: '50%', backgroundColor: color,\n border: currentColor === color ? '2px solid #000' : '1px solid transparent',\n cursor: 'pointer', outline: 'none', padding: 0\n }}\n />\n ))}\n </div>\n {pendingRedactionsCount > 0 && (\n <div style={{ display: 'flex', alignItems: 'center', gap: '8px', marginLeft: '8px' }}>\n <button\n onClick={() => setIsCommitModalOpen(true)}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: '6px',\n backgroundColor: '#dc2626',\n color: '#ffffff',\n border: 'none',\n borderRadius: '6px',\n padding: '5px 12px',\n fontSize: '12px',\n fontWeight: 600,\n cursor: 'pointer',\n boxShadow: '0 2px 6px rgba(220, 38, 38, 0.3)'\n }}\n title=\"Apply all marked redactions permanently\"\n >\n <ShieldCheck size={16} />\n Apply Redactions ({pendingRedactionsCount})\n </button>\n\n <button\n onClick={handleDiscardAllRedactions}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: '6px',\n backgroundColor: '#ffffff',\n color: '#dc2626',\n border: '1px solid #fca5a5',\n borderRadius: '6px',\n padding: '5px 12px',\n fontSize: '12px',\n fontWeight: 600,\n cursor: 'pointer'\n }}\n title=\"Discard all pending unapplied redactions\"\n >\n <Trash2 size={14} color=\"#dc2626\" />\n Discard Redactions\n </button>\n </div>\n )}\n </div>\n </div>\n )}\n\n {/* Commit Redactions Confirmation Modal */}\n {isCommitModalOpen && (\n <div style={{\n position: 'fixed',\n top: 0, left: 0, right: 0, bottom: 0,\n backgroundColor: 'rgba(0, 0, 0, 0.5)',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n zIndex: 9999\n }}>\n <div style={{\n backgroundColor: '#ffffff',\n borderRadius: '12px',\n padding: '24px',\n width: '460px',\n maxWidth: '90vw',\n boxShadow: '0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04)'\n }}>\n <div style={{ display: 'flex', alignItems: 'center', gap: '12px', marginBottom: '16px' }}>\n <div style={{ width: '40px', height: '40px', borderRadius: '50%', backgroundColor: '#fee2e2', display: 'flex', alignItems: 'center', justifyContent: 'center', color: '#dc2626' }}>\n <ShieldCheck size={24} />\n </div>\n <div>\n <h3 style={{ margin: 0, fontSize: '16px', fontWeight: 600, color: '#111827' }}>Apply Redactions?</h3>\n <p style={{ margin: 0, fontSize: '13px', color: '#6b7280' }}>Permanent content removal</p>\n </div>\n </div>\n <p style={{ fontSize: '14px', color: '#374151', lineHeight: '1.5', marginBottom: '20px' }}>\n You are about to permanently apply <strong>{pendingRedactionsCount} redaction(s)</strong>. Marked areas will be blacked out and underlying text will be permanently removed. This action cannot be undone.\n </p>\n <div style={{ display: 'flex', justifyContent: 'flex-end', gap: '8px' }}>\n <button\n onClick={() => setIsCommitModalOpen(false)}\n style={{\n padding: '8px 14px',\n borderRadius: '6px',\n border: '1px solid #d1d5db',\n backgroundColor: '#ffffff',\n color: '#374151',\n fontSize: '13px',\n fontWeight: 500,\n cursor: 'pointer'\n }}\n >\n Cancel\n </button>\n <button\n onClick={() => {\n handleDiscardAllRedactions();\n setIsCommitModalOpen(false);\n }}\n style={{\n padding: '8px 14px',\n borderRadius: '6px',\n border: '1px solid #fca5a5',\n backgroundColor: '#fef2f2',\n color: '#dc2626',\n fontSize: '13px',\n fontWeight: 600,\n cursor: 'pointer'\n }}\n >\n Discard Redactions\n </button>\n <button\n onClick={() => {\n setManualRedactions(prev => prev.map(r => ({ ...r, status: 'applied' })));\n setAutoRedactions(prev => prev.map(r => ({ ...r, status: 'applied' })));\n setIsCommitModalOpen(false);\n }}\n style={{\n padding: '8px 14px',\n borderRadius: '6px',\n border: 'none',\n backgroundColor: '#dc2626',\n color: '#ffffff',\n fontSize: '13px',\n fontWeight: 600,\n cursor: 'pointer'\n }}\n >\n Apply Redactions\n </button>\n </div>\n </div>\n </div>\n )}\n\n\n\n {/* Main Canvas Area */}\n {activeTool === 'highlight' && (\n <style>{`\n .pdf-viewer-area, .pdf-viewer-area * {\n cursor: url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0IiBmaWxsPSJub25lIiBzdHJva2U9ImJsYWNrIiBzdHJva2Utd2lkdGg9IjIiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCI+PHBhdGggZD0iTTkgMTFsLTYgNnYzaDlsMy0zIi8+PHBhdGggZD0iTTIyIDEybC00LjYgNC42YTIgMiAwIDAgMS0yLjggMGwtNS4yLTUuMmEyIDIgMCAwIDEgMC0yLjhMMTQgNCIvPjwvc3ZnPg==') 0 24, auto !important;\n }\n `}</style>\n )}\n <div \n className=\"pdf-viewer-area\"\n style={{ \n flex: 1, \n overflow: 'hidden', \n position: 'relative', \n backgroundColor: 'var(--bg-color)', \n cursor: isPanning ? 'grabbing' : (activeTool === 'pan' || activeTool === null ? 'grab' : (activeTool === 'eraser' ? 'cell' : 'crosshair')) \n }}\n onMouseMove={(e) => {\n if (isPanning && panStartRef.current && containerRef.current) {\n const dx = e.clientX - panStartRef.current.x;\n const dy = e.clientY - panStartRef.current.y;\n containerRef.current.scrollLeft = panStartRef.current.scrollLeft - dx;\n containerRef.current.scrollTop = panStartRef.current.scrollTop - dy;\n }\n }}\n onMouseLeave={() => {\n if (isPanning) {\n setIsPanning(false);\n panStartRef.current = null;\n }\n }}\n >\n <div \n ref={containerRef}\n onScroll={handleScroll}\n onMouseDown={(e) => {\n if (activeTool === 'pan' || activeTool === null) {\n if (e.button === 0) {\n setIsPanning(true);\n panStartRef.current = {\n x: e.clientX,\n y: e.clientY,\n scrollLeft: e.currentTarget.scrollLeft,\n scrollTop: e.currentTarget.scrollTop\n };\n }\n }\n }}\n onMouseUp={(_e) => {\n if (isPanning) {\n setIsPanning(false);\n panStartRef.current = null;\n }\n }}\n onContextMenu={(e) => {\n // Prevent default browser context menu\n e.preventDefault();\n e.stopPropagation();\n }}\n style={{ \n width: '100%', \n height: '100%', \n overflow: 'auto',\n position: 'relative'\n }}\n >\n {(() => {\n const renderRow = (row: number[], rIndex: number, isContinuous: boolean) => {\n const rTop = isContinuous ? rIndex * scaledPageHeight : 0;\n \n // Virtualization filtering (only for continuous)\n if (isContinuous && containerRef.current) {\n // Render 5 rows before and 8 rows after the currently visible row.\n // By relying on visibleRowRef, we decouple virtualization from the \n // transient async lag of scrollPos during rapid scale changes.\n if (rIndex < visibleRowRef.current - 5 || rIndex > visibleRowRef.current + 8) {\n return null;\n }\n }\n\n // Synthesize live drawing annotation if applicable\n const liveAnn = (isDrawing && activeDrawingPageNum && activeTool && activeTool !== 'eraser') ? (() => {\n if (activeTool === 'freehand') {\n return {\n id: 'temp-live-drawing', type: 'freehand' as const, pageIndex: activeDrawingPageNum,\n x: 0, y: 0, width: 0, height: 0, points: freehandPoints,\n color: currentColor, strokeWidth: currentStrokeWidth, opacity: currentOpacity\n };\n } else if (activeTool === 'highlight') {\n let width = Math.abs(currentPos.x - startPos.x);\n let height = Math.abs(currentPos.y - startPos.y);\n let x = Math.min(startPos.x, currentPos.x);\n let y = Math.min(startPos.y, currentPos.y);\n if (height < 18) {\n height = Math.max(18, height);\n y = startPos.y - 9;\n }\n return {\n id: 'temp-live-drawing', type: 'highlight' as const, pageIndex: activeDrawingPageNum,\n x, y, width, height,\n color: currentColor, strokeWidth: currentStrokeWidth, opacity: currentOpacity\n };\n } else if (activeTool === 'redaction') {\n let width = Math.abs(currentPos.x - startPos.x);\n let height = Math.abs(currentPos.y - startPos.y);\n let x = Math.min(startPos.x, currentPos.x);\n let y = Math.min(startPos.y, currentPos.y);\n if (height < 18) {\n height = Math.max(18, height);\n y = startPos.y - 9;\n }\n return {\n id: 'temp-live-drawing', type: 'rectangle' as const, pageIndex: activeDrawingPageNum,\n x, y, width, height,\n color: '#000000', strokeWidth: 1, opacity: 0.7\n };\n } else if (['line', 'arrow', 'callout', 'rectangle', 'ellipse', 'link'].includes(activeTool as string)) {\n const width = Math.abs(currentPos.x - startPos.x);\n const height = Math.abs(currentPos.y - startPos.y);\n const x = Math.min(startPos.x, currentPos.x);\n const y = Math.min(startPos.y, currentPos.y);\n const points = (activeTool === 'line' || activeTool === 'arrow' || activeTool === 'callout') ? [startPos, currentPos] : undefined;\n return {\n id: 'temp-live-drawing', type: activeTool as any, pageIndex: activeDrawingPageNum,\n x, y, width, height, points,\n color: currentColor, strokeWidth: currentStrokeWidth, opacity: currentOpacity\n };\n }\n })() : null;\n\n return row.map((p, pIdx) => {\n let pLeft: number | undefined = undefined;\n const cW = containerRef.current?.clientWidth || 0;\n if (row.length === 2) {\n if (pIdx === 0) pLeft = Math.max(0, cW / 2 - scaledPageWidth);\n if (pIdx === 1) pLeft = Math.max(scaledPageWidth, cW / 2);\n } else {\n pLeft = Math.max(0, cW / 2 - scaledPageWidth / 2);\n }\n \n const pageAnnotations = (liveAnn && liveAnn.pageIndex === p) ? [...annotations, liveAnn] : annotations;\n\n return (\n <React.Fragment key={p}>\n <PageRenderer \n pageNum={p}\n pdfDoc={pdfDoc!}\n scale={scale}\n rotation={rotation}\n containerWidth={containerRef.current?.clientWidth || 0}\n containerHeight={containerRef.current?.clientHeight || 0}\n scrollTop={scrollPos.top}\n scrollLeft={scrollPos.left}\n pageTop={rTop}\n pageLeft={pLeft}\n basePageWidth={basePageDims.width}\n basePageHeight={basePageDims.height}\n activeTab={activeTab}\n activeTool={activeTool}\n annotations={pageAnnotations}\n selectedAnnotationId={selectedAnnotationId}\n activeSearchResult={activeSearchResult}\n onMouseDown={handleMouseDown}\n onMouseMove={handleMouseMove}\n onMouseUp={handleMouseUp}\n onAnnotationClick={handleEraserClick}\n onAnnotationMouseEnter={handleEraserMove}\n onClearSelection={() => {\n if (justCreatedLinkRef.current || isLinkModalOpen) {\n justCreatedLinkRef.current = false;\n return;\n }\n setSelectedAnnotationId(null);\n setContextMenuPos(null);\n }}\n watermark={watermark}\n watermarkText={watermarkText}\n redactions={combinedRedactions}\n onDiscardRedaction={handleDiscardRedaction}\n onRendered={handlePageRendered}\n />\n {activeTextEditor && activeTextEditor.pageIndex === p && (() => {\n const unW = rotation % 180 === 0 ? basePageDims.width : basePageDims.height;\n const unH = rotation % 180 === 0 ? basePageDims.height : basePageDims.width;\n const rotEditorPos = convertToRotated(activeTextEditor.x, activeTextEditor.y, rotation, unW, unH);\n return (\n <div style={{\n position: 'absolute',\n left: `${(pLeft || 0) + rotEditorPos.x * scale}px`,\n top: `${rTop + rotEditorPos.y * scale}px`,\n zIndex: 50,\n backgroundColor: '#fff',\n boxShadow: '0 2px 8px rgba(0,0,0,0.2)',\n borderRadius: '4px',\n display: 'flex',\n flexDirection: 'column'\n }}>\n <textarea\n ref={textareaRef}\n value={currentText}\n onChange={e => setCurrentText(e.target.value)}\n onBlur={(e) => {\n // Only commit on blur if we are not clicking inside the editor container\n if (!e.currentTarget.parentElement?.contains(e.relatedTarget as Node)) {\n commitTextAnnotation();\n }\n }}\n onKeyDown={e => { if (e.key === 'Enter' && !e.shiftKey) { e.preventDefault(); commitTextAnnotation(); } }}\n style={{\n backgroundColor: 'transparent',\n border: 'none',\n color: currentColor,\n fontSize: '16px',\n fontFamily: 'sans-serif',\n minWidth: '150px',\n minHeight: '40px',\n outline: 'none',\n resize: 'both',\n padding: '8px'\n }}\n placeholder={activeTextEditor.type === 'note' ? \"Note text...\" : \"Type text...\"}\n autoFocus\n />\n <div style={{ display: 'flex', justifyContent: 'flex-end', padding: '4px 8px', borderTop: '1px solid #eee' }}>\n <button \n onMouseDown={(e) => { e.preventDefault(); commitTextAnnotation(); }}\n style={{ padding: '4px 12px', background: 'var(--primary)', color: '#fff', border: 'none', borderRadius: '4px', cursor: 'pointer', fontSize: '12px' }}\n >\n Save\n </button>\n </div>\n </div>\n );\n })()}\n </React.Fragment>\n );\n });\n };\n\n if (pageTransition === 'continuous') {\n return (\n <div style={{ \n position: 'relative', width: '100%', height: `${rows.length * scaledPageHeight}px`\n }}>\n {rows.map((row, rIndex) => renderRow(row, rIndex, true))}\n </div>\n );\n } else {\n const currentRowIndex = Math.max(0, rows.findIndex(row => row.includes(pageNum)));\n const currentRow = rows[currentRowIndex] || [];\n return (\n <div style={{ \n position: 'relative', width: '100%', minHeight: `${scaledPageHeight}px`\n }}>\n {renderRow(currentRow, currentRowIndex, false)}\n </div>\n );\n }\n })()}\n </div>\n \n {/* Pagination Controls for Page-By-Page */}\n {pageTransition === 'page-by-page' && pdfDoc && (\n <div style={{\n position: 'absolute',\n bottom: '16px',\n left: '50%',\n transform: 'translateX(-50%)',\n display: 'flex',\n alignItems: 'center',\n gap: '16px',\n backgroundColor: 'rgba(30, 30, 30, 0.8)',\n padding: '8px 16px',\n borderRadius: '24px',\n color: '#fff',\n zIndex: 100,\n boxShadow: '0 4px 12px rgba(0,0,0,0.15)'\n }}>\n <button \n onClick={() => setPageNum(Math.max(1, pageNum - 1))}\n disabled={pageNum <= 1}\n style={{ background: 'none', border: 'none', color: pageNum <= 1 ? '#888' : '#fff', cursor: pageNum <= 1 ? 'default' : 'pointer', display: 'flex', alignItems: 'center' }}\n >\n <ChevronLeft size={20} />\n </button>\n <span style={{ fontSize: '13px', fontWeight: 500 }}>\n Page {pageNum} of {pdfDoc.numPages}\n </span>\n <button \n onClick={() => setPageNum(Math.min(pdfDoc.numPages, pageNum + 1))}\n disabled={pageNum >= pdfDoc.numPages}\n style={{ background: 'none', border: 'none', color: pageNum >= pdfDoc.numPages ? '#888' : '#fff', cursor: pageNum >= pdfDoc.numPages ? 'default' : 'pointer', display: 'flex', alignItems: 'center' }}\n >\n <ChevronRight size={20} />\n </button>\n </div>\n )}\n \n {/* Modals and Overlays */} \n {!pdfDoc && (\n <div style={{\n position: 'absolute',\n top: 0, left: 0, right: 0, bottom: 0,\n display: 'flex',\n flexDirection: 'column',\n gap: '8px',\n alignItems: 'center',\n justifyContent: 'center',\n color: 'var(--text-muted)',\n padding: '24px',\n textAlign: 'center'\n }}>\n {loadError ? (\n <>\n <div style={{ fontWeight: 600, color: 'var(--text-color)' }}>\n {loadError.name === 'PasswordException' ? 'This document is password protected.' : 'The document could not be loaded.'}\n </div>\n <div style={{ fontSize: '12px', maxWidth: '480px', wordBreak: 'break-word' }}>{loadError.message}</div>\n </>\n ) : initialDoc ? 'Loading document…' : 'No document loaded.'}\n </div>\n )}\n\n {/* Pagination Floating Overlay (positioned within the viewer, not the window) */}\n {pdfDoc && (\n <div style={{\n position: 'absolute',\n bottom: '24px',\n left: '50%',\n transform: 'translateX(-50%)',\n backgroundColor: 'rgba(0, 0, 0, 0.75)',\n color: 'white',\n padding: '8px 16px',\n borderRadius: '24px',\n display: 'flex',\n alignItems: 'center',\n gap: '16px',\n zIndex: 100,\n boxShadow: '0 4px 12px rgba(0,0,0,0.2)',\n backdropFilter: 'blur(4px)'\n }}>\n <button \n onClick={() => {\n const GAP = 16;\n const scaledPageHeight = basePageDims.height * scale + GAP;\n if(containerRef.current) containerRef.current.scrollTop = (Math.max(1, pageNum - 1) - 1) * scaledPageHeight;\n }}\n disabled={pageNum <= 1}\n style={{ background: 'none', border: 'none', color: pageNum <= 1 ? 'rgba(255,255,255,0.3)' : 'white', cursor: pageNum <= 1 ? 'default' : 'pointer', display: 'flex', padding: 0 }}\n >\n <ChevronLeft size={20} />\n </button>\n <span style={{ fontSize: '13px', fontWeight: 500, minWidth: '80px', textAlign: 'center' }}>\n Page {pageNum} / {pdfDoc.numPages}\n </span>\n <button \n onClick={() => {\n const GAP = 16;\n const scaledPageHeight = basePageDims.height * scale + GAP;\n if(containerRef.current) containerRef.current.scrollTop = (Math.min(pdfDoc.numPages, pageNum + 1) - 1) * scaledPageHeight;\n }}\n disabled={pageNum >= pdfDoc.numPages}\n style={{ background: 'none', border: 'none', color: pageNum >= pdfDoc.numPages ? 'rgba(255,255,255,0.3)' : 'white', cursor: pageNum >= pdfDoc.numPages ? 'default' : 'pointer', display: 'flex', padding: 0 }}\n >\n <ChevronRight size={20} />\n </button>\n </div>\n )}\n \n {/* Annotation Context Menu */}\n {selectedAnnotationId && contextMenuPos && (\n <AnnotationContextMenu\n annotation={annotations.find(a => a.id === selectedAnnotationId)!}\n position={contextMenuPos}\n onCopy={() => {\n const annToCopy = annotations.find(a => a.id === selectedAnnotationId);\n if (annToCopy) {\n const newAnn = { ...annToCopy, id: Math.random().toString(36).substr(2, 9), x: annToCopy.x + 20, y: annToCopy.y + 20 };\n commitAnnotations([...annotations, newAnn]);\n }\n setSelectedAnnotationId(null);\n setContextMenuPos(null);\n }}\n onDelete={() => {\n commitAnnotations(annotations.filter(a => a.id !== selectedAnnotationId));\n setSelectedAnnotationId(null);\n setContextMenuPos(null);\n }}\n onUpdateColor={(color: string) => {\n commitAnnotations(annotations.map(a => a.id === selectedAnnotationId ? { ...a, color } : a));\n }}\n onOpenLinkModal={() => {\n setIsLinkModalOpen(true);\n setContextMenuPos(null);\n }}\n permissions={permissions}\n />\n )}\n \n\n </div>\n </div>\n \n {isLinkModalOpen && selectedAnnotationId && (\n <InsertLinkModal\n initialUrl={annotations.find(a => a.id === selectedAnnotationId)?.linkUrl || ''}\n initialText={annotations.find(a => a.id === selectedAnnotationId)?.text || ''}\n showTextInput={!annotations.find(a => a.id === selectedAnnotationId)?.width || annotations.find(a => a.id === selectedAnnotationId)?.text === '' || annotations.find(a => a.id === selectedAnnotationId)?.text !== undefined}\n onClose={() => {\n const ann = annotations.find(a => a.id === selectedAnnotationId);\n if (ann && !ann.linkUrl) {\n commitAnnotations(annotations.filter(a => a.id !== selectedAnnotationId));\n }\n setIsLinkModalOpen(false);\n setSelectedAnnotationId(null);\n }}\n onSave={(url, text) => {\n commitAnnotations(annotations.map(a => {\n if (a.id === selectedAnnotationId) {\n const newText = text !== undefined ? text : a.text;\n const newWidth = newText ? Math.max(100, newText.length * 8 + 20) : a.width;\n return { ...a, linkUrl: url, text: newText, width: newWidth };\n }\n return a;\n }));\n setIsLinkModalOpen(false);\n setSelectedAnnotationId(null);\n }}\n />\n )}\n {sidebars && (\n <Sidebar\n isOpen={rightSidebarOpen}\n activeTab={sidebarTab}\n setActiveTab={setSidebarTab}\n annotations={annotations}\n setAnnotations={commitAnnotations}\n selectedAnnotationId={selectedAnnotationId}\n setSelectedAnnotationId={setSelectedAnnotationId}\n onSearch={search}\n searchResults={searchResults}\n isSearching={isSearching}\n searchProgress={searchProgress}\n onResultClick={handleSearchResultClick}\n />\n )}\n </div>\n );\n}\n\nfunction ToolButton({ icon, active, onClick, label }: { icon: React.ReactNode, active: boolean, onClick: () => void, label: string }) {\n return (\n <button\n onClick={onClick}\n title={label}\n style={{\n display: 'flex', alignItems: 'center', justifyContent: 'center',\n width: '28px', height: '28px', border: 'none', borderRadius: '4px',\n backgroundColor: active ? '#e6f0fa' : 'transparent',\n color: active ? 'var(--primary)' : 'var(--text-color)',\n cursor: 'pointer'\n }}\n onMouseEnter={e => { if (!active) e.currentTarget.style.backgroundColor = '#f3f4f6' }}\n onMouseLeave={e => { if (!active) e.currentTarget.style.backgroundColor = 'transparent' }}\n >\n {icon}\n </button>\n );\n}\n\n\n","/**\n * © 2026 AngelBot Ai Pvt Ltd. All rights reserved.\n */\nimport React, { useState } from 'react';\nimport { X, Edit2, Search } from 'lucide-react';\nimport { useShortcuts } from '../hooks/useShortcuts';\nimport type { ActionType, Shortcut } from '../hooks/useShortcuts';\n\ninterface SettingsModalProps {\n onClose: () => void;\n watermarkText: string;\n setWatermarkText: (text: string) => void;\n}\n\nexport default function SettingsModal({ onClose, watermarkText, setWatermarkText }: SettingsModalProps) {\n const { shortcuts, updateShortcut } = useShortcuts();\n const [activeTab, setActiveTab] = useState('Keyboard Shortcuts');\n const [editingAction, setEditingAction] = useState<ActionType | null>(null);\n\n const handleKeyDown = (e: React.KeyboardEvent, action: ActionType) => {\n e.preventDefault();\n e.stopPropagation();\n\n // Ignore standalone modifier keys\n if (['Meta', 'Control', 'Shift', 'Alt'].includes(e.key)) return;\n\n let keys = [];\n if (e.metaKey || e.ctrlKey) keys.push('COMMAND');\n if (e.shiftKey) keys.push('SHIFT');\n if (e.altKey) keys.push('ALT');\n \n // Normalize key\n let key = e.key.toUpperCase();\n if (key === ' ') key = 'SPACE';\n \n keys.push(key);\n \n \n \n // Map COMMAND back to Meta internally\n const internalCommand = keys.map(k => k === 'COMMAND' ? 'Meta' : k === 'SHIFT' ? 'Shift' : k === 'ALT' ? 'Alt' : k).join('+');\n \n updateShortcut(action, internalCommand);\n setEditingAction(null);\n };\n\n const formatCommandForDisplay = (cmd: string) => {\n return cmd.replace(/Meta|Ctrl/gi, 'COMMAND').replace(/\\+/g, ' + ').toUpperCase();\n };\n\n return (\n <div style={{ position: 'fixed', top: 0, left: 0, width: '100%', height: '100%', backgroundColor: 'rgba(0,0,0,0.5)', zIndex: 1000, display: 'flex', alignItems: 'center', justifyContent: 'center' }}>\n <div style={{ backgroundColor: '#fff', borderRadius: '4px', width: '800px', height: '600px', maxWidth: '90vw', maxHeight: '90vh', display: 'flex', flexDirection: 'column', boxShadow: '0 4px 20px rgba(0,0,0,0.15)' }}>\n \n {/* Header */}\n <div style={{ padding: '16px 24px', borderBottom: '1px solid var(--border-color)', display: 'flex', justifyContent: 'space-between', alignItems: 'center' }}>\n <h2 style={{ margin: 0, fontSize: '18px', fontWeight: 600 }}>Settings</h2>\n <button onClick={onClose} style={{ background: 'none', border: 'none', cursor: 'pointer', color: 'var(--text-muted)' }}>\n <X size={20} />\n </button>\n </div>\n\n {/* Search */}\n <div style={{ padding: '16px 24px', borderBottom: '1px solid var(--border-color)' }}>\n <div style={{ position: 'relative' }}>\n <Search size={16} color=\"var(--text-muted)\" style={{ position: 'absolute', left: '12px', top: '10px' }} />\n <input \n type=\"text\" \n style={{ width: '100%', padding: '8px 12px 8px 36px', border: '1px solid var(--border-color)', borderRadius: '4px', boxSizing: 'border-box' }}\n />\n </div>\n </div>\n\n {/* Content */}\n <div style={{ display: 'flex', flex: 1, overflow: 'hidden' }}>\n {/* Sidebar */}\n <div style={{ width: '200px', borderRight: '1px solid var(--border-color)', backgroundColor: '#f9fafb', display: 'flex', flexDirection: 'column' }}>\n {['General', 'Keyboard Shortcuts'].map(tab => (\n <div \n key={tab}\n onClick={() => setActiveTab(tab)}\n style={{ \n padding: '12px 24px', \n cursor: 'pointer', \n backgroundColor: activeTab === tab ? '#eef2ff' : 'transparent', \n color: activeTab === tab ? 'var(--primary)' : 'var(--text-color)', \n fontWeight: activeTab === tab ? 500 : 400 \n }}\n >\n {tab}\n </div>\n ))}\n </div>\n\n {/* Main Area */}\n <div style={{ flex: 1, overflowY: 'auto', padding: '24px' }}>\n {activeTab === 'Keyboard Shortcuts' && (\n <table style={{ width: '100%', borderCollapse: 'collapse', fontSize: '14px' }}>\n <thead>\n <tr style={{ borderBottom: '1px solid var(--border-color)', textAlign: 'left', color: 'var(--text-muted)' }}>\n <th style={{ padding: '8px', fontWeight: 600 }}>Command</th>\n <th style={{ padding: '8px', fontWeight: 600 }}>Description</th>\n <th style={{ padding: '8px', fontWeight: 600, width: '60px' }}>Action</th>\n </tr>\n </thead>\n <tbody>\n {shortcuts.map((s: Shortcut) => (\n <tr key={s.action} style={{ borderBottom: '1px solid #f0f0f0' }}>\n <td style={{ padding: '12px 8px', color: 'var(--text-muted)' }}>\n {editingAction === s.action ? (\n <input \n autoFocus\n type=\"text\"\n placeholder=\"Press keys...\"\n onKeyDown={(e) => handleKeyDown(e, s.action)}\n onBlur={() => setEditingAction(null)}\n style={{ padding: '4px 8px', width: '150px', border: '2px solid var(--primary)', borderRadius: '4px', outline: 'none' }}\n />\n ) : (\n formatCommandForDisplay(s.command)\n )}\n </td>\n <td style={{ padding: '12px 8px' }}>{s.description}</td>\n <td style={{ padding: '12px 8px' }}>\n <button \n onClick={() => setEditingAction(s.action)}\n style={{ background: 'none', border: 'none', cursor: 'pointer', color: 'var(--text-muted)' }}\n >\n <Edit2 size={16} />\n </button>\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n )}\n \n\n \n {activeTab === 'General' && (\n <div>\n <div style={{ color: 'var(--text-muted)', fontStyle: 'italic', marginBottom: '24px' }}>\n Content for General settings will go here.\n </div>\n \n <div style={{ marginTop: '16px' }}>\n <label style={{ display: 'block', fontSize: '14px', fontWeight: 500, color: '#374151', marginBottom: '8px' }}>\n Forensic Watermark\n </label>\n <div style={{ fontSize: '13px', color: 'var(--text-muted)', marginBottom: '8px' }}>\n Add a persistent, diagonal text watermark that overlays all document pages.\n </div>\n <input \n type=\"text\" \n value={watermarkText}\n onChange={(e) => setWatermarkText(e.target.value)}\n placeholder=\"Leave blank to disable watermark\"\n style={{\n width: '100%',\n padding: '8px 12px',\n border: '1px solid var(--border-color)',\n borderRadius: '4px',\n fontSize: '14px',\n outline: 'none'\n }}\n />\n </div>\n </div>\n )}\n </div>\n </div>\n\n </div>\n </div>\n );\n}\n","/**\n * © 2026 AngelBot Ai Pvt Ltd. All rights reserved.\n */\nimport React from 'react';\nimport { X, Info } from 'lucide-react';\n\ninterface AboutModalProps {\n onClose: () => void;\n}\n\nexport default function AboutModal({ onClose }: AboutModalProps) {\n return (\n <div style={{\n position: 'fixed', top: 0, left: 0, right: 0, bottom: 0,\n backgroundColor: 'rgba(0,0,0,0.5)', display: 'flex', alignItems: 'center', justifyContent: 'center',\n zIndex: 3000\n }}>\n <div style={{\n backgroundColor: '#fff',\n color: '#333',\n borderRadius: '8px',\n width: '500px',\n maxWidth: '90%',\n boxShadow: '0 10px 25px rgba(0,0,0,0.2)',\n fontFamily: 'sans-serif',\n overflow: 'hidden',\n display: 'flex',\n flexDirection: 'column',\n maxHeight: '90vh'\n }}>\n {/* Header */}\n <div style={{ \n padding: '16px 24px', borderBottom: '1px solid #e5e7eb', \n display: 'flex', alignItems: 'center', justifyContent: 'space-between',\n backgroundColor: '#f9fafb'\n }}>\n <div style={{ display: 'flex', alignItems: 'center', gap: '8px' }}>\n <Info size={20} color=\"#2b76b9\" />\n <h2 style={{ margin: 0, fontSize: '18px', fontWeight: 600, color: '#111827' }}>About</h2>\n </div>\n <button \n onClick={onClose}\n style={{ background: 'none', border: 'none', cursor: 'pointer', color: '#6b7280' }}\n >\n <X size={20} />\n </button>\n </div>\n\n {/* Content */}\n <div style={{ padding: '24px', overflowY: 'auto' }}>\n <div style={{ textAlign: 'center', marginBottom: '24px' }}>\n <h1 style={{ margin: '0 0 8px 0', fontSize: '24px', color: '#1f2937' }}>TeamSync PDF Viewer</h1>\n <p style={{ margin: 0, fontSize: '14px', color: '#6b7280' }}>Version 1.0.0</p>\n <p style={{ margin: '8px 0 0 0', fontSize: '14px', color: '#4b5563' }}>© 2026 AngelBot Ai Pvt Ltd. All rights reserved.</p>\n <a href=\"https://www.teamsync.com\" target=\"_blank\" rel=\"noopener noreferrer\" style={{ display: 'inline-block', margin: '8px 0 0 0', fontSize: '14px', color: '#2b76b9', textDecoration: 'none', fontWeight: 500 }}>www.teamsync.com</a>\n <p style={{ margin: '8px 0 0 0', fontSize: '13px', color: '#4b5563', fontStyle: 'italic' }}>\n Licensed under the Common Public Attribution License Version 1.0 (CPAL).\n </p>\n </div>\n \n <h3 style={{ fontSize: '14px', fontWeight: 600, color: '#374151', borderBottom: '1px solid #e5e7eb', paddingBottom: '8px', marginBottom: '16px' }}>Open Source Licenses & Credits</h3>\n <p style={{ fontSize: '13px', color: '#4b5563', lineHeight: 1.5, marginBottom: '16px' }}>\n This software is made possible by open source software and other third-party libraries that are distributed under their respective licenses:\n </p>\n\n <ul style={{ paddingLeft: '20px', margin: 0, fontSize: '13px', color: '#4b5563', display: 'flex', flexDirection: 'column', gap: '8px' }}>\n <li><strong>pdfjs-dist</strong>: Licensed under the Apache License 2.0. Copyright Mozilla Foundation.</li>\n <li><strong>pdf-lib</strong>: Licensed under the MIT License. Copyright Andrew Dillon.</li>\n <li><strong>react</strong> / <strong>react-dom</strong>: Licensed under the MIT License. Copyright Meta Platforms, Inc.</li>\n <li><strong>lucide-react</strong>: Licensed under the ISC License. Copyright Lucide Contributors.</li>\n <li><strong>node-forge</strong>: Licensed under the BSD-3-Clause License or GPL. Copyright Digital Bazaar, Inc.</li>\n <li><strong>vite</strong>: Licensed under the MIT License. Copyright Evan You and Vite contributors.</li>\n </ul>\n\n <div style={{ marginTop: '16px', fontSize: '13px', textAlign: 'center' }}>\n <a href=\"/ThirdPartyNotices.txt\" target=\"_blank\" rel=\"noopener noreferrer\" style={{ color: '#2b76b9', textDecoration: 'none', fontWeight: 500 }}>\n View Full License Notices\n </a>\n </div>\n </div>\n \n {/* Footer */}\n <div style={{ padding: '16px 24px', backgroundColor: '#f9fafb', borderTop: '1px solid #e5e7eb', display: 'flex', justifyContent: 'flex-end' }}>\n <button \n onClick={onClose}\n style={{ \n backgroundColor: '#2b76b9', color: '#fff', border: 'none', borderRadius: '4px',\n padding: '8px 24px', fontSize: '14px', fontWeight: 500, cursor: 'pointer'\n }}\n >\n Close\n </button>\n </div>\n </div>\n </div>\n );\n}\n","/**\n * © 2026 AngelBot Ai Pvt Ltd. All rights reserved.\n * Per-instance event bus.\n *\n * Replaces the former `window.dispatchEvent(new CustomEvent('action-*'))` plumbing so that several\n * viewer instances can coexist on one page without cross-talk, and so that `destroy()` can drop\n * every listener an instance ever registered.\n */\n\nexport type BusListener<T = unknown> = (detail: T) => void;\n\nexport class ViewerBus {\n private readonly listeners = new Map<string, Set<BusListener<any>>>();\n private destroyed = false;\n\n /** Subscribe. Returns an unsubscribe function. */\n on<T = unknown>(type: string, listener: BusListener<T>): () => void {\n if (this.destroyed) return () => {};\n let set = this.listeners.get(type);\n if (!set) {\n set = new Set();\n this.listeners.set(type, set);\n }\n set.add(listener);\n return () => this.off(type, listener);\n }\n\n /** Subscribe for a single delivery. */\n once<T = unknown>(type: string, listener: BusListener<T>): () => void {\n const off = this.on<T>(type, (detail) => {\n off();\n listener(detail);\n });\n return off;\n }\n\n off<T = unknown>(type: string, listener: BusListener<T>): void {\n const set = this.listeners.get(type);\n if (!set) return;\n set.delete(listener);\n if (set.size === 0) this.listeners.delete(type);\n }\n\n /** Dispatch synchronously to every listener. Listener errors are isolated and logged. */\n emit<T = unknown>(type: string, detail?: T): void {\n if (this.destroyed) return;\n const set = this.listeners.get(type);\n if (!set || set.size === 0) return;\n for (const listener of Array.from(set)) {\n try {\n listener(detail as T);\n } catch (err) {\n console.error(`[teamsync-pdf-viewer] listener for \"${type}\" threw`, err);\n }\n }\n }\n\n listenerCount(type?: string): number {\n if (type) return this.listeners.get(type)?.size ?? 0;\n let n = 0;\n for (const set of this.listeners.values()) n += set.size;\n return n;\n }\n\n removeAll(): void {\n this.listeners.clear();\n }\n\n /** Drop every listener and refuse further subscriptions/emissions. */\n destroy(): void {\n this.removeAll();\n this.destroyed = true;\n }\n\n get isDestroyed(): boolean {\n return this.destroyed;\n }\n}\n","/**\n * © 2026 AngelBot Ai Pvt Ltd. All rights reserved.\n * PDF export: bakes annotations + watermark into a copy of the source document and rasterizes\n * redacted pages so the underlying content is destroyed.\n *\n * The source bytes come from the already-loaded pdf.js document (`pdfDocument.getData()`), so the\n * export never re-fetches the URL (presigned URLs are method-bound and may have expired) and never\n * issues HEAD probes.\n *\n * NOTE (geometry): annotation → PDF user-space conversion still divides by a fixed 1.5 factor,\n * inherited from the original implementation. It is replaced by `annotations/geometry.ts` in 1.2.0.\n */\nimport { PDFDocument, rgb, degrees, StandardFonts } from 'pdf-lib';\nimport * as pdfjsLib from 'pdfjs-dist';\nimport { getDocumentParams } from './pdfAssets';\nimport type { Annotation } from '../annotations/types';\nimport type { Redaction, WatermarkOptions } from './types';\n\n/** Refuse to build documents larger than this in the browser (memory safety). */\nexport const MAX_EXPORT_BYTES = 500 * 1024 * 1024;\n\nexport interface ExportInput {\n /** Returns the original document bytes (prefer `pdfDocument.getData()`). */\n getSourceBytes: () => Promise<Uint8Array | ArrayBuffer>;\n annotations: Annotation[];\n redactions: Redaction[];\n watermark?: WatermarkOptions;\n /** Name printed on digital-signature placeholder blocks when the annotation has no signer. */\n signerName?: string;\n}\n\nexport interface ExportOptions {\n /** Bake exactly these annotations instead of the live list. */\n explicitAnnotations?: Annotation[];\n /** Accepted for API compatibility. Honoured from 1.2.0 (native XFDF import). */\n xfdfString?: string;\n}\n\nconst hexToRgb = (hex: string) => {\n const safe = /^#[0-9a-f]{6}$/i.test(hex) ? hex : '#000000';\n const r = parseInt(safe.slice(1, 3), 16) / 255;\n const g = parseInt(safe.slice(3, 5), 16) / 255;\n const b = parseInt(safe.slice(5, 7), 16) / 255;\n return rgb(r, g, b);\n};\n\nexport async function buildPdfBytes(input: ExportInput, options: ExportOptions = {}): Promise<Uint8Array> {\n if (options.xfdfString) {\n console.warn('[teamsync-pdf-viewer] getFileData({ xfdfString }) is not supported yet; the live annotation list is used instead.');\n }\n\n const raw = await input.getSourceBytes();\n const sourceBytes = raw instanceof Uint8Array ? raw : new Uint8Array(raw);\n if (sourceBytes.byteLength > MAX_EXPORT_BYTES) {\n const sizeMB = (sourceBytes.byteLength / (1024 * 1024)).toFixed(2);\n throw new Error(\n `File is too large (${sizeMB} MB) to save directly in the browser. ` +\n 'Use exportAnnotations() to save annotation data and apply it on your server.'\n );\n }\n\n const pdfDoc = await PDFDocument.load(sourceBytes, { ignoreEncryption: true });\n const pages = pdfDoc.getPages();\n const anns = options.explicitAnnotations || input.annotations;\n\n // These conversions assume scale=1.5 (legacy). Replaced by annotations/geometry.ts in 1.2.0.\n const scale = 1.5;\n\n for (const ann of anns) {\n const targetPageIdx = Math.max(0, Math.min((ann.pageIndex || 1) - 1, pages.length - 1));\n const page = pages[targetPageIdx];\n const { height } = page.getSize();\n\n const color = hexToRgb(ann.color || '#000000');\n const opacity = ann.opacity || 1;\n const strokeWidth = ann.strokeWidth || 1;\n\n if (ann.type === 'rectangle') {\n page.drawRectangle({\n x: ann.x / scale,\n y: height - ann.y / scale - ann.height / scale,\n width: ann.width / scale,\n height: ann.height / scale,\n color,\n opacity,\n borderColor: color,\n borderWidth: strokeWidth,\n });\n } else if (ann.type === 'text' && ann.text) {\n page.drawText(ann.text, {\n x: ann.x / scale,\n y: height - ann.y / scale - 16,\n size: 16 / scale,\n color,\n opacity,\n });\n } else if (ann.type === 'ellipse') {\n page.drawEllipse({\n x: (ann.x + ann.width / 2) / scale,\n y: height - (ann.y + ann.height / 2) / scale,\n xScale: ann.width / 2 / scale,\n yScale: ann.height / 2 / scale,\n color,\n opacity,\n borderColor: color,\n borderWidth: strokeWidth,\n });\n } else if (ann.type === 'line' && ann.points && ann.points.length >= 2) {\n page.drawLine({\n start: { x: ann.points[0].x / scale, y: height - ann.points[0].y / scale },\n end: { x: ann.points[1].x / scale, y: height - ann.points[1].y / scale },\n color,\n opacity,\n thickness: strokeWidth,\n });\n } else if (ann.type === 'freehand' && ann.points && ann.points.length > 0) {\n const d = `M ${ann.points.map((p) => `${p.x / scale},${height - p.y / scale}`).join(' L ')}`;\n page.drawSvgPath(d, { borderColor: color, borderWidth: strokeWidth, opacity });\n } else if (ann.type === 'note') {\n page.drawRectangle({\n x: ann.x / scale,\n y: height - ann.y / scale - 24,\n width: 24,\n height: 24,\n color: rgb(1, 0.97, 0.7),\n borderColor: color,\n borderWidth: strokeWidth,\n });\n if (ann.text) {\n page.drawText(ann.text, {\n x: (ann.x + 30) / scale,\n y: height - ann.y / scale - 16,\n size: 14 / scale,\n color,\n opacity,\n });\n }\n } else if (ann.type === 'callout' && ann.points && ann.points.length >= 2) {\n page.drawLine({\n start: { x: ann.points[0].x / scale, y: height - ann.points[0].y / scale },\n end: { x: ann.points[1].x / scale, y: height - ann.points[1].y / scale },\n color,\n opacity,\n thickness: strokeWidth,\n });\n if (ann.text) {\n page.drawRectangle({\n x: ann.points[1].x / scale,\n y: height - ann.points[1].y / scale - 20,\n width: (ann.text.length * 8 + 20) / scale,\n height: 24 / scale,\n color: rgb(1, 1, 1),\n borderColor: color,\n borderWidth: strokeWidth,\n });\n page.drawText(ann.text, {\n x: (ann.points[1].x + 10) / scale,\n y: height - ann.points[1].y / scale - 14,\n size: 14 / scale,\n color,\n opacity,\n });\n }\n } else if (ann.type === 'signature' && ann.imageUrl) {\n const imageBytes = await fetch(ann.imageUrl).then((res) => res.arrayBuffer());\n const image = await pdfDoc.embedPng(imageBytes);\n page.drawImage(image, {\n x: ann.x / scale,\n y: height - ann.y / scale - ann.height / scale,\n width: ann.width / scale,\n height: ann.height / scale,\n });\n } else if (ann.type === 'digital_signature_placeholder') {\n const rectX = ann.x / scale;\n const rectW = ann.width / scale;\n const rectH = ann.height / scale;\n const rectY = height - ann.y / scale - rectH;\n\n const dateStr = ann.timestamp ? new Date(ann.timestamp).toLocaleString('en-GB') : new Date().toLocaleString('en-GB');\n const iconW = rectW * 0.15;\n\n page.drawRectangle({\n x: rectX, y: rectY, width: rectW, height: rectH,\n color: rgb(1, 1, 1),\n borderColor: rgb(148 / 255, 163 / 255, 184 / 255),\n borderWidth: 1,\n });\n page.drawLine({\n start: { x: rectX + iconW, y: rectY },\n end: { x: rectX + iconW, y: rectY + rectH },\n color: rgb(226 / 255, 232 / 255, 240 / 255),\n thickness: 1,\n });\n page.drawSvgPath('M22 6 L22 14 Q22 20 12 24 Q2 20 2 14 L2 6 L12 2 Z', {\n x: rectX + iconW / 2 - 12,\n y: rectY + rectH / 2 + 12,\n borderColor: rgb(2 / 255, 132 / 255, 199 / 255),\n borderWidth: 2,\n scale: 1,\n });\n page.drawSvgPath('M7 13 L10 16 L17 8', {\n x: rectX + iconW / 2 - 12,\n y: rectY + rectH / 2 + 12,\n borderColor: rgb(2 / 255, 132 / 255, 199 / 255),\n borderWidth: 2,\n scale: 1,\n });\n page.drawText(`Digitally signed by ${ann.signer || input.signerName || 'Unknown signer'}`, {\n x: rectX + iconW + 10, y: rectY + rectH - 16,\n size: 10, color: rgb(15 / 255, 23 / 255, 42 / 255),\n });\n page.drawText(`Date: ${dateStr}`, {\n x: rectX + iconW + 10, y: rectY + rectH - 28,\n size: 9, color: rgb(51 / 255, 65 / 255, 85 / 255),\n });\n page.drawText('Reason: Document Approval', {\n x: rectX + iconW + 10, y: rectY + rectH - 40,\n size: 9, color: rgb(51 / 255, 65 / 255, 85 / 255),\n });\n }\n }\n\n // --- Watermark baking ---\n if (input.watermark?.text) {\n const wm = input.watermark;\n const wmColor = hexToRgb(wm.color || '#737373');\n const wmOpacity = wm.opacity ?? 0.08;\n const helveticaFont = await pdfDoc.embedFont(StandardFonts.Helvetica);\n\n for (const page of pages) {\n const { width, height } = page.getSize();\n const angle = -Math.PI / 4;\n const cosA = Math.cos(angle);\n const sinA = Math.sin(angle);\n\n if (wm.mode === 'single') {\n const fontSize = wm.size || 48;\n const textWidth = helveticaFont.widthOfTextAtSize(wm.text, fontSize);\n const dx = -textWidth / 2;\n const dy = -fontSize * 0.35;\n const rotatedDx = dx * cosA - dy * sinA;\n const rotatedDy = dx * sinA + dy * cosA;\n page.drawText(wm.text, {\n x: width / 2 + rotatedDx,\n y: height / 2 + rotatedDy,\n size: fontSize,\n font: helveticaFont,\n color: wmColor,\n opacity: wmOpacity,\n rotate: degrees(-45),\n });\n } else {\n const fontSize = wm.size || 18;\n const textWidth = helveticaFont.widthOfTextAtSize(wm.text, fontSize);\n const xStep = textWidth + 150;\n const yStep = 250;\n const dx = -textWidth / 2;\n const dy = -fontSize * 0.35;\n const rotatedDx = dx * cosA - dy * sinA;\n const rotatedDy = dx * sinA + dy * cosA;\n for (let y = -height; y < height * 2; y += yStep) {\n const offset = (Math.abs(y / yStep) % 2) * (xStep / 2);\n for (let x = -width; x < width * 2; x += xStep) {\n page.drawText(wm.text, {\n x: x + offset + rotatedDx,\n y: y + rotatedDy,\n size: fontSize,\n font: helveticaFont,\n color: wmColor,\n opacity: wmOpacity,\n rotate: degrees(-45),\n });\n }\n }\n }\n }\n }\n\n // --- Secure rasterization for redactions ---\n const combinedRedactions = input.redactions || [];\n let finalDoc = pdfDoc;\n\n if (combinedRedactions.length > 0) {\n const tempBuffer = await pdfDoc.save();\n const loadingTask = pdfjsLib.getDocument({ data: tempBuffer, ...getDocumentParams() });\n const renderDoc = await loadingTask.promise;\n const flattenedPdf = await PDFDocument.create();\n\n try {\n for (let i = 1; i <= renderDoc.numPages; i++) {\n const pageRedactions = combinedRedactions.filter((r) => r.pageIndex === i);\n\n if (pageRedactions.length > 0) {\n const renderPage = await renderDoc.getPage(i);\n const rasterScale = 2.0;\n const viewport = renderPage.getViewport({ scale: rasterScale });\n\n const canvas = document.createElement('canvas');\n canvas.width = viewport.width;\n canvas.height = viewport.height;\n const ctx = canvas.getContext('2d');\n\n if (ctx) {\n await renderPage.render({ canvasContext: ctx, canvas, viewport }).promise;\n\n ctx.save();\n ctx.fillStyle = '#000000';\n for (const redaction of pageRedactions) {\n ctx.fillRect(\n Math.floor(redaction.x * rasterScale),\n Math.floor(redaction.y * rasterScale),\n Math.ceil(redaction.width * rasterScale),\n Math.ceil(redaction.height * rasterScale)\n );\n }\n ctx.restore();\n\n const imgDataUrl = canvas.toDataURL('image/jpeg', 0.95);\n const imgBytes = await fetch(imgDataUrl).then((res) => res.arrayBuffer());\n const pdfImage = await flattenedPdf.embedJpg(imgBytes);\n\n const originalVp = renderPage.getViewport({ scale: 1 });\n const newPage = flattenedPdf.addPage([originalVp.width, originalVp.height]);\n newPage.drawImage(pdfImage, { x: 0, y: 0, width: originalVp.width, height: originalVp.height });\n\n canvas.width = 0;\n canvas.height = 0;\n }\n renderPage.cleanup();\n } else {\n const [copiedPage] = await flattenedPdf.copyPages(pdfDoc, [i - 1]);\n flattenedPdf.addPage(copiedPage);\n }\n\n if (i % 5 === 0) {\n await new Promise((resolve) => setTimeout(resolve, 0));\n }\n }\n } finally {\n await loadingTask.destroy().catch(() => {});\n }\n finalDoc = flattenedPdf;\n }\n\n return await finalDoc.save();\n}\n","/**\n * © 2026 AngelBot Ai Pvt Ltd. All rights reserved.\n * WebViewerInstance — the imperative handle returned by `createWebViewer()` and exposed through\n * `<TeamSyncViewer ref>`. Keeps the legacy `UI` / `Core` facade for drop-in compatibility.\n */\nimport type * as pdfjsLib from 'pdfjs-dist';\nimport { ViewerBus } from './eventBus';\nimport { buildPdfBytes, type ExportOptions } from './export';\nimport type { Annotation } from '../annotations/types';\nimport type { Redaction, WatermarkOptions, ViewerEventMap, ViewerEventType } from './types';\n\n/** Callbacks the React component installs so the instance can reach live state. */\nexport interface ViewerBinding {\n getAnnotations(): Annotation[];\n getRedactions(): Redaction[];\n getWatermark(): WatermarkOptions | undefined;\n getPdfDocument(): pdfjsLib.PDFDocumentProxy | null;\n getDocumentUrl(): string | undefined;\n getFileName(): string | undefined;\n getCurrentUserName(): string | undefined;\n getCurrentPage(): number;\n getPageCount(): number;\n loadDocument(url: string): void;\n}\n\nconst noBinding = (): never => {\n throw new Error('[teamsync-pdf-viewer] viewer is not mounted (was destroy() called?)');\n};\n\nexport class WebViewerInstance {\n readonly bus: ViewerBus;\n /** Root element of the viewer once mounted. */\n element: HTMLElement | null = null;\n\n private binding: ViewerBinding | null = null;\n private unmountRoot: (() => void) | null = null;\n private destroyed = false;\n\n constructor(bus: ViewerBus) {\n this.bus = bus;\n }\n\n // ---- lifecycle -------------------------------------------------------------------------\n\n /** @internal */\n _bind(binding: ViewerBinding, element: HTMLElement | null): void {\n this.binding = binding;\n this.element = element;\n }\n\n /** @internal */\n _unbind(): void {\n this.binding = null;\n }\n\n /** @internal — installed by createWebViewer() so destroy() can unmount the React root. */\n _setUnmount(fn: () => void): void {\n this.unmountRoot = fn;\n }\n\n get isDestroyed(): boolean {\n return this.destroyed;\n }\n\n get isMounted(): boolean {\n return this.binding !== null;\n }\n\n /**\n * Tear the viewer down: unmounts the React tree created by `createWebViewer()`, drops every\n * listener and refuses further use. Safe to call twice.\n */\n destroy(): void {\n if (this.destroyed) return;\n this.destroyed = true;\n try {\n this.bus.emit('destroy', {});\n } finally {\n const unmount = this.unmountRoot;\n this.unmountRoot = null;\n this.binding = null;\n this.element = null;\n this.bus.destroy();\n if (unmount) {\n // React refuses synchronous unmounts from inside its own render/commit phase.\n Promise.resolve().then(unmount);\n }\n }\n }\n\n // ---- events ----------------------------------------------------------------------------\n\n on<K extends ViewerEventType>(type: K, listener: (detail: ViewerEventMap[K]) => void): () => void {\n return this.bus.on(type, listener as (d: unknown) => void);\n }\n\n off<K extends ViewerEventType>(type: K, listener: (detail: ViewerEventMap[K]) => void): void {\n this.bus.off(type, listener as (d: unknown) => void);\n }\n\n // ---- document --------------------------------------------------------------------------\n\n /** Load (or reload) a document by URL. Resolves when loaded, rejects on load error. */\n loadDocument(url: string): Promise<{ url: string; numPages: number }> {\n const b = this.binding ?? noBinding();\n return new Promise((resolve, reject) => {\n const offLoaded = this.bus.on<ViewerEventMap['documentLoaded']>('documentLoaded', (d) => {\n if (d.url !== url) return;\n cleanup();\n resolve(d);\n });\n const offError = this.bus.on<ViewerEventMap['documentLoadError']>('documentLoadError', (d) => {\n if (d.url !== url) return;\n cleanup();\n reject(d.error);\n });\n const cleanup = () => {\n offLoaded();\n offError();\n };\n b.loadDocument(url);\n });\n }\n\n getDocumentUrl(): string | undefined {\n return this.binding?.getDocumentUrl();\n }\n\n getPdfDocument(): pdfjsLib.PDFDocumentProxy | null {\n return this.binding?.getPdfDocument() ?? null;\n }\n\n getCurrentPage(): number {\n return this.binding?.getCurrentPage() ?? 0;\n }\n\n getPageCount(): number {\n return this.binding?.getPageCount() ?? 0;\n }\n\n // ---- annotations / export --------------------------------------------------------------\n\n getAnnotations(): Annotation[] {\n return this.binding?.getAnnotations() ?? [];\n }\n\n /**\n * Build the exported PDF (annotations + watermark baked, redacted pages rasterized).\n * Uses the bytes of the loaded document; never re-fetches the URL.\n */\n async getFileData(options: ExportOptions = {}): Promise<Uint8Array> {\n const b = this.binding ?? noBinding();\n const pdf = b.getPdfDocument();\n const url = b.getDocumentUrl();\n if (!pdf && !url) throw new Error('No document loaded');\n\n const getSourceBytes = async () => {\n if (pdf) return pdf.getData();\n const response = await fetch(url as string);\n if (!response.ok) throw new Error(`Failed to fetch document (${response.status})`);\n return response.arrayBuffer();\n };\n\n return buildPdfBytes(\n {\n getSourceBytes,\n annotations: b.getAnnotations(),\n redactions: b.getRedactions(),\n watermark: b.getWatermark(),\n signerName: b.getCurrentUserName(),\n },\n options\n );\n }\n\n // ---- legacy facade ---------------------------------------------------------------------\n\n readonly UI = {\n /** Theming is not implemented; kept for API compatibility. */\n setTheme: (_theme: string) => {},\n openElements: (elements: string[]) => this.bus.emit('action-open-elements', { elements }),\n closeElements: (elements: string[]) => this.bus.emit('action-close-elements', { elements }),\n enableElements: (elements: string[]) => this.bus.emit('action-open-elements', { elements }),\n disableElements: (elements: string[]) => this.bus.emit('action-close-elements', { elements }),\n setActiveLeftPanel: (panel: string) => this.bus.emit('action-set-active-left-panel', { panel }),\n setToolMode: (tool: string | null) => this.bus.emit('action-set-tool', { tool }),\n fitWidth: () => this.bus.emit('action-fit-to-width'),\n fitPage: () => this.bus.emit('action-fit-to-page'),\n fitToWidth: () => this.bus.emit('action-fit-to-width'),\n fitToPage: () => this.bus.emit('action-fit-to-page'),\n };\n\n readonly Core = {\n annotationManager: {\n /** Legacy: returns the bespoke JSON annotation list. XFDF import/export arrives in 1.2.0. */\n exportAnnotations: (): string => JSON.stringify(this.getAnnotations(), null, 2),\n getAnnotationsList: (): Annotation[] => this.getAnnotations(),\n },\n documentViewer: {\n addEventListener: (event: string, callback: (detail: unknown) => void): (() => void) =>\n this.bus.on(event, callback),\n removeEventListener: (event: string, callback: (detail: unknown) => void): void =>\n this.bus.off(event, callback),\n getCurrentPage: (): number => this.getCurrentPage(),\n getPageCount: (): number => this.getPageCount(),\n getDocument: () => ({\n getFileData: (options?: ExportOptions) => this.getFileData(options),\n }),\n },\n };\n}\n","/**\n * © 2026 AngelBot Ai Pvt Ltd. All rights reserved.\n * <TeamSyncViewer> — the embeddable viewer component.\n *\n * Owns every piece of UI state the demo application shell used to own (tabs, panels, zoom, layout,\n * rotation), sizes itself to its container, scopes keyboard shortcuts and the action bus to this\n * instance (several viewers can share a page) and exposes a WebViewerInstance via `ref` / `onReady`.\n */\nimport React, { useCallback, useEffect, useImperativeHandle, useMemo, useRef, useState } from 'react';\nimport type * as pdfjsLib from 'pdfjs-dist';\n// Library styles are extracted to dist/style.css by the lib build (consumers import\n// 'teamsync-pdf-viewer/style.css'); bundlers keep this import because of `sideEffects` metadata.\nimport '../index.css';\nimport Header from './Header';\nimport DocumentViewer, { type DocumentLoadErrorInfo } from './DocumentViewer';\nimport SettingsModal from './SettingsModal';\nimport AboutModal from './AboutModal';\nimport { ViewerBus } from '../core/eventBus';\nimport { ViewerBusContext } from '../core/busContext';\nimport { WebViewerInstance } from '../core/ViewerInstance';\nimport type { WebViewerOptions, SDKPermissions, Redaction } from '../core/types';\nimport type { Annotation } from '../annotations/types';\n\nexport interface TeamSyncViewerProps extends Omit<WebViewerOptions, 'path'> {\n /** URL of the PDF to display. Alias of `initialDoc`; `fileUrl` wins when both are set. */\n fileUrl?: string;\n /** Fires once, after mount, with the instance handle. */\n onReady?: (instance: WebViewerInstance) => void;\n onDocumentLoaded?: (info: { url: string; numPages: number }) => void;\n /**\n * Fires when the document could not be loaded. `retry(newUrl?)` reloads — pass a fresh URL when\n * the previous one was a presigned link that expired.\n */\n onDocumentLoadError?: (error: Error, retry: (newUrl?: string) => void, info: DocumentLoadErrorInfo) => void;\n /** Fires once per document, after the first page canvas has been painted. */\n onFirstPageRendered?: (info: { url: string; pageNumber: number }) => void;\n /** Fires (in addition to onDocumentLoadError) when the document is password protected. */\n onPasswordRequired?: (info: { url: string }) => void;\n onPageChange?: (pageNumber: number, numPages: number) => void;\n onAnnotationsChange?: (annotations: Annotation[]) => void;\n className?: string;\n style?: React.CSSProperties;\n}\n\nconst MIN_SCALE = 0.1;\nconst MAX_SCALE = 64;\n\nconst newId = (): string =>\n typeof crypto !== 'undefined' && 'randomUUID' in crypto ? crypto.randomUUID() : `${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;\n\nexport const TeamSyncViewer = React.forwardRef<WebViewerInstance, TeamSyncViewerProps>(function TeamSyncViewer(props, ref) {\n const {\n fileUrl, initialDoc, initialScale, initialPage, plugins, redactions, regexRedactions,\n enableAnnotations, enableSign = false, watermark, permissions, enableRedactions,\n canAddAnnotations, canEditAnnotations, canDeleteAnnotations, readOnly = false,\n assets, withCredentials = false, toolbar = true, sidebars = true, leftPanelOpen = true,\n className, style,\n } = props;\n\n // Latest props for callbacks/bindings that must not re-subscribe on every render.\n const latest = useRef(props);\n latest.current = props;\n\n const rootRef = useRef<HTMLDivElement>(null);\n const bus = useMemo(() => new ViewerBus(), []);\n const instanceRef = useRef<WebViewerInstance | null>(null);\n if (!instanceRef.current) instanceRef.current = new WebViewerInstance(bus);\n const instance = instanceRef.current;\n useImperativeHandle(ref, () => instance, [instance]);\n\n // ---- document ------------------------------------------------------------------------------\n const requestedUrl = fileUrl ?? initialDoc;\n const [docUrl, setDocUrl] = useState<string | undefined>(requestedUrl);\n const [loadNonce, setLoadNonce] = useState(0);\n useEffect(() => {\n setDocUrl(requestedUrl);\n }, [requestedUrl]);\n const loadDocument = useCallback((url: string) => {\n setDocUrl(url);\n setLoadNonce((n) => n + 1);\n }, []);\n\n // ---- UI state (formerly the demo App shell) --------------------------------------------------\n const [activeTab, setActiveTab] = useState('View');\n const [leftSidebarOpen, setLeftSidebarOpen] = useState(sidebars && leftPanelOpen);\n const [rightSidebarOpen, setRightSidebarOpen] = useState(false);\n const [sidebarTab, setSidebarTab] = useState<'Comments' | 'Search'>('Comments');\n const [scale, setScale] = useState(typeof initialScale === 'number' ? initialScale : 1.0);\n const [isSettingsOpen, setIsSettingsOpen] = useState(false);\n const [isAboutModalOpen, setIsAboutModalOpen] = useState(false);\n const [pageTransition, setPageTransition] = useState<'continuous' | 'page-by-page'>('continuous');\n const [pageLayout, setPageLayout] = useState<'single' | 'double' | 'cover-facing'>('single');\n const [rotation, setRotation] = useState(0);\n // Empty by default: hosts opt into watermarks via the `watermark` prop.\n const [watermarkText, setWatermarkText] = useState('');\n\n const effectivePermissions = useMemo<SDKPermissions>(() => {\n if (readOnly) {\n return { canAddAnnotations: false, canEditAnnotations: false, canDeleteAnnotations: false, canRedact: false };\n }\n return {\n canAddAnnotations: permissions?.canAddAnnotations ?? canAddAnnotations ?? enableAnnotations !== false,\n canEditAnnotations: permissions?.canEditAnnotations ?? canEditAnnotations ?? enableAnnotations !== false,\n canDeleteAnnotations: permissions?.canDeleteAnnotations ?? canDeleteAnnotations ?? enableAnnotations !== false,\n canRedact: permissions?.canRedact ?? enableRedactions ?? true,\n };\n }, [readOnly, permissions, canAddAnnotations, canEditAnnotations, canDeleteAnnotations, enableAnnotations, enableRedactions]);\n const annotationsEnabled = !readOnly && enableAnnotations !== false;\n\n useEffect(() => {\n if (effectivePermissions.canAddAnnotations === false && activeTab === 'Annotate') setActiveTab('View');\n }, [effectivePermissions.canAddAnnotations, activeTab]);\n\n // ---- live state exposed to the instance ------------------------------------------------------\n const annotationsRef = useRef<Annotation[]>([]);\n const redactionsRef = useRef<Redaction[]>([]);\n const pdfDocRef = useRef<pdfjsLib.PDFDocumentProxy | null>(null);\n const pageRef = useRef({ current: 1, count: 0 });\n const docUrlRef = useRef(docUrl);\n docUrlRef.current = docUrl;\n const signedBytesRef = useRef<Uint8Array | null>(null);\n const initialFitAppliedRef = useRef(false);\n\n useEffect(() => {\n instance._bind(\n {\n getAnnotations: () => annotationsRef.current,\n getRedactions: () => redactionsRef.current,\n getWatermark: () => latest.current.watermark,\n getPdfDocument: () => pdfDocRef.current,\n getDocumentUrl: () => docUrlRef.current,\n getFileName: () => latest.current.fileName,\n getCurrentUserName: () => latest.current.currentUser?.name,\n getCurrentPage: () => pageRef.current.current,\n getPageCount: () => pageRef.current.count,\n loadDocument,\n },\n rootRef.current\n );\n return () => instance._unbind();\n }, [instance, loadDocument]);\n\n // onReady + autoFocus, exactly once.\n const readyRef = useRef(false);\n useEffect(() => {\n if (readyRef.current) return;\n readyRef.current = true;\n if (latest.current.autoFocus) rootRef.current?.focus({ preventScroll: true });\n latest.current.onReady?.(instance);\n }, [instance]);\n\n // ---- bus wiring (formerly window listeners) --------------------------------------------------\n useEffect(() => {\n const openPanel = (tab: 'Comments' | 'Search') => {\n setRightSidebarOpen(true);\n setSidebarTab(tab);\n };\n\n const offs = [\n bus.on<{ elements?: string[] }>('action-open-elements', (d) => {\n const elements = d?.elements ?? [];\n if (elements.includes('leftPanel')) setLeftSidebarOpen(true);\n if (elements.includes('notesPanel')) openPanel('Comments');\n if (elements.includes('searchPanel')) openPanel('Search');\n }),\n bus.on<{ elements?: string[] }>('action-close-elements', (d) => {\n const elements = d?.elements ?? [];\n if (elements.includes('leftPanel')) setLeftSidebarOpen(false);\n if (elements.includes('notesPanel') || elements.includes('searchPanel')) setRightSidebarOpen(false);\n }),\n bus.on<{ panel?: string }>('action-set-active-left-panel', (d) => {\n const panel = d?.panel;\n if (panel === 'notesPanel') openPanel('Comments');\n else if (panel === 'searchPanel') openPanel('Search');\n else setLeftSidebarOpen(true);\n }),\n bus.on<{ tool: string | null }>('action-tool-changed', (d) => bus.emit('toolChanged', { tool: d?.tool ?? null })),\n bus.on('action-download', async () => {\n try {\n let data = signedBytesRef.current;\n if (data) signedBytesRef.current = null; // consume the freshly signed bytes\n else data = await instance.getFileData();\n if (!data) return;\n const blob = new Blob([data as BlobPart], { type: 'application/pdf' });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = latest.current.fileName || 'annotated_document.pdf';\n a.click();\n setTimeout(() => URL.revokeObjectURL(url), 1000);\n } catch (err) {\n console.error('[teamsync-pdf-viewer] download failed', err);\n bus.emit('action-download-error', { error: err });\n }\n }),\n bus.on<{ pageIndex: number; x: number; y: number; width: number; height: number }>(\n 'action-process-digital-signature',\n async (d) => {\n try {\n const { pageIndex, x, y, width, height } = d;\n const tempAnn: Annotation = {\n id: newId(),\n type: 'digital_signature_placeholder',\n pageIndex, x, y, width, height,\n color: '#0f172a', strokeWidth: 1, opacity: 1,\n signer: latest.current.currentUser?.name ?? 'Unknown signer',\n timestamp: Date.now(),\n };\n const explicitAnnotations = [...instance.getAnnotations(), tempAnn];\n bus.emit('action-waiting-for-pin-start');\n const data = await instance.getFileData({ explicitAnnotations });\n bus.emit('action-waiting-for-pin-end');\n if (!data) return;\n signedBytesRef.current = data;\n bus.emit('action-commit-digital-signature', { tempAnn });\n } catch (err: any) {\n bus.emit('action-waiting-for-pin-error', { error: err?.message ?? String(err) });\n console.error('[teamsync-pdf-viewer] process signature failed', err);\n }\n }\n ),\n // No external signing plugin in the loop: commit the placeholder to the page directly.\n bus.on<{ tempAnn: Annotation }>('action-commit-digital-signature', (d) =>\n bus.emit('action-commit-digital-signature-local', d)\n ),\n ];\n return () => offs.forEach((off) => off());\n }, [bus, instance]);\n\n // ---- DocumentViewer callbacks ----------------------------------------------------------------\n const handleDocumentLoaded = useCallback(\n (doc: pdfjsLib.PDFDocumentProxy, url: string) => {\n pdfDocRef.current = doc;\n pageRef.current = { current: 1, count: doc.numPages };\n initialFitAppliedRef.current = false;\n bus.emit('documentLoaded', { url, numPages: doc.numPages });\n latest.current.onDocumentLoaded?.({ url, numPages: doc.numPages });\n },\n [bus]\n );\n\n const handleLoadError = useCallback(\n (error: Error, info: DocumentLoadErrorInfo) => {\n pdfDocRef.current = null;\n bus.emit('documentLoadError', { url: info.url, error, passwordRequired: info.passwordRequired });\n if (info.passwordRequired) latest.current.onPasswordRequired?.({ url: info.url });\n latest.current.onDocumentLoadError?.(error, (newUrl) => loadDocument(newUrl ?? info.url), info);\n },\n [bus, loadDocument]\n );\n\n const handleFirstPageRendered = useCallback(\n (pageNumber: number) => {\n const url = docUrlRef.current ?? '';\n if (!initialFitAppliedRef.current) {\n initialFitAppliedRef.current = true;\n const fit = latest.current.initialScale;\n if (fit === 'fit-width') setTimeout(() => bus.emit('action-fit-to-width'), 0);\n else if (fit === 'fit-page') setTimeout(() => bus.emit('action-fit-to-page'), 0);\n }\n bus.emit('firstPageRendered', { url, pageNumber });\n latest.current.onFirstPageRendered?.({ url, pageNumber });\n },\n [bus]\n );\n\n const handlePageChange = useCallback(\n (pageNumber: number, numPages: number) => {\n pageRef.current = { current: pageNumber, count: numPages };\n bus.emit('pageChanged', { pageNumber, numPages });\n latest.current.onPageChange?.(pageNumber, numPages);\n },\n [bus]\n );\n\n const handleAnnotationsChange = useCallback(\n (anns: Annotation[]) => {\n annotationsRef.current = anns;\n bus.emit('annotationsChanged', { annotations: anns });\n latest.current.onAnnotationsChange?.(anns);\n },\n [bus]\n );\n\n const handleRedactionsChange = useCallback((reds: Redaction[]) => {\n redactionsRef.current = reds;\n }, []);\n\n // ---- root element handlers -------------------------------------------------------------------\n const handleRootKeyDownCapture = (e: React.KeyboardEvent<HTMLDivElement>) => {\n if ((e.metaKey || e.ctrlKey) && e.key.toLowerCase() === 'f') {\n e.preventDefault();\n if (sidebars) {\n setRightSidebarOpen(true);\n setSidebarTab('Search');\n setTimeout(() => bus.emit('action-focus-search'), 50);\n }\n return;\n }\n bus.emit('viewer-keydown', e.nativeEvent);\n };\n\n // Clicking anywhere inside the viewer makes it the keyboard-shortcut target.\n const handleRootMouseDownCapture = () => {\n const root = rootRef.current;\n if (root && !root.contains(document.activeElement)) root.focus({ preventScroll: true });\n };\n\n const toggleFullscreen = () => {\n const target = rootRef.current ?? document.documentElement;\n if (!document.fullscreenElement) {\n target.requestFullscreen?.().catch(() => {});\n } else {\n document.exitFullscreen?.().catch(() => {});\n }\n };\n\n const openSidebarTab = (tab: 'Comments' | 'Search') => {\n if (!sidebars) return;\n if (rightSidebarOpen && sidebarTab === tab) {\n setRightSidebarOpen(false);\n } else {\n setRightSidebarOpen(true);\n setSidebarTab(tab);\n }\n };\n\n return (\n <ViewerBusContext.Provider value={bus}>\n <div\n ref={rootRef}\n className={['tspdf-root', className].filter(Boolean).join(' ')}\n style={style}\n tabIndex={-1}\n data-teamsync-pdf-viewer=\"\"\n onKeyDownCapture={handleRootKeyDownCapture}\n onMouseDownCapture={handleRootMouseDownCapture}\n >\n {toolbar && (\n <Header\n activeTab={activeTab}\n setActiveTab={(tab) => {\n if (effectivePermissions.canAddAnnotations === false && tab === 'Annotate') return;\n setActiveTab(tab);\n }}\n leftSidebarOpen={leftSidebarOpen}\n setLeftSidebarOpen={(open) => { if (sidebars) setLeftSidebarOpen(open); }}\n rightSidebarOpen={rightSidebarOpen}\n setRightSidebarOpen={setRightSidebarOpen}\n sidebarTab={sidebarTab}\n scale={scale}\n onZoomIn={() => setScale((s) => Math.min(s + 0.25, MAX_SCALE))}\n onZoomOut={() => setScale((s) => Math.max(s - 0.25, MIN_SCALE))}\n onZoomSet={(s) => setScale(Math.min(MAX_SCALE, Math.max(MIN_SCALE, s)))}\n onDownload={() => bus.emit('action-download')}\n onFullScreen={toggleFullscreen}\n onSaveAs={() => bus.emit('action-download')}\n onOpenSettings={() => setIsSettingsOpen(true)}\n onOpenAbout={() => setIsAboutModalOpen(true)}\n onOpenSidebarTab={openSidebarTab}\n pageTransition={pageTransition}\n setPageTransition={setPageTransition}\n pageLayout={pageLayout}\n setPageLayout={setPageLayout}\n rotation={rotation}\n setRotation={setRotation}\n enableAnnotations={annotationsEnabled}\n enableSign={enableSign}\n plugins={plugins}\n permissions={effectivePermissions}\n />\n )}\n <div style={{ display: 'flex', flex: 1, minHeight: 0, overflow: 'hidden' }}>\n <DocumentViewer\n leftSidebarOpen={sidebars && leftSidebarOpen}\n rightSidebarOpen={sidebars && rightSidebarOpen}\n sidebarTab={sidebarTab}\n setSidebarTab={setSidebarTab}\n sidebars={sidebars}\n activeTab={activeTab}\n initialDoc={docUrl}\n loadNonce={loadNonce}\n withCredentials={withCredentials}\n assets={assets}\n redactions={redactions}\n regexRedactions={regexRedactions}\n scale={scale}\n setScale={setScale}\n onAnnotationsChange={handleAnnotationsChange}\n onRedactionsChange={handleRedactionsChange}\n onDocumentLoaded={handleDocumentLoaded}\n onLoadError={handleLoadError}\n onFirstPageRendered={handleFirstPageRendered}\n onPageChange={handlePageChange}\n pageTransition={pageTransition}\n pageLayout={pageLayout}\n rotation={rotation}\n setRotation={setRotation}\n watermark={watermark}\n watermarkText={watermarkText}\n enableAnnotations={annotationsEnabled}\n initialPage={initialPage}\n permissions={effectivePermissions}\n />\n </div>\n {isSettingsOpen && (\n <SettingsModal onClose={() => setIsSettingsOpen(false)} watermarkText={watermarkText} setWatermarkText={setWatermarkText} />\n )}\n {isAboutModalOpen && <AboutModal onClose={() => setIsAboutModalOpen(false)} />}\n </div>\n </ViewerBusContext.Provider>\n );\n});\n\nexport default TeamSyncViewer;\n","/**\n * © 2026 AngelBot Ai Pvt Ltd. All rights reserved.\n * Imperative entry point: mounts <TeamSyncViewer> into an element and resolves with the instance.\n */\nimport React from 'react';\nimport ReactDOM from 'react-dom/client';\nimport { TeamSyncViewer } from '../components/TeamSyncViewer';\nimport type { WebViewerInstance } from './ViewerInstance';\nimport type { WebViewerOptions } from './types';\n\nexport function createWebViewer(options: WebViewerOptions, viewerElement: HTMLElement): Promise<WebViewerInstance> {\n if (typeof window === 'undefined' || typeof document === 'undefined') {\n return Promise.reject(new Error('[teamsync-pdf-viewer] createWebViewer() requires a browser environment.'));\n }\n if (!viewerElement) {\n return Promise.reject(new Error('[teamsync-pdf-viewer] createWebViewer() needs a container element.'));\n }\n\n return new Promise((resolve) => {\n const root = ReactDOM.createRoot(viewerElement);\n const { path: _path, ...rest } = options;\n root.render(\n <TeamSyncViewer\n {...rest}\n style={{ width: '100%', height: '100%' }}\n onReady={(instance) => {\n instance._setUnmount(() => root.unmount());\n resolve(instance);\n }}\n />\n );\n });\n}\n\n/** @deprecated Use `createWebViewer`. Kept as an alias for drop-in compatibility. */\nexport const WebViewer = createWebViewer;\n"],"mappings":";;;;;;;;AAOA,IAAa,IAAmB,EAAgC,IAAI;;;ACApE,SAAgB,KAA0B;CACxC,IAAM,IAAM,EAAW,CAAgB;CACvC,IAAI,CAAC,GACH,MAAU,MAAM,4EAA4E;CAE9F,OAAO;AACT;AAMA,SAAgB,GAAyB,GAAc,GAAgC;CACrF,IAAM,IAAM,GAAa,GACnB,IAAM,EAAO,CAAQ;CAE3B,AADA,EAAI,UAAU,GACd,QAAgB,EAAI,GAAM,IAAO,MAAW,EAAI,QAAQ,CAAM,CAAC,GAAG,CAAC,GAAK,CAAI,CAAC;AAC/E;;;ACuBA,IAAM,KAAO,CACX,QAAQ,UACV;AAEA,SAAwB,GAAO,EAC7B,cAAW,iBACX,oBAAiB,uBACjB,qBAAkB,qBAAqB,GACvC,eACA,UAAO,aAAU,cAAW,cAC5B,eAAY,iBAAc,cAAU,mBAAgB,iBAAa,sBACjE,mBAAgB,sBAAmB,eAAY,kBAAe,cAAU,iBACxE,qBAAiB,GACjB,uBACA,iBAAa,IACb,aACA,mBACc;CACd,IAAM,IAAgB,MAAW,GAAQ,MAAK,MAAK,EAAE,MAAM,EAAE,GAAG,YAAY,CAAC,CAAC,SAAS,MAAM,CAAC,GACxF,KAAgB,OAAe,MAAQ,EAAQ,GAC/C,CAAC,IAAY,KAAiB,EAAS,EAAK,GAC5C,CAAC,GAAgB,KAAqB,EAAS,EAAK,GACpD,CAAC,GAAoB,KAAyB,EAAS,EAAK,GAC5D,CAAC,IAAY,MAAiB,EAAwB,KAAK,GAC3D,IAAU,EAAuB,IAAI,GACrC,KAAc,EAAuB,IAAI,GACzC,KAAkB,EAAuB,IAAI,GAC7C,KAAM,GAAa;CAsBzB,OApBA,GAAqC,wBAAwB,MAAM,GAAc,GAAG,QAAQ,IAAI,CAAC,GAEjG,QAAgB;EACd,SAAS,EAAmB,GAAmB;GAO7C,AANI,EAAQ,WAAW,CAAC,EAAQ,QAAQ,SAAS,EAAM,MAAc,KACnE,EAAc,EAAK,GAEjB,GAAY,WAAW,CAAC,GAAY,QAAQ,SAAS,EAAM,MAAc,KAC3E,EAAkB,EAAK,GAErB,GAAgB,WAAW,CAAC,GAAgB,QAAQ,SAAS,EAAM,MAAc,KACnF,EAAsB,EAAK;EAE/B;EAEA,OADA,SAAS,iBAAiB,aAAa,CAAkB,SAC5C;GACX,SAAS,oBAAoB,aAAa,CAAkB;EAC9D;CACF,GAAG,CAAC,CAAC,GAGH,kBAAC,OAAD;EAAK,OAAO;GACV,SAAS;GACT,eAAe;GACf,cAAc;GACd,iBAAiB;GACjB,OAAO;EACT;EACE,UAAA,kBAAC,OAAD;GAAK,OAAO;IACV,SAAS;IACT,YAAY;IACZ,gBAAgB;IAChB,QAAQ;IACR,SAAS;GACX;GANA,UAAA;IAQE,kBAAC,OAAD;KAAK,OAAO;MAAE,SAAS;MAAQ,YAAY;MAAU,KAAK;KAAM;KAAhE,UAAA;MACE,kBAAC,OAAD;OAAK,KAAK;OAAS,OAAO,EAAE,UAAU,WAAW;OAAjD,UAAA,CACE,kBAAC,GAAD;QAAY,MAAM,kBAAC,GAAD,EAAM,MAAM,GAAK,CAAA;QAAG,OAAM;QAAO,eAAe,EAAc,CAAC,EAAU;QAAG,QAAQ;OAAa,CAAA,GAClH,MACC,kBAAC,OAAD;QAAK,OAAO;SACV,UAAU;SAAY,KAAK;SAAQ,MAAM;SAAG,WAAW;SACvD,iBAAiB;SAAQ,cAAc;SAAO,WAAW;SACzD,OAAO;SAAS,QAAQ;SAAM,SAAS;SAAQ,eAAe;SAC9D,QAAQ;SAAiC,UAAU;QACrD;QALA,UAAA;SAME,kBAAC,GAAD;UAAY,MAAM,kBAAC,GAAD,EAAU,MAAM,GAAK,CAAA;UAAG,OAAM;UAAW,eAAe;WAAgB,AAAd,EAAW,GAAG,EAAc,EAAK;UAAG;SAAI,CAAA;SACpH,kBAAC,GAAD;UAAY,MAAM,kBAAC,GAAD,EAAU,MAAM,GAAK,CAAA;UAAG,OAAM;UAAoB,eAAe;WAAkB,AAAhB,EAAa,GAAG,EAAc,EAAK;UAAG;SAAI,CAAA;SAC/H,kBAAC,GAAD;UAAY,MAAM,kBAAC,IAAD,EAAM,MAAM,GAAK,CAAA;UAAG,OAAM;UAAU,eAAe;WAAc,AAAZ,GAAS,GAAG,EAAc,EAAK;UAAG;SAAI,CAAA;SAC7G,kBAAC,GAAD;UAAY,MAAM,kBAAC,GAAD,EAAS,MAAM,GAAK,CAAA;UAAG,OAAM;UAAQ,UAAA;SAAU,CAAA;SACjE,kBAAC,OAAD,EAAK,OAAO;UAAE,QAAQ;UAAO,iBAAiB;UAAuB,QAAQ;SAAQ,EAAI,CAAA;SACzF,kBAAC,GAAD;UAAY,MAAM,kBAAC,GAAD,EAAU,MAAM,GAAK,CAAA;UAAG,OAAM;UAAW,eAAe;WAAoB,AAAlB,EAAe,GAAG,EAAc,EAAK;UAAG;SAAI,CAAA;QACrH;OAEJ,CAAA,CAAA;;MACL,kBAAC,GAAD;OACE,MAAM,kBAAC,IAAD,EAAW,MAAM,GAAK,CAAA;OAC5B,OAAM;OACN,QAAQ;OACR,eAAe,EAAmB,CAAC,CAAe;MACnD,CAAA;MACD,kBAAC,OAAD,EAAK,OAAO;OAAE,OAAO;OAAO,QAAQ;OAAQ,iBAAiB;OAAuB,QAAQ;MAAQ,EAAI,CAAA;MACxG,kBAAC,OAAD;OAAK,KAAK;OAAiB,OAAO,EAAE,UAAU,WAAW;OAAzD,UAAA,CACE,kBAAC,OAAD;QAAK,OAAO,EAAE,UAAU,WAAW;QACjC,UAAA,kBAAC,GAAD;SACE,MACE,kBAAC,OAAD;UAAK,OAAO;WAAE,UAAU;WAAY,SAAS;WAAQ,YAAY;WAAU,gBAAgB;UAAS;UAApG,UAAA,CACE,kBAAC,GAAD,EAAU,MAAM,GAAK,CAAA,GACrB,kBAAC,OAAD;WAAK,OAAO;YAAE,UAAU;YAAY,OAAO;YAAQ,QAAQ;YAAQ,iBAAiB;YAAQ,cAAc;YAAO,SAAS;WAAM;WAC9H,UAAA,kBAAC,GAAD;YAAU,MAAM;YAAI,OAAM;WAAkB,CAAA;UACzC,CAAA,CACF;;SAEP,OAAM;SACN,QAAQ;SACR,eAAe,EAAsB,CAAC,CAAkB;QACzD,CAAA;OACE,CAAA,GACJ,KACC,kBAAC,OAAD;QAAK,OAAO;SACV,UAAU;SAAY,KAAK;SAAQ,MAAM;SAAG,WAAW;SACvD,iBAAiB;SAAQ,cAAc;SAAO,WAAW;SACzD,OAAO;SAAS,QAAQ;SAAM,SAAS;SAAQ,eAAe;SAC9D,QAAQ;SAAiC,UAAU;QACrD;QALA,UAAA;SAME,kBAAC,OAAD;UAAK,OAAO;WAAE,SAAS;WAAiB,UAAU;WAAQ,YAAY;WAAK,OAAO;UAAU;UAAG,UAAA;SAAoB,CAAA;SACnH,kBAAC,GAAD;UACE,MAAM,kBAAC,IAAD,EAAW,MAAM,GAAK,CAAA;UAC5B,OAAM;UACN,UAAU,MAAmB;UAC7B,eAAe;WAAmC,AAAjC,EAAkB,YAAY,GAAG,EAAsB,EAAK;UAAG;SACjF,CAAA;SACD,kBAAC,GAAD;UACE,MAAM,kBAAC,IAAD,EAAM,MAAM,GAAK,CAAA;UACvB,OAAM;UACN,UAAU,MAAmB;UAC7B,eAAe;WAAqC,AAAnC,EAAkB,cAAc,GAAG,EAAsB,EAAK;UAAG;SACnF,CAAA;SAED,kBAAC,OAAD,EAAK,OAAO;UAAE,QAAQ;UAAO,iBAAiB;UAAuB,QAAQ;SAAQ,EAAI,CAAA;SAEzF,kBAAC,OAAD;UAAK,OAAO;WAAE,SAAS;WAAiB,UAAU;WAAQ,YAAY;WAAK,OAAO;UAAU;UAAG,UAAA;SAAqB,CAAA;SACpH,kBAAC,GAAD;UACE,MAAM,kBAAC,GAAD,EAAU,MAAM,GAAK,CAAA;UAC3B,OAAM;UACN,eAAe;WAAsC,AAApC,IAAa,KAAW,MAAM,GAAG,GAAG,EAAsB,EAAK;UAAG;SACpF,CAAA;SACD,kBAAC,GAAD;UACE,MAAM,kBAAC,IAAD,EAAW,MAAM,GAAK,CAAA;UAC5B,OAAM;UACN,eAAe;WAA4C,AAA1C,IAAa,KAAW,KAAK,OAAO,GAAG,GAAG,EAAsB,EAAK;UAAG;SAC1F,CAAA;SAED,kBAAC,OAAD,EAAK,OAAO;UAAE,QAAQ;UAAO,iBAAiB;UAAuB,QAAQ;SAAQ,EAAI,CAAA;SAEzF,kBAAC,OAAD;UAAK,OAAO;WAAE,SAAS;WAAiB,UAAU;WAAQ,YAAY;WAAK,OAAO;UAAU;UAAG,UAAA;SAAgB,CAAA;SAC/G,kBAAC,GAAD;UACE,MAAM,kBAAC,IAAD,EAAM,MAAM,GAAK,CAAA;UACvB,OAAM;UACN,UAAU,MAAe;UACzB,eAAe;WAA2B,AAAzB,EAAc,QAAQ,GAAG,EAAsB,EAAK;UAAG;SACzE,CAAA;SACD,kBAAC,GAAD;UACE,MAAM,kBAAC,GAAD,EAAM,MAAM,GAAK,CAAA;UACvB,OAAM;UACN,UAAU,MAAe;UACzB,eAAe;WAA2B,AAAzB,EAAc,QAAQ,GAAG,EAAsB,EAAK;UAAG;SACzE,CAAA;SACD,kBAAC,GAAD;UACE,MAAM,kBAAC,GAAD,EAAU,MAAM,GAAK,CAAA;UAC3B,OAAM;UACN,UAAU,MAAe;UACzB,eAAe;WAAiC,AAA/B,EAAc,cAAc,GAAG,EAAsB,EAAK;UAAG;SAC/E,CAAA;SAED,kBAAC,OAAD,EAAK,OAAO;UAAE,QAAQ;UAAO,iBAAiB;UAAuB,QAAQ;SAAQ,EAAI,CAAA;SAEzF,kBAAC,GAAD;UACE,MAAM,kBAAC,GAAD,EAAQ,MAAM,GAAK,CAAA;UACzB,OAAM;UACN,eAAe;WAAkB,AAAhB,EAAa,GAAG,EAAsB,EAAK;UAAG;SAChE,CAAA;QACE;OAEJ,CAAA,CAAA;;MACL,kBAAC,OAAD;OAAK,OAAO;QAAE,SAAS;QAAQ,YAAY;QAAU,KAAK;OAAM;OAAhE,UAAA;QACE,kBAAC,OAAD;SAAK,KAAK;SAAa,OAAO;UAAE,UAAU;UAAY,SAAS;UAAQ,YAAY;SAAS;SAA5F,UAAA,CACE,kBAAC,OAAD;UAAK,OAAO;WACV,SAAS;WAAQ,YAAY;WAAU,iBAAiB;WACxD,cAAc;WAAO,QAAQ,IAAiB,6BAA6B;WAC3E,QAAQ;WAAW,YAAY;WAAQ,QAAQ;UACjD;UAJA,UAAA,CAKE,kBAAC,OAAD;WACE,eAAe,EAAkB,CAAC,CAAc;WAChD,OAAO;YACL,SAAS;YAAgB,UAAU;YAAQ,YAAY;YACvD,SAAS;YAAQ,YAAY;YAAU,QAAQ;WACjD;WALF,UAAA,CAOG,KAAK,MAAM,IAAQ,GAAG,GAAE,GACtB;UACL,CAAA,GAAA,kBAAC,OAAD;WACE,eAAe,EAAkB,CAAC,CAAc;WAChD,OAAO;YACL,SAAS;YAAS,SAAS;YAAQ,YAAY;YAAU,QAAQ;YACjE,YAAY;YAAqB,OAAO,IAAiB,mBAAmB;WAC9E;WAEC,UAAiB,EAAjB,IAAkB,IAA0B,GAA3B,EAAW,MAAM,GAAK,CAA4B;UACjE,CAAA,CACF;SAEJ,CAAA,GAAA,KACC,kBAAC,OAAD;UAAK,OAAO;WACV,UAAU;WAAY,KAAK;WAAQ,MAAM;WAAG,WAAW;WACvD,iBAAiB;WAAQ,cAAc;WAAO,WAAW;WACzD,OAAO;WAAS,QAAQ;WAAM,SAAS;WAAQ,eAAe;WAC9D,QAAQ;WAAiC,UAAU;WAAU,SAAS;UACxE;UALA,UAAA;WAME,kBAAC,GAAD;YAAY,MAAM,kBAAC,IAAD,EAAgB,MAAM,GAAK,CAAA;YAAG,OAAM;YAAe,eAAe;aAAmC,AAAjC,GAAI,KAAK,qBAAqB,GAAG,EAAkB,EAAK;YAAG;WAAI,CAAA;WACrJ,kBAAC,GAAD;YAAY,MAAM,kBAAC,IAAD,EAAW,MAAM,GAAK,CAAA;YAAG,OAAM;YAAc,eAAe;aAAkC,AAAhC,GAAI,KAAK,oBAAoB,GAAG,EAAkB,EAAK;YAAG;WAAI,CAAA;WAC9I,kBAAC,OAAD,EAAK,OAAO;YAAE,QAAQ;YAAO,iBAAiB;YAAuB,QAAQ;WAAQ,EAAI,CAAA;WACxF;YAAC;YAAK;YAAM;YAAK;YAAG;YAAM;YAAK;YAAG;YAAG;YAAG;YAAI;YAAI;WAAE,CAAC,CAAC,KAAI,MACvD,kBAAC,OAAD;YAEE,eAAe;aAAsC,AAAjC,KAAW,EAAU,CAAS,GAAG,EAAkB,EAAK;YAAG;YAC/E,OAAO;aACL,SAAS;aAAY,UAAU;aAAQ,QAAQ;aAC/C,iBAAiB,MAAU,IAAY,YAAY;YACrD;YACA,eAAe,MAAM,EAAE,cAAc,MAAM,kBAAkB;YAC7D,eAAe,MAAM,EAAE,cAAc,MAAM,kBAAkB,MAAU,IAAY,YAAY;YARjG,UAAA,CAUG,KAAK,MAAM,IAAY,GAAG,GAAE,GAC1B;WAVE,GAAA,CAUF,CACN;WACD,kBAAC,OAAD,EAAK,OAAO;YAAE,QAAQ;YAAO,iBAAiB;YAAuB,QAAQ;WAAQ,EAAI,CAAA;WACzF,kBAAC,GAAD;YAAY,MAAM,kBAAC,IAAD,EAAY,MAAM,GAAK,CAAA;YAAG,OAAM;YAAe,eAAe,EAAkB,EAAK;WAAI,CAAA;UACxG;SAEJ,CAAA,CAAA;;QACL,kBAAC,GAAD;SAAY,MAAM,kBAAC,IAAD;UAAa,MAAM;UAAI,OAAM;SAAqB,CAAA;SAAG,OAAM;SAAW,SAAS;QAAY,CAAA;QAC7G,kBAAC,GAAD;SAAY,MAAM,kBAAC,GAAD;UAAY,MAAM;UAAI,OAAM;SAAqB,CAAA;SAAG,OAAM;SAAU,SAAS;QAAW,CAAA;OACvG;;MACL,kBAAC,OAAD,EAAK,OAAO;OAAE,OAAO;OAAO,QAAQ;OAAQ,iBAAiB;OAAuB,QAAQ;MAAQ,EAAI,CAAA;MACxG,kBAAC,GAAD;OAAY,MAAM,kBAAC,IAAD,EAAM,MAAM,GAAK,CAAA;OAAG,OAAM;OAAW,QAAQ,OAAe;OAAO,eAAe,GAAI,KAAK,mBAAmB,EAAE,MAAM,MAAM,CAAC;MAAI,CAAA;KAChJ;;IAGL,kBAAC,OAAD;KAAK,OAAO;MAAE,SAAS;MAAQ,YAAY;MAAY,QAAQ;MAAQ,KAAK;KAAO;KAChF,UAAA,GAAK,QAAO,MAAS,MAAQ,cAAe,OAAsB,MAAS,IAAa,sBAAsB,EAAO,CAAC,CAAC,KAAI,MAC1H,kBAAC,OAAD;MAEE,eAAe,EAAa,CAAG;MAC/B,OAAO;OACL,UAAU;OACV,YAAY,MAAc,IAAM,MAAM;OACtC,OAAO,MAAc,IAAM,mBAAmB;OAC9C,QAAQ;OACR,QAAQ;OACR,SAAS;OACT,YAAY;OACZ,cAAc,MAAc,IAAM,6BAA6B;OAC/D,SAAS;MACX;MAEC,UAAA;KACE,GAfE,CAeF,CACN;IACE,CAAA;IAGL,kBAAC,OAAD;KAAK,OAAO;MAAE,SAAS;MAAQ,YAAY;MAAU,KAAK;KAAM;KAAhE,UAAA;MAGG,MACC,kBAAC,UAAD;OACE,eAAe,GAAI,KAAK,aAAa;OACrC,OAAO;QACL,YAAY;QAAW,QAAQ;QAAqB,OAAO;QAC3D,SAAS;QAAQ,YAAY;QAAU,gBAAgB;QAAU,KAAK;QACtE,QAAQ;QAAQ,SAAS;QAAU,cAAc;QAAO,QAAQ;QAChE,YAAY;QAAK,UAAU;OAC7B;OAPF,UAAA,CASE,kBAAC,IAAD;QAAK,MAAM;QAAI,OAAM;QAAU,MAAK;OAAW,CAAA,GAAC,MAE1C;;MAIT,KAAiB,KAChB,kBAAC,OAAD;OACE,eAAe,GAAI,KAAK,eAAe;OACvC,OAAO;QACL,iBAAiB;QAAW,OAAO;QACnC,cAAc;QAAQ,SAAS;QAC/B,SAAS;QAAQ,YAAY;QAAU,KAAK;QAC5C,QAAQ;QAAW,YAAY;QAAK,UAAU;OAChD;OACA,OAAM;OARR,UAAA;QAUE,kBAAC,IAAD,EAAa,MAAM,GAAK,CAAA;QAAC;QAAW;OACjC;;MAGP,kBAAC,OAAD,EAAK,OAAO;OAAE,OAAO;OAAO,QAAQ;OAAQ,iBAAiB;OAAuB,QAAQ;MAAQ,EAAI,CAAA;MAExG,kBAAC,GAAD;OACE,MAAM,kBAAC,IAAD,EAAM,MAAM,GAAK,CAAA;OACvB,OAAM;OACN,SAAS;MACV,CAAA;MAED,kBAAC,GAAD;OACE,MAAM,kBAAC,IAAD,EAAQ,MAAM,GAAK,CAAA;OACzB,OAAM;OACN,QAAQ,KAAoB,MAAe;OAC3C,eAAe,GAAiB,QAAQ;MACzC,CAAA;MACD,kBAAC,GAAD;OACE,MAAM,kBAAC,GAAD,EAAe,MAAM,GAAK,CAAA;OAChC,OAAM;OACN,QAAQ,KAAoB,MAAe;OAC3C,eAAe,GAAiB,UAAU;MAC3C,CAAA;KACE;;GACF;;CACF,CAAA;AAET;AAEA,SAAS,EAAW,EAAE,SAAM,YAAS,YAAS,IAAO,YAA4F;CAC/I,OACE,kBAAC,UAAD;EACS;EACE;EACT,OAAO;GACL,SAAS;GACT,YAAY;GACZ,gBAAgB;GAChB,OAAO;GACP,QAAQ;GACR,QAAQ;GACR,cAAc;GACd,iBAAiB,IAAS,YAAY;GACtC,OAAO,IAAS,mBAAmB;GACnC,QAAQ;GACR,SAAS;EACX;EACA,cAAc,MAAM;GAClB,AAAK,MAAQ,EAAE,cAAc,MAAM,kBAAkB;EACvD;EACA,aAAa,MAAM;GACjB,AAAK,MAAQ,EAAE,cAAc,MAAM,kBAAkB;EACvD;EAEC,UAAA;CACK,CAAA;AAEZ;AAEA,SAAS,EAAW,EAAE,SAAM,UAAO,YAAS,cAAW,IAAO,cAAW,MAAiH;CACxL,IAAM,CAAC,GAAS,KAAc,EAAS,EAAK;CAC5C,OACE,kBAAC,OAAD;EACE,SAAS,IAAW,KAAA,IAAY;EAChC,oBAAoB,EAAW,CAAC,CAAQ;EACxC,oBAAoB,EAAW,EAAK;EACpC,OAAO;GACL,SAAS;GAAQ,YAAY;GAAU,KAAK;GAAQ,SAAS;GAC7D,QAAQ,IAAW,YAAY;GAAW,OAAO,IAAW,SAAU,IAAW,SAAS;GAC1F,iBAAiB,IAAW,gBAAiB,IAAW,mBAAoB,IAAU,YAAY;GAClG,UAAU;EACZ;EATF,UAAA,CAWE,kBAAC,OAAD;GAAK,OAAO,EAAE,OAAO,IAAW,SAAU,IAAW,SAAS,oBAAqB;GAAI,UAAA;EAAU,CAAA,GACjG,kBAAC,QAAD,EAAA,UAAO,EAAY,CAAA,CAChB;;AAET;;;AC7YA,SAAwB,GAAsB,EAC5C,eACA,aACA,WACA,aACA,kBACA,oBACA,kBAC6B;CAC7B,IAAM,IAAS,GAAa,sBAAsB,IAC5C,IAAU,GAAa,uBAAuB,IAC9C,IAAY,GAAa,yBAAyB;CAKxD,OACE,kBAAC,OAAD;EACE,OAAO;GACL,UAAU;GACV,KAAK,GAAG,EAAS,IAAI;GACrB,MAAM,GAAG,EAAS,KAAK;GACvB,iBAAiB;GACjB,QAAQ;GACR,cAAc;GACd,WAAW;GACX,SAAS;GACT,YAAY;GACZ,SAAS;GACT,KAAK;GACL,QAAQ;GACR,WAAW;EACb;EACA,UAAU,MAAM,EAAE,gBAAgB;EAhBpC,UAAA;GAkBG,KACC,kBAAA,IAAA,EAAA,UAAA,CACE,kBAAC,GAAD;IAAY,MAAM,kBAAC,GAAD,EAAM,MAAM,GAAK,CAAA;IAAG,OAAM;IAAY,SAAS;GAAS,CAAA,GAC1E,kBAAC,OAAD,EAAK,OAAO;IAAE,OAAO;IAAO,QAAQ;IAAQ,iBAAiB;IAAW,QAAQ;GAAQ,EAAI,CAAA,CAC5F,EAAA,CAAA;GAGH,KACC,kBAAA,IAAA,EAAA,UAAA,CACE,kBAAC,OAAD;IAAK,OAAO;KAAE,SAAS;KAAQ,YAAY;KAAU,KAAK;KAAO,SAAS;IAAQ;IAC/E,UAAA;KA/BK;KAAW;KAAW;KAAW;KAAW;KAAW;IA+B5D,CAAA,CAAO,KAAI,MACV,kBAAC,OAAD;KAEE,eAAe,EAAc,CAAC;KAC9B,OAAO;MACL,OAAO;MACP,QAAQ;MACR,cAAc;MACd,iBAAiB;MACjB,QAAQ;MACR,QAAQ,EAAW,UAAU,IAAI,sBAAsB;KACzD;KACA,OAAO,aAAa;IACrB,GAXM,CAWN,CACF;GACE,CAAA,GACL,kBAAC,OAAD,EAAK,OAAO;IAAE,OAAO;IAAO,QAAQ;IAAQ,iBAAiB;IAAW,QAAQ;GAAQ,EAAI,CAAA,CAC5F,EAAA,CAAA;GAGH,MACC,EAAW,SAAS,SAClB,kBAAC,UAAD;IACE,OAAO,EAAW,UAAU,cAAc,EAAW,QAAQ,KAAK;IAClE,SAAS;IACT,OAAO;KACL,SAAS;KACT,YAAY;KACZ,KAAK;KACL,QAAQ;KACR,cAAc;KACd,QAAQ;KACR,iBAAiB;KACjB,QAAQ;KACR,OAAO;KACP,SAAS;KACT,UAAU;KACV,YAAY;IACd;IACA,eAAe,MAAM,EAAE,cAAc,MAAM,kBAAkB;IAC7D,eAAe,MAAM,EAAE,cAAc,MAAM,kBAAkB;IAlB/D,UAAA,CAoBE,kBAAC,GAAD,EAAO,MAAM,GAAK,CAAA,GAAC,WAEb;GAER,CAAA,IAAA,kBAAC,GAAD;IAAY,MAAM,kBAAC,GAAD,EAAU,MAAM,GAAK,CAAA;IAAG,OAAM;IAAmB,SAAS;GAAkB,CAAA;GAIjG,KACC,kBAAC,GAAD;IAAY,MAAM,kBAAC,IAAD,EAAQ,MAAM,GAAK,CAAA;IAAG,OAAM;IAAS,SAAS;IAAU,OAAM;GAAW,CAAA;EAE1F;;AAET;AAEA,SAAS,EAAW,EAAE,SAAM,UAAO,YAAS,WAAQ,aAA4F;CAC9I,OACE,kBAAC,UAAD;EACS;EACE;EACT,OAAO;GACL,SAAS;GACT,YAAY;GACZ,gBAAgB;GAChB,OAAO;GACP,QAAQ;GACR,cAAc;GACd,QAAQ;GACR,iBAAiB;GACjB,QAAQ;GACD;EACT;EACA,eAAe,MAAM,EAAE,cAAc,MAAM,kBAAkB;EAC7D,eAAe,MAAM,EAAE,cAAc,MAAM,kBAAkB;EAE5D,UAAA;CACK,CAAA;AAEZ;;;AClIA,SAAwB,GAAgB,EAAE,gBAAa,IAAI,iBAAc,IAAI,mBAAgB,IAAO,YAAS,aAAgC;CAC3I,IAAM,IAAgB,EAAW,WAAW,QAAQ,GAC9C,CAAC,GAAW,KAAgB,EAAyB,IAAgB,SAAS,KAAK,GACnF,CAAC,GAAK,KAAU,EAAS,IAAgB,KAAK,CAAU,GACxD,CAAC,GAAM,KAAW,EAAS,IAAgB,EAAW,QAAQ,UAAU,EAAE,IAAI,GAAG,GACjF,CAAC,GAAM,KAAW,EAAS,CAAW,GAEtC,IAAiB,MAAc,QAAQ,CAAC,EAAI,KAAK,IAAI,CAAC,EAAK,KAAK,GAEhE,UAAmB;EACvB,IAAI,GAAgB;EACpB,IAAM,IAAW,MAAc,SAAS,SAAS,MAAS;EAC1D,AAAI,IACF,EAAO,GAAU,EAAK,KAAK,KAAK,CAAQ,IAExC,EAAO,CAAQ;CAEnB;CAEA,OACE,kBAAC,OAAD;EAAK,OAAO;GACV,UAAU;GAAS,KAAK;GAAG,MAAM;GAAG,OAAO;GAAG,QAAQ;GACtD,iBAAiB;GAAmB,SAAS;GAAQ,YAAY;GAAU,gBAAgB;GAC3F,QAAQ;EACV;EACE,UAAA,kBAAC,OAAD;GAAK,OAAO;IACV,iBAAiB;IACjB,OAAO;IACP,cAAc;IACd,OAAO;IACP,WAAW;IACX,YAAY;IACZ,UAAU;IACV,SAAS;IACT,eAAe;GACjB;GAVA,UAAA;IAYE,kBAAC,OAAD;KAAK,OAAO;MACV,SAAS;MAAQ,cAAc;MAC/B,SAAS;MAAQ,YAAY;MAAU,gBAAgB;KACzD;KAHA,UAAA,CAIE,kBAAC,MAAD;MAAI,OAAO;OAAE,QAAQ;OAAG,UAAU;OAAQ,YAAY;MAAI;MAAG,UAAA;KAAuB,CAAA,GACpF,kBAAC,UAAD;MACE,SAAS;MACT,OAAO;OAAE,YAAY;OAAQ,QAAQ;OAAQ,QAAQ;OAAW,OAAO;MAAU;MAEjF,UAAA,kBAAC,GAAD,EAAG,MAAM,GAAK,CAAA;KACR,CAAA,CACL;;IAGL,kBAAC,OAAD;KAAK,OAAO,EAAE,SAAS,OAAO;KAA9B,UAAA;MAEE,kBAAC,OAAD;OAAK,OAAO;QAAE,SAAS;QAAQ,QAAQ;QAAqB,cAAc;QAAO,UAAU;QAAU,cAAc;OAAO;OAA1H,UAAA,CACE,kBAAC,OAAD;QACE,eAAe,EAAa,KAAK;QACjC,OAAO;SAAE,MAAM;SAAG,WAAW;SAAU,SAAS;SAAO,iBAAiB,MAAc,QAAQ,YAAY;SAAQ,OAAO,MAAc,QAAQ,SAAS;SAAW,YAAY;SAAK,UAAU;SAAQ,QAAQ;QAAU;QAAG,UAAA;OAExN,CAAA,GACL,kBAAC,OAAD;QACE,eAAe,EAAa,MAAM;QAClC,OAAO;SAAE,MAAM;SAAG,WAAW;SAAU,SAAS;SAAO,iBAAiB,MAAc,SAAS,YAAY;SAAQ,OAAO,MAAc,SAAS,SAAS;SAAW,YAAY;SAAK,UAAU;SAAQ,QAAQ;QAAU;QAAG,UAAA;OAE1N,CAAA,CACF;;MAGJ,MAAc,QACb,kBAAC,OAAD;OAAK,OAAO,EAAE,cAAc,IAAgB,SAAS,IAAI;OAAzD,UAAA,CACE,kBAAC,SAAD;QAAO,OAAO;SAAE,SAAS;SAAS,cAAc;SAAO,UAAU;SAAQ,YAAY;SAAK,OAAO;QAAU;QAA3G,UAAA,CAA8G,cAClG,kBAAC,QAAD;SAAM,OAAO,EAAE,OAAO,UAAU;SAAG,UAAA;QAAO,CAAA,CAC/C;OACP,CAAA,GAAA,kBAAC,SAAD;QACE,MAAK;QACL,OAAO;QACP,WAAW,MAAM,EAAO,EAAE,OAAO,KAAK;QACtC,aAAY;QACZ,OAAO;SACL,OAAO;SAAQ,SAAS;SAAQ,WAAW;SAC3C,QAAQ,aAAc,EAAI,KAAK,IAAgB,YAAZ;SAAyB,cAAc;SAAO,UAAU;QAC7F;QACA,YAAY,MAAM;SAChB,AAAI,EAAE,QAAQ,WAAS,EAAW;QACpC;QACA,WAAA;OACD,CAAA,CACE;MAEL,CAAA,IAAA,kBAAC,OAAD;OAAK,OAAO,EAAE,cAAc,IAAgB,SAAS,IAAI;OAAzD,UAAA,CACE,kBAAC,SAAD;QAAO,OAAO;SAAE,SAAS;SAAS,cAAc;SAAO,UAAU;SAAQ,YAAY;SAAK,OAAO;QAAU;QAA3G,UAAA,CAA8G,sBAC1F,kBAAC,QAAD;SAAM,OAAO,EAAE,OAAO,UAAU;SAAG,UAAA;QAAO,CAAA,CACvD;OACP,CAAA,GAAA,kBAAC,SAAD;QACE,MAAK;QACL,OAAO;QACP,KAAI;QACJ,WAAW,MAAM,EAAQ,EAAE,OAAO,KAAK;QACvC,aAAY;QACZ,OAAO;SACL,OAAO;SAAQ,SAAS;SAAQ,WAAW;SAC3C,QAAQ,aAAc,EAAK,KAAK,IAAgB,YAAZ;SAAyB,cAAc;SAAO,UAAU;QAC9F;QACA,YAAY,MAAM;SAChB,AAAI,EAAE,QAAQ,WAAS,EAAW;QACpC;QACA,WAAA;OACD,CAAA,CACE;;MAIN,KACC,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,SAAD;OAAO,OAAO;QAAE,SAAS;QAAS,cAAc;QAAO,UAAU;QAAQ,YAAY;QAAK,OAAO;OAAU;OAA3G,UAAA,CAA8G,oBAC5F,kBAAC,QAAD;QAAM,OAAO;SAAE,OAAO;SAAW,YAAY;SAAK,UAAU;QAAO;QAAG,UAAA;OAAuC,CAAA,CACxH;MACP,CAAA,GAAA,kBAAC,SAAD;OACE,MAAK;OACL,OAAO;OACP,WAAW,MAAM,EAAQ,EAAE,OAAO,KAAK;OACvC,aAAa,MAAc,QAAQ,KAAO,iBAAiB,QAAQ;OACnE,OAAO;QACL,OAAO;QAAQ,SAAS;QAAQ,WAAW;QAC3C,QAAQ;QAAqB,cAAc;QAAO,UAAU;OAC9D;OACA,YAAY,MAAM;QAChB,AAAI,EAAE,QAAQ,WAAS,EAAW;OACpC;MACD,CAAA,CACE,EAAA,CAAA;KAEJ;;IAGL,kBAAC,OAAD;KAAK,OAAO;MAAE,SAAS;MAAQ,WAAW;MAAqB,SAAS;MAAQ,gBAAgB;MAAY,iBAAiB;KAAU;KACrI,UAAA,kBAAC,UAAD;MACE,SAAS;MACT,UAAU;MACV,OAAO;OACL,iBAAiB,IAAiB,YAAY;OAAW,OAAO;OAAQ,QAAQ;OAAQ,cAAc;OACtG,SAAS;OAAY,UAAU;OAAQ,YAAY;OAAK,QAAQ,IAAiB,gBAAgB;MACnG;MACD,UAAA;KAEO,CAAA;IACL,CAAA;GACF;;CACF,CAAA;AAET;;;ACrJA,IAAM,KAAgC;CACpC;EAAE,QAAQ;EAAa,aAAa;EAAiC,gBAAgB;EAAgB,SAAS;CAAe;CAC7H;EAAE,QAAQ;EAAc,aAAa;EAAwC,gBAAgB;EAAgB,SAAS;CAAe;CACrI;EAAE,QAAQ;EAAQ,aAAa;EAAqC,gBAAgB;EAAU,SAAS;CAAS;CAChH;EAAE,QAAQ;EAAS,aAAa;EAA6B,gBAAgB;EAAU,SAAS;CAAS;CACzG;EAAE,QAAQ;EAAQ,aAAa;EAA6B,gBAAgB;EAAU,SAAS;CAAS;CACxG;EAAE,QAAQ;EAAQ,aAAa;EAA6B,gBAAgB;EAAgB,SAAS;CAAe;CACpH;EAAE,QAAQ;EAAe,aAAa;EAAwB,gBAAgB;EAAU,SAAS;CAAS;CAC1G;EAAE,QAAQ;EAAU,aAAa;EAA2B,gBAAgB;EAAU,SAAS;CAAS;CACxG;EAAE,QAAQ;EAAU,aAAa;EAA8B,gBAAgB;EAAU,SAAS;CAAS;AAC7G;AAEA,SAAgB,KAAe;CAC7B,IAAM,CAAC,GAAW,KAAgB,EAAqB,CAAC,CAAC;CAgCzD,OA9BA,QAAgB;EACd,IAAM,IAAQ,aAAa,QAAQ,qBAAqB;EACxD,IAAI,GACF,IAAI;GACF,IAAM,IAAS,KAAK,MAAM,CAAK,GAEzB,IAAS,GAAkB,KAAI,MAAO;IAC1C,IAAM,IAAQ,EAAO,MAAM,MAAgB,EAAE,WAAW,EAAI,MAAM;IAClE,OAAO,IAAQ;KAAE,GAAG;KAAK,SAAS,EAAM;IAAQ,IAAI;GACtD,CAAC;GACD,EAAa,CAAM;EACrB,QAAQ;GACN,EAAa,EAAiB;EAChC;OAEA,EAAa,EAAiB;CAElC,GAAG,CAAC,CAAC,GAaE;EAAE;EAAW,iBAXI,GAAoB,MAAuB;GACjE,IAAM,IAAU,EAAU,KAAI,MAAK,EAAE,WAAW,IAAS;IAAE,GAAG;IAAG,SAAS;GAAW,IAAI,CAAC;GAE1F,AADA,EAAa,CAAO,GACpB,aAAa,QAAQ,uBAAuB,KAAK,UAAU,CAAO,CAAC;EACrE;EAOoC,aALhB,MAAuB;GACzC,IAAM,IAAI,EAAU,MAAK,MAAK,EAAE,WAAW,CAAM;GACjD,OAAO,IAAI,EAAE,UAAU;EACzB;CAE+C;AACjD;AAGA,SAAgB,GAAc,GAAkB,GAAgC;CAC9E,IAAI,CAAC,GAAe,OAAO;CAE3B,IAAM,IAAQ,EAAc,YAAY,CAAC,CAAC,MAAM,GAAG,GAC7C,IAAY,EAAM,SAAS,MAAM,KAAK,EAAM,SAAS,KAAK,KAAK,EAAM,SAAS,MAAM,GACpF,IAAa,EAAM,SAAS,OAAO,GACnC,IAAW,EAAM,SAAS,KAAK;CAMrC,IAFI,OAFkB,EAAE,WAAW,EAAE,YAGjC,MAAe,EAAE,YACjB,MAAa,EAAE,QAAQ,OAAO;CAElC,IAAM,IAAM,EAAM,EAAM,SAAS;CAMjC,OAHI,MAAQ,aAAa,EAAE,QAAQ,YAAY,EAAE,QAAQ,gBACrD,EAAE,IAAI,YAAY,MAAM;AAG9B;;;AC7DA,SAAgB,GAAa,GAA0C,IAA0B,CAAC,GAAG;CACnG,IAAM,CAAC,GAAa,KAAkB,EAAS,EAAK,GAC9C,CAAC,GAAe,KAAoB,EAAyB,CAAC,CAAC,GAC/D,CAAC,GAAgB,KAAqB,EAAS,CAAC;CAsKtD,OAAO;EAAE,QApKM,EAAY,OAAO,MAAkB;GAClD,IAAI,CAAC,KAAU,CAAC,EAAM,KAAK,GAAG;IAC5B,EAAiB,CAAC,CAAC;IACnB;GACF;GAGA,AADA,EAAe,EAAI,GACnB,EAAkB,CAAC;GACnB,IAAM,IAA0B,CAAC,GAC3B,IAAa,EAAM,YAAY;GAErC,IAAI;IACF,IAAM,IAAW,EAAO;IAIxB,KAAK,IAAI,IAAa,GAAG,KAAc,GAAU,KAAc,IAAW;KACxE,IAAM,IAAgB,CAAC,GACjB,IAAW,KAAK,IAAI,IAAa,KAAY,GAAG,CAAQ;KAE9D,KAAK,IAAI,IAAU,GAAY,KAAW,GAAU,KAClD,EAAc,MACX,YAAY;MACX,IAAM,IAAO,MAAM,EAAO,QAAQ,CAAO,GAIrC,KAAQ,MAHc,EAAK,eAAe,EAAA,CAGtB;MACxB,IAAI,KAAc,EAAW,SAAS,GAAG;OACvC,IAAM,IAAiB,EAAW,QAAO,MAAK,EAAE,cAAc,CAAO;OACrE,IAAI,EAAe,SAAS,GAAG;QAC7B,IAAM,IAAK,EAAK,YAAY,EAAE,OAAO,EAAE,CAAC;QACxC,IAAQ,EAAM,QAAQ,MAAc;SAClC,IAAI,CAAC,EAAK,OAAO,EAAK,IAAI,KAAK,MAAM,IAAI,OAAO;SAEhD,IAAM,IAAQ,EAAK,UAAU,IACvB,IAAQ,EAAK,UAAU,IACvB,IAAQ,EAAK,OACb,IAAQ,EAAK,UAAU,KAAK,IAAI,EAAK,UAAU,EAAE,GACjD,IAAW,EAAG,SAAS,IAAQ;SAErC,KAAK,IAAM,KAAO,GAAgB;UAChC,IAAM,IAAa,KAAK,IAAI,GAAO,EAAI,CAAC,IAAI,KAAK,IAAI,IAAQ,GAAO,EAAI,IAAI,EAAI,KAAK,GAC/E,IAAa,KAAK,IAAI,GAAU,EAAI,CAAC,IAAI,KAAK,IAAI,IAAW,GAAO,EAAI,IAAI,EAAI,MAAM;UAE5F,IAAI,KAAc,GAChB,OAAO;SAEX;SACA,OAAO;QACT,CAAC;OACH;MACF;MAEA,IAAI,IAAW,IACT,IAAwB,CAAC,GACzB,IAAwB,CAAC;MAE/B,EAAM,SAAS,GAAM,MAAU;OAC7B,IAAM,IAAM,EAAK;OACjB,KAAK,IAAI,IAAI,GAAG,IAAI,EAAI,QAAQ,KAE9B,AADA,EAAY,KAAK,CAAK,GACtB,EAAY,KAAK,CAAC;OAIpB,AAFA,KAAY,GAER,EAAK,UACP,KAAY,MACZ,EAAY,KAAK,EAAE,GACnB,EAAY,KAAK,EAAE,MAEnB,KAAY,KACZ,EAAY,KAAK,EAAE,GACnB,EAAY,KAAK,EAAE;MAEvB,CAAC;MAED,IAAM,IAAgB,EAAS,YAAY,GACvC,IAAa,GACX,IAA8B,CAAC;MAErC,QAAQ,IAAa,EAAc,QAAQ,GAAY,CAAU,OAAO,KAAI;OAE1E,IAAM,IAAe,KAAK,IAAI,GAAG,IAAa,EAAE,GAC1C,IAAa,KAAK,IAAI,EAAS,QAAQ,IAAa,EAAM,SAAS,EAAE,GACvE,IAAU,EAAS,UAAU,GAAc,CAAU;OACzD,IAAU,EAAQ,QAAQ,OAAO,GAAG;OAGpC,IAAM,oBAAc,IAAI,IAA0C;OAClE,KAAK,IAAI,IAAI,GAAY,IAAI,IAAa,EAAM,QAAQ,KAAK;QAC3D,IAAM,IAAU,EAAY,IACtB,IAAU,EAAY;QAC5B,IAAI,MAAY,KAAA,KAAa,MAAY,IAAI;SAC3C,IAAM,IAAW,EAAY,IAAI,CAAO;SACxC,AAAI,KACF,EAAS,MAAM,KAAK,IAAI,EAAS,KAAK,CAAO,GAC7C,EAAS,MAAM,KAAK,IAAI,EAAS,KAAK,CAAO,KAE7C,EAAY,IAAI,GAAS;UAAE,KAAK;UAAS,KAAK;SAAQ,CAAC;QAE3D;OACF;OAEA,IAAM,IAAyB,CAAC;OAgChC,AA9BA,EAAY,SAAS,GAAO,MAAc;QACxC,IAAM,IAAO,EAAM;QACnB,IAAI,CAAC,KAAQ,CAAC,EAAK,WAAW;QAE9B,IAAM,IAAI,EAAK,UAAU,IACnB,IAAI,EAAK,UAAU,IACnB,IAAQ,EAAK,OACb,IAAS,EAAK,UAAU,KAAK,IAAI,EAAK,UAAU,EAAE,GAClD,IAAS,EAAK,IAAI;QAExB,IAAI,IAAS,GAAG;SAEd,IAAM,IAAY,IAAQ,GACpB,IAAS,IAAK,EAAM,MAAM,GAC1B,KAAc,EAAM,MAAM,EAAM,MAAM,KAAK;SACjD,EAAO,KAAK;UAAE,GAAG;UAAQ;UAAG,OAAO;UAAY;SAAO,CAAC;QACzD,OACE,EAAO,KAAK;SAAE;SAAG;SAAG;SAAO;QAAO,CAAC;OAEvC,CAAC,GAED,EAAY,KAAK;QACf,IAAI,IAAI,EAAQ,MAAM;QACtB,WAAW;QACX;QACA,iBAAiB,IAAa;QAC9B,aAAa,EAAM;QACnB;OACF,CAAC,GAED,KAAc,EAAM;MACtB;MAEA,OADA,EAAK,QAAQ,GACN;KACT,EAAA,CAAG,CACL;KAWF,CAPA,MADgC,QAAQ,IAAI,CAAa,EAAA,CACvC,SAAQ,MAAe,EAAQ,KAAK,GAAG,CAAW,CAAC,GAGrE,EAAQ,MAAM,GAAG,MAAM,EAAE,cAAc,EAAE,YAAwC,EAAE,kBAAkB,EAAE,kBAAlD,EAAE,YAAY,EAAE,SAAiD,GAEtH,EAAkB,KAAK,MAAO,IAAW,IAAY,GAAG,CAAC,GAEzD,MAAM,IAAI,SAAQ,MAAW,WAAW,GAAS,EAAE,CAAC;IACtD;IAEA,EAAiB,CAAO;GAC1B,SAAS,GAAO;IACd,QAAQ,MAAM,iBAAiB,CAAK;GACtC,UAAU;IAER,AADA,EAAe,EAAK,GACpB,EAAkB,GAAG;GACvB;EACF,GAAG,CAAC,GAAQ,CAAU,CAEb;EAAQ;EAAe;EAAa;EAAgB,mBAAmB,EAAiB,CAAC,CAAC;CAAE;AACvG;;;ACzKA,SAAwB,GAAQ,EAC9B,WAAQ,gBAAa,mBAAgB,yBAAsB,4BAC3D,aAAU,kBAAe,gBAAa,mBAAgB,kBACtD,cAAW,mBACI;CACf,IAAM,CAAC,GAAa,KAAkB,EAAS,EAAE,GAC3C,CAAC,GAAc,MAAmB,EAAS,GAAG,GAC9C,CAAC,GAAY,KAAiB,EAAS,EAAK,GAC5C,IAAiB,EAAyB,IAAI;CAgCpD,AA9BA,QAAgB;EACd,IAAM,KAAmB,MAAkB;GACzC,IAAI,CAAC,GAAY;GACjB,IAAM,IAAW,KAAK,IAAI,KAAK,IAAI,EAAE,SAAS,GAAG,GAAG,GAAG;GACvD,GAAgB,CAAQ;EAC1B,GACM,UAAsB,EAAc,EAAK;EAW/C,OATI,KACF,SAAS,KAAK,MAAM,SAAS,cAC7B,SAAS,KAAK,MAAM,aAAa,QACjC,OAAO,iBAAiB,aAAa,CAAe,GACpD,OAAO,iBAAiB,WAAW,CAAa,MAEhD,SAAS,KAAK,MAAM,SAAS,IAC7B,SAAS,KAAK,MAAM,aAAa,WAEtB;GAEX,AADA,OAAO,oBAAoB,aAAa,CAAe,GACvD,OAAO,oBAAoB,WAAW,CAAa;EACrD;CACF,GAAG,CAAC,CAAU,CAAC,GAEf,QAAgB;EACd,IAAM,IAAU,iBAAiB;GAC/B,EAAS,CAAW;EACtB,GAAG,GAAG;EACN,aAAa,aAAa,CAAO;CACnC,GAAG,CAAC,GAAa,CAAQ,CAAC,GAE1B,GAAY,6BAA6B;EACvC,AAAI,EAAe,YACjB,EAAe,QAAQ,MAAM,GAC7B,EAAe,QAAQ,OAAO;CAElC,CAAC;CAED,IAAM,KAAW,EAAY,QAAO,MAAK;EAAC;EAAQ;EAAW;EAAQ;CAAM,CAAC,CAAC,SAAS,EAAE,IAAI,CAAC,GAEvF,KAAgB,MAAe;EAEnC,AADA,EAAe,EAAY,QAAO,MAAK,EAAE,OAAO,CAAE,CAAC,GAC/C,MAAyB,KAAI,EAAwB,IAAI;CAC/D;CAEA,OACE,kBAAC,OAAD;EAAK,OAAO;GACV,OAAO,IAAS,GAAG,EAAa,MAAM;GACtC,QAAQ;GACR,iBAAiB;GACjB,SAAS;GACT,YAAY;GACZ,QAAQ;GACR,YAAY,IAAa,SAAS;GAClC,UAAU;EACZ;EATA,UAAA,CAWE,kBAAC,OAAD;GAAK,OAAO;IACV,OAAO,GAAG,EAAa;IACvB,QAAQ;IACR,SAAS;IACT,eAAe;IACf,UAAU;GACZ;GANA,UAAA,CAOE,kBAAC,OAAD;IAAK,OAAO;KACV,SAAS;KACT,cAAc;KACd,iBAAiB;KACjB,SAAS;KACT,eAAe;KACf,KAAK;KACL,YAAY;IACd;IARA,UAAA,CASA,kBAAC,OAAD;KAAK,OAAO;MAAE,SAAS;MAAQ,KAAK;KAAO;KAA3C,UAAA,CACE,kBAAC,UAAD;MACE,eAAe,EAAa,QAAQ;MACpC,OAAO;OACL,YAAY;OAAQ,QAAQ;OAAQ,SAAS;OAAS,QAAQ;OAAW,UAAU;OACnF,YAAY,MAAc,WAAW,MAAM;OAAK,OAAO,MAAc,WAAW,mBAAmB;OACnG,cAAc,MAAc,WAAW,6BAA6B;MACtE;MACD,UAAA;KAEO,CAAA,GACR,kBAAC,UAAD;MACE,eAAe,EAAa,UAAU;MACtC,OAAO;OACL,YAAY;OAAQ,QAAQ;OAAQ,SAAS;OAAS,QAAQ;OAAW,UAAU;OACnF,YAAY,MAAc,aAAa,MAAM;OAAK,OAAO,MAAc,aAAa,mBAAmB;OACvG,cAAc,MAAc,aAAa,6BAA6B;MACxE;MACD,UAAA;KAEO,CAAA,CACL;IAEJ,CAAA,GAAA,MAAc,YACb,kBAAC,OAAD;KAAK,OAAO;MAAE,UAAU;MAAY,cAAc;KAAO;KAAzD,UAAA;MACE,kBAAC,IAAD;OAAQ,MAAM;OAAI,OAAM;OAAU,OAAO;QAAE,UAAU;QAAY,MAAM;QAAQ,KAAK;OAAO;MAAI,CAAA;MAC/F,kBAAC,SAAD;OACE,KAAK;OACL,MAAK;OACL,aAAY;OACZ,OAAO;OACP,WAAU,MAAK,EAAe,EAAE,OAAO,KAAK;OAC5C,OAAO;QACL,OAAO;QAAQ,SAAS;QAAY,QAAQ;QAAiC,cAAc;QAAO,UAAU;QAAQ,SAAS;OAC/H;MACD,CAAA;MACA,KACC,kBAAC,UAAD;OACE,eAAe,EAAe,EAAE;OAChC,OAAO;QAAE,UAAU;QAAY,OAAO;QAAQ,KAAK;QAAO,WAAW;QAAoB,YAAY;QAAQ,QAAQ;QAAQ,QAAQ;QAAW,SAAS;QAAG,OAAO;OAAoB;OAEvL,UAAA,kBAAC,GAAD,EAAG,MAAM,GAAK,CAAA;MACR,CAAA;KAEP;IAEJ,CAAA,CAAA;GAEL,CAAA,GAAA,kBAAC,OAAD;IAAK,OAAO;KAAE,MAAM;KAAG,WAAW;KAAQ,SAAS;KAAQ,SAAS;KAAQ,eAAe;KAAU,KAAK;IAAM;IAAhH,UAAA,CAEG,MAAc,cACb,kBAAA,IAAA,EAAA,UAAA,CACG,GAAS,WAAW,KACnB,kBAAC,OAAD;KAAK,OAAO;MAAE,OAAO;MAAqB,UAAU;MAAQ,WAAW;MAAU,WAAW;KAAO;KAAG,UAAA;IAEjG,CAAA,GAEN,GAAS,KAAI,MACZ,kBAAC,OAAD;KAEE,eAAe,EAAwB,EAAQ,EAAE;KACrD,OAAO;MACL,SAAS;MACT,iBAAiB;MACjB,QAAQ,MAAyB,EAAQ,KAAK,6BAA6B;MAC3E,cAAc;MACd,QAAQ;MACR,WAAW;KACb;KAVE,UAAA,CAYF,kBAAC,OAAD;MAAK,OAAO;OAAE,SAAS;OAAQ,gBAAgB;OAAiB,YAAY;OAAU,cAAc;MAAM;MAA1G,UAAA,CACE,kBAAC,OAAD;OAAK,OAAO;QAAE,SAAS;QAAQ,YAAY;QAAU,KAAK;QAAO,OAAO;OAAoB;OAA5F,UAAA;QACG,EAAQ,SAAS,UAAU,kBAAC,GAAD,EAAe,MAAM,GAAK,CAAA;QACrD,EAAQ,SAAS,aAAa,kBAAC,GAAD,EAAe,MAAM,GAAK,CAAA;QACxD,EAAQ,SAAS,UAAU,kBAAC,IAAD,EAAM,MAAM,GAAK,CAAA;QAC5C,EAAQ,SAAS,UAAU,kBAAC,GAAD,EAAU,MAAM,GAAK,CAAA;QACjD,kBAAC,QAAD;SAAM,OAAO;UAAE,UAAU;UAAQ,eAAe;SAAa;SAAI,UAAA,EAAQ;QAAW,CAAA;OACjF;MACL,CAAA,GAAA,kBAAC,UAAD;OACE,UAAU,MAAM;QAAuB,AAArB,EAAE,gBAAgB,GAAG,EAAa,EAAQ,EAAE;OAAG;OACjE,OAAO;QAAE,YAAY;QAAQ,QAAQ;QAAQ,OAAO;QAAW,QAAQ;QAAW,SAAS;OAAM;OACjG,OAAM;OAEN,UAAA,kBAAC,IAAD,EAAQ,MAAM,GAAK,CAAA;MACb,CAAA,CACL;KAEL,CAAA,GAAA,kBAAC,OAAD;MAAK,OAAO;OAAE,UAAU;OAAQ,OAAO;OAAqB,YAAY;OAAY,WAAW;MAAa;MACzG,UAAA,EAAQ,SAAS,SAChB,kBAAC,KAAD;OAAG,MAAM,EAAQ;OAAS,QAAO;OAAS,KAAI;OAAsB,OAAO;QAAE,OAAO;QAAkB,gBAAgB;OAAO;OAC1H,UAAA,EAAQ,WAAW,kBAAC,QAAD;QAAM,OAAO;SAAE,WAAW;SAAU,OAAO;QAAoB;QAAG,UAAA;OAAgB,CAAA;MACrG,CAAA,IAEH,EAAQ,QAAQ,kBAAC,QAAD;OAAM,OAAO;QAAE,WAAW;QAAU,OAAO;OAAoB;OAAG,UAAA;MAAmB,CAAA;KAEpG,CAAA,CACF;IArCM,GAAA,EAAQ,EAqCd,CACJ,CACC,EAAA,CAAA,GAGH,MAAc,YACb,kBAAA,IAAA,EAAA,UAAA;KACG,KACC,kBAAC,OAAD;MAAK,OAAO;OAAE,UAAU;OAAQ,OAAO;OAAqB,WAAW;OAAU,WAAW;MAAO;MAAnG,UAAA;OAAsG;OACtF;OAAe;MAC1B;;KAEN,CAAC,KAAe,KAAe,EAAc,WAAW,KACvD,kBAAC,OAAD;MAAK,OAAO;OAAE,UAAU;OAAQ,OAAO;OAAqB,WAAW;OAAU,WAAW;MAAO;MAAG,UAAA;KAEjG,CAAA;KAEN,CAAC,KAAe,EAAc,SAAS,KACtC,kBAAC,OAAD;MAAK,OAAO;OAAE,UAAU;OAAQ,OAAO;OAAqB,cAAc;MAAM;MAAhF,UAAA,CACG,EAAc,QAAO,gBACnB;;KAIN,CAAC,KAAe,MAAM,KAAK,IAAI,IAAI,EAAc,KAAI,MAAK,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,KAAI,MAAW;MACvF,IAAM,IAAc,EAAc,QAAO,MAAK,EAAE,cAAc,CAAO;MACrE,OACE,kBAAC,OAAD;OAA6B,OAAO,EAAE,cAAc,OAAO;OAA3D,UAAA,CACE,kBAAC,OAAD;QAAK,OAAO;SAAE,UAAU;SAAQ,OAAO;SAAqB,cAAc;QAAM;QAAhF,UAAA,CAAmF,SAAM,CAAa;OACtG,CAAA,GAAA,kBAAC,OAAD;QAAK,OAAO;SAAE,SAAS;SAAQ,eAAe;SAAU,KAAK;QAAM;QAChE,UAAA,EAAY,KAAI,MACf,kBAAC,OAAD;SAEE,eAAe,EAAc,CAAM;SACnC,OAAO;UACL,SAAS;UACT,iBAAiB;UACjB,QAAQ;UACR,cAAc;UACd,QAAQ;UACR,UAAU;UACV,OAAO;SACT;SAXF,UAAA;UAaG,EAAO,QAAQ,UAAU,GAAG,EAAO,eAAe;UACnD,kBAAC,QAAD;WAAM,OAAO;YAAE,YAAY;YAAK,OAAO;WAAiB;WACrD,UAAA,EAAO,QAAQ,UAAU,EAAO,iBAAiB,EAAO,kBAAkB,EAAO,WAAW;UACzF,CAAA;UACL,EAAO,QAAQ,UAAU,EAAO,kBAAkB,EAAO,WAAW;SAClE;QAjBE,GAAA,EAAO,EAiBT,CACN;OACE,CAAA,CACF;MAzBK,GAAA,QAAQ,GAyBb;KAET,CAAC;IACD,EAAA,CAAA,CAGD;GAEA,CAAA,CAAA;EAGJ,CAAA,GAAA,KACC,kBAAC,OAAD;GACE,mBAAmB,EAAc,EAAI;GACrC,OAAO;IACL,UAAU;IACV,KAAK;IACL,OAAO;IACP,OAAO;IACP,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,SAAS;IACT,YAAY;IACZ,gBAAgB;IAChB,iBAAiB;GACnB;GAdF,UAAA,CAiBE,kBAAC,OAAD;IAAK,OAAO;KACV,OAAO;KACP,QAAQ;KACR,iBAAiB;KACjB,QAAQ;KACR,cAAc;KACd,SAAS;KACT,YAAY;KACZ,gBAAgB;KAChB,KAAK;KACL,WAAW;IACb;IAXA,UAAA,CAYE,kBAAC,OAAD,EAAK,OAAO;KAAE,OAAO;KAAO,QAAQ;KAAQ,iBAAiB;IAAU,EAAI,CAAA,GAC3E,kBAAC,OAAD,EAAK,OAAO;KAAE,OAAO;KAAO,QAAQ;KAAQ,iBAAiB;IAAU,EAAI,CAAA,CACxE;GACL,CAAA,GAAA,kBAAC,OAAD,EAAK,OAAO;IAAE,UAAU;IAAY,KAAK;IAAG,OAAO;IAAG,OAAO;IAAO,QAAQ;IAAQ,iBAAiB;IAAuB,QAAQ;GAAG,EAAI,CAAA,CACxI;EAEJ,CAAA,CAAA;;AAET;;;AChSA,IAAM,MAAa,EAAE,WAAQ,cAAW,aAAU,YAAS,eAA4B;CACrF,IAAM,IAAe,EAAuB,IAAI,GAC1C,IAAY,EAA0B,IAAI,GAC1C,CAAC,GAAW,KAAgB,EAAS,EAAK,GAC1C,CAAC,GAAa,KAAkB,EAAiB,GAAI;CAgB3D,AAbA,QAAgB;EACd,IAAM,IAAW,IAAI,sBAAsB,MAAY;GACrD,AAAI,EAAQ,EAAE,CAAC,iBACb,EAAa,EAAI,IAEjB,EAAa,EAAK;EAEtB,GAAG,EAAE,YAAY,QAAQ,CAAC;EAG1B,OADI,EAAa,WAAS,EAAS,QAAQ,EAAa,OAAO,SAClD,EAAS,WAAW;CACnC,GAAG,CAAC,CAAC,GAEL,QAAgB;EACd,IAAI,CAAC,GAAW;EAEhB,IAAI,IAAkB,MAClB,IAAc;EAwClB,QAFA,YApC+B;GAC7B,IAAI;IACF,IAAM,IAAO,MAAM,EAAO,QAAQ,CAAS;IAC3C,IAAI,GAAa;IAGjB,IAAM,IAAK,EAAK,YAAY,EAAE,OAAO,EAAE,CAAC;IACxC,EAAe,EAAG,QAAQ,EAAG,MAAM;IAEnC,IAAM,IAAW,EAAK,YAAY,EAAE,SAAM,CAAC,GACrC,IAAS,EAAU;IACzB,IAAI,CAAC,GAAQ;IAEb,IAAM,IAAM,EAAO,WAAW,IAAI;IAClC,IAAI,CAAC,GAAK;IAEV,IAAM,IAAc,OAAO,oBAAoB;IAY/C,AAXA,EAAO,QAAQ,KAAK,MAAM,EAAS,QAAQ,CAAW,GACtD,EAAO,SAAS,KAAK,MAAM,EAAS,SAAS,CAAW,GACxD,EAAO,MAAM,QAAQ,GAAG,EAAS,MAAM,KACvC,EAAO,MAAM,SAAS,GAAG,EAAS,OAAO,KAEzC,IAAa,EAAK,OAAO;KACvB,eAAe;KACP;KACR,WAAW;MAAC;MAAa;MAAG;MAAG;MAAa;MAAG;KAAC;KACtC;IACZ,CAAC,GACD,MAAM,EAAW;GACnB,SAAS,GAAQ;IACf,AAAI,EAAE,SAAS,iCACb,QAAQ,MAAM,0BAA0B,CAAC;GAE7C;EACF,EAEA,CAAW,SAEE;GAEX,AADA,IAAc,IACV,KACF,EAAW,OAAO;EAEtB;CACF,GAAG;EAAC;EAAQ;EAAW;EAAO;CAAS,CAAC;CAGxC,IAAM,IAAiB,MAAM,GACvB,IAAkB,IAAiB;CAEzC,OACE,kBAAC,OAAD;EACE,KAAK;EACI;EACT,OAAO;GACL,SAAS;GAAQ,eAAe;GAAU,YAAY;GAAU,QAAQ;GACxE,SAAS;GAAO,WAAW;GAC3B,WAAW,GAAG,IAAkB,GAAG;EACrC;EAPF,UAAA,CASG,IACC,kBAAC,OAAD;GAAK,OAAO;IACV,QAAQ,IAAW,6BAA6B;IAChD,SAAS;IAAO,iBAAiB;IACjC,WAAW;GACb;GACE,UAAA,kBAAC,UAAD;IAAQ,KAAK;IAAW,OAAO;KAAE,SAAS;KAAS,iBAAiB;IAAO;GAAI,CAAA;EAC5E,CAAA,IAEL,kBAAC,OAAD,EAAK,OAAO;GACV,OAAO,GAAG,EAAe;GAAK,QAAQ,GAAG,EAAgB;GACzD,iBAAiB;GAAW,QAAQ;EACtC,EAAI,CAAA,GAEN,kBAAC,QAAD;GAAM,OAAO;IAAE,WAAW;IAAO,UAAU;IAAQ,OAAO,IAAW,mBAAmB;IAAQ,YAAY,IAAW,SAAS;GAAS;GACtI,UAAA;EACG,CAAA,CACH;;AAET;AASA,SAAwB,GAAY,EAAE,WAAQ,WAAQ,YAAS,iBAAgC;CAC7F,IAAM,CAAC,GAAW,KAAgB,EAAiD,YAAY,GACzF,CAAC,GAAc,KAAmB,EAAS,GAAG,GAC9C,CAAC,GAAY,KAAiB,EAAS,EAAK,GAG5C,CAAC,GAAa,KAAkB,EAAS,EAAE,GAG3C,IAAa,KAAO,IAAc,MAAO;CAE/C,QAAgB;EACd,IAAM,KAAmB,MAAkB;GACzC,IAAI,CAAC,GAAY;GACjB,IAAM,IAAW,KAAK,IAAI,KAAK,IAAI,EAAE,SAAS,GAAG,GAAG,GAAG;GACvD,EAAgB,CAAQ;EAC1B,GACM,UAAsB,EAAc,EAAK;EAW/C,OATI,KACF,SAAS,KAAK,MAAM,SAAS,cAC7B,SAAS,KAAK,MAAM,aAAa,QACjC,OAAO,iBAAiB,aAAa,CAAe,GACpD,OAAO,iBAAiB,WAAW,CAAa,MAEhD,SAAS,KAAK,MAAM,SAAS,IAC7B,SAAS,KAAK,MAAM,aAAa,WAEtB;GAEX,AADA,OAAO,oBAAoB,aAAa,CAAe,GACvD,OAAO,oBAAoB,WAAW,CAAa;EACrD;CACF,GAAG,CAAC,CAAU,CAAC;CAEf,IAAM,IAAW,IAAS,EAAO,WAAW,GAGtC,KAAa,MAAM,KAAK,EAAE,QAAQ,EAAS,IAAI,GAAG,MAAM,IAAI,CAAC;CAEnE,OACE,kBAAC,OAAD;EAAK,OAAO;GACV,OAAO,IAAS,GAAG,EAAa,MAAM;GACtC,QAAQ;GACR,iBAAiB;GACjB,SAAS;GACT,YAAY;GACZ,QAAQ;GACR,YAAY,IAAa,SAAS;GAClC,UAAU;GACV,aAAa,IAAS,kCAAkC;EAC1D;EAVA,UAAA,CAWE,kBAAC,OAAD;GAAK,OAAO;IACV,OAAO,GAAG,EAAa;IACvB,QAAQ;IACR,SAAS;IACT,eAAe;IACf,UAAU;GACZ;GANA,UAAA;IAQE,kBAAC,OAAD;KAAK,OAAO;MACV,SAAS;MAAQ,cAAc;MAAiC,iBAAiB;MAAQ,SAAS;KACpG;KAFA,UAAA;MAGE,kBAAC,UAAD;OACE,eAAe,EAAa,YAAY;OACxC,OAAO;QAAE,MAAM;QAAG,SAAS;QAAO,YAAY,MAAc,eAAe,mBAAmB;QAAQ,OAAO,MAAc,eAAe,SAAS;QAAqB,QAAQ;QAAQ,cAAc;QAAO,QAAQ;QAAW,SAAS;QAAQ,gBAAgB;OAAS;OAC1Q,OAAM;OAEN,UAAA,kBAAC,GAAD,EAAM,MAAM,GAAK,CAAA;MACX,CAAA;MACR,kBAAC,UAAD;OACE,eAAe,EAAa,SAAS;OACrC,OAAO;QAAE,MAAM;QAAG,SAAS;QAAO,YAAY,MAAc,YAAY,mBAAmB;QAAQ,OAAO,MAAc,YAAY,SAAS;QAAqB,QAAQ;QAAQ,cAAc;QAAO,QAAQ;QAAW,SAAS;QAAQ,gBAAgB;OAAS;OACpQ,OAAM;OAEN,UAAA,kBAAC,GAAD,EAAM,MAAM,GAAK,CAAA;MACX,CAAA;MACR,kBAAC,UAAD;OACE,eAAe,EAAa,WAAW;OACvC,OAAO;QAAE,MAAM;QAAG,SAAS;QAAO,YAAY,MAAc,cAAc,mBAAmB;QAAQ,OAAO,MAAc,cAAc,SAAS;QAAqB,QAAQ;QAAQ,cAAc;QAAO,QAAQ;QAAW,SAAS;QAAQ,gBAAgB;OAAS;OACxQ,OAAM;OAEN,UAAA,kBAAC,GAAD,EAAU,MAAM,GAAK,CAAA;MACf,CAAA;MACR,kBAAC,UAAD;OACE,OAAO;QAAE,MAAM;QAAG,SAAS;QAAO,YAAY;QAAQ,OAAO;QAAqB,QAAQ;QAAQ,cAAc;QAAO,QAAQ;QAAW,SAAS;QAAQ,gBAAgB;OAAS;OACpL,OAAM;OAEN,UAAA,kBAAC,IAAD,EAAgB,MAAM,GAAK,CAAA;MACrB,CAAA;KACL;;IAEJ,MAAc,gBACb,kBAAA,IAAA,EAAA,UAAA;KAEE,kBAAC,OAAD;MAAK,OAAO;OAAE,SAAS;OAAQ,YAAY;OAAU,SAAS;OAAa,KAAK;OAAO,cAAc;OAAiC,iBAAiB;MAAO;MAA9J,UAAA;OACE,kBAAC,IAAD;QAAO,MAAM;QAAI,OAAM;QAAoB,OAAO,EAAE,QAAQ,UAAU;QAAG,eAAe,EAAe,KAAK,IAAI,GAAG,IAAc,EAAE,CAAC;OAAI,CAAA;OACxI,kBAAC,SAAD;QACE,MAAK;QACL,KAAI;QAAI,KAAI;QACZ,OAAO;QACP,WAAW,MAAM,EAAe,SAAS,EAAE,OAAO,KAAK,CAAC;QACxD,OAAO;SAAE,MAAM;SAAG,QAAQ;SAAO,aAAa;QAAiB;OAChE,CAAA;OACD,kBAAC,IAAD;QAAM,MAAM;QAAI,OAAM;QAAoB,OAAO,EAAE,QAAQ,UAAU;QAAG,eAAe,EAAe,KAAK,IAAI,KAAK,IAAc,EAAE,CAAC;OAAI,CAAA;MACtI;;KAGL,kBAAC,OAAD;MAAK,OAAO;OAAE,MAAM;OAAG,WAAW;OAAQ,SAAS;OAAS,iBAAiB;MAAU;MAAvF,UAAA,CACG,KAAU,GAAW,KAAI,MACxB,kBAAC,IAAD;OAEU;OACR,WAAW;OACX,UAAU,MAAM;OAChB,eAAe,EAAW,CAAC;OAC3B,OAAO;MACR,GANM,CAMN,CACF,GACA,CAAC,KACA,kBAAC,OAAD;OAAK,OAAO;QAAE,SAAS;QAAQ,WAAW;QAAU,OAAO;QAAQ,UAAU;OAAO;OAAG,UAAA;MAElF,CAAA,CAEJ;;KAGL,kBAAC,OAAD;MAAK,OAAO;OAAE,WAAW;OAAiC,SAAS;OAAQ,iBAAiB;MAAO;MAAnG,UAAA,CACE,kBAAC,OAAD;OAAK,OAAO;QAAE,UAAU;QAAQ,OAAO;QAAqB,cAAc;OAAM;OAAG,UAAA;MAE9E,CAAA,GACL,kBAAC,OAAD;OAAK,OAAO;QAAE,SAAS;QAAQ,KAAK;OAAM;OAA1C,UAAA,CACE,kBAAC,SAAD;QACE,MAAK;QACL,aAAY;QACZ,OAAO;SAAE,MAAM;SAAG,SAAS;SAAW,UAAU;SAAQ,QAAQ;SAAkB,cAAc;SAAO,SAAS;QAAO;OACxH,CAAA,GACD,kBAAC,UAAD;QAAQ,OAAO;SAAE,SAAS;SAAW,YAAY;SAAQ,QAAQ;SAAkB,cAAc;SAAO,QAAQ;SAAW,SAAS;SAAQ,YAAY;QAAS;QAC/J,UAAA,kBAAC,GAAD;SAAa,MAAM;SAAI,OAAM;QAAqB,CAAA;OAC5C,CAAA,CACL;MACF,CAAA,CAAA;;IACL,EAAA,CAAA;IAGH,MAAc,gBACb,kBAAC,OAAD;KAAK,OAAO;MAAE,SAAS;MAAQ,WAAW;MAAU,OAAO;MAAQ,UAAU;KAAO;KAApF,UAAA;MAAuF;MAC3D;MAAU;KACjC;;GAEJ;EAGL,CAAA,GAAA,kBAAC,OAAD;GACE,mBAAmB,EAAc,EAAI;GACrC,OAAO;IACL,OAAO;IACP,QAAQ;IACR,UAAU;IACV,OAAO;IACP,QAAQ;IACR,QAAQ;GACV;EACD,CAAA,CACE;;AAET;;;AC/RA,SAAgB,GAAmB,GAAc,GAAc,GAAkB,GAAa,GAAa;CACzG,IAAM,KAAY,IAAW,MAAO,OAAO;CAU3C,OATI,MAAY,KACP;EAAE,GAAG;EAAM,GAAG,IAAM;CAAK,IAE9B,MAAY,MACP;EAAE,GAAG,IAAM;EAAM,GAAG,IAAM;CAAK,IAEpC,MAAY,MACP;EAAE,GAAG,IAAM;EAAM,GAAG;CAAK,IAE3B;EAAE,GAAG;EAAM,GAAG;CAAK;AAC5B;AAKA,SAAgB,GAAiB,GAAa,GAAa,GAAkB,GAAa,GAAa;CACrG,IAAM,KAAY,IAAW,MAAO,OAAO;CAU3C,OATI,MAAY,KACP;EAAE,GAAG,IAAM;EAAK,GAAG;CAAI,IAE5B,MAAY,MACP;EAAE,GAAG,IAAM;EAAK,GAAG,IAAM;CAAI,IAElC,MAAY,MACP;EAAE,GAAG;EAAK,GAAG,IAAM;CAAI,IAEzB;EAAE,GAAG;EAAK,GAAG;CAAI;AAC1B;AAKA,SAAgB,GAAqB,GAAW,GAAW,GAAe,GAAgB,GAAkB,GAAa,GAAa;CACpI,IAAM,KAAY,IAAW,MAAO,OAAO;CAU3C,OATI,MAAY,KACP;EAAE,GAAG,KAAO,IAAI;EAAS,GAAG;EAAG,OAAO;EAAQ,QAAQ;CAAM,IAEjE,MAAY,MACP;EAAE,GAAG,KAAO,IAAI;EAAQ,GAAG,KAAO,IAAI;EAAS;EAAO;CAAO,IAElE,MAAY,MACP;EAAE,GAAG;EAAG,GAAG,KAAO,IAAI;EAAQ,OAAO;EAAQ,QAAQ;CAAM,IAE7D;EAAE;EAAG;EAAG;EAAO;CAAO;AAC/B;AAKA,SAAgB,GAAqB,GAAkB,GAAa,GAAiC;CACnG,IAAM,KAAY,IAAW,MAAO,OAAO;CAC3C,IAAI,MAAY,IAAI,OAAO,aAAa,EAAI;CAC5C,IAAI,MAAY,KAAK,OAAO,aAAa,EAAI,IAAI,EAAI;CACrD,IAAI,MAAY,KAAK,OAAO,gBAAgB,EAAI;AAElD;AAGA,SAAgB,GAAkB,GAA0B;CAC1D,QAAS,IAAW,MAAO,OAAO;AACpC;;;ACrBA,SAAS,GAAsB,EAC7B,YAAS,WAAQ,UAAO,aAAU,gBAAgB,GAAiB,iBAAiB,GACpF,WAAW,GAAY,YAAY,GAAa,YAAS,cAAW,GAAG,kBAAe,mBACtF,cAAW,eAAY,iBAAa,yBAAsB,uBAC1D,gBAAa,iBAAa,cAAW,uBAAmB,4BAAwB,sBAChF,cAAW,mBAAe,eAAY,wBAAoB,iBACtC;CACpB,IAAM,IAAgB,EAAO,CAAU;CACvC,EAAc,UAAU;CACxB,IAAM,IAAY,EAA0B,IAAI,GAC1C,KAAe,EAAuB,IAAI,GAC1C,IAAgB,EAAY,IAAI,GAChC,IAAe,EAAqC,IAAI,GACxD,CAAC,GAAa,MAAkB,EAAc,IAAI,GAElD,KAAc,IAAgB,GAC9B,KAAe,IAAiB;CA6LtC,AA1LA,QAAgB;EACd,IAAI,IAAc,IACd,IAAa;EA0HjB,IAAQ,WAAW,YAxHc;GAC3B,OAAC,EAAU,WAAW,CAAC,IAC3B;IAAI,EAAc,WAChB,EAAc,QAAQ,OAAO;IAG/B,IAAI;KACF,IAAM,IAAO,MAAM,EAAO,QAAQ,CAAO;KACzC,IAAI,GAAa;KAEjB,IAAI,IAAc,OAAO,oBAAoB,GAEvC,IAAW,EAAK,YAAY;MAAE,OAAO,IAAQ;MAAa,UAAU,GAAkB,EAAK,SAAS,CAAQ;KAAE,CAAC,GAE/G,IAAa,SAAS,cAAc,QAAQ;KAElD,AADA,EAAW,QAAQ,KAAK,MAAM,EAAS,KAAK,GAC5C,EAAW,SAAS,KAAK,MAAM,EAAS,MAAM;KAC9C,IAAM,IAAM,EAAW,WAAW,IAAI;KACtC,IAAI,CAAC,KAAO,GAAa;KAUzB,IARA,EAAc,UAAU,EAAK,OAAO;MAClC,eAAe;MACf,QAAQ;MACE;KACZ,CAAC,GACD,MAAM,EAAc,QAAQ,SAGxB,KAAc,EAAW,SAAS,GAAG;MAEvC,AADA,EAAI,KAAK,GACT,EAAI,aAAa,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;MACjC,IAAM,IAAM,IAAW,OAAQ,IAAI,IAAgB,GAC7C,IAAM,IAAW,OAAQ,IAAI,IAAiB;MAEpD,KAAK,IAAM,KAAa,GACtB,IAAI,EAAU,cAAc,GAAS;OACnC,IAAM,IAAU,GAAqB,EAAU,GAAG,EAAU,GAAG,EAAU,OAAO,EAAU,QAAQ,GAAU,GAAK,CAAG,GAC9G,IAAK,EAAQ,IAAI,IAAQ,GACzB,IAAK,EAAQ,IAAI,IAAQ,GACzB,IAAK,EAAQ,QAAQ,IAAQ,GAC7B,IAAK,EAAQ,SAAS,IAAQ;OAEpC,AAAI,EAAU,WAAW,aAAa,EAAU,WAAW,KAAA,KACzD,EAAI,YAAY,WAChB,EAAI,SAAS,KAAK,MAAM,CAAE,GAAG,KAAK,MAAM,CAAE,GAAG,KAAK,KAAK,CAAE,GAAG,KAAK,KAAK,CAAE,CAAC,MAEzE,EAAI,YAAY,uBAChB,EAAI,SAAS,KAAK,MAAM,CAAE,GAAG,KAAK,MAAM,CAAE,GAAG,KAAK,KAAK,CAAE,GAAG,KAAK,KAAK,CAAE,CAAC,GACzE,EAAI,YAAY,IAAI,GACpB,EAAI,cAAc,WAClB,EAAI,WAAW,KAAK,MAAM,CAAE,GAAG,KAAK,MAAM,CAAE,GAAG,KAAK,KAAK,CAAE,GAAG,KAAK,KAAK,CAAE,CAAC;MAE/E;MAEF,EAAI,QAAQ;KACd;KAGA,IAAM,IAAK,MAAc,KAAgB;MAAE,MAAM;MAAe,SAAS;MAAM,MAAM;MAAI,MAAM;MAAS,OAAO;KAAU,IAAI,KAAA;KAC7H,IAAI,KAAM,EAAG,MAAM;MAEjB,AADA,EAAI,KAAK,GACT,EAAI,aAAa,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;MAEjC,IAAM,IAAU,EAAG,WAAW,KACxB,IAAO,EAAG,QAAQ,SAClB,IAAc,MAAS,WAAW,KAAK,IACvC,KAAQ,EAAG,QAAQ,KAAe,IAAQ,GAC1C,IAAO,EAAG;MAMhB,AAJA,EAAI,YAAY,EAAG,SAAS,WAC5B,EAAI,cAAc,GAClB,EAAI,OAAO,OAAO,EAAK,gBACvB,EAAI,YAAY,UAChB,EAAI,eAAe;MAEnB,IAAM,IAAU,EAAW,OACrB,IAAU,EAAW;MAE3B,IAAI,MAAS,UAGX,AAFA,EAAI,UAAU,IAAU,GAAG,IAAU,CAAC,GACtC,EAAI,OAAO,CAAC,KAAK,KAAK,CAAC,GACvB,EAAI,SAAS,GAAM,GAAG,CAAC;WAClB;OACL,IAAM,IAAQ,IAAO,EAAK,SAAS,KAAM,MAAM,IAAQ,GACjD,IAAQ,MAAM,IAAQ,GACtB,IAAO,KAAK,KAAK,IAAU,IAAU,IAAU,CAAO;OAG5D,AADA,EAAI,UAAU,IAAU,GAAG,IAAU,CAAC,GACtC,EAAI,OAAO,CAAC,KAAK,KAAK,CAAC;OAEvB,KAAK,IAAI,IAAI,CAAC,GAAM,IAAI,GAAM,KAAK,GAAO;QACxC,IAAM,IAAa,KAAK,IAAI,IAAI,CAAK,IAAI,KAAM,IAAQ;QACvD,KAAK,IAAI,IAAI,CAAC,GAAM,IAAI,GAAM,KAAK,GACjC,EAAI,SAAS,GAAM,IAAI,GAAW,CAAC;OAEvC;MACF;MACA,EAAI,QAAQ;KACd;KAGA,IAAM,IAAa,EAAU;KAC7B,IAAI,KAAc,CAAC,GAAa;MAE9B,AADA,EAAW,QAAQ,EAAW,OAC9B,EAAW,SAAS,EAAW;MAC/B,IAAM,IAAU,EAAW,WAAW,IAAI;MAI1C,AAHI,KACF,EAAQ,UAAU,GAAY,GAAG,CAAC,GAEpC,EAAc,UAAU,CAAO;KACjC;IACF,SAAS,GAAU;KACjB,AAAI,GAAK,SAAS,iCAChB,QAAQ,MAAM,QAAQ,EAAQ,kBAAkB,CAAG;IAEvD;GAhH+B;EAiHjC,GAIiC,EAAE;EAEnC,IAAM,IAAoB,EAAc,SAClC,IAAmB,EAAa;EAEtC,aAAa;GAGX,IAFA,IAAc,IACV,KAAO,aAAa,CAAK,GACzB,GACF,IAAI;IAAE,EAAkB,OAAO;GAAG,QAAQ,CAAC;GAE7C,IAAI,GACF,IAAI;IAAE,EAAiB,QAAQ;GAAG,QAAQ,CAAC;EAE/C;CACF,GAAG;EAAC;EAAS;EAAQ;EAAO;EAAU;EAAa;EAAc;EAAW;EAAe;CAAU,CAAC,GAGtG,QAAgB;EACd,IAAI,IAAc;EAuClB,QADA,YArC8B;GAC5B,IAAI;IAEF,IAAM,IAAO,OAAM,MADA,EAAO,QAAQ,CAAO,EAAA,CACjB,eAAe;IAGvC,IAAI,KAAc,EAAW,SAAS,GAAG;KACvC,IAAM,IAAiB,EAAW,QAAO,MAAK,EAAE,cAAc,CAAO;KACrE,AAAI,EAAe,SAAS,MAE1B,EAAK,QAAQ,EAAK,MAAM,QAAQ,MAAc;MAC5C,IAAI,EAAK,IAAI,KAAK,MAAM,IAAI,OAAO;MAInC,IAAM,IAAQ,EAAK,UAAU,IACvB,IAAQ,EAAK,UAAU,IACvB,IAAQ,EAAK,OACb,IAAQ,EAAK;MAEnB,KAAK,IAAM,KAAO,GAAgB;OAEhC,IAAM,IAAa,KAAK,IAAI,GAAO,EAAI,CAAC,IAAI,KAAK,IAAI,IAAQ,GAAO,EAAI,IAAI,EAAI,KAAK,GAC/E,IAAa,KAAK,IAAI,GAAO,EAAI,CAAC,IAAI,KAAK,IAAI,IAAQ,GAAO,EAAI,IAAI,EAAI,MAAM;OAEtF,IAAI,KAAc,GAChB,OAAO;MAEX;MACA,OAAO;KACT,CAAC;IAEL;IAEA,AAAK,KAAa,GAAe,CAAI;GACvC,QAAQ,CAAC;EACX,EACA,CAAU,SACG;GAAE,IAAc;EAAM;CACrC,GAAG;EAAC;EAAQ;EAAS;CAAU,CAAC,GAGhC,QAAgB;EACd,IAAM,IAAY,GAAa;EAC3B,CAAC,KAAe,CAAC,MA0CrB,YAzC+B;GAC7B,IAAI;IACF,IAAM,IAAO,MAAM,EAAO,QAAQ,CAAO,GACnC,IAAW,EAAK,YAAY;KAAE,OAAO;KAAG,UAAU,GAAkB,EAAK,SAAS,CAAQ;IAAE,CAAC,GAE/F,IAAuB;IAC3B,IAAI,KAAc,EAAW,SAAS,GAAG;KACvC,IAAM,IAAiB,EAAW,QAAO,MAAK,EAAE,cAAc,CAAO;KACrE,IAAI,EAAe,SAAS,GAAG;MAC7B,IAAM,IAAgB,EAAY,MAAM,QAAQ,MAAc;OAC5D,IAAI,CAAC,EAAK,OAAO,EAAK,IAAI,KAAK,MAAM,IAAI,OAAO;OAChD,IAAM,IAAQ,EAAK,UAAU,IACvB,IAAQ,EAAK,UAAU,IACvB,IAAQ,EAAK,OACb,IAAQ,EAAK,UAAU,KAAK,IAAI,EAAK,UAAU,EAAE,GACjD,IAAW,EAAS,SAAS,IAAQ;OAE3C,KAAK,IAAM,KAAO,GAAgB;QAChC,IAAM,IAAa,KAAK,IAAI,GAAO,EAAI,CAAC,IAAI,KAAK,IAAI,IAAQ,GAAO,EAAI,IAAI,EAAI,KAAK,GAC/E,IAAa,KAAK,IAAI,GAAU,EAAI,CAAC,IAAI,KAAK,IAAI,IAAW,GAAO,EAAI,IAAI,EAAI,MAAM;QAC5F,IAAI,KAAc,GAChB,OAAO;OAEX;OACA,OAAO;MACT,CAAC;MACD,IAAuB;OAAE,GAAG;OAAa,OAAO;MAAc;KAChE;IACF;IAQA,AANA,EAAU,YAAY,IAMtB,MAAM,IALgB,GAAS,UAAU;KACvC,mBAAmB;KACR;KACD;IACZ,CACM,CAAA,CAAU,OAAO;GACzB,SAAS,GAAG;IACV,QAAQ,MAAM,4BAA4B,CAAC;GAC7C;EACF,EACA,CAAW;CACb,GAAG;EAAC;EAAa;EAAQ;EAAS;EAAU;CAAU,CAAC;CACvD,IAAM,KAAkB,GAAY,QAAO,MAAK,EAAE,cAAc,CAAO;CAEvE,OACE,kBAAC,OAAD;EACE,IAAI,YAAY;EAChB,WAAU;EACV,eAAe;GAAE,AAAI,MAAe,QAAM,GAAiB;EAAG;EAC9D,OAAO;GACL,UAAU;GACV,KAAK,GAAG,EAAQ;GAChB,MAAM,MAAa,KAAA,IAA8B,QAAlB,GAAG,EAAS;GAC3C,OAAO,GAAG,GAAY;GACtB,QAAQ,GAAG,GAAa;GACxB,iBAAiB;GACjB,WAAW;GACX,cAAc;EAChB;EAbF,UAAA;GAeE,kBAAC,UAAD;IAAQ,KAAK;IAAW,OAAO;KAAE,UAAU;KAAY,OAAO;KAAQ,QAAQ;KAAQ,MAAM;KAAG,KAAK;IAAE;GAAI,CAAA;GAE1G,kBAAC,OAAD;IACE,KAAK;IACL,WAAU;IACV,OAAO;KACL,UAAU;KACV,KAAK;KAAG,MAAM;KACd,WAAW,SAAS,EAAM;KAC1B,iBAAiB;KACjB,eAAe;KACf,SAAS;KACT,OAAO,GAAG,EAAc;KACxB,QAAQ,GAAG,EAAe;IAC5B;GACD,CAAA;GAGA,KAAsB,EAAmB,cAAc,KACtD,kBAAC,OAAD;IAAK,OAAO;KAAE,UAAU;KAAY,KAAK;KAAG,MAAM;KAAG,OAAO;KAAQ,QAAQ;KAAQ,eAAe;KAAQ,QAAQ;IAAE;IAClH,UAAA,EAAmB,OAAO,KAAK,GAAG,MACjC,kBAAC,OAAD,EAAe,OAAO;KACpB,UAAU;KACV,MAAM,GAAG,EAAE,IAAI,EAAM;KACrB,QAAQ,GAAG,EAAE,IAAI,EAAM;KACvB,OAAO,GAAG,EAAE,QAAQ,EAAM;KAC1B,QAAQ,GAAG,EAAE,SAAS,EAAM;KAC5B,iBAAiB;KACjB,QAAQ;KACR,cAAc;KACd,WAAW;IACb,EAAI,GAVM,CAUN,CACL;GACE,CAAA;UAIC;IAGN,IAAM,IAAe,GAAqB,GAF9B,IAAW,OAAQ,IAAI,IAAgB,GACvC,IAAW,OAAQ,IAAI,IAAiB,CACQ;IAC5D,OACE,kBAAC,OAAD;KACE,OAAO;MACL,UAAU;MAAY,KAAK;MAAG,MAAM;MAAG,OAAO;MAAQ,QAAQ;MAC9D,QAAQ,CAAC,YAAY,QAAQ,CAAC,CAAC,SAAS,CAAS,KAAK,IAAc,MAAe,WAAW,SAAS,cAAe;MACtH,eAAgB,MAAe,QAAQ,MAAe,QAAS,SAAS;MACxE,QAAQ;KACV;KACA,SAAS,OAAO,EAAc,GAAG;KACjC,cAAc,MAAM,EAAY,GAAG,CAAO;KAC1C,cAAc,MAAM,GAAY,GAAG,CAAO;KAC1C,YAAY,MAAM,EAAU,GAAG,CAAO;KACtC,eAAe,MAAM,EAAU,GAAG,CAAO;KAEzC,UAAA,kBAAC,KAAD;MAAG,WAAW;MACZ,UAAA,kBAAC,EAAM,UAAP,EAAA,UAAA,CACG,GAAgB,KAAI,MAAO;OAClC,IAAM,IAAa,EAAI,SAAS,UAAU,EAAI,SAAS,YAAa,gBAAgB,GAAG,EAAI,QAAQ,KAAK,MAAM,EAAI,UAAU,GAAG,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,SAAS,GAAG,GAAG,KACvJ,IAAc,EAAI,OAClB,IAAa,MAAyB,EAAI,IAC1C,KAAa,EAAI,SAAS,eAAe,EAAI,UAAU,MAAM,CAAC;QAAC;QAAQ;QAAQ;QAAW;OAAW,CAAC,CAAC,SAAS,EAAI,IAAI,IAAI,aAAa,UAEzI,IAAmB;QACvB,oBAAoB,GAAuB,EAAI,EAAE;QACjD,UAAU,MAAwB;SAChC,GAAkB,EAAI,IAAI,CAAC;QAC7B;QACA,OAAO;SACL,eAAe;SACf,QAAkC;QACpC;OACF,GAEI,IAAQ;OAEZ,IAAI,EAAI,SAAS,aACf,IAAQ,kBAAC,QAAD;QAAM,GAAG,EAAI;QAAG,GAAG,EAAI;QAAG,OAAO,EAAI;QAAO,QAAQ,EAAI;QAAQ,MAAM;QAAW,QAAQ;QAAa,aAAa,EAAI;QAAa,OAAO,EAAE,cAAc,EAAU;OAAI,CAAA;YAC5K,IAAI,EAAI,SAAS,UAAU,EAAI,MACpC,IAAQ,kBAAC,QAAD;QAAM,GAAG,EAAI;QAAG,GAAG,EAAI,IAAI;QAAI,MAAM;QAAa,UAAS;QAAO,YAAW;QAAc,UAAA,EAAI;OAAW,CAAA;YAC7G,IAAI,EAAI,SAAS,WACtB,IAAQ,kBAAC,WAAD;QAAS,IAAI,EAAI,IAAI,EAAI,QAAM;QAAG,IAAI,EAAI,IAAI,EAAI,SAAO;QAAG,IAAI,EAAI,QAAM;QAAG,IAAI,EAAI,SAAO;QAAG,MAAM;QAAW,QAAQ;QAAa,aAAa,EAAI;QAAa,OAAO,EAAE,cAAc,EAAU;OAAI,CAAA;YAC3M,IAAI,EAAI,SAAS,UAAU,EAAI,QACpC,IACE,kBAAC,KAAD;QAAG,OAAO,EAAE,cAAc,EAAU;QAApC,UAAA,CACE,kBAAC,QAAD;SAAM,IAAI,EAAI,OAAO,EAAE,CAAC;SAAG,IAAI,EAAI,OAAO,EAAE,CAAC;SAAG,IAAI,EAAI,OAAO,EAAE,CAAC;SAAG,IAAI,EAAI,OAAO,EAAE,CAAC;SAAG,QAAO;SAAc,aAAa,KAAK,IAAI,IAAI,EAAI,cAAc,CAAC;QAAI,CAAA,GAChK,kBAAC,QAAD;SAAM,IAAI,EAAI,OAAO,EAAE,CAAC;SAAG,IAAI,EAAI,OAAO,EAAE,CAAC;SAAG,IAAI,EAAI,OAAO,EAAE,CAAC;SAAG,IAAI,EAAI,OAAO,EAAE,CAAC;SAAG,QAAQ;SAAa,aAAa,EAAI;QAAc,CAAA,CAC7I;;YAEA,IAAI,EAAI,SAAS,WAAW,EAAI,QAAQ;QAC7C,IAAM,CAAC,GAAI,KAAM,EAAI,QACf,IAAQ,KAAK,MAAM,EAAG,IAAI,EAAG,GAAG,EAAG,IAAI,EAAG,CAAC,GAC3C,IAAU,KAAK,EAAI,aACnB,IAAK;SAAE,GAAG,EAAG,IAAI,IAAU,KAAK,IAAI,IAAQ,KAAK,KAAK,CAAC;SAAG,GAAG,EAAG,IAAI,IAAU,KAAK,IAAI,IAAQ,KAAK,KAAK,CAAC;QAAE,GAC5G,IAAK;SAAE,GAAG,EAAG,IAAI,IAAU,KAAK,IAAI,IAAQ,KAAK,KAAK,CAAC;SAAG,GAAG,EAAG,IAAI,IAAU,KAAK,IAAI,IAAQ,KAAK,KAAK,CAAC;QAAE;QAClH,IACE,kBAAC,KAAD;SAAG,OAAO,EAAE,cAAc,EAAU;SAApC,UAAA;UACE,kBAAC,QAAD;WAAM,IAAI,EAAG;WAAG,IAAI,EAAG;WAAG,IAAI,EAAG;WAAG,IAAI,EAAG;WAAG,QAAO;WAAc,aAAa,KAAK,IAAI,IAAI,EAAI,cAAc,CAAC;UAAI,CAAA;UACpH,kBAAC,QAAD;WAAM,IAAI,EAAG;WAAG,IAAI,EAAG;WAAG,IAAI,EAAG;WAAG,IAAI,EAAG;WAAG,QAAQ;WAAa,aAAa,EAAI;UAAc,CAAA;UAClG,kBAAC,QAAD;WAAM,GAAG,KAAK,EAAG,EAAE,GAAG,EAAG,EAAE,KAAK,EAAG,EAAE,GAAG,EAAG,EAAE,KAAK,EAAG,EAAE,GAAG,EAAG;WAAK,MAAK;WAAO,QAAQ;WAAa,aAAa,EAAI;WAAa,eAAc;WAAQ,gBAAe;UAAS,CAAA;SAC9K;;OAEP,OAAO,IAAI,EAAI,SAAS,eAAe,EAAI,UAAU,KAAA,KAAa,EAAI,WAAW,KAAA,GAC/E,IAAQ,kBAAC,QAAD;QAAM,GAAG,EAAI;QAAG,GAAG,EAAI;QAAG,OAAO,EAAI;QAAO,QAAQ,EAAI;QAAQ,MAAM;QAAa,SAAS,EAAI;QAAS,OAAO,EAAE,cAAc,WAAW;OAAI,CAAA;YAClJ,IAAI,EAAI,SAAS,UAAU,EAAI,UAAU,KAAA,KAAa,EAAI,WAAW,KAAA,GAC1E,IAAI,EAAI,MAAM;QACZ,IAAM,IAAY,EAAI,SAAS,EAAI,UAAU,gBAAgB,IAAc;QAC3E,IACE,kBAAC,QAAD;SAAM,GAAG,EAAI;SAAG,GAAG,EAAI,IAAI;SAAI,MAAM;SAAW,UAAS;SAAO,YAAW;SAAa,gBAAe;SAAY,OAAO,EAAE,QAAQ,UAAU;SAC3I,UAAA,EAAI;QACD,CAAA;OAEV,OAAO;QACL,IAAM,IAAc,EAAI,SAAS,EAAI,UAAU,gBAAgB,IAAc;QAC7E,IAAQ,kBAAC,QAAD;SAAM,GAAG,EAAI;SAAG,GAAG,EAAI;SAAG,OAAO,EAAI;SAAO,QAAQ,EAAI;SAAQ,MAAK;SAAc,QAAQ,IAAa,IAAc,GAAG,EAAY;SAAK,aAAa,IAAa,MAAM;SAAK,iBAAiB,IAAa,SAAS;QAAM,CAAA;OACtO;YACK,IAAI,EAAI,SAAS,cAAc,EAAI,QAAQ;QAChD,IAAM,IAAI,KAAK,EAAI,OAAO,KAAI,MAAK,GAAG,EAAE,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,KAAK,KAAK;QAC9D,IACE,kBAAC,KAAD;SAAG,OAAO,EAAE,cAAc,EAAU;SAApC,UAAA,CACE,kBAAC,QAAD;UAAS;UAAG,MAAK;UAAO,QAAO;UAAc,aAAa,KAAK,IAAI,IAAI,EAAI,cAAc,CAAC;UAAG,gBAAe;UAAQ,eAAc;SAAS,CAAA,GAC3I,kBAAC,QAAD;UAAS;UAAG,MAAK;UAAO,QAAQ;UAAa,aAAa,EAAI;UAAa,gBAAe;UAAQ,eAAc;SAAS,CAAA,CACxH;;OAEP,OAAO,IAAI,EAAI,SAAS,QACtB,IACE,kBAAC,KAAD;QAAG,WAAW,aAAa,EAAI,EAAE,IAAI,EAAI,EAAE;QAA3C,UAAA,CACE,kBAAC,QAAD;SAAM,OAAM;SAAK,QAAO;SAAK,IAAG;SAAI,MAAM;SAAW,QAAQ;SAAa,aAAa,EAAI;QAAc,CAAA,GACzG,kBAAC,QAAD;SAAM,GAAE;SAAyB,QAAO;SAAO,aAAY;SAAI,eAAc;QAAS,CAAA,CACrF;;YAEA,IAAI,EAAI,SAAS,aAAa,EAAI,QACvC,IACE,kBAAC,KAAD,EAAA,UAAA;QACE,kBAAC,QAAD;SAAM,IAAI,EAAI,OAAO,EAAE,CAAC;SAAG,IAAI,EAAI,OAAO,EAAE,CAAC;SAAG,IAAI,EAAI,OAAO,EAAE,CAAC;SAAG,IAAI,EAAI,OAAO,EAAE,CAAC;SAAG,QAAQ;SAAa,aAAa,EAAI;SAAa,iBAAgB;QAAK,CAAA;QAClK,kBAAC,QAAD;SAAM,GAAG,EAAI,OAAO,EAAE,CAAC;SAAG,GAAG,EAAI,OAAO,EAAE,CAAC;SAAG,OAAO,EAAI,OAAO,EAAI,KAAK,SAAS,IAAI,KAAK;SAAK,QAAO;SAAK,MAAK;SAAO,QAAQ;SAAa,aAAa,EAAI;QAAc,CAAA;QAC5K,kBAAC,QAAD;SAAM,GAAG,EAAI,OAAO,EAAE,CAAC,IAAI;SAAI,GAAG,EAAI,OAAO,EAAE,CAAC,IAAI;SAAI,MAAM;SAAa,UAAS;SAAO,YAAW;SAAc,UAAA,EAAI;QAAW,CAAA;OAClI,EAAA,CAAA;YAEA,IAAI,EAAI,SAAS,eAAe,EAAI,UAAU;QACnD,IAAM,IAAU,EAAI,YAAY,IAAI,KAAK,EAAI,SAAS,CAAC,CAAC,mBAAmB,SAAS;SAAE,KAAK;SAAW,OAAO;SAAS,MAAM;QAAU,CAAC,IAAI,IACrI,IAAa,EAAI,SAAS,uBAAuB,EAAI,OAAO,KAAK,MAAY;QAEnF,IACE,kBAAC,KAAD,EAAA,UAAA,CACE,kBAAC,SAAD;SAAO,MAAM,EAAI;SAAU,GAAG,EAAI;SAAG,GAAG,EAAI;SAAG,OAAO,EAAI;SAAO,QAAQ,EAAI;SAAQ,qBAAoB;QAAiB,CAAA,GACzH,KACC,kBAAC,QAAD;SACE,IAAI,EAAI,KAAK,MAAM,EAAI,SAAS,OAAO;SACvC,IAAI,EAAI,KAAK,MAAM,EAAI,UAAU,MAAM;SACvC,MAAK;SACL,UAAS;SACT,YAAW;SACX,YAAW;SAEV,UAAA;QACG,CAAA,CAEP,EAAA,CAAA;OAEP,OAAO,IAAI,EAAI,SAAS,iCAAiC;QACvD,IAAM,IAAU,EAAI,YAAY,IAAI,KAAK,EAAI,SAAS,CAAC,CAAC,eAAe,OAAO,IAAI,IAC5E,IAAK,EAAI,KAAK,GACd,IAAK,EAAI,KAAK,GACd,IAAK,EAAI,SAAS,KAClB,IAAK,EAAI,UAAU,IACnB,IAAQ,IAAK;QAEnB,IACE,kBAAC,KAAD,EAAA,UAAA;SACE,kBAAC,QAAD;UAAM,GAAG;UAAI,GAAG;UAAI,OAAO;UAAI,QAAQ;UAAI,MAAK;UAA2B,QAAO;UAAU,aAAY;SAAK,CAAA;SAC7G,kBAAC,QAAD;UAAM,IAAI,IAAK;UAAO,IAAI;UAAI,IAAI,IAAK;UAAO,IAAI,IAAK;UAAI,QAAO;UAAU,aAAY;SAAK,CAAA;SAG7F,kBAAC,KAAD;UAAG,WAAW,aAAa,IAAK,IAAM,IAAI,GAAG,IAAI,IAAK,IAAG,IAAI,GAAG;UAAhE,UAAA,CACE,kBAAC,QAAD;WAAM,GAAE;WAAoD,MAAK;WAAO,QAAO;WAAU,aAAY;WAAI,gBAAe;UAAS,CAAA,GACjI,kBAAC,QAAD;WAAM,GAAE;WAAqB,MAAK;WAAO,QAAO;WAAU,aAAY;WAAI,eAAc;WAAQ,gBAAe;UAAS,CAAA,CACvH;;SAEH,kBAAC,QAAD;UAAM,GAAG,IAAK,IAAQ;UAAI,GAAG,IAAK;UAAI,MAAK;UAAU,UAAS;UAAS,YAAW;UAAO,YAAW;UAApG,UAAA,CAAiH,wBAC1F,EAAI,UAAU,uBAC/B;;SACN,kBAAC,QAAD;UAAM,GAAG,IAAK,IAAQ;UAAI,GAAG,IAAK;UAAI,MAAK;UAAU,UAAS;UAAO,YAAW;UAAhF,UAAA,CAA6F,UACpF,CACH;;SACN,kBAAC,QAAD;UAAM,GAAG,IAAK,IAAQ;UAAI,GAAG,IAAK;UAAI,MAAK;UAAU,UAAS;UAAO,YAAW;UAAa,UAAA;SAEvF,CAAA;QACL,EAAA,CAAA;OAEP;OAEA,OACE,kBAAC,KAAD;QAAgB,GAAI;QAApB,UAAA,CACG,GACA,KACC,kBAAC,QAAD;SACE,GAAG,EAAI,IAAI;SAAG,GAAG,EAAI,IAAI;SACzB,OAAO,EAAI,QAAQ,EAAI,QAAQ,IAAI;SACnC,QAAQ,EAAI,SAAS,EAAI,SAAS,IAAI;SACtC,MAAK;SAAO,QAAO;SAAiB,aAAY;SAAI,iBAAgB;QACrE,CAAA,CAEF;OAVK,GAAA,EAAI,EAUT;MAEP,CAAC,GAEA,KAAc,EAAW,QAAO,MAAK,EAAE,cAAc,KAAW,EAAE,WAAW,SAAS,CAAC,CAAC,KAAK,GAAG,MAC/F,kBAAC,KAAD;OAEE,OAAO,EAAE,QAAQ,UAAU;OAC3B,UAAU,MAAM;QAEd,AADA,EAAE,gBAAgB,GAClB,KAAqB,CAAC;OACxB;OANF,UAAA;QAQE,kBAAC,SAAD,EAAA,UAAO,kCAAsC,CAAA;QAC7C,kBAAC,QAAD;SACE,GAAG,EAAE;SACL,GAAG,EAAE;SACL,OAAO,EAAE;SACT,QAAQ,EAAE;SACV,MAAK;SACL,QAAO;SACP,aAAa;SACb,iBAAgB;QACjB,CAAA;QACD,kBAAC,QAAD;SACE,GAAG,EAAE,IAAI;SACT,GAAG,EAAE,IAAI,KAAK,IAAI,EAAE,SAAS,GAAG,EAAE;SAClC,MAAK;SACL,UAAS;SACT,YAAW;SACX,eAAc;SACf,UAAA;QAEK,CAAA;QAEL,EAAE,QAAQ,MAAM,EAAE,SAAS,MAC1B,kBAAC,KAAD;SAAG,WAAW,aAAa,EAAE,IAAI,EAAE,QAAQ,GAAG,IAAI,EAAE,IAAI,EAAE;SAA1D,UAAA,CACE,kBAAC,QAAD;UAAM,OAAM;UAAK,QAAO;UAAK,IAAG;UAAI,MAAK;SAAW,CAAA,GACpD,kBAAC,QAAD;UAAM,GAAE;UAA0C,QAAO;UAAU,aAAY;UAAI,eAAc;SAAS,CAAA,CACzG;;OAEJ;MAnCI,GAAA,EAAE,MAAM,WAAW,GAmCvB,CACJ,CACa,EAAA,CAAA;KACf,CAAA;IACQ,CAAA;GAET,EAAA,CAAG;EACA;;AAET;AAEA,IAAM,KAAe,EAAM,KAAK,KAAwB,GAAW,MAE7D,EAAU,SAAS,KAAK,EAAU,SAAS,IAEtC,EAAU,YAAY,EAAU,WAChC,EAAU,UAAU,EAAU,SAC9B,EAAU,aAAa,EAAU,YACjC,EAAU,kBAAkB,EAAU,iBACtC,EAAU,mBAAmB,EAAU,kBACvC,EAAU,mBAAmB,EAAU,kBACvC,EAAU,oBAAoB,EAAU,mBACxC,EAAU,cAAc,EAAU,aAClC,EAAU,eAAe,EAAU,cACnC,EAAU,yBAAyB,EAAU,wBAC7C,EAAU,uBAAuB,EAAU,sBAC3C,EAAU,kBAAkB,EAAU,iBACtC,EAAU,eAAe,EAAU,cACnC,EAAU,gBAAgB,EAAU,cAMtC,EAAU,YAAY,EAAU,WAChC,EAAU,UAAU,EAAU,SAC9B,EAAU,aAAa,EAAU,YACjC,EAAU,kBAAkB,EAAU,iBACtC,EAAU,mBAAmB,EAAU,kBACvC,EAAU,mBAAmB,EAAU,kBACvC,EAAU,oBAAoB,EAAU,mBACxC,EAAU,cAAc,EAAU,aAClC,EAAU,eAAe,EAAU,cACnC,EAAU,cAAc,EAAU,aAClC,EAAU,eAAe,EAAU,cACnC,EAAU,yBAAyB,EAAU,wBAC7C,EAAU,uBAAuB,EAAU,sBAC3C,EAAU,kBAAkB,EAAU,iBACtC,EAAU,eAAe,EAAU,cACnC,EAAU,gBAAgB,EAAU,WAC5C;;;AC7lBD,eAAsB,GACpB,GACA,GACsB;CACtB,IAAM,IAA0B,CAAC;CACjC,IAAI,CAAC,KAAU,CAAC,KAAW,EAAQ,WAAW,GAAG,OAAO;CAExD,IAAM,IAAW,EAAO,UAElB,IAAgB,EAAQ,KAAI,MAAK,IAAI,OAAO,GAAG,EAAE,MAAM,SAAS,GAAG,IAAI,EAAE,QAAQ,EAAE,QAAQ,GAAG,CAAC;CAErG,KAAK,IAAI,IAAU,GAAG,KAAW,GAAU,KACzC,IAAI;EACF,IAAM,IAAO,MAAM,EAAO,QAAQ,CAAO,GAEnC,KAAQ,MADY,EAAK,eAAe,EAAA,CACpB,OAEtB,IAAW,IAET,IAAwB,CAAC,GACzB,IAAwB,CAAC;EAG/B,EAAM,SAAS,GAAM,MAAU;GAC7B,IAAM,IAAM,EAAK;GACjB,KAAK,IAAI,IAAI,GAAG,IAAI,EAAI,QAAQ,KAE9B,AADA,EAAY,KAAK,CAAK,GACtB,EAAY,KAAK,CAAC;GAIpB,AAFA,KAAY,GAER,EAAK,UACP,KAAY,MACZ,EAAY,KAAK,EAAE,GACnB,EAAY,KAAK,EAAE,MAGnB,KAAY,KACZ,EAAY,KAAK,EAAE,GACnB,EAAY,KAAK,EAAE;EAEvB,CAAC;EAGD,KAAK,IAAM,KAAe,GAAe;GACvC,EAAY,YAAY;GACxB,IAAM,IAAU,CAAC,GAAG,EAAS,SAAS,CAAW,CAAC;GAElD,KAAK,IAAM,KAAS,GAAS;IAC3B,IAAI,EAAM,UAAU,KAAA,GAAW;IAE/B,IAAM,IAAa,EAAM,OACnB,IAAc,EAAM,EAAE,CAAC,QAGvB,oBAAc,IAAI,IAA0C;IAClE,KAAK,IAAI,IAAI,GAAY,IAAI,IAAa,GAAa,KAAK;KAC1D,IAAM,IAAU,EAAY,IACtB,IAAU,EAAY;KAC5B,IAAI,MAAY,KAAA,KAAa,MAAY,IAAI;MAC3C,IAAM,IAAW,EAAY,IAAI,CAAO;MACxC,AAAI,KACF,EAAS,MAAM,KAAK,IAAI,EAAS,KAAK,CAAO,GAC7C,EAAS,MAAM,KAAK,IAAI,EAAS,KAAK,CAAO,KAE7C,EAAY,IAAI,GAAS;OAAE,KAAK;OAAS,KAAK;MAAQ,CAAC;KAE3D;IACF;IAGA,EAAY,SAAS,GAAW,MAAc;KAC5C,IAAM,IAAO,EAAM,IAIb,IAAK,EAAK,UAAU,IACpB,IAAK,EAAK,UAAU,IACpB,IAAS,EAAK,UAAU,IAIxB,IAAY,EAAK,QAAQ,EAAK,IAAI,QAElC,IAAS,IAAM,EAAU,MAAM,GAC/B,KAAe,EAAU,MAAM,EAAU,MAAO,KAAK,GACrD,IAAc,EAAK,UAAU,GAI7B,IADW,EAAK,YAAY,EAAE,OAAO,EAAE,CAChC,CAAA,CAAS,SAAS,IAAK;KAEpC,EAAW,KAAK;MACd,IAAI,SAAS,EAAQ,GAAG,KAAK,OAAO,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,OAAO,GAAG,CAAC;MAC9D,WAAW;MACX,GAAG,IAAS;MACZ,GAAG,IAAO;MACV,OAAO,IAAc;MACrB,QAAQ,IAAe;MACvB,QAAQ;KACV,CAAC;IACH,CAAC;GACH;EACF;EAMA,AAHA,EAAK,QAAQ,GAGT,IAAU,MAAO,KACnB,MAAM,IAAI,SAAQ,MAAW,WAAW,GAAS,CAAC,CAAC;CAEvD,SAAS,GAAG;EACV,QAAQ,MAAM,0BAA0B,EAAQ,uBAAuB,CAAC;CAC1E;CAGF,OAAO;AACT;;;ACxFA,IAAI,IAA4B,CAAC;AAEjC,SAAgB,GAAmB,GAA4B;CAE7D,AADA,IAAa;EAAE,GAAG;EAAY,GAAG;CAAM,GACnC,EAAM,cACR,GAAS,oBAAoB,YAAY,EAAM;AAEnD;AAEA,SAAgB,KAA4C;CAC1D,OAAO;AACT;AAGA,SAAgB,KAA8B;CAC5C,OAAO,GAAQ,EAAW,aAAa,GAAS,oBAAoB;AACtE;AAOA,SAAgB,KAA+B;CACzC,QAAmB,GACvB,MAAU,MACR,0OAGF;AACF;AAGA,SAAgB,KAAqD;CACnE,IAAM,IAA0C,CAAC;CAQjD,OAPI,EAAW,YACb,EAAO,UAAU,EAAW,SAC5B,EAAO,aAAa,KAElB,EAAW,wBAAqB,EAAO,sBAAsB,EAAW,sBACxE,EAAW,YAAS,EAAO,UAAU,EAAW,UAChD,EAAW,WAAQ,EAAO,SAAS,EAAW,SAC3C;AACT;AAGA,IAAa,KAAuB,GAAS;;;AClB7C,SAAwB,GAAe,EACrC,oBAAiB,qBAAkB,cAAW,eAAY,eAAY,GAAG,qBAAkB,IAAO,WAAQ,cAAW,IACrH,eAAY,oBAAiB,UAAO,aAAU,gBAAY,mBAAe,wBAAqB,wBAC9F,sBAAkB,gBAAa,wBAAqB,kBACpD,mBAAgB,eAAY,aAAU,iBAAa,eAAW,mBAAe,mBAAmB,IAAoB,iBAAa,kBAC3G;CACtB,IAAM,IAAe,EAAuB,IAAI,GAC1C,KAAM,GAAa,GACnB,CAAC,GAAQ,MAAa,EAA2C,IAAI,GACrE,CAAC,IAAW,MAAgB,EAAuB,IAAI,GACvD,CAAC,GAAS,KAAc,EAAS,CAAC,GAClC,CAAC,GAAkB,KAAuB,EAAsB,CAAC,CAAC,GAClE,EAAE,kBAAe,GAAa,GAG9B,IAAe,EAAO;EAAE;EAAoB;EAAkB;EAAa;EAAqB;CAAa,CAAC;CACpH,EAAa,UAAU;EAAE;EAAoB;EAAkB;EAAa;EAAqB;CAAa;CAC9G,IAAM,IAAY,EAAO,CAAM;CAC/B,EAAU,UAAU;CAMpB,IAAM,CAAC,IAAoB,MAAyB,EAA8B,IAAI,GAEhF,CAAC,GAAc,KAAmB,EAAS;EAAE,OAAO;EAAK,QAAQ;CAAK,CAAC,GACvE,CAAC,GAAW,MAAgB,EAAS;EAAE,KAAK;EAAG,MAAM;CAAE,CAAC,GACxD,CAAC,IAAW,MAAgB,EAAS,EAAK,GAC1C,KAAc,EAA+E,IAAI,GAEjG,MAA2B,MAAyB;EAGxD,IAFA,EAAW,EAAO,SAAS,GAC3B,GAAsB,CAAM,GACxB,EAAa,SAAS;GAExB,IAAM,IAAmB,EAAa,SAAS,IAAQ;GACvD,EAAa,QAAQ,aAAa,EAAO,YAAY,KAAK;EAC5D;CACF,GAEM,CAAC,GAAa,MAAkB,EAAuB,CAAC,CAAC,GACzD,CAAC,IAAM,MAAW,EAAyB,CAAC,CAAC,GAC7C,CAAC,IAAQ,MAAa,EAAyB,CAAC,CAAC,GACjD,CAAC,GAAY,KAAiB,EAAmM,KAAK;CAoB5O,AAjBA,QAAgB;EACd,AAAI,MAAc,cAChB,EAAc,WAAW,GACzB,GAAgB,SAAS,GACzB,GAAkB,EAAG,GACrB,GAAsB,EAAE,KACf,MAAc,YACvB,EAAc,WAAW,GACzB,GAAkB,CAAC,GACnB,GAAsB,CAAC,KACd,MAAc,kBACvB,EAAc,WAAW,IAChB,MAAc,UACvB,EAAc,KAAK;CAEvB,GAAG,CAAC,CAAS,CAAC,GAEd,QAAgB;EACd,GAAI,KAAK,uBAAuB,EAAE,MAAM,EAAW,CAAC;CACtD,GAAG,CAAC,GAAY,EAAG,CAAC;CAKpB,IAAM,CAAC,IAAc,MAAmB,EAAS,SAAS,GACpD,CAAC,IAAoB,MAAyB,EAAS,CAAC,GACxD,CAAC,IAAgB,MAAqB,EAAS,EAAG,GAElD,CAAC,IAAW,MAAgB,EAAS,EAAK,GAC1C,CAAC,IAAsB,MAA2B,EAAwB,IAAI,GAC9E,CAAC,GAAU,MAAe,EAAS;EAAE,GAAG;EAAG,GAAG;CAAE,CAAC,GACjD,CAAC,GAAY,MAAiB,EAAS;EAAE,GAAG;EAAG,GAAG;CAAE,CAAC,GACrD,CAAC,IAAgB,MAAqB,EAAqC,CAAC,CAAC,GAG7E,CAAC,GAAkB,MAAuB,EAA4J,IAAI,GAC1M,CAAC,IAAa,MAAkB,EAAS,EAAE,GAC3C,KAAc,EAA4B,IAAI,GAE9C,CAAC,GAAsB,MAA2B,EAAwB,IAAI,GAC9E,CAAC,IAAgB,MAAqB,EAA+C,IAAI,GACzF,CAAC,IAAiB,MAAsB,EAAS,EAAK,GACtD,KAAqB,EAAO,EAAK;CAGvC,GAAyC,oBAAoB,MAAM,EAAc,GAAG,QAAQ,IAAI,CAAC;CAEjG,IAAM,KAAe,EAA+C;EAAE,IAAI;EAAM,IAAI;CAAK,CAAC,GACpF,KAAe,EAAO,CAAK;CAuCjC,AApCA,QAAgB;EACd,IAAI,GAAa,YAAY,GAAO;GAClC,IAAM,IAAI,GAAa,SACjB,IAAW;GACjB,GAAa,UAAU;GAEvB,IAAM,IAAY,EAAa;GAC/B,IAAI,GAAW;IACb,IAAM,IAAK,EAAU,aACf,IAAK,EAAU,cAEjB,IAAK,IAAK,GACV,IAAK,IAAK;IACd,AAAI,GAAa,QAAQ,OAAO,QAAQ,GAAa,QAAQ,OAAO,SAClE,IAAK,GAAa,QAAQ,IAC1B,IAAK,GAAa,QAAQ,IAC1B,GAAa,UAAU;KAAE,IAAI;KAAM,IAAI;IAAK;IAG9C,IAAM,IAAI,IAAK,EAAU,YACnB,IAAI,IAAK,EAAU,WAEnB,IAAQ,EAAa,OACrB,IAAS,KAAK,IAAI,GAAG,IAAK,IAAK,IAAQ,IAAK,CAAC;IAQnD,AADA,EAAU,aANK,KAAK,IAAI,GAAG,IAAK,IAAK,IAAQ,IAAY,CAI5C,KAFC,IAAI,MACQ,IAAW,KAGP,GAC9B,EAAU,YAAkB,IAAW,IAAhB,IAAsB;GAC/C;EACF;CACF,GAAG,CAAC,GAAO,EAAa,KAAK,CAAC,GAE9B,QAAgB;EACd,IAAM,IAAY,EAAa;EAE/B,IADI,CAAC,KACD,CAAC,GAAW;EAEhB,IAAM,KAAe,MAAkB;GACrC,IAAI,EAAE,WAAW,EAAE,SAAS;IAC1B,EAAE,eAAe;IAEjB,IAAM,IAAO,EAAU,sBAAsB,GACvC,IAAU,EAAE,SACZ,IAAU,EAAE,SAEZ,IAAa,KAAK,IAAI,CAAC,EAAE,SAAS,IAAK;IAE7C,GAAS,MAAK;KACZ,IAAM,IAAW,KAAK,IAAI,KAAK,IAAI,IAAI,GAAY,EAAG,GAAG,EAAE;KAO3D,OANI,MAAa,MACf,GAAa,UAAU;MACrB,IAAI,IAAU,EAAK;MACnB,IAAI,IAAU,EAAK;KACrB,IAEK;IACT,CAAC;GACH;EACF;EAGA,OADA,EAAU,iBAAiB,SAAS,GAAa,EAAE,SAAS,GAAM,CAAC,SACtD,EAAU,oBAAoB,SAAS,CAAW;CACjE,GAAG,CAAC,CAAQ,CAAC;CAGb,IAAM,IAAoB,GAAa,MAA0B;EAG/D,AAFA,IAAQ,MAAQ,CAAC,GAAG,GAAM,CAAW,CAAC,GACtC,GAAU,CAAC,CAAC,GACZ,GAAe,CAAO;CACxB,GAAG,CAAC,CAAW,CAAC;CAEhB,GAAqC,0CAA0C,MAAM;EACnF,AAAI,GAAG,WAAS,EAAkB,CAAC,GAAG,GAAa,EAAE,OAAO,CAAC;CAC/D,CAAC;CAED,IAAM,KAAa,QAAkB;EACnC,IAAI,GAAK,WAAW,GAAG;EACvB,IAAM,IAAW,GAAK,GAAK,SAAS;EAGpC,AAFA,IAAU,MAAQ,CAAC,GAAa,GAAG,CAAI,CAAC,GACxC,GAAe,CAAQ,GACvB,IAAQ,MAAQ,EAAK,MAAM,GAAG,EAAE,CAAC;CACnC,GAAG,CAAC,GAAa,EAAI,CAAC,GAEhB,KAAa,QAAkB;EACnC,IAAI,GAAO,WAAW,GAAG;EACzB,IAAM,IAAO,GAAO;EAGpB,AAFA,IAAQ,MAAQ,CAAC,GAAG,GAAM,CAAW,CAAC,GACtC,GAAe,CAAI,GACnB,IAAU,MAAQ,EAAK,MAAM,CAAC,CAAC;CACjC,GAAG,CAAC,GAAa,EAAM,CAAC;CA8CxB,AA1CA,GAA2B,mBAAmB,MAAM;EAClD,IAAM,IAAU,SAAS,eAAe,YAAY,cAAc,SAAS,eAAe,YAAY;EAEtG,IAAI,GAAc,GAAG,EAAW,WAAW,CAAC,GAAG;GAE7C,AADA,EAAE,eAAe,GACjB,IAAY,OAAM,IAAI,MAAM,GAAG;GAC/B;EACF;EACA,IAAI,GAAc,GAAG,EAAW,YAAY,CAAC,GAAG;GAE9C,AADA,EAAE,eAAe,GACjB,IAAY,OAAM,IAAI,MAAM,GAAG;GAC/B;EACF;EACA,IAAI,GAAc,GAAG,EAAW,MAAM,CAAC,GAAG;GAExC,AADA,EAAE,eAAe,GACjB,GAAW;GACX;EACF;EACA,IAAI,GAAc,GAAG,EAAW,MAAM,CAAC,GAAG;GAExC,AADA,EAAE,eAAe,GACjB,GAAW;GACX;EACF;EAGA,AAAI,CAAC,KAAW,CAAC,KACX,GAAc,GAAG,EAAW,QAAQ,CAAC,KAAK,MAC5C,EAAE,eAAe,GACjB,EAAkB,EAAY,QAAO,MAAK,EAAE,OAAO,CAAoB,CAAC,GACxE,GAAwB,IAAI;CAGlC,CAAC,GAED,QAAgB;EACd,AAAI,KAAoB,GAAY,WAClC,iBAAiB;GACf,GAAY,SAAS,MAAM;EAC7B,GAAG,EAAE;CAET,GAAG,CAAC,CAAgB,CAAC,GAErB,QAAgB;EACd,AAAI,KACF,EAAoB,CAAW;CAEnC,GAAG,CAAC,GAAa,CAAmB,CAAC;CAGrC,IAAM,CAAC,IAAgB,MAAqB,EAAsB,CAAC,CAAC;CAEpE,QAAgB;EACd,IAAI,KAAU,KAAmB,EAAgB,SAAS,GAAG;GAC3D,IAAI,IAAY;GAIhB,OAHA,GAAoB,GAAQ,CAAe,CAAC,CAAC,MAAK,MAAW;IAC3D,AAAK,KAAW,GAAkB,CAAO;GAC3C,CAAC,SACY;IAAE,IAAY;GAAM;EACnC;EACE,GAAkB,CAAC,CAAC;CAExB,GAAG,CAAC,GAAQ,CAAe,CAAC;CAE5B,IAAM,CAAC,IAAmB,MAAwB,EAAS,EAAK,GAE1D,KAAqB,QAClB;EAAC,GAAI,KAAc,CAAC;EAAI,GAAG;EAAgB,GAAG;CAAgB,GACpE;EAAC;EAAY;EAAgB;CAAgB,CAAC;CAGjD,QAAgB;EACd,EAAa,QAAQ,qBAAqB,EAAkB;CAC9D,GAAG,CAAC,EAAkB,CAAC;CAEvB,IAAM,KAAyB,QACtB,GAAmB,QAAO,MAAK,EAAE,WAAW,SAAS,CAAC,CAAC,QAC7D,CAAC,EAAkB,CAAC,GAEjB,KAA6B,QAAkB;EAEnD,AADA,GAAoB,MAAQ,EAAK,QAAO,MAAK,EAAE,WAAW,SAAS,CAAC,GACpE,IAAkB,MAAQ,EAAK,QAAO,MAAK,EAAE,WAAW,SAAS,CAAC;CACpE,GAAG,CAAC,CAAC,GAEC,KAAyB,GAAa,MAAmB;EAE7D,AADA,GAAoB,MAAQ,EAAK,QAAO,MAAK,MAAM,KAAO,EAAE,OAAO,EAAI,EAAE,CAAC,GAC1E,IAAkB,MAAQ,EAAK,QAAO,MAAK,MAAM,KAAO,EAAE,OAAO,EAAI,EAAE,CAAC;CAC1E,GAAG,CAAC,CAAC,GAEC,EAAE,YAAQ,mBAAe,iBAAa,uBAAmB,GAAa,GAAQ,EAAkB,GAIhG,KAAuB,EAAO,EAAK;CACzC,QAAgB;EAKd,IAJA,GAAU,IAAI,GACd,GAAa,IAAI,GACjB,EAAW,CAAC,GACZ,GAAqB,UAAU,IAC3B,CAAC,GAAY;EAEjB,IAAM,IAAM,GACR,IAAY,IACZ,IAAsD;EAwB1D,QAFA,YApB4B;GAC1B,IAAI;IAGF,AAFI,EAAU,WAAS,GAAmB,EAAU,OAAO,GAC3D,GAAuB,GACvB,IAAc,GAAS,YAAY;KAAE;KAAK;KAAiB,GAAG,GAAkB;IAAE,CAAC;IACnF,IAAM,IAAM,MAAM,EAAY;IAG9B,IAAI,GAAW;IAEf,AADA,GAAU,CAAG,GACb,EAAa,QAAQ,mBAAmB,GAAK,CAAG;GAClD,SAAS,GAAY;IACnB,IAAI,GAAW;IACf,IAAM,IAAM,aAAiB,QAAQ,IAAY,MAAM,OAAO,GAAO,WAAW,CAAK,CAAC,GAChF,IAAmB,GAAO,SAAS;IAGzC,AAFA,QAAQ,MAAM,4CAA4C,EAAI,SAAS,CAAG,GAC1E,GAAa,CAAG,GAChB,EAAa,QAAQ,cAAc,GAAK;KAAE;KAAK;IAAiB,CAAC;GACnE;EACF,EACA,CAAQ,SAEK;GAEX,AADA,IAAY,IACR,KACF,EAAY,QAAQ,CAAC,CAAC,YAAY,CAAC,CAAC;EAExC;CACF,GAAG;EAAC;EAAY;EAAW;CAAe,CAAC;CAE3C,IAAM,KAAqB,GAAa,MAAyB;EAC3D,GAAqB,YACzB,GAAqB,UAAU,IAC/B,EAAa,QAAQ,sBAAsB,CAAY;CACzD,GAAG,CAAC,CAAC;CAkBL,AAhBA,QAAgB;EACd,AAAI,KAAQ,EAAa,QAAQ,eAAe,GAAS,EAAO,QAAQ;CAC1E,GAAG,CAAC,GAAS,CAAM,CAAC,GAGpB,QAAgB;EACd,AAAI,KAAU,MAAe,KAAc,KAAK,EAAa,WAC3D,iBAAiB;GAEf,IAAM,IAAmB,EAAa,SAAS,IAAQ;GACvD,EAAa,QAAS,aAAa,KAAc,KAAK;EACxD,GAAG,GAAG;CAEV,GAAG;EAAC;EAAQ;EAAa,EAAa;EAAQ;CAAK,CAAC,GAGpD,QAAgB;EACd,AAAI,MAQF,YAP+B;GAC7B,IAAM,IAAO,MAAM,EAAO,QAAQ,CAAC,GAG7B,IAAK,EAAK,YAAY;IAAE,OAAO;IAAG,UAAU,GAAkB,EAAK,SAAS,CAAQ;GAAE,CAAC;GAC7F,EAAgB;IAAE,OAAO,EAAG;IAAO,QAAQ,EAAG;GAAO,CAAC;EACxD,EACA,CAAW;CAEf,GAAG,CAAC,GAAQ,CAAQ,CAAC;CAGrB,IAAM,KAAmB,QAAkB;EACzC,IAAI,CAAC,EAAa,WAAW,CAAC,EAAa,OAAO;EAClD,IAAM,IAAiB,EAAa,QAAQ,cAAc;EAC1D,IAAI,IAAiB,KAAK,EAAa,QAAQ,GAAG;GAChD,IAAM,IAAW,IAAiB,EAAa;GAE/C,EADqB,KAAK,IAAI,IAAK,KAAK,IAAI,IAAI,WAAW,EAAS,QAAQ,CAAC,CAAC,CAAC,CACtE,CAAY;EACvB;CACF,GAAG,CAAC,EAAa,OAAO,CAAQ,CAAC,GAG3B,KAAkB,QAAkB;EACxC,IAAI,CAAC,EAAa,WAAW,CAAC,EAAa,SAAS,CAAC,EAAa,QAAQ;EAC1E,IAAM,IAAiB,EAAa,QAAQ,cAAc,IACpD,IAAkB,EAAa,QAAQ,eAAe;EAC5D,IAAI,IAAiB,KAAK,IAAkB,KAAK,EAAa,QAAQ,KAAK,EAAa,SAAS,GAAG;GAClG,IAAM,IAAS,IAAiB,EAAa,OACvC,IAAS,IAAkB,EAAa;GAG9C,EADqB,KAAK,IAAI,IAAK,KAAK,IAAI,IAAI,WAD/B,KAAK,IAAI,GAAQ,CACyB,CAAA,CAAS,QAAQ,CAAC,CAAC,CAAC,CACtE,CAAY;EACvB;CACF,GAAG;EAAC,EAAa;EAAO,EAAa;EAAQ;CAAQ,CAAC;CAGtD,AADA,GAAY,6BAA6B,GAAiB,CAAC,GAC3D,GAAY,4BAA4B,GAAgB,CAAC;CAEzD,IAAM,MAAqB,MAAiC;EAC1D,IAAM,IAAO,EAAE,cAAc,sBAAsB;EAKnD,OAAO,IAJO,EAAE,UAAU,EAAK,QAAQ,IACzB,EAAE,UAAU,EAAK,OAAO,GAGA,GAF1B,IAAW,OAAQ,IAAI,EAAa,QAAQ,EAAa,QACzD,IAAW,OAAQ,IAAI,EAAa,SAAS,EAAa,KACd;CAC1D,GAEM,MAAmB,GAA8B,MAA0B;EAC/E,IAAI,CAAC,GAAY;EAEjB,IAAM,EAAE,MAAG,SAAM,GAAkB,CAAC;EAEpC,IAAI,MAAe,UAAU,MAAe,QAAQ;GAClD,EAAE,eAAe;GACjB;EACF;EAEA,IAAI,MAAe,UAAU;GAC3B,GAAa,EAAI;GACjB;EACF;EAIA,AAFA,GAAY;GAAE;GAAG;EAAE,CAAC,GACpB,GAAc;GAAE;GAAG;EAAE,CAAC,GAClB,MAAe,cACjB,GAAa,EAAI,GACjB,GAAkB,CAAC;GAAE;GAAG;EAAE,CAAC,CAAC,GAC5B,GAAwB,CAAa,MAC5B;GAAC;GAAa;GAAW;GAAQ;GAAS;GAAa;EAAW,CAAC,CAAC,SAAS,CAAU,KAGvF,CAAC,WAAW,MAAM,CAAC,CAAC,SAAS,CAAU,OAFhD,GAAa,EAAI,GACjB,GAAwB,CAAa;CAKzC,GAEM,WAA6B;EACjC,IAAI,KAAoB,GAAY,KAAK,GACvC,IAAI,EAAiB,OACnB,EAAkB,EAAY,KAAI,MAChC,EAAE,OAAO,EAAiB,QAAQ;GAAE,GAAG;GAAG,MAAM;EAAY,IAAI,CAClE,CAAC;OACI;GACL,IAAM,IAAQ,KAAK,IAAI,CAAC,CAAC,SAAS;GAClC,EAAkB,CAAC,GAAG,GAAa;IACjC,IAAI;IACJ,MAAM,EAAiB;IACvB,WAAW,EAAiB;IAC5B,GAAG,EAAiB;IACpB,GAAG,EAAiB;IACpB,OAAO,KAAK,IAAI,KAAK,GAAY,SAAS,IAAI,EAAE;IAChD,QAAQ;IACR,MAAM;IACN,QAAQ,EAAiB;IACzB,OAAO;IAAc,aAAa;IAAoB,SAAS;GACjE,CAAC,CAAC;EACJ;EAIF,AAFA,GAAoB,IAAI,GACxB,GAAe,EAAE,GACb,MAAe,UACjB,EAAc,IAAI;CAEtB,GAEM,MAAmB,GAA8B,MAA2B;EAChF,IAAI,CAAC,IAAW;EAChB,IAAM,EAAE,MAAG,SAAM,GAAkB,CAAC;EAEpC,AADA,GAAc;GAAE;GAAG;EAAE,CAAC,GAClB,MAAe,cACjB,IAAkB,MAAQ,CAAC,GAAG,GAAM;GAAE;GAAG;EAAE,CAAC,CAAC;CAEjD,GAEM,MAAiB,GAA8B,MAA0B;EAC7E,IAAI,MAAe,UAAU,MAAe,UAAU,MAAe,uBAAuB,MAAe,QAAQ;GACjH,IAAM,EAAE,MAAG,SAAM,GAAkB,CAAC;GAEpC,IAAI,MAAe,QAAQ;IACzB,IAAI,IAAQ,KAAK,IAAI,EAAW,IAAI,EAAS,CAAC,GAC1C,IAAS,KAAK,IAAI,EAAW,IAAI,EAAS,CAAC,GAC3C,IAAQ,KAAK,IAAI,EAAS,GAAG,EAAW,CAAC,GACzC,IAAQ,KAAK,IAAI,EAAS,GAAG,EAAW,CAAC;IAE7C,CAAI,IAAQ,KAAK,IAAS,OACxB,IAAQ,GACR,IAAQ,GACR,IAAQ,KACR,IAAS;IAGX,IAAM,IAAQ,KAAK,IAAI,CAAC,CAAC,SAAS;IAUlC,AATA,EAAkB,CAAC,GAAG,GAAa;KACjC,IAAI;KAAO,MAAM;KAAQ,WAAW;KAAe,GAAG;KAAO,GAAG;KAAO;KAAO;KAAQ,QAAQ,CAAC;KAC/F,OAAO;KAAe,aAAa;KAAG,SAAS;KAAG,MAAM;IAC1D,CAAC,CAAC,GACF,GAAa,EAAK,GAClB,GAAwB,IAAI,GAC5B,GAAmB,UAAU,IAC7B,GAAwB,CAAK,GAC7B,GAAmB,EAAI,GACvB,EAAc,IAAI;IAClB;GACF;GAAO,CAAI,MAAe,UAAU,MAAe,YAC7C,KACF,GAAqB,GAEvB,GAAoB;IAAE;IAAG;IAAG,MAAM;IAAmB,WAAW;GAAc,CAAC,GAC/E,GAAe,EAAE;GAEnB;EACF;EAEK,WACL,GAAa,EAAK,GAClB,GAAwB,IAAI,GACvB,IAEL,IAAI,MAAe,YAAY;GAC7B,IAAI,GAAe,SAAS,GAAG;IAE7B,IAAM,IAAK,GAAe,KAAI,MAAK,EAAE,CAAC,GAChC,IAAK,GAAe,KAAI,MAAK,EAAE,CAAC,GAChC,IAAO,KAAK,IAAI,GAAG,CAAE,GACrB,IAAO,KAAK,IAAI,GAAG,CAAE,GACrB,IAAO,KAAK,IAAI,GAAG,CAAE,GACrB,IAAO,KAAK,IAAI,GAAG,CAAE;IAE3B,EAAkB,CAAC,GAAG,GAAa;KACjC,IAAI,KAAK,IAAI,CAAC,CAAC,SAAS;KAAG,MAAM;KAAmB,WAAW;KAC/D,GAAG;KAAM,GAAG;KAAM,OAAO,IAAO;KAAM,QAAQ,IAAO;KACrD,QAAQ,CAAC,GAAG,EAAc;KAC1B,OAAO;KAAc,aAAa;KAAoB,SAAS;IACjE,CAAC,CAAC;GACJ;GACA,GAAkB,CAAC,CAAC;EACtB,OAAO;GACL,IAAI,IAAQ,KAAK,IAAI,EAAW,IAAI,EAAS,CAAC,GAC1C,IAAS,KAAK,IAAI,EAAW,IAAI,EAAS,CAAC;GAC/C,IAAI,IAAQ,KAAK,IAAS,GAAG;IAC3B,IAAI,IAAI,KAAK,IAAI,EAAS,GAAG,EAAW,CAAC,GACrC,IAAI,KAAK,IAAI,EAAS,GAAG,EAAW,CAAC,GACnC,IAAU,MAAe,UAAU,MAAe,WAAW,MAAe,YAAa,CAAC,GAAU,CAAU,IAAI,KAAA;IAOxH,KALK,MAAe,eAAe,MAAe,gBAAgB,IAAS,OACzE,IAAS,KAAK,IAAI,IAAI,CAAM,GAC5B,IAAI,EAAS,IAAI,IAGf,MAAe,WAAW;KAC5B,IAAI,GAAa,sBAAsB,IAAO;KAE9C,AADA,GAAoB;MAAE,GAAG,EAAW;MAAG,GAAG,EAAW;MAAG,MAAM;MAAW;MAAQ,WAAW;KAAc,CAAC,GAC3G,GAAe,EAAE;KACjB;IACF;IAEA,IAAI,MAAe,aAAa;KAC9B,IAAI,GAAa,cAAc,IAAO;KACtC,GAAoB,MAAQ,CAAC,GAAG,GAAM;MACpC,IAAI,UAAU,KAAK,IAAI,EAAE,GAAG,KAAK,OAAO,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,OAAO,GAAG,CAAC;MAClE,WAAW;MACX;MACA;MACA;MACA;MACA,QAAQ;KACV,CAAC,CAAC;KACF;IACF;IAEA,IAAI,GAAa,sBAAsB,IAAO;IAE9C,EAAkB,CAAC,GAAG,GAAa;KACjC,IAAI,KAAK,IAAI,CAAC,CAAC,SAAS;KAAG,MAAM;KAAmB,WAAW;KAAe;KAAG;KAAG;KAAO;KAAQ;KACnG,OAAO;KAAc,aAAa;KAAoB,SAAS;IACjE,CAAC,CAAC;GACJ;EACF;CACF,GAEM,MAAoB,MAAe;EACvC,AAAI,MAAe,YAAY,MAC7B,EAAkB,EAAY,QAAO,MAAK,EAAE,OAAO,CAAE,CAAC;CAE1D,GAEM,MAAqB,GAAY,MAAwB;EAE7D,IADA,EAAE,gBAAgB,GACd,MAAe,UAAU;GAC3B,IAAI,GAAa,yBAAyB,IAAO;GAEjD,AADA,EAAkB,EAAY,QAAO,MAAK,EAAE,OAAO,CAAE,CAAC,GAClD,MAAyB,MAC3B,GAAwB,IAAI,GAC5B,GAAkB,IAAI;EAE1B,OAAO,IAAI,MAAe,QAAQ,MAAe,OAAO;GACtD,IAAM,IAAM,EAAY,MAAK,MAAK,EAAE,OAAO,CAAE;GAC7C,IAAI,KAAO,EAAI,WAAW,MAAc,QAAQ;IAC9C,IAAI,EAAI,QAAQ,WAAW,QAAQ,GAAG;KACpC,IAAM,IAAa,SAAS,EAAI,QAAQ,MAAM,GAAG,CAAC,CAAC,EAAE,GAE/C,IAAmB,EAAa,SAAS,IAAQ;KACvD,AAAI,EAAa,YAAS,EAAa,QAAQ,aAAa,IAAa,KAAK;IAChF,OAAO;KACL,IAAI,IAAW,EAAI;KACnB,AAAK,gBAAgB,KAAK,CAAQ,MAChC,IAAW,aAAa;KAE1B,IAAM,IAAM,OAAO,KAAK,GAAU,UAAU,qBAAqB;KACjE,AAAI,MAAK,EAAI,SAAS;IACxB;IACA;GACF;GAAO,IAAI,MAAQ,EAAI,SAAS,UAAU,EAAI,SAAS,aAAa,EAAI,SAAS,SAAS;IACxF,IAAI,GAAa,uBAAuB,IAAO;IAI/C,AAFA,GAAoB;KAAE,GAAG,EAAI;KAAG,GAAG,EAAI;KAAG,MAAM,EAAI;KAAa,OAAO,EAAI;KAAI,QAAQ,EAAI;KAAQ,WAAW,EAAI;IAAU,CAAC,GAC9H,GAAe,EAAI,QAAQ,EAAE,GACzB,EAAI,SAAO,GAAgB,EAAI,KAAK;GAC1C,OAAO,IAAI,KAAO,EAAI,SAAS,QAAQ;IACrC,IAAI,GAAa,uBAAuB,IAAO;IAC/C,GAAmB,EAAI;GACzB;GACA,GAAwB,CAAE;GAE1B,IAAM,IAAY,EAAa,SACzB,IAAgB,GAAW,sBAAsB;GACvD,AAAI,KAAiB,KACnB,GAAkB;IAChB,KAAK,EAAE,UAAU,EAAc,MAAM,EAAU;IAC/C,MAAM,EAAE,UAAU,EAAc,OAAO,EAAU;GACnD,CAAC;EAEL;CACF,GAEM,KAAgB,EAAO,CAAC,GAExB,MAAgB,MAAqC;EAKzD,AAJA,GAAa;GACX,KAAK,EAAE,cAAc;GACrB,MAAM,EAAE,cAAc;EACxB,CAAC,GACG,EAAa,SAAS,MACxB,GAAc,UAAU,KAAK,MAAM,EAAE,cAAc,aAAa,EAAa,SAAS,IAAQ,GAAG;CAErG,GAEM,KAAO,EAAM,cAAc;EAC/B,IAAM,IAAgB,CAAC;EACvB,IAAI,CAAC,GAAQ,OAAO;EACpB,IAAI,MAAe,UACjB,KAAK,IAAI,IAAI,GAAG,KAAK,EAAO,UAAU,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;OAChD,IAAI,MAAe,UACxB,KAAK,IAAI,IAAI,GAAG,KAAK,EAAO,UAAU,KAAK,GACzC,EAAE,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,QAAO,MAAK,KAAK,EAAO,QAAQ,CAAC;OAEhD,IAAI,MAAe,gBAAgB;GACxC,EAAE,KAAK,CAAC,CAAC,CAAC;GACV,KAAK,IAAI,IAAI,GAAG,KAAK,EAAO,UAAU,KAAK,GACzC,EAAE,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,QAAO,MAAK,KAAK,EAAO,QAAQ,CAAC;EAEvD;EACA,OAAO;CACT,GAAG,CAAC,GAAQ,CAAU,CAAC,GAGjB,KAAmB,EAAa,SAAS,IAAQ,IACjD,KAAkB,EAAa,QAAQ;CAa7C,OAXA,QAAgB;EACd,IAAI,KAAU,EAAa,WAAW,MAAmB,cAAc;GACrE,IAAM,IAAW,EAAU,MAAM,EAAa,QAAQ,eAAe,GAC/D,IAAY,KAAK,IAAI,GAAG,KAAK,IAAI,GAAK,SAAS,GAAG,KAAK,MAAM,IAAW,EAAgB,CAAC,CAAC,GAC1F,IAAc,GAAK,KAAa,GAAK,EAAU,CAAC,KAAK;GAC3D,AAAI,MAAgB,KAClB,EAAW,CAAW;EAE1B;CACF,GAAG;EAAC,EAAU;EAAK;EAAO;EAAQ;EAAS;EAAkB;EAAgB;CAAI,CAAC,GAGhF,kBAAC,OAAD;EAAK,OAAO;GAAE,MAAM;GAAG,SAAS;GAAQ,WAAW;GAAG,iBAAiB;GAAmB,UAAU;EAAS;EAA7G,UAAA;GACG,KACC,kBAAC,IAAD;IACE,QAAQ;IACA;IACC;IACG;GACb,CAAA;GAEH,kBAAC,OAAD;IAAK,OAAO;KAAE,MAAM;KAAG,SAAS;KAAQ,eAAe;KAAU,UAAU;KAAG,iBAAiB;KAAmB,UAAU;IAAS;IAArI,UAAA;KAEC,MAAc,cACb,kBAAC,OAAD;MAAK,OAAO;OAAE,SAAS;OAAQ,YAAY;OAAU,KAAK;OAAO,SAAS;OAAY,iBAAiB;OAAQ,cAAc;OAAiC,QAAQ;MAAO;MAA7K,UAAA;OACE,kBAAC,GAAD;QAAY,MAAM,kBAAC,GAAD,EAAa,MAAM,GAAK,CAAA;QAAG,QAAQ,MAAe;QAAa,eAAe;SAAkF,AAAhF,EAAc,WAAW,GAAG,GAAgB,SAAS,GAAG,GAAkB,EAAG,GAAG,GAAsB,EAAE;QAAG;QAAG,OAAM;OAAkB,CAAA;OACxO,kBAAC,GAAD;QAAY,MAAM,kBAAC,GAAD,EAAO,MAAM,GAAK,CAAA;QAAG,QAAQ,MAAe;QAAY,eAAe;SAA+E,AAA7E,EAAc,UAAU,GAAG,GAAgB,SAAS,GAAG,GAAkB,CAAC,GAAG,GAAsB,CAAC;QAAG;QAAG,OAAM;OAAU,CAAA;OACrN,kBAAC,GAAD;QAAY,MAAM,kBAAC,IAAD,EAAM,MAAM,GAAK,CAAA;QAAG,QAAQ,MAAe;QAAQ,eAAe;SAAqD,AAAnD,EAAc,MAAM,GAAG,GAAgB,SAAS,GAAG,GAAkB,CAAC;QAAG;QAAG,OAAM;OAAQ,CAAA;OAC/K,GAAa,cAAc,MAC1B,kBAAC,GAAD;QAAY,MAAM,kBAAC,IAAD,EAAQ,MAAM,GAAK,CAAA;QAAG,QAAQ,MAAe;QAAa,eAAe;SAA0D,AAAxD,EAAc,WAAW,GAAG,GAAgB,SAAS,GAAG,GAAkB,CAAC;QAAG;QAAG,OAAM;OAAU,CAAA;OAGhM,kBAAC,OAAD,EAAK,OAAO;QAAE,OAAO;QAAO,QAAQ;QAAQ,iBAAiB;QAAuB,QAAQ;OAAQ,EAAI,CAAA;OAGxG,kBAAC,OAAD;QAAK,OAAO;SAAE,SAAS;SAAQ,KAAK;SAAO,aAAa;SAAiC,cAAc;QAAM;QAC3G,UAAA,kBAAC,GAAD;SAAY,MAAM,kBAAC,IAAD,EAAoB,MAAM,GAAK,CAAA;SAAG,QAAQ,MAAe;SAAW,eAAe;UAAkD,AAAhD,EAAc,SAAS,GAAG,GAAkB,CAAC,GAAG,GAAsB,CAAC;SAAG;SAAG,OAAM;QAAW,CAAA;OAClM,CAAA;OACL,kBAAC,OAAD;QAAK,OAAO;SAAE,SAAS;SAAQ,KAAK;QAAM;QAA1C,UAAA,CACE,kBAAC,GAAD;SAAY,MAAM,kBAAC,IAAD,EAAK,MAAM,GAAK,CAAA;SAAG,QAAQ,MAAe,cAAc,OAAmB;SAAG,eAAe;UAAmD,AAAjD,EAAc,UAAU,GAAG,GAAkB,CAAC,GAAG,GAAsB,CAAC;SAAG;SAAG,OAAM;QAAY,CAAA,GAChN,GAAa,yBAAyB,MACrC,kBAAC,GAAD;SAAY,MAAM,kBAAC,IAAD,EAAQ,MAAM,GAAK,CAAA;SAAG,QAAQ,MAAe;SAAU,eAAe,EAAc,QAAQ;SAAG,OAAM;QAAU,CAAA,CAEhI;;OAEL,kBAAC,OAAD,EAAK,OAAO;QAAE,OAAO;QAAO,QAAQ;QAAQ,iBAAiB;QAAuB,QAAQ;OAAQ,EAAI,CAAA;OAExG,kBAAC,OAAD;QAAK,OAAO;SAAE,SAAS;SAAQ,KAAK;QAAM;QAA1C,UAAA;SACE,kBAAC,GAAD;UAAY,MAAM,kBAAC,IAAD,EAAO,MAAM,GAAK,CAAA;UAAG,QAAQ,MAAe;UAAQ,eAAe,EAAc,MAAM;UAAG,OAAM;SAAQ,CAAA;SAC1H,kBAAC,GAAD;UAAY,MAAM,kBAAC,GAAD,EAAc,MAAM,GAAK,CAAA;UAAG,QAAQ,MAAe;UAAS,eAAe,EAAc,OAAO;UAAG,OAAM;SAAS,CAAA;SACpI,kBAAC,GAAD;UAAY,MAAM,kBAAC,IAAD,EAAQ,MAAM,GAAK,CAAA;UAAG,QAAQ,MAAe;UAAa,eAAe,EAAc,WAAW;UAAG,OAAM;SAAa,CAAA;SAC1I,kBAAC,GAAD;UAAY,MAAM,kBAAC,IAAD,EAAY,MAAM,GAAK,CAAA;UAAG,QAAQ,MAAe;UAAW,eAAe,EAAc,SAAS;UAAG,OAAM;SAAW,CAAA;SACxI,kBAAC,GAAD;UAAY,MAAM,kBAAC,GAAD,EAAU,MAAM,GAAK,CAAA;UAAG,QAAQ,MAAe;UAAQ,eAAe,EAAc,MAAM;UAAG,OAAM;SAAQ,CAAA;QAC1H;;OAEL,kBAAC,OAAD,EAAK,OAAO,EAAE,MAAM,EAAE,EAAI,CAAA;OAE1B,kBAAC,OAAD;QAAK,OAAO;SAAE,SAAS;SAAQ,YAAY;SAAU,KAAK;QAAO;QAAjE,UAAA;SACG;UAAC;UAAQ;UAAS;UAAa;UAAW;UAAY;SAAW,CAAC,CAAC,SAAS,KAAc,EAAE,KAC3F,kBAAC,OAAD;UAAK,OAAO;WAAE,SAAS;WAAQ,YAAY;WAAU,KAAK;WAAO,aAAa;WAAiC,cAAc;UAAO;UAApI,UAAA,CACE,kBAAC,QAAD;WAAM,OAAO;YAAE,UAAU;YAAQ,OAAO;YAAQ,UAAU;WAAO;WAAjE,UAAA,CAAoE,eAAW,kBAAC,UAAD,EAAA,UAAA,CAAS,IAAmB,IAAU,EAAA,CAAA,CAAO;UAC5H,CAAA,GAAA,kBAAC,SAAD;WACE,MAAK;WACL,KAAI;WACJ,KAAI;WACJ,OAAO,KAAK,IAAI,IAAI,KAAK,IAAI,GAAG,EAAkB,CAAC;WACnD,cAAc,MAAM,EAAE,gBAAgB;WACtC,WAAW,MAAM;YACf,IAAM,IAAM,SAAS,EAAE,OAAO,OAAO,EAAE;YAEvC,AADA,GAAsB,CAAG,GACrB,KAAwB,CAAC,KAC3B,EAAkB,EAAY,KAAI,MAAK,EAAE,OAAO,IAAuB;aAAE,GAAG;aAAG,aAAa;YAAI,IAAI,CAAC,CAAC;WAE1G;WACA,OAAO;YAAE,OAAO;YAAQ,QAAQ;WAAU;UAC3C,CAAA,CACE;;SAEP,kBAAC,OAAD;UAAK,OAAO;WAAE,SAAS;WAAQ,KAAK;UAAM;UACvC,UAAA;WAAC;WAAW;WAAW;WAAW;WAAW;WAAW;WAAW;UAAS,CAAC,CAAC,KAAI,MACjF,kBAAC,UAAD;WAEE,cAAc,MAAM,EAAE,eAAe;WACrC,eAAe;YAGb,AAFA,GAAgB,CAAK,GAEjB,KAAwB,CAAC,KAC3B,EAAkB,EAAY,KAAI,MAAK,EAAE,OAAO,IAAuB;aAAE,GAAG;aAAG;YAAM,IAAI,CAAC,CAAC;WAE/F;WACA,OAAO;YACL,OAAO;YAAQ,QAAQ;YAAQ,cAAc;YAAO,iBAAiB;YACrE,QAAQ,OAAiB,IAAQ,mBAAmB;YACpD,QAAQ;YAAW,SAAS;YAAQ,SAAS;WAC/C;UACD,GAdM,CAcN,CACF;SACE,CAAA;SACJ,KAAyB,KACxB,kBAAC,OAAD;UAAK,OAAO;WAAE,SAAS;WAAQ,YAAY;WAAU,KAAK;WAAO,YAAY;UAAM;UAAnF,UAAA,CACE,kBAAC,UAAD;WACE,eAAe,GAAqB,EAAI;WACxC,OAAO;YACL,SAAS;YACT,YAAY;YACZ,KAAK;YACL,iBAAiB;YACjB,OAAO;YACP,QAAQ;YACR,cAAc;YACd,SAAS;YACT,UAAU;YACV,YAAY;YACZ,QAAQ;YACR,WAAW;WACb;WACA,OAAM;WAhBR,UAAA;YAkBE,kBAAC,IAAD,EAAa,MAAM,GAAK,CAAA;YAAC;YACN;YAAuB;WACpC;UAER,CAAA,GAAA,kBAAC,UAAD;WACE,SAAS;WACT,OAAO;YACL,SAAS;YACT,YAAY;YACZ,KAAK;YACL,iBAAiB;YACjB,OAAO;YACP,QAAQ;YACR,cAAc;YACd,SAAS;YACT,UAAU;YACV,YAAY;YACZ,QAAQ;WACV;WACA,OAAM;WAfR,UAAA,CAiBE,kBAAC,IAAD;YAAQ,MAAM;YAAI,OAAM;WAAW,CAAA,GAAC,oBAE9B;UACL,CAAA,CAAA;;QAEJ;;MACF;;KAIN,MACC,kBAAC,OAAD;MAAK,OAAO;OACV,UAAU;OACV,KAAK;OAAG,MAAM;OAAG,OAAO;OAAG,QAAQ;OACnC,iBAAiB;OACjB,SAAS;OACT,YAAY;OACZ,gBAAgB;OAChB,QAAQ;MACV;MACE,UAAA,kBAAC,OAAD;OAAK,OAAO;QACV,iBAAiB;QACjB,cAAc;QACd,SAAS;QACT,OAAO;QACP,UAAU;QACV,WAAW;OACb;OAPA,UAAA;QAQE,kBAAC,OAAD;SAAK,OAAO;UAAE,SAAS;UAAQ,YAAY;UAAU,KAAK;UAAQ,cAAc;SAAO;SAAvF,UAAA,CACE,kBAAC,OAAD;UAAK,OAAO;WAAE,OAAO;WAAQ,QAAQ;WAAQ,cAAc;WAAO,iBAAiB;WAAW,SAAS;WAAQ,YAAY;WAAU,gBAAgB;WAAU,OAAO;UAAU;UAC9K,UAAA,kBAAC,IAAD,EAAa,MAAM,GAAK,CAAA;SACrB,CAAA,GACL,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,MAAD;UAAI,OAAO;WAAE,QAAQ;WAAG,UAAU;WAAQ,YAAY;WAAK,OAAO;UAAU;UAAG,UAAA;SAAqB,CAAA,GACpG,kBAAC,KAAD;UAAG,OAAO;WAAE,QAAQ;WAAG,UAAU;WAAQ,OAAO;UAAU;UAAG,UAAA;SAA4B,CAAA,CACtF,EAAA,CAAA,CACF;;QACL,kBAAC,KAAD;SAAG,OAAO;UAAE,UAAU;UAAQ,OAAO;UAAW,YAAY;UAAO,cAAc;SAAO;SAAxF,UAAA;UAA2F;UACtD,kBAAC,UAAD,EAAA,UAAA,CAAS,IAAuB,eAAqB,EAAA,CAAA;UAAC;SACxF;;QACH,kBAAC,OAAD;SAAK,OAAO;UAAE,SAAS;UAAQ,gBAAgB;UAAY,KAAK;SAAM;SAAtE,UAAA;UACE,kBAAC,UAAD;WACE,eAAe,GAAqB,EAAK;WACzC,OAAO;YACL,SAAS;YACT,cAAc;YACd,QAAQ;YACR,iBAAiB;YACjB,OAAO;YACP,UAAU;YACV,YAAY;YACZ,QAAQ;WACV;WACD,UAAA;UAEO,CAAA;UACR,kBAAC,UAAD;WACE,eAAe;YAEb,AADA,GAA2B,GAC3B,GAAqB,EAAK;WAC5B;WACA,OAAO;YACL,SAAS;YACT,cAAc;YACd,QAAQ;YACR,iBAAiB;YACjB,OAAO;YACP,UAAU;YACV,YAAY;YACZ,QAAQ;WACV;WACD,UAAA;UAEO,CAAA;UACR,kBAAC,UAAD;WACE,eAAe;YAGb,AAFA,GAAoB,MAAQ,EAAK,KAAI,OAAM;aAAE,GAAG;aAAG,QAAQ;YAAU,EAAE,CAAC,GACxE,IAAkB,MAAQ,EAAK,KAAI,OAAM;aAAE,GAAG;aAAG,QAAQ;YAAU,EAAE,CAAC,GACtE,GAAqB,EAAK;WAC5B;WACA,OAAO;YACL,SAAS;YACT,cAAc;YACd,QAAQ;YACR,iBAAiB;YACjB,OAAO;YACP,UAAU;YACV,YAAY;YACZ,QAAQ;WACV;WACD,UAAA;UAEO,CAAA;SACL;;OACF;;KACF,CAAA;KAMN,MAAe,eACd,kBAAC,SAAD,EAAA,UAAQ,shBAIC,CAAA;KAET,kBAAC,OAAD;MACE,WAAU;MACV,OAAO;OACL,MAAM;OACN,UAAU;OACV,UAAU;OACV,iBAAiB;OACjB,QAAQ,KAAY,aAAc,MAAe,SAAS,MAAe,OAAO,SAAU,MAAe,WAAW,SAAS;MAC/H;MACA,cAAc,MAAM;OAClB,IAAI,MAAa,GAAY,WAAW,EAAa,SAAS;QAC5D,IAAM,IAAK,EAAE,UAAU,GAAY,QAAQ,GACrC,IAAK,EAAE,UAAU,GAAY,QAAQ;QAE3C,AADA,EAAa,QAAQ,aAAa,GAAY,QAAQ,aAAa,GACnE,EAAa,QAAQ,YAAY,GAAY,QAAQ,YAAY;OACnE;MACF;MACA,oBAAoB;OAClB,AAAI,OACF,GAAa,EAAK,GAClB,GAAY,UAAU;MAE1B;MAtBF,UAAA;OAwBE,kBAAC,OAAD;QACE,KAAK;QACL,UAAU;QACV,cAAc,MAAM;SAClB,CAAI,MAAe,SAAS,MAAe,SACrC,EAAE,WAAW,MACf,GAAa,EAAI,GACjB,GAAY,UAAU;UACpB,GAAG,EAAE;UACL,GAAG,EAAE;UACL,YAAY,EAAE,cAAc;UAC5B,WAAW,EAAE,cAAc;SAC7B;QAGN;QACA,YAAY,MAAO;SACjB,AAAI,OACF,GAAa,EAAK,GAClB,GAAY,UAAU;QAE1B;QACA,gBAAgB,MAAM;SAGpB,AADA,EAAE,eAAe,GACjB,EAAE,gBAAgB;QACpB;QACA,OAAO;SACL,OAAO;SACP,QAAQ;SACR,UAAU;SACV,UAAU;QACZ;QAEQ,iBAAA;SACN,IAAM,KAAa,GAAe,GAAgB,MAA0B;UAC1E,IAAM,IAAO,IAAe,IAAS,KAAmB;UAGxD,IAAI,KAAgB,EAAa,YAI3B,IAAS,GAAc,UAAU,KAAK,IAAS,GAAc,UAAU,IACzE,OAAO;UAKX,IAAM,IAAW,MAAa,MAAwB,KAAc,MAAe,kBAAmB;WACpG,IAAI,MAAe,YACjB,OAAO;YACL,IAAI;YAAqB,MAAM;YAAqB,WAAW;YAC/D,GAAG;YAAG,GAAG;YAAG,OAAO;YAAG,QAAQ;YAAG,QAAQ;YACzC,OAAO;YAAc,aAAa;YAAoB,SAAS;WACjE;WACK,IAAI,MAAe,aAAa;YACrC,IAAI,IAAQ,KAAK,IAAI,EAAW,IAAI,EAAS,CAAC,GAC1C,IAAS,KAAK,IAAI,EAAW,IAAI,EAAS,CAAC,GAC3C,IAAI,KAAK,IAAI,EAAS,GAAG,EAAW,CAAC,GACrC,IAAI,KAAK,IAAI,EAAS,GAAG,EAAW,CAAC;YAKzC,OAJI,IAAS,OACX,IAAS,KAAK,IAAI,IAAI,CAAM,GAC5B,IAAI,EAAS,IAAI,IAEZ;aACL,IAAI;aAAqB,MAAM;aAAsB,WAAW;aAChE;aAAG;aAAG;aAAO;aACb,OAAO;aAAc,aAAa;aAAoB,SAAS;YACjE;WACF;WAAO,IAAI,MAAe,aAAa;YACrC,IAAI,IAAQ,KAAK,IAAI,EAAW,IAAI,EAAS,CAAC,GAC1C,IAAS,KAAK,IAAI,EAAW,IAAI,EAAS,CAAC,GAC3C,IAAI,KAAK,IAAI,EAAS,GAAG,EAAW,CAAC,GACrC,IAAI,KAAK,IAAI,EAAS,GAAG,EAAW,CAAC;YAKzC,OAJI,IAAS,OACX,IAAS,KAAK,IAAI,IAAI,CAAM,GAC5B,IAAI,EAAS,IAAI,IAEZ;aACL,IAAI;aAAqB,MAAM;aAAsB,WAAW;aAChE;aAAG;aAAG;aAAO;aACb,OAAO;aAAW,aAAa;aAAG,SAAS;YAC7C;WACF;WAAO,IAAI;YAAC;YAAQ;YAAS;YAAW;YAAa;YAAW;WAAM,CAAC,CAAC,SAAS,CAAoB,GAAG;YACtG,IAAM,IAAQ,KAAK,IAAI,EAAW,IAAI,EAAS,CAAC,GAC1C,IAAS,KAAK,IAAI,EAAW,IAAI,EAAS,CAAC,GAC3C,IAAI,KAAK,IAAI,EAAS,GAAG,EAAW,CAAC,GACrC,IAAI,KAAK,IAAI,EAAS,GAAG,EAAW,CAAC;YAE3C,OAAO;aACL,IAAI;aAAqB,MAAM;aAAmB,WAAW;aAC7D;aAAG;aAAG;aAAO;aAAQ,QAHP,MAAe,UAAU,MAAe,WAAW,MAAe,YAAa,CAAC,GAAU,CAAU,IAAI,KAAA;aAItH,OAAO;aAAc,aAAa;aAAoB,SAAS;YACjE;WACF;UACF,EAAA,CAAG,IAAI;UAEP,OAAO,EAAI,KAAK,GAAG,MAAS;WAC1B,IAAI,GACE,IAAK,EAAa,SAAS,eAAe;WAChD,AAAI,EAAI,WAAW,KACb,MAAS,MAAG,IAAQ,KAAK,IAAI,GAAG,IAAK,IAAI,EAAe,IACxD,MAAS,MAAG,IAAQ,KAAK,IAAI,IAAiB,IAAK,CAAC,MAExD,IAAQ,KAAK,IAAI,GAAG,IAAK,IAAI,KAAkB,CAAC;WAGlD,IAAM,IAAmB,KAAW,EAAQ,cAAc,IAAK,CAAC,GAAG,GAAa,CAAO,IAAI;WAE3F,OACE,kBAAC,EAAM,UAAP,EAAA,UAAA,CACE,kBAAC,IAAD;YACE,SAAS;YACD;YACD;YACG;YACV,gBAAgB,EAAa,SAAS,eAAe;YACrD,iBAAiB,EAAa,SAAS,gBAAgB;YACvD,WAAW,EAAU;YACrB,YAAY,EAAU;YACtB,SAAS;YACT,UAAU;YACV,eAAe,EAAa;YAC5B,gBAAgB,EAAa;YAClB;YACC;YACZ,aAAa;YACS;YACF;YACpB,aAAa;YACb,aAAa;YACb,WAAW;YACX,mBAAmB;YACnB,wBAAwB;YACxB,wBAAwB;aACtB,IAAI,GAAmB,WAAW,IAAiB;cACjD,GAAmB,UAAU;cAC7B;aACF;aAEA,AADA,GAAwB,IAAI,GAC5B,GAAkB,IAAI;YACxB;YACW;YACI;YACf,YAAY;YACZ,oBAAoB;YACpB,YAAY;WACb,CAAA,GACA,KAAoB,EAAiB,cAAc,YAAY;YAC9D,IAAM,IAAM,IAAW,OAAQ,IAAI,EAAa,QAAQ,EAAa,QAC/D,IAAM,IAAW,OAAQ,IAAI,EAAa,SAAS,EAAa,OAChE,IAAe,GAAiB,EAAiB,GAAG,EAAiB,GAAG,GAAU,GAAK,CAAG;YAChG,OACE,kBAAC,OAAD;aAAK,OAAO;cACV,UAAU;cACV,MAAM,IAAI,KAAS,KAAK,EAAa,IAAI,EAAM;cAC/C,KAAK,GAAG,IAAO,EAAa,IAAI,EAAM;cACtC,QAAQ;cACR,iBAAiB;cACjB,WAAW;cACX,cAAc;cACd,SAAS;cACT,eAAe;aACjB;aAVA,UAAA,CAWA,kBAAC,YAAD;cACE,KAAK;cACL,OAAO;cACP,WAAU,MAAK,GAAe,EAAE,OAAO,KAAK;cAC5C,SAAS,MAAM;eAEb,AAAK,EAAE,cAAc,eAAe,SAAS,EAAE,aAAqB,KAClE,GAAqB;cAEzB;cACA,YAAW,MAAK;eAAE,AAAI,EAAE,QAAQ,WAAW,CAAC,EAAE,aAAY,EAAE,eAAe,GAAG,GAAqB;cAAK;cACxG,OAAO;eACL,iBAAiB;eACjB,QAAQ;eACR,OAAO;eACP,UAAU;eACV,YAAY;eACZ,UAAU;eACV,WAAW;eACX,SAAS;eACT,QAAQ;eACR,SAAS;cACX;cACA,aAAa,EAAiB,SAAS,SAAS,iBAAiB;cACjE,WAAA;aACD,CAAA,GACD,kBAAC,OAAD;cAAK,OAAO;eAAE,SAAS;eAAQ,gBAAgB;eAAY,SAAS;eAAW,WAAW;cAAiB;cACzG,UAAA,kBAAC,UAAD;eACE,cAAc,MAAM;gBAAsB,AAApB,EAAE,eAAe,GAAG,GAAqB;eAAG;eAClE,OAAO;gBAAE,SAAS;gBAAY,YAAY;gBAAkB,OAAO;gBAAQ,QAAQ;gBAAQ,cAAc;gBAAO,QAAQ;gBAAW,UAAU;eAAO;eACrJ,UAAA;cAEO,CAAA;aACL,CAAA,CACF;;WAET,EAAA,CAAG,CACa,EAAA,GA3FK,CA2FL;UAEpB,CAAC;SACH;SAEA,IAAI,MAAmB,cACrB,OACE,kBAAC,OAAD;UAAK,OAAO;WACV,UAAU;WAAY,OAAO;WAAQ,QAAQ,GAAG,GAAK,SAAS,GAAiB;UACjF;UACG,UAAA,GAAK,KAAK,GAAK,MAAW,EAAU,GAAK,GAAQ,EAAI,CAAC;SACpD,CAAA;SAEF;UACL,IAAM,IAAkB,KAAK,IAAI,GAAG,GAAK,WAAU,MAAO,EAAI,SAAS,CAAO,CAAC,CAAC,GAC1E,IAAa,GAAK,MAAoB,CAAC;UAC7C,OACE,kBAAC,OAAD;WAAK,OAAO;YACV,UAAU;YAAY,OAAO;YAAQ,WAAW,GAAG,GAAiB;WACtE;WACG,UAAA,EAAU,GAAY,GAAiB,EAAK;UAC1C,CAAA;SAET;QACF,EAAA,CAAG;OACA,CAAA;OAGJ,MAAmB,kBAAkB,KACpC,kBAAC,OAAD;QAAK,OAAO;SACV,UAAU;SACV,QAAQ;SACR,MAAM;SACN,WAAW;SACX,SAAS;SACT,YAAY;SACZ,KAAK;SACL,iBAAiB;SACjB,SAAS;SACT,cAAc;SACd,OAAO;SACP,QAAQ;SACR,WAAW;QACb;QAdA,UAAA;SAeE,kBAAC,UAAD;UACE,eAAe,EAAW,KAAK,IAAI,GAAG,IAAU,CAAC,CAAC;UAClD,UAAU,KAAW;UACrB,OAAO;WAAE,YAAY;WAAQ,QAAQ;WAAQ,OAAO,KAAW,IAAI,SAAS;WAAQ,QAAQ,KAAW,IAAI,YAAY;WAAW,SAAS;WAAQ,YAAY;UAAS;UAExK,UAAA,kBAAC,GAAD,EAAa,MAAM,GAAK,CAAA;SAClB,CAAA;SACR,kBAAC,QAAD;UAAM,OAAO;WAAE,UAAU;WAAQ,YAAY;UAAI;UAAjD,UAAA;WAAoD;WAC5C;WAAQ;WAAK,EAAO;UACtB;;SACN,kBAAC,UAAD;UACE,eAAe,EAAW,KAAK,IAAI,EAAO,UAAU,IAAU,CAAC,CAAC;UAChE,UAAU,KAAW,EAAO;UAC5B,OAAO;WAAE,YAAY;WAAQ,QAAQ;WAAQ,OAAO,KAAW,EAAO,WAAW,SAAS;WAAQ,QAAQ,KAAW,EAAO,WAAW,YAAY;WAAW,SAAS;WAAQ,YAAY;UAAS;UAEpM,UAAA,kBAAC,GAAD,EAAc,MAAM,GAAK,CAAA;SACnB,CAAA;QACL;;OAIJ,CAAC,KACA,kBAAC,OAAD;QAAK,OAAO;SACV,UAAU;SACV,KAAK;SAAG,MAAM;SAAG,OAAO;SAAG,QAAQ;SACnC,SAAS;SACT,eAAe;SACf,KAAK;SACL,YAAY;SACZ,gBAAgB;SAChB,OAAO;SACP,SAAS;SACT,WAAW;QACb;QACG,UAAA,KACC,kBAAA,IAAA,EAAA,UAAA,CACE,kBAAC,OAAD;SAAK,OAAO;UAAE,YAAY;UAAK,OAAO;SAAoB;SACvD,UAAA,GAAU,SAAS,sBAAsB,yCAAyC;QAChF,CAAA,GACL,kBAAC,OAAD;SAAK,OAAO;UAAE,UAAU;UAAQ,UAAU;UAAS,WAAW;SAAa;SAAI,UAAA,GAAU;QAAa,CAAA,CACtG,EAAA,CAAA,IACA,IAAa,sBAAsB;OACpC,CAAA;OAIN,KACC,kBAAC,OAAD;QAAK,OAAO;SACV,UAAU;SACV,QAAQ;SACR,MAAM;SACN,WAAW;SACX,iBAAiB;SACjB,OAAO;SACP,SAAS;SACT,cAAc;SACd,SAAS;SACT,YAAY;SACZ,KAAK;SACL,QAAQ;SACR,WAAW;SACX,gBAAgB;QAClB;QAfA,UAAA;SAgBE,kBAAC,UAAD;UACE,eAAe;WAEb,IAAM,IAAmB,EAAa,SAAS,IAAQ;WACvD,AAAG,EAAa,YAAS,EAAa,QAAQ,aAAa,KAAK,IAAI,GAAG,IAAU,CAAC,IAAI,KAAK;UAC7F;UACA,UAAU,KAAW;UACrB,OAAO;WAAE,YAAY;WAAQ,QAAQ;WAAQ,OAAO,KAAW,IAAI,0BAA0B;WAAS,QAAQ,KAAW,IAAI,YAAY;WAAW,SAAS;WAAQ,SAAS;UAAE;UAEhL,UAAA,kBAAC,GAAD,EAAa,MAAM,GAAK,CAAA;SAClB,CAAA;SACR,kBAAC,QAAD;UAAM,OAAO;WAAE,UAAU;WAAQ,YAAY;WAAK,UAAU;WAAQ,WAAW;UAAS;UAAxF,UAAA;WAA2F;WACnF;WAAQ;WAAI,EAAO;UACrB;;SACN,kBAAC,UAAD;UACE,eAAe;WAEb,IAAM,IAAmB,EAAa,SAAS,IAAQ;WACvD,AAAG,EAAa,YAAS,EAAa,QAAQ,aAAa,KAAK,IAAI,EAAO,UAAU,IAAU,CAAC,IAAI,KAAK;UAC3G;UACA,UAAU,KAAW,EAAO;UAC5B,OAAO;WAAE,YAAY;WAAQ,QAAQ;WAAQ,OAAO,KAAW,EAAO,WAAW,0BAA0B;WAAS,QAAQ,KAAW,EAAO,WAAW,YAAY;WAAW,SAAS;WAAQ,SAAS;UAAE;UAE5M,UAAA,kBAAC,GAAD,EAAc,MAAM,GAAK,CAAA;SACnB,CAAA;QACL;;OAIN,KAAwB,MACvB,kBAAC,IAAD;QACE,YAAY,EAAY,MAAK,MAAK,EAAE,OAAO,CAAoB;QAC/D,UAAU;QACV,cAAc;SACZ,IAAM,IAAY,EAAY,MAAK,MAAK,EAAE,OAAO,CAAoB;SACrE,IAAI,GAAW;UACb,IAAM,IAAS;WAAE,GAAG;WAAW,IAAI,KAAK,OAAO,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,OAAO,GAAG,CAAC;WAAG,GAAG,EAAU,IAAI;WAAI,GAAG,EAAU,IAAI;UAAG;UACrH,EAAkB,CAAC,GAAG,GAAa,CAAM,CAAC;SAC5C;SAEA,AADA,GAAwB,IAAI,GAC5B,GAAkB,IAAI;QACxB;QACA,gBAAgB;SAGd,AAFA,EAAkB,EAAY,QAAO,MAAK,EAAE,OAAO,CAAoB,CAAC,GACxE,GAAwB,IAAI,GAC5B,GAAkB,IAAI;QACxB;QACA,gBAAgB,MAAkB;SAChC,EAAkB,EAAY,KAAI,MAAK,EAAE,OAAO,IAAuB;UAAE,GAAG;UAAG;SAAM,IAAI,CAAC,CAAC;QAC7F;QACA,uBAAuB;SAErB,AADA,GAAmB,EAAI,GACvB,GAAkB,IAAI;QACxB;QACa;OACd,CAAA;MAIF;;IACF;;GAEJ,MAAmB,KAClB,kBAAC,IAAD;IACE,YAAY,EAAY,MAAK,MAAK,EAAE,OAAO,CAAoB,CAAC,EAAE,WAAW;IAC7E,aAAa,EAAY,MAAK,MAAK,EAAE,OAAO,CAAoB,CAAC,EAAE,QAAQ;IAC3E,eAAe,CAAC,EAAY,MAAK,MAAK,EAAE,OAAO,CAAoB,CAAC,EAAE,SAAS,EAAY,MAAK,MAAK,EAAE,OAAO,CAAoB,CAAC,EAAE,SAAS,MAAM,EAAY,MAAK,MAAK,EAAE,OAAO,CAAoB,CAAC,EAAE,SAAS,KAAA;IACnN,eAAe;KACb,IAAM,IAAM,EAAY,MAAK,MAAK,EAAE,OAAO,CAAoB;KAK/D,AAJI,KAAO,CAAC,EAAI,WACb,EAAkB,EAAY,QAAO,MAAK,EAAE,OAAO,CAAoB,CAAC,GAE3E,GAAmB,EAAK,GACxB,GAAwB,IAAI;IAC9B;IACA,SAAS,GAAK,MAAS;KAUrB,AATA,EAAkB,EAAY,KAAI,MAAK;MACrC,IAAI,EAAE,OAAO,GAAsB;OACjC,IAAM,IAAU,MAAS,KAAA,IAAmB,EAAE,OAAT,GAC/B,IAAW,IAAU,KAAK,IAAI,KAAK,EAAQ,SAAS,IAAI,EAAE,IAAI,EAAE;OACtE,OAAO;QAAE,GAAG;QAAG,SAAS;QAAK,MAAM;QAAS,OAAO;OAAS;MAC9D;MACA,OAAO;KACT,CAAC,CAAC,GACF,GAAmB,EAAK,GACxB,GAAwB,IAAI;IAC9B;GACD,CAAA;GAEF,KACC,kBAAC,IAAD;IACE,QAAQ;IACR,WAAW;IACX,cAAc;IACD;IACb,gBAAgB;IACM;IACG;IACzB,UAAU;IACK;IACF;IACG;IAChB,eAAe;GAChB,CAAA;EAEA;;AAET;AAEA,SAAS,EAAW,EAAE,SAAM,WAAQ,YAAS,YAAyF;CACpI,OACE,kBAAC,UAAD;EACW;EACT,OAAO;EACP,OAAO;GACL,SAAS;GAAQ,YAAY;GAAU,gBAAgB;GACvD,OAAO;GAAQ,QAAQ;GAAQ,QAAQ;GAAQ,cAAc;GAC7D,iBAAiB,IAAS,YAAY;GACtC,OAAO,IAAS,mBAAmB;GACnC,QAAQ;EACV;EACA,eAAc,MAAK;GAAE,AAAK,MAAQ,EAAE,cAAc,MAAM,kBAAkB;EAAU;EACpF,eAAc,MAAK;GAAE,AAAK,MAAQ,EAAE,cAAc,MAAM,kBAAkB;EAAc;EAEvF,UAAA;CACK,CAAA;AAEZ;;;AC74CA,SAAwB,GAAc,EAAE,YAAS,kBAAe,uBAAwC;CACtG,IAAM,EAAE,cAAW,sBAAmB,GAAa,GAC7C,CAAC,GAAW,KAAgB,EAAS,oBAAoB,GACzD,CAAC,GAAe,KAAoB,EAA4B,IAAI,GAEpE,KAAiB,GAAwB,MAAuB;EAKpE,IAJA,EAAE,eAAe,GACjB,EAAE,gBAAgB,GAGd;GAAC;GAAQ;GAAW;GAAS;EAAK,CAAC,CAAC,SAAS,EAAE,GAAG,GAAG;EAEzD,IAAI,IAAO,CAAC;EAGZ,CAFI,EAAE,WAAW,EAAE,YAAS,EAAK,KAAK,SAAS,GAC3C,EAAE,YAAU,EAAK,KAAK,OAAO,GAC7B,EAAE,UAAQ,EAAK,KAAK,KAAK;EAG7B,IAAI,IAAM,EAAE,IAAI,YAAY;EAG5B,AAFI,MAAQ,QAAK,IAAM,UAEvB,EAAK,KAAK,CAAG;EAKb,IAAM,IAAkB,EAAK,KAAI,MAAK,MAAM,YAAY,SAAS,MAAM,UAAU,UAAU,MAAM,QAAQ,QAAQ,CAAC,CAAC,CAAC,KAAK,GAAG;EAG5H,AADA,EAAe,GAAQ,CAAe,GACtC,EAAiB,IAAI;CACvB,GAEM,KAA2B,MACxB,EAAI,QAAQ,eAAe,SAAS,CAAC,CAAC,QAAQ,OAAO,KAAK,CAAC,CAAC,YAAY;CAGjF,OACE,kBAAC,OAAD;EAAK,OAAO;GAAE,UAAU;GAAS,KAAK;GAAG,MAAM;GAAG,OAAO;GAAQ,QAAQ;GAAQ,iBAAiB;GAAmB,QAAQ;GAAM,SAAS;GAAQ,YAAY;GAAU,gBAAgB;EAAS;EACjM,UAAA,kBAAC,OAAD;GAAK,OAAO;IAAE,iBAAiB;IAAQ,cAAc;IAAO,OAAO;IAAS,QAAQ;IAAS,UAAU;IAAQ,WAAW;IAAQ,SAAS;IAAQ,eAAe;IAAU,WAAW;GAA8B;GAArN,UAAA;IAGE,kBAAC,OAAD;KAAK,OAAO;MAAE,SAAS;MAAa,cAAc;MAAiC,SAAS;MAAQ,gBAAgB;MAAiB,YAAY;KAAS;KAA1J,UAAA,CACE,kBAAC,MAAD;MAAI,OAAO;OAAE,QAAQ;OAAG,UAAU;OAAQ,YAAY;MAAI;MAAG,UAAA;KAAY,CAAA,GACzE,kBAAC,UAAD;MAAQ,SAAS;MAAS,OAAO;OAAE,YAAY;OAAQ,QAAQ;OAAQ,QAAQ;OAAW,OAAO;MAAoB;MACnH,UAAA,kBAAC,GAAD,EAAG,MAAM,GAAK,CAAA;KACR,CAAA,CACL;;IAGL,kBAAC,OAAD;KAAK,OAAO;MAAE,SAAS;MAAa,cAAc;KAAgC;KAChF,UAAA,kBAAC,OAAD;MAAK,OAAO,EAAE,UAAU,WAAW;MAAnC,UAAA,CACE,kBAAC,IAAD;OAAQ,MAAM;OAAI,OAAM;OAAoB,OAAO;QAAE,UAAU;QAAY,MAAM;QAAQ,KAAK;OAAO;MAAI,CAAA,GACzG,kBAAC,SAAD;OACE,MAAK;OACL,OAAO;QAAE,OAAO;QAAQ,SAAS;QAAqB,QAAQ;QAAiC,cAAc;QAAO,WAAW;OAAa;MAC7I,CAAA,CACE;;IACF,CAAA;IAGL,kBAAC,OAAD;KAAK,OAAO;MAAE,SAAS;MAAQ,MAAM;MAAG,UAAU;KAAS;KAA3D,UAAA,CAEE,kBAAC,OAAD;MAAK,OAAO;OAAE,OAAO;OAAS,aAAa;OAAiC,iBAAiB;OAAW,SAAS;OAAQ,eAAe;MAAS;MAC9I,UAAA,CAAC,WAAW,oBAAoB,CAAC,CAAC,KAAI,MACrC,kBAAC,OAAD;OAEE,eAAe,EAAa,CAAG;OAC/B,OAAO;QACL,SAAS;QACT,QAAQ;QACR,iBAAiB,MAAc,IAAM,YAAY;QACjD,OAAO,MAAc,IAAM,mBAAmB;QAC9C,YAAY,MAAc,IAAM,MAAM;OACxC;OAEC,UAAA;MACE,GAXE,CAWF,CACN;KACE,CAAA,GAGL,kBAAC,OAAD;MAAK,OAAO;OAAE,MAAM;OAAG,WAAW;OAAQ,SAAS;MAAO;MAA1D,UAAA,CACG,MAAc,wBACb,kBAAC,SAAD;OAAO,OAAO;QAAE,OAAO;QAAQ,gBAAgB;QAAY,UAAU;OAAO;OAA5E,UAAA,CACE,kBAAC,SAAD,EAAA,UACE,kBAAC,MAAD;QAAI,OAAO;SAAE,cAAc;SAAiC,WAAW;SAAQ,OAAO;QAAoB;QAA1G,UAAA;SACE,kBAAC,MAAD;UAAI,OAAO;WAAE,SAAS;WAAO,YAAY;UAAI;UAAG,UAAA;SAAW,CAAA;SAC3D,kBAAC,MAAD;UAAI,OAAO;WAAE,SAAS;WAAO,YAAY;UAAI;UAAG,UAAA;SAAe,CAAA;SAC/D,kBAAC,MAAD;UAAI,OAAO;WAAE,SAAS;WAAO,YAAY;WAAK,OAAO;UAAO;UAAG,UAAA;SAAU,CAAA;QACvE;OACC,CAAA,EAAA,CAAA,GACP,kBAAC,SAAD,EAAA,UACG,EAAU,KAAK,MACd,kBAAC,MAAD;QAAmB,OAAO,EAAE,cAAc,oBAAoB;QAA9D,UAAA;SACE,kBAAC,MAAD;UAAI,OAAO;WAAE,SAAS;WAAY,OAAO;UAAoB;UAC1D,UAAA,MAAkB,EAAE,SACnB,kBAAC,SAAD;WACE,WAAA;WACA,MAAK;WACL,aAAY;WACZ,YAAY,MAAM,EAAc,GAAG,EAAE,MAAM;WAC3C,cAAc,EAAiB,IAAI;WACnC,OAAO;YAAE,SAAS;YAAW,OAAO;YAAS,QAAQ;YAA4B,cAAc;YAAO,SAAS;WAAO;UACvH,CAAA,IAED,EAAwB,EAAE,OAAO;SAEjC,CAAA;SACJ,kBAAC,MAAD;UAAI,OAAO,EAAE,SAAS,WAAW;UAAI,UAAA,EAAE;SAAgB,CAAA;SACvD,kBAAC,MAAD;UAAI,OAAO,EAAE,SAAS,WAAW;UAC/B,UAAA,kBAAC,UAAD;WACE,eAAe,EAAiB,EAAE,MAAM;WACxC,OAAO;YAAE,YAAY;YAAQ,QAAQ;YAAQ,QAAQ;YAAW,OAAO;WAAoB;WAE3F,UAAA,kBAAC,GAAD,EAAO,MAAM,GAAK,CAAA;UACZ,CAAA;SACN,CAAA;QACF;OAxBK,GAAA,EAAE,MAwBP,CACL,EACI,CAAA,CACF;MAKR,CAAA,GAAA,MAAc,aACb,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,OAAD;OAAK,OAAO;QAAE,OAAO;QAAqB,WAAW;QAAU,cAAc;OAAO;OAAG,UAAA;MAElF,CAAA,GAEL,kBAAC,OAAD;OAAK,OAAO,EAAE,WAAW,OAAO;OAAhC,UAAA;QACE,kBAAC,SAAD;SAAO,OAAO;UAAE,SAAS;UAAS,UAAU;UAAQ,YAAY;UAAK,OAAO;UAAW,cAAc;SAAM;SAAG,UAAA;QAEvG,CAAA;QACP,kBAAC,OAAD;SAAK,OAAO;UAAE,UAAU;UAAQ,OAAO;UAAqB,cAAc;SAAM;SAAG,UAAA;QAE9E,CAAA;QACL,kBAAC,SAAD;SACE,MAAK;SACL,OAAO;SACP,WAAW,MAAM,EAAiB,EAAE,OAAO,KAAK;SAChD,aAAY;SACZ,OAAO;UACL,OAAO;UACP,SAAS;UACT,QAAQ;UACR,cAAc;UACd,UAAU;UACV,SAAS;SACX;QACD,CAAA;OACE;MACF,CAAA,CAAA,EAAA,CAAA,CAEJ;KACF,CAAA,CAAA;;GAEF;;CACF,CAAA;AAET;;;ACrKA,SAAwB,EAAW,EAAE,cAA4B;CAC/D,OACE,kBAAC,OAAD;EAAK,OAAO;GACV,UAAU;GAAS,KAAK;GAAG,MAAM;GAAG,OAAO;GAAG,QAAQ;GACtD,iBAAiB;GAAmB,SAAS;GAAQ,YAAY;GAAU,gBAAgB;GAC3F,QAAQ;EACV;EACE,UAAA,kBAAC,OAAD;GAAK,OAAO;IACV,iBAAiB;IACjB,OAAO;IACP,cAAc;IACd,OAAO;IACP,UAAU;IACV,WAAW;IACX,YAAY;IACZ,UAAU;IACV,SAAS;IACT,eAAe;IACf,WAAW;GACb;GAZA,UAAA;IAcE,kBAAC,OAAD;KAAK,OAAO;MACV,SAAS;MAAa,cAAc;MACpC,SAAS;MAAQ,YAAY;MAAU,gBAAgB;MACvD,iBAAiB;KACnB;KAJA,UAAA,CAKE,kBAAC,OAAD;MAAK,OAAO;OAAE,SAAS;OAAQ,YAAY;OAAU,KAAK;MAAM;MAAhE,UAAA,CACE,kBAAC,IAAD;OAAM,MAAM;OAAI,OAAM;MAAW,CAAA,GACjC,kBAAC,MAAD;OAAI,OAAO;QAAE,QAAQ;QAAG,UAAU;QAAQ,YAAY;QAAK,OAAO;OAAU;OAAG,UAAA;MAAS,CAAA,CACrF;KACL,CAAA,GAAA,kBAAC,UAAD;MACE,SAAS;MACT,OAAO;OAAE,YAAY;OAAQ,QAAQ;OAAQ,QAAQ;OAAW,OAAO;MAAU;MAEjF,UAAA,kBAAC,GAAD,EAAG,MAAM,GAAK,CAAA;KACR,CAAA,CACL;;IAGL,kBAAC,OAAD;KAAK,OAAO;MAAE,SAAS;MAAQ,WAAW;KAAO;KAAjD,UAAA;MACE,kBAAC,OAAD;OAAK,OAAO;QAAE,WAAW;QAAU,cAAc;OAAO;OAAxD,UAAA;QACE,kBAAC,MAAD;SAAI,OAAO;UAAE,QAAQ;UAAa,UAAU;UAAQ,OAAO;SAAU;SAAG,UAAA;QAAuB,CAAA;QAC/F,kBAAC,KAAD;SAAG,OAAO;UAAE,QAAQ;UAAG,UAAU;UAAQ,OAAO;SAAU;SAAG,UAAA;QAAgB,CAAA;QAC7E,kBAAC,KAAD;SAAG,OAAO;UAAE,QAAQ;UAAa,UAAU;UAAQ,OAAO;SAAU;SAAG,UAAA;QAAmD,CAAA;QAC1H,kBAAC,KAAD;SAAG,MAAK;SAA2B,QAAO;SAAS,KAAI;SAAsB,OAAO;UAAE,SAAS;UAAgB,QAAQ;UAAa,UAAU;UAAQ,OAAO;UAAW,gBAAgB;UAAQ,YAAY;SAAI;SAAG,UAAA;QAAmB,CAAA;QACtO,kBAAC,KAAD;SAAG,OAAO;UAAE,QAAQ;UAAa,UAAU;UAAQ,OAAO;UAAW,WAAW;SAAS;SAAG,UAAA;QAEzF,CAAA;OACA;;MAEL,kBAAC,MAAD;OAAI,OAAO;QAAE,UAAU;QAAQ,YAAY;QAAK,OAAO;QAAW,cAAc;QAAqB,eAAe;QAAO,cAAc;OAAO;OAAG,UAAA;MAAkC,CAAA;MACrL,kBAAC,KAAD;OAAG,OAAO;QAAE,UAAU;QAAQ,OAAO;QAAW,YAAY;QAAK,cAAc;OAAO;OAAG,UAAA;MAEtF,CAAA;MAEH,kBAAC,MAAD;OAAI,OAAO;QAAE,aAAa;QAAQ,QAAQ;QAAG,UAAU;QAAQ,OAAO;QAAW,SAAS;QAAQ,eAAe;QAAU,KAAK;OAAM;OAAtI,UAAA;QACE,kBAAC,MAAD,EAAA,UAAA,CAAI,kBAAC,UAAD,EAAA,UAAQ,aAAkB,CAAA,GAAC,wEAA0E,EAAA,CAAA;QACzG,kBAAC,MAAD,EAAA,UAAA,CAAI,kBAAC,UAAD,EAAA,UAAQ,UAAe,CAAA,GAAC,4DAA8D,EAAA,CAAA;QAC1F,kBAAC,MAAD,EAAA,UAAA;SAAI,kBAAC,UAAD,EAAA,UAAQ,QAAa,CAAA;SAAC;SAAG,kBAAC,UAAD,EAAA,UAAQ,YAAiB,CAAA;SAAC;QAAoE,EAAA,CAAA;QAC3H,kBAAC,MAAD,EAAA,UAAA,CAAI,kBAAC,UAAD,EAAA,UAAQ,eAAoB,CAAA,GAAC,kEAAoE,EAAA,CAAA;QACrG,kBAAC,MAAD,EAAA,UAAA,CAAI,kBAAC,UAAD,EAAA,UAAQ,aAAkB,CAAA,GAAC,kFAAoF,EAAA,CAAA;QACnH,kBAAC,MAAD,EAAA,UAAA,CAAI,kBAAC,UAAD,EAAA,UAAQ,OAAY,CAAA,GAAC,6EAA+E,EAAA,CAAA;OACtG;;MAEJ,kBAAC,OAAD;OAAK,OAAO;QAAE,WAAW;QAAQ,UAAU;QAAQ,WAAW;OAAS;OACrE,UAAA,kBAAC,KAAD;QAAG,MAAK;QAAyB,QAAO;QAAS,KAAI;QAAsB,OAAO;SAAE,OAAO;SAAW,gBAAgB;SAAQ,YAAY;QAAI;QAAG,UAAA;OAE9I,CAAA;MACA,CAAA;KACF;;IAGL,kBAAC,OAAD;KAAK,OAAO;MAAE,SAAS;MAAa,iBAAiB;MAAW,WAAW;MAAqB,SAAS;MAAQ,gBAAgB;KAAW;KAC1I,UAAA,kBAAC,UAAD;MACE,SAAS;MACT,OAAO;OACL,iBAAiB;OAAW,OAAO;OAAQ,QAAQ;OAAQ,cAAc;OACzE,SAAS;OAAY,UAAU;OAAQ,YAAY;OAAK,QAAQ;MAClE;MACD,UAAA;KAEO,CAAA;IACL,CAAA;GACF;;CACF,CAAA;AAET;;;ACrFA,IAAa,IAAb,MAAuB;CACrB,4BAA6B,IAAI,IAAmC;CACpE,YAAoB;CAGpB,GAAgB,GAAc,GAAsC;EAClE,IAAI,KAAK,WAAW,aAAa,CAAC;EAClC,IAAI,IAAM,KAAK,UAAU,IAAI,CAAI;EAMjC,OALK,MACH,oBAAM,IAAI,IAAI,GACd,KAAK,UAAU,IAAI,GAAM,CAAG,IAE9B,EAAI,IAAI,CAAQ,SACH,KAAK,IAAI,GAAM,CAAQ;CACtC;CAGA,KAAkB,GAAc,GAAsC;EACpE,IAAM,IAAM,KAAK,GAAM,IAAO,MAAW;GAEvC,AADA,EAAI,GACJ,EAAS,CAAM;EACjB,CAAC;EACD,OAAO;CACT;CAEA,IAAiB,GAAc,GAAgC;EAC7D,IAAM,IAAM,KAAK,UAAU,IAAI,CAAI;EAC9B,MACL,EAAI,OAAO,CAAQ,GACf,EAAI,SAAS,KAAG,KAAK,UAAU,OAAO,CAAI;CAChD;CAGA,KAAkB,GAAc,GAAkB;EAChD,IAAI,KAAK,WAAW;EACpB,IAAM,IAAM,KAAK,UAAU,IAAI,CAAI;EAC/B,OAAC,KAAO,EAAI,SAAS,IACzB,KAAK,IAAM,KAAY,MAAM,KAAK,CAAG,GACnC,IAAI;GACF,EAAS,CAAW;EACtB,SAAS,GAAK;GACZ,QAAQ,MAAM,uCAAuC,EAAK,UAAU,CAAG;EACzE;CAEJ;CAEA,cAAc,GAAuB;EACnC,IAAI,GAAM,OAAO,KAAK,UAAU,IAAI,CAAI,CAAC,EAAE,QAAQ;EACnD,IAAI,IAAI;EACR,KAAK,IAAM,KAAO,KAAK,UAAU,OAAO,GAAG,KAAK,EAAI;EACpD,OAAO;CACT;CAEA,YAAkB;EAChB,KAAK,UAAU,MAAM;CACvB;CAGA,UAAgB;EAEd,AADA,KAAK,UAAU,GACf,KAAK,YAAY;CACnB;CAEA,IAAI,cAAuB;EACzB,OAAO,KAAK;CACd;AACF,GC1Da,KAAmB,UAmB1B,MAAY,MAAgB;CAChC,IAAM,IAAO,kBAAkB,KAAK,CAAG,IAAI,IAAM,WAC3C,IAAI,SAAS,EAAK,MAAM,GAAG,CAAC,GAAG,EAAE,IAAI,KACrC,IAAI,SAAS,EAAK,MAAM,GAAG,CAAC,GAAG,EAAE,IAAI,KACrC,IAAI,SAAS,EAAK,MAAM,GAAG,CAAC,GAAG,EAAE,IAAI;CAC3C,OAAO,EAAI,GAAG,GAAG,CAAC;AACpB;AAEA,eAAsB,GAAc,GAAoB,IAAyB,CAAC,GAAwB;CACxG,AAAI,EAAQ,cACV,QAAQ,KAAK,mHAAmH;CAGlI,IAAM,IAAM,MAAM,EAAM,eAAe,GACjC,IAAc,aAAe,aAAa,IAAM,IAAI,WAAW,CAAG;CACxE,IAAI,EAAY,aAAA,UAA+B;EAC7C,IAAM,KAAU,EAAY,aAAc,QAAA,CAAc,QAAQ,CAAC;EACjE,MAAU,MACR,sBAAsB,EAAO,mHAE/B;CACF;CAEA,IAAM,IAAS,MAAM,EAAY,KAAK,GAAa,EAAE,kBAAkB,GAAK,CAAC,GACvE,IAAQ,EAAO,SAAS,GACxB,IAAO,EAAQ,uBAAuB,EAAM,aAG5C,IAAQ;CAEd,KAAK,IAAM,KAAO,GAAM;EAEtB,IAAM,IAAO,EADS,KAAK,IAAI,GAAG,KAAK,KAAK,EAAI,aAAa,KAAK,GAAG,EAAM,SAAS,CAAC,CAClE,IACb,EAAE,cAAW,EAAK,QAAQ,GAE1B,IAAQ,GAAS,EAAI,SAAS,SAAS,GACvC,IAAU,EAAI,WAAW,GACzB,IAAc,EAAI,eAAe;EAEvC,IAAI,EAAI,SAAS,aACf,EAAK,cAAc;GACjB,GAAG,EAAI,IAAI;GACX,GAAG,IAAS,EAAI,IAAI,IAAQ,EAAI,SAAS;GACzC,OAAO,EAAI,QAAQ;GACnB,QAAQ,EAAI,SAAS;GACrB;GACA;GACA,aAAa;GACb,aAAa;EACf,CAAC;OACI,IAAI,EAAI,SAAS,UAAU,EAAI,MACpC,EAAK,SAAS,EAAI,MAAM;GACtB,GAAG,EAAI,IAAI;GACX,GAAG,IAAS,EAAI,IAAI,IAAQ;GAC5B,MAAM,KAAK;GACX;GACA;EACF,CAAC;OACI,IAAI,EAAI,SAAS,WACtB,EAAK,YAAY;GACf,IAAI,EAAI,IAAI,EAAI,QAAQ,KAAK;GAC7B,GAAG,KAAU,EAAI,IAAI,EAAI,SAAS,KAAK;GACvC,QAAQ,EAAI,QAAQ,IAAI;GACxB,QAAQ,EAAI,SAAS,IAAI;GACzB;GACA;GACA,aAAa;GACb,aAAa;EACf,CAAC;OACI,IAAI,EAAI,SAAS,UAAU,EAAI,UAAU,EAAI,OAAO,UAAU,GACnE,EAAK,SAAS;GACZ,OAAO;IAAE,GAAG,EAAI,OAAO,EAAE,CAAC,IAAI;IAAO,GAAG,IAAS,EAAI,OAAO,EAAE,CAAC,IAAI;GAAM;GACzE,KAAK;IAAE,GAAG,EAAI,OAAO,EAAE,CAAC,IAAI;IAAO,GAAG,IAAS,EAAI,OAAO,EAAE,CAAC,IAAI;GAAM;GACvE;GACA;GACA,WAAW;EACb,CAAC;OACI,IAAI,EAAI,SAAS,cAAc,EAAI,UAAU,EAAI,OAAO,SAAS,GAAG;GACzE,IAAM,IAAI,KAAK,EAAI,OAAO,KAAK,MAAM,GAAG,EAAE,IAAI,EAAM,GAAG,IAAS,EAAE,IAAI,GAAO,CAAC,CAAC,KAAK,KAAK;GACzF,EAAK,YAAY,GAAG;IAAE,aAAa;IAAO,aAAa;IAAa;GAAQ,CAAC;EAC/E,OAAO,IAAI,EAAI,SAAS,QAUtB,AATA,EAAK,cAAc;GACjB,GAAG,EAAI,IAAI;GACX,GAAG,IAAS,EAAI,IAAI,IAAQ;GAC5B,OAAO;GACP,QAAQ;GACR,OAAO,EAAI,GAAG,KAAM,EAAG;GACvB,aAAa;GACb,aAAa;EACf,CAAC,GACG,EAAI,QACN,EAAK,SAAS,EAAI,MAAM;GACtB,IAAI,EAAI,IAAI,MAAM;GAClB,GAAG,IAAS,EAAI,IAAI,IAAQ;GAC5B,MAAM,KAAK;GACX;GACA;EACF,CAAC;OAEE,IAAI,EAAI,SAAS,aAAa,EAAI,UAAU,EAAI,OAAO,UAAU,GAQtE,AAPA,EAAK,SAAS;GACZ,OAAO;IAAE,GAAG,EAAI,OAAO,EAAE,CAAC,IAAI;IAAO,GAAG,IAAS,EAAI,OAAO,EAAE,CAAC,IAAI;GAAM;GACzE,KAAK;IAAE,GAAG,EAAI,OAAO,EAAE,CAAC,IAAI;IAAO,GAAG,IAAS,EAAI,OAAO,EAAE,CAAC,IAAI;GAAM;GACvE;GACA;GACA,WAAW;EACb,CAAC,GACG,EAAI,SACN,EAAK,cAAc;GACjB,GAAG,EAAI,OAAO,EAAE,CAAC,IAAI;GACrB,GAAG,IAAS,EAAI,OAAO,EAAE,CAAC,IAAI,IAAQ;GACtC,QAAQ,EAAI,KAAK,SAAS,IAAI,MAAM;GACpC,QAAQ,KAAK;GACb,OAAO,EAAI,GAAG,GAAG,CAAC;GAClB,aAAa;GACb,aAAa;EACf,CAAC,GACD,EAAK,SAAS,EAAI,MAAM;GACtB,IAAI,EAAI,OAAO,EAAE,CAAC,IAAI,MAAM;GAC5B,GAAG,IAAS,EAAI,OAAO,EAAE,CAAC,IAAI,IAAQ;GACtC,MAAM,KAAK;GACX;GACA;EACF,CAAC;OAEE,IAAI,EAAI,SAAS,eAAe,EAAI,UAAU;GACnD,IAAM,IAAa,MAAM,MAAM,EAAI,QAAQ,CAAC,CAAC,MAAM,MAAQ,EAAI,YAAY,CAAC,GACtE,IAAQ,MAAM,EAAO,SAAS,CAAU;GAC9C,EAAK,UAAU,GAAO;IACpB,GAAG,EAAI,IAAI;IACX,GAAG,IAAS,EAAI,IAAI,IAAQ,EAAI,SAAS;IACzC,OAAO,EAAI,QAAQ;IACnB,QAAQ,EAAI,SAAS;GACvB,CAAC;EACH,OAAO,IAAI,EAAI,SAAS,iCAAiC;GACvD,IAAM,IAAQ,EAAI,IAAI,GAChB,IAAQ,EAAI,QAAQ,GACpB,IAAQ,EAAI,SAAS,GACrB,IAAQ,IAAS,EAAI,IAAI,IAAQ,GAEjC,IAAU,EAAI,YAAY,IAAI,KAAK,EAAI,SAAS,CAAC,CAAC,eAAe,OAAO,qBAAI,IAAI,KAAK,EAAA,CAAE,eAAe,OAAO,GAC7G,IAAQ,IAAQ;GAoCtB,AAlCA,EAAK,cAAc;IACjB,GAAG;IAAO,GAAG;IAAO,OAAO;IAAO,QAAQ;IAC1C,OAAO,EAAI,GAAG,GAAG,CAAC;IAClB,aAAa,EAAI,MAAM,KAAK,MAAM,KAAK,MAAM,GAAG;IAChD,aAAa;GACf,CAAC,GACD,EAAK,SAAS;IACZ,OAAO;KAAE,GAAG,IAAQ;KAAO,GAAG;IAAM;IACpC,KAAK;KAAE,GAAG,IAAQ;KAAO,GAAG,IAAQ;IAAM;IAC1C,OAAO,EAAI,MAAM,KAAK,MAAM,KAAK,MAAM,GAAG;IAC1C,WAAW;GACb,CAAC,GACD,EAAK,YAAY,qDAAqD;IACpE,GAAG,IAAQ,IAAQ,IAAI;IACvB,GAAG,IAAQ,IAAQ,IAAI;IACvB,aAAa,EAAI,IAAI,KAAK,MAAM,KAAK,MAAM,GAAG;IAC9C,aAAa;IACb,OAAO;GACT,CAAC,GACD,EAAK,YAAY,sBAAsB;IACrC,GAAG,IAAQ,IAAQ,IAAI;IACvB,GAAG,IAAQ,IAAQ,IAAI;IACvB,aAAa,EAAI,IAAI,KAAK,MAAM,KAAK,MAAM,GAAG;IAC9C,aAAa;IACb,OAAO;GACT,CAAC,GACD,EAAK,SAAS,uBAAuB,EAAI,UAAU,EAAM,cAAc,oBAAoB;IACzF,GAAG,IAAQ,IAAQ;IAAI,GAAG,IAAQ,IAAQ;IAC1C,MAAM;IAAI,OAAO,EAAI,KAAK,KAAK,KAAK,KAAK,KAAK,GAAG;GACnD,CAAC,GACD,EAAK,SAAS,SAAS,KAAW;IAChC,GAAG,IAAQ,IAAQ;IAAI,GAAG,IAAQ,IAAQ;IAC1C,MAAM;IAAG,OAAO,EAAI,KAAK,KAAK,KAAK,KAAK,KAAK,GAAG;GAClD,CAAC,GACD,EAAK,SAAS,6BAA6B;IACzC,GAAG,IAAQ,IAAQ;IAAI,GAAG,IAAQ,IAAQ;IAC1C,MAAM;IAAG,OAAO,EAAI,KAAK,KAAK,KAAK,KAAK,KAAK,GAAG;GAClD,CAAC;EACH;CACF;CAGA,IAAI,EAAM,WAAW,MAAM;EACzB,IAAM,IAAK,EAAM,WACX,IAAU,GAAS,EAAG,SAAS,SAAS,GACxC,IAAY,EAAG,WAAW,KAC1B,IAAgB,MAAM,EAAO,UAAU,EAAc,SAAS;EAEpE,KAAK,IAAM,KAAQ,GAAO;GACxB,IAAM,EAAE,UAAO,cAAW,EAAK,QAAQ,GACjC,IAAQ,CAAC,KAAK,KAAK,GACnB,IAAO,KAAK,IAAI,CAAK,GACrB,IAAO,KAAK,IAAI,CAAK;GAE3B,IAAI,EAAG,SAAS,UAAU;IACxB,IAAM,IAAW,EAAG,QAAQ,IAEtB,IAAK,CADO,EAAc,kBAAkB,EAAG,MAAM,CAC/C,IAAY,GAClB,IAAK,CAAC,IAAW,KACjB,IAAY,IAAK,IAAO,IAAK,GAC7B,IAAY,IAAK,IAAO,IAAK;IACnC,EAAK,SAAS,EAAG,MAAM;KACrB,GAAG,IAAQ,IAAI;KACf,GAAG,IAAS,IAAI;KAChB,MAAM;KACN,MAAM;KACN,OAAO;KACP,SAAS;KACT,QAAQ,EAAQ,GAAG;IACrB,CAAC;GACH,OAAO;IACL,IAAM,IAAW,EAAG,QAAQ,IACtB,IAAY,EAAc,kBAAkB,EAAG,MAAM,CAAQ,GAC7D,IAAQ,IAAY,KAEpB,IAAK,CAAC,IAAY,GAClB,IAAK,CAAC,IAAW,KACjB,IAAY,IAAK,IAAO,IAAK,GAC7B,IAAY,IAAK,IAAO,IAAK;IACnC,KAAK,IAAI,IAAI,CAAC,GAAQ,IAAI,IAAS,GAAG,KAAK,KAAO;KAChD,IAAM,IAAU,KAAK,IAAI,IAAI,GAAK,IAAI,KAAM,IAAQ;KACpD,KAAK,IAAI,IAAI,CAAC,GAAO,IAAI,IAAQ,GAAG,KAAK,GACvC,EAAK,SAAS,EAAG,MAAM;MACrB,GAAG,IAAI,IAAS;MAChB,GAAG,IAAI;MACP,MAAM;MACN,MAAM;MACN,OAAO;MACP,SAAS;MACT,QAAQ,EAAQ,GAAG;KACrB,CAAC;IAEL;GACF;EACF;CACF;CAGA,IAAM,IAAqB,EAAM,cAAc,CAAC,GAC5C,IAAW;CAEf,IAAI,EAAmB,SAAS,GAAG;EACjC,IAAM,IAAa,MAAM,EAAO,KAAK,GAC/B,IAAc,GAAS,YAAY;GAAE,MAAM;GAAY,GAAG,GAAkB;EAAE,CAAC,GAC/E,IAAY,MAAM,EAAY,SAC9B,IAAe,MAAM,EAAY,OAAO;EAE9C,IAAI;GACF,KAAK,IAAI,IAAI,GAAG,KAAK,EAAU,UAAU,KAAK;IAC5C,IAAM,IAAiB,EAAmB,QAAQ,MAAM,EAAE,cAAc,CAAC;IAEzE,IAAI,EAAe,SAAS,GAAG;KAC7B,IAAM,IAAa,MAAM,EAAU,QAAQ,CAAC,GAEtC,IAAW,EAAW,YAAY,EAAE,OAAO,EAAY,CAAC,GAExD,IAAS,SAAS,cAAc,QAAQ;KAE9C,AADA,EAAO,QAAQ,EAAS,OACxB,EAAO,SAAS,EAAS;KACzB,IAAM,IAAM,EAAO,WAAW,IAAI;KAElC,IAAI,GAAK;MAIP,AAHA,MAAM,EAAW,OAAO;OAAE,eAAe;OAAK;OAAQ;MAAS,CAAC,CAAC,CAAC,SAElE,EAAI,KAAK,GACT,EAAI,YAAY;MAChB,KAAK,IAAM,KAAa,GACtB,EAAI,SACF,KAAK,MAAM,EAAU,IAAI,CAAW,GACpC,KAAK,MAAM,EAAU,IAAI,CAAW,GACpC,KAAK,KAAK,EAAU,QAAQ,CAAW,GACvC,KAAK,KAAK,EAAU,SAAS,CAAW,CAC1C;MAEF,EAAI,QAAQ;MAEZ,IAAM,IAAa,EAAO,UAAU,cAAc,GAAI,GAChD,IAAW,MAAM,MAAM,CAAU,CAAC,CAAC,MAAM,MAAQ,EAAI,YAAY,CAAC,GAClE,IAAW,MAAM,EAAa,SAAS,CAAQ,GAE/C,IAAa,EAAW,YAAY,EAAE,OAAO,EAAE,CAAC;MAKtD,AAHA,EAD6B,QAAQ,CAAC,EAAW,OAAO,EAAW,MAAM,CACzE,CAAA,CAAQ,UAAU,GAAU;OAAE,GAAG;OAAG,GAAG;OAAG,OAAO,EAAW;OAAO,QAAQ,EAAW;MAAO,CAAC,GAE9F,EAAO,QAAQ,GACf,EAAO,SAAS;KAClB;KACA,EAAW,QAAQ;IACrB,OAAO;KACL,IAAM,CAAC,KAAc,MAAM,EAAa,UAAU,GAAQ,CAAC,IAAI,CAAC,CAAC;KACjE,EAAa,QAAQ,CAAU;IACjC;IAEA,AAAI,IAAI,KAAM,KACZ,MAAM,IAAI,SAAS,MAAY,WAAW,GAAS,CAAC,CAAC;GAEzD;EACF,UAAU;GACR,MAAM,EAAY,QAAQ,CAAC,CAAC,YAAY,CAAC,CAAC;EAC5C;EACA,IAAW;CACb;CAEA,OAAO,MAAM,EAAS,KAAK;AAC7B;;;AChUA,IAAM,WAAyB;CAC7B,MAAU,MAAM,qEAAqE;AACvF,GAEa,KAAb,MAA+B;CAC7B;CAEA,UAA8B;CAE9B,UAAwC;CACxC,cAA2C;CAC3C,YAAoB;CAEpB,YAAY,GAAgB;EAC1B,KAAK,MAAM;CACb;CAKA,MAAM,GAAwB,GAAmC;EAE/D,AADA,KAAK,UAAU,GACf,KAAK,UAAU;CACjB;CAGA,UAAgB;EACd,KAAK,UAAU;CACjB;CAGA,YAAY,GAAsB;EAChC,KAAK,cAAc;CACrB;CAEA,IAAI,cAAuB;EACzB,OAAO,KAAK;CACd;CAEA,IAAI,YAAqB;EACvB,OAAO,KAAK,YAAY;CAC1B;CAMA,UAAgB;EACV,UAAK,WACT;QAAK,YAAY;GACjB,IAAI;IACF,KAAK,IAAI,KAAK,WAAW,CAAC,CAAC;GAC7B,UAAU;IACR,IAAM,IAAU,KAAK;IAKrB,AAJA,KAAK,cAAc,MACnB,KAAK,UAAU,MACf,KAAK,UAAU,MACf,KAAK,IAAI,QAAQ,GACb,KAEF,QAAQ,QAAQ,CAAC,CAAC,KAAK,CAAO;GAElC;EAbiB;CAcnB;CAIA,GAA8B,GAAS,GAA2D;EAChG,OAAO,KAAK,IAAI,GAAG,GAAM,CAAgC;CAC3D;CAEA,IAA+B,GAAS,GAAqD;EAC3F,KAAK,IAAI,IAAI,GAAM,CAAgC;CACrD;CAKA,aAAa,GAAyD;EACpE,IAAM,IAAI,KAAK,WAAW,GAAU;EACpC,OAAO,IAAI,SAAS,GAAS,MAAW;GACtC,IAAM,IAAY,KAAK,IAAI,GAAqC,mBAAmB,MAAM;IACnF,EAAE,QAAQ,MACd,EAAQ,GACR,EAAQ,CAAC;GACX,CAAC,GACK,IAAW,KAAK,IAAI,GAAwC,sBAAsB,MAAM;IACxF,EAAE,QAAQ,MACd,EAAQ,GACR,EAAO,EAAE,KAAK;GAChB,CAAC,GACK,UAAgB;IAEpB,AADA,EAAU,GACV,EAAS;GACX;GACA,EAAE,aAAa,CAAG;EACpB,CAAC;CACH;CAEA,iBAAqC;EACnC,OAAO,KAAK,SAAS,eAAe;CACtC;CAEA,iBAAmD;EACjD,OAAO,KAAK,SAAS,eAAe,KAAK;CAC3C;CAEA,iBAAyB;EACvB,OAAO,KAAK,SAAS,eAAe,KAAK;CAC3C;CAEA,eAAuB;EACrB,OAAO,KAAK,SAAS,aAAa,KAAK;CACzC;CAIA,iBAA+B;EAC7B,OAAO,KAAK,SAAS,eAAe,KAAK,CAAC;CAC5C;CAMA,MAAM,YAAY,IAAyB,CAAC,GAAwB;EAClE,IAAM,IAAI,KAAK,WAAW,GAAU,GAC9B,IAAM,EAAE,eAAe,GACvB,IAAM,EAAE,eAAe;EAC7B,IAAI,CAAC,KAAO,CAAC,GAAK,MAAU,MAAM,oBAAoB;EAStD,OAAO,GACL;GACE,4BAT+B;IACjC,IAAI,GAAK,OAAO,EAAI,QAAQ;IAC5B,IAAM,IAAW,MAAM,MAAM,CAAa;IAC1C,IAAI,CAAC,EAAS,IAAI,MAAU,MAAM,6BAA6B,EAAS,OAAO,EAAE;IACjF,OAAO,EAAS,YAAY;GAC9B;GAKI,aAAa,EAAE,eAAe;GAC9B,YAAY,EAAE,cAAc;GAC5B,WAAW,EAAE,aAAa;GAC1B,YAAY,EAAE,mBAAmB;EACnC,GACA,CACF;CACF;CAIA,KAAc;EAEZ,WAAW,MAAmB,CAAC;EAC/B,eAAe,MAAuB,KAAK,IAAI,KAAK,wBAAwB,EAAE,YAAS,CAAC;EACxF,gBAAgB,MAAuB,KAAK,IAAI,KAAK,yBAAyB,EAAE,YAAS,CAAC;EAC1F,iBAAiB,MAAuB,KAAK,IAAI,KAAK,wBAAwB,EAAE,YAAS,CAAC;EAC1F,kBAAkB,MAAuB,KAAK,IAAI,KAAK,yBAAyB,EAAE,YAAS,CAAC;EAC5F,qBAAqB,MAAkB,KAAK,IAAI,KAAK,gCAAgC,EAAE,SAAM,CAAC;EAC9F,cAAc,MAAwB,KAAK,IAAI,KAAK,mBAAmB,EAAE,QAAK,CAAC;EAC/E,gBAAgB,KAAK,IAAI,KAAK,qBAAqB;EACnD,eAAe,KAAK,IAAI,KAAK,oBAAoB;EACjD,kBAAkB,KAAK,IAAI,KAAK,qBAAqB;EACrD,iBAAiB,KAAK,IAAI,KAAK,oBAAoB;CACrD;CAEA,OAAgB;EACd,mBAAmB;GAEjB,yBAAiC,KAAK,UAAU,KAAK,eAAe,GAAG,MAAM,CAAC;GAC9E,0BAAwC,KAAK,eAAe;EAC9D;EACA,gBAAgB;GACd,mBAAmB,GAAe,MAChC,KAAK,IAAI,GAAG,GAAO,CAAQ;GAC7B,sBAAsB,GAAe,MACnC,KAAK,IAAI,IAAI,GAAO,CAAQ;GAC9B,sBAA8B,KAAK,eAAe;GAClD,oBAA4B,KAAK,aAAa;GAC9C,oBAAoB,EAClB,cAAc,MAA4B,KAAK,YAAY,CAAO,EACpE;EACF;CACF;AACF,GCtKM,KAAY,IACZ,KAAY,IAEZ,WACJ,OAAO,SAAW,OAAe,gBAAgB,SAAS,OAAO,WAAW,IAAI,GAAG,KAAK,IAAI,EAAE,GAAG,KAAK,OAAO,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,KAE3H,KAAiB,EAAM,WAAmD,SAAwB,GAAO,GAAK;CACzH,IAAM,EACJ,YAAS,eAAY,iBAAc,gBAAa,YAAS,eAAY,oBACrE,sBAAmB,gBAAa,IAAO,cAAW,iBAAa,qBAC/D,sBAAmB,uBAAoB,0BAAsB,cAAW,IACxE,YAAQ,sBAAkB,IAAO,cAAU,IAAM,cAAW,IAAM,oBAAgB,IAClF,cAAW,cACT,GAGE,IAAS,EAAO,CAAK;CAC3B,EAAO,UAAU;CAEjB,IAAM,IAAU,EAAuB,IAAI,GACrC,IAAM,QAAc,IAAI,EAAU,GAAG,CAAC,CAAC,GACvC,KAAc,EAAiC,IAAI;CACzD,AAA0B,GAAY,YAAU,IAAI,GAAkB,CAAG;CACzE,IAAM,IAAW,GAAY;CAC7B,EAAoB,SAAW,GAAU,CAAC,CAAQ,CAAC;CAGnD,IAAM,IAAe,KAAW,GAC1B,CAAC,GAAQ,MAAa,EAA6B,CAAY,GAC/D,CAAC,IAAW,MAAgB,EAAS,CAAC;CAC5C,QAAgB;EACd,GAAU,CAAY;CACxB,GAAG,CAAC,CAAY,CAAC;CACjB,IAAM,KAAe,GAAa,MAAgB;EAEhD,AADA,GAAU,CAAG,GACb,IAAc,MAAM,IAAI,CAAC;CAC3B,GAAG,CAAC,CAAC,GAGC,CAAC,IAAW,MAAgB,EAAS,MAAM,GAC3C,CAAC,IAAiB,MAAsB,EAAS,KAAY,EAAa,GAC1E,CAAC,GAAkB,KAAuB,EAAS,EAAK,GACxD,CAAC,IAAY,KAAiB,EAAgC,UAAU,GACxE,CAAC,IAAO,MAAY,EAAS,OAAO,KAAiB,WAAW,IAAe,CAAG,GAClF,CAAC,IAAgB,KAAqB,EAAS,EAAK,GACpD,CAAC,IAAkB,MAAuB,EAAS,EAAK,GACxD,CAAC,IAAgB,MAAqB,EAAwC,YAAY,GAC1F,CAAC,GAAY,MAAiB,EAA+C,QAAQ,GACrF,CAAC,IAAU,KAAe,EAAS,CAAC,GAEpC,CAAC,GAAe,KAAoB,EAAS,EAAE,GAE/C,IAAuB,QACvB,IACK;EAAE,mBAAmB;EAAO,oBAAoB;EAAO,sBAAsB;EAAO,WAAW;CAAM,IAEvG;EACL,mBAAmB,IAAa,qBAAqB,KAAqB,MAAsB;EAChG,oBAAoB,IAAa,sBAAsB,KAAsB,MAAsB;EACnG,sBAAsB,IAAa,wBAAwB,MAAwB,MAAsB;EACzG,WAAW,IAAa,aAAa,KAAoB;CAC3D,GACC;EAAC;EAAU;EAAa;EAAmB;EAAoB;EAAsB;EAAmB;CAAgB,CAAC,GACtH,KAAqB,CAAC,KAAY,MAAsB;CAE9D,QAAgB;EACd,AAAI,EAAqB,sBAAsB,MAAS,OAAc,cAAY,GAAa,MAAM;CACvG,GAAG,CAAC,EAAqB,mBAAmB,EAAS,CAAC;CAGtD,IAAM,KAAiB,EAAqB,CAAC,CAAC,GACxC,KAAgB,EAAoB,CAAC,CAAC,GACtC,IAAY,EAAyC,IAAI,GACzD,IAAU,EAAO;EAAE,SAAS;EAAG,OAAO;CAAE,CAAC,GACzC,KAAY,EAAO,CAAM;CAC/B,GAAU,UAAU;CACpB,IAAM,IAAiB,EAA0B,IAAI,GAC/C,KAAuB,EAAO,EAAK;CAEzC,SACE,EAAS,MACP;EACE,sBAAsB,GAAe;EACrC,qBAAqB,GAAc;EACnC,oBAAoB,EAAO,QAAQ;EACnC,sBAAsB,EAAU;EAChC,sBAAsB,GAAU;EAChC,mBAAmB,EAAO,QAAQ;EAClC,0BAA0B,EAAO,QAAQ,aAAa;EACtD,sBAAsB,EAAQ,QAAQ;EACtC,oBAAoB,EAAQ,QAAQ;EACpC;CACF,GACA,EAAQ,OACV,SACa,EAAS,QAAQ,IAC7B,CAAC,GAAU,EAAY,CAAC;CAG3B,IAAM,KAAW,EAAO,EAAK;CAS7B,AARA,QAAgB;EACV,GAAS,YACb,GAAS,UAAU,IACf,EAAO,QAAQ,aAAW,EAAQ,SAAS,MAAM,EAAE,eAAe,GAAK,CAAC,GAC5E,EAAO,QAAQ,UAAU,CAAQ;CACnC,GAAG,CAAC,CAAQ,CAAC,GAGb,QAAgB;EACd,IAAM,KAAa,MAA+B;GAEhD,AADA,EAAoB,EAAI,GACxB,EAAc,CAAG;EACnB,GAEM,IAAO;GACX,EAAI,GAA4B,yBAAyB,MAAM;IAC7D,IAAM,IAAW,GAAG,YAAY,CAAC;IAGjC,AAFI,EAAS,SAAS,WAAW,KAAG,GAAmB,EAAI,GACvD,EAAS,SAAS,YAAY,KAAG,EAAU,UAAU,GACrD,EAAS,SAAS,aAAa,KAAG,EAAU,QAAQ;GAC1D,CAAC;GACD,EAAI,GAA4B,0BAA0B,MAAM;IAC9D,IAAM,IAAW,GAAG,YAAY,CAAC;IAEjC,AADI,EAAS,SAAS,WAAW,KAAG,GAAmB,EAAK,IACxD,EAAS,SAAS,YAAY,KAAK,EAAS,SAAS,aAAa,MAAG,EAAoB,EAAK;GACpG,CAAC;GACD,EAAI,GAAuB,iCAAiC,MAAM;IAChE,IAAM,IAAQ,GAAG;IACjB,AAAI,MAAU,eAAc,EAAU,UAAU,IACvC,MAAU,gBAAe,EAAU,QAAQ,IAC/C,GAAmB,EAAI;GAC9B,CAAC;GACD,EAAI,GAA4B,wBAAwB,MAAM,EAAI,KAAK,eAAe,EAAE,MAAM,GAAG,QAAQ,KAAK,CAAC,CAAC;GAChH,EAAI,GAAG,mBAAmB,YAAY;IACpC,IAAI;KACF,IAAI,IAAO,EAAe;KAG1B,IAFI,IAAM,EAAe,UAAU,OAC9B,IAAO,MAAM,EAAS,YAAY,GACnC,CAAC,GAAM;KACX,IAAM,IAAO,IAAI,KAAK,CAAC,CAAgB,GAAG,EAAE,MAAM,kBAAkB,CAAC,GAC/D,IAAM,IAAI,gBAAgB,CAAI,GAC9B,IAAI,SAAS,cAAc,GAAG;KAIpC,AAHA,EAAE,OAAO,GACT,EAAE,WAAW,EAAO,QAAQ,YAAY,0BACxC,EAAE,MAAM,GACR,iBAAiB,IAAI,gBAAgB,CAAG,GAAG,GAAI;IACjD,SAAS,GAAK;KAEZ,AADA,QAAQ,MAAM,yCAAyC,CAAG,GAC1D,EAAI,KAAK,yBAAyB,EAAE,OAAO,EAAI,CAAC;IAClD;GACF,CAAC;GACD,EAAI,GACF,oCACA,OAAO,MAAM;IACX,IAAI;KACF,IAAM,EAAE,cAAW,MAAG,MAAG,UAAO,cAAW,GACrC,IAAsB;MAC1B,IAAI,GAAM;MACV,MAAM;MACN;MAAW;MAAG;MAAG;MAAO;MACxB,OAAO;MAAW,aAAa;MAAG,SAAS;MAC3C,QAAQ,EAAO,QAAQ,aAAa,QAAQ;MAC5C,WAAW,KAAK,IAAI;KACtB,GACM,IAAsB,CAAC,GAAG,EAAS,eAAe,GAAG,CAAO;KAClE,EAAI,KAAK,8BAA8B;KACvC,IAAM,IAAO,MAAM,EAAS,YAAY,EAAE,uBAAoB,CAAC;KAE/D,IADA,EAAI,KAAK,4BAA4B,GACjC,CAAC,GAAM;KAEX,AADA,EAAe,UAAU,GACzB,EAAI,KAAK,mCAAmC,EAAE,WAAQ,CAAC;IACzD,SAAS,GAAU;KAEjB,AADA,EAAI,KAAK,gCAAgC,EAAE,OAAO,GAAK,WAAW,OAAO,CAAG,EAAE,CAAC,GAC/E,QAAQ,MAAM,kDAAkD,CAAG;IACrE;GACF,CACF;GAEA,EAAI,GAA4B,oCAAoC,MAClE,EAAI,KAAK,yCAAyC,CAAC,CACrD;EACF;EACA,aAAa,EAAK,SAAS,MAAQ,EAAI,CAAC;CAC1C,GAAG,CAAC,GAAK,CAAQ,CAAC;CAGlB,IAAM,KAAuB,GAC1B,GAAgC,MAAgB;EAK/C,AAJA,EAAU,UAAU,GACpB,EAAQ,UAAU;GAAE,SAAS;GAAG,OAAO,EAAI;EAAS,GACpD,GAAqB,UAAU,IAC/B,EAAI,KAAK,kBAAkB;GAAE;GAAK,UAAU,EAAI;EAAS,CAAC,GAC1D,EAAO,QAAQ,mBAAmB;GAAE;GAAK,UAAU,EAAI;EAAS,CAAC;CACnE,GACA,CAAC,CAAG,CACN,GAEM,KAAkB,GACrB,GAAc,MAAgC;EAI7C,AAHA,EAAU,UAAU,MACpB,EAAI,KAAK,qBAAqB;GAAE,KAAK,EAAK;GAAK;GAAO,kBAAkB,EAAK;EAAiB,CAAC,GAC3F,EAAK,oBAAkB,EAAO,QAAQ,qBAAqB,EAAE,KAAK,EAAK,IAAI,CAAC,GAChF,EAAO,QAAQ,sBAAsB,IAAQ,MAAW,GAAa,KAAU,EAAK,GAAG,GAAG,CAAI;CAChG,GACA,CAAC,GAAK,EAAY,CACpB,GAEM,KAA0B,GAC7B,MAAuB;EACtB,IAAM,IAAM,GAAU,WAAW;EACjC,IAAI,CAAC,GAAqB,SAAS;GACjC,GAAqB,UAAU;GAC/B,IAAM,IAAM,EAAO,QAAQ;GAC3B,AAAI,MAAQ,cAAa,iBAAiB,EAAI,KAAK,qBAAqB,GAAG,CAAC,IACnE,MAAQ,cAAY,iBAAiB,EAAI,KAAK,oBAAoB,GAAG,CAAC;EACjF;EAEA,AADA,EAAI,KAAK,qBAAqB;GAAE;GAAK;EAAW,CAAC,GACjD,EAAO,QAAQ,sBAAsB;GAAE;GAAK;EAAW,CAAC;CAC1D,GACA,CAAC,CAAG,CACN,GAEM,KAAmB,GACtB,GAAoB,MAAqB;EAGxC,AAFA,EAAQ,UAAU;GAAE,SAAS;GAAY,OAAO;EAAS,GACzD,EAAI,KAAK,eAAe;GAAE;GAAY;EAAS,CAAC,GAChD,EAAO,QAAQ,eAAe,GAAY,CAAQ;CACpD,GACA,CAAC,CAAG,CACN,GAEM,KAA0B,GAC7B,MAAuB;EAGtB,AAFA,GAAe,UAAU,GACzB,EAAI,KAAK,sBAAsB,EAAE,aAAa,EAAK,CAAC,GACpD,EAAO,QAAQ,sBAAsB,CAAI;CAC3C,GACA,CAAC,CAAG,CACN,GAEM,KAAyB,GAAa,MAAsB;EAChE,GAAc,UAAU;CAC1B,GAAG,CAAC,CAAC;CAyCL,OACE,kBAAC,EAAiB,UAAlB;EAA2B,OAAO;EAChC,UAAA,kBAAC,OAAD;GACE,KAAK;GACL,WAAW,CAAC,cAAc,CAAS,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK,GAAG;GACtD;GACP,UAAU;GACV,4BAAyB;GACzB,mBA9C4B,MAA2C;IAC3E,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,IAAI,YAAY,MAAM,KAAK;KAE3D,AADA,EAAE,eAAe,GACb,MACF,EAAoB,EAAI,GACxB,EAAc,QAAQ,GACtB,iBAAiB,EAAI,KAAK,qBAAqB,GAAG,EAAE;KAEtD;IACF;IACA,EAAI,KAAK,kBAAkB,EAAE,WAAW;GAC1C;GAoCM,0BAjCmC;IACvC,IAAM,IAAO,EAAQ;IACrB,AAAI,KAAQ,CAAC,EAAK,SAAS,SAAS,aAAa,KAAG,EAAK,MAAM,EAAE,eAAe,GAAK,CAAC;GACxF;GAuBI,UAAA;IASG,MACC,kBAAC,IAAD;KACa;KACX,eAAe,MAAQ;MACjB,GAAqB,sBAAsB,MAAS,MAAQ,eAChE,GAAa,CAAG;KAClB;KACiB;KACjB,qBAAqB,MAAS;MAAE,AAAI,KAAU,GAAmB,CAAI;KAAG;KACtD;KACG;KACT;KACL;KACP,gBAAgB,IAAU,MAAM,KAAK,IAAI,IAAI,KAAM,EAAS,CAAC;KAC7D,iBAAiB,IAAU,MAAM,KAAK,IAAI,IAAI,KAAM,EAAS,CAAC;KAC9D,YAAY,MAAM,GAAS,KAAK,IAAI,IAAW,KAAK,IAAI,IAAW,CAAC,CAAC,CAAC;KACtE,kBAAkB,EAAI,KAAK,iBAAiB;KAC5C,oBA/CqB;MAC7B,IAAM,IAAS,EAAQ,WAAW,SAAS;MAC3C,AAAK,SAAS,oBAGZ,SAAS,iBAAiB,CAAC,CAAC,YAAY,CAAC,CAAC,IAF1C,EAAO,oBAAoB,CAAC,CAAC,YAAY,CAAC,CAAC;KAI/C;KAyCU,gBAAgB,EAAI,KAAK,iBAAiB;KAC1C,sBAAsB,EAAkB,EAAI;KAC5C,mBAAmB,GAAoB,EAAI;KAC3C,mBA1Cc,MAA+B;MAChD,MACD,KAAoB,OAAe,IACrC,EAAoB,EAAK,KAEzB,EAAoB,EAAI,GACxB,EAAc,CAAG;KAErB;KAmC0B;KACG;KACP;KACG;KACL;KACG;KACb,mBAAmB;KACP;KACH;KACT,aAAa;IACd,CAAA;IAEH,kBAAC,OAAD;KAAK,OAAO;MAAE,SAAS;MAAQ,MAAM;MAAG,WAAW;MAAG,UAAU;KAAS;KACvE,UAAA,kBAAC,IAAD;MACE,iBAAiB,KAAY;MAC7B,kBAAkB,KAAY;MAClB;MACG;MACL;MACC;MACX,YAAY;MACD;MACM;MACT;MACI;MACK;MACV;MACG;MACV,qBAAqB;MACrB,oBAAoB;MACpB,kBAAkB;MAClB,aAAa;MACb,qBAAqB;MACrB,cAAc;MACE;MACJ;MACF;MACG;MACF;MACI;MACf,mBAAmB;MACN;MACb,aAAa;KACd,CAAA;IACE,CAAA;IACJ,MACC,kBAAC,IAAD;KAAe,eAAe,EAAkB,EAAK;KAAkB;KAAiC;IAAmB,CAAA;IAE5H,MAAoB,kBAAC,GAAD,EAAY,eAAe,GAAoB,EAAK,EAAI,CAAA;GAC1E;;CACoB,CAAA;AAE/B,CAAC;;;AClZD,SAAgB,GAAgB,GAA2B,GAAwD;CAQjH,OAPI,OAAO,SAAW,OAAe,OAAO,WAAa,MAChD,QAAQ,OAAO,gBAAI,MAAM,yEAAyE,CAAC,IAEvG,IAIE,IAAI,SAAS,MAAY;EAC9B,IAAM,IAAO,EAAS,WAAW,CAAa,GACxC,EAAE,MAAM,GAAO,GAAG,MAAS;EACjC,EAAK,OACH,kBAAC,IAAD;GACE,GAAI;GACJ,OAAO;IAAE,OAAO;IAAQ,QAAQ;GAAO;GACvC,UAAU,MAAa;IAErB,AADA,EAAS,kBAAkB,EAAK,QAAQ,CAAC,GACzC,EAAQ,CAAQ;GAClB;EACD,CAAA,CACH;CACF,CAAC,IAhBQ,QAAQ,OAAO,gBAAI,MAAM,oEAAoE,CAAC;AAiBzG;AAGA,IAAa,IAAY"}
|