teamsync-pdf-viewer 1.5.0 → 1.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"teamsync-pdf-viewer.js","names":[],"sources":["../src/core/busContext.ts","../src/hooks/useViewerBus.ts","../src/utils/zoomUtils.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/annotations/ids.ts","../src/utils/clipboardUtils.ts","../src/components/TextSelectionTooltip.tsx","../src/utils/findRegexRedactions.ts","../src/utils/layoutUtils.ts","../src/core/pdfAssets.ts","../src/components/DiffHighlightOverlay.tsx","../src/components/SideBySideViewer.tsx","../src/components/CompareToolbar.tsx","../src/components/DiffSummarySidebar.tsx","../src/components/CompareCurtainSlider.tsx","../src/utils/pdfDiffEngine.ts","../src/components/DocumentViewer.tsx","../src/components/SettingsModal.tsx","../src/components/AboutModal.tsx","../src/core/eventBus.ts","../src/annotations/geometry.ts","../src/core/export.ts","../src/annotations/xfdf.ts","../src/annotations/AnnotationManager.ts","../src/core/ViewerInstance.ts","../src/core/print.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 */\n\nexport const MIN_SCALE = 0.1;\nexport const MAX_SCALE = 8.0;\n\nexport const isMobileOrTablet = (): boolean =>\n typeof navigator !== 'undefined' && (\n /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini|Mobile|Tablet/i.test(navigator.userAgent) ||\n (/^((?!chrome|android).)*safari/i.test(navigator.userAgent))\n );\n\nexport const isSafariOrMobile = isMobileOrTablet;\n\nexport const MAX_CANVAS_DIM = 4096;\nexport const MAX_CANVAS_DIM_MOBILE = 2048;\nexport const MAX_CANVAS_PIXELS = 8388608; // 8.4 Megapixels (~32MB RGBA texture buffer)\nexport const MAX_CANVAS_PIXELS_MOBILE = 4194304; // 4.2 Megapixels (~16MB RGBA texture buffer)\n\n/**\n * Calculates the next step when zooming in.\n * - Below 200%: steps by +25%\n * - 200% to 500%: steps by +50%\n * - 500% to 800%: steps by +100%\n */\nexport function calculateNextZoomIn(currentScale: number, maxScale = MAX_SCALE): number {\n const step = currentScale < 2 ? 0.25 : currentScale < 5 ? 0.5 : 1.0;\n return Math.min(maxScale, Math.round((currentScale + step) * 100) / 100);\n}\n\n/**\n * Calculates the next step when zooming out.\n * - At or below 200%: steps by -25%\n * - 200% to 500%: steps by -50%\n * - Above 500%: steps by -100%\n */\nexport function calculateNextZoomOut(currentScale: number, minScale = MIN_SCALE): number {\n const step = currentScale <= 2 ? 0.25 : currentScale <= 5 ? 0.5 : 1.0;\n return Math.max(minScale, Math.round((currentScale - step) * 100) / 100);\n}\n\n/**\n * Clamps and rounds a requested zoom level within [minScale, maxScale].\n */\nexport function clampScale(scale: number, minScale = MIN_SCALE, maxScale = MAX_SCALE): number {\n return Math.min(maxScale, Math.max(minScale, Math.round(scale * 100) / 100));\n}\n\n/**\n * Calculates the safe rasterization scale for PDF.js viewport rendering so that\n * canvas dimensions and texture memory stay strictly within hardware limits.\n */\nexport function calculateSafeRenderScale(\n scale: number,\n outputScale: number,\n unscaledWidth: number,\n unscaledHeight: number,\n maxDim = isMobileOrTablet() ? MAX_CANVAS_DIM_MOBILE : MAX_CANVAS_DIM,\n maxPixels = isMobileOrTablet() ? MAX_CANVAS_PIXELS_MOBILE : MAX_CANVAS_PIXELS\n): number {\n let renderScale = scale * outputScale;\n if (unscaledWidth * renderScale > maxDim) {\n renderScale = maxDim / unscaledWidth;\n }\n if (unscaledHeight * renderScale > maxDim) {\n renderScale = maxDim / unscaledHeight;\n }\n if ((unscaledWidth * renderScale) * (unscaledHeight * renderScale) > maxPixels) {\n renderScale = Math.sqrt(maxPixels / (unscaledWidth * unscaledHeight));\n }\n return renderScale;\n}\n\nexport interface ScrollCompensationParams {\n prevScale: number;\n newScale: number;\n containerWidth: number;\n containerHeight: number;\n currentScrollLeft: number;\n currentScrollTop: number;\n basePageWidth: number;\n focusPoint?: { vx: number | null; vy: number | null } | null;\n isProgrammatic?: boolean;\n}\n\nexport interface ScrollPosition {\n scrollLeft: number;\n scrollTop: number;\n}\n\n/**\n * Calculates compensating scroll offsets during scale changes.\n * Prevents view jumping or pushing page 1 down on initial fit or programmatic fit.\n */\nexport function calculateScrollCompensation(params: ScrollCompensationParams): ScrollPosition {\n const {\n prevScale,\n newScale,\n containerWidth: cW,\n containerHeight: cH,\n currentScrollLeft,\n currentScrollTop,\n basePageWidth: baseW,\n focusPoint,\n isProgrammatic = false,\n } = params;\n\n // On programmatic fit (e.g. fit-width, fit-page, initial document fit),\n // do not run user-driven center-zoom compensation.\n if (isProgrammatic) {\n return {\n scrollLeft: 0,\n scrollTop: currentScrollTop <= 1 ? 0 : currentScrollTop,\n };\n }\n\n const hasFocusPoint = focusPoint?.vx != null && focusPoint?.vy != null;\n\n // If user is at the top of the document (scrollTop <= 0) and no explicit focus point was set:\n // Keep the top of the page pinned to the top rather than pushing it down into negative space.\n if (!hasFocusPoint && currentScrollTop <= 0) {\n return {\n scrollLeft: 0,\n scrollTop: 0,\n };\n }\n\n const vx = hasFocusPoint ? focusPoint!.vx! : cW / 2;\n const vy = hasFocusPoint ? focusPoint!.vy! : cH / 2;\n\n const x = vx + currentScrollLeft;\n const y = vy + currentScrollTop;\n\n const pLeft1 = Math.max(0, cW / 2 - (baseW * prevScale) / 2);\n const pLeft2 = Math.max(0, cW / 2 - (baseW * newScale) / 2);\n\n const pageX = x - pLeft1;\n const newPageX = pageX * (newScale / prevScale);\n const newX = pLeft2 + newPageX;\n\n return {\n scrollLeft: Math.max(0, newX - vx),\n scrollTop: Math.max(0, (y * (newScale / prevScale)) - vy),\n };\n}\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, MousePointer, 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, Layers, FolderOpen\n} from 'lucide-react';\n\nimport type { SDKPermissions } from '../core/types';\nimport type { ViewerPlugin } from '../plugins/types';\nimport { useViewerBus, useBusEvent } from '../hooks/useViewerBus';\nimport { MIN_SCALE, MAX_SCALE } from '../utils/zoomUtils';\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 onOpenFile?: () => void;\n onDownload: () => void;\n onFullScreen: () => void;\n onSaveAs: () => void;\n onPrint?: () => 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 onOpenFile,\n onDownload, onFullScreen, onSaveAs, onPrint, 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>('select');\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 {onOpenFile && (\n <MenuOption icon={<FolderOpen size={16} />} label=\"Open PDF...\" onClick={() => { onOpenFile(); setIsMenuOpen(false); }} />\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={!onPrint} onClick={() => { onPrint?.(); setIsMenuOpen(false); }} />\n <div style={{ height: '1px', backgroundColor: 'var(--border-color)', margin: '4px 0' }} />\n <MenuOption icon={<Layers size={16} color=\"#0284c7\" />} label=\"Compare PDF (Demo)\" onClick={() => { window.dispatchEvent(new CustomEvent('action-start-compare', { detail: { docA: '/sample_v1.pdf', docB: '/sample_v2.pdf', options: { mode: 'overlay' } } })); setIsMenuOpen(false); }} />\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.25, 0.5, 0.75, 1, 1.25, 1.5, 2, 3, 4, 5, 8].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 \n icon={<MinusCircle size={18} color={scale <= MIN_SCALE ? 'var(--border-color)' : 'var(--text-muted)'} />} \n title=\"Zoom Out\" \n onClick={onZoomOut} \n disabled={scale <= MIN_SCALE}\n />\n <IconButton \n icon={<PlusCircle size={18} color={scale >= MAX_SCALE ? 'var(--border-color)' : 'var(--text-muted)'} />} \n title=\"Zoom In\" \n onClick={onZoomIn} \n disabled={scale >= MAX_SCALE}\n />\n </div>\n <div style={{ width: '1px', height: '24px', backgroundColor: 'var(--border-color)', margin: '0 4px' }} />\n <IconButton icon={<MousePointer size={18} />} title=\"Select Text\" active={headerTool === 'select'} onClick={() => bus.emit('action-set-tool', { tool: 'select' })} />\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, disabled = false, title }: { icon: React.ReactNode, onClick?: () => void, active?: boolean, disabled?: boolean, title?: string }) {\n return (\n <button \n title={title}\n onClick={disabled ? undefined : onClick}\n disabled={disabled}\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: disabled ? 'not-allowed' : 'pointer',\n opacity: disabled ? 0.4 : 1,\n outline: 'none',\n userSelect: 'none',\n WebkitUserSelect: 'none',\n }}\n onMouseOver={(e) => {\n if (!active && !disabled) e.currentTarget.style.backgroundColor = 'var(--hover-bg)';\n }}\n onMouseOut={(e) => {\n if (!active && !disabled) 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, useCallback } from 'react';\n\nexport type ActionType =\n | 'ROTATE_CW'\n | 'ROTATE_CCW'\n | 'UNDO'\n | 'REDO'\n | 'DELETE'\n | 'COPY'\n | 'PASTE'\n | 'FILE_PICKER'\n | 'SEARCH';\n\nexport interface Shortcut {\n action: ActionType;\n description: string;\n defaultCommand: string;\n command: string;\n}\n\nexport const 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\nconst STORAGE_KEY = 'pdfviewer_shortcuts';\nconst CHANGE_EVENT = 'pdfviewer-shortcuts-changed';\n\nlet cachedShortcuts: Shortcut[] | null = null;\nconst listeners = new Set<() => void>();\n\nexport function loadStoredShortcuts(): Shortcut[] {\n if (typeof window === 'undefined' || !window.localStorage) return DEFAULT_SHORTCUTS;\n try {\n const saved = window.localStorage.getItem(STORAGE_KEY);\n if (saved) {\n const parsed = JSON.parse(saved);\n if (Array.isArray(parsed)) {\n return DEFAULT_SHORTCUTS.map(def => {\n const found = parsed.find((p: Shortcut) => p && p.action === def.action);\n return found && typeof found.command === 'string' ? { ...def, command: found.command } : def;\n });\n }\n }\n } catch {\n // ignore parse errors\n }\n return DEFAULT_SHORTCUTS;\n}\n\nfunction notifySubscribers() {\n listeners.forEach(fn => fn());\n if (typeof window !== 'undefined') {\n window.dispatchEvent(new CustomEvent(CHANGE_EVENT));\n }\n}\n\nexport function useShortcuts() {\n const [shortcuts, setShortcuts] = useState<Shortcut[]>(() => {\n if (!cachedShortcuts) cachedShortcuts = loadStoredShortcuts();\n return cachedShortcuts;\n });\n\n useEffect(() => {\n const sync = () => {\n cachedShortcuts = loadStoredShortcuts();\n setShortcuts(cachedShortcuts);\n };\n\n listeners.add(sync);\n if (typeof window !== 'undefined') {\n window.addEventListener('storage', sync);\n window.addEventListener(CHANGE_EVENT, sync);\n }\n\n return () => {\n listeners.delete(sync);\n if (typeof window !== 'undefined') {\n window.removeEventListener('storage', sync);\n window.removeEventListener(CHANGE_EVENT, sync);\n }\n };\n }, []);\n\n const updateShortcut = useCallback((action: ActionType, newCommand: string) => {\n const base = cachedShortcuts || loadStoredShortcuts();\n const updated = base.map(s => s.action === action ? { ...s, command: newCommand } : s);\n cachedShortcuts = updated;\n if (typeof window !== 'undefined' && window.localStorage) {\n window.localStorage.setItem(STORAGE_KEY, JSON.stringify(updated));\n }\n setShortcuts(updated);\n notifySubscribers();\n }, []);\n\n const resetShortcuts = useCallback(() => {\n cachedShortcuts = DEFAULT_SHORTCUTS;\n if (typeof window !== 'undefined' && window.localStorage) {\n window.localStorage.removeItem(STORAGE_KEY);\n }\n setShortcuts(DEFAULT_SHORTCUTS);\n notifySubscribers();\n }, []);\n\n const getCommand = useCallback((action: ActionType): string => {\n const list = cachedShortcuts || shortcuts;\n const s = list.find(item => item.action === action);\n return s ? s.command : '';\n }, [shortcuts]);\n\n return { shortcuts, updateShortcut, resetShortcuts, getCommand };\n}\n\nexport interface ParsedCommand {\n meta: boolean;\n shift: boolean;\n alt: boolean;\n key: string;\n}\n\nexport function parseCommandString(commandString: string): ParsedCommand {\n if (!commandString) return { meta: false, shift: false, alt: false, key: '' };\n\n const rawTokens = commandString.split('+');\n let meta = false;\n let shift = false;\n let alt = false;\n const keyTokens: string[] = [];\n\n for (let i = 0; i < rawTokens.length; i++) {\n const raw = rawTokens[i].trim();\n const lower = raw.toLowerCase();\n\n if (lower === 'meta' || lower === 'cmd' || lower === 'ctrl' || lower === 'command' || lower === 'control') {\n meta = true;\n } else if (lower === 'shift') {\n shift = true;\n } else if (lower === 'alt' || lower === 'option') {\n alt = true;\n } else if (raw === '' && i > 0 && rawTokens[i - 1] === '') {\n // Handles '+' key when split by '+' e.g. \"Meta++\" or \"Meta+Shift++\"\n keyTokens.push('+');\n } else if (raw !== '') {\n keyTokens.push(raw);\n }\n }\n\n if (commandString.endsWith('+') && keyTokens.length === 0) {\n keyTokens.push('+');\n }\n\n return { meta, shift, alt, key: keyTokens.join('+').toLowerCase() };\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 const parsed = parseCommandString(commandString);\n\n const isMetaPressed = Boolean(e.metaKey || e.ctrlKey);\n if (parsed.meta !== isMetaPressed) return false;\n if (parsed.alt !== Boolean(e.altKey)) return false;\n\n const eventKey = (e.key || '').toLowerCase();\n const targetKey = parsed.key.toLowerCase();\n\n // Delete & Backspace mapping (interchangeable for DELETE action)\n if (targetKey === 'delete' || targetKey === 'backspace') {\n if (parsed.shift !== Boolean(e.shiftKey)) return false;\n return eventKey === 'delete' || eventKey === 'backspace';\n }\n\n // Plus & Equals: on US layout '+' is Shift+'='\n if (targetKey === '=' || targetKey === '+') {\n const isKeyEqualOrPlus = eventKey === '=' || eventKey === '+' || e.code === 'Equal' || e.code === 'NumpadAdd';\n if (!isKeyEqualOrPlus) return false;\n if (parsed.shift && !e.shiftKey) return false;\n if (!parsed.shift && targetKey === '=' && e.shiftKey) return false;\n return true;\n }\n\n // Minus & Underscore: on US layout '_' is Shift+'-'\n if (targetKey === '-' || targetKey === '_') {\n const isKeyMinus = eventKey === '-' || eventKey === '_' || e.code === 'Minus' || e.code === 'NumpadSubtract';\n if (!isKeyMinus) return false;\n if (parsed.shift && !e.shiftKey) return false;\n if (!parsed.shift && targetKey === '-' && e.shiftKey) return false;\n return true;\n }\n\n // Check shift requirement\n if (parsed.shift !== Boolean(e.shiftKey)) return false;\n\n // Direct key or code match\n if (eventKey === targetKey) return true;\n if (e.code && e.code.toLowerCase() === `key${targetKey}`) return true;\n if (e.code && e.code.toLowerCase() === `digit${targetKey}`) return true;\n\n return false;\n}\n","/**\n * © 2026 AngelBot Ai Pvt Ltd. All rights reserved.\n */\nimport { useState, useCallback } from 'react';\nimport type * as pdfjsLib from 'pdfjs-dist';\nimport type { Redaction, SearchBounds } from '../core/types';\n\nexport type { SearchBounds };\n\nexport interface SearchResult {\n id: string;\n pageIndex: number;\n snippet: string;\n matchStartIndex: number;\n matchLength: number;\n bounds: SearchBounds[];\n}\n\n/**\n * Standalone asynchronous text search across all pages of a PDFDocumentProxy.\n * Sanitizes redacted regions and returns matching snippets and bounding boxes.\n */\nexport async function searchPdfText(\n pdfDoc: pdfjsLib.PDFDocumentProxy,\n query: string,\n redactions: Redaction[] = [],\n onProgress?: (progress: number) => void\n): Promise<SearchResult[]> {\n if (!pdfDoc || !query.trim()) return [];\n\n const results: SearchResult[] = [];\n const lowerQuery = query.toLowerCase();\n const numPages = pdfDoc.numPages;\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 onProgress?.(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 return results;\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(\n async (query: string) => {\n if (!pdfDoc || !query.trim()) {\n setSearchResults([]);\n return;\n }\n\n setIsSearching(true);\n setSearchProgress(0);\n\n try {\n const results = await searchPdfText(pdfDoc, query, redactions, p => setSearchProgress(p));\n setSearchResults(results);\n } catch (error) {\n console.error('Search error:', error);\n } finally {\n setIsSearching(false);\n setSearchProgress(100);\n }\n },\n [pdfDoc, redactions]\n );\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 useEffect(() => {\n if (isOpen && activeTab === 'Search') {\n const timer = setTimeout(() => {\n searchInputRef.current?.focus();\n searchInputRef.current?.select();\n }, 50);\n return () => clearTimeout(timer);\n }\n }, [isOpen, activeTab]);\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 onKeyDown={e => {\n if (e.key === 'Enter') {\n e.preventDefault();\n onSearch(searchQuery);\n }\n }}\n style={{\n width: '100%',\n padding: '8px 32px 8px 36px',\n border: '1px solid var(--border-color)',\n borderRadius: '4px',\n fontSize: '13px',\n outline: 'none',\n boxSizing: 'border-box'\n }}\n />\n {searchQuery && (\n <button \n onClick={() => {\n setSearchQuery('');\n onSearch('');\n }}\n style={{\n position: 'absolute',\n right: '10px',\n top: '50%',\n transform: 'translateY(-50%)',\n background: 'none',\n border: 'none',\n cursor: 'pointer',\n padding: 0,\n color: 'var(--text-muted)'\n }}\n title=\"Clear search\"\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 {comment.author && <span style={{ fontSize: '11px', color: 'var(--text-muted)' }}>· {comment.author}</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 = Math.min(window.devicePixelRatio || 1, 2);\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, TransientHighlight } from '../core/types';\nimport type { Annotation } from '../annotations/types';\nimport { getRotationTransform, convertToRotatedRect, normalizeRotation } from '../utils/rotationUtils';\nimport { calculateSafeRenderScale } from '../utils/zoomUtils';\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 transientHighlights?: TransientHighlight[];\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 onAnnotationDoubleClick?: (id: string, e: React.MouseEvent) => void;\n onStartResize?: (id: string, handle: string, e: React.MouseEvent, pageNum: number) => void;\n onStartMove?: (id: string, e: React.MouseEvent, pageNum: number) => 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 /** Whether to hide annotations and transient highlights until the page canvas has finished rendering. Default: true. */\n hideAnnotationsUntilPageRendered?: boolean;\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, transientHighlights,\n onMouseDown, onMouseMove, onMouseUp, onAnnotationClick, onAnnotationDoubleClick, onStartResize, onStartMove,\n onAnnotationMouseEnter, onClearSelection,\n watermark, watermarkText, redactions, onDiscardRedaction, onRendered,\n hideAnnotationsUntilPageRendered = true\n}: PageRendererProps) {\n const onRenderedRef = useRef(onRendered);\n useEffect(() => {\n onRenderedRef.current = onRendered;\n }, [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 hasRenderedOnceRef = useRef(false);\n const [isCanvasRendered, setIsCanvasRendered] = useState(false);\n const [textContent, setTextContent] = useState<any>(null);\n\n const scaledWidth = basePageWidth * scale;\n const scaledHeight = basePageHeight * scale;\n\n const [prevDocAndPage, setPrevDocAndPage] = useState({ pdfDoc, pageNum, rotation });\n if (prevDocAndPage.pdfDoc !== pdfDoc || prevDocAndPage.pageNum !== pageNum || prevDocAndPage.rotation !== rotation) {\n setPrevDocAndPage({ pdfDoc, pageNum, rotation });\n setIsCanvasRendered(false);\n }\n\n useEffect(() => {\n hasRenderedOnceRef.current = false;\n }, [pdfDoc, pageNum, rotation]);\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 try { renderTaskRef.current.cancel(); } catch {}\n renderTaskRef.current = null;\n }\n\n let currentPage: pdfjsLib.PDFPageProxy | null = null;\n try {\n const page = await pdfDoc.getPage(pageNum);\n if (isCancelled) {\n try { page.cleanup?.(); } catch {}\n return;\n }\n currentPage = page;\n pageProxyRef.current = page;\n\n const outputScale = Math.min(window.devicePixelRatio || 1, 2);\n const normalizedRot = normalizeRotation(page.rotate + rotation);\n const unscaledViewport = page.getViewport({ scale: 1.0, rotation: normalizedRot });\n\n let renderScale = calculateSafeRenderScale(\n scale,\n outputScale,\n unscaledViewport.width,\n unscaledViewport.height\n );\n\n let viewport = page.getViewport({ scale: renderScale, rotation: normalizedRot });\n\n const tempCanvas = document.createElement('canvas');\n tempCanvas.width = Math.floor(viewport.width);\n tempCanvas.height = Math.floor(viewport.height);\n let ctx = tempCanvas.getContext('2d');\n if (!ctx) {\n // If GPU canvas memory allocation fails, fall back to safe half scale\n renderScale = renderScale * 0.5;\n viewport = page.getViewport({ scale: renderScale, rotation: normalizedRot });\n tempCanvas.width = Math.floor(viewport.width);\n tempCanvas.height = Math.floor(viewport.height);\n ctx = tempCanvas.getContext('2d');\n }\n if (!ctx || isCancelled) {\n tempCanvas.width = 0;\n tempCanvas.height = 0;\n return;\n }\n\n const renderTask = page.render({\n canvasContext: ctx,\n canvas: tempCanvas,\n viewport: viewport\n });\n renderTaskRef.current = renderTask;\n await renderTask.promise;\n renderTaskRef.current = null;\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 * renderScale;\n const vY = rotRect.y * renderScale;\n const vW = rotRect.width * renderScale;\n const vH = rotRect.height * renderScale;\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 = Math.max(1, 2 * (renderScale / (scale || 1)));\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) * renderScale;\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 * renderScale;\n const stepY = 180 * renderScale;\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 hasRenderedOnceRef.current = true;\n setIsCanvasRendered(true);\n onRenderedRef.current?.(pageNum);\n }\n // Immediately release offscreen canvas GPU texture memory\n tempCanvas.width = 0;\n tempCanvas.height = 0;\n } catch (err: any) {\n if (err?.name !== 'RenderingCancelledException') {\n console.error(`Page ${pageNum} render failed:`, err);\n }\n } finally {\n if (currentPage) {\n try { currentPage.cleanup?.(); } catch {}\n }\n if (pageProxyRef.current === currentPage) {\n pageProxyRef.current = null;\n }\n }\n };\n\n // 0ms on first render, 150ms debounce on subsequent scale changes to allow\n // rapid zoom clicks to scale smoothly at 60 FPS via GPU CSS transforms\n // while PDF.js vector rendering fires once the zoom motion settles.\n const delay = hasRenderedOnceRef.current ? 150 : 0;\n timer = setTimeout(renderCanvas, delay);\n\n return () => {\n isCancelled = true;\n if (timer) clearTimeout(timer);\n if (renderTaskRef.current) {\n try { renderTaskRef.current.cancel(); } catch {}\n renderTaskRef.current = null;\n }\n if (pageProxyRef.current) {\n try { pageProxyRef.current.cleanup?.(); } catch {}\n pageProxyRef.current = null;\n }\n };\n }, [pageNum, pdfDoc, scale, rotation, basePageWidth, basePageHeight, 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 let isCancelled = false;\n\n const renderText = async () => {\n try {\n const page = await pdfDoc.getPage(pageNum);\n if (isCancelled) return;\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 if (isCancelled) return;\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 if (!isCancelled) {\n console.error(\"TextLayer render failed:\", e);\n }\n }\n };\n renderText();\n return () => {\n isCancelled = true;\n };\n }, [textContent, pdfDoc, pageNum, rotation, redactions]);\n const pageAnnotations = annotations.filter(a => a.pageIndex === pageNum);\n const isOverlayVisible = !hideAnnotationsUntilPageRendered || isCanvasRendered;\n\n return (\n <div \n id={`pdf-page-${pageNum}`}\n className=\"pdf-page-container\"\n onClick={() => { if (activeTool === null || activeTool === 'select') 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: (isOverlayVisible && activeTool !== 'pan') ? 'auto' : 'none',\n opacity: isOverlayVisible ? 1 : 0,\n visibility: isOverlayVisible ? 'visible' : 'hidden',\n width: `${basePageWidth}px`,\n height: `${basePageHeight}px`,\n zIndex: 2\n }}\n />\n\n {/* Transient Citation / Search Highlights Layer */}\n {((activeSearchResult && activeSearchResult.pageIndex === pageNum) || (transientHighlights && transientHighlights.length > 0)) && (() => {\n const unW = rotation % 180 === 0 ? basePageWidth : basePageHeight;\n const unH = rotation % 180 === 0 ? basePageHeight : basePageWidth;\n\n return (\n <div style={{\n position: 'absolute', top: 0, left: 0, width: '100%', height: '100%',\n pointerEvents: 'none', zIndex: 6,\n visibility: isOverlayVisible ? 'visible' : 'hidden',\n opacity: isOverlayVisible ? 1 : 0\n }}>\n <style>{`\n @keyframes tspdf-transient-pulse {\n 0% {\n box-shadow: 0 0 0 0 rgba(234, 179, 8, 0.75), 0 0 8px rgba(234, 179, 8, 0.4);\n }\n 50% {\n box-shadow: 0 0 0 6px rgba(234, 179, 8, 0.25), 0 0 18px rgba(234, 179, 8, 0.7);\n }\n 100% {\n box-shadow: 0 0 0 0 rgba(234, 179, 8, 0.75), 0 0 8px rgba(234, 179, 8, 0.4);\n }\n }\n `}</style>\n {/* Active search result */}\n {activeSearchResult && activeSearchResult.pageIndex === pageNum && activeSearchResult.bounds.map((b, idx) => {\n const rot = convertToRotatedRect(b.x, unH - b.y - b.height, b.width, b.height, rotation, unW, unH);\n return (\n <div key={`search-${idx}`} style={{\n position: 'absolute',\n left: `${rot.x * scale}px`,\n top: `${rot.y * scale}px`,\n width: `${rot.width * scale}px`,\n height: `${rot.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 })}\n\n {/* Transient Highlights (Citations, external highlights) */}\n {transientHighlights && transientHighlights.filter(th => th.pageIndex === pageNum).map((th, thIdx) => (\n <React.Fragment key={th.id || `th-${thIdx}`}>\n {th.bounds.map((b, bIdx) => {\n const rot = convertToRotatedRect(b.x, unH - b.y - b.height, b.width, b.height, rotation, unW, unH);\n const bg = th.color || 'rgba(250, 204, 21, 0.45)';\n const border = th.borderColor || 'rgba(234, 179, 8, 0.85)';\n return (\n <div\n key={`th-box-${bIdx}`}\n style={{\n position: 'absolute',\n left: `${rot.x * scale}px`,\n top: `${rot.y * scale}px`,\n width: `${rot.width * scale}px`,\n height: `${rot.height * scale}px`,\n backgroundColor: bg,\n border: `1.5px solid ${border}`,\n borderRadius: '3px',\n animation: th.pulse !== false ? 'tspdf-transient-pulse 2s infinite ease-in-out' : 'none',\n boxShadow: '0 0 6px rgba(234, 179, 8, 0.4)',\n zIndex: 7\n }}\n >\n {th.tooltip && bIdx === 0 && (\n <div style={{\n position: 'absolute',\n bottom: '100%',\n left: '50%',\n transform: 'translateX(-50%)',\n marginBottom: '4px',\n backgroundColor: '#0f172a',\n color: '#ffffff',\n fontSize: '11px',\n fontWeight: 600,\n padding: '3px 8px',\n borderRadius: '4px',\n whiteSpace: 'nowrap',\n boxShadow: '0 2px 8px rgba(0,0,0,0.25)',\n zIndex: 10,\n pointerEvents: 'none'\n }}>\n {th.tooltip.length > 60 ? `${th.tooltip.slice(0, 60)}...` : th.tooltip}\n </div>\n )}\n </div>\n );\n })}\n </React.Fragment>\n ))}\n </div>\n );\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' || activeTool === 'select' || !isOverlayVisible) ? 'none' : 'auto',\n zIndex: 10,\n visibility: isOverlayVisible ? 'visible' : 'hidden',\n opacity: isOverlayVisible ? 1 : 0\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 onDoubleClick: (e: React.MouseEvent) => {\n onAnnotationDoubleClick?.(ann.id, e);\n },\n onMouseDown: (e: React.MouseEvent) => {\n if (isSelected && onStartMove) {\n e.stopPropagation();\n onStartMove(ann.id, e, pageNum);\n }\n },\n style: { \n pointerEvents: 'all' as any,\n cursor: activeTool === 'eraser' ? 'pointer' : (isSelected ? 'move' : '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 const boxW = ann.width && ann.width > 0 ? ann.width : 180;\n const boxH = ann.height && ann.height > 0 ? ann.height : 40;\n shape = (\n <g>\n <rect x={ann.x} y={ann.y} width={boxW} height={boxH} fill=\"transparent\" style={{ pointerEvents: 'all' }} />\n <foreignObject x={ann.x} y={ann.y} width={boxW} height={boxH} style={{ overflow: 'visible', pointerEvents: 'none' }}>\n <div\n style={{\n width: `${boxW}px`,\n minHeight: `${boxH}px`,\n wordBreak: 'break-word',\n overflowWrap: 'break-word',\n whiteSpace: 'pre-wrap',\n color: strokeColor,\n fontSize: '16px',\n fontFamily: 'sans-serif',\n lineHeight: '1.25',\n userSelect: 'none',\n boxSizing: 'border-box',\n padding: '2px 4px'\n }}\n >\n {ann.text}\n </div>\n </foreignObject>\n </g>\n );\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 const hlRects = ann.rects && ann.rects.length > 0 ? ann.rects : [{ x: ann.x, y: ann.y, width: ann.width, height: ann.height }];\n shape = (\n <g style={{ mixBlendMode: 'multiply' }}>\n {hlRects.map((r, i) => (\n <rect key={i} x={r.x} y={r.y} width={r.width} height={r.height} fill={strokeColor} opacity={ann.opacity} />\n ))}\n </g>\n );\n } else if (ann.type === 'underline') {\n const ulRects = ann.rects && ann.rects.length > 0 ? ann.rects : [{ x: ann.x, y: ann.y, width: ann.width, height: ann.height }];\n const th = ann.strokeWidth || 2;\n shape = (\n <g>\n {ulRects.map((r, i) => (\n <React.Fragment key={i}>\n <rect x={r.x} y={r.y} width={r.width} height={r.height} fill=\"transparent\" />\n <line\n x1={r.x}\n y1={r.y + r.height - th / 2}\n x2={r.x + r.width}\n y2={r.y + r.height - th / 2}\n stroke={strokeColor}\n strokeWidth={th}\n strokeLinecap=\"round\"\n />\n </React.Fragment>\n ))}\n </g>\n );\n } else if (ann.type === 'strikeout') {\n const soRects = ann.rects && ann.rects.length > 0 ? ann.rects : [{ x: ann.x, y: ann.y, width: ann.width, height: ann.height }];\n const th = ann.strokeWidth || 2;\n shape = (\n <g>\n {soRects.map((r, i) => (\n <React.Fragment key={i}>\n <rect x={r.x} y={r.y} width={r.width} height={r.height} fill=\"transparent\" />\n <line\n x1={r.x}\n y1={r.y + r.height / 2}\n x2={r.x + r.width}\n y2={r.y + r.height / 2}\n stroke={strokeColor}\n strokeWidth={th}\n strokeLinecap=\"round\"\n />\n </React.Fragment>\n ))}\n </g>\n );\n } else if (ann.type === 'squiggly') {\n const sqRects = ann.rects && ann.rects.length > 0 ? ann.rects : [{ x: ann.x, y: ann.y, width: ann.width, height: ann.height }];\n const th = ann.strokeWidth || 1.5;\n const generateSquigglyD = (x: number, y: number, width: number) => {\n let d = `M ${x} ${y}`;\n const step = 4;\n let up = true;\n for (let cx = x; cx < x + width; cx += step) {\n const nextX = Math.min(cx + step, x + width);\n const midX = cx + (nextX - cx) / 2;\n const dy = up ? -2.5 : 2.5;\n d += ` Q ${midX} ${y + dy}, ${nextX} ${y}`;\n up = !up;\n }\n return d;\n };\n shape = (\n <g>\n {sqRects.map((r, i) => (\n <React.Fragment key={i}>\n <rect x={r.x} y={r.y} width={r.width} height={r.height} fill=\"transparent\" />\n <path\n d={generateSquigglyD(r.x, r.y + r.height - 2, r.width)}\n fill=\"none\"\n stroke={strokeColor}\n strokeWidth={th}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </React.Fragment>\n ))}\n </g>\n );\n } else if (ann.type === 'opaque') {\n // Imported annotation this viewer cannot edit/render natively: outline + kind label.\n shape = (\n <g>\n <rect x={ann.x} y={ann.y} width={ann.width} height={ann.height} fill=\"none\" stroke={strokeColor} strokeWidth=\"1\" strokeDasharray=\"3,2\" opacity={0.8} />\n {ann.opaqueKind && ann.width > 40 && (\n <text x={ann.x + 2} y={ann.y - 2} fill={strokeColor} fontSize=\"8px\" fontFamily=\"sans-serif\" opacity={0.8}>{ann.opaqueKind}</text>\n )}\n </g>\n );\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.strokes?.length || ann.points)) {\n const strokes = ann.strokes && ann.strokes.length > 0 ? ann.strokes : [ann.points ?? []];\n shape = (\n <g style={{ mixBlendMode: blendMode }}>\n {strokes.filter(st => st.length > 0).map((st, i) => {\n const d = `M ${st.map(p => `${p.x},${p.y}`).join(' L ')}`;\n return (\n <React.Fragment key={i}>\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 </React.Fragment>\n );\n })}\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 const w = ann.width && ann.width > 0 ? ann.width : 32;\n const h = ann.height && ann.height > 0 ? ann.height : 32;\n const isResizable = ['text', 'rectangle', 'ellipse', 'highlight', 'underline', 'strikeout', 'squiggly'].includes(ann.type);\n const handleCoords: Record<string, { x: number; y: number; cursor: string }> = {\n nw: { x: ann.x, y: ann.y, cursor: 'nwse-resize' },\n n: { x: ann.x + w / 2, y: ann.y, cursor: 'ns-resize' },\n ne: { x: ann.x + w, y: ann.y, cursor: 'nesw-resize' },\n e: { x: ann.x + w, y: ann.y + h / 2, cursor: 'ew-resize' },\n se: { x: ann.x + w, y: ann.y + h, cursor: 'nwse-resize' },\n s: { x: ann.x + w / 2, y: ann.y + h, cursor: 'ns-resize' },\n sw: { x: ann.x, y: ann.y + h, cursor: 'nesw-resize' },\n w: { x: ann.x, y: ann.y + h / 2, cursor: 'ew-resize' },\n };\n\n return (\n <g className=\"tspdf-annotation-selection\">\n <rect \n x={ann.x - 4} y={ann.y - 4} \n width={w + 8} \n height={h + 8} \n fill=\"none\" stroke=\"var(--primary)\" strokeWidth=\"1.5\" strokeDasharray=\"4\" \n style={{ pointerEvents: 'none' }}\n />\n {!ann.readOnly && isResizable && onStartResize && Object.entries(handleCoords).map(([handleKey, hInfo]) => (\n <rect\n key={handleKey}\n x={hInfo.x - 4}\n y={hInfo.y - 4}\n width={8}\n height={8}\n fill=\"#ffffff\"\n stroke=\"var(--primary)\"\n strokeWidth=\"1.5\"\n rx={1}\n style={{ cursor: hInfo.cursor, pointerEvents: 'all' }}\n onMouseDown={(e) => {\n e.stopPropagation();\n onStartResize(ann.id, handleKey, e, pageNum);\n }}\n />\n ))}\n </g>\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 return prevProps.pageNum === nextProps.pageNum &&\n prevProps.pdfDoc === nextProps.pdfDoc &&\n prevProps.scale === nextProps.scale &&\n prevProps.rotation === nextProps.rotation &&\n prevProps.basePageWidth === nextProps.basePageWidth &&\n prevProps.basePageHeight === nextProps.basePageHeight &&\n prevProps.pageTop === nextProps.pageTop &&\n prevProps.pageLeft === nextProps.pageLeft &&\n prevProps.activeTab === nextProps.activeTab &&\n prevProps.activeTool === nextProps.activeTool &&\n prevProps.selectedAnnotationId === nextProps.selectedAnnotationId &&\n prevProps.activeSearchResult === nextProps.activeSearchResult &&\n prevProps.watermark === nextProps.watermark &&\n prevProps.watermarkText === nextProps.watermarkText &&\n prevProps.redactions === nextProps.redactions &&\n prevProps.annotations === nextProps.annotations &&\n prevProps.transientHighlights === nextProps.transientHighlights &&\n prevProps.hideAnnotationsUntilPageRendered === nextProps.hideAnnotationsUntilPageRendered;\n});\n\nexport default PageRenderer;\n","/**\n * © 2026 AngelBot Ai Pvt Ltd. All rights reserved.\n * Stable, collision-free annotation ids. They double as the XFDF `name` attribute, which hosts use\n * to match persisted rows to live annotations, so they must never be timestamps.\n */\nexport function newAnnotationId(): string {\n if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') {\n return crypto.randomUUID();\n }\n // Fallback for very old runtimes: 128 bits from Math.random, formatted like a UUID v4.\n const hex = Array.from({ length: 32 }, () => Math.floor(Math.random() * 16).toString(16)).join('');\n return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-4${hex.slice(13, 16)}-a${hex.slice(17, 20)}-${hex.slice(20, 32)}`;\n}\n","/**\n * © 2026 AngelBot Ai Pvt Ltd. All rights reserved.\n * Cross-environment clipboard utility with secure and fallback execCommand copying.\n */\n\nexport async function copyTextToClipboard(text: string): Promise<boolean> {\n if (!text) return false;\n\n // Modern asynchronous Clipboard API (supported in secure HTTPS / localhost contexts)\n if (typeof navigator !== 'undefined' && navigator.clipboard && typeof navigator.clipboard.writeText === 'function') {\n try {\n await navigator.clipboard.writeText(text);\n return true;\n } catch {\n // Fallback below if permission was denied or running in an iframe / non-secure context\n }\n }\n\n // Fallback using textarea + document.execCommand('copy')\n if (typeof document !== 'undefined') {\n try {\n const textArea = document.createElement('textarea');\n textArea.value = text;\n textArea.setAttribute('readonly', '');\n textArea.style.contain = 'strict';\n textArea.style.position = 'fixed';\n textArea.style.left = '-9999px';\n textArea.style.top = '-9999px';\n textArea.style.opacity = '0';\n document.body.appendChild(textArea);\n textArea.select();\n textArea.setSelectionRange(0, text.length);\n const successful = document.execCommand('copy');\n document.body.removeChild(textArea);\n return successful;\n } catch (err) {\n console.error('Failed to copy text to clipboard fallback:', err);\n return false;\n }\n }\n\n return false;\n}\n","/**\n * © 2026 AngelBot Ai Pvt Ltd. All rights reserved.\n * Floating quick-action copy pill rendered directly above active text selections.\n */\nimport React, { useEffect, useState, useCallback, useRef } from 'react';\nimport { Copy, Check, Highlighter, Underline, Strikethrough } from 'lucide-react';\nimport { copyTextToClipboard } from '../utils/clipboardUtils';\n\ninterface TextSelectionTooltipProps {\n containerRef: React.RefObject<HTMLDivElement | null>;\n onCopy?: (text: string) => void;\n onAnnotateSelection?: (type: 'highlight' | 'underline' | 'strikeout' | 'squiggly') => void;\n}\n\nexport const TextSelectionTooltip: React.FC<TextSelectionTooltipProps> = ({ containerRef, onCopy, onAnnotateSelection }) => {\n const [selectedText, setSelectedText] = useState<string>('');\n const [position, setPosition] = useState<{ top: number; left: number } | null>(null);\n const [copied, setCopied] = useState<boolean>(false);\n const timeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const updatePosition = useCallback(() => {\n if (typeof window === 'undefined') return;\n const selection = window.getSelection();\n\n if (!selection || selection.isCollapsed || !selection.rangeCount || !containerRef.current) {\n setPosition(null);\n setSelectedText('');\n return;\n }\n\n const range = selection.getRangeAt(0);\n const commonAncestor = range.commonAncestorContainer;\n\n // Verify the selection is inside our viewer container\n if (!containerRef.current.contains(commonAncestor)) {\n setPosition(null);\n setSelectedText('');\n return;\n }\n\n const text = selection.toString().trim();\n if (!text) {\n setPosition(null);\n setSelectedText('');\n return;\n }\n\n const rangeRect = range.getBoundingClientRect();\n if (rangeRect.width === 0 && rangeRect.height === 0) {\n setPosition(null);\n setSelectedText('');\n return;\n }\n\n const containerRect = containerRef.current.getBoundingClientRect();\n const centerX = rangeRect.left + rangeRect.width / 2;\n const relLeft = centerX - containerRect.left + containerRef.current.scrollLeft;\n \n // Position 38px above selection by default; flip below if too close to container top\n let relTop = rangeRect.top - containerRect.top + containerRef.current.scrollTop - 38;\n if (relTop < containerRef.current.scrollTop + 8) {\n relTop = rangeRect.bottom - containerRect.top + containerRef.current.scrollTop + 8;\n }\n\n setSelectedText(text);\n setPosition({ top: relTop, left: relLeft });\n }, [containerRef]);\n\n useEffect(() => {\n const handleSelectionChange = () => {\n // Debounce slightly to let mouse-up complete selection bounding box\n requestAnimationFrame(updatePosition);\n };\n\n document.addEventListener('selectionchange', handleSelectionChange);\n const container = containerRef.current;\n if (container) {\n container.addEventListener('scroll', updatePosition, { passive: true });\n }\n\n return () => {\n document.removeEventListener('selectionchange', handleSelectionChange);\n if (container) {\n container.removeEventListener('scroll', updatePosition);\n }\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n }\n };\n }, [containerRef, updatePosition]);\n\n const handleCopy = async (e: React.MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n\n if (!selectedText) return;\n\n const success = await copyTextToClipboard(selectedText);\n if (success) {\n setCopied(true);\n onCopy?.(selectedText);\n\n if (timeoutRef.current) clearTimeout(timeoutRef.current);\n timeoutRef.current = setTimeout(() => {\n setCopied(false);\n }, 1500);\n }\n };\n\n if (!position || !selectedText) {\n return null;\n }\n\n return (\n <div\n role=\"toolbar\"\n aria-label=\"Selection actions\"\n style={{\n position: 'absolute',\n top: `${position.top}px`,\n left: `${position.left}px`,\n transform: 'translateX(-50%)',\n zIndex: 50,\n display: 'flex',\n alignItems: 'center',\n backgroundColor: '#0f172a',\n borderRadius: '6px',\n padding: '3px 6px',\n boxShadow: '0 4px 14px rgba(0, 0, 0, 0.25), 0 0 0 1px rgba(255, 255, 255, 0.1)',\n pointerEvents: 'auto',\n userSelect: 'none',\n whiteSpace: 'nowrap',\n animation: 'tspdf-fade-in 0.15s ease-out'\n }}\n onMouseDown={(e) => {\n // Prevent clicking the tooltip from clearing the active DOM text selection\n e.preventDefault();\n e.stopPropagation();\n }}\n >\n <style>{`\n @keyframes tspdf-fade-in {\n from { opacity: 0; transform: translate(-50%, 4px); }\n to { opacity: 1; transform: translate(-50%, 0); }\n }\n `}</style>\n <button\n onClick={handleCopy}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: '5px',\n background: 'transparent',\n border: 'none',\n color: copied ? '#4ade80' : '#f8fafc',\n cursor: 'pointer',\n fontSize: '12px',\n fontWeight: 500,\n padding: '3px 6px',\n borderRadius: '4px',\n transition: 'background-color 0.15s, color 0.15s'\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.backgroundColor = 'rgba(255, 255, 255, 0.12)';\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = 'transparent';\n }}\n title=\"Copy selected text\"\n >\n {copied ? <Check size={13} color=\"#4ade80\" /> : <Copy size={13} color=\"#f8fafc\" />}\n <span>{copied ? 'Copied!' : 'Copy'}</span>\n </button>\n\n {onAnnotateSelection && (\n <>\n <div style={{ width: '1px', height: '16px', backgroundColor: 'rgba(255, 255, 255, 0.2)', margin: '0 4px' }} />\n <button\n onClick={(e) => { e.preventDefault(); e.stopPropagation(); onAnnotateSelection('highlight'); }}\n style={{\n display: 'flex', alignItems: 'center', justifyContent: 'center',\n width: '24px', height: '24px', background: 'transparent', border: 'none',\n borderRadius: '4px', cursor: 'pointer', padding: 0\n }}\n onMouseEnter={(e) => { e.currentTarget.style.backgroundColor = 'rgba(255, 255, 255, 0.12)'; }}\n onMouseLeave={(e) => { e.currentTarget.style.backgroundColor = 'transparent'; }}\n title=\"Highlight selected text\"\n >\n <Highlighter size={13} color=\"#fbc02d\" />\n </button>\n <button\n onClick={(e) => { e.preventDefault(); e.stopPropagation(); onAnnotateSelection('underline'); }}\n style={{\n display: 'flex', alignItems: 'center', justifyContent: 'center',\n width: '24px', height: '24px', background: 'transparent', border: 'none',\n borderRadius: '4px', cursor: 'pointer', padding: 0\n }}\n onMouseEnter={(e) => { e.currentTarget.style.backgroundColor = 'rgba(255, 255, 255, 0.12)'; }}\n onMouseLeave={(e) => { e.currentTarget.style.backgroundColor = 'transparent'; }}\n title=\"Underline selected text\"\n >\n <Underline size={13} color=\"#f8fafc\" />\n </button>\n <button\n onClick={(e) => { e.preventDefault(); e.stopPropagation(); onAnnotateSelection('strikeout'); }}\n style={{\n display: 'flex', alignItems: 'center', justifyContent: 'center',\n width: '24px', height: '24px', background: 'transparent', border: 'none',\n borderRadius: '4px', cursor: 'pointer', padding: 0\n }}\n onMouseEnter={(e) => { e.currentTarget.style.backgroundColor = 'rgba(255, 255, 255, 0.12)'; }}\n onMouseLeave={(e) => { e.currentTarget.style.backgroundColor = 'transparent'; }}\n title=\"Strikeout selected text\"\n >\n <Strikethrough size={13} color=\"#f8fafc\" />\n </button>\n <button\n onClick={(e) => { e.preventDefault(); e.stopPropagation(); onAnnotateSelection('squiggly'); }}\n style={{\n display: 'flex', alignItems: 'center', justifyContent: 'center',\n width: '24px', height: '24px', background: 'transparent', border: 'none',\n borderRadius: '4px', cursor: 'pointer', padding: 0\n }}\n onMouseEnter={(e) => { e.currentTarget.style.backgroundColor = 'rgba(255, 255, 255, 0.12)'; }}\n onMouseLeave={(e) => { e.currentTarget.style.backgroundColor = 'transparent'; }}\n title=\"Squiggly underline selected text\"\n >\n <svg width={13} height={13} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#4ade80\" strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M4 18c1.5-2 2.5-2 4 0s2.5 2 4 0 2.5-2 4 0 2.5 2 4 0\" />\n </svg>\n </button>\n </>\n )}\n </div>\n );\n};\nexport default TextSelectionTooltip;\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 */\n\nexport interface PageDimension {\n width: number;\n height: number;\n}\n\nexport interface RowLayout {\n heights: number[];\n tops: number[];\n total: number;\n}\n\n/** Standard US Letter dimensions in PDF points (72 points/inch: 8.5 x 11 inches). */\nexport const DEFAULT_FALLBACK_DIMS: PageDimension = { width: 612, height: 792 };\n\n/**\n * Pre-allocates an array of page dimensions for the entire document up front,\n * reserving estimated space based on a sample page (e.g. Page 1).\n */\nexport function estimatePageDimensions(\n numPages: number,\n sampleDim: PageDimension = DEFAULT_FALLBACK_DIMS\n): PageDimension[] {\n if (numPages <= 0) return [];\n const dim = { width: sampleDim.width, height: sampleDim.height };\n return Array.from({ length: numPages }, () => ({ ...dim }));\n}\n\n/**\n * Computes row heights, vertical tops, and total container scroll height\n * for given rows of pages and scale.\n */\nexport function computeRowLayout(\n rows: number[][],\n dimsFor: (page: number) => PageDimension,\n scale: number,\n gap = 16\n): RowLayout {\n const heights = rows.map((row) => {\n if (row.length === 0) return gap;\n const maxHeight = Math.max(...row.map((p) => dimsFor(p).height));\n return maxHeight * scale + gap;\n });\n\n const tops: number[] = [];\n let acc = 0;\n for (const h of heights) {\n tops.push(acc);\n acc += h;\n }\n\n return { heights, tops, total: acc };\n}\n\n/**\n * Checks if any page dimension in array A differs from array B beyond a tolerance.\n */\nexport function hasDimensionMismatch(\n dimsA: PageDimension[],\n dimsB: PageDimension[],\n tolerance = 0.5\n): boolean {\n if (dimsA.length !== dimsB.length) return true;\n for (let i = 0; i < dimsA.length; i++) {\n const a = dimsA[i];\n const b = dimsB[i];\n if (\n Math.abs(a.width - b.width) > tolerance ||\n Math.abs(a.height - b.height) > tolerance\n ) {\n return true;\n }\n }\n return false;\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 */\n\nimport React, { useState } from 'react';\nimport type { DiffBoundingBox } from '../types/compare';\n\ninterface DiffHighlightOverlayProps {\n boxes: DiffBoundingBox[];\n scale: number;\n colorScheme?: 'deletions' | 'additions' | 'all';\n selectedDiffId?: string | null;\n onSelectDiff?: (id: string) => void;\n}\n\nexport default function DiffHighlightOverlay({\n boxes,\n scale,\n colorScheme = 'all',\n selectedDiffId,\n onSelectDiff\n}: DiffHighlightOverlayProps) {\n const [hoveredId, setHoveredId] = useState<string | null>(null);\n\n if (!boxes || boxes.length === 0) return null;\n\n const filteredBoxes = boxes.filter(b => {\n if (colorScheme === 'deletions') return b.type === 'deletion' || b.type === 'modification';\n if (colorScheme === 'additions') return b.type === 'addition' || b.type === 'modification';\n return true;\n });\n\n return (\n <div\n className=\"tspdf-diff-highlight-overlay\"\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n width: '100%',\n height: '100%',\n pointerEvents: 'none',\n zIndex: 15\n }}\n >\n <style>{`\n @keyframes tspdf-diff-pulse {\n 0% {\n box-shadow: 0 0 0 0 rgba(2, 132, 199, 0.8), 0 0 12px rgba(2, 132, 199, 0.5);\n }\n 50% {\n box-shadow: 0 0 0 6px rgba(2, 132, 199, 0.35), 0 0 24px rgba(2, 132, 199, 0.8);\n }\n 100% {\n box-shadow: 0 0 0 0 rgba(2, 132, 199, 0.8), 0 0 12px rgba(2, 132, 199, 0.5);\n }\n }\n `}</style>\n {filteredBoxes.map((box) => {\n const isSelected = selectedDiffId === box.id;\n const isHovered = hoveredId === box.id;\n\n let bg = 'rgba(245, 158, 11, 0.22)';\n let border = '1.5px solid #f59e0b';\n let labelColor = '#d97706';\n let labelPrefix = 'Changed';\n\n if (box.type === 'deletion') {\n bg = isSelected ? 'rgba(225, 29, 72, 0.35)' : 'rgba(225, 29, 72, 0.22)';\n border = isSelected ? '2px solid #e11d48' : '1.5px solid #e11d48';\n labelColor = '#e11d48';\n labelPrefix = 'Removed';\n } else if (box.type === 'addition') {\n bg = isSelected ? 'rgba(16, 185, 129, 0.35)' : 'rgba(16, 185, 129, 0.22)';\n border = isSelected ? '2px solid #10b981' : '1.5px solid #10b981';\n labelColor = '#059669';\n labelPrefix = 'Added';\n }\n\n const x = box.x * scale;\n const y = box.y * scale;\n const w = box.width * scale;\n const h = box.height * scale;\n\n return (\n <div\n key={box.id}\n id={`diff-highlight-${box.id}`}\n onClick={(e) => {\n e.stopPropagation();\n onSelectDiff?.(box.id);\n }}\n onMouseEnter={() => setHoveredId(box.id)}\n onMouseLeave={() => setHoveredId(null)}\n style={{\n position: 'absolute',\n left: `${x}px`,\n top: `${y}px`,\n width: `${w}px`,\n height: `${h}px`,\n backgroundColor: bg,\n border: border,\n borderRadius: '4px',\n cursor: 'pointer',\n pointerEvents: 'auto',\n animation: isSelected ? 'tspdf-diff-pulse 1.8s infinite ease-in-out' : 'none',\n boxShadow: isSelected\n ? '0 0 0 3px #0284c7, 0 4px 16px rgba(2, 132, 199, 0.5)'\n : isHovered\n ? '0 0 0 2px rgba(0,0,0,0.25)'\n : 'none',\n transition: 'all 0.15s ease-in-out',\n zIndex: isSelected ? 30 : isHovered ? 25 : 15\n }}\n title={`${labelPrefix}: ${box.text}`}\n >\n {(isHovered || isSelected) && (\n <div\n style={{\n position: 'absolute',\n bottom: '100%',\n left: '50%',\n transform: 'translateX(-50%)',\n marginBottom: '6px',\n backgroundColor: '#0f172a',\n color: '#ffffff',\n fontSize: '11px',\n fontWeight: 600,\n padding: '4px 10px',\n borderRadius: '6px',\n whiteSpace: 'nowrap',\n boxShadow: '0 4px 14px rgba(0,0,0,0.3)',\n zIndex: 40,\n display: 'flex',\n alignItems: 'center',\n gap: '6px',\n pointerEvents: 'none'\n }}\n >\n <span style={{ color: labelColor, fontWeight: 700, textTransform: 'uppercase', fontSize: '10px' }}>\n {labelPrefix}\n </span>\n <span style={{ maxWidth: '220px', overflow: 'hidden', textOverflow: 'ellipsis' }}>\n \"{box.text}\"\n </span>\n <div style={{\n position: 'absolute',\n top: '100%',\n left: '50%',\n transform: 'translateX(-50%)',\n width: 0,\n height: 0,\n borderLeft: '5px solid transparent',\n borderRight: '5px solid transparent',\n borderTop: '5px solid #0f172a'\n }} />\n </div>\n )}\n </div>\n );\n })}\n </div>\n );\n}\n\n","/**\n * © 2026 AngelBot Ai Pvt Ltd. All rights reserved.\n */\n\nimport React, { useRef, useEffect, useState } from 'react';\nimport * as pdfjsLib from 'pdfjs-dist';\nimport PageRenderer from './PageRenderer';\nimport DiffHighlightOverlay from './DiffHighlightOverlay';\nimport type { SDKPermissions, WatermarkOptions, Redaction } from '../core/types';\nimport type { DiffBoundingBox } from '../types/compare';\n\ninterface SideBySideViewerProps {\n pdfDocA: pdfjsLib.PDFDocumentProxy | null;\n pdfDocB: pdfjsLib.PDFDocumentProxy | null;\n pageNum: number;\n scale: number;\n rotation: number;\n basePageDims: { width: number; height: number };\n activeTab: string;\n activeTool: string | null;\n annotations: any[];\n permissions?: SDKPermissions;\n watermark?: WatermarkOptions;\n watermarkText?: string;\n redactions?: Redaction[];\n diffsA?: DiffBoundingBox[];\n diffsB?: DiffBoundingBox[];\n selectedDiffId?: string | null;\n onSelectDiff?: (id: string) => void;\n onScrollSync?: (scrollTop: number, scrollLeft: number) => void;\n hideAnnotationsUntilPageRendered?: boolean;\n}\n\nexport default function SideBySideViewer({\n pdfDocA,\n pdfDocB,\n pageNum,\n scale,\n rotation,\n basePageDims,\n activeTab,\n activeTool,\n annotations,\n watermark,\n watermarkText,\n redactions,\n diffsA = [],\n diffsB = [],\n selectedDiffId,\n onSelectDiff,\n hideAnnotationsUntilPageRendered = true\n}: SideBySideViewerProps) {\n const containerARef = useRef<HTMLDivElement>(null);\n const containerBRef = useRef<HTMLDivElement>(null);\n const isSyncingRef = useRef(false);\n\n // Synchronize scrolling between Panel A and Panel B\n useEffect(() => {\n const elA = containerARef.current;\n const elB = containerBRef.current;\n if (!elA || !elB) return;\n\n const syncAtoB = () => {\n if (isSyncingRef.current) return;\n isSyncingRef.current = true;\n elB.scrollTop = elA.scrollTop;\n elB.scrollLeft = elA.scrollLeft;\n setTimeout(() => { isSyncingRef.current = false; }, 10);\n };\n\n const syncBtoA = () => {\n if (isSyncingRef.current) return;\n isSyncingRef.current = true;\n elA.scrollTop = elB.scrollTop;\n elA.scrollLeft = elB.scrollLeft;\n setTimeout(() => { isSyncingRef.current = false; }, 10);\n };\n\n elA.addEventListener('scroll', syncAtoB);\n elB.addEventListener('scroll', syncBtoA);\n\n return () => {\n elA.removeEventListener('scroll', syncAtoB);\n elB.removeEventListener('scroll', syncBtoA);\n };\n }, []);\n\n // Smooth scroll to selected diff box\n useEffect(() => {\n if (!selectedDiffId) return;\n const allDiffs = [...(diffsA || []), ...(diffsB || [])];\n const targetBox = allDiffs.find(d => d.id === selectedDiffId);\n if (targetBox && containerARef.current) {\n const viewH = containerARef.current.clientHeight || 600;\n const targetY = targetBox.y * scale;\n const scrollToY = Math.max(0, targetY - viewH / 3);\n containerARef.current.scrollTo({\n top: scrollToY,\n behavior: 'smooth'\n });\n }\n }, [selectedDiffId, diffsA, diffsB, scale]);\n\n const [dimsA, setDimsA] = useState<{ width: number; height: number }>(basePageDims);\n const [dimsB, setDimsB] = useState<{ width: number; height: number }>(basePageDims);\n\n useEffect(() => {\n if (pdfDocA) {\n pdfDocA.getPage(pageNum).then(page => {\n const vp = page.getViewport({ scale: 1, rotation: (page.rotate + rotation) % 360 });\n setDimsA({ width: vp.width, height: vp.height });\n }).catch(() => {});\n }\n }, [pdfDocA, pageNum, rotation]);\n\n useEffect(() => {\n if (pdfDocB) {\n pdfDocB.getPage(pageNum).then(page => {\n const vp = page.getViewport({ scale: 1, rotation: (page.rotate + rotation) % 360 });\n setDimsB({ width: vp.width, height: vp.height });\n }).catch(() => {});\n }\n }, [pdfDocB, pageNum, rotation]);\n\n const scaledWidthA = (dimsA.width || 600) * scale;\n const scaledHeightA = (dimsA.height || 800) * scale;\n\n const scaledWidthB = (dimsB.width || 600) * scale;\n const scaledHeightB = (dimsB.height || 800) * scale;\n\n return (\n <div style={{ flex: 1, display: 'flex', minHeight: 0, width: '100%', height: '100%', overflow: 'hidden' }}>\n {/* Panel A - Document A (Base) */}\n <div\n ref={containerARef}\n style={{\n flex: 1,\n height: '100%',\n overflow: 'auto',\n backgroundColor: '#f1f5f9',\n borderRight: '2px solid #cbd5e1',\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n padding: '16px'\n }}\n >\n <div style={{\n marginBottom: '8px', padding: '4px 12px', borderRadius: '4px',\n backgroundColor: '#e11d48', color: '#ffffff', fontSize: '11px', fontWeight: 600\n }}>\n Document A (Base) - Page {pageNum}\n </div>\n <div style={{ position: 'relative', width: `${scaledWidthA}px`, height: `${scaledHeightA}px`, boxShadow: '0 4px 12px rgba(0,0,0,0.15)' }}>\n {pdfDocA && (\n <PageRenderer\n pageNum={pageNum}\n pdfDoc={pdfDocA}\n scale={scale}\n rotation={rotation}\n scrollTop={0}\n scrollLeft={0}\n pageTop={0}\n basePageWidth={dimsA.width}\n basePageHeight={dimsA.height}\n containerWidth={scaledWidthA}\n containerHeight={scaledHeightA}\n activeTab={activeTab}\n activeTool={activeTool}\n annotations={annotations}\n selectedAnnotationId={null}\n activeSearchResult={null}\n onMouseDown={() => {}}\n onMouseMove={() => {}}\n onMouseUp={() => {}}\n onAnnotationMouseEnter={() => {}}\n onAnnotationClick={() => {}}\n onClearSelection={() => {}}\n watermark={watermark}\n watermarkText={watermarkText}\n redactions={redactions}\n hideAnnotationsUntilPageRendered={hideAnnotationsUntilPageRendered}\n />\n )}\n <DiffHighlightOverlay\n boxes={diffsA}\n scale={scale}\n colorScheme=\"deletions\"\n selectedDiffId={selectedDiffId}\n onSelectDiff={onSelectDiff}\n />\n </div>\n </div>\n\n {/* Panel B - Document B (Comparison) */}\n <div\n ref={containerBRef}\n style={{\n flex: 1,\n height: '100%',\n overflow: 'auto',\n backgroundColor: '#f1f5f9',\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n padding: '16px'\n }}\n >\n <div style={{\n marginBottom: '8px', padding: '4px 12px', borderRadius: '4px',\n backgroundColor: '#0284c7', color: '#ffffff', fontSize: '11px', fontWeight: 600\n }}>\n Document B (Comparison) - Page {pageNum}\n </div>\n <div style={{ position: 'relative', width: `${scaledWidthB}px`, height: `${scaledHeightB}px`, boxShadow: '0 4px 12px rgba(0,0,0,0.15)' }}>\n {pdfDocB && (\n <PageRenderer\n pageNum={pageNum}\n pdfDoc={pdfDocB}\n scale={scale}\n rotation={rotation}\n scrollTop={0}\n scrollLeft={0}\n pageTop={0}\n basePageWidth={dimsB.width}\n basePageHeight={dimsB.height}\n containerWidth={scaledWidthB}\n containerHeight={scaledHeightB}\n activeTab={activeTab}\n activeTool={activeTool}\n annotations={annotations}\n selectedAnnotationId={null}\n activeSearchResult={null}\n onMouseDown={() => {}}\n onMouseMove={() => {}}\n onMouseUp={() => {}}\n onAnnotationMouseEnter={() => {}}\n onAnnotationClick={() => {}}\n onClearSelection={() => {}}\n watermark={watermark}\n watermarkText={watermarkText}\n redactions={redactions}\n hideAnnotationsUntilPageRendered={hideAnnotationsUntilPageRendered}\n />\n )}\n <DiffHighlightOverlay\n boxes={diffsB}\n scale={scale}\n colorScheme=\"additions\"\n selectedDiffId={selectedDiffId}\n onSelectDiff={onSelectDiff}\n />\n </div>\n </div>\n </div>\n );\n}\n","/**\n * © 2026 AngelBot Ai Pvt Ltd. All rights reserved.\n */\n\nimport React from 'react';\nimport { Layers, Columns, FileText, SlidersHorizontal, ChevronLeft, ChevronRight, X } from 'lucide-react';\nimport type { CompareMode, CompareState } from '../types/compare';\n\ninterface CompareToolbarProps {\n compareState: CompareState;\n onSetMode: (mode: CompareMode) => void;\n onSetColors: (colorA: string, colorB: string) => void;\n onToggleCurtain: () => void;\n onPrevDiff: () => void;\n onNextDiff: () => void;\n onExit: () => void;\n}\n\nexport default function CompareToolbar({\n compareState,\n onSetMode,\n onSetColors,\n onToggleCurtain,\n onPrevDiff,\n onNextDiff,\n onExit\n}: CompareToolbarProps) {\n const { mode, colorA, colorB, showCurtain, diffItems, currentDiffIndex } = compareState;\n\n return (\n <div style={{\n display: 'flex',\n alignItems: 'center',\n gap: '12px',\n padding: '6px 16px',\n backgroundColor: '#1e293b',\n color: '#f8fafc',\n borderBottom: '1px solid #334155',\n height: '42px',\n fontSize: '13px',\n zIndex: 100\n }}>\n {/* Compare Status Badge */}\n <div style={{ display: 'flex', alignItems: 'center', gap: '6px', fontWeight: 600, color: '#38bdf8' }}>\n <Layers size={16} />\n <span>Document Compare</span>\n </div>\n\n <div style={{ width: '1px', height: '20px', backgroundColor: '#475569' }} />\n\n {/* Mode Switcher */}\n <div style={{ display: 'flex', backgroundColor: '#0f172a', borderRadius: '6px', padding: '2px' }}>\n <button\n onClick={() => onSetMode('overlay')}\n style={{\n display: 'flex', alignItems: 'center', gap: '6px',\n padding: '4px 10px', borderRadius: '4px', border: 'none',\n backgroundColor: mode === 'overlay' ? '#0284c7' : 'transparent',\n color: mode === 'overlay' ? '#ffffff' : '#94a3b8',\n cursor: 'pointer', fontSize: '12px', fontWeight: 500\n }}\n title=\"Overlay Color Blend Diff\"\n >\n <Layers size={14} />\n <span>Overlay Diff</span>\n </button>\n\n <button\n onClick={() => onSetMode('side-by-side')}\n style={{\n display: 'flex', alignItems: 'center', gap: '6px',\n padding: '4px 10px', borderRadius: '4px', border: 'none',\n backgroundColor: mode === 'side-by-side' ? '#0284c7' : 'transparent',\n color: mode === 'side-by-side' ? '#ffffff' : '#94a3b8',\n cursor: 'pointer', fontSize: '12px', fontWeight: 500\n }}\n title=\"Side-by-Side Synchronized MultiViewer\"\n >\n <Columns size={14} />\n <span>Side-by-Side</span>\n </button>\n\n <button\n onClick={() => onSetMode('semantic')}\n style={{\n display: 'flex', alignItems: 'center', gap: '6px',\n padding: '4px 10px', borderRadius: '4px', border: 'none',\n backgroundColor: mode === 'semantic' ? '#0284c7' : 'transparent',\n color: mode === 'semantic' ? '#ffffff' : '#94a3b8',\n cursor: 'pointer', fontSize: '12px', fontWeight: 500\n }}\n title=\"Semantic Text & Structured Diff\"\n >\n <FileText size={14} />\n <span>Text Diff</span>\n </button>\n </div>\n\n {/* Mode Specific Controls */}\n {mode === 'overlay' && (\n <>\n <div style={{ width: '1px', height: '20px', backgroundColor: '#475569' }} />\n \n {/* Color Tint Selectors */}\n <div style={{ display: 'flex', alignItems: 'center', gap: '8px' }}>\n <div style={{ display: 'flex', alignItems: 'center', gap: '4px' }}>\n <span style={{ fontSize: '11px', color: '#94a3b8' }}>Doc A:</span>\n <input\n type=\"color\"\n value={colorA}\n onChange={(e) => onSetColors(e.target.value, colorB)}\n style={{ width: '22px', height: '22px', border: 'none', borderRadius: '4px', cursor: 'pointer', backgroundColor: 'transparent' }}\n title=\"Document A Tint Color (Deletions)\"\n />\n </div>\n <div style={{ display: 'flex', alignItems: 'center', gap: '4px' }}>\n <span style={{ fontSize: '11px', color: '#94a3b8' }}>Doc B:</span>\n <input\n type=\"color\"\n value={colorB}\n onChange={(e) => onSetColors(colorA, e.target.value)}\n style={{ width: '22px', height: '22px', border: 'none', borderRadius: '4px', cursor: 'pointer', backgroundColor: 'transparent' }}\n title=\"Document B Tint Color (Additions)\"\n />\n </div>\n </div>\n\n <button\n onClick={onToggleCurtain}\n style={{\n display: 'flex', alignItems: 'center', gap: '4px',\n padding: '4px 8px', borderRadius: '4px', border: '1px solid #475569',\n backgroundColor: showCurtain ? '#0369a1' : 'transparent',\n color: '#f8fafc', cursor: 'pointer', fontSize: '12px'\n }}\n title=\"Toggle Wipe Curtain Slider\"\n >\n <SlidersHorizontal size={14} />\n <span>Curtain Slider</span>\n </button>\n </>\n )}\n\n {/* Diff Navigation Counter */}\n {diffItems.length > 0 && (\n <>\n <div style={{ width: '1px', height: '20px', backgroundColor: '#475569' }} />\n <div style={{ display: 'flex', alignItems: 'center', gap: '6px' }}>\n <button\n onClick={onPrevDiff}\n style={{ padding: '2px 6px', borderRadius: '4px', border: 'none', backgroundColor: '#334155', color: '#f8fafc', cursor: 'pointer' }}\n title=\"Previous Difference\"\n >\n <ChevronLeft size={14} />\n </button>\n <span style={{ fontSize: '12px', color: '#cbd5e1', minWidth: '70px', textAlign: 'center' }}>\n {currentDiffIndex + 1} of {diffItems.length} diffs\n </span>\n <button\n onClick={onNextDiff}\n style={{ padding: '2px 6px', borderRadius: '4px', border: 'none', backgroundColor: '#334155', color: '#f8fafc', cursor: 'pointer' }}\n title=\"Next Difference\"\n >\n <ChevronRight size={14} />\n </button>\n </div>\n </>\n )}\n\n <div style={{ flex: 1 }} />\n\n {/* Exit Compare Button */}\n <button\n onClick={onExit}\n style={{\n display: 'flex', alignItems: 'center', gap: '4px',\n padding: '4px 10px', borderRadius: '4px', border: 'none',\n backgroundColor: '#dc2626', color: '#ffffff',\n cursor: 'pointer', fontSize: '12px', fontWeight: 600\n }}\n title=\"Exit Compare Mode\"\n >\n <X size={14} />\n <span>Exit Compare</span>\n </button>\n </div>\n );\n}\n","/**\n * © 2026 AngelBot Ai Pvt Ltd. All rights reserved.\n */\n\nimport React from 'react';\nimport { Layers, FileText, CheckCircle2, MinusCircle, PlusCircle, AlertCircle } from 'lucide-react';\nimport type { DiffItem, TextDiffSegment } from '../types/compare';\n\ninterface DiffSummarySidebarProps {\n isOpen: boolean;\n onClose: () => void;\n diffItems: DiffItem[];\n textDiffs: TextDiffSegment[];\n currentDiffIndex: number;\n onSelectDiff: (index: number, item?: DiffItem) => void;\n onJumpToPage: (pageIndex: number) => void;\n}\n\nexport default function DiffSummarySidebar({\n isOpen,\n diffItems,\n textDiffs,\n currentDiffIndex,\n onSelectDiff,\n onJumpToPage\n}: DiffSummarySidebarProps) {\n if (!isOpen) return null;\n\n return (\n <div style={{\n width: '320px',\n height: '100%',\n backgroundColor: '#ffffff',\n borderLeft: '1px solid #e2e8f0',\n display: 'flex',\n flexDirection: 'column',\n flexShrink: 0,\n zIndex: 80\n }}>\n {/* Header */}\n <div style={{\n padding: '12px 16px',\n borderBottom: '1px solid #e2e8f0',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n backgroundColor: '#f8fafc'\n }}>\n <div style={{ display: 'flex', alignItems: 'center', gap: '8px', fontWeight: 600, fontSize: '14px', color: '#0f172a' }}>\n <Layers size={18} color=\"#0284c7\" />\n <span>Compare Summary</span>\n </div>\n <span style={{\n fontSize: '11px', padding: '2px 8px', borderRadius: '12px',\n backgroundColor: '#0284c7', color: '#ffffff', fontWeight: 600\n }}>\n {diffItems.length} Differences\n </span>\n </div>\n\n {/* List Content */}\n <div style={{ flex: 1, overflowY: 'auto', padding: '12px' }}>\n {diffItems.length > 0 && (\n <div>\n <div style={{ fontSize: '12px', fontWeight: 600, color: '#64748b', marginBottom: '8px', display: 'flex', alignItems: 'center', gap: '4px' }}>\n <Layers size={14} />\n <span>Differences on Page ({diffItems.length})</span>\n </div>\n\n {diffItems.map((item, idx) => {\n const isSelected = idx === currentDiffIndex;\n const isDel = item.type === 'deletion';\n const isAdd = item.type === 'addition';\n\n let badgeColor = isDel ? '#e11d48' : isAdd ? '#10b981' : '#f59e0b';\n let badgeBg = isDel ? '#ffe4e6' : isAdd ? '#dcfce7' : '#fef3c7';\n let badgeLabel = isDel ? 'Removed' : isAdd ? 'Added' : 'Changed';\n\n return (\n <div\n key={item.id}\n onClick={() => {\n onSelectDiff(idx, item);\n if (item.pageIndex) onJumpToPage(item.pageIndex);\n }}\n style={{\n padding: '10px 12px',\n borderRadius: '6px',\n backgroundColor: isSelected ? '#f0f9ff' : '#ffffff',\n border: isSelected ? '2px solid #0284c7' : '1px solid #e2e8f0',\n borderLeft: isSelected ? '4px solid #0284c7' : `3px solid ${badgeColor}`,\n marginBottom: '8px',\n cursor: 'pointer',\n fontSize: '12px',\n boxShadow: isSelected ? '0 2px 8px rgba(2, 132, 199, 0.18)' : '0 1px 3px rgba(0,0,0,0.03)',\n transition: 'all 0.15s ease'\n }}\n >\n <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between', marginBottom: '4px' }}>\n <div style={{ display: 'flex', alignItems: 'center', gap: '6px' }}>\n {isDel && <MinusCircle size={13} color=\"#e11d48\" />}\n {isAdd && <PlusCircle size={13} color=\"#10b981\" />}\n {!isDel && !isAdd && <AlertCircle size={13} color=\"#f59e0b\" />}\n <span style={{\n fontSize: '10px',\n fontWeight: 700,\n textTransform: 'uppercase',\n padding: '1px 6px',\n borderRadius: '4px',\n backgroundColor: badgeBg,\n color: badgeColor\n }}>\n {badgeLabel}\n </span>\n </div>\n <span style={{ fontSize: '11px', color: '#64748b', fontWeight: 600 }}>\n Page {item.pageIndex}\n </span>\n </div>\n <div style={{\n fontSize: '12px',\n color: isSelected ? '#0369a1' : '#334155',\n fontWeight: isSelected ? 600 : 400,\n lineHeight: '1.4',\n wordBreak: 'break-word'\n }}>\n {item.description}\n </div>\n </div>\n );\n })}\n </div>\n )}\n\n {textDiffs.length > 0 && diffItems.length === 0 && (\n <div style={{ marginBottom: '16px' }}>\n <div style={{ fontSize: '12px', fontWeight: 600, color: '#64748b', marginBottom: '8px', display: 'flex', alignItems: 'center', gap: '4px' }}>\n <FileText size={14} />\n <span>Text Differences</span>\n </div>\n\n {textDiffs.filter(t => t.type !== 'equal').map((seg, i) => (\n <div\n key={`text-diff-${i}`}\n onClick={() => onJumpToPage(seg.pageIndex)}\n style={{\n padding: '8px 12px',\n borderRadius: '6px',\n backgroundColor: seg.type === 'add' ? '#f0fdf4' : '#fef2f2',\n border: `1px solid ${seg.type === 'add' ? '#bbf7d0' : '#fecaca'}`,\n marginBottom: '8px',\n cursor: 'pointer',\n fontSize: '12px',\n lineHeight: '1.4'\n }}\n >\n <div style={{ display: 'flex', justifyContent: 'space-between', marginBottom: '4px', fontSize: '10px', color: '#64748b', fontWeight: 600 }}>\n <span>Page {seg.pageIndex}</span>\n <span style={{ color: seg.type === 'add' ? '#16a34a' : '#dc2626', textTransform: 'uppercase' }}>\n {seg.type === 'add' ? '+ Addition' : '- Deletion'}\n </span>\n </div>\n <div style={{\n color: seg.type === 'add' ? '#15803d' : '#b91c1c',\n textDecoration: seg.type === 'delete' ? 'line-through' : 'none',\n fontFamily: 'monospace',\n wordBreak: 'break-word'\n }}>\n {seg.text.length > 120 ? `${seg.text.substring(0, 120)}...` : seg.text}\n </div>\n </div>\n ))}\n </div>\n )}\n\n {diffItems.length === 0 && textDiffs.filter(t => t.type !== 'equal').length === 0 && (\n <div style={{ padding: '32px 16px', textAlign: 'center', color: '#64748b' }}>\n <CheckCircle2 size={32} color=\"#16a34a\" style={{ margin: '0 auto 8px auto' }} />\n <div style={{ fontWeight: 600, fontSize: '14px', color: '#0f172a' }}>Documents Match</div>\n <div style={{ fontSize: '12px', marginTop: '4px' }}>No visual or structural differences detected between the two PDF documents.</div>\n </div>\n )}\n </div>\n </div>\n );\n}\n\n","/**\n * © 2026 AngelBot Ai Pvt Ltd. All rights reserved.\n */\n\nimport React, { useRef, useState, useEffect } from 'react';\nimport { GripVertical } from 'lucide-react';\n\ninterface CompareCurtainSliderProps {\n positionPercent: number; // 0 to 100\n onChangePosition: (pos: number) => void;\n containerRef: React.RefObject<HTMLDivElement | null>;\n}\n\nexport default function CompareCurtainSlider({\n positionPercent,\n onChangePosition,\n containerRef\n}: CompareCurtainSliderProps) {\n const [isDragging, setIsDragging] = useState(false);\n const sliderRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n const handleMouseMove = (e: MouseEvent) => {\n if (!isDragging || !containerRef.current) return;\n const rect = containerRef.current.getBoundingClientRect();\n const relativeX = e.clientX - rect.left;\n const newPercent = Math.max(0, Math.min(100, (relativeX / rect.width) * 100));\n onChangePosition(newPercent);\n };\n\n const handleMouseUp = () => {\n if (isDragging) {\n setIsDragging(false);\n }\n };\n\n if (isDragging) {\n window.addEventListener('mousemove', handleMouseMove);\n window.addEventListener('mouseup', handleMouseUp);\n }\n\n return () => {\n window.removeEventListener('mousemove', handleMouseMove);\n window.removeEventListener('mouseup', handleMouseUp);\n };\n }, [isDragging, containerRef, onChangePosition]);\n\n return (\n <div\n ref={sliderRef}\n style={{\n position: 'absolute',\n top: 0,\n bottom: 0,\n left: `${positionPercent}%`,\n width: '4px',\n backgroundColor: '#0284c7',\n boxShadow: '0 0 8px rgba(2, 132, 199, 0.8)',\n zIndex: 90,\n cursor: 'ew-resize',\n transform: 'translateX(-50%)'\n }}\n onMouseDown={(e) => {\n e.preventDefault();\n setIsDragging(true);\n }}\n >\n {/* Center Handle Badge */}\n <div style={{\n position: 'absolute',\n top: '50%',\n left: '50%',\n transform: 'translate(-50%, -50%)',\n width: '28px',\n height: '40px',\n backgroundColor: '#0284c7',\n color: '#ffffff',\n borderRadius: '6px',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n boxShadow: '0 2px 8px rgba(0,0,0,0.3)',\n cursor: 'ew-resize'\n }}>\n <GripVertical size={16} />\n </div>\n </div>\n );\n}\n","/**\n * © 2026 AngelBot Ai Pvt Ltd. All rights reserved.\n */\n\nimport type * as pdfjsLib from 'pdfjs-dist';\nimport type { TextDiffSegment, DiffItem, DiffBoundingBox } from '../types/compare';\n\nexport interface PageDiffResult {\n diffsA: DiffBoundingBox[];\n diffsB: DiffBoundingBox[];\n summary: DiffItem[];\n}\n\nexport interface WordToken {\n text: string;\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\n/**\n * Extracts individual words with precise unscaled viewport bounding boxes from a PDF.js page.\n */\nexport async function extractWordsFromPage(page: pdfjsLib.PDFPageProxy): Promise<WordToken[]> {\n const vp = page.getViewport({ scale: 1, rotation: page.rotate });\n const textContent = await page.getTextContent();\n const wordTokens: WordToken[] = [];\n\n for (const item of textContent.items as any[]) {\n if (!item.str || typeof item.str !== 'string') continue;\n const str = item.str;\n if (str.trim().length === 0) continue;\n\n const tx = item.transform[4];\n const ty = item.transform[5];\n const itemWidth = item.width || 0;\n const fontSize = Math.sqrt((item.transform[0] || 0) ** 2 + (item.transform[1] || 0) ** 2) || 12;\n const itemHeight = item.height || fontSize;\n\n const [vx1, vy1] = vp.convertToViewportPoint(tx, ty + itemHeight);\n const [vx2, vy2] = vp.convertToViewportPoint(tx + itemWidth, ty);\n\n const itemX = Math.min(vx1, vx2);\n const itemY = Math.min(vy1, vy2);\n const itemW = Math.max(Math.abs(vx2 - vx1), 4);\n const itemH = Math.max(Math.abs(vy2 - vy1), 8);\n\n const parts = str.split(/(\\s+)/);\n let offset = 0;\n const totalChars = str.length || 1;\n\n for (const p of parts) {\n const charRatio = p.length / totalChars;\n const wWidth = itemW * charRatio;\n const wX = itemX + (offset / totalChars) * itemW;\n offset += p.length;\n\n if (p.trim().length > 0) {\n wordTokens.push({\n text: p.trim(),\n x: wX,\n y: itemY,\n width: Math.max(wWidth, 6),\n height: itemH\n });\n }\n }\n }\n\n return wordTokens;\n}\n\n/**\n * Computes exact text difference bounding boxes on a page for both Document A and Document B.\n */\nexport async function computePageDiffBoxes(\n pdfDocA: pdfjsLib.PDFDocumentProxy,\n pdfDocB: pdfjsLib.PDFDocumentProxy,\n pageIndex: number\n): Promise<PageDiffResult> {\n const [pageA, pageB] = await Promise.all([\n pdfDocA.getPage(pageIndex),\n pdfDocB.getPage(Math.min(pageIndex, pdfDocB.numPages))\n ]);\n\n const [wordsA, wordsB] = await Promise.all([\n extractWordsFromPage(pageA),\n extractWordsFromPage(pageB)\n ]);\n\n const textArrA = wordsA.map(w => w.text);\n const textArrB = wordsB.map(w => w.text);\n\n // Myers diff on word tokens\n const n = textArrA.length;\n const m = textArrB.length;\n const max = n + m;\n const v = new Int32Array(2 * max + 1);\n v[1] = 0;\n const trace: Int32Array[] = [];\n\n for (let d = 0; d <= max; d++) {\n trace.push(v.slice());\n for (let k = -d; k <= d; k += 2) {\n let x: number;\n if (k === -d || (k !== d && v[k - 1 + max] < v[k + 1 + max])) {\n x = v[k + 1 + max];\n } else {\n x = v[k - 1 + max] + 1;\n }\n let y = x - k;\n while (x < n && y < m && textArrA[x] === textArrB[y]) {\n x++;\n y++;\n }\n v[k + max] = x;\n if (x >= n && y >= m) {\n break;\n }\n }\n if (v[n - m + max] >= n && (v[n - m + max] - (n - m)) >= m) break;\n }\n\n // Backtrack\n let x = n;\n let y = m;\n const delIndicesA: number[] = [];\n const addIndicesB: number[] = [];\n\n for (let d = trace.length - 1; d >= 0; d--) {\n const vArr = trace[d];\n const k = x - y;\n let prevK: number;\n if (k === -d || (k !== d && vArr[k - 1 + max] < vArr[k + 1 + max])) {\n prevK = k + 1;\n } else {\n prevK = k - 1;\n }\n const prevX = vArr[prevK + max];\n const prevY = prevX - prevK;\n\n while (x > prevX && y > prevY) {\n x--;\n y--;\n }\n\n if (d > 0) {\n if (x === prevX) {\n addIndicesB.push(y - 1);\n y--;\n } else if (y === prevY) {\n delIndicesA.push(x - 1);\n x--;\n }\n }\n }\n\n delIndicesA.reverse();\n addIndicesB.reverse();\n\n const diffsA = groupWordsIntoBoxes(delIndicesA.map(i => wordsA[i]), pageIndex, 'deletion');\n const diffsB = groupWordsIntoBoxes(addIndicesB.map(i => wordsB[i]), pageIndex, 'addition');\n\n const summary: DiffItem[] = [];\n for (const d of diffsA) {\n summary.push({\n id: d.id,\n pageIndex,\n type: 'deletion',\n description: `Removed \"${d.text.length > 40 ? d.text.slice(0, 40) + '...' : d.text}\"`,\n x: d.x,\n y: d.y,\n width: d.width,\n height: d.height\n });\n }\n for (const a of diffsB) {\n summary.push({\n id: a.id,\n pageIndex,\n type: 'addition',\n description: `Added \"${a.text.length > 40 ? a.text.slice(0, 40) + '...' : a.text}\"`,\n x: a.x,\n y: a.y,\n width: a.width,\n height: a.height\n });\n }\n\n return { diffsA, diffsB, summary };\n}\n\nfunction groupWordsIntoBoxes(words: WordToken[], pageIndex: number, type: 'addition' | 'deletion' | 'modification'): DiffBoundingBox[] {\n if (words.length === 0) return [];\n const boxes: DiffBoundingBox[] = [];\n\n let currentWords: WordToken[] = [words[0]];\n\n for (let i = 1; i < words.length; i++) {\n const prev = currentWords[currentWords.length - 1];\n const curr = words[i];\n\n const sameLine = Math.abs(curr.y - prev.y) < Math.max(prev.height, curr.height) * 0.6;\n const nearby = curr.x - (prev.x + prev.width) < 30;\n\n if (sameLine && nearby) {\n currentWords.push(curr);\n } else {\n boxes.push(createBoxFromTokens(currentWords, pageIndex, type, boxes.length + 1));\n currentWords = [curr];\n }\n }\n\n if (currentWords.length > 0) {\n boxes.push(createBoxFromTokens(currentWords, pageIndex, type, boxes.length + 1));\n }\n\n return boxes;\n}\n\nfunction createBoxFromTokens(tokens: WordToken[], pageIndex: number, type: 'addition' | 'deletion' | 'modification', seq: number): DiffBoundingBox {\n const minX = Math.min(...tokens.map(t => t.x));\n const minY = Math.min(...tokens.map(t => t.y));\n const maxX = Math.max(...tokens.map(t => t.x + t.width));\n const maxY = Math.max(...tokens.map(t => t.y + t.height));\n const text = tokens.map(t => t.text).join(' ');\n\n return {\n id: `diff-box-${pageIndex}-${type}-${seq}-${Math.round(minX)}-${Math.round(minY)}`,\n pageIndex,\n type,\n text,\n x: Math.max(0, minX - 2),\n y: Math.max(0, minY - 1),\n width: maxX - minX + 4,\n height: maxY - minY + 2\n };\n}\n\n/**\n * Lightweight client-side Myers Diff algorithm for raw text comparison.\n */\nexport function computeTextDiff(textA: string, textB: string, pageIndex: number): TextDiffSegment[] {\n const wordsA = textA.split(/(\\s+)/);\n const wordsB = textB.split(/(\\s+)/);\n\n const n = wordsA.length;\n const m = wordsB.length;\n const max = n + m;\n const v = new Int32Array(2 * max + 1);\n v[1] = 0;\n\n const trace: Int32Array[] = [];\n\n for (let d = 0; d <= max; d++) {\n trace.push(v.slice());\n for (let k = -d; k <= d; k += 2) {\n let x: number;\n if (k === -d || (k !== d && v[k - 1 + max] < v[k + 1 + max])) {\n x = v[k + 1 + max];\n } else {\n x = v[k - 1 + max] + 1;\n }\n let y = x - k;\n while (x < n && y < m && wordsA[x] === wordsB[y]) {\n x++;\n y++;\n }\n v[k + max] = x;\n if (x >= n && y >= m) {\n return buildDiffResult(trace, wordsA, wordsB, pageIndex);\n }\n }\n }\n\n return [\n { type: 'delete', text: textA, pageIndex },\n { type: 'add', text: textB, pageIndex }\n ];\n}\n\nfunction buildDiffResult(trace: Int32Array[], wordsA: string[], wordsB: string[], pageIndex: number): TextDiffSegment[] {\n let x = wordsA.length;\n let y = wordsB.length;\n const max = wordsA.length + wordsB.length;\n const rawResult: { type: 'equal' | 'add' | 'delete'; text: string }[] = [];\n\n for (let d = trace.length - 1; d >= 0; d--) {\n const v = trace[d];\n const k = x - y;\n\n let prevK: number;\n if (k === -d || (k !== d && v[k - 1 + max] < v[k + 1 + max])) {\n prevK = k + 1;\n } else {\n prevK = k - 1;\n }\n\n const prevX = v[prevK + max];\n const prevY = prevX - prevK;\n\n while (x > prevX && y > prevY) {\n rawResult.push({ type: 'equal', text: wordsA[x - 1] });\n x--;\n y--;\n }\n\n if (d > 0) {\n if (x === prevX) {\n rawResult.push({ type: 'add', text: wordsB[y - 1] });\n y--;\n } else if (y === prevY) {\n rawResult.push({ type: 'delete', text: wordsA[x - 1] });\n x--;\n }\n }\n }\n\n rawResult.reverse();\n\n const consolidated: TextDiffSegment[] = [];\n for (const item of rawResult) {\n if (consolidated.length > 0 && consolidated[consolidated.length - 1].type === item.type) {\n consolidated[consolidated.length - 1].text += item.text;\n } else {\n consolidated.push({ ...item, pageIndex });\n }\n }\n\n return consolidated;\n}\n\n/**\n * Colorizes a rendered page canvas with a custom hex tint.\n */\nexport function tintCanvas(ctx: CanvasRenderingContext2D, width: number, height: number, colorHex: string, opacity: number = 0.75) {\n ctx.save();\n ctx.globalCompositeOperation = 'source-atop';\n ctx.fillStyle = colorHex;\n ctx.globalAlpha = opacity;\n ctx.fillRect(0, 0, width, height);\n ctx.restore();\n}\n\n/**\n * Computes pixel-level difference bounding boxes between two rendered page canvases.\n */\nexport function computeCanvasPixelDiff(\n canvasA: HTMLCanvasElement,\n canvasB: HTMLCanvasElement,\n pageIndex: number,\n scale: number\n): DiffItem[] {\n const width = Math.min(canvasA.width, canvasB.width);\n const height = Math.min(canvasA.height, canvasB.height);\n if (width === 0 || height === 0) return [];\n\n const ctxA = canvasA.getContext('2d');\n const ctxB = canvasB.getContext('2d');\n if (!ctxA || !ctxB) return [];\n\n const imgDataA = ctxA.getImageData(0, 0, width, height);\n const imgDataB = ctxB.getImageData(0, 0, width, height);\n const dataA = imgDataA.data;\n const dataB = imgDataB.data;\n\n const diffItems: DiffItem[] = [];\n const GRID_SIZE = 32;\n const threshold = 30;\n\n for (let gy = 0; gy < height; gy += GRID_SIZE) {\n for (let gx = 0; gx < width; gx += GRID_SIZE) {\n let diffPixels = 0;\n const cellW = Math.min(GRID_SIZE, width - gx);\n const cellH = Math.min(GRID_SIZE, height - gy);\n\n for (let y = gy; y < gy + cellH; y += 4) {\n for (let x = gx; x < gx + cellW; x += 4) {\n const idx = (y * width + x) * 4;\n const dr = Math.abs(dataA[idx] - dataB[idx]);\n const dg = Math.abs(dataA[idx + 1] - dataB[idx + 1]);\n const db = Math.abs(dataA[idx + 2] - dataB[idx + 2]);\n\n if (dr + dg + db > threshold) {\n diffPixels++;\n }\n }\n }\n\n if (diffPixels > 3) {\n diffItems.push({\n id: `diff-${pageIndex}-${gx}-${gy}`,\n pageIndex,\n type: 'modification',\n description: `Visual difference detected at Page ${pageIndex} (${Math.round(gx / scale)}px, ${Math.round(gy / scale)}px)`,\n x: gx / scale,\n y: gy / scale,\n width: cellW / scale,\n height: cellH / scale\n });\n }\n }\n }\n\n return diffItems;\n}\n\n","/**\n * © 2026 AngelBot Ai Pvt Ltd. All rights reserved.\n */\nimport React, { useEffect, useRef, useState, useCallback, useMemo, useSyncExternalStore } 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, Undo2, Redo2, Underline, Strikethrough } 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 { newAnnotationId } from '../annotations/ids';\nimport type { AnnotationManager } from '../annotations/AnnotationManager';\nimport type { Redaction, WatermarkOptions, SDKPermissions, PdfAssetPaths, TransientHighlight, ToolMode } from '../core/types';\nimport TextSelectionTooltip from './TextSelectionTooltip';\nimport { findRegexRedactions } from '../utils/findRegexRedactions';\nimport { convertToUnrotated, convertToRotated, normalizeRotation } from '../utils/rotationUtils';\nimport { clampScale, calculateScrollCompensation } from '../utils/zoomUtils';\nimport { estimatePageDimensions, computeRowLayout, DEFAULT_FALLBACK_DIMS } from '../utils/layoutUtils';\nimport { useViewerBus, useBusEvent } from '../hooks/useViewerBus';\nimport { assertWorkerConfigured, configurePdfAssets, getDocumentParams } from '../core/pdfAssets';\nimport SideBySideViewer from './SideBySideViewer';\nimport CompareToolbar from './CompareToolbar';\nimport DiffSummarySidebar from './DiffSummarySidebar';\nimport CompareCurtainSlider from './CompareCurtainSlider';\nimport DiffHighlightOverlay from './DiffHighlightOverlay';\nimport type { CompareState, TextDiffSegment, DiffItem, DiffBoundingBox } from '../types/compare';\nimport { computeTextDiff, computePageDiffBoxes } from '../utils/pdfDiffEngine';\n\nexport interface DocumentLoadErrorInfo {\n url: string;\n passwordRequired: boolean;\n}\n\ninterface DocumentViewerProps {\n leftSidebarOpen: boolean;\n rightSidebarOpen: boolean;\n activeTab: string;\n /** Canonical annotation list, history, permissions and XFDF (owned by the viewer instance). */\n annotationManager: AnnotationManager;\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 /** Fires whenever any page canvas has finished rendering. */\n onPageRendered?: (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 page?: number;\n transientHighlights?: TransientHighlight[];\n permissions?: SDKPermissions;\n /** Whether to hide annotations and transient highlights until the page canvas has finished rendering. Default: true. */\n hideAnnotationsUntilPageRendered?: boolean;\n enableTextSelection?: boolean;\n defaultTool?: 'select' | 'pan';\n showSelectionTooltip?: boolean;\n}\n\nexport default function DocumentViewer({\n leftSidebarOpen, rightSidebarOpen, activeTab, annotationManager, initialDoc, loadNonce = 0, withCredentials = false, assets, sidebars = true,\n redactions, regexRedactions, scale, setScale, sidebarTab, setSidebarTab, onAnnotationsChange, onRedactionsChange,\n onDocumentLoaded, onLoadError, onFirstPageRendered, onPageRendered, onPageChange,\n pageTransition, pageLayout, rotation, setRotation, watermark, watermarkText, enableAnnotations: _enableAnnotations, initialPage, page, transientHighlights, permissions,\n hideAnnotationsUntilPageRendered = true,\n enableTextSelection = true,\n defaultTool = 'select',\n showSelectionTooltip = true\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 // Compare Mode State\n const [pdfDocB, setPdfDocB] = useState<pdfjsLib.PDFDocumentProxy | null>(null);\n const [compareState, setCompareState] = useState<CompareState>({\n isActive: false,\n mode: 'overlay',\n colorA: '#e11d48',\n colorB: '#2563eb',\n opacityA: 0.8,\n opacityB: 0.8,\n blendMode: 'difference',\n showCurtain: false,\n curtainPosition: 50,\n diffItems: [],\n currentDiffIndex: 0\n });\n const [textDiffs, setTextDiffs] = useState<TextDiffSegment[]>([]);\n const [isDiffSidebarOpen, setIsDiffSidebarOpen] = useState(false);\n\n // Latest-callback refs: parents may pass inline functions without re-triggering effects.\n const callbacksRef = useRef({ onRedactionsChange, onDocumentLoaded, onLoadError, onFirstPageRendered, onPageRendered, onPageChange });\n callbacksRef.current = { onRedactionsChange, onDocumentLoaded, onLoadError, onFirstPageRendered, onPageRendered, onPageChange };\n const assetsRef = useRef(assets);\n assetsRef.current = assets;\n\n const loadDocA = useCallback(async (docSource: string | ArrayBuffer | Uint8Array) => {\n try {\n assertWorkerConfigured();\n if (assetsRef.current) configurePdfAssets(assetsRef.current);\n const params: any = typeof docSource === 'string' ? { url: docSource } : { data: docSource };\n if (withCredentials) params.withCredentials = true;\n Object.assign(params, getDocumentParams());\n const loadingTask = pdfjsLib.getDocument(params);\n const loadedDocA = await loadingTask.promise;\n setPdfDoc(loadedDocA);\n callbacksRef.current.onDocumentLoaded?.(loadedDocA, typeof docSource === 'string' ? docSource : 'documentA.pdf');\n } catch (err: any) {\n console.error('Failed to load comparison document A:', err);\n }\n }, [withCredentials]);\n\n const loadCompareDoc = useCallback(async (docSource: string | ArrayBuffer | Uint8Array) => {\n try {\n assertWorkerConfigured();\n if (assetsRef.current) configurePdfAssets(assetsRef.current);\n const params: any = typeof docSource === 'string' ? { url: docSource } : { data: docSource };\n if (withCredentials) params.withCredentials = true;\n Object.assign(params, getDocumentParams());\n const loadingTask = pdfjsLib.getDocument(params);\n const loadedDocB = await loadingTask.promise;\n setPdfDocB(loadedDocB);\n setCompareState(prev => ({\n ...prev,\n isActive: true,\n diffItems: [\n { id: 'diff-1', pageIndex: 1, type: 'modification', description: 'Page 1 Differences detected' }\n ]\n }));\n setIsDiffSidebarOpen(true);\n } catch (err: any) {\n console.error('Failed to load comparison document B:', err);\n }\n }, [withCredentials]);\n\n useEffect(() => {\n if (compareState.isActive && pdfDoc && pdfDocB) {\n let cancelled = false;\n const computeAllDiffs = async () => {\n try {\n const totalPages = Math.min(pdfDoc.numPages, pdfDocB.numPages);\n let allSummary: DiffItem[] = [];\n const mapA: Record<number, DiffBoundingBox[]> = {};\n const mapB: Record<number, DiffBoundingBox[]> = {};\n\n for (let p = 1; p <= totalPages; p++) {\n const { diffsA, diffsB, summary } = await computePageDiffBoxes(pdfDoc, pdfDocB, p);\n if (cancelled) return;\n mapA[p] = diffsA;\n mapB[p] = diffsB;\n allSummary = allSummary.concat(summary);\n }\n\n if (!cancelled) {\n setCompareState(prev => ({\n ...prev,\n diffItems: allSummary,\n pageDiffsA: mapA,\n pageDiffsB: mapB\n }));\n }\n\n const pA = await pdfDoc.getPage(pageNum);\n const pB = await pdfDocB.getPage(Math.min(pageNum, pdfDocB.numPages));\n const textContentA = await pA.getTextContent();\n const textContentB = await pB.getTextContent();\n\n const strA = textContentA.items.map((i: any) => i.str).join(' ');\n const strB = textContentB.items.map((i: any) => i.str).join(' ');\n\n const diffs = computeTextDiff(strA, strB, pageNum);\n if (!cancelled) setTextDiffs(diffs);\n } catch (e) {\n console.error('Error computing document diffs:', e);\n }\n };\n computeAllDiffs();\n return () => { cancelled = true; };\n }\n }, [compareState.isActive, pdfDoc, pdfDocB, pageNum]);\n\n // Public Event Listeners for Compare APIs\n useEffect(() => {\n const handleStartCompare = (data: any) => {\n const { docA, docB, options } = data || {};\n if (options) {\n setCompareState(prev => ({\n ...prev,\n mode: options.mode || prev.mode,\n colorA: options.colorA || prev.colorA,\n colorB: options.colorB || prev.colorB,\n opacityA: options.opacityA || prev.opacityA,\n opacityB: options.opacityB || prev.opacityB,\n blendMode: options.blendMode || prev.blendMode\n }));\n }\n if (docA) {\n loadDocA(docA);\n }\n if (docB) {\n loadCompareDoc(docB);\n }\n };\n\n const handleStopCompare = () => {\n setCompareState(prev => ({ ...prev, isActive: false }));\n setPdfDocB(null);\n setTextDiffs([]);\n };\n\n const handleSetCompareMode = (mode: string) => {\n if (mode) setCompareState(prev => ({ ...prev, mode: mode as any }));\n };\n\n const handleSetCompareColors = (colorA: string, colorB: string) => {\n if (colorA && colorB) setCompareState(prev => ({ ...prev, colorA, colorB }));\n };\n\n const offStart = bus.on('action-start-compare', handleStartCompare);\n const offStop = bus.on('action-stop-compare', handleStopCompare);\n const offMode = bus.on<{ mode: string }>('action-set-compare-mode', (d) => d && handleSetCompareMode(d.mode));\n const offColors = bus.on<{ colorA: string; colorB: string }>('action-set-compare-colors', (d) => d && handleSetCompareColors(d.colorA, d.colorB));\n\n const windowStart = (e: any) => handleStartCompare(e.detail);\n const windowStop = () => handleStopCompare();\n const windowMode = (e: any) => handleSetCompareMode(e.detail?.mode);\n const windowColors = (e: any) => handleSetCompareColors(e.detail?.colorA, e.detail?.colorB);\n\n window.addEventListener('action-start-compare', windowStart);\n window.addEventListener('action-stop-compare', windowStop);\n window.addEventListener('action-set-compare-mode', windowMode);\n window.addEventListener('action-set-compare-colors', windowColors);\n\n return () => {\n offStart(); offStop(); offMode(); offColors();\n window.removeEventListener('action-start-compare', windowStart);\n window.removeEventListener('action-stop-compare', windowStop);\n window.removeEventListener('action-set-compare-mode', windowMode);\n window.removeEventListener('action-set-compare-colors', windowColors);\n };\n }, [bus, loadDocA, loadCompareDoc]);\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 // Per-page base dimensions (scale 1, UI rotation composed with the page's /Rotate). Index =\n // pageNumber - 1. Populated progressively after load so mixed-size documents lay out correctly.\n const [pageDims, setPageDims] = useState<Array<{ width: number; height: number }>>([]);\n const fallbackDims = pageDims[0] ?? DEFAULT_FALLBACK_DIMS;\n const dimsFor = useCallback(\n (p: number) => pageDims[p - 1] ?? fallbackDims,\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [pageDims, fallbackDims.width, fallbackDims.height]\n );\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 GAP = 16;\n\n // Rows of pages (1 or 2 per row depending on layout)\n const rows = 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 // Row geometry in scaled pixels: each row is as tall as its tallest page (+ gap).\n const rowLayout = useMemo(() => {\n return computeRowLayout(rows, dimsFor, scale, GAP);\n }, [rows, scale, dimsFor]);\n\n const rowsRef = useRef(rows);\n rowsRef.current = rows;\n const scaleRef = useRef(scale);\n scaleRef.current = scale;\n const rowLayoutRef = useRef(rowLayout);\n rowLayoutRef.current = rowLayout;\n const pageTransitionRef = useRef(pageTransition);\n pageTransitionRef.current = pageTransition;\n const visibleRowRef = useRef(0);\n\n const rowIndexOfPage = useCallback((p: number) => rows.findIndex(row => row.includes(p)), [rows]);\n\n const rowIndexAtOffset = useCallback((y: number) => {\n const tops = rowLayout.tops;\n if (tops.length === 0) return 0;\n let lo = 0, hi = tops.length - 1;\n while (lo < hi) {\n const mid = (lo + hi + 1) >> 1;\n if (tops[mid] <= y) lo = mid; else hi = mid - 1;\n }\n return lo;\n }, [rowLayout]);\n\n const scrollToPage = useCallback((p: number, options: { smooth?: boolean } = {}) => {\n const clampedPage = pdfDoc ? Math.max(1, Math.min(p, pdfDoc.numPages)) : Math.max(1, p);\n setPageNum(clampedPage);\n const i = rowIndexOfPage(clampedPage);\n if (i >= 0 && containerRef.current) {\n if (options.smooth) {\n containerRef.current.scrollTo({ top: rowLayout.tops[i], behavior: 'smooth' });\n } else {\n containerRef.current.scrollTop = rowLayout.tops[i];\n }\n }\n }, [pdfDoc, rowIndexOfPage, rowLayout]);\n\n useEffect(() => {\n const handleGoToPage = (detail?: { page: number; smooth?: boolean }) => {\n if (detail?.page) {\n scrollToPage(detail.page, { smooth: detail.smooth ?? true });\n }\n };\n const offGoToPage = bus.on<{ page: number; smooth?: boolean }>('action-go-to-page', (d) => handleGoToPage(d));\n const windowGoToPage = (e: any) => handleGoToPage(e.detail);\n window.addEventListener('action-go-to-page', windowGoToPage);\n\n return () => {\n offGoToPage();\n window.removeEventListener('action-go-to-page', windowGoToPage);\n };\n }, [bus, scrollToPage]);\n\n const handleSearchResultClick = (result: SearchResult) => {\n setPageNum(result.pageIndex);\n setActiveSearchResult(result);\n scrollToPage(result.pageIndex);\n };\n\n const handleSelectDiff = useCallback((idx: number, item?: DiffItem) => {\n const diffItem = item || compareState.diffItems[idx];\n setCompareState(prev => ({ ...prev, currentDiffIndex: idx }));\n\n if (!diffItem) return;\n\n if (diffItem.pageIndex && diffItem.pageIndex !== pageNum) {\n setPageNum(diffItem.pageIndex);\n }\n\n const targetY = (diffItem.y ?? 0) * scale;\n const targetX = (diffItem.x ?? 0) * scale;\n\n if (containerRef.current) {\n const p = diffItem.pageIndex || pageNum;\n const rIdx = rowIndexOfPage(p);\n const rowTop = pageTransition === 'continuous' && rIdx >= 0 ? (rowLayout.tops[rIdx] ?? 0) : 0;\n const viewHeight = containerRef.current.clientHeight || 600;\n const viewWidth = containerRef.current.clientWidth || 800;\n\n const scrollToY = Math.max(0, rowTop + targetY - viewHeight / 3);\n const scrollToX = Math.max(0, targetX - viewWidth / 4);\n\n containerRef.current.scrollTo({\n top: scrollToY,\n left: scrollToX,\n behavior: 'smooth'\n });\n }\n }, [compareState.diffItems, pageNum, scale, pageTransition, rowIndexOfPage, rowLayout.tops]);\n\n // The annotation list lives in the AnnotationManager (undo/redo, permissions, events, XFDF).\n const annotations = useSyncExternalStore(annotationManager.subscribe, annotationManager.getSnapshot, annotationManager.getSnapshot);\n const [activeTool, setActiveTool] = useState<ToolMode>(defaultTool);\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(defaultTool);\n }\n }, [activeTab, defaultTool]);\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 const clipboardAnnotationRef = useRef<Annotation | null>(null);\n\n\n useBusEvent<{ tool: ToolMode }>('action-set-tool', (d) => setActiveTool(d?.tool ?? null));\n\n useEffect(() => {\n const handleSelection = () => {\n const text = typeof window !== 'undefined' ? window.getSelection()?.toString() ?? '' : '';\n bus.emit('action-text-selected', { text });\n };\n document.addEventListener('selectionchange', handleSelection);\n return () => document.removeEventListener('selectionchange', handleSelection);\n }, [bus]);\n\n const zoomFocusRef = useRef<{vx: number | null, vy: number | null}>({ vx: null, vy: null });\n const prevScaleRef = useRef(scale);\n const isProgrammaticScaleRef = useRef(false);\n const initialFitDoneRef = useRef(false);\n\n useEffect(() => {\n initialFitDoneRef.current = false;\n }, [pdfDoc]);\n\n // Unified scroll offset maintenance for user-driven scale changes (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) return;\n\n const isProgrammatic = isProgrammaticScaleRef.current || !initialFitDoneRef.current || initialScrollDoneRef.current !== pdfDoc;\n initialFitDoneRef.current = true;\n isProgrammaticScaleRef.current = false;\n\n const newPos = calculateScrollCompensation({\n prevScale: s,\n newScale,\n containerWidth: container.clientWidth,\n containerHeight: container.clientHeight,\n currentScrollLeft: container.scrollLeft,\n currentScrollTop: container.scrollTop,\n basePageWidth: dimsFor(pageNum).width,\n focusPoint: zoomFocusRef.current,\n isProgrammatic,\n });\n\n zoomFocusRef.current = { vx: null, vy: null };\n\n if (isProgrammatic && pageNum > 1 && pageTransition === 'continuous') {\n const rIdx = rowIndexOfPage(pageNum);\n if (rIdx >= 0) {\n container.scrollTop = rowLayout.tops[rIdx] ?? 0;\n }\n container.scrollLeft = 0;\n } else {\n container.scrollLeft = newPos.scrollLeft;\n container.scrollTop = newPos.scrollTop;\n }\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [scale]);\n\n useEffect(() => {\n const container = containerRef.current;\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 roundedScale = clampScale(s * multiplier);\n if (roundedScale !== s) {\n zoomFocusRef.current = { \n vx: clientX - rect.left, \n vy: clientY - rect.top \n };\n }\n return roundedScale;\n });\n }\n };\n\n container.addEventListener('wheel', handleWheel, { passive: false });\n return () => container.removeEventListener('wheel', handleWheel);\n }, [setScale]);\n\n // Commit a new list to the manager (diffed into add/modify/delete, permission-checked, undoable).\n const commitAnnotations = useCallback((newAnns: Annotation[]) => {\n annotationManager.commit(newAnns);\n }, [annotationManager]);\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(() => { annotationManager.undo(); }, [annotationManager]);\n const handleRedo = useCallback(() => { annotationManager.redo(); }, [annotationManager]);\n\n // Live resizing & moving state for annotations\n const [liveResizingAnn, setLiveResizingAnn] = useState<Annotation | null>(null);\n const [liveMovingAnn, setLiveMovingAnn] = useState<Annotation | null>(null);\n const resizingRef = useRef<{\n annId: string;\n handle: string;\n startX: number;\n startY: number;\n initialAnn: Annotation;\n pageIndex: number;\n } | null>(null);\n const movingRef = useRef<{\n annId: string;\n startX: number;\n startY: number;\n initialAnn: Annotation;\n pageIndex: number;\n } | null>(null);\n\n const latestResizingAnnRef = useRef<Annotation | null>(null);\n latestResizingAnnRef.current = liveResizingAnn;\n const latestMovingAnnRef = useRef<Annotation | null>(null);\n latestMovingAnnRef.current = liveMovingAnn;\n\n const handleStartResize = useCallback((id: string, handle: string, e: React.MouseEvent, pageNum: number) => {\n const ann = annotations.find(a => a.id === id);\n if (!ann || permissions?.canEditAnnotations === false || !annotationManager.canEdit(ann)) return;\n const initialAnn = {\n ...ann,\n width: ann.width && ann.width > 0 ? ann.width : 180,\n height: ann.height && ann.height > 0 ? ann.height : 40\n };\n resizingRef.current = {\n annId: id,\n handle,\n startX: e.clientX,\n startY: e.clientY,\n initialAnn,\n pageIndex: pageNum\n };\n setLiveResizingAnn(initialAnn);\n }, [annotations, annotationManager, permissions]);\n\n const handleStartMove = useCallback((id: string, e: React.MouseEvent, pageNum: number) => {\n const ann = annotations.find(a => a.id === id);\n if (!ann || permissions?.canEditAnnotations === false || !annotationManager.canEdit(ann)) return;\n movingRef.current = {\n annId: id,\n startX: e.clientX,\n startY: e.clientY,\n initialAnn: { ...ann },\n pageIndex: pageNum\n };\n setLiveMovingAnn({ ...ann });\n }, [annotations, annotationManager, permissions]);\n\n const handleAnnotationDoubleClick = useCallback((id: string, e: React.MouseEvent) => {\n e.stopPropagation();\n const ann = annotations.find(a => a.id === id);\n if (ann && (ann.type === 'text' || ann.type === 'note' || ann.type === 'callout')) {\n if (permissions?.canEditAnnotations === false || !annotationManager.canEdit(ann)) {\n setSelectedAnnotationId(id);\n return;\n }\n setActiveTextEditor({\n x: ann.x,\n y: ann.y,\n type: ann.type as any,\n annId: ann.id,\n points: ann.points,\n pageIndex: ann.pageIndex\n });\n setCurrentText(ann.text || '');\n if (ann.color) setCurrentColor(ann.color);\n setSelectedAnnotationId(id);\n }\n }, [annotations, annotationManager, permissions]);\n\n useEffect(() => {\n const handleWindowMouseMove = (e: MouseEvent) => {\n if (resizingRef.current) {\n const { handle, startX, startY, initialAnn } = resizingRef.current;\n let dx = (e.clientX - startX) / scale;\n let dy = (e.clientY - startY) / scale;\n if (rotation === 90) {\n const tmp = dx; dx = dy; dy = -tmp;\n } else if (rotation === 180) {\n dx = -dx; dy = -dy;\n } else if (rotation === 270) {\n const tmp = dx; dx = -dy; dy = tmp;\n }\n\n let newW = initialAnn.width;\n let newH = initialAnn.height;\n let newX = initialAnn.x;\n let newY = initialAnn.y;\n\n if (handle.includes('e')) {\n newW = Math.max(30, initialAnn.width + dx);\n }\n if (handle.includes('s')) {\n newH = Math.max(16, initialAnn.height + dy);\n }\n if (handle.includes('w')) {\n newW = Math.max(30, initialAnn.width - dx);\n newX = initialAnn.x + (initialAnn.width - newW);\n }\n if (handle.includes('n')) {\n newH = Math.max(16, initialAnn.height - dy);\n newY = initialAnn.y + (initialAnn.height - newH);\n }\n\n setLiveResizingAnn({\n ...initialAnn,\n x: newX,\n y: newY,\n width: newW,\n height: newH\n });\n } else if (movingRef.current) {\n const { startX, startY, initialAnn } = movingRef.current;\n let dx = (e.clientX - startX) / scale;\n let dy = (e.clientY - startY) / scale;\n if (rotation === 90) {\n const tmp = dx; dx = dy; dy = -tmp;\n } else if (rotation === 180) {\n dx = -dx; dy = -dy;\n } else if (rotation === 270) {\n const tmp = dx; dx = -dy; dy = tmp;\n }\n\n setLiveMovingAnn({\n ...initialAnn,\n x: Math.max(0, initialAnn.x + dx),\n y: Math.max(0, initialAnn.y + dy)\n });\n }\n };\n\n const handleWindowMouseUp = () => {\n if (resizingRef.current) {\n if (latestResizingAnnRef.current) {\n const finalAnn = latestResizingAnnRef.current;\n commitAnnotations(annotations.map(a => a.id === finalAnn.id ? finalAnn : a));\n }\n resizingRef.current = null;\n setLiveResizingAnn(null);\n }\n if (movingRef.current) {\n if (latestMovingAnnRef.current) {\n const finalAnn = latestMovingAnnRef.current;\n commitAnnotations(annotations.map(a => a.id === finalAnn.id ? finalAnn : a));\n }\n movingRef.current = null;\n setLiveMovingAnn(null);\n }\n };\n\n window.addEventListener('mousemove', handleWindowMouseMove);\n window.addEventListener('mouseup', handleWindowMouseUp);\n return () => {\n window.removeEventListener('mousemove', handleWindowMouseMove);\n window.removeEventListener('mouseup', handleWindowMouseUp);\n };\n }, [scale, rotation, annotations, commitAnnotations]);\n\n const handleAnnotateSelection = useCallback((type: 'highlight' | 'underline' | 'strikeout' | 'squiggly') => {\n if (permissions?.canAddAnnotations === false) return;\n if (typeof window === 'undefined') return;\n const sel = window.getSelection();\n if (!sel || sel.isCollapsed || !sel.rangeCount) return;\n const range = sel.getRangeAt(0);\n const clientRects = Array.from(range.getClientRects());\n if (clientRects.length === 0) return;\n\n let node: Node | null = range.commonAncestorContainer;\n while (node && !(node instanceof HTMLElement && node.classList.contains('pdf-page-container'))) {\n node = node.parentNode;\n }\n if (!node || !(node instanceof HTMLElement)) return;\n\n const pageNumAttr = node.getAttribute('data-page-number') || node.id.replace('pdf-page-', '');\n const targetPage = parseInt(pageNumAttr, 10);\n if (!targetPage) return;\n\n const pageRect = node.getBoundingClientRect();\n const dims = dimsFor(targetPage);\n const unW = rotation % 180 === 0 ? dims.width : dims.height;\n const unH = rotation % 180 === 0 ? dims.height : dims.width;\n\n const rects = clientRects.map(r => {\n const rawX = (r.left - pageRect.left) / scale;\n const rawY = (r.top - pageRect.top) / scale;\n const rawW = r.width / scale;\n const rawH = r.height / scale;\n const p1 = convertToUnrotated(rawX, rawY, rotation, unW, unH);\n const p2 = convertToUnrotated(rawX + rawW, rawY + rawH, rotation, unW, unH);\n return {\n x: Math.min(p1.x, p2.x),\n y: Math.min(p1.y, p2.y),\n width: Math.abs(p2.x - p1.x),\n height: Math.abs(p2.y - p1.y)\n };\n }).filter(r => r.width > 2 && r.height > 2);\n\n if (rects.length === 0) return;\n\n const minX = Math.min(...rects.map(r => r.x));\n const minY = Math.min(...rects.map(r => r.y));\n const maxX = Math.max(...rects.map(r => r.x + r.width));\n const maxY = Math.max(...rects.map(r => r.y + r.height));\n\n const color = type === 'highlight' ? '#fbc02d' : type === 'squiggly' ? '#388e3c' : currentColor || '#d32f2f';\n const opacity = type === 'highlight' ? 0.5 : 1;\n const strokeWidth = type === 'squiggly' ? 1.5 : 2;\n\n const annId = newAnnotationId();\n commitAnnotations([...annotations, {\n id: annId,\n type,\n pageIndex: targetPage,\n x: minX,\n y: minY,\n width: maxX - minX,\n height: maxY - minY,\n rects: rects.length > 1 ? rects : undefined,\n color,\n strokeWidth,\n opacity\n }]);\n\n sel.removeAllRanges();\n }, [annotations, commitAnnotations, currentColor, dimsFor, permissions, rotation, scale]);\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 if (matchShortcut(e, getCommand('SEARCH'))) {\n e.preventDefault();\n bus.emit('action-open-search');\n return;\n }\n if (matchShortcut(e, getCommand('FILE_PICKER'))) {\n e.preventDefault();\n bus.emit('action-open-file-picker');\n return;\n }\n\n // Annotation clipboard & manipulation (only when not typing in text fields)\n if (!isInput && !activeTextEditor) {\n if (matchShortcut(e, getCommand('COPY'))) {\n const selectedText = typeof window !== 'undefined' ? window.getSelection()?.toString() : '';\n if (selectedText && selectedText.length > 0) {\n bus.emit('action-text-copied', { text: selectedText });\n return;\n }\n if (selectedAnnotationId) {\n const annToCopy = annotations.find(a => a.id === selectedAnnotationId);\n if (annToCopy) {\n e.preventDefault();\n clipboardAnnotationRef.current = annToCopy;\n }\n return;\n }\n }\n if (matchShortcut(e, getCommand('PASTE')) && clipboardAnnotationRef.current) {\n e.preventDefault();\n const base = clipboardAnnotationRef.current;\n const newAnn: Annotation = {\n ...base,\n id: newAnnotationId(),\n pageIndex: pageNum,\n x: base.x + 20,\n y: base.y + 20,\n author: undefined,\n authorId: undefined,\n createdAt: undefined,\n modifiedAt: undefined,\n readOnly: undefined,\n xfdfExtras: undefined\n };\n commitAnnotations([...annotations, newAnn]);\n setSelectedAnnotationId(newAnn.id);\n return;\n }\n if (matchShortcut(e, getCommand('DELETE')) && selectedAnnotationId) {\n e.preventDefault();\n commitAnnotations(annotations.filter(a => a.id !== selectedAnnotationId));\n setSelectedAnnotationId(null);\n return;\n }\n if (e.key === 'Enter' && selectedAnnotationId && !activeTextEditor) {\n const ann = annotations.find(a => a.id === selectedAnnotationId);\n if (ann && (ann.type === 'text' || ann.type === 'note' || ann.type === 'callout')) {\n e.preventDefault();\n setActiveTextEditor({\n x: ann.x,\n y: ann.y,\n type: ann.type as any,\n annId: ann.id,\n points: ann.points,\n pageIndex: ann.pageIndex\n });\n setCurrentText(ann.text || '');\n if (ann.color) setCurrentColor(ann.color);\n return;\n }\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 useEffect(() => {\n if (searchResults.length === 0) {\n setActiveSearchResult(null);\n }\n }, [searchResults]);\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 setPageDims([]);\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 try {\n const p1 = await doc.getPage(1);\n if (!cancelled) {\n const vp1 = p1.getViewport({ scale: 1, rotation: normalizeRotation(p1.rotate + rotation) });\n setPageDims(estimatePageDimensions(doc.numPages, { width: vp1.width, height: vp1.height }));\n }\n } catch {}\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, rotation]);\n\n const handlePageRendered = useCallback((renderedPage: number) => {\n callbacksRef.current.onPageRendered?.(renderedPage);\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 the target page (page ?? initialPage) as soon as row geometry is known,\n // and handle subsequent page/initialPage prop updates when citations are clicked.\n const initialScrollDoneRef = useRef<pdfjsLib.PDFDocumentProxy | null>(null);\n const lastTargetPageRef = useRef<number | undefined>(undefined);\n useEffect(() => {\n const target = page ?? initialPage;\n if (!pdfDoc || !target) return;\n if (initialScrollDoneRef.current === pdfDoc && lastTargetPageRef.current === target) return;\n if (pageDims.length < Math.min(target, pdfDoc.numPages)) return;\n\n const isInitial = initialScrollDoneRef.current !== pdfDoc;\n initialScrollDoneRef.current = pdfDoc;\n lastTargetPageRef.current = target;\n const t = setTimeout(() => scrollToPage(target, { smooth: !isInitial }), 50);\n return () => clearTimeout(t);\n }, [pdfDoc, page, initialPage, pageDims.length, scrollToPage]);\n\n // Measure base dimensions up front and reserve estimated space for all pages to avoid layout jumps / shaking on scroll.\n useEffect(() => {\n if (!pdfDoc) return;\n let cancelled = false;\n const doc = pdfDoc;\n\n (async () => {\n // 1. Measure Page 1 up front to obtain baseline page dimensions\n let p1: pdfjsLib.PDFPageProxy;\n try {\n p1 = await doc.getPage(1);\n } catch {\n return;\n }\n if (cancelled) return;\n\n const vp1 = p1.getViewport({ scale: 1, rotation: normalizeRotation(p1.rotate + rotation) });\n const p1Dim = { width: vp1.width, height: vp1.height };\n\n // 2. Reserve estimated space up front for all pages based on Page 1\n setPageDims((prev) => {\n if (\n prev.length === doc.numPages &&\n Math.abs((prev[0]?.width ?? 0) - p1Dim.width) <= 0.5 &&\n Math.abs((prev[0]?.height ?? 0) - p1Dim.height) <= 0.5\n ) {\n return prev;\n }\n return estimatePageDimensions(doc.numPages, p1Dim);\n });\n\n if (doc.numPages <= 1) return;\n\n // 3. Measure remaining page dimensions up front in parallel batches\n const allDims = estimatePageDimensions(doc.numPages, p1Dim);\n let mismatch = false;\n const batchSize = 25;\n\n for (let start = 2; start <= doc.numPages; start += batchSize) {\n if (cancelled) return;\n const end = Math.min(doc.numPages, start + batchSize - 1);\n const batchPromises: Promise<void>[] = [];\n\n for (let p = start; p <= end; p++) {\n const pageNum = p;\n batchPromises.push((async () => {\n try {\n const page = await doc.getPage(pageNum);\n if (cancelled) return;\n const vp = page.getViewport({ scale: 1, rotation: normalizeRotation(page.rotate + rotation) });\n if (Math.abs(vp.width - p1Dim.width) > 0.5 || Math.abs(vp.height - p1Dim.height) > 0.5) {\n mismatch = true;\n }\n allDims[pageNum - 1] = { width: vp.width, height: vp.height };\n } catch {\n // Retain estimated p1Dim\n }\n })());\n }\n\n await Promise.all(batchPromises);\n }\n\n if (cancelled) return;\n\n // 4. Update pageDims only if any page had different dimensions than the page 1 estimate\n if (mismatch) {\n const container = containerRef.current;\n if (container && container.scrollTop > 0 && pageTransitionRef.current === 'continuous') {\n const cRow = visibleRowRef.current;\n const newLayout = computeRowLayout(\n rowsRef.current,\n (p) => allDims[p - 1] ?? p1Dim,\n scaleRef.current,\n GAP\n );\n const oldTop = rowLayoutRef.current.tops[cRow] ?? 0;\n const newTop = newLayout.tops[cRow] ?? 0;\n const delta = newTop - oldTop;\n if (delta !== 0) {\n container.scrollTop += delta;\n }\n }\n setPageDims(allDims);\n }\n })();\n\n return () => {\n cancelled = true;\n };\n }, [pdfDoc, rotation]);\n\n // Dynamic Fit to Width calculation\n const handleFitToWidth = useCallback(() => {\n const dims = dimsFor(pageNum);\n if (!containerRef.current || !dims.width) return;\n const availableWidth = containerRef.current.clientWidth - 48;\n if (availableWidth > 0 && dims.width > 0) {\n const newScale = clampScale(availableWidth / dims.width);\n isProgrammaticScaleRef.current = true;\n if (containerRef.current && (pageNum === 1 || containerRef.current.scrollTop <= 1)) {\n containerRef.current.scrollTop = 0;\n containerRef.current.scrollLeft = 0;\n }\n setScale(newScale);\n }\n }, [dimsFor, pageNum, setScale]);\n\n // Dynamic Fit to Page calculation\n const handleFitToPage = useCallback(() => {\n const dims = dimsFor(pageNum);\n if (!containerRef.current || !dims.width || !dims.height) return;\n const availableWidth = containerRef.current.clientWidth - 48;\n const availableHeight = containerRef.current.clientHeight - 48;\n if (availableWidth > 0 && availableHeight > 0 && dims.width > 0 && dims.height > 0) {\n const scaleX = availableWidth / dims.width;\n const scaleY = availableHeight / dims.height;\n const newScale = clampScale(Math.min(scaleX, scaleY));\n isProgrammaticScaleRef.current = true;\n if (containerRef.current && (pageNum === 1 || containerRef.current.scrollTop <= 1)) {\n containerRef.current.scrollTop = 0;\n containerRef.current.scrollLeft = 0;\n }\n setScale(newScale);\n }\n }, [dimsFor, pageNum, setScale]);\n\n useBusEvent('action-fit-to-width', () => handleFitToWidth());\n useBusEvent('action-fit-to-page', () => handleFitToPage());\n\n const getUnrotatedPoint = (e: React.MouseEvent<Element>, pageNumber: number) => {\n const rect = e.currentTarget.getBoundingClientRect();\n const rawX = (e.clientX - rect.left) / scale;\n const rawY = (e.clientY - rect.top) / scale;\n const dims = dimsFor(pageNumber);\n const unW = rotation % 180 === 0 ? dims.width : dims.height;\n const unH = rotation % 180 === 0 ? dims.height : dims.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, targetPageNum);\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', 'underline', 'strikeout', 'squiggly', '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 = newAnnotationId();\n const defaultWidth = Math.max(160, Math.min(320, currentText.length * 9 + 20));\n const lineCount = currentText.split('\\n').length;\n const defaultHeight = Math.max(36, lineCount * 22);\n commitAnnotations([...annotations, {\n id: annId,\n type: activeTextEditor.type,\n pageIndex: activeTextEditor.pageIndex,\n x: activeTextEditor.x,\n y: activeTextEditor.y,\n width: defaultWidth,\n height: defaultHeight,\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 \n const { x, y } = getUnrotatedPoint(e, targetPageNum);\n setCurrentPos({ x, y });\n\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 if (activeTool === 'link') {\n const { x, y } = getUnrotatedPoint(e, targetPageNum);\n if (permissions?.canAddAnnotations === false) return;\n \n // Auto create a link box at click location\n const linkId = newAnnotationId();\n const newLinkAnn: any = {\n id: linkId,\n type: 'link',\n pageIndex: targetPageNum,\n x,\n y,\n width: 120,\n height: 35,\n text: 'Open Link',\n linkUrl: 'https://',\n color: 'transparent',\n strokeWidth: 0,\n opacity: 1,\n points: []\n };\n commitAnnotations([...annotations, newLinkAnn]);\n setSelectedAnnotationId(linkId);\n setIsLinkModalOpen(true);\n setActiveTool(null);\n return;\n } else if (activeTool === 'text' || activeTool === 'note') {\n const { x, y } = getUnrotatedPoint(e, targetPageNum);\n if (permissions?.canAddAnnotations === false) return;\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: newAnnotationId(), type: activeTool as any, pageIndex: targetPageNum,\n x: minX, y: minY, width: maxX - minX, height: maxY - minY,\n points: [...freehandPoints],\n strokes: [[...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 (['highlight', 'underline', 'strikeout', 'squiggly', 'redaction'].includes(activeTool) && 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: newAnnotationId(), 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' || activeTool === 'select') {\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 scrollToPage(targetPage);\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')) {\n if (permissions?.canEditAnnotations === false || !annotationManager.canEdit(ann)) {\n setSelectedAnnotationId(id);\n return;\n }\n // Open edit mode for note / callout\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 === 'text') {\n setSelectedAnnotationId(id);\n } else if (ann && ann.type === 'link') {\n if (permissions?.canEditAnnotations === false || !annotationManager.canEdit(ann)) {\n setSelectedAnnotationId(id);\n return;\n }\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 handleScroll = (e: React.UIEvent<HTMLDivElement>) => {\n setScrollPos({\n top: e.currentTarget.scrollTop,\n left: e.currentTarget.scrollLeft\n });\n visibleRowRef.current = rowIndexAtOffset(e.currentTarget.scrollTop);\n };\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, rowIndexAtOffset(midPoint)));\n const currentPage = rows[cRowIndex] ? rows[cRowIndex][0] : 1;\n if (currentPage !== pageNum) {\n setPageNum(currentPage);\n }\n }\n }, [scrollPos.top, scale, pdfDoc, pageNum, rowIndexAtOffset, 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={(p) => scrollToPage(p)}\n />\n )}\n <div style={{ flex: 1, display: 'flex', flexDirection: 'column', minWidth: 0, minHeight: 0, backgroundColor: 'var(--bg-color)', overflow: 'hidden' }}>\n {/* Compare Sub-toolbar */}\n {compareState.isActive && (\n <CompareToolbar\n compareState={compareState}\n onSetMode={(mode) => setCompareState(prev => ({ ...prev, mode }))}\n onSetColors={(colorA, colorB) => setCompareState(prev => ({ ...prev, colorA, colorB }))}\n onToggleCurtain={() => setCompareState(prev => ({ ...prev, showCurtain: !prev.showCurtain }))}\n onPrevDiff={() => {\n if (compareState.diffItems.length === 0) return;\n const newIdx = (compareState.currentDiffIndex - 1 + compareState.diffItems.length) % compareState.diffItems.length;\n handleSelectDiff(newIdx);\n }}\n onNextDiff={() => {\n if (compareState.diffItems.length === 0) return;\n const newIdx = (compareState.currentDiffIndex + 1) % compareState.diffItems.length;\n handleSelectDiff(newIdx);\n }}\n onExit={() => {\n setCompareState(prev => ({ ...prev, isActive: false }));\n setPdfDocB(null);\n setTextDiffs([]);\n }}\n />\n )}\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={<Undo2 size={16} />} disabled={!annotationManager.canUndo} onClick={handleUndo} label=\"Undo\" />\n <ToolButton icon={<Redo2 size={16} />} disabled={!annotationManager.canRedo} onClick={handleRedo} label=\"Redo\" />\n <div style={{ width: '1px', height: '24px', backgroundColor: 'var(--border-color)', margin: '0 4px' }} />\n\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={<Underline size={16} />} active={activeTool === 'underline'} onClick={() => { setActiveTool('underline'); setCurrentColor('#d32f2f'); setCurrentOpacity(1); setCurrentStrokeWidth(2); }} label=\"Underline\" />\n <ToolButton icon={<Strikethrough size={16} />} active={activeTool === 'strikeout'} onClick={() => { setActiveTool('strikeout'); setCurrentColor('#d32f2f'); setCurrentOpacity(1); setCurrentStrokeWidth(2); }} label=\"Strikeout\" />\n <ToolButton icon={<SquigglyIcon size={16} />} active={activeTool === 'squiggly'} onClick={() => { setActiveTool('squiggly'); setCurrentColor('#388e3c'); setCurrentOpacity(1); setCurrentStrokeWidth(1.5); }} label=\"Squiggly\" />\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', 'underline', 'strikeout', 'squiggly'].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 / Compare Viewport Area */}\n <div style={{ flex: 1, display: 'flex', flexDirection: 'row', minWidth: 0, minHeight: 0, width: '100%', height: '100%', overflow: 'hidden', position: 'relative' }}>\n {compareState.isActive && compareState.mode === 'side-by-side' ? (\n <SideBySideViewer\n pdfDocA={pdfDoc}\n pdfDocB={pdfDocB}\n pageNum={pageNum}\n scale={scale}\n rotation={rotation}\n basePageDims={dimsFor(pageNum)}\n activeTab={activeTab}\n activeTool={activeTool}\n annotations={annotations}\n permissions={permissions}\n watermark={watermark}\n watermarkText={watermarkText}\n redactions={combinedRedactions}\n diffsA={compareState.pageDiffsA?.[pageNum] || []}\n diffsB={compareState.pageDiffsB?.[pageNum] || []}\n selectedDiffId={compareState.diffItems[compareState.currentDiffIndex]?.id}\n onSelectDiff={(id) => {\n const idx = compareState.diffItems.findIndex(d => d.id === id);\n if (idx !== -1) handleSelectDiff(idx);\n }}\n />\n ) : (\n <>\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 display: 'flex',\n flexDirection: 'column',\n minWidth: 0,\n minHeight: 0,\n overflow: 'hidden', \n position: 'relative', \n backgroundColor: 'var(--bg-color)', \n cursor: isPanning ? 'grabbing' : (activeTool === 'pan' ? 'grab' : (activeTool === 'eraser' ? 'cell' : (activeTool === 'select' || activeTool === null ? 'default' : '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') {\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 const hasTextSelection = Boolean(typeof window !== 'undefined' && window.getSelection()?.toString().trim());\n if (hasTextSelection) {\n // Allow native browser context menu on selected text (Copy, Search, etc.)\n return;\n }\n // Prevent default browser context menu on canvas\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 ? (rowLayout.tops[rIndex] ?? 0) : 0;\n \n // Virtualization filtering (only for continuous)\n if (isContinuous && containerRef.current) {\n // Scale-aware virtualization buffer: at high zoom levels each page is enormous,\n // so a smaller row buffer prevents mounting excessive gigantic canvas elements in DOM.\n const bufferBefore = scale >= 4 ? 1 : scale >= 2 ? 2 : 4;\n const bufferAfter = scale >= 4 ? 1 : scale >= 2 ? 2 : 5;\n if (rIndex < visibleRowRef.current - bufferBefore || rIndex > visibleRowRef.current + bufferAfter) {\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 (['highlight', 'underline', 'strikeout', 'squiggly'].includes(activeTool)) {\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: activeTool as any, pageIndex: activeDrawingPageNum,\n x, y, width, height,\n color: currentColor, strokeWidth: currentStrokeWidth, opacity: activeTool === 'highlight' ? currentOpacity : 1\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 const pageDim = dimsFor(p);\n const firstWidth = dimsFor(row[0]).width * scale;\n const thisWidth = pageDim.width * scale;\n if (row.length === 2) {\n if (pIdx === 0) pLeft = Math.max(0, cW / 2 - firstWidth);\n if (pIdx === 1) pLeft = Math.max(firstWidth, cW / 2);\n } else {\n pLeft = Math.max(0, cW / 2 - thisWidth / 2);\n }\n \n const displayAnns = annotations.map(a => (liveResizingAnn && a.id === liveResizingAnn.id ? liveResizingAnn : (liveMovingAnn && a.id === liveMovingAnn.id ? liveMovingAnn : a)));\n const pageAnnotations = (liveAnn && liveAnn.pageIndex === p) ? [...displayAnns, liveAnn] : displayAnns;\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={pageDim.width}\n basePageHeight={pageDim.height}\n activeTab={activeTab}\n activeTool={activeTool}\n annotations={pageAnnotations}\n transientHighlights={transientHighlights?.filter(h => h.pageIndex === p) || []}\n selectedAnnotationId={selectedAnnotationId}\n activeSearchResult={activeSearchResult}\n onMouseDown={handleMouseDown}\n onMouseMove={handleMouseMove}\n onMouseUp={handleMouseUp}\n onAnnotationClick={handleEraserClick}\n onAnnotationDoubleClick={handleAnnotationDoubleClick}\n onStartResize={handleStartResize}\n onStartMove={handleStartMove}\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 hideAnnotationsUntilPageRendered={hideAnnotationsUntilPageRendered}\n />\n {compareState.isActive && compareState.mode === 'overlay' && pdfDocB && (\n <div style={{\n position: 'absolute',\n top: `${rTop}px`,\n left: pLeft !== undefined ? `${pLeft}px` : '0px',\n width: `${pageDim.width * scale}px`,\n height: `${pageDim.height * scale}px`,\n pointerEvents: 'none',\n mixBlendMode: compareState.blendMode as any,\n opacity: compareState.opacityB,\n zIndex: 12,\n filter: 'contrast(1.2) brightness(0.95)'\n }}>\n <PageRenderer \n pageNum={p}\n pdfDoc={pdfDocB}\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={0}\n pageLeft={0}\n basePageWidth={pageDim.width}\n basePageHeight={pageDim.height}\n activeTab={activeTab}\n activeTool={null}\n annotations={[]}\n selectedAnnotationId={null}\n activeSearchResult={null}\n onMouseDown={() => {}}\n onMouseMove={() => {}}\n onMouseUp={() => {}}\n onAnnotationClick={() => {}}\n onAnnotationMouseEnter={() => {}}\n onClearSelection={() => {}}\n />\n </div>\n )}\n {compareState.isActive && (\n <div style={{\n position: 'absolute',\n top: `${rTop}px`,\n left: pLeft !== undefined ? `${pLeft}px` : '0px',\n width: `${pageDim.width * scale}px`,\n height: `${pageDim.height * scale}px`,\n pointerEvents: 'none',\n zIndex: 16\n }}>\n <DiffHighlightOverlay\n boxes={[\n ...(compareState.pageDiffsA?.[p] || []),\n ...(compareState.pageDiffsB?.[p] || [])\n ]}\n scale={scale}\n selectedDiffId={compareState.diffItems[compareState.currentDiffIndex]?.id}\n onSelectDiff={(id) => {\n const idx = compareState.diffItems.findIndex(d => d.id === id);\n if (idx !== -1) handleSelectDiff(idx);\n }}\n />\n </div>\n )}\n {activeTextEditor && activeTextEditor.pageIndex === p && (() => {\n const unW = rotation % 180 === 0 ? pageDim.width : pageDim.height;\n const unH = rotation % 180 === 0 ? pageDim.height : pageDim.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: `${rowLayout.total}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: `${rowLayout.heights[currentRowIndex] ?? 0}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={() => scrollToPage(Math.max(1, pageNum - 1))}\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={() => scrollToPage(Math.min(pdfDoc.numPages, pageNum + 1))}\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: newAnnotationId(), author: undefined, authorId: undefined, createdAt: undefined, modifiedAt: undefined, readOnly: undefined, xfdfExtras: undefined, 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 {compareState.isActive && compareState.showCurtain && (\n <CompareCurtainSlider\n positionPercent={compareState.curtainPosition}\n onChangePosition={(pos) => setCompareState(prev => ({ ...prev, curtainPosition: pos }))}\n containerRef={containerRef}\n />\n )}\n {enableTextSelection !== false && showSelectionTooltip !== false && (\n <TextSelectionTooltip\n containerRef={containerRef}\n onCopy={(text) => bus.emit('action-text-copied', { text })}\n onAnnotateSelection={handleAnnotateSelection}\n />\n )}\n </div>\n </>\n )}\n\n {compareState.isActive && (\n <DiffSummarySidebar\n isOpen={isDiffSidebarOpen}\n onClose={() => setIsDiffSidebarOpen(false)}\n diffItems={compareState.diffItems}\n textDiffs={textDiffs}\n currentDiffIndex={compareState.currentDiffIndex}\n onSelectDiff={(idx, item) => handleSelectDiff(idx, item)}\n onJumpToPage={(p) => scrollToPage(p)}\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, disabled }: { icon: React.ReactNode, active?: boolean, onClick: () => void, label: string, disabled?: boolean }) {\n return (\n <button\n onClick={disabled ? undefined : onClick}\n title={label}\n disabled={disabled}\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: disabled ? 'not-allowed' : 'pointer',\n opacity: disabled ? 0.38 : 1,\n pointerEvents: disabled ? 'none' : 'auto'\n }}\n onMouseEnter={e => { if (!active && !disabled) e.currentTarget.style.backgroundColor = '#f3f4f6'; }}\n onMouseLeave={e => { if (!active && !disabled) e.currentTarget.style.backgroundColor = 'transparent'; }}\n >\n {icon}\n </button>\n );\n}\n\nfunction SquigglyIcon({ size = 16 }: { size?: number }) {\n return (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M4 8v5a4 4 0 0 0 8 0V8\" />\n <path d=\"M4 19c1.5-1.5 2.5-1.5 4 0s2.5 1.5 4 0 2.5-1.5 4 0 2.5 1.5 4 0\" />\n </svg>\n );\n}\n\n\n","/**\n * © 2026 AngelBot Ai Pvt Ltd. All rights reserved.\n */\nimport React, { useState, useMemo } from 'react';\nimport { X, Edit2, Search, RotateCcw, Check } from 'lucide-react';\nimport { useShortcuts, parseCommandString } 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, resetShortcuts } = useShortcuts();\n const [activeTab, setActiveTab] = useState<'General' | 'Keyboard Shortcuts'>('Keyboard Shortcuts');\n const [editingAction, setEditingAction] = useState<ActionType | null>(null);\n const [searchQuery, setSearchQuery] = useState('');\n\n const handleKeyDown = (e: React.KeyboardEvent, action: ActionType) => {\n e.preventDefault();\n e.stopPropagation();\n\n // Escape cancels editing\n if (e.key === 'Escape') {\n setEditingAction(null);\n return;\n }\n\n // Ignore standalone modifier keys\n if (['Meta', 'Control', 'Shift', 'Alt'].includes(e.key)) return;\n\n const parts: string[] = [];\n if (e.metaKey || e.ctrlKey) parts.push('Meta');\n if (e.shiftKey) parts.push('Shift');\n if (e.altKey) parts.push('Alt');\n\n let key = e.key;\n if (key === ' ') key = 'Space';\n if (key === 'Backspace' || key === 'Delete') {\n key = 'Delete';\n } else if (e.shiftKey && (key === '+' || e.code === 'Equal')) {\n key = '=';\n } else if (e.shiftKey && (key === '_' || e.code === 'Minus')) {\n key = '-';\n } else if (key.length === 1) {\n key = key.toUpperCase();\n }\n\n parts.push(key);\n const internalCommand = parts.join('+');\n\n updateShortcut(action, internalCommand);\n setEditingAction(null);\n };\n\n const renderCommandBadges = (cmd: string) => {\n if (!cmd) return <span style={{ color: '#9ca3af', fontStyle: 'italic', fontSize: '13px' }}>None</span>;\n const parsed = parseCommandString(cmd);\n const isMac = typeof navigator !== 'undefined' && /mac/i.test(navigator.platform || navigator.userAgent || '');\n const tokens: string[] = [];\n\n if (parsed.meta) tokens.push(isMac ? '⌘' : 'Ctrl');\n if (parsed.alt) tokens.push(isMac ? '⌥' : 'Alt');\n if (parsed.shift) tokens.push(isMac ? '⇧' : 'Shift');\n if (parsed.key) {\n let k = parsed.key.toUpperCase();\n if (k === 'DELETE') k = isMac ? '⌫ Delete' : 'Del';\n tokens.push(k);\n }\n\n return (\n <div style={{ display: 'flex', gap: '4px', alignItems: 'center', flexWrap: 'wrap' }}>\n {tokens.map((t, idx) => (\n <kbd\n key={idx}\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n padding: '3px 7px',\n fontSize: '11.5px',\n fontFamily: 'ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace',\n fontWeight: 600,\n color: '#1f2937',\n backgroundColor: '#f3f4f6',\n border: '1px solid #d1d5db',\n borderRadius: '4px',\n boxShadow: '0 1px 1px rgba(0,0,0,0.06)',\n minWidth: '20px',\n textAlign: 'center',\n }}\n >\n {t}\n </kbd>\n ))}\n </div>\n );\n };\n\n const query = searchQuery.trim().toLowerCase();\n\n const filteredShortcuts = useMemo(() => {\n if (!query) return shortcuts;\n return shortcuts.filter((s: Shortcut) => {\n const descMatch = s.description.toLowerCase().includes(query);\n const actionMatch = s.action.toLowerCase().includes(query);\n const cmdMatch = s.command.toLowerCase().includes(query);\n return descMatch || actionMatch || cmdMatch;\n });\n }, [shortcuts, query]);\n\n const generalMatches = useMemo(() => {\n if (!query) return true;\n return 'forensic watermark persistent diagonal text overlay'.toLowerCase().includes(query) ||\n Boolean(watermarkText && watermarkText.toLowerCase().includes(query));\n }, [query, watermarkText]);\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: '8px', width: '800px', height: '620px', maxWidth: '92vw', maxHeight: '92vh', display: 'flex', flexDirection: 'column', boxShadow: '0 10px 25px rgba(0,0,0,0.2)', overflow: 'hidden' }}>\n \n {/* Header */}\n <div style={{ padding: '16px 24px', borderBottom: '1px solid var(--border-color)', display: 'flex', justifyContent: 'space-between', alignItems: 'center', backgroundColor: '#fff' }}>\n <h2 style={{ margin: 0, fontSize: '18px', fontWeight: 600, color: 'var(--text-color)' }}>Settings</h2>\n <button onClick={onClose} style={{ background: 'none', border: 'none', cursor: 'pointer', color: 'var(--text-muted)', display: 'flex', padding: '4px' }}>\n <X size={20} />\n </button>\n </div>\n\n {/* Search Bar */}\n <div style={{ padding: '12px 24px', borderBottom: '1px solid var(--border-color)', backgroundColor: '#fafafa' }}>\n <div style={{ position: 'relative' }}>\n <Search size={16} color=\"var(--text-muted)\" style={{ position: 'absolute', left: '12px', top: '50%', transform: 'translateY(-50%)' }} />\n <input \n type=\"text\" \n placeholder=\"Search shortcuts & settings...\" \n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n style={{\n width: '100%',\n padding: '9px 36px 9px 36px',\n border: '1px solid var(--border-color)',\n borderRadius: '6px',\n fontSize: '13px',\n boxSizing: 'border-box',\n outline: 'none',\n backgroundColor: '#fff',\n }}\n />\n {searchQuery && (\n <button\n onClick={() => setSearchQuery('')}\n style={{\n position: 'absolute', right: '10px', top: '50%', transform: 'translateY(-50%)',\n background: 'none', border: 'none', cursor: 'pointer', color: 'var(--text-muted)', display: 'flex', padding: 0\n }}\n title=\"Clear search\"\n >\n <X size={15} />\n </button>\n )}\n </div>\n </div>\n\n {/* Content */}\n <div style={{ display: 'flex', flex: 1, overflow: 'hidden' }}>\n {/* Sidebar Tabs */}\n <div style={{ width: '200px', borderRight: '1px solid var(--border-color)', backgroundColor: '#f9fafb', display: 'flex', flexDirection: 'column' }}>\n {(['General', 'Keyboard Shortcuts'] as const).map(tab => {\n const badgeCount = tab === 'Keyboard Shortcuts' ? (query ? filteredShortcuts.length : null) : (query && generalMatches ? 1 : null);\n return (\n <div \n key={tab}\n onClick={() => setActiveTab(tab)}\n style={{ \n padding: '12px 20px', \n cursor: 'pointer', \n backgroundColor: activeTab === tab ? '#eef2ff' : 'transparent', \n color: activeTab === tab ? 'var(--primary)' : 'var(--text-color)', \n fontWeight: activeTab === tab ? 600 : 400,\n fontSize: '13.5px',\n borderLeft: activeTab === tab ? '3px solid var(--primary)' : '3px solid transparent',\n transition: 'all 0.15s ease',\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center'\n }}\n >\n <span>{tab}</span>\n {badgeCount !== null && (\n <span style={{\n fontSize: '11px',\n padding: '1px 6px',\n borderRadius: '10px',\n backgroundColor: activeTab === tab ? 'var(--primary)' : '#e5e7eb',\n color: activeTab === tab ? '#fff' : '#4b5563',\n fontWeight: 600\n }}>\n {badgeCount}\n </span>\n )}\n </div>\n );\n })}\n </div>\n\n {/* Main Area */}\n <div style={{ flex: 1, overflowY: 'auto', padding: '24px' }}>\n {activeTab === 'Keyboard Shortcuts' && (\n <div>\n <div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center', marginBottom: '16px' }}>\n <span style={{ fontSize: '13px', color: 'var(--text-muted)' }}>\n {query ? `${filteredShortcuts.length} of ${shortcuts.length} shortcuts` : `${shortcuts.length} shortcuts available`}\n </span>\n <button\n onClick={resetShortcuts}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: '6px',\n background: 'none',\n border: '1px solid var(--border-color)',\n borderRadius: '4px',\n padding: '4px 10px',\n fontSize: '12px',\n color: 'var(--text-muted)',\n cursor: 'pointer',\n }}\n title=\"Reset all shortcuts to defaults\"\n >\n <RotateCcw size={13} />\n Reset to Defaults\n </button>\n </div>\n\n {filteredShortcuts.length === 0 ? (\n <div style={{ textAlign: 'center', padding: '40px 16px', color: 'var(--text-muted)', fontSize: '13px' }}>\n <div>No shortcuts matching &ldquo;{searchQuery}&rdquo;</div>\n {generalMatches && (\n <div style={{ marginTop: '8px' }}>\n <button\n onClick={() => setActiveTab('General')}\n style={{ background: 'none', border: 'none', color: 'var(--primary)', cursor: 'pointer', fontSize: '13px', fontWeight: 500, textDecoration: 'underline' }}\n >\n Matching setting found in General tab &rarr;\n </button>\n </div>\n )}\n <button\n onClick={() => setSearchQuery('')}\n style={{ marginTop: '8px', background: 'none', border: 'none', color: 'var(--primary)', cursor: 'pointer', fontSize: '13px', fontWeight: 500 }}\n >\n Clear search\n </button>\n </div>\n ) : (\n <table style={{ width: '100%', borderCollapse: 'collapse', fontSize: '13.5px' }}>\n <thead>\n <tr style={{ borderBottom: '1px solid var(--border-color)', textAlign: 'left', color: 'var(--text-muted)', fontSize: '12px' }}>\n <th style={{ padding: '8px 12px', fontWeight: 600, width: '220px' }}>Shortcut</th>\n <th style={{ padding: '8px 12px', fontWeight: 600 }}>Description</th>\n <th style={{ padding: '8px 12px', fontWeight: 600, width: '70px', textAlign: 'center' }}>Action</th>\n </tr>\n </thead>\n <tbody>\n {filteredShortcuts.map((s: Shortcut) => (\n <tr key={s.action} style={{ borderBottom: '1px solid #f0f0f0' }}>\n <td style={{ padding: '12px 12px' }}>\n {editingAction === s.action ? (\n <div style={{ display: 'flex', alignItems: 'center', gap: '6px' }}>\n <input \n autoFocus\n type=\"text\"\n placeholder=\"Press key combo...\"\n onKeyDown={(e) => handleKeyDown(e, s.action)}\n onBlur={() => setEditingAction(null)}\n style={{\n padding: '5px 8px',\n width: '150px',\n border: '2px solid var(--primary)',\n borderRadius: '4px',\n outline: 'none',\n fontSize: '12px',\n backgroundColor: '#eff6ff'\n }}\n />\n <button\n onMouseDown={(e) => { e.preventDefault(); setEditingAction(null); }}\n style={{ background: 'none', border: 'none', cursor: 'pointer', color: '#9ca3af', display: 'flex', padding: '2px' }}\n title=\"Cancel\"\n >\n <X size={14} />\n </button>\n </div>\n ) : (\n renderCommandBadges(s.command)\n )}\n </td>\n <td style={{ padding: '12px 12px', color: '#374151' }}>{s.description}</td>\n <td style={{ padding: '12px 12px', textAlign: 'center' }}>\n {editingAction === s.action ? (\n <span style={{ fontSize: '11px', color: 'var(--primary)', fontWeight: 600 }}>Recording</span>\n ) : (\n <button \n onClick={() => setEditingAction(s.action)}\n style={{\n background: '#f3f4f6',\n border: '1px solid #e5e7eb',\n borderRadius: '4px',\n cursor: 'pointer',\n color: 'var(--text-muted)',\n padding: '4px 8px',\n display: 'inline-flex',\n alignItems: 'center',\n gap: '4px',\n fontSize: '12px',\n }}\n title=\"Edit shortcut\"\n >\n <Edit2 size={13} /> Edit\n </button>\n )}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n )}\n </div>\n )}\n \n {activeTab === 'General' && (\n <div>\n {query && !generalMatches ? (\n <div style={{ textAlign: 'center', padding: '40px 16px', color: 'var(--text-muted)', fontSize: '13px' }}>\n <div>No general settings matching &ldquo;{searchQuery}&rdquo;</div>\n {filteredShortcuts.length > 0 && (\n <div style={{ marginTop: '8px' }}>\n <button\n onClick={() => setActiveTab('Keyboard Shortcuts')}\n style={{ background: 'none', border: 'none', color: 'var(--primary)', cursor: 'pointer', fontSize: '13px', fontWeight: 500, textDecoration: 'underline' }}\n >\n {filteredShortcuts.length} matching shortcut{filteredShortcuts.length > 1 ? 's' : ''} found in Keyboard Shortcuts &rarr;\n </button>\n </div>\n )}\n <button\n onClick={() => setSearchQuery('')}\n style={{ marginTop: '8px', background: 'none', border: 'none', color: 'var(--primary)', cursor: 'pointer', fontSize: '13px', fontWeight: 500 }}\n >\n Clear search\n </button>\n </div>\n ) : (\n <div style={{ marginTop: '8px' }}>\n <label style={{ display: 'block', fontSize: '14px', fontWeight: 600, color: '#1f2937', marginBottom: '4px' }}>\n Forensic Watermark\n </label>\n <div style={{ fontSize: '13px', color: 'var(--text-muted)', marginBottom: '12px' }}>\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: '9px 12px',\n border: '1px solid var(--border-color)',\n borderRadius: '6px',\n fontSize: '13.5px',\n outline: 'none',\n boxSizing: 'border-box'\n }}\n />\n {watermarkText && (\n <div style={{ display: 'flex', alignItems: 'center', gap: '6px', marginTop: '8px', color: '#16a34a', fontSize: '12.5px' }}>\n <Check size={14} /> Watermark active: &ldquo;{watermarkText}&rdquo;\n </div>\n )}\n </div>\n )}\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 * Page geometry — the single authority for converting between the viewer's \"base page space\"\n * (pdf.js viewport at scale 1 with the page's intrinsic /Rotate applied; top-left origin, points)\n * and PDF user space (bottom-left origin, as written into XFDF / drawn by pdf-lib).\n *\n * The transform replicates pdf.js `PageViewport` exactly (display_utils.js) so results are\n * identical to `viewport.convertToPdfPoint` / `convertToViewportPoint`, but it only needs the\n * page's `view` (viewBox) and `rotate`, which keeps it synchronous and unit-testable.\n */\nimport type { PDFDocumentProxy, PDFPageProxy } from 'pdfjs-dist';\nimport { normalizeRotation } from '../utils/rotationUtils';\n\nexport type Matrix = [number, number, number, number, number, number];\n\nexport interface PageGeometry {\n /** 1-based page number */\n pageNumber: number;\n /** PDF user-space bounding box [x0, y0, x1, y1] (the CropBox pdf.js renders). */\n viewBox: [number, number, number, number];\n /** Intrinsic page rotation (/Rotate), normalized to 0/90/180/270. */\n rotate: number;\n /** Base page size in points (already swapped for 90/270). */\n width: number;\n height: number;\n /** Base-space (viewer) -> PDF user-space transform is the inverse of this viewport transform. */\n transform: Matrix;\n}\n\nexport interface Rect {\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\nexport interface Point {\n x: number;\n y: number;\n}\n\n/** PDF rectangle as XFDF writes it: [llx, lly, urx, ury]. */\nexport type PdfRect = [number, number, number, number];\n\n/** Collapse -0 to 0 so equality checks and XFDF output never see a signed zero. */\nconst z = (n: number): number => (n === 0 ? 0 : n);\n\nfunction applyTransform(p: Point, m: Matrix): Point {\n return { x: z(p.x * m[0] + p.y * m[2] + m[4]), y: z(p.x * m[1] + p.y * m[3] + m[5]) };\n}\n\nfunction applyInverseTransform(p: Point, m: Matrix): Point {\n const d = m[0] * m[3] - m[1] * m[2];\n return {\n x: z((p.x * m[3] - p.y * m[2] + m[2] * m[5] - m[4] * m[3]) / d),\n y: z((-p.x * m[1] + p.y * m[0] + m[4] * m[1] - m[5] * m[0]) / d),\n };\n}\n\n/** Build the geometry for a page from its viewBox and intrinsic rotation (mirrors pdf.js PageViewport at scale 1). */\nexport function createPageGeometry(pageNumber: number, viewBox: [number, number, number, number], rotate: number): PageGeometry {\n const rotation = normalizeRotation(rotate);\n const [x0, y0, x1, y1] = viewBox;\n const centerX = (x1 + x0) / 2;\n const centerY = (y1 + y0) / 2;\n\n let rotateA: number, rotateB: number, rotateC: number, rotateD: number;\n switch (rotation) {\n case 180: rotateA = -1; rotateB = 0; rotateC = 0; rotateD = 1; break;\n case 90: rotateA = 0; rotateB = 1; rotateC = 1; rotateD = 0; break;\n case 270: rotateA = 0; rotateB = -1; rotateC = -1; rotateD = 0; break;\n default: rotateA = 1; rotateB = 0; rotateC = 0; rotateD = -1; break;\n }\n\n let offsetCanvasX: number, offsetCanvasY: number, width: number, height: number;\n if (rotateA === 0) {\n offsetCanvasX = Math.abs(centerY - y0);\n offsetCanvasY = Math.abs(centerX - x0);\n width = Math.abs(y1 - y0);\n height = Math.abs(x1 - x0);\n } else {\n offsetCanvasX = Math.abs(centerX - x0);\n offsetCanvasY = Math.abs(centerY - y0);\n width = x1 - x0;\n height = y1 - y0;\n }\n\n const transform: Matrix = [\n rotateA, rotateB, rotateC, rotateD,\n offsetCanvasX - rotateA * centerX - rotateC * centerY,\n offsetCanvasY - rotateB * centerX - rotateD * centerY,\n ];\n\n return { pageNumber, viewBox: [x0, y0, x1, y1], rotate: rotation, width, height, transform };\n}\n\nexport function geometryFromPage(page: PDFPageProxy): PageGeometry {\n const view = page.view as number[];\n return createPageGeometry(page.pageNumber, [view[0], view[1], view[2], view[3]], page.rotate);\n}\n\n/** Small per-document cache so callers can resolve geometry for many annotations cheaply. */\nexport function createGeometryResolver(pdfDoc: PDFDocumentProxy) {\n const cache = new Map<number, Promise<PageGeometry>>();\n return (pageNumber: number): Promise<PageGeometry> => {\n const n = Math.max(1, Math.min(pdfDoc.numPages, pageNumber));\n let p = cache.get(n);\n if (!p) {\n p = pdfDoc.getPage(n).then(geometryFromPage);\n cache.set(n, p);\n }\n return p;\n };\n}\n\nexport type GeometryResolver = (pageNumber: number) => Promise<PageGeometry>;\n\n// ---- point / rect / path conversions ----------------------------------------------------------\n\nexport function toPdfPoint(g: PageGeometry, p: Point): Point {\n return applyInverseTransform(p, g.transform);\n}\n\nexport function fromPdfPoint(g: PageGeometry, p: Point): Point {\n return applyTransform(p, g.transform);\n}\n\n/** Viewer rect (top-left origin) -> PDF rect [llx, lly, urx, ury]. */\nexport function rectToPdf(g: PageGeometry, r: Rect): PdfRect {\n const a = toPdfPoint(g, { x: r.x, y: r.y });\n const b = toPdfPoint(g, { x: r.x + r.width, y: r.y + r.height });\n return [Math.min(a.x, b.x), Math.min(a.y, b.y), Math.max(a.x, b.x), Math.max(a.y, b.y)];\n}\n\n/** PDF rect [llx, lly, urx, ury] -> viewer rect (top-left origin). */\nexport function rectFromPdf(g: PageGeometry, r: PdfRect): Rect {\n const a = fromPdfPoint(g, { x: r[0], y: r[1] });\n const b = fromPdfPoint(g, { x: r[2], y: r[3] });\n const x = Math.min(a.x, b.x);\n const y = Math.min(a.y, b.y);\n return { x, y, width: Math.abs(b.x - a.x), height: Math.abs(b.y - a.y) };\n}\n\nexport function pathToPdf(g: PageGeometry, points: Point[]): Point[] {\n return points.map((p) => toPdfPoint(g, p));\n}\n\nexport function pathFromPdf(g: PageGeometry, points: Point[]): Point[] {\n return points.map((p) => fromPdfPoint(g, p));\n}\n\n/**\n * XFDF QuadPoints for a viewer rect: x1,y1 (upper-left) x2,y2 (upper-right) x3,y3 (lower-left)\n * x4,y4 (lower-right) in PDF space — the order Acrobat and Apryse write for text markup.\n */\nexport function rectToQuadPoints(g: PageGeometry, r: Rect): number[] {\n const [llx, lly, urx, ury] = rectToPdf(g, r);\n return [llx, ury, urx, ury, llx, lly, urx, lly];\n}\n\n/** Bounding viewer rect of one or more XFDF quads (8 numbers each). */\nexport function quadPointsToRects(g: PageGeometry, quads: number[]): Rect[] {\n const rects: Rect[] = [];\n for (let i = 0; i + 7 < quads.length; i += 8) {\n const xs = [quads[i], quads[i + 2], quads[i + 4], quads[i + 6]];\n const ys = [quads[i + 1], quads[i + 3], quads[i + 5], quads[i + 7]];\n rects.push(rectFromPdf(g, [Math.min(...xs), Math.min(...ys), Math.max(...xs), Math.max(...ys)]));\n }\n return rects;\n}\n\nexport function unionRects(rects: Rect[]): Rect {\n if (rects.length === 0) return { x: 0, y: 0, width: 0, height: 0 };\n const x0 = Math.min(...rects.map((r) => r.x));\n const y0 = Math.min(...rects.map((r) => r.y));\n const x1 = Math.max(...rects.map((r) => r.x + r.width));\n const y1 = Math.max(...rects.map((r) => r.y + r.height));\n return { x: x0, y: y0, width: x1 - x0, height: y1 - y0 };\n}\n\n/** Round to 3 decimals for XFDF output (Apryse writes 3, Acrobat up to 6). */\nexport const fmt = (n: number): string => (Math.round(n * 1000) / 1000).toString();\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 * Geometry: every annotation is converted from the viewer's base page space to PDF user space\n * through `annotations/geometry.ts` (the same transform pdf.js uses), so baked markup lands exactly\n * where it was drawn — on any page size, CropBox offset or intrinsic /Rotate.\n */\nimport { PDFDocument, rgb, degrees, StandardFonts, BlendMode, type PDFPage } 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';\nimport { createGeometryResolver, pathToPdf, rectToPdf, toPdfPoint, type GeometryResolver, type PageGeometry } from '../annotations/geometry';\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 /** Page geometry resolver (from the loaded pdf.js document). Derived from the bytes when absent. */\n getPageGeometry?: GeometryResolver;\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; annotations are always taken from the live list / explicitAnnotations. */\n xfdfString?: string;\n}\n\nconst hexToRgb = (hex: string | undefined) => {\n const safe = hex && /^#[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\nfunction wrapText(text: string, maxWidth: number, fontSize: number): string[] {\n const approxCharWidth = fontSize * 0.55;\n const maxCharsPerLine = Math.max(1, Math.floor(maxWidth / approxCharWidth));\n const paragraphs = text.split('\\n');\n const lines: string[] = [];\n\n for (const p of paragraphs) {\n if (!p) {\n lines.push('');\n continue;\n }\n const words = p.split(/\\s+/);\n let currentLine = '';\n\n for (const word of words) {\n if (!currentLine) {\n currentLine = word;\n } else if ((currentLine + ' ' + word).length <= maxCharsPerLine) {\n currentLine += ' ' + word;\n } else {\n lines.push(currentLine);\n currentLine = word;\n }\n }\n if (currentLine) {\n lines.push(currentLine);\n }\n }\n return lines;\n}\n\nasync function bakeAnnotation(pdfDoc: PDFDocument, page: PDFPage, g: PageGeometry, ann: Annotation, signerName?: string): Promise<void> {\n const color = hexToRgb(ann.color);\n const opacity = ann.opacity ?? 1;\n const strokeWidth = ann.strokeWidth || 1;\n const rect = rectToPdf(g, { x: ann.x, y: ann.y, width: ann.width, height: ann.height });\n const [llx, lly, urx, ury] = rect;\n const w = urx - llx;\n const h = ury - lly;\n // Text drawn in user space appears rotated by /Rotate in the viewer; counter-rotate so it reads\n // upright the way it was authored.\n const textRotate = degrees(g.rotate);\n const topLeftBaseline = (x: number, y: number, size: number) => toPdfPoint(g, { x, y: y + size });\n\n switch (ann.type) {\n case 'rectangle':\n page.drawRectangle({ x: llx, y: lly, width: w, height: h, color, opacity, borderColor: color, borderWidth: strokeWidth, borderOpacity: 1 });\n return;\n case 'ellipse':\n page.drawEllipse({ x: llx + w / 2, y: lly + h / 2, xScale: w / 2, yScale: h / 2, color, opacity, borderColor: color, borderWidth: strokeWidth, borderOpacity: 1 });\n return;\n case 'highlight': {\n const rects = ann.rects && ann.rects.length > 0 ? ann.rects : [{ x: ann.x, y: ann.y, width: ann.width, height: ann.height }];\n for (const r of rects) {\n const [x0, y0, x1, y1] = rectToPdf(g, r);\n page.drawRectangle({ x: x0, y: y0, width: x1 - x0, height: y1 - y0, color, opacity: opacity < 1 ? opacity : 0.5, blendMode: BlendMode.Multiply });\n }\n return;\n }\n case 'underline': {\n const rects = ann.rects && ann.rects.length > 0 ? ann.rects : [{ x: ann.x, y: ann.y, width: ann.width, height: ann.height }];\n for (const r of rects) {\n const [s, e] = pathToPdf(g, [\n { x: r.x, y: r.y + r.height - 1.5 },\n { x: r.x + r.width, y: r.y + r.height - 1.5 }\n ]);\n page.drawLine({ start: s, end: e, color, opacity, thickness: strokeWidth || 1.5 });\n }\n return;\n }\n case 'strikeout': {\n const rects = ann.rects && ann.rects.length > 0 ? ann.rects : [{ x: ann.x, y: ann.y, width: ann.width, height: ann.height }];\n for (const r of rects) {\n const [s, e] = pathToPdf(g, [\n { x: r.x, y: r.y + r.height / 2 },\n { x: r.x + r.width, y: r.y + r.height / 2 }\n ]);\n page.drawLine({ start: s, end: e, color, opacity, thickness: strokeWidth || 1.5 });\n }\n return;\n }\n case 'squiggly': {\n const rects = ann.rects && ann.rects.length > 0 ? ann.rects : [{ x: ann.x, y: ann.y, width: ann.width, height: ann.height }];\n for (const r of rects) {\n const squigglyPts = [];\n const step = 3;\n let up = true;\n for (let curX = r.x; curX <= r.x + r.width; curX += step) {\n squigglyPts.push({ x: curX, y: r.y + r.height - (up ? 3 : 1) });\n up = !up;\n }\n if (squigglyPts.length >= 2) {\n const pdfPts = pathToPdf(g, squigglyPts);\n for (let i = 1; i < pdfPts.length; i++) {\n page.drawLine({ start: pdfPts[i - 1], end: pdfPts[i], color, opacity, thickness: strokeWidth || 1.5 });\n }\n }\n }\n return;\n }\n case 'line':\n case 'arrow': {\n const pts = ann.points && ann.points.length >= 2 ? ann.points : [{ x: ann.x, y: ann.y }, { x: ann.x + ann.width, y: ann.y + ann.height }];\n const [s, e] = pathToPdf(g, [pts[0], pts[1]]);\n page.drawLine({ start: s, end: e, color, opacity, thickness: strokeWidth });\n if (ann.type === 'arrow') {\n // Arrow head computed in viewer space (same as the on-screen rendering), then converted.\n const p1 = pts[0], p2 = pts[1];\n const angle = Math.atan2(p2.y - p1.y, p2.x - p1.x);\n const headLen = 15 + 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 const [ph1, ph2] = pathToPdf(g, [h1, h2]);\n page.drawLine({ start: ph1, end: e, color, opacity, thickness: strokeWidth });\n page.drawLine({ start: ph2, end: e, color, opacity, thickness: strokeWidth });\n }\n return;\n }\n case 'freehand': {\n const strokes = ann.strokes && ann.strokes.length > 0 ? ann.strokes : ann.points ? [ann.points] : [];\n for (const st of strokes) {\n const pdfPts = pathToPdf(g, st);\n for (let i = 1; i < pdfPts.length; i++) {\n page.drawLine({ start: pdfPts[i - 1], end: pdfPts[i], color, opacity, thickness: strokeWidth, lineCap: 1 });\n }\n }\n return;\n }\n case 'text': {\n if (!ann.text) return;\n const boxWidth = ann.width && ann.width > 0 ? ann.width : 200;\n const lines = wrapText(ann.text, boxWidth, 16);\n const lineHeight = 20;\n for (let i = 0; i < lines.length; i++) {\n if (!lines[i]) continue;\n const b = topLeftBaseline(ann.x, ann.y + i * lineHeight, 16);\n page.drawText(lines[i], { x: b.x, y: b.y, size: 16, color, opacity, rotate: textRotate });\n }\n return;\n }\n case 'note': {\n const [nx0, ny0, nx1, ny1] = rectToPdf(g, { x: ann.x, y: ann.y, width: 24, height: 24 });\n page.drawRectangle({ x: nx0, y: ny0, width: nx1 - nx0, height: ny1 - ny0, color: rgb(1, 0.97, 0.7), borderColor: color, borderWidth: strokeWidth });\n if (ann.text) {\n const b = topLeftBaseline(ann.x + 30, ann.y, 14);\n page.drawText(ann.text, { x: b.x, y: b.y, size: 14, color, opacity, rotate: textRotate });\n }\n return;\n }\n case 'callout': {\n const pts = ann.points && ann.points.length >= 2 ? ann.points : [{ x: ann.x, y: ann.y }, { x: ann.x, y: ann.y }];\n const [s, e] = pathToPdf(g, [pts[0], pts[1]]);\n page.drawLine({ start: s, end: e, color, opacity, thickness: strokeWidth });\n if (ann.text) {\n const boxW = ann.text.length * 8 + 20;\n const [bx0, by0, bx1, by1] = rectToPdf(g, { x: pts[1].x, y: pts[1].y, width: boxW, height: 24 });\n page.drawRectangle({ x: bx0, y: by0, width: bx1 - bx0, height: by1 - by0, color: rgb(1, 1, 1), borderColor: color, borderWidth: strokeWidth });\n const b = topLeftBaseline(pts[1].x + 10, pts[1].y + 2, 14);\n page.drawText(ann.text, { x: b.x, y: b.y, size: 14, color, opacity, rotate: textRotate });\n }\n return;\n }\n case 'signature': {\n if (!ann.imageUrl) return;\n const imageBytes = await fetch(ann.imageUrl).then((res) => res.arrayBuffer());\n const image = ann.imageUrl.startsWith('data:image/jpeg') || ann.imageUrl.startsWith('data:image/jpg')\n ? await pdfDoc.embedJpg(imageBytes)\n : await pdfDoc.embedPng(imageBytes);\n page.drawImage(image, { x: llx, y: lly, width: w, height: h, rotate: textRotate });\n return;\n }\n case 'digital_signature_placeholder': {\n const dateStr = ann.timestamp ? new Date(ann.timestamp).toLocaleString('en-GB') : new Date().toLocaleString('en-GB');\n const iconW = w * 0.15;\n page.drawRectangle({ x: llx, y: lly, width: w, height: h, color: rgb(1, 1, 1), borderColor: rgb(148 / 255, 163 / 255, 184 / 255), borderWidth: 1 });\n page.drawLine({ start: { x: llx + iconW, y: lly }, end: { x: llx + iconW, y: lly + h }, color: rgb(226 / 255, 232 / 255, 240 / 255), thickness: 1 });\n page.drawSvgPath('M22 6 L22 14 Q22 20 12 24 Q2 20 2 14 L2 6 L12 2 Z', { x: llx + iconW / 2 - 12, y: lly + h / 2 + 12, borderColor: rgb(2 / 255, 132 / 255, 199 / 255), borderWidth: 2, scale: 1 });\n page.drawSvgPath('M7 13 L10 16 L17 8', { x: llx + iconW / 2 - 12, y: lly + h / 2 + 12, borderColor: rgb(2 / 255, 132 / 255, 199 / 255), borderWidth: 2, scale: 1 });\n page.drawText(`Digitally signed by ${ann.signer || signerName || 'Unknown signer'}`, { x: llx + iconW + 10, y: lly + h - 16, size: 10, color: rgb(15 / 255, 23 / 255, 42 / 255) });\n page.drawText(`Date: ${dateStr}`, { x: llx + iconW + 10, y: lly + h - 28, size: 9, color: rgb(51 / 255, 65 / 255, 85 / 255) });\n page.drawText('Reason: Document Approval', { x: llx + iconW + 10, y: lly + h - 40, size: 9, color: rgb(51 / 255, 65 / 255, 85 / 255) });\n return;\n }\n case 'link':\n case 'opaque':\n default:\n return; // not visual (link) or not ours to render (opaque)\n }\n}\n\nasync function bakeWatermark(pdfDoc: PDFDocument, wm: WatermarkOptions): Promise<void> {\n const wmColor = hexToRgb(wm.color || '#737373');\n const wmOpacity = wm.opacity ?? 0.08;\n const helveticaFont = await pdfDoc.embedFont(StandardFonts.Helvetica);\n const angle = -Math.PI / 4;\n const cosA = Math.cos(angle);\n const sinA = Math.sin(angle);\n\n for (const page of pdfDoc.getPages()) {\n const { width, height } = page.getSize();\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 page.drawText(wm.text, {\n x: width / 2 + (dx * cosA - dy * sinA),\n y: height / 2 + (dx * sinA + dy * cosA),\n size: fontSize, font: helveticaFont, color: wmColor, opacity: wmOpacity, 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, { x: x + offset + rotatedDx, y: y + rotatedDy, size: fontSize, font: helveticaFont, color: wmColor, opacity: wmOpacity, rotate: degrees(-45) });\n }\n }\n }\n }\n}\n\nasync function rasterizeRedactions(pdfDoc: PDFDocument, redactions: Redaction[]): Promise<PDFDocument> {\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 = redactions.filter((r) => r.pageIndex === i);\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 const canvas = document.createElement('canvas');\n canvas.width = viewport.width;\n canvas.height = viewport.height;\n const ctx = canvas.getContext('2d');\n if (ctx) {\n await renderPage.render({ canvasContext: ctx, canvas, viewport }).promise;\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 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 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 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 if (i % 5 === 0) await new Promise((resolve) => setTimeout(resolve, 0));\n }\n } finally {\n await loadingTask.destroy().catch(() => {});\n }\n return flattenedPdf;\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 ignored; import the XFDF through annotationManager.importAnnotations() first.');\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 // Geometry: prefer the live pdf.js document; otherwise derive it from the bytes.\n let resolveGeometry = input.getPageGeometry;\n let geometryTask: pdfjsLib.PDFDocumentLoadingTask | null = null;\n if (!resolveGeometry && anns.length > 0) {\n geometryTask = pdfjsLib.getDocument({ data: sourceBytes.slice(), ...getDocumentParams() });\n resolveGeometry = createGeometryResolver(await geometryTask.promise);\n }\n\n try {\n for (const ann of anns) {\n const pageIdx = Math.max(0, Math.min((ann.pageIndex || 1) - 1, pages.length - 1));\n const g = await resolveGeometry!(pageIdx + 1);\n await bakeAnnotation(pdfDoc, pages[pageIdx], g, ann, input.signerName);\n }\n } finally {\n if (geometryTask) await geometryTask.destroy().catch(() => {});\n }\n\n if (input.watermark?.text) await bakeWatermark(pdfDoc, input.watermark);\n\n const combinedRedactions = input.redactions || [];\n const finalDoc = combinedRedactions.length > 0 ? await rasterizeRedactions(pdfDoc, combinedRedactions) : pdfDoc;\n return await finalDoc.save();\n}\n","/**\n * © 2026 AngelBot Ai Pvt Ltd. All rights reserved.\n * XFDF serializer / parser.\n *\n * Writes the subset of XFDF (ISO 32000 + Acrobat/Apryse conventions) that maps onto this viewer's\n * annotation model, and reads anything back. Elements it cannot model become `opaque`\n * annotations that re-export verbatim, and unknown attributes / children of known elements are\n * preserved in `xfdfExtras`, so a document can round-trip through another viewer (Apryse, Acrobat)\n * without losing metadata. Geometry goes through `annotations/geometry.ts`, the single coordinate\n * authority (base page space <-> PDF user space).\n */\nimport type { Annotation, AnnotationInput, AnnotationPoint } from './types';\nimport { newAnnotationId } from './ids';\nimport {\n fmt,\n pathFromPdf,\n pathToPdf,\n quadPointsToRects,\n rectFromPdf,\n rectToPdf,\n rectToQuadPoints,\n unionRects,\n type GeometryResolver,\n type PageGeometry,\n type PdfRect,\n type Point,\n} from './geometry';\n\nexport const XFDF_NS = 'http://ns.adobe.com/xfdf/';\n\nexport interface XfdfExportOptions {\n /** Annotations to serialize (default: all given). */\n annotList?: Annotation[];\n /** Write the author's display name into `title` (default true). */\n useDisplayAuthor?: boolean;\n}\n\n/** Custom data namespace inside Apryse's `trn-custom-data` element (survives an Apryse round-trip). */\nconst CUSTOM_KEY = 'tspdf';\n\n// ---- helpers ----------------------------------------------------------------------------------\n\nconst escapeXml = (s: string): string =>\n s.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\"/g, '&quot;').replace(/'/g, '&apos;');\n\nfunction pad(n: number, w = 2): string {\n return String(n).padStart(w, '0');\n}\n\n/** ISO-8601 -> PDF date `D:YYYYMMDDHHmmSS+HH'mm'`. */\nexport function toPdfDate(iso: string | undefined): string {\n const d = iso ? new Date(iso) : new Date();\n if (Number.isNaN(d.getTime())) return toPdfDate(undefined);\n const tz = -d.getTimezoneOffset();\n const sign = tz >= 0 ? '+' : '-';\n const tzh = pad(Math.floor(Math.abs(tz) / 60));\n const tzm = pad(Math.abs(tz) % 60);\n return `D:${d.getFullYear()}${pad(d.getMonth() + 1)}${pad(d.getDate())}${pad(d.getHours())}${pad(d.getMinutes())}${pad(d.getSeconds())}${sign}${tzh}'${tzm}'`;\n}\n\n/** PDF date -> ISO-8601 (best effort; returns undefined when unparseable). */\nexport function fromPdfDate(pdf: string | null | undefined): string | undefined {\n if (!pdf) return undefined;\n const m = /^D:(\\d{4})(\\d{2})?(\\d{2})?(\\d{2})?(\\d{2})?(\\d{2})?([+\\-Z])?(\\d{2})?'?(\\d{2})?/.exec(pdf.trim());\n if (!m) {\n const t = Date.parse(pdf);\n return Number.isNaN(t) ? undefined : new Date(t).toISOString();\n }\n const [, Y, Mo = '01', D = '01', h = '00', mi = '00', s = '00', tzs, tzh = '00', tzm = '00'] = m;\n let offset = '';\n if (tzs === 'Z' || !tzs) offset = 'Z';\n else offset = `${tzs}${tzh}:${tzm}`;\n const t = Date.parse(`${Y}-${Mo}-${D}T${h}:${mi}:${s}${offset}`);\n return Number.isNaN(t) ? undefined : new Date(t).toISOString();\n}\n\nconst toHexColor = (c: string | undefined): string | undefined => {\n if (!c || c === 'transparent') return undefined;\n if (/^#[0-9a-f]{6}$/i.test(c)) return c.toUpperCase();\n if (/^#[0-9a-f]{3}$/i.test(c)) return `#${c[1]}${c[1]}${c[2]}${c[2]}${c[3]}${c[3]}`.toUpperCase();\n return undefined;\n};\n\nconst attr = (name: string, value: string | number | undefined | null): string =>\n value === undefined || value === null || value === '' ? '' : ` ${name}=\"${escapeXml(String(value))}\"`;\n\nfunction customDataElement(data: Record<string, unknown>): string {\n return `<trn-custom-data bytes=\"${escapeXml(JSON.stringify({ [CUSTOM_KEY]: data }))}\"/>`;\n}\n\nfunction readCustomData(el: Element): Record<string, unknown> {\n const node = Array.from(el.children).find((c) => c.localName === 'trn-custom-data');\n if (!node) return {};\n try {\n const parsed = JSON.parse(node.getAttribute('bytes') || '{}');\n const data = parsed?.[CUSTOM_KEY];\n return data && typeof data === 'object' ? data : {};\n } catch {\n return {};\n }\n}\n\nfunction pointsAttr(points: Point[]): string {\n return points.map((p) => `${fmt(p.x)},${fmt(p.y)}`).join(';');\n}\n\nfunction parsePoints(s: string | null): Point[] {\n if (!s) return [];\n return s\n .split(';')\n .map((pair) => pair.trim().split(/[,\\s]+/).map(Number))\n .filter((xy) => xy.length >= 2 && xy.every((n) => Number.isFinite(n)))\n .map(([x, y]) => ({ x, y }));\n}\n\nfunction parseNumbers(s: string | null): number[] {\n if (!s) return [];\n return s.split(/[,\\s]+/).map(Number).filter((n) => Number.isFinite(n));\n}\n\nfunction pdfRectAttr(r: PdfRect): string {\n return r.map(fmt).join(',');\n}\n\n/** Attributes we own on every element (so they are not carried over from `xfdfExtras`). */\nconst OWNED_ATTRS = new Set([\n 'page', 'rect', 'color', 'interior-color', 'width', 'opacity', 'name', 'title', 'subject', 'date',\n 'creationdate', 'flags', 'coords', 'start', 'end', 'head', 'tail', 'icon', 'IT', 'callout', 'style',\n]);\n/** Child elements we own / regenerate. */\nconst OWNED_CHILDREN = new Set(['contents', 'contents-richtext', 'inklist', 'imagedata', 'OnActivation', 'trn-custom-data', 'defaultstyle', 'defaultappearance', 'popup', 'vertices']);\n\n// ---- export -----------------------------------------------------------------------------------\n\nfunction commonAttrs(a: Annotation, g: PageGeometry, useDisplayAuthor: boolean, rectOverride?: PdfRect): string {\n const rect = rectOverride ?? rectToPdf(g, { x: a.x, y: a.y, width: a.width, height: a.height });\n const created = a.createdAt ?? (a.timestamp ? new Date(a.timestamp).toISOString() : undefined);\n const flags = ['print', ...(a.readOnly ? ['readonly', 'locked'] : [])].join(',');\n return (\n attr('page', a.pageIndex - 1) +\n attr('rect', pdfRectAttr(rect)) +\n attr('name', a.id) +\n (useDisplayAuthor ? attr('title', a.author) : '') +\n attr('date', toPdfDate(a.modifiedAt ?? created)) +\n attr('creationdate', toPdfDate(created)) +\n attr('flags', flags) +\n attr('opacity', a.opacity !== undefined && a.opacity !== 1 ? fmt(a.opacity) : undefined)\n );\n}\n\nfunction extraAttrs(a: Annotation): string {\n const attrs = a.xfdfExtras?.attrs;\n if (!attrs) return '';\n return Object.entries(attrs)\n .filter(([k]) => !OWNED_ATTRS.has(k))\n .map(([k, v]) => attr(k, v))\n .join('');\n}\n\nfunction extraChildren(a: Annotation): string {\n return (a.xfdfExtras?.children ?? []).join('');\n}\n\nfunction customData(a: Annotation, extra: Record<string, unknown> = {}): string {\n const data: Record<string, unknown> = { type: a.type, ...extra };\n if (a.authorId) data.authorId = a.authorId;\n if (a.strokeWidth !== undefined) data.strokeWidth = a.strokeWidth;\n return customDataElement(data);\n}\n\nconst contentsElement = (text: string | undefined): string => (text ? `<contents>${escapeXml(text)}</contents>` : '');\n\nconst defaultStyle = (a: Annotation, size: number): string =>\n `<defaultstyle>font: Helvetica ${size}pt; text-align: left; color: ${toHexColor(a.color) ?? '#000000'}</defaultstyle>` +\n `<defaultappearance>0 0 0 rg /Helv ${size} Tf</defaultappearance>`;\n\n/** Serialize one annotation to an XFDF element (no envelope). */\nexport async function annotationToXfdfFragment(a: Annotation, resolve: GeometryResolver, opts: XfdfExportOptions = {}): Promise<string> {\n if (a.type === 'opaque' && a.rawXfdf) return a.rawXfdf;\n const g = await resolve(a.pageIndex);\n const useDisplayAuthor = opts.useDisplayAuthor !== false;\n const color = toHexColor(a.color);\n const strokeAttrs = attr('color', color) + attr('width', a.strokeWidth);\n const common = (rect?: PdfRect) => commonAttrs(a, g, useDisplayAuthor, rect) + extraAttrs(a);\n const tail = (extra: Record<string, unknown> = {}) => customData(a, extra) + extraChildren(a);\n\n switch (a.type) {\n case 'rectangle':\n return `<square${common()}${strokeAttrs}${attr('interior-color', color)} subject=\"Rectangle\">${tail()}</square>`;\n case 'ellipse':\n return `<circle${common()}${strokeAttrs}${attr('interior-color', color)} subject=\"Ellipse\">${tail()}</circle>`;\n case 'line':\n case 'arrow': {\n const pts = a.points && a.points.length >= 2 ? a.points : [{ x: a.x, y: a.y }, { x: a.x + a.width, y: a.y + a.height }];\n const [s, e] = pathToPdf(g, [pts[0], pts[1]]);\n const rect: PdfRect = [Math.min(s.x, e.x), Math.min(s.y, e.y), Math.max(s.x, e.x), Math.max(s.y, e.y)];\n const head = a.type === 'arrow' ? attr('head', 'OpenArrow') : '';\n return `<line${common(rect)}${strokeAttrs} start=\"${fmt(s.x)},${fmt(s.y)}\" end=\"${fmt(e.x)},${fmt(e.y)}\"${head} subject=\"${a.type === 'arrow' ? 'Arrow' : 'Line'}\">${tail()}</line>`;\n }\n case 'freehand': {\n const strokes = a.strokes && a.strokes.length > 0 ? a.strokes : a.points ? [a.points] : [];\n const gestures = strokes.map((st) => `<gesture>${pointsAttr(pathToPdf(g, st))}</gesture>`).join('');\n const all = strokes.flat();\n const bbox = all.length ? rectToPdf(g, boundsOf(all, a.strokeWidth)) : undefined;\n return `<ink${common(bbox)}${strokeAttrs} subject=\"Free Hand\"><inklist>${gestures}</inklist>${tail()}</ink>`;\n }\n case 'highlight':\n case 'underline':\n case 'strikeout':\n case 'squiggly': {\n const rects = a.rects && a.rects.length > 0 ? a.rects : [{ x: a.x, y: a.y, width: a.width, height: a.height }];\n const coords = rects.flatMap((r) => rectToQuadPoints(g, r)).map(fmt).join(',');\n const bbox = rectToPdf(g, unionRects(rects));\n const tag = a.type;\n const subject = a.type === 'highlight' ? 'Highlight' : a.type === 'underline' ? 'Underline' : a.type === 'strikeout' ? 'StrikeOut' : 'Squiggly';\n return `<${tag}${common(bbox)}${attr('color', color)} coords=\"${coords}\" subject=\"${subject}\">${tail()}</${tag}>`;\n }\n case 'text':\n return `<freetext${common()}${attr('color', color)} subject=\"Free Text\">${contentsElement(a.text)}${defaultStyle(a, 16)}${tail()}</freetext>`;\n case 'callout': {\n const pts = a.points && a.points.length >= 2 ? a.points : [{ x: a.x, y: a.y }, { x: a.x, y: a.y }];\n const [s, e] = pathToPdf(g, [pts[0], pts[1]]);\n const boxRect = rectToPdf(g, { x: pts[1].x, y: pts[1].y, width: a.text ? a.text.length * 8 + 20 : 100, height: 24 });\n const bbox: PdfRect = [Math.min(s.x, boxRect[0]), Math.min(s.y, boxRect[1]), Math.max(e.x, boxRect[2]), Math.max(e.y, boxRect[3])];\n return `<freetext${common(bbox)}${strokeAttrs} IT=\"FreeTextCallout\" callout=\"${fmt(s.x)},${fmt(s.y)},${fmt(e.x)},${fmt(e.y)}\" subject=\"Callout\">${contentsElement(a.text)}${defaultStyle(a, 14)}${tail({ box: boxRect })}</freetext>`;\n }\n case 'note':\n return `<text${common(rectToPdf(g, { x: a.x, y: a.y, width: 24, height: 24 }))}${attr('color', color)} icon=\"Comment\" subject=\"Sticky Note\">${contentsElement(a.text)}${tail()}</text>`;\n case 'link': {\n const url = a.linkUrl ?? '';\n const action = url.startsWith('#page=')\n ? `<OnActivation><Action Trigger=\"U\"><GoTo><Dest><Fit Page=\"${Math.max(0, (parseInt(url.slice(6), 10) || 1) - 1)}\"/></Dest></GoTo></Action></OnActivation>`\n : url\n ? `<OnActivation><Action Trigger=\"U\"><URI Name=\"${escapeXml(url)}\"/></Action></OnActivation>`\n : '';\n return `<link${common()}${attr('color', color)} subject=\"Link\">${action}${contentsElement(a.text)}${tail()}</link>`;\n }\n case 'signature':\n return `<stamp${common()} subject=\"Signature\">${a.imageUrl ? `<imagedata>${escapeXml(a.imageUrl)}</imagedata>` : ''}${tail({ signer: a.signer, signType: a.signType, timestamp: a.timestamp })}</stamp>`;\n case 'digital_signature_placeholder':\n return `<stamp${common()} subject=\"Digital Signature\">${tail({ signer: a.signer, timestamp: a.timestamp })}</stamp>`;\n case 'opaque':\n return a.rawXfdf ?? '';\n default:\n return '';\n }\n}\n\nfunction boundsOf(points: AnnotationPoint[], pad = 0) {\n const xs = points.map((p) => p.x);\n const ys = points.map((p) => p.y);\n const half = pad / 2;\n const x = Math.min(...xs) - half;\n const y = Math.min(...ys) - half;\n return { x, y, width: Math.max(...xs) - x + half, height: Math.max(...ys) - y + half };\n}\n\n/** Serialize annotations to a complete XFDF document. */\nexport async function annotationsToXfdf(annotations: Annotation[], resolve: GeometryResolver, opts: XfdfExportOptions = {}): Promise<string> {\n const list = opts.annotList ?? annotations;\n const fragments = await Promise.all(list.map((a) => annotationToXfdfFragment(a, resolve, opts)));\n return (\n `<?xml version=\"1.0\" encoding=\"UTF-8\"?>` +\n `<xfdf xmlns=\"${XFDF_NS}\" xml:space=\"preserve\"><annots>${fragments.filter(Boolean).join('')}</annots></xfdf>`\n );\n}\n\n// ---- import -----------------------------------------------------------------------------------\n\nfunction collectExtras(el: Element): Annotation['xfdfExtras'] {\n const attrs: Record<string, string> = {};\n for (const a of Array.from(el.attributes)) {\n if (!OWNED_ATTRS.has(a.name) && !a.name.startsWith('xmlns')) attrs[a.name] = a.value;\n }\n const children: string[] = [];\n for (const c of Array.from(el.children)) {\n if (!OWNED_CHILDREN.has(c.localName)) children.push(new XMLSerializer().serializeToString(c));\n }\n // Keep Apryse custom data that is not ours (e.g. teamsyncId) verbatim.\n const custom = Array.from(el.children).find((c) => c.localName === 'trn-custom-data');\n if (custom) {\n try {\n const parsed = JSON.parse(custom.getAttribute('bytes') || '{}');\n if (parsed && typeof parsed === 'object') {\n const rest = { ...parsed };\n delete rest[CUSTOM_KEY];\n if (Object.keys(rest).length > 0) {\n children.push(`<trn-custom-data bytes=\"${escapeXml(JSON.stringify(rest))}\"/>`);\n }\n }\n } catch {\n children.push(new XMLSerializer().serializeToString(custom));\n }\n }\n const out: Annotation['xfdfExtras'] = {};\n if (Object.keys(attrs).length) out.attrs = attrs;\n if (children.length) out.children = children;\n return Object.keys(out).length ? out : undefined;\n}\n\nfunction childText(el: Element, name: string): string | undefined {\n const c = Array.from(el.children).find((x) => x.localName === name);\n return c?.textContent ?? undefined;\n}\n\nfunction baseFromElement(el: Element, g: PageGeometry): Omit<AnnotationInput, 'type'> & { id: string } {\n const rectNums = parseNumbers(el.getAttribute('rect'));\n const rect = rectNums.length === 4 ? rectFromPdf(g, [rectNums[0], rectNums[1], rectNums[2], rectNums[3]]) : { x: 0, y: 0, width: 0, height: 0 };\n const custom = readCustomData(el);\n const color = toHexColor(el.getAttribute('color') || el.getAttribute('interior-color') || undefined) ?? '#000000';\n const opacityAttr = el.getAttribute('opacity');\n const opacity = opacityAttr !== null && Number.isFinite(Number(opacityAttr)) ? Number(opacityAttr) : 1;\n const widthAttr = el.getAttribute('width');\n const strokeWidth = typeof custom.strokeWidth === 'number' ? custom.strokeWidth : widthAttr !== null && Number.isFinite(Number(widthAttr)) ? Number(widthAttr) : 1;\n const flags = (el.getAttribute('flags') || '').toLowerCase();\n const readOnly = flags.includes('readonly') || flags.includes('locked');\n return {\n id: el.getAttribute('name') || newAnnotationId(),\n pageIndex: (parseInt(el.getAttribute('page') || '0', 10) || 0) + 1,\n x: rect.x,\n y: rect.y,\n width: rect.width,\n height: rect.height,\n color,\n strokeWidth,\n opacity,\n author: el.getAttribute('title') || undefined,\n authorId: typeof custom.authorId === 'string' ? custom.authorId : undefined,\n createdAt: fromPdfDate(el.getAttribute('creationdate')),\n modifiedAt: fromPdfDate(el.getAttribute('date')),\n readOnly: readOnly || undefined,\n xfdfExtras: collectExtras(el),\n };\n}\n\nfunction elementToAnnotation(el: Element, g: PageGeometry): Annotation | null {\n const kind = el.localName.toLowerCase();\n const custom = readCustomData(el);\n const base = baseFromElement(el, g);\n\n const opaque = (): Annotation => ({\n ...base,\n type: 'opaque',\n opaqueKind: kind,\n rawXfdf: new XMLSerializer().serializeToString(el),\n xfdfExtras: undefined,\n });\n\n switch (kind) {\n case 'square':\n return { ...base, type: 'rectangle' };\n case 'circle':\n return { ...base, type: 'ellipse' };\n case 'line': {\n const s = parseNumbers(el.getAttribute('start'));\n const e = parseNumbers(el.getAttribute('end'));\n const head = (el.getAttribute('head') || 'None').toLowerCase();\n const tailAttr = (el.getAttribute('tail') || 'None').toLowerCase();\n if (s.length < 2 || e.length < 2) return opaque();\n const [ps, pe] = pathFromPdf(g, [{ x: s[0], y: s[1] }, { x: e[0], y: e[1] }]);\n const bounds = boundsOf([ps, pe]);\n const isArrow = head !== 'none' || tailAttr !== 'none';\n return { ...base, ...bounds, type: isArrow ? 'arrow' : 'line', points: [ps, pe] };\n }\n case 'ink': {\n const gestures = Array.from(el.getElementsByTagName('*')).filter((n) => n.localName === 'gesture');\n const strokes = gestures.map((ge) => pathFromPdf(g, parsePoints(ge.textContent))).filter((st) => st.length > 0);\n if (strokes.length === 0) return opaque();\n const all = strokes.flat();\n return { ...base, ...boundsOf(all), type: 'freehand', points: strokes[0], strokes };\n }\n case 'highlight':\n case 'underline':\n case 'strikeout':\n case 'squiggly': {\n const quads = parseNumbers(el.getAttribute('coords'));\n const rects = quads.length >= 8 ? quadPointsToRects(g, quads) : [{ x: base.x, y: base.y, width: base.width, height: base.height }];\n const bbox = unionRects(rects);\n const type = kind as 'highlight' | 'underline' | 'strikeout' | 'squiggly';\n const defaultOpacity = type === 'highlight' ? 0.5 : 1;\n return {\n ...base,\n ...bbox,\n type,\n rects: rects.length > 1 ? rects : undefined,\n opacity: base.opacity === 1 && type === 'highlight' ? 0.5 : (base.opacity ?? defaultOpacity)\n };\n }\n case 'freetext': {\n const text = childText(el, 'contents') ?? '';\n const it = el.getAttribute('IT') || '';\n const callout = parseNumbers(el.getAttribute('callout'));\n if (it === 'FreeTextCallout' || custom.type === 'callout' || callout.length >= 4) {\n const pts = callout.length >= 4 ? pathFromPdf(g, [{ x: callout[0], y: callout[1] }, { x: callout[2], y: callout[3] }]) : [{ x: base.x, y: base.y }, { x: base.x, y: base.y }];\n return { ...base, type: 'callout', text, points: pts, x: pts[1].x, y: pts[1].y, width: Math.max(100, text.length * 8 + 20), height: 30 };\n }\n return { ...base, type: 'text', text, width: Math.max(base.width, 100), height: Math.max(base.height, 30) };\n }\n case 'text':\n return { ...base, type: 'note', text: childText(el, 'contents') ?? '', width: 24, height: 24 };\n case 'link': {\n const uri = Array.from(el.getElementsByTagName('*')).find((n) => n.localName === 'URI');\n const fit = Array.from(el.getElementsByTagName('*')).find((n) => n.localName === 'Fit' || n.localName === 'XYZ' || n.localName === 'FitH');\n let linkUrl = uri?.getAttribute('Name') ?? '';\n if (!linkUrl && fit) linkUrl = `#page=${(parseInt(fit.getAttribute('Page') || '0', 10) || 0) + 1}`;\n return { ...base, type: 'link', linkUrl, text: childText(el, 'contents') ?? '', color: 'transparent', strokeWidth: 0, opacity: 1, points: [] };\n }\n case 'stamp': {\n const image = childText(el, 'imagedata');\n if (custom.type === 'digital_signature_placeholder') {\n return { ...base, type: 'digital_signature_placeholder', signer: typeof custom.signer === 'string' ? custom.signer : undefined, timestamp: typeof custom.timestamp === 'number' ? custom.timestamp : undefined };\n }\n if (image) {\n return { ...base, type: 'signature', imageUrl: image, signer: typeof custom.signer === 'string' ? custom.signer : undefined, timestamp: typeof custom.timestamp === 'number' ? custom.timestamp : undefined };\n }\n return opaque();\n }\n default:\n return opaque();\n }\n}\n\n/**\n * Parse an XFDF document OR bare annotation elements (a concatenation of fragments) into\n * annotations. Unknown elements become `opaque` (re-exported verbatim).\n */\n/** Remove every `<?xml … ?>` declaration (linear scan — no regex backtracking on hostile input). */\nfunction stripXmlDeclarations(input: string): string {\n let out = '';\n let pos = 0;\n for (;;) {\n const start = input.indexOf('<?xml', pos);\n if (start === -1) break;\n const end = input.indexOf('?>', start + 5);\n if (end === -1) break;\n out += input.slice(pos, start);\n pos = end + 2;\n }\n return out + input.slice(pos);\n}\n\nexport async function parseXfdf(xml: string, resolve: GeometryResolver): Promise<Annotation[]> {\n // Hosts may store one full XFDF document per annotation and concatenate them inside an\n // envelope, so XML declarations can appear anywhere and <xfdf>/<annots> wrappers can nest.\n // Strip every declaration and collect annotation elements from every <annots> at any depth.\n const cleaned = stripXmlDeclarations(xml).trim();\n if (!cleaned) return [];\n // XFDF never carries a DTD; refuse one outright (entity expansion / external entity tricks).\n if (/<!DOCTYPE|<!ENTITY/i.test(cleaned)) {\n throw new Error('[teamsync-pdf-viewer] invalid XFDF: DOCTYPE/ENTITY declarations are not allowed');\n }\n // Parsed as application/xml: the parser is inert (no script execution, no resource loading)\n // and the resulting DOM is only read as data.\n const wrapped = `<xfdf xmlns=\"${XFDF_NS}\"><annots>${cleaned}</annots></xfdf>`;\n const doc = new DOMParser().parseFromString(wrapped, 'application/xml');\n const error = doc.getElementsByTagName('parsererror')[0];\n if (error) throw new Error(`[teamsync-pdf-viewer] invalid XFDF: ${error.textContent?.slice(0, 200)}`);\n\n const WRAPPERS = new Set(['xfdf', 'annots', 'fields', 'f', 'ids']);\n const elements = Array.from(doc.getElementsByTagName('*')).filter(\n (n) => n.parentElement?.localName === 'annots' && !WRAPPERS.has(n.localName)\n );\n const out: Annotation[] = [];\n for (const el of elements) {\n const page = (parseInt(el.getAttribute('page') || '0', 10) || 0) + 1;\n const g = await resolve(page);\n const ann = elementToAnnotation(el, g);\n if (ann) out.push(ann);\n }\n return out;\n}\n","/**\n * © 2026 AngelBot Ai Pvt Ltd. All rights reserved.\n * AnnotationManager — the canonical annotation list of a viewer instance.\n *\n * Responsibilities:\n * - single source of truth for the annotation list (React reads it via subscribe/getSnapshot)\n * - undo / redo history for user edits\n * - granular `annotationChanged` events (`add` | `modify` | `delete`, with an `imported` flag)\n * mirroring Apryse's annotationManager so host persistence bridges are near drop-in\n * - authorship stamping and edit permissions (read-only viewer, read-only annotation, other\n * author's annotation) enforced centrally in `commit()`\n * - XFDF import / export through `annotations/xfdf.ts` + `annotations/geometry.ts`\n */\nimport type { PDFDocumentProxy } from 'pdfjs-dist';\nimport type { Annotation, AnnotationInput } from './types';\nimport { newAnnotationId } from './ids';\nimport { createGeometryResolver, type GeometryResolver } from './geometry';\nimport { annotationsToXfdf, annotationToXfdfFragment, parseXfdf, type XfdfExportOptions } from './xfdf';\n\nexport type AnnotationAction = 'add' | 'modify' | 'delete';\n\nexport interface AnnotationChangedEvent {\n annotations: Annotation[];\n action: AnnotationAction;\n /** True when the change came from importAnnotations()/programmatic APIs flagged as imported. */\n imported: boolean;\n}\n\nexport interface CommitOptions {\n /** Mark the change as an import round-trip (not persisted by host bridges, not undoable). */\n imported?: boolean;\n /** Bypass read-only / authorship checks (programmatic host operations). */\n force?: boolean;\n /** Record in the undo history (default: true unless imported). */\n undoable?: boolean;\n}\n\nexport interface ViewerUserInfo {\n id?: string;\n name?: string;\n}\n\ntype ChangedListener = (event: AnnotationChangedEvent) => void;\n\n/** One undoable user action, recorded as the operations it performed (not a snapshot), so undo\n * and redo leave annotations imported in between untouched. */\ninterface HistoryEntry {\n added: Annotation[];\n modified: Array<{ before: Annotation; after: Annotation }>;\n deleted: Annotation[];\n}\n\nconst MAX_HISTORY = 100;\nconst nowIso = () => new Date().toISOString();\n\nexport class AnnotationManager {\n private list: Annotation[] = [];\n private past: HistoryEntry[] = [];\n private future: HistoryEntry[] = [];\n private changedListeners = new Set<ChangedListener>();\n private listListeners = new Set<() => void>();\n private user: ViewerUserInfo = {};\n private readOnly = false;\n private canEditOthers = false;\n private resolver: GeometryResolver | null = null;\n\n // ---- document / user / permissions ------------------------------------------------------\n\n setDocument(doc: PDFDocumentProxy | null): void {\n this.resolver = doc ? createGeometryResolver(doc) : null;\n }\n\n hasDocument(): boolean {\n return this.resolver !== null;\n }\n\n setCurrentUser(name: string, id?: string): void {\n this.user = { name, id: id ?? this.user.id };\n }\n\n setCurrentUserInfo(user: ViewerUserInfo | undefined): void {\n this.user = { ...(user ?? {}) };\n }\n\n getCurrentUser(): string {\n return this.user.name ?? '';\n }\n\n getCurrentUserInfo(): ViewerUserInfo {\n return { ...this.user };\n }\n\n setReadOnly(readOnly: boolean): void {\n this.readOnly = readOnly;\n }\n\n isReadOnly(): boolean {\n return this.readOnly;\n }\n\n /** Allow editing/deleting annotations authored by other users (default false). */\n setCanEditOthers(value: boolean): void {\n this.canEditOthers = value;\n }\n\n /** Whether the current user may modify or delete this annotation through the UI. */\n canEdit(a: Annotation): boolean {\n if (this.readOnly || a.readOnly || a.type === 'opaque') return false;\n if (this.canEditOthers) return true;\n if (!a.authorId && !a.author) return true; // unattributed (legacy / local draft)\n if (a.authorId) return Boolean(this.user.id) && a.authorId === this.user.id;\n return Boolean(this.user.name) && a.author === this.user.name;\n }\n\n canAdd(): boolean {\n return !this.readOnly;\n }\n\n // ---- reading --------------------------------------------------------------------------------\n\n /** The current list. The array reference is stable until the next change. */\n getAnnotationsList(): Annotation[] {\n return this.list;\n }\n\n getAnnotationById(id: string): Annotation | undefined {\n return this.list.find((a) => a.id === id);\n }\n\n /** React `useSyncExternalStore` pair. */\n subscribe = (listener: () => void): (() => void) => {\n this.listListeners.add(listener);\n return () => { this.listListeners.delete(listener); };\n };\n\n getSnapshot = (): Annotation[] => this.list;\n\n addEventListener(type: 'annotationChanged', listener: ChangedListener): () => void {\n if (type !== 'annotationChanged') return () => {};\n this.changedListeners.add(listener);\n return () => this.removeEventListener(type, listener);\n }\n\n removeEventListener(type: 'annotationChanged', listener: ChangedListener): void {\n if (type !== 'annotationChanged') return;\n this.changedListeners.delete(listener);\n }\n\n /** Apryse-compat no-op: React re-renders from the list. */\n drawAnnotationsFromList(_annotations: Annotation[]): void {}\n\n // ---- history --------------------------------------------------------------------------------\n\n get canUndo(): boolean {\n return this.past.length > 0;\n }\n\n get canRedo(): boolean {\n return this.future.length > 0;\n }\n\n undo(): boolean {\n const entry = this.past.pop();\n if (!entry) return false;\n const addedIds = new Set(entry.added.map((a) => a.id));\n const before = new Map(entry.modified.map((m) => [m.after.id, m.before]));\n const next = this.list.filter((a) => !addedIds.has(a.id)).map((a) => before.get(a.id) ?? a);\n for (const d of entry.deleted) if (!next.some((a) => a.id === d.id)) next.push(d);\n this.future.unshift(entry);\n this.apply(next, { force: true, undoable: false, imported: false, keepHistory: true });\n return true;\n }\n\n redo(): boolean {\n const entry = this.future.shift();\n if (!entry) return false;\n const deletedIds = new Set(entry.deleted.map((a) => a.id));\n const after = new Map(entry.modified.map((m) => [m.before.id, m.after]));\n const next = this.list.filter((a) => !deletedIds.has(a.id)).map((a) => after.get(a.id) ?? a);\n for (const ad of entry.added) if (!next.some((a) => a.id === ad.id)) next.push(ad);\n this.past.push(entry);\n this.apply(next, { force: true, undoable: false, imported: false, keepHistory: true });\n return true;\n }\n\n // ---- mutation ---------------------------------------------------------------------------------\n\n /**\n * Replace the whole list (the UI's edit path). Diffs against the current list, enforces\n * permissions (rejected edits keep the previous version), records history and emits one\n * `annotationChanged` event per action.\n */\n commit(next: Annotation[], opts: CommitOptions = {}): Annotation[] {\n return this.apply(next, { ...opts, keepHistory: false });\n }\n\n addAnnotations(inputs: AnnotationInput[], opts: CommitOptions = {}): Annotation[] {\n const withIds = inputs.map((i) => ({ ...i, id: i.id ?? newAnnotationId() }) as Annotation);\n this.commit([...this.list, ...withIds], opts);\n return withIds.map((a) => this.getAnnotationById(a.id)).filter((a): a is Annotation => Boolean(a));\n }\n\n updateAnnotation(id: string, patch: Partial<AnnotationInput>, opts: CommitOptions = {}): Annotation | undefined {\n const existing = this.getAnnotationById(id);\n if (!existing) return undefined;\n this.commit(this.list.map((a) => (a.id === id ? { ...a, ...patch, id } : a)), opts);\n return this.getAnnotationById(id);\n }\n\n deleteAnnotations(targets: Array<Annotation | string>, opts: CommitOptions = {}): void {\n const ids = new Set(targets.map((t) => (typeof t === 'string' ? t : t.id)));\n this.commit(this.list.filter((a) => !ids.has(a.id)), opts);\n }\n\n /** Remove every annotation (e.g. on document switch). Not undoable, emits deletes as imported. */\n clear(): void {\n this.past = [];\n this.future = [];\n this.apply([], { imported: true, force: true, undoable: false, keepHistory: false });\n }\n\n // ---- XFDF -------------------------------------------------------------------------------------\n\n /**\n * Import an XFDF document or bare fragments. Annotations whose `name` already exists are\n * replaced (modify), new ones added; the change is flagged `imported` and is not undoable.\n * Returns the imported annotations as they now exist in the list.\n */\n async importAnnotations(xfdf: string): Promise<Annotation[]> {\n const resolver = this.requireResolver();\n const parsed = await parseXfdf(xfdf, resolver);\n if (parsed.length === 0) return [];\n const incoming = new Map(parsed.map((a) => [a.id, a]));\n const merged = this.list.map((a) => incoming.get(a.id) ?? a);\n for (const a of parsed) if (!this.list.some((x) => x.id === a.id)) merged.push(a);\n this.commit(merged, { imported: true, force: true, undoable: false });\n return parsed.map((a) => this.getAnnotationById(a.id)).filter((a): a is Annotation => Boolean(a));\n }\n\n /**\n * Export as XFDF. With `annotList`, returns the bare fragment(s) for those annotations (the\n * form hosts persist per annotation); without it, a complete XFDF document.\n */\n async exportAnnotations(opts: XfdfExportOptions = {}): Promise<string> {\n const resolver = this.requireResolver();\n if (opts.annotList) {\n const parts = await Promise.all(opts.annotList.map((a) => annotationToXfdfFragment(a, resolver, opts)));\n return parts.join('');\n }\n return annotationsToXfdf(this.list, resolver, opts);\n }\n\n /** Legacy bespoke JSON export (pre-1.2 `exportAnnotations()` shape). */\n exportAnnotationsLegacyJson(): string {\n return JSON.stringify(this.list, null, 2);\n }\n\n // ---- internals ----------------------------------------------------------------------------------\n\n private requireResolver(): GeometryResolver {\n if (!this.resolver) throw new Error('[teamsync-pdf-viewer] no document loaded — XFDF needs page geometry');\n return this.resolver;\n }\n\n private apply(next: Annotation[], opts: CommitOptions & { keepHistory: boolean }): Annotation[] {\n const prev = this.list;\n const imported = Boolean(opts.imported);\n const force = Boolean(opts.force);\n const prevById = new Map(prev.map((a) => [a.id, a]));\n const nextIds = new Set(next.map((a) => a.id));\n\n const added: Annotation[] = [];\n const modified: Annotation[] = [];\n const modifiedPairs: Array<{ before: Annotation; after: Annotation }> = [];\n const deleted: Annotation[] = [];\n const finalList: Annotation[] = [];\n\n for (const a of next) {\n const p = prevById.get(a.id);\n if (!p) {\n if (!imported && !force && this.readOnly) continue; // reject: viewer is read-only\n const stamped = this.stampNew(a, imported);\n added.push(stamped);\n finalList.push(stamped);\n } else if (p !== a) {\n if (!imported && !force && !this.canEdit(p)) {\n finalList.push(p); // reject the edit, keep the previous version\n continue;\n }\n const m: Annotation = imported ? a : { ...a, modifiedAt: nowIso() };\n modified.push(m);\n modifiedPairs.push({ before: p, after: m });\n finalList.push(m);\n } else {\n finalList.push(a);\n }\n }\n for (const p of prev) {\n if (nextIds.has(p.id)) continue;\n if (!imported && !force && !this.canEdit(p)) {\n finalList.push(p); // reject the deletion\n continue;\n }\n deleted.push(p);\n }\n\n if (added.length === 0 && modified.length === 0 && deleted.length === 0) {\n // Nothing effectively changed (all edits rejected or identical list): keep the reference.\n return this.list;\n }\n\n if (!opts.keepHistory && (opts.undoable ?? !imported)) {\n this.past.push({ added, modified: modifiedPairs, deleted });\n if (this.past.length > MAX_HISTORY) this.past.shift();\n this.future = [];\n }\n\n this.list = finalList;\n for (const l of Array.from(this.listListeners)) {\n try { l(); } catch (err) { console.error('[teamsync-pdf-viewer] list listener threw', err); }\n }\n if (added.length) this.emit({ annotations: added, action: 'add', imported });\n if (modified.length) this.emit({ annotations: modified, action: 'modify', imported });\n if (deleted.length) this.emit({ annotations: deleted, action: 'delete', imported });\n return this.list;\n }\n\n private stampNew(a: Annotation, imported: boolean): Annotation {\n if (imported) return a;\n const created = a.createdAt ?? nowIso();\n return {\n ...a,\n author: a.author ?? this.user.name,\n authorId: a.authorId ?? this.user.id,\n createdAt: created,\n modifiedAt: a.modifiedAt ?? created,\n };\n }\n\n private emit(event: AnnotationChangedEvent): void {\n for (const l of Array.from(this.changedListeners)) {\n try { l(event); } catch (err) { console.error('[teamsync-pdf-viewer] annotationChanged listener threw', err); }\n }\n }\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 { AnnotationManager } from '../annotations/AnnotationManager';\nimport { createGeometryResolver } from '../annotations/geometry';\nimport type { Redaction, WatermarkOptions, ViewerEventMap, ViewerEventType, TransientHighlight } from './types';\nimport { searchPdfText, type SearchResult } from '../hooks/usePdfSearch';\nimport { copyTextToClipboard } from '../utils/clipboardUtils';\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 goToPage(pageNumber: number, options?: { smooth?: boolean }): void;\n getTransientHighlights(): TransientHighlight[];\n setTransientHighlights(highlights: TransientHighlight[]): 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 /** Annotation list, history, permissions and XFDF import/export. */\n readonly annotationManager: AnnotationManager;\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, annotationManager: AnnotationManager = new AnnotationManager()) {\n this.bus = bus;\n this.annotationManager = annotationManager;\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 /** Navigate to a specific page number (1-based). */\n goToPage(pageNumber: number, options: { smooth?: boolean } = {}): void {\n const b = this.binding;\n if (b) {\n b.goToPage(pageNumber, options);\n } else {\n this.bus.emit('action-go-to-page', { page: pageNumber, smooth: options.smooth });\n }\n }\n\n /** Set the current page number (1-based). Alias of goToPage. */\n setCurrentPage(pageNumber: number): void {\n this.goToPage(pageNumber);\n }\n\n /**\n * Search the document for text matches, returning snippets and page bounding boxes.\n */\n async searchText(query: string): Promise<SearchResult[]> {\n const pdf = this.getPdfDocument();\n if (!pdf) return [];\n const b = this.binding;\n const redactions = b ? b.getRedactions() : [];\n return searchPdfText(pdf, query, redactions);\n }\n\n // ---- transient highlights (citations, search matches) -----------------------------------\n\n /** Get the current list of transient highlights. */\n getTransientHighlights(): TransientHighlight[] {\n return this.binding?.getTransientHighlights() ?? [];\n }\n\n /**\n * Set transient visual highlights across one or more pages.\n * These render directly on the PDF canvas but are NEVER saved into AnnotationManager\n * or exported to XFDF.\n */\n setTransientHighlights(highlights: TransientHighlight[]): void {\n const b = this.binding;\n if (b) {\n b.setTransientHighlights(highlights);\n } else {\n this.bus.emit('action-set-transient-highlights', { highlights });\n }\n this.bus.emit('transientHighlightsChanged', { highlights });\n }\n\n /** Add a single transient highlight to the current list. */\n addTransientHighlight(highlight: TransientHighlight): void {\n const current = this.getTransientHighlights();\n this.setTransientHighlights([...current, highlight]);\n }\n\n /** Clear all active transient highlights. */\n clearTransientHighlights(): void {\n this.setTransientHighlights([]);\n }\n\n /**\n * Search for a snippet or citation query, scroll to its page, and highlight it temporarily.\n * Returns the matched SearchResult or null if not found.\n */\n async highlightSnippet(\n query: string,\n options: { pageIndex?: number; pulse?: boolean; scrollTo?: boolean; color?: string; tooltip?: string } = {}\n ): Promise<SearchResult | null> {\n const results = await this.searchText(query);\n let match = results[0];\n if (options.pageIndex) {\n match = results.find(r => r.pageIndex === options.pageIndex) || match;\n }\n if (!match) return null;\n\n const highlight: TransientHighlight = {\n id: match.id,\n pageIndex: match.pageIndex,\n bounds: match.bounds,\n color: options.color || 'rgba(250, 204, 21, 0.45)',\n borderColor: 'rgba(234, 179, 8, 0.85)',\n pulse: options.pulse !== false,\n tooltip: options.tooltip || match.snippet,\n };\n\n this.setTransientHighlights([highlight]);\n\n if (options.scrollTo !== false) {\n this.goToPage(match.pageIndex, { smooth: true });\n }\n\n return match;\n }\n\n // ---- annotations / export --------------------------------------------------------------\n\n getAnnotations(): Annotation[] {\n return this.annotationManager.getAnnotationsList();\n }\n\n /** Print the exported document (annotations, redactions and watermark baked in). */\n print(): void {\n this.bus.emit('action-print');\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 getPageGeometry: pdf ? createGeometryResolver(pdf) : undefined,\n annotations: this.annotationManager.getAnnotationsList(),\n redactions: b.getRedactions(),\n watermark: b.getWatermark(),\n signerName: b.getCurrentUserName(),\n },\n options\n );\n }\n\n /**\n * Returns the currently selected text string from the document viewer, or an empty string if nothing is selected.\n */\n getSelectedText(): string {\n if (typeof window === 'undefined') return '';\n const selection = window.getSelection();\n return selection ? selection.toString() : '';\n }\n\n /**\n * Copies the currently selected text to the system clipboard.\n * Resolves to true if copying succeeded, false otherwise.\n */\n async copySelectedText(): Promise<boolean> {\n const text = this.getSelectedText();\n if (!text) return false;\n const success = await copyTextToClipboard(text);\n if (success) {\n this.bus.emit('textCopied', { text });\n }\n return success;\n }\n\n // ---- legacy facade ---------------------------------------------------------------------\n\n readonly UI = {\n /** Theming is not implemented; kept for API compatibility. */\n setTheme: (_theme: string) => {},\n goToPage: (pageNumber: number) => this.goToPage(pageNumber),\n setCurrentPageNumber: (pageNumber: number) => this.goToPage(pageNumber),\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) => {\n let normalizedTool: any = tool;\n if (tool && (tool.toLowerCase() === 'select' || tool.toLowerCase() === 'textselect')) {\n normalizedTool = 'select';\n } else if (tool && tool.toLowerCase() === 'pan') {\n normalizedTool = 'pan';\n }\n this.bus.emit('action-set-tool', { tool: normalizedTool });\n },\n getSelectedText: () => this.getSelectedText(),\n copySelectedText: () => this.copySelectedText(),\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 startCompare: (docA: any, docB: any, options?: any) => {\n if (typeof window !== 'undefined') {\n window.dispatchEvent(new CustomEvent('action-start-compare', { detail: { docA, docB, options } }));\n }\n },\n stopCompare: () => {\n if (typeof window !== 'undefined') {\n window.dispatchEvent(new CustomEvent('action-stop-compare'));\n }\n },\n setCompareMode: (mode: 'overlay' | 'side-by-side' | 'semantic') => {\n if (typeof window !== 'undefined') {\n window.dispatchEvent(new CustomEvent('action-set-compare-mode', { detail: { mode } }));\n }\n },\n setCompareColors: (colorA: string, colorB: string) => {\n if (typeof window !== 'undefined') {\n window.dispatchEvent(new CustomEvent('action-set-compare-colors', { detail: { colorA, colorB } }));\n }\n },\n };\n\n readonly Core = ((self: WebViewerInstance) => ({\n /** The real AnnotationManager (XFDF import/export, granular events, permissions). */\n get annotationManager(): AnnotationManager {\n return self.annotationManager;\n },\n documentViewer: {\n addEventListener: (event: string, callback: (detail: unknown) => void): (() => void) =>\n self.bus.on(event, callback),\n removeEventListener: (event: string, callback: (detail: unknown) => void): void =>\n self.bus.off(event, callback),\n getCurrentPage: (): number => self.getCurrentPage(),\n getPageCount: (): number => self.getPageCount(),\n goToPage: (pageNumber: number): void => self.goToPage(pageNumber),\n setCurrentPage: (pageNumber: number): void => self.goToPage(pageNumber),\n setCurrentPageNumber: (pageNumber: number): void => self.goToPage(pageNumber),\n getDocument: () => ({\n getFileData: (options?: ExportOptions) => self.getFileData(options),\n }),\n },\n }))(this);\n}\n","/**\n * © 2026 AngelBot Ai Pvt Ltd. All rights reserved.\n * Printing: the exported document (annotations / redactions / watermark baked in) is loaded into a\n * hidden iframe and printed through the browser's PDF viewer. Falls back to opening the PDF in a\n * new tab when the frame cannot print (e.g. the browser has no inline PDF viewer).\n */\nexport interface PrintOptions {\n title?: string;\n /** How long the hidden frame is kept alive for the print dialog (default 60s). */\n timeoutMs?: number;\n}\n\nexport async function printPdfBytes(bytes: Uint8Array, opts: PrintOptions = {}): Promise<void> {\n if (typeof document === 'undefined') throw new Error('[teamsync-pdf-viewer] printing needs a browser');\n const blob = new Blob([bytes as BlobPart], { type: 'application/pdf' });\n const url = URL.createObjectURL(blob);\n const iframe = document.createElement('iframe');\n iframe.style.cssText = 'position:fixed;right:0;bottom:0;width:0;height:0;border:0;visibility:hidden;';\n iframe.title = opts.title ?? 'Print';\n iframe.setAttribute('aria-hidden', 'true');\n\n await new Promise<void>((resolve, reject) => {\n let settled = false;\n const cleanup = () => {\n iframe.remove();\n URL.revokeObjectURL(url);\n };\n const finish = () => {\n if (settled) return;\n settled = true;\n setTimeout(cleanup, opts.timeoutMs ?? 60000);\n resolve();\n };\n iframe.onload = () => {\n try {\n const w = iframe.contentWindow;\n if (!w) throw new Error('no frame window');\n w.focus();\n w.print();\n } catch {\n // No inline PDF viewer (or it refused): let the user print from a new tab instead.\n window.open(url, '_blank', 'noopener');\n }\n finish();\n };\n iframe.onerror = () => {\n cleanup();\n if (!settled) {\n settled = true;\n reject(new Error('[teamsync-pdf-viewer] print frame failed to load'));\n }\n };\n document.body.appendChild(iframe);\n iframe.src = url;\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 { AnnotationManager } from '../annotations/AnnotationManager';\nimport { printPdfBytes } from '../core/print';\nimport { useShortcuts, matchShortcut } from '../hooks/useShortcuts';\nimport type { WebViewerOptions, SDKPermissions, Redaction, TransientHighlight } from '../core/types';\nimport type { Annotation } from '../annotations/types';\nimport { calculateNextZoomIn, calculateNextZoomOut, clampScale, MIN_SCALE, MAX_SCALE } from '../utils/zoomUtils';\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 whenever any page canvas has finished rendering. */\n onPageRendered?: (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 /** Fires whenever transient highlights change. */\n onTransientHighlightsChange?: (highlights: TransientHighlight[]) => void;\n /** Fires whenever the user selects text within the document. */\n onTextSelected?: (info: { text: string }) => void;\n /** Fires whenever text is copied from the document. */\n onTextCopied?: (info: { text: string }) => void;\n className?: string;\n style?: React.CSSProperties;\n}\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, page, transientHighlights: propTransientHighlights,\n 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, hideAnnotationsUntilPageRendered = true,\n enableTextSelection = true, defaultTool = 'select', showSelectionTooltip = true,\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 annotationManager = useMemo(() => new AnnotationManager(), []);\n const instanceRef = useRef<WebViewerInstance | null>(null);\n if (!instanceRef.current) instanceRef.current = new WebViewerInstance(bus, annotationManager);\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 // Keep the manager's user / permission state in sync with props.\n const currentUserId = props.currentUser?.id;\n const currentUserName = props.currentUser?.name;\n useEffect(() => {\n annotationManager.setCurrentUserInfo(currentUserId || currentUserName ? { id: currentUserId, name: currentUserName } : undefined);\n }, [annotationManager, currentUserId, currentUserName]);\n useEffect(() => {\n annotationManager.setReadOnly(readOnly);\n }, [annotationManager, readOnly]);\n useEffect(() => {\n annotationManager.setCanEditOthers(Boolean(permissions?.canEditOthers));\n }, [annotationManager, permissions?.canEditOthers]);\n\n // Annotations belong to a document: drop them when a different document is requested.\n useEffect(() => {\n annotationManager.clear();\n annotationManager.setDocument(null);\n }, [annotationManager, docUrl]);\n\n // Relay granular manager events to the instance bus (`instance.on('annotationChanged', ...)`).\n useEffect(() => annotationManager.addEventListener('annotationChanged', (e) => bus.emit('annotationChanged', e)), [annotationManager, bus]);\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 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 // Transient highlights (citations, search matches)\n const [internalTransientHighlights, setInternalTransientHighlights] = useState<TransientHighlight[]>([]);\n const transientHighlights = useMemo(() => {\n return propTransientHighlights ?? internalTransientHighlights;\n }, [propTransientHighlights, internalTransientHighlights]);\n const transientHighlightsRef = useRef(transientHighlights);\n transientHighlightsRef.current = transientHighlights;\n\n const setTransientHighlights = useCallback((highlights: TransientHighlight[]) => {\n setInternalTransientHighlights(highlights);\n latest.current.onTransientHighlightsChange?.(highlights);\n }, []);\n\n useEffect(() => {\n instance._bind(\n {\n getAnnotations: () => annotationManager.getAnnotationsList(),\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 goToPage: (pageNum: number, options?: { smooth?: boolean }) => {\n bus.emit('action-go-to-page', { page: pageNum, smooth: options?.smooth });\n },\n getTransientHighlights: () => transientHighlightsRef.current,\n setTransientHighlights,\n },\n rootRef.current\n );\n return () => instance._unbind();\n }, [instance, annotationManager, loadDocument, bus, setTransientHighlights]);\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-print', async () => {\n try {\n const data = await instance.getFileData();\n await printPdfBytes(data, { title: latest.current.fileName });\n } catch (err) {\n console.error('[teamsync-pdf-viewer] print failed', err);\n bus.emit('action-print-error', { error: err });\n }\n }),\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 bus.on<{ highlights: TransientHighlight[] }>('action-set-transient-highlights', (d) => {\n setTransientHighlights(d?.highlights ?? []);\n }),\n bus.on('action-clear-transient-highlights', () => {\n setTransientHighlights([]);\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 bus.on<{ text: string }>('action-text-selected', (d) => {\n bus.emit('textSelected', { text: d.text });\n latest.current.onTextSelected?.({ text: d.text });\n }),\n bus.on<{ text: string }>('action-text-copied', (d) => {\n bus.emit('textCopied', { text: d.text });\n latest.current.onTextCopied?.({ text: d.text });\n }),\n ];\n return () => offs.forEach((off) => off());\n }, [bus, instance, setTransientHighlights]);\n\n // ---- DocumentViewer callbacks ----------------------------------------------------------------\n const handleDocumentLoaded = useCallback(\n (doc: pdfjsLib.PDFDocumentProxy, url: string) => {\n pdfDocRef.current = doc;\n annotationManager.setDocument(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, annotationManager]\n );\n\n const handleLoadError = useCallback(\n (error: Error, info: DocumentLoadErrorInfo) => {\n pdfDocRef.current = null;\n annotationManager.setDocument(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, annotationManager]\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 handlePageRendered = useCallback(\n (pageNumber: number) => {\n const url = docUrlRef.current ?? '';\n bus.emit('pageRendered', { url, pageNumber });\n latest.current.onPageRendered?.({ 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 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 const { getCommand } = useShortcuts();\n const fileInputRef = useRef<HTMLInputElement>(null);\n\n const openSearchSidebar = useCallback(() => {\n if (sidebars) {\n setRightSidebarOpen(true);\n setSidebarTab('Search');\n setTimeout(() => bus.emit('action-focus-search'), 50);\n }\n }, [sidebars, bus]);\n\n const openFilePicker = useCallback(() => {\n fileInputRef.current?.click();\n }, []);\n\n useEffect(() => {\n const offSearch = bus.on('action-open-search', openSearchSidebar);\n const offFilePicker = bus.on('action-open-file-picker', openFilePicker);\n return () => {\n offSearch();\n offFilePicker();\n };\n }, [bus, openSearchSidebar, openFilePicker]);\n\n // Focus root element on mount if document is not currently focused elsewhere\n useEffect(() => {\n if (rootRef.current && (document.activeElement === document.body || !document.activeElement)) {\n rootRef.current.focus({ preventScroll: true });\n }\n }, []);\n\n // Global window keydown fallback so shortcuts fire reliably\n useEffect(() => {\n const handleGlobalKeyDown = (e: KeyboardEvent) => {\n const target = e.target as HTMLElement | null;\n if (\n target?.tagName === 'INPUT' ||\n target?.tagName === 'TEXTAREA' ||\n target?.isContentEditable\n ) {\n return;\n }\n\n const root = rootRef.current;\n if (!root) return;\n\n if (\n document.activeElement === document.body ||\n document.activeElement === document.documentElement ||\n document.activeElement === null ||\n root.contains(document.activeElement)\n ) {\n if (!root.contains(document.activeElement)) {\n if (matchShortcut(e, getCommand('SEARCH'))) {\n e.preventDefault();\n openSearchSidebar();\n return;\n }\n if (matchShortcut(e, getCommand('FILE_PICKER'))) {\n e.preventDefault();\n openFilePicker();\n return;\n }\n bus.emit('viewer-keydown', e);\n }\n }\n };\n\n window.addEventListener('keydown', handleGlobalKeyDown);\n return () => {\n window.removeEventListener('keydown', handleGlobalKeyDown);\n };\n }, [bus, getCommand, openSearchSidebar, openFilePicker]);\n\n // ---- root element handlers -------------------------------------------------------------------\n const handleRootKeyDownCapture = (e: React.KeyboardEvent<HTMLDivElement>) => {\n if (matchShortcut(e.nativeEvent, getCommand('SEARCH'))) {\n e.preventDefault();\n openSearchSidebar();\n return;\n }\n if (matchShortcut(e.nativeEvent, getCommand('FILE_PICKER'))) {\n e.preventDefault();\n openFilePicker();\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 if (tab === 'Search') {\n setTimeout(() => bus.emit('action-focus-search'), 50);\n }\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) => calculateNextZoomIn(s))}\n onZoomOut={() => setScale((s) => calculateNextZoomOut(s))}\n onZoomSet={(s) => setScale(clampScale(s))}\n onOpenFile={openFilePicker}\n onDownload={() => bus.emit('action-download')}\n onFullScreen={toggleFullscreen}\n onSaveAs={() => bus.emit('action-download')}\n onPrint={() => bus.emit('action-print')}\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 <input\n ref={fileInputRef}\n type=\"file\"\n accept=\"application/pdf\"\n style={{ display: 'none' }}\n onChange={(e) => {\n const file = e.target.files?.[0];\n if (file) {\n const url = URL.createObjectURL(file);\n loadDocument(url);\n }\n e.target.value = '';\n }}\n aria-hidden=\"true\"\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 annotationManager={annotationManager}\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 onPageRendered={handlePageRendered}\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 page={page}\n transientHighlights={transientHighlights}\n permissions={effectivePermissions}\n hideAnnotationsUntilPageRendered={hideAnnotationsUntilPageRendered}\n enableTextSelection={enableTextSelection}\n defaultTool={defaultTool}\n showSelectionTooltip={showSelectionTooltip}\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":"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"}
1
+ {"version":3,"file":"teamsync-pdf-viewer.js","names":[],"sources":["../src/core/busContext.ts","../src/hooks/useViewerBus.ts","../src/utils/zoomUtils.ts","../src/components/Header.tsx","../src/components/AnnotationContextMenu.tsx","../src/components/InsertLinkModal.tsx","../src/hooks/useShortcuts.ts","../src/utils/pageText.ts","../src/hooks/usePdfSearch.ts","../src/components/Sidebar.tsx","../src/components/LeftSidebar.tsx","../src/utils/rotationUtils.ts","../src/components/PageRenderer.tsx","../src/annotations/ids.ts","../src/utils/clipboardUtils.ts","../src/components/TextSelectionTooltip.tsx","../src/utils/findRegexRedactions.ts","../src/utils/layoutUtils.ts","../src/core/pdfAssets.ts","../src/components/DiffHighlightOverlay.tsx","../src/components/SideBySideViewer.tsx","../src/components/CompareToolbar.tsx","../src/components/DiffSummarySidebar.tsx","../src/components/CompareCurtainSlider.tsx","../src/utils/pdfDiffEngine.ts","../src/components/DocumentViewer.tsx","../src/components/SettingsModal.tsx","../src/components/AboutModal.tsx","../src/core/eventBus.ts","../src/annotations/geometry.ts","../src/core/export.ts","../src/annotations/xfdf.ts","../src/annotations/AnnotationManager.ts","../src/core/ViewerInstance.ts","../src/core/print.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 */\n\nexport const MIN_SCALE = 0.1;\nexport const MAX_SCALE = 8.0;\n\nexport const isMobileOrTablet = (): boolean =>\n typeof navigator !== 'undefined' && (\n /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini|Mobile|Tablet/i.test(navigator.userAgent) ||\n (/^((?!chrome|android).)*safari/i.test(navigator.userAgent))\n );\n\nexport const isSafariOrMobile = isMobileOrTablet;\n\nexport const MAX_CANVAS_DIM = 4096;\nexport const MAX_CANVAS_DIM_MOBILE = 2048;\nexport const MAX_CANVAS_PIXELS = 8388608; // 8.4 Megapixels (~32MB RGBA texture buffer)\nexport const MAX_CANVAS_PIXELS_MOBILE = 4194304; // 4.2 Megapixels (~16MB RGBA texture buffer)\n\n/**\n * Calculates the next step when zooming in.\n * - Below 200%: steps by +25%\n * - 200% to 500%: steps by +50%\n * - 500% to 800%: steps by +100%\n */\nexport function calculateNextZoomIn(currentScale: number, maxScale = MAX_SCALE): number {\n const step = currentScale < 2 ? 0.25 : currentScale < 5 ? 0.5 : 1.0;\n return Math.min(maxScale, Math.round((currentScale + step) * 100) / 100);\n}\n\n/**\n * Calculates the next step when zooming out.\n * - At or below 200%: steps by -25%\n * - 200% to 500%: steps by -50%\n * - Above 500%: steps by -100%\n */\nexport function calculateNextZoomOut(currentScale: number, minScale = MIN_SCALE): number {\n const step = currentScale <= 2 ? 0.25 : currentScale <= 5 ? 0.5 : 1.0;\n return Math.max(minScale, Math.round((currentScale - step) * 100) / 100);\n}\n\n/**\n * Clamps and rounds a requested zoom level within [minScale, maxScale].\n */\nexport function clampScale(scale: number, minScale = MIN_SCALE, maxScale = MAX_SCALE): number {\n return Math.min(maxScale, Math.max(minScale, Math.round(scale * 100) / 100));\n}\n\n/**\n * Calculates the safe rasterization scale for PDF.js viewport rendering so that\n * canvas dimensions and texture memory stay strictly within hardware limits.\n */\nexport function calculateSafeRenderScale(\n scale: number,\n outputScale: number,\n unscaledWidth: number,\n unscaledHeight: number,\n maxDim = isMobileOrTablet() ? MAX_CANVAS_DIM_MOBILE : MAX_CANVAS_DIM,\n maxPixels = isMobileOrTablet() ? MAX_CANVAS_PIXELS_MOBILE : MAX_CANVAS_PIXELS\n): number {\n let renderScale = scale * outputScale;\n if (unscaledWidth * renderScale > maxDim) {\n renderScale = maxDim / unscaledWidth;\n }\n if (unscaledHeight * renderScale > maxDim) {\n renderScale = maxDim / unscaledHeight;\n }\n if ((unscaledWidth * renderScale) * (unscaledHeight * renderScale) > maxPixels) {\n renderScale = Math.sqrt(maxPixels / (unscaledWidth * unscaledHeight));\n }\n return renderScale;\n}\n\nexport interface ScrollCompensationParams {\n prevScale: number;\n newScale: number;\n containerWidth: number;\n containerHeight: number;\n currentScrollLeft: number;\n currentScrollTop: number;\n basePageWidth: number;\n focusPoint?: { vx: number | null; vy: number | null } | null;\n isProgrammatic?: boolean;\n}\n\nexport interface ScrollPosition {\n scrollLeft: number;\n scrollTop: number;\n}\n\n/**\n * Calculates compensating scroll offsets during scale changes.\n * Prevents view jumping or pushing page 1 down on initial fit or programmatic fit.\n */\nexport function calculateScrollCompensation(params: ScrollCompensationParams): ScrollPosition {\n const {\n prevScale,\n newScale,\n containerWidth: cW,\n containerHeight: cH,\n currentScrollLeft,\n currentScrollTop,\n basePageWidth: baseW,\n focusPoint,\n isProgrammatic = false,\n } = params;\n\n // On programmatic fit (e.g. fit-width, fit-page, initial document fit),\n // do not run user-driven center-zoom compensation.\n if (isProgrammatic) {\n return {\n scrollLeft: 0,\n scrollTop: currentScrollTop <= 1 ? 0 : currentScrollTop,\n };\n }\n\n const hasFocusPoint = focusPoint?.vx != null && focusPoint?.vy != null;\n\n // If user is at the top of the document (scrollTop <= 0) and no explicit focus point was set:\n // Keep the top of the page pinned to the top rather than pushing it down into negative space.\n if (!hasFocusPoint && currentScrollTop <= 0) {\n return {\n scrollLeft: 0,\n scrollTop: 0,\n };\n }\n\n const vx = hasFocusPoint ? focusPoint!.vx! : cW / 2;\n const vy = hasFocusPoint ? focusPoint!.vy! : cH / 2;\n\n const x = vx + currentScrollLeft;\n const y = vy + currentScrollTop;\n\n const pLeft1 = Math.max(0, cW / 2 - (baseW * prevScale) / 2);\n const pLeft2 = Math.max(0, cW / 2 - (baseW * newScale) / 2);\n\n const pageX = x - pLeft1;\n const newPageX = pageX * (newScale / prevScale);\n const newX = pLeft2 + newPageX;\n\n return {\n scrollLeft: Math.max(0, newX - vx),\n scrollTop: Math.max(0, (y * (newScale / prevScale)) - vy),\n };\n}\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, MousePointer, 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, Layers, FolderOpen\n} from 'lucide-react';\n\nimport type { SDKPermissions } from '../core/types';\nimport type { ViewerPlugin } from '../plugins/types';\nimport { useViewerBus, useBusEvent } from '../hooks/useViewerBus';\nimport { MIN_SCALE, MAX_SCALE } from '../utils/zoomUtils';\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 onOpenFile?: () => void;\n onDownload: () => void;\n onFullScreen: () => void;\n onSaveAs: () => void;\n onPrint?: () => 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 onOpenFile,\n onDownload, onFullScreen, onSaveAs, onPrint, 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>('select');\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 {onOpenFile && (\n <MenuOption icon={<FolderOpen size={16} />} label=\"Open PDF...\" onClick={() => { onOpenFile(); setIsMenuOpen(false); }} />\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={!onPrint} onClick={() => { onPrint?.(); setIsMenuOpen(false); }} />\n <div style={{ height: '1px', backgroundColor: 'var(--border-color)', margin: '4px 0' }} />\n <MenuOption icon={<Layers size={16} color=\"#0284c7\" />} label=\"Compare PDF (Demo)\" onClick={() => { window.dispatchEvent(new CustomEvent('action-start-compare', { detail: { docA: '/sample_v1.pdf', docB: '/sample_v2.pdf', options: { mode: 'overlay' } } })); setIsMenuOpen(false); }} />\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.25, 0.5, 0.75, 1, 1.25, 1.5, 2, 3, 4, 5, 8].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 \n icon={<MinusCircle size={18} color={scale <= MIN_SCALE ? 'var(--border-color)' : 'var(--text-muted)'} />} \n title=\"Zoom Out\" \n onClick={onZoomOut} \n disabled={scale <= MIN_SCALE}\n />\n <IconButton \n icon={<PlusCircle size={18} color={scale >= MAX_SCALE ? 'var(--border-color)' : 'var(--text-muted)'} />} \n title=\"Zoom In\" \n onClick={onZoomIn} \n disabled={scale >= MAX_SCALE}\n />\n </div>\n <div style={{ width: '1px', height: '24px', backgroundColor: 'var(--border-color)', margin: '0 4px' }} />\n <IconButton icon={<MousePointer size={18} />} title=\"Select Text\" active={headerTool === 'select'} onClick={() => bus.emit('action-set-tool', { tool: 'select' })} />\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, disabled = false, title }: { icon: React.ReactNode, onClick?: () => void, active?: boolean, disabled?: boolean, title?: string }) {\n return (\n <button \n title={title}\n onClick={disabled ? undefined : onClick}\n disabled={disabled}\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: disabled ? 'not-allowed' : 'pointer',\n opacity: disabled ? 0.4 : 1,\n outline: 'none',\n userSelect: 'none',\n WebkitUserSelect: 'none',\n }}\n onMouseOver={(e) => {\n if (!active && !disabled) e.currentTarget.style.backgroundColor = 'var(--hover-bg)';\n }}\n onMouseOut={(e) => {\n if (!active && !disabled) 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, useCallback } from 'react';\n\nexport type ActionType =\n | 'ROTATE_CW'\n | 'ROTATE_CCW'\n | 'UNDO'\n | 'REDO'\n | 'DELETE'\n | 'COPY'\n | 'PASTE'\n | 'FILE_PICKER'\n | 'SEARCH';\n\nexport interface Shortcut {\n action: ActionType;\n description: string;\n defaultCommand: string;\n command: string;\n}\n\nexport const 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\nconst STORAGE_KEY = 'pdfviewer_shortcuts';\nconst CHANGE_EVENT = 'pdfviewer-shortcuts-changed';\n\nlet cachedShortcuts: Shortcut[] | null = null;\nconst listeners = new Set<() => void>();\n\nexport function loadStoredShortcuts(): Shortcut[] {\n if (typeof window === 'undefined' || !window.localStorage) return DEFAULT_SHORTCUTS;\n try {\n const saved = window.localStorage.getItem(STORAGE_KEY);\n if (saved) {\n const parsed = JSON.parse(saved);\n if (Array.isArray(parsed)) {\n return DEFAULT_SHORTCUTS.map(def => {\n const found = parsed.find((p: Shortcut) => p && p.action === def.action);\n return found && typeof found.command === 'string' ? { ...def, command: found.command } : def;\n });\n }\n }\n } catch {\n // ignore parse errors\n }\n return DEFAULT_SHORTCUTS;\n}\n\nfunction notifySubscribers() {\n listeners.forEach(fn => fn());\n if (typeof window !== 'undefined') {\n window.dispatchEvent(new CustomEvent(CHANGE_EVENT));\n }\n}\n\nexport function useShortcuts() {\n const [shortcuts, setShortcuts] = useState<Shortcut[]>(() => {\n if (!cachedShortcuts) cachedShortcuts = loadStoredShortcuts();\n return cachedShortcuts;\n });\n\n useEffect(() => {\n const sync = () => {\n cachedShortcuts = loadStoredShortcuts();\n setShortcuts(cachedShortcuts);\n };\n\n listeners.add(sync);\n if (typeof window !== 'undefined') {\n window.addEventListener('storage', sync);\n window.addEventListener(CHANGE_EVENT, sync);\n }\n\n return () => {\n listeners.delete(sync);\n if (typeof window !== 'undefined') {\n window.removeEventListener('storage', sync);\n window.removeEventListener(CHANGE_EVENT, sync);\n }\n };\n }, []);\n\n const updateShortcut = useCallback((action: ActionType, newCommand: string) => {\n const base = cachedShortcuts || loadStoredShortcuts();\n const updated = base.map(s => s.action === action ? { ...s, command: newCommand } : s);\n cachedShortcuts = updated;\n if (typeof window !== 'undefined' && window.localStorage) {\n window.localStorage.setItem(STORAGE_KEY, JSON.stringify(updated));\n }\n setShortcuts(updated);\n notifySubscribers();\n }, []);\n\n const resetShortcuts = useCallback(() => {\n cachedShortcuts = DEFAULT_SHORTCUTS;\n if (typeof window !== 'undefined' && window.localStorage) {\n window.localStorage.removeItem(STORAGE_KEY);\n }\n setShortcuts(DEFAULT_SHORTCUTS);\n notifySubscribers();\n }, []);\n\n const getCommand = useCallback((action: ActionType): string => {\n const list = cachedShortcuts || shortcuts;\n const s = list.find(item => item.action === action);\n return s ? s.command : '';\n }, [shortcuts]);\n\n return { shortcuts, updateShortcut, resetShortcuts, getCommand };\n}\n\nexport interface ParsedCommand {\n meta: boolean;\n shift: boolean;\n alt: boolean;\n key: string;\n}\n\nexport function parseCommandString(commandString: string): ParsedCommand {\n if (!commandString) return { meta: false, shift: false, alt: false, key: '' };\n\n const rawTokens = commandString.split('+');\n let meta = false;\n let shift = false;\n let alt = false;\n const keyTokens: string[] = [];\n\n for (let i = 0; i < rawTokens.length; i++) {\n const raw = rawTokens[i].trim();\n const lower = raw.toLowerCase();\n\n if (lower === 'meta' || lower === 'cmd' || lower === 'ctrl' || lower === 'command' || lower === 'control') {\n meta = true;\n } else if (lower === 'shift') {\n shift = true;\n } else if (lower === 'alt' || lower === 'option') {\n alt = true;\n } else if (raw === '' && i > 0 && rawTokens[i - 1] === '') {\n // Handles '+' key when split by '+' e.g. \"Meta++\" or \"Meta+Shift++\"\n keyTokens.push('+');\n } else if (raw !== '') {\n keyTokens.push(raw);\n }\n }\n\n if (commandString.endsWith('+') && keyTokens.length === 0) {\n keyTokens.push('+');\n }\n\n return { meta, shift, alt, key: keyTokens.join('+').toLowerCase() };\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 const parsed = parseCommandString(commandString);\n\n const isMetaPressed = Boolean(e.metaKey || e.ctrlKey);\n if (parsed.meta !== isMetaPressed) return false;\n if (parsed.alt !== Boolean(e.altKey)) return false;\n\n const eventKey = (e.key || '').toLowerCase();\n const targetKey = parsed.key.toLowerCase();\n\n // Delete & Backspace mapping (interchangeable for DELETE action)\n if (targetKey === 'delete' || targetKey === 'backspace') {\n if (parsed.shift !== Boolean(e.shiftKey)) return false;\n return eventKey === 'delete' || eventKey === 'backspace';\n }\n\n // Plus & Equals: on US layout '+' is Shift+'='\n if (targetKey === '=' || targetKey === '+') {\n const isKeyEqualOrPlus = eventKey === '=' || eventKey === '+' || e.code === 'Equal' || e.code === 'NumpadAdd';\n if (!isKeyEqualOrPlus) return false;\n if (parsed.shift && !e.shiftKey) return false;\n if (!parsed.shift && targetKey === '=' && e.shiftKey) return false;\n return true;\n }\n\n // Minus & Underscore: on US layout '_' is Shift+'-'\n if (targetKey === '-' || targetKey === '_') {\n const isKeyMinus = eventKey === '-' || eventKey === '_' || e.code === 'Minus' || e.code === 'NumpadSubtract';\n if (!isKeyMinus) return false;\n if (parsed.shift && !e.shiftKey) return false;\n if (!parsed.shift && targetKey === '-' && e.shiftKey) return false;\n return true;\n }\n\n // Check shift requirement\n if (parsed.shift !== Boolean(e.shiftKey)) return false;\n\n // Direct key or code match\n if (eventKey === targetKey) return true;\n if (e.code && e.code.toLowerCase() === `key${targetKey}`) return true;\n if (e.code && e.code.toLowerCase() === `digit${targetKey}`) return true;\n\n return false;\n}\n","/**\n * © 2026 AngelBot Ai Pvt Ltd. All rights reserved.\n * Shared page text builder and coordinate interpolator for PDF search and redaction.\n */\nimport type { SearchBounds } from '../core/types';\n\nexport interface PageText {\n fullText: string;\n itemIndices: number[];\n charIndices: number[];\n normText: string;\n normToRaw: number[];\n}\n\n/**\n * Collapses any consecutive whitespace runs to a single space and trims edges.\n */\nexport function collapseWhitespace(s: string): string {\n return s.replace(/\\s+/g, ' ').trim();\n}\n\n/**\n * Builds raw page text with item/char index source-mapping, followed by a second pass\n * creating normalized text (collapsing any maximal whitespace run to a single space)\n * and a 1-to-1 index map back to raw string indices.\n */\nexport function buildPageText(items: any[]): PageText {\n let fullText = '';\n const itemIndices: number[] = [];\n const charIndices: number[] = [];\n\n // Pass 1: Build raw fullText with item and char index sentinels\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 // Pass 2: Collapse maximal runs of /\\s/ into a single ' ' pointing to the run's first raw index\n let normText = '';\n const normToRaw: number[] = [];\n\n let i = 0;\n while (i < fullText.length) {\n const char = fullText[i];\n if (/\\s/.test(char)) {\n const runStart = i;\n while (i < fullText.length && /\\s/.test(fullText[i])) {\n i++;\n }\n normText += ' ';\n normToRaw.push(runStart);\n } else {\n normText += char;\n normToRaw.push(i);\n i++;\n }\n }\n\n return {\n fullText,\n itemIndices,\n charIndices,\n normText,\n normToRaw,\n };\n}\n\n/**\n * Computes bounding boxes in PDF coordinate points for a matched range [rawStart, rawEndExcl) in fullText.\n * Separator sentinels (-1) are skipped, and character positions are interpolated across each TextItem.\n */\nexport function boundsForRawRange(\n items: any[],\n pageText: Pick<PageText, 'itemIndices' | 'charIndices'>,\n rawStart: number,\n rawEndExcl: number\n): SearchBounds[] {\n const { itemIndices, charIndices } = pageText;\n const itemMatches = new Map<number, { min: number; max: number }>();\n\n for (let i = rawStart; i < rawEndExcl; 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 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 return bounds;\n}\n","/**\n * © 2026 AngelBot Ai Pvt Ltd. All rights reserved.\n */\nimport { useState, useCallback } from 'react';\nimport type * as pdfjsLib from 'pdfjs-dist';\nimport type { Redaction, SearchBounds } from '../core/types';\n\nimport { buildPageText, collapseWhitespace, boundsForRawRange } from '../utils/pageText';\n\nexport type { SearchBounds };\n\nexport interface SearchResult {\n id: string;\n pageIndex: number;\n snippet: string;\n matchStartIndex: number;\n matchLength: number;\n bounds: SearchBounds[];\n}\n\n/**\n * Standalone asynchronous text search across all pages (or specified pages) of a PDFDocumentProxy.\n * Sanitizes redacted regions and returns matching snippets and bounding boxes.\n */\nexport async function searchPdfText(\n pdfDoc: pdfjsLib.PDFDocumentProxy,\n query: string,\n redactions: Redaction[] = [],\n onProgress?: (progress: number) => void,\n pages?: number[]\n): Promise<SearchResult[]> {\n if (!pdfDoc || !query.trim()) return [];\n\n const results: SearchResult[] = [];\n const qn = collapseWhitespace(query).toLowerCase();\n if (!qn) return [];\n\n const numPages = pdfDoc.numPages;\n let targetPages: number[];\n if (pages !== undefined) {\n const deduped = Array.from(new Set(pages));\n targetPages = deduped\n .filter(p => Number.isInteger(p) && p >= 1 && p <= numPages)\n .sort((a, b) => a - b);\n if (targetPages.length === 0) {\n onProgress?.(100);\n return [];\n }\n } else {\n targetPages = Array.from({ length: numPages }, (_, i) => i + 1);\n }\n\n const batchSize = 10;\n\n for (let batchStart = 0; batchStart < targetPages.length; batchStart += batchSize) {\n const batchPages = targetPages.slice(batchStart, batchStart + batchSize);\n const batchPromises = batchPages.map(pageNum =>\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 const pageText = buildPageText(items);\n const { fullText, normText, normToRaw } = pageText;\n const lowerNormText = normText.toLowerCase();\n let n = 0;\n const pageResults: SearchResult[] = [];\n\n while ((n = lowerNormText.indexOf(qn, n)) !== -1) {\n const rawStart = normToRaw[n];\n const rawEndExcl = normToRaw[n + qn.length - 1] + 1;\n const snippetStart = Math.max(0, rawStart - 30);\n const snippetEnd = Math.min(fullText.length, rawEndExcl + 30);\n const snippet = fullText.substring(snippetStart, snippetEnd).replace(/\\n/g, ' ');\n\n const bounds = boundsForRawRange(items, pageText, rawStart, rawEndExcl);\n\n pageResults.push({\n id: `p${pageNum}-idx${rawStart}`,\n pageIndex: pageNum,\n snippet,\n matchStartIndex: rawStart - snippetStart,\n matchLength: rawEndExcl - rawStart,\n bounds,\n });\n\n n += qn.length;\n }\n\n page.cleanup?.();\n return pageResults;\n })()\n );\n\n const batchResultsArray = await Promise.all(batchPromises);\n batchResultsArray.forEach(pageResults => results.push(...pageResults));\n\n onProgress?.(Math.round(((batchStart + batchPages.length) / targetPages.length) * 100));\n // Yield to main thread to allow UI to render progress bar\n await new Promise(resolve => setTimeout(resolve, 10));\n }\n\n // Stable sort by pageIndex maintains sequential page order and ascending intra-page order\n results.sort((a, b) => a.pageIndex - b.pageIndex);\n\n return results;\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(\n async (query: string) => {\n if (!pdfDoc || !query.trim()) {\n setSearchResults([]);\n return;\n }\n\n setIsSearching(true);\n setSearchProgress(0);\n\n try {\n const results = await searchPdfText(pdfDoc, query, redactions, p => setSearchProgress(p));\n setSearchResults(results);\n } catch (error) {\n console.error('Search error:', error);\n } finally {\n setIsSearching(false);\n setSearchProgress(100);\n }\n },\n [pdfDoc, redactions]\n );\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 useEffect(() => {\n if (isOpen && activeTab === 'Search') {\n const timer = setTimeout(() => {\n searchInputRef.current?.focus();\n searchInputRef.current?.select();\n }, 50);\n return () => clearTimeout(timer);\n }\n }, [isOpen, activeTab]);\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 onKeyDown={e => {\n if (e.key === 'Enter') {\n e.preventDefault();\n onSearch(searchQuery);\n }\n }}\n style={{\n width: '100%',\n padding: '8px 32px 8px 36px',\n border: '1px solid var(--border-color)',\n borderRadius: '4px',\n fontSize: '13px',\n outline: 'none',\n boxSizing: 'border-box'\n }}\n />\n {searchQuery && (\n <button \n onClick={() => {\n setSearchQuery('');\n onSearch('');\n }}\n style={{\n position: 'absolute',\n right: '10px',\n top: '50%',\n transform: 'translateY(-50%)',\n background: 'none',\n border: 'none',\n cursor: 'pointer',\n padding: 0,\n color: 'var(--text-muted)'\n }}\n title=\"Clear search\"\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 {comment.author && <span style={{ fontSize: '11px', color: 'var(--text-muted)' }}>· {comment.author}</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 = Math.min(window.devicePixelRatio || 1, 2);\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, TransientHighlight } from '../core/types';\nimport type { Annotation } from '../annotations/types';\nimport { getRotationTransform, convertToRotatedRect, normalizeRotation } from '../utils/rotationUtils';\nimport { calculateSafeRenderScale } from '../utils/zoomUtils';\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 transientHighlights?: TransientHighlight[];\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 onAnnotationDoubleClick?: (id: string, e: React.MouseEvent) => void;\n onStartResize?: (id: string, handle: string, e: React.MouseEvent, pageNum: number) => void;\n onStartMove?: (id: string, e: React.MouseEvent, pageNum: number) => 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 /** Whether to hide annotations and transient highlights until the page canvas has finished rendering. Default: true. */\n hideAnnotationsUntilPageRendered?: boolean;\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, transientHighlights,\n onMouseDown, onMouseMove, onMouseUp, onAnnotationClick, onAnnotationDoubleClick, onStartResize, onStartMove,\n onAnnotationMouseEnter, onClearSelection,\n watermark, watermarkText, redactions, onDiscardRedaction, onRendered,\n hideAnnotationsUntilPageRendered = true\n}: PageRendererProps) {\n const onRenderedRef = useRef(onRendered);\n useEffect(() => {\n onRenderedRef.current = onRendered;\n }, [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 hasRenderedOnceRef = useRef(false);\n const [isCanvasRendered, setIsCanvasRendered] = useState(false);\n const [textContent, setTextContent] = useState<any>(null);\n\n const scaledWidth = basePageWidth * scale;\n const scaledHeight = basePageHeight * scale;\n\n const [prevDocAndPage, setPrevDocAndPage] = useState({ pdfDoc, pageNum, rotation });\n if (prevDocAndPage.pdfDoc !== pdfDoc || prevDocAndPage.pageNum !== pageNum || prevDocAndPage.rotation !== rotation) {\n setPrevDocAndPage({ pdfDoc, pageNum, rotation });\n setIsCanvasRendered(false);\n }\n\n useEffect(() => {\n hasRenderedOnceRef.current = false;\n }, [pdfDoc, pageNum, rotation]);\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 try { renderTaskRef.current.cancel(); } catch {}\n renderTaskRef.current = null;\n }\n\n let currentPage: pdfjsLib.PDFPageProxy | null = null;\n try {\n const page = await pdfDoc.getPage(pageNum);\n if (isCancelled) {\n try { page.cleanup?.(); } catch {}\n return;\n }\n currentPage = page;\n pageProxyRef.current = page;\n\n const outputScale = Math.min(window.devicePixelRatio || 1, 2);\n const normalizedRot = normalizeRotation(page.rotate + rotation);\n const unscaledViewport = page.getViewport({ scale: 1.0, rotation: normalizedRot });\n\n let renderScale = calculateSafeRenderScale(\n scale,\n outputScale,\n unscaledViewport.width,\n unscaledViewport.height\n );\n\n let viewport = page.getViewport({ scale: renderScale, rotation: normalizedRot });\n\n const tempCanvas = document.createElement('canvas');\n tempCanvas.width = Math.floor(viewport.width);\n tempCanvas.height = Math.floor(viewport.height);\n let ctx = tempCanvas.getContext('2d');\n if (!ctx) {\n // If GPU canvas memory allocation fails, fall back to safe half scale\n renderScale = renderScale * 0.5;\n viewport = page.getViewport({ scale: renderScale, rotation: normalizedRot });\n tempCanvas.width = Math.floor(viewport.width);\n tempCanvas.height = Math.floor(viewport.height);\n ctx = tempCanvas.getContext('2d');\n }\n if (!ctx || isCancelled) {\n tempCanvas.width = 0;\n tempCanvas.height = 0;\n return;\n }\n\n const renderTask = page.render({\n canvasContext: ctx,\n canvas: tempCanvas,\n viewport: viewport\n });\n renderTaskRef.current = renderTask;\n await renderTask.promise;\n renderTaskRef.current = null;\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 * renderScale;\n const vY = rotRect.y * renderScale;\n const vW = rotRect.width * renderScale;\n const vH = rotRect.height * renderScale;\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 = Math.max(1, 2 * (renderScale / (scale || 1)));\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) * renderScale;\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 * renderScale;\n const stepY = 180 * renderScale;\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 hasRenderedOnceRef.current = true;\n setIsCanvasRendered(true);\n onRenderedRef.current?.(pageNum);\n }\n // Immediately release offscreen canvas GPU texture memory\n tempCanvas.width = 0;\n tempCanvas.height = 0;\n } catch (err: any) {\n if (err?.name !== 'RenderingCancelledException') {\n console.error(`Page ${pageNum} render failed:`, err);\n }\n } finally {\n if (currentPage) {\n try { currentPage.cleanup?.(); } catch {}\n }\n if (pageProxyRef.current === currentPage) {\n pageProxyRef.current = null;\n }\n }\n };\n\n // 0ms on first render, 150ms debounce on subsequent scale changes to allow\n // rapid zoom clicks to scale smoothly at 60 FPS via GPU CSS transforms\n // while PDF.js vector rendering fires once the zoom motion settles.\n const delay = hasRenderedOnceRef.current ? 150 : 0;\n timer = setTimeout(renderCanvas, delay);\n\n return () => {\n isCancelled = true;\n if (timer) clearTimeout(timer);\n if (renderTaskRef.current) {\n try { renderTaskRef.current.cancel(); } catch {}\n renderTaskRef.current = null;\n }\n if (pageProxyRef.current) {\n try { pageProxyRef.current.cleanup?.(); } catch {}\n pageProxyRef.current = null;\n }\n };\n }, [pageNum, pdfDoc, scale, rotation, basePageWidth, basePageHeight, 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 let isCancelled = false;\n\n const renderText = async () => {\n try {\n const page = await pdfDoc.getPage(pageNum);\n if (isCancelled) return;\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 if (isCancelled) return;\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 if (!isCancelled) {\n console.error(\"TextLayer render failed:\", e);\n }\n }\n };\n renderText();\n return () => {\n isCancelled = true;\n };\n }, [textContent, pdfDoc, pageNum, rotation, redactions]);\n const pageAnnotations = annotations.filter(a => a.pageIndex === pageNum);\n const isOverlayVisible = !hideAnnotationsUntilPageRendered || isCanvasRendered;\n\n return (\n <div \n id={`pdf-page-${pageNum}`}\n className=\"pdf-page-container\"\n onClick={() => { if (activeTool === null || activeTool === 'select') 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: (isOverlayVisible && activeTool !== 'pan') ? 'auto' : 'none',\n opacity: isOverlayVisible ? 1 : 0,\n visibility: isOverlayVisible ? 'visible' : 'hidden',\n width: `${basePageWidth}px`,\n height: `${basePageHeight}px`,\n zIndex: 2\n }}\n />\n\n {/* Transient Citation / Search Highlights Layer */}\n {((activeSearchResult && activeSearchResult.pageIndex === pageNum) || (transientHighlights && transientHighlights.length > 0)) && (() => {\n const unW = rotation % 180 === 0 ? basePageWidth : basePageHeight;\n const unH = rotation % 180 === 0 ? basePageHeight : basePageWidth;\n\n return (\n <div style={{\n position: 'absolute', top: 0, left: 0, width: '100%', height: '100%',\n pointerEvents: 'none', zIndex: 6,\n visibility: isOverlayVisible ? 'visible' : 'hidden',\n opacity: isOverlayVisible ? 1 : 0\n }}>\n <style>{`\n @keyframes tspdf-transient-pulse {\n 0% {\n box-shadow: 0 0 0 0 rgba(234, 179, 8, 0.75), 0 0 8px rgba(234, 179, 8, 0.4);\n }\n 50% {\n box-shadow: 0 0 0 6px rgba(234, 179, 8, 0.25), 0 0 18px rgba(234, 179, 8, 0.7);\n }\n 100% {\n box-shadow: 0 0 0 0 rgba(234, 179, 8, 0.75), 0 0 8px rgba(234, 179, 8, 0.4);\n }\n }\n `}</style>\n {/* Active search result */}\n {activeSearchResult && activeSearchResult.pageIndex === pageNum && activeSearchResult.bounds.map((b, idx) => {\n const rot = convertToRotatedRect(b.x, unH - b.y - b.height, b.width, b.height, rotation, unW, unH);\n return (\n <div key={`search-${idx}`} style={{\n position: 'absolute',\n left: `${rot.x * scale}px`,\n top: `${rot.y * scale}px`,\n width: `${rot.width * scale}px`,\n height: `${rot.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 })}\n\n {/* Transient Highlights (Citations, external highlights) */}\n {transientHighlights && transientHighlights.filter(th => th.pageIndex === pageNum).map((th, thIdx) => (\n <React.Fragment key={th.id || `th-${thIdx}`}>\n {th.bounds.map((b, bIdx) => {\n const rot = convertToRotatedRect(b.x, unH - b.y - b.height, b.width, b.height, rotation, unW, unH);\n const bg = th.color || 'rgba(250, 204, 21, 0.45)';\n const border = th.borderColor || 'rgba(234, 179, 8, 0.85)';\n return (\n <div\n key={`th-box-${bIdx}`}\n style={{\n position: 'absolute',\n left: `${rot.x * scale}px`,\n top: `${rot.y * scale}px`,\n width: `${rot.width * scale}px`,\n height: `${rot.height * scale}px`,\n backgroundColor: bg,\n border: `1.5px solid ${border}`,\n borderRadius: '3px',\n animation: th.pulse !== false ? 'tspdf-transient-pulse 2s infinite ease-in-out' : 'none',\n boxShadow: '0 0 6px rgba(234, 179, 8, 0.4)',\n zIndex: 7\n }}\n >\n {th.tooltip && bIdx === 0 && (\n <div style={{\n position: 'absolute',\n bottom: '100%',\n left: '50%',\n transform: 'translateX(-50%)',\n marginBottom: '4px',\n backgroundColor: '#0f172a',\n color: '#ffffff',\n fontSize: '11px',\n fontWeight: 600,\n padding: '3px 8px',\n borderRadius: '4px',\n whiteSpace: 'nowrap',\n boxShadow: '0 2px 8px rgba(0,0,0,0.25)',\n zIndex: 10,\n pointerEvents: 'none'\n }}>\n {th.tooltip.length > 60 ? `${th.tooltip.slice(0, 60)}...` : th.tooltip}\n </div>\n )}\n </div>\n );\n })}\n </React.Fragment>\n ))}\n </div>\n );\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' || activeTool === 'select' || !isOverlayVisible) ? 'none' : 'auto',\n zIndex: 10,\n visibility: isOverlayVisible ? 'visible' : 'hidden',\n opacity: isOverlayVisible ? 1 : 0\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 onDoubleClick: (e: React.MouseEvent) => {\n onAnnotationDoubleClick?.(ann.id, e);\n },\n onMouseDown: (e: React.MouseEvent) => {\n if (isSelected && onStartMove) {\n e.stopPropagation();\n onStartMove(ann.id, e, pageNum);\n }\n },\n style: { \n pointerEvents: 'all' as any,\n cursor: activeTool === 'eraser' ? 'pointer' : (isSelected ? 'move' : '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 const boxW = ann.width && ann.width > 0 ? ann.width : 180;\n const boxH = ann.height && ann.height > 0 ? ann.height : 40;\n shape = (\n <g>\n <rect x={ann.x} y={ann.y} width={boxW} height={boxH} fill=\"transparent\" style={{ pointerEvents: 'all' }} />\n <foreignObject x={ann.x} y={ann.y} width={boxW} height={boxH} style={{ overflow: 'visible', pointerEvents: 'none' }}>\n <div\n style={{\n width: `${boxW}px`,\n minHeight: `${boxH}px`,\n wordBreak: 'break-word',\n overflowWrap: 'break-word',\n whiteSpace: 'pre-wrap',\n color: strokeColor,\n fontSize: '16px',\n fontFamily: 'sans-serif',\n lineHeight: '1.25',\n userSelect: 'none',\n boxSizing: 'border-box',\n padding: '2px 4px'\n }}\n >\n {ann.text}\n </div>\n </foreignObject>\n </g>\n );\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 const hlRects = ann.rects && ann.rects.length > 0 ? ann.rects : [{ x: ann.x, y: ann.y, width: ann.width, height: ann.height }];\n shape = (\n <g style={{ mixBlendMode: 'multiply' }}>\n {hlRects.map((r, i) => (\n <rect key={i} x={r.x} y={r.y} width={r.width} height={r.height} fill={strokeColor} opacity={ann.opacity} />\n ))}\n </g>\n );\n } else if (ann.type === 'underline') {\n const ulRects = ann.rects && ann.rects.length > 0 ? ann.rects : [{ x: ann.x, y: ann.y, width: ann.width, height: ann.height }];\n const th = ann.strokeWidth || 2;\n shape = (\n <g>\n {ulRects.map((r, i) => (\n <React.Fragment key={i}>\n <rect x={r.x} y={r.y} width={r.width} height={r.height} fill=\"transparent\" />\n <line\n x1={r.x}\n y1={r.y + r.height - th / 2}\n x2={r.x + r.width}\n y2={r.y + r.height - th / 2}\n stroke={strokeColor}\n strokeWidth={th}\n strokeLinecap=\"round\"\n />\n </React.Fragment>\n ))}\n </g>\n );\n } else if (ann.type === 'strikeout') {\n const soRects = ann.rects && ann.rects.length > 0 ? ann.rects : [{ x: ann.x, y: ann.y, width: ann.width, height: ann.height }];\n const th = ann.strokeWidth || 2;\n shape = (\n <g>\n {soRects.map((r, i) => (\n <React.Fragment key={i}>\n <rect x={r.x} y={r.y} width={r.width} height={r.height} fill=\"transparent\" />\n <line\n x1={r.x}\n y1={r.y + r.height / 2}\n x2={r.x + r.width}\n y2={r.y + r.height / 2}\n stroke={strokeColor}\n strokeWidth={th}\n strokeLinecap=\"round\"\n />\n </React.Fragment>\n ))}\n </g>\n );\n } else if (ann.type === 'squiggly') {\n const sqRects = ann.rects && ann.rects.length > 0 ? ann.rects : [{ x: ann.x, y: ann.y, width: ann.width, height: ann.height }];\n const th = ann.strokeWidth || 1.5;\n const generateSquigglyD = (x: number, y: number, width: number) => {\n let d = `M ${x} ${y}`;\n const step = 4;\n let up = true;\n for (let cx = x; cx < x + width; cx += step) {\n const nextX = Math.min(cx + step, x + width);\n const midX = cx + (nextX - cx) / 2;\n const dy = up ? -2.5 : 2.5;\n d += ` Q ${midX} ${y + dy}, ${nextX} ${y}`;\n up = !up;\n }\n return d;\n };\n shape = (\n <g>\n {sqRects.map((r, i) => (\n <React.Fragment key={i}>\n <rect x={r.x} y={r.y} width={r.width} height={r.height} fill=\"transparent\" />\n <path\n d={generateSquigglyD(r.x, r.y + r.height - 2, r.width)}\n fill=\"none\"\n stroke={strokeColor}\n strokeWidth={th}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </React.Fragment>\n ))}\n </g>\n );\n } else if (ann.type === 'opaque') {\n // Imported annotation this viewer cannot edit/render natively: outline + kind label.\n shape = (\n <g>\n <rect x={ann.x} y={ann.y} width={ann.width} height={ann.height} fill=\"none\" stroke={strokeColor} strokeWidth=\"1\" strokeDasharray=\"3,2\" opacity={0.8} />\n {ann.opaqueKind && ann.width > 40 && (\n <text x={ann.x + 2} y={ann.y - 2} fill={strokeColor} fontSize=\"8px\" fontFamily=\"sans-serif\" opacity={0.8}>{ann.opaqueKind}</text>\n )}\n </g>\n );\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.strokes?.length || ann.points)) {\n const strokes = ann.strokes && ann.strokes.length > 0 ? ann.strokes : [ann.points ?? []];\n shape = (\n <g style={{ mixBlendMode: blendMode }}>\n {strokes.filter(st => st.length > 0).map((st, i) => {\n const d = `M ${st.map(p => `${p.x},${p.y}`).join(' L ')}`;\n return (\n <React.Fragment key={i}>\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 </React.Fragment>\n );\n })}\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 const w = ann.width && ann.width > 0 ? ann.width : 32;\n const h = ann.height && ann.height > 0 ? ann.height : 32;\n const isResizable = ['text', 'rectangle', 'ellipse', 'highlight', 'underline', 'strikeout', 'squiggly'].includes(ann.type);\n const handleCoords: Record<string, { x: number; y: number; cursor: string }> = {\n nw: { x: ann.x, y: ann.y, cursor: 'nwse-resize' },\n n: { x: ann.x + w / 2, y: ann.y, cursor: 'ns-resize' },\n ne: { x: ann.x + w, y: ann.y, cursor: 'nesw-resize' },\n e: { x: ann.x + w, y: ann.y + h / 2, cursor: 'ew-resize' },\n se: { x: ann.x + w, y: ann.y + h, cursor: 'nwse-resize' },\n s: { x: ann.x + w / 2, y: ann.y + h, cursor: 'ns-resize' },\n sw: { x: ann.x, y: ann.y + h, cursor: 'nesw-resize' },\n w: { x: ann.x, y: ann.y + h / 2, cursor: 'ew-resize' },\n };\n\n return (\n <g className=\"tspdf-annotation-selection\">\n <rect \n x={ann.x - 4} y={ann.y - 4} \n width={w + 8} \n height={h + 8} \n fill=\"none\" stroke=\"var(--primary)\" strokeWidth=\"1.5\" strokeDasharray=\"4\" \n style={{ pointerEvents: 'none' }}\n />\n {!ann.readOnly && isResizable && onStartResize && Object.entries(handleCoords).map(([handleKey, hInfo]) => (\n <rect\n key={handleKey}\n x={hInfo.x - 4}\n y={hInfo.y - 4}\n width={8}\n height={8}\n fill=\"#ffffff\"\n stroke=\"var(--primary)\"\n strokeWidth=\"1.5\"\n rx={1}\n style={{ cursor: hInfo.cursor, pointerEvents: 'all' }}\n onMouseDown={(e) => {\n e.stopPropagation();\n onStartResize(ann.id, handleKey, e, pageNum);\n }}\n />\n ))}\n </g>\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 return prevProps.pageNum === nextProps.pageNum &&\n prevProps.pdfDoc === nextProps.pdfDoc &&\n prevProps.scale === nextProps.scale &&\n prevProps.rotation === nextProps.rotation &&\n prevProps.basePageWidth === nextProps.basePageWidth &&\n prevProps.basePageHeight === nextProps.basePageHeight &&\n prevProps.pageTop === nextProps.pageTop &&\n prevProps.pageLeft === nextProps.pageLeft &&\n prevProps.activeTab === nextProps.activeTab &&\n prevProps.activeTool === nextProps.activeTool &&\n prevProps.selectedAnnotationId === nextProps.selectedAnnotationId &&\n prevProps.activeSearchResult === nextProps.activeSearchResult &&\n prevProps.watermark === nextProps.watermark &&\n prevProps.watermarkText === nextProps.watermarkText &&\n prevProps.redactions === nextProps.redactions &&\n prevProps.annotations === nextProps.annotations &&\n prevProps.transientHighlights === nextProps.transientHighlights &&\n prevProps.hideAnnotationsUntilPageRendered === nextProps.hideAnnotationsUntilPageRendered;\n});\n\nexport default PageRenderer;\n","/**\n * © 2026 AngelBot Ai Pvt Ltd. All rights reserved.\n * Stable, collision-free annotation ids. They double as the XFDF `name` attribute, which hosts use\n * to match persisted rows to live annotations, so they must never be timestamps.\n */\nexport function newAnnotationId(): string {\n if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') {\n return crypto.randomUUID();\n }\n // Fallback for very old runtimes: 128 bits from Math.random, formatted like a UUID v4.\n const hex = Array.from({ length: 32 }, () => Math.floor(Math.random() * 16).toString(16)).join('');\n return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-4${hex.slice(13, 16)}-a${hex.slice(17, 20)}-${hex.slice(20, 32)}`;\n}\n","/**\n * © 2026 AngelBot Ai Pvt Ltd. All rights reserved.\n * Cross-environment clipboard utility with secure and fallback execCommand copying.\n */\n\nexport async function copyTextToClipboard(text: string): Promise<boolean> {\n if (!text) return false;\n\n // Modern asynchronous Clipboard API (supported in secure HTTPS / localhost contexts)\n if (typeof navigator !== 'undefined' && navigator.clipboard && typeof navigator.clipboard.writeText === 'function') {\n try {\n await navigator.clipboard.writeText(text);\n return true;\n } catch {\n // Fallback below if permission was denied or running in an iframe / non-secure context\n }\n }\n\n // Fallback using textarea + document.execCommand('copy')\n if (typeof document !== 'undefined') {\n try {\n const textArea = document.createElement('textarea');\n textArea.value = text;\n textArea.setAttribute('readonly', '');\n textArea.style.contain = 'strict';\n textArea.style.position = 'fixed';\n textArea.style.left = '-9999px';\n textArea.style.top = '-9999px';\n textArea.style.opacity = '0';\n document.body.appendChild(textArea);\n textArea.select();\n textArea.setSelectionRange(0, text.length);\n const successful = document.execCommand('copy');\n document.body.removeChild(textArea);\n return successful;\n } catch (err) {\n console.error('Failed to copy text to clipboard fallback:', err);\n return false;\n }\n }\n\n return false;\n}\n","/**\n * © 2026 AngelBot Ai Pvt Ltd. All rights reserved.\n * Floating quick-action copy pill rendered directly above active text selections.\n */\nimport React, { useEffect, useState, useCallback, useRef } from 'react';\nimport { Copy, Check, Highlighter, Underline, Strikethrough } from 'lucide-react';\nimport { copyTextToClipboard } from '../utils/clipboardUtils';\n\ninterface TextSelectionTooltipProps {\n containerRef: React.RefObject<HTMLDivElement | null>;\n onCopy?: (text: string) => void;\n onAnnotateSelection?: (type: 'highlight' | 'underline' | 'strikeout' | 'squiggly') => void;\n}\n\nexport const TextSelectionTooltip: React.FC<TextSelectionTooltipProps> = ({ containerRef, onCopy, onAnnotateSelection }) => {\n const [selectedText, setSelectedText] = useState<string>('');\n const [position, setPosition] = useState<{ top: number; left: number } | null>(null);\n const [copied, setCopied] = useState<boolean>(false);\n const timeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const updatePosition = useCallback(() => {\n if (typeof window === 'undefined') return;\n const selection = window.getSelection();\n\n if (!selection || selection.isCollapsed || !selection.rangeCount || !containerRef.current) {\n setPosition(null);\n setSelectedText('');\n return;\n }\n\n const range = selection.getRangeAt(0);\n const commonAncestor = range.commonAncestorContainer;\n\n // Verify the selection is inside our viewer container\n if (!containerRef.current.contains(commonAncestor)) {\n setPosition(null);\n setSelectedText('');\n return;\n }\n\n const text = selection.toString().trim();\n if (!text) {\n setPosition(null);\n setSelectedText('');\n return;\n }\n\n const rangeRect = range.getBoundingClientRect();\n if (rangeRect.width === 0 && rangeRect.height === 0) {\n setPosition(null);\n setSelectedText('');\n return;\n }\n\n const containerRect = containerRef.current.getBoundingClientRect();\n const centerX = rangeRect.left + rangeRect.width / 2;\n const relLeft = centerX - containerRect.left + containerRef.current.scrollLeft;\n \n // Position 38px above selection by default; flip below if too close to container top\n let relTop = rangeRect.top - containerRect.top + containerRef.current.scrollTop - 38;\n if (relTop < containerRef.current.scrollTop + 8) {\n relTop = rangeRect.bottom - containerRect.top + containerRef.current.scrollTop + 8;\n }\n\n setSelectedText(text);\n setPosition({ top: relTop, left: relLeft });\n }, [containerRef]);\n\n useEffect(() => {\n const handleSelectionChange = () => {\n // Debounce slightly to let mouse-up complete selection bounding box\n requestAnimationFrame(updatePosition);\n };\n\n document.addEventListener('selectionchange', handleSelectionChange);\n const container = containerRef.current;\n if (container) {\n container.addEventListener('scroll', updatePosition, { passive: true });\n }\n\n return () => {\n document.removeEventListener('selectionchange', handleSelectionChange);\n if (container) {\n container.removeEventListener('scroll', updatePosition);\n }\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n }\n };\n }, [containerRef, updatePosition]);\n\n const handleCopy = async (e: React.MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n\n if (!selectedText) return;\n\n const success = await copyTextToClipboard(selectedText);\n if (success) {\n setCopied(true);\n onCopy?.(selectedText);\n\n if (timeoutRef.current) clearTimeout(timeoutRef.current);\n timeoutRef.current = setTimeout(() => {\n setCopied(false);\n }, 1500);\n }\n };\n\n if (!position || !selectedText) {\n return null;\n }\n\n return (\n <div\n role=\"toolbar\"\n aria-label=\"Selection actions\"\n style={{\n position: 'absolute',\n top: `${position.top}px`,\n left: `${position.left}px`,\n transform: 'translateX(-50%)',\n zIndex: 50,\n display: 'flex',\n alignItems: 'center',\n backgroundColor: '#0f172a',\n borderRadius: '6px',\n padding: '3px 6px',\n boxShadow: '0 4px 14px rgba(0, 0, 0, 0.25), 0 0 0 1px rgba(255, 255, 255, 0.1)',\n pointerEvents: 'auto',\n userSelect: 'none',\n whiteSpace: 'nowrap',\n animation: 'tspdf-fade-in 0.15s ease-out'\n }}\n onMouseDown={(e) => {\n // Prevent clicking the tooltip from clearing the active DOM text selection\n e.preventDefault();\n e.stopPropagation();\n }}\n >\n <style>{`\n @keyframes tspdf-fade-in {\n from { opacity: 0; transform: translate(-50%, 4px); }\n to { opacity: 1; transform: translate(-50%, 0); }\n }\n `}</style>\n <button\n onClick={handleCopy}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: '5px',\n background: 'transparent',\n border: 'none',\n color: copied ? '#4ade80' : '#f8fafc',\n cursor: 'pointer',\n fontSize: '12px',\n fontWeight: 500,\n padding: '3px 6px',\n borderRadius: '4px',\n transition: 'background-color 0.15s, color 0.15s'\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.backgroundColor = 'rgba(255, 255, 255, 0.12)';\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = 'transparent';\n }}\n title=\"Copy selected text\"\n >\n {copied ? <Check size={13} color=\"#4ade80\" /> : <Copy size={13} color=\"#f8fafc\" />}\n <span>{copied ? 'Copied!' : 'Copy'}</span>\n </button>\n\n {onAnnotateSelection && (\n <>\n <div style={{ width: '1px', height: '16px', backgroundColor: 'rgba(255, 255, 255, 0.2)', margin: '0 4px' }} />\n <button\n onClick={(e) => { e.preventDefault(); e.stopPropagation(); onAnnotateSelection('highlight'); }}\n style={{\n display: 'flex', alignItems: 'center', justifyContent: 'center',\n width: '24px', height: '24px', background: 'transparent', border: 'none',\n borderRadius: '4px', cursor: 'pointer', padding: 0\n }}\n onMouseEnter={(e) => { e.currentTarget.style.backgroundColor = 'rgba(255, 255, 255, 0.12)'; }}\n onMouseLeave={(e) => { e.currentTarget.style.backgroundColor = 'transparent'; }}\n title=\"Highlight selected text\"\n >\n <Highlighter size={13} color=\"#fbc02d\" />\n </button>\n <button\n onClick={(e) => { e.preventDefault(); e.stopPropagation(); onAnnotateSelection('underline'); }}\n style={{\n display: 'flex', alignItems: 'center', justifyContent: 'center',\n width: '24px', height: '24px', background: 'transparent', border: 'none',\n borderRadius: '4px', cursor: 'pointer', padding: 0\n }}\n onMouseEnter={(e) => { e.currentTarget.style.backgroundColor = 'rgba(255, 255, 255, 0.12)'; }}\n onMouseLeave={(e) => { e.currentTarget.style.backgroundColor = 'transparent'; }}\n title=\"Underline selected text\"\n >\n <Underline size={13} color=\"#f8fafc\" />\n </button>\n <button\n onClick={(e) => { e.preventDefault(); e.stopPropagation(); onAnnotateSelection('strikeout'); }}\n style={{\n display: 'flex', alignItems: 'center', justifyContent: 'center',\n width: '24px', height: '24px', background: 'transparent', border: 'none',\n borderRadius: '4px', cursor: 'pointer', padding: 0\n }}\n onMouseEnter={(e) => { e.currentTarget.style.backgroundColor = 'rgba(255, 255, 255, 0.12)'; }}\n onMouseLeave={(e) => { e.currentTarget.style.backgroundColor = 'transparent'; }}\n title=\"Strikeout selected text\"\n >\n <Strikethrough size={13} color=\"#f8fafc\" />\n </button>\n <button\n onClick={(e) => { e.preventDefault(); e.stopPropagation(); onAnnotateSelection('squiggly'); }}\n style={{\n display: 'flex', alignItems: 'center', justifyContent: 'center',\n width: '24px', height: '24px', background: 'transparent', border: 'none',\n borderRadius: '4px', cursor: 'pointer', padding: 0\n }}\n onMouseEnter={(e) => { e.currentTarget.style.backgroundColor = 'rgba(255, 255, 255, 0.12)'; }}\n onMouseLeave={(e) => { e.currentTarget.style.backgroundColor = 'transparent'; }}\n title=\"Squiggly underline selected text\"\n >\n <svg width={13} height={13} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#4ade80\" strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M4 18c1.5-2 2.5-2 4 0s2.5 2 4 0 2.5-2 4 0 2.5 2 4 0\" />\n </svg>\n </button>\n </>\n )}\n </div>\n );\n};\nexport default TextSelectionTooltip;\n","/**\n * © 2026 AngelBot Ai Pvt Ltd. All rights reserved.\n */\nimport * as pdfjsLib from 'pdfjs-dist';\nimport type { Redaction } from '../core/types';\nimport { buildPageText } from './pageText';\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 viewport = page.getViewport({ scale: 1 });\n const textContent = await page.getTextContent();\n const items = textContent.items as any[];\n \n const { fullText, itemIndices, charIndices } = buildPageText(items);\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 if (!item || !item.transform) return;\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 = Math.abs(item.transform[3]);\n \n const strLen = (item.str ?? '').length;\n const charWidth = strLen > 0 ? item.width / strLen : item.width;\n \n const startX = tx + (matchInfo.min * charWidth);\n const matchWidth = ((matchInfo.max - matchInfo.min) + 1) * charWidth;\n const matchHeight = item.height || scaleY;\n \n const padding = 2;\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 */\n\nexport interface PageDimension {\n width: number;\n height: number;\n}\n\nexport interface RowLayout {\n heights: number[];\n tops: number[];\n total: number;\n}\n\n/** Standard US Letter dimensions in PDF points (72 points/inch: 8.5 x 11 inches). */\nexport const DEFAULT_FALLBACK_DIMS: PageDimension = { width: 612, height: 792 };\n\n/**\n * Pre-allocates an array of page dimensions for the entire document up front,\n * reserving estimated space based on a sample page (e.g. Page 1).\n */\nexport function estimatePageDimensions(\n numPages: number,\n sampleDim: PageDimension = DEFAULT_FALLBACK_DIMS\n): PageDimension[] {\n if (numPages <= 0) return [];\n const dim = { width: sampleDim.width, height: sampleDim.height };\n return Array.from({ length: numPages }, () => ({ ...dim }));\n}\n\n/**\n * Computes row heights, vertical tops, and total container scroll height\n * for given rows of pages and scale.\n */\nexport function computeRowLayout(\n rows: number[][],\n dimsFor: (page: number) => PageDimension,\n scale: number,\n gap = 16\n): RowLayout {\n const heights = rows.map((row) => {\n if (row.length === 0) return gap;\n const maxHeight = Math.max(...row.map((p) => dimsFor(p).height));\n return maxHeight * scale + gap;\n });\n\n const tops: number[] = [];\n let acc = 0;\n for (const h of heights) {\n tops.push(acc);\n acc += h;\n }\n\n return { heights, tops, total: acc };\n}\n\n/**\n * Checks if any page dimension in array A differs from array B beyond a tolerance.\n */\nexport function hasDimensionMismatch(\n dimsA: PageDimension[],\n dimsB: PageDimension[],\n tolerance = 0.5\n): boolean {\n if (dimsA.length !== dimsB.length) return true;\n for (let i = 0; i < dimsA.length; i++) {\n const a = dimsA[i];\n const b = dimsB[i];\n if (\n Math.abs(a.width - b.width) > tolerance ||\n Math.abs(a.height - b.height) > tolerance\n ) {\n return true;\n }\n }\n return false;\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 */\n\nimport React, { useState } from 'react';\nimport type { DiffBoundingBox } from '../types/compare';\n\ninterface DiffHighlightOverlayProps {\n boxes: DiffBoundingBox[];\n scale: number;\n colorScheme?: 'deletions' | 'additions' | 'all';\n selectedDiffId?: string | null;\n onSelectDiff?: (id: string) => void;\n}\n\nexport default function DiffHighlightOverlay({\n boxes,\n scale,\n colorScheme = 'all',\n selectedDiffId,\n onSelectDiff\n}: DiffHighlightOverlayProps) {\n const [hoveredId, setHoveredId] = useState<string | null>(null);\n\n if (!boxes || boxes.length === 0) return null;\n\n const filteredBoxes = boxes.filter(b => {\n if (colorScheme === 'deletions') return b.type === 'deletion' || b.type === 'modification';\n if (colorScheme === 'additions') return b.type === 'addition' || b.type === 'modification';\n return true;\n });\n\n return (\n <div\n className=\"tspdf-diff-highlight-overlay\"\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n width: '100%',\n height: '100%',\n pointerEvents: 'none',\n zIndex: 15\n }}\n >\n <style>{`\n @keyframes tspdf-diff-pulse {\n 0% {\n box-shadow: 0 0 0 0 rgba(2, 132, 199, 0.8), 0 0 12px rgba(2, 132, 199, 0.5);\n }\n 50% {\n box-shadow: 0 0 0 6px rgba(2, 132, 199, 0.35), 0 0 24px rgba(2, 132, 199, 0.8);\n }\n 100% {\n box-shadow: 0 0 0 0 rgba(2, 132, 199, 0.8), 0 0 12px rgba(2, 132, 199, 0.5);\n }\n }\n `}</style>\n {filteredBoxes.map((box) => {\n const isSelected = selectedDiffId === box.id;\n const isHovered = hoveredId === box.id;\n\n let bg = 'rgba(245, 158, 11, 0.22)';\n let border = '1.5px solid #f59e0b';\n let labelColor = '#d97706';\n let labelPrefix = 'Changed';\n\n if (box.type === 'deletion') {\n bg = isSelected ? 'rgba(225, 29, 72, 0.35)' : 'rgba(225, 29, 72, 0.22)';\n border = isSelected ? '2px solid #e11d48' : '1.5px solid #e11d48';\n labelColor = '#e11d48';\n labelPrefix = 'Removed';\n } else if (box.type === 'addition') {\n bg = isSelected ? 'rgba(16, 185, 129, 0.35)' : 'rgba(16, 185, 129, 0.22)';\n border = isSelected ? '2px solid #10b981' : '1.5px solid #10b981';\n labelColor = '#059669';\n labelPrefix = 'Added';\n }\n\n const x = box.x * scale;\n const y = box.y * scale;\n const w = box.width * scale;\n const h = box.height * scale;\n\n return (\n <div\n key={box.id}\n id={`diff-highlight-${box.id}`}\n onClick={(e) => {\n e.stopPropagation();\n onSelectDiff?.(box.id);\n }}\n onMouseEnter={() => setHoveredId(box.id)}\n onMouseLeave={() => setHoveredId(null)}\n style={{\n position: 'absolute',\n left: `${x}px`,\n top: `${y}px`,\n width: `${w}px`,\n height: `${h}px`,\n backgroundColor: bg,\n border: border,\n borderRadius: '4px',\n cursor: 'pointer',\n pointerEvents: 'auto',\n animation: isSelected ? 'tspdf-diff-pulse 1.8s infinite ease-in-out' : 'none',\n boxShadow: isSelected\n ? '0 0 0 3px #0284c7, 0 4px 16px rgba(2, 132, 199, 0.5)'\n : isHovered\n ? '0 0 0 2px rgba(0,0,0,0.25)'\n : 'none',\n transition: 'all 0.15s ease-in-out',\n zIndex: isSelected ? 30 : isHovered ? 25 : 15\n }}\n title={`${labelPrefix}: ${box.text}`}\n >\n {(isHovered || isSelected) && (\n <div\n style={{\n position: 'absolute',\n bottom: '100%',\n left: '50%',\n transform: 'translateX(-50%)',\n marginBottom: '6px',\n backgroundColor: '#0f172a',\n color: '#ffffff',\n fontSize: '11px',\n fontWeight: 600,\n padding: '4px 10px',\n borderRadius: '6px',\n whiteSpace: 'nowrap',\n boxShadow: '0 4px 14px rgba(0,0,0,0.3)',\n zIndex: 40,\n display: 'flex',\n alignItems: 'center',\n gap: '6px',\n pointerEvents: 'none'\n }}\n >\n <span style={{ color: labelColor, fontWeight: 700, textTransform: 'uppercase', fontSize: '10px' }}>\n {labelPrefix}\n </span>\n <span style={{ maxWidth: '220px', overflow: 'hidden', textOverflow: 'ellipsis' }}>\n \"{box.text}\"\n </span>\n <div style={{\n position: 'absolute',\n top: '100%',\n left: '50%',\n transform: 'translateX(-50%)',\n width: 0,\n height: 0,\n borderLeft: '5px solid transparent',\n borderRight: '5px solid transparent',\n borderTop: '5px solid #0f172a'\n }} />\n </div>\n )}\n </div>\n );\n })}\n </div>\n );\n}\n\n","/**\n * © 2026 AngelBot Ai Pvt Ltd. All rights reserved.\n */\n\nimport React, { useRef, useEffect, useState } from 'react';\nimport * as pdfjsLib from 'pdfjs-dist';\nimport PageRenderer from './PageRenderer';\nimport DiffHighlightOverlay from './DiffHighlightOverlay';\nimport type { SDKPermissions, WatermarkOptions, Redaction } from '../core/types';\nimport type { DiffBoundingBox } from '../types/compare';\n\ninterface SideBySideViewerProps {\n pdfDocA: pdfjsLib.PDFDocumentProxy | null;\n pdfDocB: pdfjsLib.PDFDocumentProxy | null;\n pageNum: number;\n scale: number;\n rotation: number;\n basePageDims: { width: number; height: number };\n activeTab: string;\n activeTool: string | null;\n annotations: any[];\n permissions?: SDKPermissions;\n watermark?: WatermarkOptions;\n watermarkText?: string;\n redactions?: Redaction[];\n diffsA?: DiffBoundingBox[];\n diffsB?: DiffBoundingBox[];\n selectedDiffId?: string | null;\n onSelectDiff?: (id: string) => void;\n onScrollSync?: (scrollTop: number, scrollLeft: number) => void;\n hideAnnotationsUntilPageRendered?: boolean;\n}\n\nexport default function SideBySideViewer({\n pdfDocA,\n pdfDocB,\n pageNum,\n scale,\n rotation,\n basePageDims,\n activeTab,\n activeTool,\n annotations,\n watermark,\n watermarkText,\n redactions,\n diffsA = [],\n diffsB = [],\n selectedDiffId,\n onSelectDiff,\n hideAnnotationsUntilPageRendered = true\n}: SideBySideViewerProps) {\n const containerARef = useRef<HTMLDivElement>(null);\n const containerBRef = useRef<HTMLDivElement>(null);\n const isSyncingRef = useRef(false);\n\n // Synchronize scrolling between Panel A and Panel B\n useEffect(() => {\n const elA = containerARef.current;\n const elB = containerBRef.current;\n if (!elA || !elB) return;\n\n const syncAtoB = () => {\n if (isSyncingRef.current) return;\n isSyncingRef.current = true;\n elB.scrollTop = elA.scrollTop;\n elB.scrollLeft = elA.scrollLeft;\n setTimeout(() => { isSyncingRef.current = false; }, 10);\n };\n\n const syncBtoA = () => {\n if (isSyncingRef.current) return;\n isSyncingRef.current = true;\n elA.scrollTop = elB.scrollTop;\n elA.scrollLeft = elB.scrollLeft;\n setTimeout(() => { isSyncingRef.current = false; }, 10);\n };\n\n elA.addEventListener('scroll', syncAtoB);\n elB.addEventListener('scroll', syncBtoA);\n\n return () => {\n elA.removeEventListener('scroll', syncAtoB);\n elB.removeEventListener('scroll', syncBtoA);\n };\n }, []);\n\n // Smooth scroll to selected diff box\n useEffect(() => {\n if (!selectedDiffId) return;\n const allDiffs = [...(diffsA || []), ...(diffsB || [])];\n const targetBox = allDiffs.find(d => d.id === selectedDiffId);\n if (targetBox && containerARef.current) {\n const viewH = containerARef.current.clientHeight || 600;\n const targetY = targetBox.y * scale;\n const scrollToY = Math.max(0, targetY - viewH / 3);\n containerARef.current.scrollTo({\n top: scrollToY,\n behavior: 'smooth'\n });\n }\n }, [selectedDiffId, diffsA, diffsB, scale]);\n\n const [dimsA, setDimsA] = useState<{ width: number; height: number }>(basePageDims);\n const [dimsB, setDimsB] = useState<{ width: number; height: number }>(basePageDims);\n\n useEffect(() => {\n if (pdfDocA) {\n pdfDocA.getPage(pageNum).then(page => {\n const vp = page.getViewport({ scale: 1, rotation: (page.rotate + rotation) % 360 });\n setDimsA({ width: vp.width, height: vp.height });\n }).catch(() => {});\n }\n }, [pdfDocA, pageNum, rotation]);\n\n useEffect(() => {\n if (pdfDocB) {\n pdfDocB.getPage(pageNum).then(page => {\n const vp = page.getViewport({ scale: 1, rotation: (page.rotate + rotation) % 360 });\n setDimsB({ width: vp.width, height: vp.height });\n }).catch(() => {});\n }\n }, [pdfDocB, pageNum, rotation]);\n\n const scaledWidthA = (dimsA.width || 600) * scale;\n const scaledHeightA = (dimsA.height || 800) * scale;\n\n const scaledWidthB = (dimsB.width || 600) * scale;\n const scaledHeightB = (dimsB.height || 800) * scale;\n\n return (\n <div style={{ flex: 1, display: 'flex', minHeight: 0, width: '100%', height: '100%', overflow: 'hidden' }}>\n {/* Panel A - Document A (Base) */}\n <div\n ref={containerARef}\n style={{\n flex: 1,\n height: '100%',\n overflow: 'auto',\n backgroundColor: '#f1f5f9',\n borderRight: '2px solid #cbd5e1',\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n padding: '16px'\n }}\n >\n <div style={{\n marginBottom: '8px', padding: '4px 12px', borderRadius: '4px',\n backgroundColor: '#e11d48', color: '#ffffff', fontSize: '11px', fontWeight: 600\n }}>\n Document A (Base) - Page {pageNum}\n </div>\n <div style={{ position: 'relative', width: `${scaledWidthA}px`, height: `${scaledHeightA}px`, boxShadow: '0 4px 12px rgba(0,0,0,0.15)' }}>\n {pdfDocA && (\n <PageRenderer\n pageNum={pageNum}\n pdfDoc={pdfDocA}\n scale={scale}\n rotation={rotation}\n scrollTop={0}\n scrollLeft={0}\n pageTop={0}\n basePageWidth={dimsA.width}\n basePageHeight={dimsA.height}\n containerWidth={scaledWidthA}\n containerHeight={scaledHeightA}\n activeTab={activeTab}\n activeTool={activeTool}\n annotations={annotations}\n selectedAnnotationId={null}\n activeSearchResult={null}\n onMouseDown={() => {}}\n onMouseMove={() => {}}\n onMouseUp={() => {}}\n onAnnotationMouseEnter={() => {}}\n onAnnotationClick={() => {}}\n onClearSelection={() => {}}\n watermark={watermark}\n watermarkText={watermarkText}\n redactions={redactions}\n hideAnnotationsUntilPageRendered={hideAnnotationsUntilPageRendered}\n />\n )}\n <DiffHighlightOverlay\n boxes={diffsA}\n scale={scale}\n colorScheme=\"deletions\"\n selectedDiffId={selectedDiffId}\n onSelectDiff={onSelectDiff}\n />\n </div>\n </div>\n\n {/* Panel B - Document B (Comparison) */}\n <div\n ref={containerBRef}\n style={{\n flex: 1,\n height: '100%',\n overflow: 'auto',\n backgroundColor: '#f1f5f9',\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n padding: '16px'\n }}\n >\n <div style={{\n marginBottom: '8px', padding: '4px 12px', borderRadius: '4px',\n backgroundColor: '#0284c7', color: '#ffffff', fontSize: '11px', fontWeight: 600\n }}>\n Document B (Comparison) - Page {pageNum}\n </div>\n <div style={{ position: 'relative', width: `${scaledWidthB}px`, height: `${scaledHeightB}px`, boxShadow: '0 4px 12px rgba(0,0,0,0.15)' }}>\n {pdfDocB && (\n <PageRenderer\n pageNum={pageNum}\n pdfDoc={pdfDocB}\n scale={scale}\n rotation={rotation}\n scrollTop={0}\n scrollLeft={0}\n pageTop={0}\n basePageWidth={dimsB.width}\n basePageHeight={dimsB.height}\n containerWidth={scaledWidthB}\n containerHeight={scaledHeightB}\n activeTab={activeTab}\n activeTool={activeTool}\n annotations={annotations}\n selectedAnnotationId={null}\n activeSearchResult={null}\n onMouseDown={() => {}}\n onMouseMove={() => {}}\n onMouseUp={() => {}}\n onAnnotationMouseEnter={() => {}}\n onAnnotationClick={() => {}}\n onClearSelection={() => {}}\n watermark={watermark}\n watermarkText={watermarkText}\n redactions={redactions}\n hideAnnotationsUntilPageRendered={hideAnnotationsUntilPageRendered}\n />\n )}\n <DiffHighlightOverlay\n boxes={diffsB}\n scale={scale}\n colorScheme=\"additions\"\n selectedDiffId={selectedDiffId}\n onSelectDiff={onSelectDiff}\n />\n </div>\n </div>\n </div>\n );\n}\n","/**\n * © 2026 AngelBot Ai Pvt Ltd. All rights reserved.\n */\n\nimport React from 'react';\nimport { Layers, Columns, FileText, SlidersHorizontal, ChevronLeft, ChevronRight, X } from 'lucide-react';\nimport type { CompareMode, CompareState } from '../types/compare';\n\ninterface CompareToolbarProps {\n compareState: CompareState;\n onSetMode: (mode: CompareMode) => void;\n onSetColors: (colorA: string, colorB: string) => void;\n onToggleCurtain: () => void;\n onPrevDiff: () => void;\n onNextDiff: () => void;\n onExit: () => void;\n}\n\nexport default function CompareToolbar({\n compareState,\n onSetMode,\n onSetColors,\n onToggleCurtain,\n onPrevDiff,\n onNextDiff,\n onExit\n}: CompareToolbarProps) {\n const { mode, colorA, colorB, showCurtain, diffItems, currentDiffIndex } = compareState;\n\n return (\n <div style={{\n display: 'flex',\n alignItems: 'center',\n gap: '12px',\n padding: '6px 16px',\n backgroundColor: '#1e293b',\n color: '#f8fafc',\n borderBottom: '1px solid #334155',\n height: '42px',\n fontSize: '13px',\n zIndex: 100\n }}>\n {/* Compare Status Badge */}\n <div style={{ display: 'flex', alignItems: 'center', gap: '6px', fontWeight: 600, color: '#38bdf8' }}>\n <Layers size={16} />\n <span>Document Compare</span>\n </div>\n\n <div style={{ width: '1px', height: '20px', backgroundColor: '#475569' }} />\n\n {/* Mode Switcher */}\n <div style={{ display: 'flex', backgroundColor: '#0f172a', borderRadius: '6px', padding: '2px' }}>\n <button\n onClick={() => onSetMode('overlay')}\n style={{\n display: 'flex', alignItems: 'center', gap: '6px',\n padding: '4px 10px', borderRadius: '4px', border: 'none',\n backgroundColor: mode === 'overlay' ? '#0284c7' : 'transparent',\n color: mode === 'overlay' ? '#ffffff' : '#94a3b8',\n cursor: 'pointer', fontSize: '12px', fontWeight: 500\n }}\n title=\"Overlay Color Blend Diff\"\n >\n <Layers size={14} />\n <span>Overlay Diff</span>\n </button>\n\n <button\n onClick={() => onSetMode('side-by-side')}\n style={{\n display: 'flex', alignItems: 'center', gap: '6px',\n padding: '4px 10px', borderRadius: '4px', border: 'none',\n backgroundColor: mode === 'side-by-side' ? '#0284c7' : 'transparent',\n color: mode === 'side-by-side' ? '#ffffff' : '#94a3b8',\n cursor: 'pointer', fontSize: '12px', fontWeight: 500\n }}\n title=\"Side-by-Side Synchronized MultiViewer\"\n >\n <Columns size={14} />\n <span>Side-by-Side</span>\n </button>\n\n <button\n onClick={() => onSetMode('semantic')}\n style={{\n display: 'flex', alignItems: 'center', gap: '6px',\n padding: '4px 10px', borderRadius: '4px', border: 'none',\n backgroundColor: mode === 'semantic' ? '#0284c7' : 'transparent',\n color: mode === 'semantic' ? '#ffffff' : '#94a3b8',\n cursor: 'pointer', fontSize: '12px', fontWeight: 500\n }}\n title=\"Semantic Text & Structured Diff\"\n >\n <FileText size={14} />\n <span>Text Diff</span>\n </button>\n </div>\n\n {/* Mode Specific Controls */}\n {mode === 'overlay' && (\n <>\n <div style={{ width: '1px', height: '20px', backgroundColor: '#475569' }} />\n \n {/* Color Tint Selectors */}\n <div style={{ display: 'flex', alignItems: 'center', gap: '8px' }}>\n <div style={{ display: 'flex', alignItems: 'center', gap: '4px' }}>\n <span style={{ fontSize: '11px', color: '#94a3b8' }}>Doc A:</span>\n <input\n type=\"color\"\n value={colorA}\n onChange={(e) => onSetColors(e.target.value, colorB)}\n style={{ width: '22px', height: '22px', border: 'none', borderRadius: '4px', cursor: 'pointer', backgroundColor: 'transparent' }}\n title=\"Document A Tint Color (Deletions)\"\n />\n </div>\n <div style={{ display: 'flex', alignItems: 'center', gap: '4px' }}>\n <span style={{ fontSize: '11px', color: '#94a3b8' }}>Doc B:</span>\n <input\n type=\"color\"\n value={colorB}\n onChange={(e) => onSetColors(colorA, e.target.value)}\n style={{ width: '22px', height: '22px', border: 'none', borderRadius: '4px', cursor: 'pointer', backgroundColor: 'transparent' }}\n title=\"Document B Tint Color (Additions)\"\n />\n </div>\n </div>\n\n <button\n onClick={onToggleCurtain}\n style={{\n display: 'flex', alignItems: 'center', gap: '4px',\n padding: '4px 8px', borderRadius: '4px', border: '1px solid #475569',\n backgroundColor: showCurtain ? '#0369a1' : 'transparent',\n color: '#f8fafc', cursor: 'pointer', fontSize: '12px'\n }}\n title=\"Toggle Wipe Curtain Slider\"\n >\n <SlidersHorizontal size={14} />\n <span>Curtain Slider</span>\n </button>\n </>\n )}\n\n {/* Diff Navigation Counter */}\n {diffItems.length > 0 && (\n <>\n <div style={{ width: '1px', height: '20px', backgroundColor: '#475569' }} />\n <div style={{ display: 'flex', alignItems: 'center', gap: '6px' }}>\n <button\n onClick={onPrevDiff}\n style={{ padding: '2px 6px', borderRadius: '4px', border: 'none', backgroundColor: '#334155', color: '#f8fafc', cursor: 'pointer' }}\n title=\"Previous Difference\"\n >\n <ChevronLeft size={14} />\n </button>\n <span style={{ fontSize: '12px', color: '#cbd5e1', minWidth: '70px', textAlign: 'center' }}>\n {currentDiffIndex + 1} of {diffItems.length} diffs\n </span>\n <button\n onClick={onNextDiff}\n style={{ padding: '2px 6px', borderRadius: '4px', border: 'none', backgroundColor: '#334155', color: '#f8fafc', cursor: 'pointer' }}\n title=\"Next Difference\"\n >\n <ChevronRight size={14} />\n </button>\n </div>\n </>\n )}\n\n <div style={{ flex: 1 }} />\n\n {/* Exit Compare Button */}\n <button\n onClick={onExit}\n style={{\n display: 'flex', alignItems: 'center', gap: '4px',\n padding: '4px 10px', borderRadius: '4px', border: 'none',\n backgroundColor: '#dc2626', color: '#ffffff',\n cursor: 'pointer', fontSize: '12px', fontWeight: 600\n }}\n title=\"Exit Compare Mode\"\n >\n <X size={14} />\n <span>Exit Compare</span>\n </button>\n </div>\n );\n}\n","/**\n * © 2026 AngelBot Ai Pvt Ltd. All rights reserved.\n */\n\nimport React from 'react';\nimport { Layers, FileText, CheckCircle2, MinusCircle, PlusCircle, AlertCircle } from 'lucide-react';\nimport type { DiffItem, TextDiffSegment } from '../types/compare';\n\ninterface DiffSummarySidebarProps {\n isOpen: boolean;\n onClose: () => void;\n diffItems: DiffItem[];\n textDiffs: TextDiffSegment[];\n currentDiffIndex: number;\n onSelectDiff: (index: number, item?: DiffItem) => void;\n onJumpToPage: (pageIndex: number) => void;\n}\n\nexport default function DiffSummarySidebar({\n isOpen,\n diffItems,\n textDiffs,\n currentDiffIndex,\n onSelectDiff,\n onJumpToPage\n}: DiffSummarySidebarProps) {\n if (!isOpen) return null;\n\n return (\n <div style={{\n width: '320px',\n height: '100%',\n backgroundColor: '#ffffff',\n borderLeft: '1px solid #e2e8f0',\n display: 'flex',\n flexDirection: 'column',\n flexShrink: 0,\n zIndex: 80\n }}>\n {/* Header */}\n <div style={{\n padding: '12px 16px',\n borderBottom: '1px solid #e2e8f0',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n backgroundColor: '#f8fafc'\n }}>\n <div style={{ display: 'flex', alignItems: 'center', gap: '8px', fontWeight: 600, fontSize: '14px', color: '#0f172a' }}>\n <Layers size={18} color=\"#0284c7\" />\n <span>Compare Summary</span>\n </div>\n <span style={{\n fontSize: '11px', padding: '2px 8px', borderRadius: '12px',\n backgroundColor: '#0284c7', color: '#ffffff', fontWeight: 600\n }}>\n {diffItems.length} Differences\n </span>\n </div>\n\n {/* List Content */}\n <div style={{ flex: 1, overflowY: 'auto', padding: '12px' }}>\n {diffItems.length > 0 && (\n <div>\n <div style={{ fontSize: '12px', fontWeight: 600, color: '#64748b', marginBottom: '8px', display: 'flex', alignItems: 'center', gap: '4px' }}>\n <Layers size={14} />\n <span>Differences on Page ({diffItems.length})</span>\n </div>\n\n {diffItems.map((item, idx) => {\n const isSelected = idx === currentDiffIndex;\n const isDel = item.type === 'deletion';\n const isAdd = item.type === 'addition';\n\n let badgeColor = isDel ? '#e11d48' : isAdd ? '#10b981' : '#f59e0b';\n let badgeBg = isDel ? '#ffe4e6' : isAdd ? '#dcfce7' : '#fef3c7';\n let badgeLabel = isDel ? 'Removed' : isAdd ? 'Added' : 'Changed';\n\n return (\n <div\n key={item.id}\n onClick={() => {\n onSelectDiff(idx, item);\n if (item.pageIndex) onJumpToPage(item.pageIndex);\n }}\n style={{\n padding: '10px 12px',\n borderRadius: '6px',\n backgroundColor: isSelected ? '#f0f9ff' : '#ffffff',\n border: isSelected ? '2px solid #0284c7' : '1px solid #e2e8f0',\n borderLeft: isSelected ? '4px solid #0284c7' : `3px solid ${badgeColor}`,\n marginBottom: '8px',\n cursor: 'pointer',\n fontSize: '12px',\n boxShadow: isSelected ? '0 2px 8px rgba(2, 132, 199, 0.18)' : '0 1px 3px rgba(0,0,0,0.03)',\n transition: 'all 0.15s ease'\n }}\n >\n <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between', marginBottom: '4px' }}>\n <div style={{ display: 'flex', alignItems: 'center', gap: '6px' }}>\n {isDel && <MinusCircle size={13} color=\"#e11d48\" />}\n {isAdd && <PlusCircle size={13} color=\"#10b981\" />}\n {!isDel && !isAdd && <AlertCircle size={13} color=\"#f59e0b\" />}\n <span style={{\n fontSize: '10px',\n fontWeight: 700,\n textTransform: 'uppercase',\n padding: '1px 6px',\n borderRadius: '4px',\n backgroundColor: badgeBg,\n color: badgeColor\n }}>\n {badgeLabel}\n </span>\n </div>\n <span style={{ fontSize: '11px', color: '#64748b', fontWeight: 600 }}>\n Page {item.pageIndex}\n </span>\n </div>\n <div style={{\n fontSize: '12px',\n color: isSelected ? '#0369a1' : '#334155',\n fontWeight: isSelected ? 600 : 400,\n lineHeight: '1.4',\n wordBreak: 'break-word'\n }}>\n {item.description}\n </div>\n </div>\n );\n })}\n </div>\n )}\n\n {textDiffs.length > 0 && diffItems.length === 0 && (\n <div style={{ marginBottom: '16px' }}>\n <div style={{ fontSize: '12px', fontWeight: 600, color: '#64748b', marginBottom: '8px', display: 'flex', alignItems: 'center', gap: '4px' }}>\n <FileText size={14} />\n <span>Text Differences</span>\n </div>\n\n {textDiffs.filter(t => t.type !== 'equal').map((seg, i) => (\n <div\n key={`text-diff-${i}`}\n onClick={() => onJumpToPage(seg.pageIndex)}\n style={{\n padding: '8px 12px',\n borderRadius: '6px',\n backgroundColor: seg.type === 'add' ? '#f0fdf4' : '#fef2f2',\n border: `1px solid ${seg.type === 'add' ? '#bbf7d0' : '#fecaca'}`,\n marginBottom: '8px',\n cursor: 'pointer',\n fontSize: '12px',\n lineHeight: '1.4'\n }}\n >\n <div style={{ display: 'flex', justifyContent: 'space-between', marginBottom: '4px', fontSize: '10px', color: '#64748b', fontWeight: 600 }}>\n <span>Page {seg.pageIndex}</span>\n <span style={{ color: seg.type === 'add' ? '#16a34a' : '#dc2626', textTransform: 'uppercase' }}>\n {seg.type === 'add' ? '+ Addition' : '- Deletion'}\n </span>\n </div>\n <div style={{\n color: seg.type === 'add' ? '#15803d' : '#b91c1c',\n textDecoration: seg.type === 'delete' ? 'line-through' : 'none',\n fontFamily: 'monospace',\n wordBreak: 'break-word'\n }}>\n {seg.text.length > 120 ? `${seg.text.substring(0, 120)}...` : seg.text}\n </div>\n </div>\n ))}\n </div>\n )}\n\n {diffItems.length === 0 && textDiffs.filter(t => t.type !== 'equal').length === 0 && (\n <div style={{ padding: '32px 16px', textAlign: 'center', color: '#64748b' }}>\n <CheckCircle2 size={32} color=\"#16a34a\" style={{ margin: '0 auto 8px auto' }} />\n <div style={{ fontWeight: 600, fontSize: '14px', color: '#0f172a' }}>Documents Match</div>\n <div style={{ fontSize: '12px', marginTop: '4px' }}>No visual or structural differences detected between the two PDF documents.</div>\n </div>\n )}\n </div>\n </div>\n );\n}\n\n","/**\n * © 2026 AngelBot Ai Pvt Ltd. All rights reserved.\n */\n\nimport React, { useRef, useState, useEffect } from 'react';\nimport { GripVertical } from 'lucide-react';\n\ninterface CompareCurtainSliderProps {\n positionPercent: number; // 0 to 100\n onChangePosition: (pos: number) => void;\n containerRef: React.RefObject<HTMLDivElement | null>;\n}\n\nexport default function CompareCurtainSlider({\n positionPercent,\n onChangePosition,\n containerRef\n}: CompareCurtainSliderProps) {\n const [isDragging, setIsDragging] = useState(false);\n const sliderRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n const handleMouseMove = (e: MouseEvent) => {\n if (!isDragging || !containerRef.current) return;\n const rect = containerRef.current.getBoundingClientRect();\n const relativeX = e.clientX - rect.left;\n const newPercent = Math.max(0, Math.min(100, (relativeX / rect.width) * 100));\n onChangePosition(newPercent);\n };\n\n const handleMouseUp = () => {\n if (isDragging) {\n setIsDragging(false);\n }\n };\n\n if (isDragging) {\n window.addEventListener('mousemove', handleMouseMove);\n window.addEventListener('mouseup', handleMouseUp);\n }\n\n return () => {\n window.removeEventListener('mousemove', handleMouseMove);\n window.removeEventListener('mouseup', handleMouseUp);\n };\n }, [isDragging, containerRef, onChangePosition]);\n\n return (\n <div\n ref={sliderRef}\n style={{\n position: 'absolute',\n top: 0,\n bottom: 0,\n left: `${positionPercent}%`,\n width: '4px',\n backgroundColor: '#0284c7',\n boxShadow: '0 0 8px rgba(2, 132, 199, 0.8)',\n zIndex: 90,\n cursor: 'ew-resize',\n transform: 'translateX(-50%)'\n }}\n onMouseDown={(e) => {\n e.preventDefault();\n setIsDragging(true);\n }}\n >\n {/* Center Handle Badge */}\n <div style={{\n position: 'absolute',\n top: '50%',\n left: '50%',\n transform: 'translate(-50%, -50%)',\n width: '28px',\n height: '40px',\n backgroundColor: '#0284c7',\n color: '#ffffff',\n borderRadius: '6px',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n boxShadow: '0 2px 8px rgba(0,0,0,0.3)',\n cursor: 'ew-resize'\n }}>\n <GripVertical size={16} />\n </div>\n </div>\n );\n}\n","/**\n * © 2026 AngelBot Ai Pvt Ltd. All rights reserved.\n */\n\nimport type * as pdfjsLib from 'pdfjs-dist';\nimport type { TextDiffSegment, DiffItem, DiffBoundingBox } from '../types/compare';\n\nexport interface PageDiffResult {\n diffsA: DiffBoundingBox[];\n diffsB: DiffBoundingBox[];\n summary: DiffItem[];\n}\n\nexport interface WordToken {\n text: string;\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\n/**\n * Extracts individual words with precise unscaled viewport bounding boxes from a PDF.js page.\n */\nexport async function extractWordsFromPage(page: pdfjsLib.PDFPageProxy): Promise<WordToken[]> {\n const vp = page.getViewport({ scale: 1, rotation: page.rotate });\n const textContent = await page.getTextContent();\n const wordTokens: WordToken[] = [];\n\n for (const item of textContent.items as any[]) {\n if (!item.str || typeof item.str !== 'string') continue;\n const str = item.str;\n if (str.trim().length === 0) continue;\n\n const tx = item.transform[4];\n const ty = item.transform[5];\n const itemWidth = item.width || 0;\n const fontSize = Math.sqrt((item.transform[0] || 0) ** 2 + (item.transform[1] || 0) ** 2) || 12;\n const itemHeight = item.height || fontSize;\n\n const [vx1, vy1] = vp.convertToViewportPoint(tx, ty + itemHeight);\n const [vx2, vy2] = vp.convertToViewportPoint(tx + itemWidth, ty);\n\n const itemX = Math.min(vx1, vx2);\n const itemY = Math.min(vy1, vy2);\n const itemW = Math.max(Math.abs(vx2 - vx1), 4);\n const itemH = Math.max(Math.abs(vy2 - vy1), 8);\n\n const parts = str.split(/(\\s+)/);\n let offset = 0;\n const totalChars = str.length || 1;\n\n for (const p of parts) {\n const charRatio = p.length / totalChars;\n const wWidth = itemW * charRatio;\n const wX = itemX + (offset / totalChars) * itemW;\n offset += p.length;\n\n if (p.trim().length > 0) {\n wordTokens.push({\n text: p.trim(),\n x: wX,\n y: itemY,\n width: Math.max(wWidth, 6),\n height: itemH\n });\n }\n }\n }\n\n return wordTokens;\n}\n\n/**\n * Computes exact text difference bounding boxes on a page for both Document A and Document B.\n */\nexport async function computePageDiffBoxes(\n pdfDocA: pdfjsLib.PDFDocumentProxy,\n pdfDocB: pdfjsLib.PDFDocumentProxy,\n pageIndex: number\n): Promise<PageDiffResult> {\n const [pageA, pageB] = await Promise.all([\n pdfDocA.getPage(pageIndex),\n pdfDocB.getPage(Math.min(pageIndex, pdfDocB.numPages))\n ]);\n\n const [wordsA, wordsB] = await Promise.all([\n extractWordsFromPage(pageA),\n extractWordsFromPage(pageB)\n ]);\n\n const textArrA = wordsA.map(w => w.text);\n const textArrB = wordsB.map(w => w.text);\n\n // Myers diff on word tokens\n const n = textArrA.length;\n const m = textArrB.length;\n const max = n + m;\n const v = new Int32Array(2 * max + 1);\n v[1] = 0;\n const trace: Int32Array[] = [];\n\n for (let d = 0; d <= max; d++) {\n trace.push(v.slice());\n for (let k = -d; k <= d; k += 2) {\n let x: number;\n if (k === -d || (k !== d && v[k - 1 + max] < v[k + 1 + max])) {\n x = v[k + 1 + max];\n } else {\n x = v[k - 1 + max] + 1;\n }\n let y = x - k;\n while (x < n && y < m && textArrA[x] === textArrB[y]) {\n x++;\n y++;\n }\n v[k + max] = x;\n if (x >= n && y >= m) {\n break;\n }\n }\n if (v[n - m + max] >= n && (v[n - m + max] - (n - m)) >= m) break;\n }\n\n // Backtrack\n let x = n;\n let y = m;\n const delIndicesA: number[] = [];\n const addIndicesB: number[] = [];\n\n for (let d = trace.length - 1; d >= 0; d--) {\n const vArr = trace[d];\n const k = x - y;\n let prevK: number;\n if (k === -d || (k !== d && vArr[k - 1 + max] < vArr[k + 1 + max])) {\n prevK = k + 1;\n } else {\n prevK = k - 1;\n }\n const prevX = vArr[prevK + max];\n const prevY = prevX - prevK;\n\n while (x > prevX && y > prevY) {\n x--;\n y--;\n }\n\n if (d > 0) {\n if (x === prevX) {\n addIndicesB.push(y - 1);\n y--;\n } else if (y === prevY) {\n delIndicesA.push(x - 1);\n x--;\n }\n }\n }\n\n delIndicesA.reverse();\n addIndicesB.reverse();\n\n const diffsA = groupWordsIntoBoxes(delIndicesA.map(i => wordsA[i]), pageIndex, 'deletion');\n const diffsB = groupWordsIntoBoxes(addIndicesB.map(i => wordsB[i]), pageIndex, 'addition');\n\n const summary: DiffItem[] = [];\n for (const d of diffsA) {\n summary.push({\n id: d.id,\n pageIndex,\n type: 'deletion',\n description: `Removed \"${d.text.length > 40 ? d.text.slice(0, 40) + '...' : d.text}\"`,\n x: d.x,\n y: d.y,\n width: d.width,\n height: d.height\n });\n }\n for (const a of diffsB) {\n summary.push({\n id: a.id,\n pageIndex,\n type: 'addition',\n description: `Added \"${a.text.length > 40 ? a.text.slice(0, 40) + '...' : a.text}\"`,\n x: a.x,\n y: a.y,\n width: a.width,\n height: a.height\n });\n }\n\n return { diffsA, diffsB, summary };\n}\n\nfunction groupWordsIntoBoxes(words: WordToken[], pageIndex: number, type: 'addition' | 'deletion' | 'modification'): DiffBoundingBox[] {\n if (words.length === 0) return [];\n const boxes: DiffBoundingBox[] = [];\n\n let currentWords: WordToken[] = [words[0]];\n\n for (let i = 1; i < words.length; i++) {\n const prev = currentWords[currentWords.length - 1];\n const curr = words[i];\n\n const sameLine = Math.abs(curr.y - prev.y) < Math.max(prev.height, curr.height) * 0.6;\n const nearby = curr.x - (prev.x + prev.width) < 30;\n\n if (sameLine && nearby) {\n currentWords.push(curr);\n } else {\n boxes.push(createBoxFromTokens(currentWords, pageIndex, type, boxes.length + 1));\n currentWords = [curr];\n }\n }\n\n if (currentWords.length > 0) {\n boxes.push(createBoxFromTokens(currentWords, pageIndex, type, boxes.length + 1));\n }\n\n return boxes;\n}\n\nfunction createBoxFromTokens(tokens: WordToken[], pageIndex: number, type: 'addition' | 'deletion' | 'modification', seq: number): DiffBoundingBox {\n const minX = Math.min(...tokens.map(t => t.x));\n const minY = Math.min(...tokens.map(t => t.y));\n const maxX = Math.max(...tokens.map(t => t.x + t.width));\n const maxY = Math.max(...tokens.map(t => t.y + t.height));\n const text = tokens.map(t => t.text).join(' ');\n\n return {\n id: `diff-box-${pageIndex}-${type}-${seq}-${Math.round(minX)}-${Math.round(minY)}`,\n pageIndex,\n type,\n text,\n x: Math.max(0, minX - 2),\n y: Math.max(0, minY - 1),\n width: maxX - minX + 4,\n height: maxY - minY + 2\n };\n}\n\n/**\n * Lightweight client-side Myers Diff algorithm for raw text comparison.\n */\nexport function computeTextDiff(textA: string, textB: string, pageIndex: number): TextDiffSegment[] {\n const wordsA = textA.split(/(\\s+)/);\n const wordsB = textB.split(/(\\s+)/);\n\n const n = wordsA.length;\n const m = wordsB.length;\n const max = n + m;\n const v = new Int32Array(2 * max + 1);\n v[1] = 0;\n\n const trace: Int32Array[] = [];\n\n for (let d = 0; d <= max; d++) {\n trace.push(v.slice());\n for (let k = -d; k <= d; k += 2) {\n let x: number;\n if (k === -d || (k !== d && v[k - 1 + max] < v[k + 1 + max])) {\n x = v[k + 1 + max];\n } else {\n x = v[k - 1 + max] + 1;\n }\n let y = x - k;\n while (x < n && y < m && wordsA[x] === wordsB[y]) {\n x++;\n y++;\n }\n v[k + max] = x;\n if (x >= n && y >= m) {\n return buildDiffResult(trace, wordsA, wordsB, pageIndex);\n }\n }\n }\n\n return [\n { type: 'delete', text: textA, pageIndex },\n { type: 'add', text: textB, pageIndex }\n ];\n}\n\nfunction buildDiffResult(trace: Int32Array[], wordsA: string[], wordsB: string[], pageIndex: number): TextDiffSegment[] {\n let x = wordsA.length;\n let y = wordsB.length;\n const max = wordsA.length + wordsB.length;\n const rawResult: { type: 'equal' | 'add' | 'delete'; text: string }[] = [];\n\n for (let d = trace.length - 1; d >= 0; d--) {\n const v = trace[d];\n const k = x - y;\n\n let prevK: number;\n if (k === -d || (k !== d && v[k - 1 + max] < v[k + 1 + max])) {\n prevK = k + 1;\n } else {\n prevK = k - 1;\n }\n\n const prevX = v[prevK + max];\n const prevY = prevX - prevK;\n\n while (x > prevX && y > prevY) {\n rawResult.push({ type: 'equal', text: wordsA[x - 1] });\n x--;\n y--;\n }\n\n if (d > 0) {\n if (x === prevX) {\n rawResult.push({ type: 'add', text: wordsB[y - 1] });\n y--;\n } else if (y === prevY) {\n rawResult.push({ type: 'delete', text: wordsA[x - 1] });\n x--;\n }\n }\n }\n\n rawResult.reverse();\n\n const consolidated: TextDiffSegment[] = [];\n for (const item of rawResult) {\n if (consolidated.length > 0 && consolidated[consolidated.length - 1].type === item.type) {\n consolidated[consolidated.length - 1].text += item.text;\n } else {\n consolidated.push({ ...item, pageIndex });\n }\n }\n\n return consolidated;\n}\n\n/**\n * Colorizes a rendered page canvas with a custom hex tint.\n */\nexport function tintCanvas(ctx: CanvasRenderingContext2D, width: number, height: number, colorHex: string, opacity: number = 0.75) {\n ctx.save();\n ctx.globalCompositeOperation = 'source-atop';\n ctx.fillStyle = colorHex;\n ctx.globalAlpha = opacity;\n ctx.fillRect(0, 0, width, height);\n ctx.restore();\n}\n\n/**\n * Computes pixel-level difference bounding boxes between two rendered page canvases.\n */\nexport function computeCanvasPixelDiff(\n canvasA: HTMLCanvasElement,\n canvasB: HTMLCanvasElement,\n pageIndex: number,\n scale: number\n): DiffItem[] {\n const width = Math.min(canvasA.width, canvasB.width);\n const height = Math.min(canvasA.height, canvasB.height);\n if (width === 0 || height === 0) return [];\n\n const ctxA = canvasA.getContext('2d');\n const ctxB = canvasB.getContext('2d');\n if (!ctxA || !ctxB) return [];\n\n const imgDataA = ctxA.getImageData(0, 0, width, height);\n const imgDataB = ctxB.getImageData(0, 0, width, height);\n const dataA = imgDataA.data;\n const dataB = imgDataB.data;\n\n const diffItems: DiffItem[] = [];\n const GRID_SIZE = 32;\n const threshold = 30;\n\n for (let gy = 0; gy < height; gy += GRID_SIZE) {\n for (let gx = 0; gx < width; gx += GRID_SIZE) {\n let diffPixels = 0;\n const cellW = Math.min(GRID_SIZE, width - gx);\n const cellH = Math.min(GRID_SIZE, height - gy);\n\n for (let y = gy; y < gy + cellH; y += 4) {\n for (let x = gx; x < gx + cellW; x += 4) {\n const idx = (y * width + x) * 4;\n const dr = Math.abs(dataA[idx] - dataB[idx]);\n const dg = Math.abs(dataA[idx + 1] - dataB[idx + 1]);\n const db = Math.abs(dataA[idx + 2] - dataB[idx + 2]);\n\n if (dr + dg + db > threshold) {\n diffPixels++;\n }\n }\n }\n\n if (diffPixels > 3) {\n diffItems.push({\n id: `diff-${pageIndex}-${gx}-${gy}`,\n pageIndex,\n type: 'modification',\n description: `Visual difference detected at Page ${pageIndex} (${Math.round(gx / scale)}px, ${Math.round(gy / scale)}px)`,\n x: gx / scale,\n y: gy / scale,\n width: cellW / scale,\n height: cellH / scale\n });\n }\n }\n }\n\n return diffItems;\n}\n\n","/**\n * © 2026 AngelBot Ai Pvt Ltd. All rights reserved.\n */\nimport React, { useEffect, useRef, useState, useCallback, useMemo, useSyncExternalStore } 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, Undo2, Redo2, Underline, Strikethrough } 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 { newAnnotationId } from '../annotations/ids';\nimport type { AnnotationManager } from '../annotations/AnnotationManager';\nimport type { Redaction, WatermarkOptions, SDKPermissions, PdfAssetPaths, TransientHighlight, ToolMode } from '../core/types';\nimport TextSelectionTooltip from './TextSelectionTooltip';\nimport { findRegexRedactions } from '../utils/findRegexRedactions';\nimport { convertToUnrotated, convertToRotated, normalizeRotation } from '../utils/rotationUtils';\nimport { clampScale, calculateScrollCompensation } from '../utils/zoomUtils';\nimport { estimatePageDimensions, computeRowLayout, DEFAULT_FALLBACK_DIMS } from '../utils/layoutUtils';\nimport { useViewerBus, useBusEvent } from '../hooks/useViewerBus';\nimport { assertWorkerConfigured, configurePdfAssets, getDocumentParams } from '../core/pdfAssets';\nimport SideBySideViewer from './SideBySideViewer';\nimport CompareToolbar from './CompareToolbar';\nimport DiffSummarySidebar from './DiffSummarySidebar';\nimport CompareCurtainSlider from './CompareCurtainSlider';\nimport DiffHighlightOverlay from './DiffHighlightOverlay';\nimport type { CompareState, TextDiffSegment, DiffItem, DiffBoundingBox } from '../types/compare';\nimport { computeTextDiff, computePageDiffBoxes } from '../utils/pdfDiffEngine';\n\nexport interface DocumentLoadErrorInfo {\n url: string;\n passwordRequired: boolean;\n}\n\ninterface DocumentViewerProps {\n leftSidebarOpen: boolean;\n rightSidebarOpen: boolean;\n activeTab: string;\n /** Canonical annotation list, history, permissions and XFDF (owned by the viewer instance). */\n annotationManager: AnnotationManager;\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 /** Fires once per user click of Apply in the confirmation modal with all applied redactions. */\n onRedactionsApplied?: (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 /** Fires whenever any page canvas has finished rendering. */\n onPageRendered?: (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 page?: number;\n transientHighlights?: TransientHighlight[];\n permissions?: SDKPermissions;\n /** Whether to hide annotations and transient highlights until the page canvas has finished rendering. Default: true. */\n hideAnnotationsUntilPageRendered?: boolean;\n enableTextSelection?: boolean;\n defaultTool?: 'select' | 'pan';\n showSelectionTooltip?: boolean;\n}\n\nexport default function DocumentViewer({\n leftSidebarOpen, rightSidebarOpen, activeTab, annotationManager, initialDoc, loadNonce = 0, withCredentials = false, assets, sidebars = true,\n redactions, regexRedactions, scale, setScale, sidebarTab, setSidebarTab, onAnnotationsChange, onRedactionsChange, onRedactionsApplied,\n onDocumentLoaded, onLoadError, onFirstPageRendered, onPageRendered, onPageChange,\n pageTransition, pageLayout, rotation, setRotation, watermark, watermarkText, enableAnnotations: _enableAnnotations, initialPage, page, transientHighlights, permissions,\n hideAnnotationsUntilPageRendered = true,\n enableTextSelection = true,\n defaultTool = 'select',\n showSelectionTooltip = true\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 // Compare Mode State\n const [pdfDocB, setPdfDocB] = useState<pdfjsLib.PDFDocumentProxy | null>(null);\n const [compareState, setCompareState] = useState<CompareState>({\n isActive: false,\n mode: 'overlay',\n colorA: '#e11d48',\n colorB: '#2563eb',\n opacityA: 0.8,\n opacityB: 0.8,\n blendMode: 'difference',\n showCurtain: false,\n curtainPosition: 50,\n diffItems: [],\n currentDiffIndex: 0\n });\n const [textDiffs, setTextDiffs] = useState<TextDiffSegment[]>([]);\n const [isDiffSidebarOpen, setIsDiffSidebarOpen] = useState(false);\n\n // Latest-callback refs: parents may pass inline functions without re-triggering effects.\n const callbacksRef = useRef({ onRedactionsChange, onRedactionsApplied, onDocumentLoaded, onLoadError, onFirstPageRendered, onPageRendered, onPageChange });\n callbacksRef.current = { onRedactionsChange, onRedactionsApplied, onDocumentLoaded, onLoadError, onFirstPageRendered, onPageRendered, onPageChange };\n const assetsRef = useRef(assets);\n assetsRef.current = assets;\n\n const loadDocA = useCallback(async (docSource: string | ArrayBuffer | Uint8Array) => {\n try {\n assertWorkerConfigured();\n if (assetsRef.current) configurePdfAssets(assetsRef.current);\n const params: any = typeof docSource === 'string' ? { url: docSource } : { data: docSource };\n if (withCredentials) params.withCredentials = true;\n Object.assign(params, getDocumentParams());\n const loadingTask = pdfjsLib.getDocument(params);\n const loadedDocA = await loadingTask.promise;\n setPdfDoc(loadedDocA);\n callbacksRef.current.onDocumentLoaded?.(loadedDocA, typeof docSource === 'string' ? docSource : 'documentA.pdf');\n } catch (err: any) {\n console.error('Failed to load comparison document A:', err);\n }\n }, [withCredentials]);\n\n const loadCompareDoc = useCallback(async (docSource: string | ArrayBuffer | Uint8Array) => {\n try {\n assertWorkerConfigured();\n if (assetsRef.current) configurePdfAssets(assetsRef.current);\n const params: any = typeof docSource === 'string' ? { url: docSource } : { data: docSource };\n if (withCredentials) params.withCredentials = true;\n Object.assign(params, getDocumentParams());\n const loadingTask = pdfjsLib.getDocument(params);\n const loadedDocB = await loadingTask.promise;\n setPdfDocB(loadedDocB);\n setCompareState(prev => ({\n ...prev,\n isActive: true,\n diffItems: [\n { id: 'diff-1', pageIndex: 1, type: 'modification', description: 'Page 1 Differences detected' }\n ]\n }));\n setIsDiffSidebarOpen(true);\n } catch (err: any) {\n console.error('Failed to load comparison document B:', err);\n }\n }, [withCredentials]);\n\n useEffect(() => {\n if (compareState.isActive && pdfDoc && pdfDocB) {\n let cancelled = false;\n const computeAllDiffs = async () => {\n try {\n const totalPages = Math.min(pdfDoc.numPages, pdfDocB.numPages);\n let allSummary: DiffItem[] = [];\n const mapA: Record<number, DiffBoundingBox[]> = {};\n const mapB: Record<number, DiffBoundingBox[]> = {};\n\n for (let p = 1; p <= totalPages; p++) {\n const { diffsA, diffsB, summary } = await computePageDiffBoxes(pdfDoc, pdfDocB, p);\n if (cancelled) return;\n mapA[p] = diffsA;\n mapB[p] = diffsB;\n allSummary = allSummary.concat(summary);\n }\n\n if (!cancelled) {\n setCompareState(prev => ({\n ...prev,\n diffItems: allSummary,\n pageDiffsA: mapA,\n pageDiffsB: mapB\n }));\n }\n\n const pA = await pdfDoc.getPage(pageNum);\n const pB = await pdfDocB.getPage(Math.min(pageNum, pdfDocB.numPages));\n const textContentA = await pA.getTextContent();\n const textContentB = await pB.getTextContent();\n\n const strA = textContentA.items.map((i: any) => i.str).join(' ');\n const strB = textContentB.items.map((i: any) => i.str).join(' ');\n\n const diffs = computeTextDiff(strA, strB, pageNum);\n if (!cancelled) setTextDiffs(diffs);\n } catch (e) {\n console.error('Error computing document diffs:', e);\n }\n };\n computeAllDiffs();\n return () => { cancelled = true; };\n }\n }, [compareState.isActive, pdfDoc, pdfDocB, pageNum]);\n\n // Public Event Listeners for Compare APIs\n useEffect(() => {\n const handleStartCompare = (data: any) => {\n const { docA, docB, options } = data || {};\n if (options) {\n setCompareState(prev => ({\n ...prev,\n mode: options.mode || prev.mode,\n colorA: options.colorA || prev.colorA,\n colorB: options.colorB || prev.colorB,\n opacityA: options.opacityA || prev.opacityA,\n opacityB: options.opacityB || prev.opacityB,\n blendMode: options.blendMode || prev.blendMode\n }));\n }\n if (docA) {\n loadDocA(docA);\n }\n if (docB) {\n loadCompareDoc(docB);\n }\n };\n\n const handleStopCompare = () => {\n setCompareState(prev => ({ ...prev, isActive: false }));\n setPdfDocB(null);\n setTextDiffs([]);\n };\n\n const handleSetCompareMode = (mode: string) => {\n if (mode) setCompareState(prev => ({ ...prev, mode: mode as any }));\n };\n\n const handleSetCompareColors = (colorA: string, colorB: string) => {\n if (colorA && colorB) setCompareState(prev => ({ ...prev, colorA, colorB }));\n };\n\n const offStart = bus.on('action-start-compare', handleStartCompare);\n const offStop = bus.on('action-stop-compare', handleStopCompare);\n const offMode = bus.on<{ mode: string }>('action-set-compare-mode', (d) => d && handleSetCompareMode(d.mode));\n const offColors = bus.on<{ colorA: string; colorB: string }>('action-set-compare-colors', (d) => d && handleSetCompareColors(d.colorA, d.colorB));\n\n const windowStart = (e: any) => handleStartCompare(e.detail);\n const windowStop = () => handleStopCompare();\n const windowMode = (e: any) => handleSetCompareMode(e.detail?.mode);\n const windowColors = (e: any) => handleSetCompareColors(e.detail?.colorA, e.detail?.colorB);\n\n window.addEventListener('action-start-compare', windowStart);\n window.addEventListener('action-stop-compare', windowStop);\n window.addEventListener('action-set-compare-mode', windowMode);\n window.addEventListener('action-set-compare-colors', windowColors);\n\n return () => {\n offStart(); offStop(); offMode(); offColors();\n window.removeEventListener('action-start-compare', windowStart);\n window.removeEventListener('action-stop-compare', windowStop);\n window.removeEventListener('action-set-compare-mode', windowMode);\n window.removeEventListener('action-set-compare-colors', windowColors);\n };\n }, [bus, loadDocA, loadCompareDoc]);\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 // Per-page base dimensions (scale 1, UI rotation composed with the page's /Rotate). Index =\n // pageNumber - 1. Populated progressively after load so mixed-size documents lay out correctly.\n const [pageDims, setPageDims] = useState<Array<{ width: number; height: number }>>([]);\n const fallbackDims = pageDims[0] ?? DEFAULT_FALLBACK_DIMS;\n const dimsFor = useCallback(\n (p: number) => pageDims[p - 1] ?? fallbackDims,\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [pageDims, fallbackDims.width, fallbackDims.height]\n );\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 GAP = 16;\n\n // Rows of pages (1 or 2 per row depending on layout)\n const rows = 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 // Row geometry in scaled pixels: each row is as tall as its tallest page (+ gap).\n const rowLayout = useMemo(() => {\n return computeRowLayout(rows, dimsFor, scale, GAP);\n }, [rows, scale, dimsFor]);\n\n const rowsRef = useRef(rows);\n rowsRef.current = rows;\n const scaleRef = useRef(scale);\n scaleRef.current = scale;\n const rowLayoutRef = useRef(rowLayout);\n rowLayoutRef.current = rowLayout;\n const pageTransitionRef = useRef(pageTransition);\n pageTransitionRef.current = pageTransition;\n const visibleRowRef = useRef(0);\n\n const rowIndexOfPage = useCallback((p: number) => rows.findIndex(row => row.includes(p)), [rows]);\n\n const rowIndexAtOffset = useCallback((y: number) => {\n const tops = rowLayout.tops;\n if (tops.length === 0) return 0;\n let lo = 0, hi = tops.length - 1;\n while (lo < hi) {\n const mid = (lo + hi + 1) >> 1;\n if (tops[mid] <= y) lo = mid; else hi = mid - 1;\n }\n return lo;\n }, [rowLayout]);\n\n const scrollToPage = useCallback((p: number, options: { smooth?: boolean } = {}) => {\n const clampedPage = pdfDoc ? Math.max(1, Math.min(p, pdfDoc.numPages)) : Math.max(1, p);\n setPageNum(clampedPage);\n const i = rowIndexOfPage(clampedPage);\n if (i >= 0 && containerRef.current) {\n if (options.smooth) {\n containerRef.current.scrollTo({ top: rowLayout.tops[i], behavior: 'smooth' });\n } else {\n containerRef.current.scrollTop = rowLayout.tops[i];\n }\n }\n }, [pdfDoc, rowIndexOfPage, rowLayout]);\n\n useEffect(() => {\n const handleGoToPage = (detail?: { page: number; smooth?: boolean }) => {\n if (detail?.page) {\n scrollToPage(detail.page, { smooth: detail.smooth ?? true });\n }\n };\n const offGoToPage = bus.on<{ page: number; smooth?: boolean }>('action-go-to-page', (d) => handleGoToPage(d));\n const windowGoToPage = (e: any) => handleGoToPage(e.detail);\n window.addEventListener('action-go-to-page', windowGoToPage);\n\n return () => {\n offGoToPage();\n window.removeEventListener('action-go-to-page', windowGoToPage);\n };\n }, [bus, scrollToPage]);\n\n const handleSearchResultClick = (result: SearchResult) => {\n setPageNum(result.pageIndex);\n setActiveSearchResult(result);\n scrollToPage(result.pageIndex);\n };\n\n const handleSelectDiff = useCallback((idx: number, item?: DiffItem) => {\n const diffItem = item || compareState.diffItems[idx];\n setCompareState(prev => ({ ...prev, currentDiffIndex: idx }));\n\n if (!diffItem) return;\n\n if (diffItem.pageIndex && diffItem.pageIndex !== pageNum) {\n setPageNum(diffItem.pageIndex);\n }\n\n const targetY = (diffItem.y ?? 0) * scale;\n const targetX = (diffItem.x ?? 0) * scale;\n\n if (containerRef.current) {\n const p = diffItem.pageIndex || pageNum;\n const rIdx = rowIndexOfPage(p);\n const rowTop = pageTransition === 'continuous' && rIdx >= 0 ? (rowLayout.tops[rIdx] ?? 0) : 0;\n const viewHeight = containerRef.current.clientHeight || 600;\n const viewWidth = containerRef.current.clientWidth || 800;\n\n const scrollToY = Math.max(0, rowTop + targetY - viewHeight / 3);\n const scrollToX = Math.max(0, targetX - viewWidth / 4);\n\n containerRef.current.scrollTo({\n top: scrollToY,\n left: scrollToX,\n behavior: 'smooth'\n });\n }\n }, [compareState.diffItems, pageNum, scale, pageTransition, rowIndexOfPage, rowLayout.tops]);\n\n // The annotation list lives in the AnnotationManager (undo/redo, permissions, events, XFDF).\n const annotations = useSyncExternalStore(annotationManager.subscribe, annotationManager.getSnapshot, annotationManager.getSnapshot);\n const [activeTool, setActiveTool] = useState<ToolMode>(defaultTool);\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(defaultTool);\n }\n }, [activeTab, defaultTool]);\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 const clipboardAnnotationRef = useRef<Annotation | null>(null);\n\n\n useBusEvent<{ tool: ToolMode }>('action-set-tool', (d) => setActiveTool(d?.tool ?? null));\n\n useEffect(() => {\n const handleSelection = () => {\n const text = typeof window !== 'undefined' ? window.getSelection()?.toString() ?? '' : '';\n bus.emit('action-text-selected', { text });\n };\n document.addEventListener('selectionchange', handleSelection);\n return () => document.removeEventListener('selectionchange', handleSelection);\n }, [bus]);\n\n const zoomFocusRef = useRef<{vx: number | null, vy: number | null}>({ vx: null, vy: null });\n const prevScaleRef = useRef(scale);\n const isProgrammaticScaleRef = useRef(false);\n const initialFitDoneRef = useRef(false);\n\n useEffect(() => {\n initialFitDoneRef.current = false;\n }, [pdfDoc]);\n\n // Unified scroll offset maintenance for user-driven scale changes (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) return;\n\n const isProgrammatic = isProgrammaticScaleRef.current || !initialFitDoneRef.current || initialScrollDoneRef.current !== pdfDoc;\n initialFitDoneRef.current = true;\n isProgrammaticScaleRef.current = false;\n\n const newPos = calculateScrollCompensation({\n prevScale: s,\n newScale,\n containerWidth: container.clientWidth,\n containerHeight: container.clientHeight,\n currentScrollLeft: container.scrollLeft,\n currentScrollTop: container.scrollTop,\n basePageWidth: dimsFor(pageNum).width,\n focusPoint: zoomFocusRef.current,\n isProgrammatic,\n });\n\n zoomFocusRef.current = { vx: null, vy: null };\n\n if (isProgrammatic && pageNum > 1 && pageTransition === 'continuous') {\n const rIdx = rowIndexOfPage(pageNum);\n if (rIdx >= 0) {\n container.scrollTop = rowLayout.tops[rIdx] ?? 0;\n }\n container.scrollLeft = 0;\n } else {\n container.scrollLeft = newPos.scrollLeft;\n container.scrollTop = newPos.scrollTop;\n }\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [scale]);\n\n useEffect(() => {\n const container = containerRef.current;\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 roundedScale = clampScale(s * multiplier);\n if (roundedScale !== s) {\n zoomFocusRef.current = { \n vx: clientX - rect.left, \n vy: clientY - rect.top \n };\n }\n return roundedScale;\n });\n }\n };\n\n container.addEventListener('wheel', handleWheel, { passive: false });\n return () => container.removeEventListener('wheel', handleWheel);\n }, [setScale]);\n\n // Commit a new list to the manager (diffed into add/modify/delete, permission-checked, undoable).\n const commitAnnotations = useCallback((newAnns: Annotation[]) => {\n annotationManager.commit(newAnns);\n }, [annotationManager]);\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(() => { annotationManager.undo(); }, [annotationManager]);\n const handleRedo = useCallback(() => { annotationManager.redo(); }, [annotationManager]);\n\n // Live resizing & moving state for annotations\n const [liveResizingAnn, setLiveResizingAnn] = useState<Annotation | null>(null);\n const [liveMovingAnn, setLiveMovingAnn] = useState<Annotation | null>(null);\n const resizingRef = useRef<{\n annId: string;\n handle: string;\n startX: number;\n startY: number;\n initialAnn: Annotation;\n pageIndex: number;\n } | null>(null);\n const movingRef = useRef<{\n annId: string;\n startX: number;\n startY: number;\n initialAnn: Annotation;\n pageIndex: number;\n } | null>(null);\n\n const latestResizingAnnRef = useRef<Annotation | null>(null);\n latestResizingAnnRef.current = liveResizingAnn;\n const latestMovingAnnRef = useRef<Annotation | null>(null);\n latestMovingAnnRef.current = liveMovingAnn;\n\n const handleStartResize = useCallback((id: string, handle: string, e: React.MouseEvent, pageNum: number) => {\n const ann = annotations.find(a => a.id === id);\n if (!ann || permissions?.canEditAnnotations === false || !annotationManager.canEdit(ann)) return;\n const initialAnn = {\n ...ann,\n width: ann.width && ann.width > 0 ? ann.width : 180,\n height: ann.height && ann.height > 0 ? ann.height : 40\n };\n resizingRef.current = {\n annId: id,\n handle,\n startX: e.clientX,\n startY: e.clientY,\n initialAnn,\n pageIndex: pageNum\n };\n setLiveResizingAnn(initialAnn);\n }, [annotations, annotationManager, permissions]);\n\n const handleStartMove = useCallback((id: string, e: React.MouseEvent, pageNum: number) => {\n const ann = annotations.find(a => a.id === id);\n if (!ann || permissions?.canEditAnnotations === false || !annotationManager.canEdit(ann)) return;\n movingRef.current = {\n annId: id,\n startX: e.clientX,\n startY: e.clientY,\n initialAnn: { ...ann },\n pageIndex: pageNum\n };\n setLiveMovingAnn({ ...ann });\n }, [annotations, annotationManager, permissions]);\n\n const handleAnnotationDoubleClick = useCallback((id: string, e: React.MouseEvent) => {\n e.stopPropagation();\n const ann = annotations.find(a => a.id === id);\n if (ann && (ann.type === 'text' || ann.type === 'note' || ann.type === 'callout')) {\n if (permissions?.canEditAnnotations === false || !annotationManager.canEdit(ann)) {\n setSelectedAnnotationId(id);\n return;\n }\n setActiveTextEditor({\n x: ann.x,\n y: ann.y,\n type: ann.type as any,\n annId: ann.id,\n points: ann.points,\n pageIndex: ann.pageIndex\n });\n setCurrentText(ann.text || '');\n if (ann.color) setCurrentColor(ann.color);\n setSelectedAnnotationId(id);\n }\n }, [annotations, annotationManager, permissions]);\n\n useEffect(() => {\n const handleWindowMouseMove = (e: MouseEvent) => {\n if (resizingRef.current) {\n const { handle, startX, startY, initialAnn } = resizingRef.current;\n let dx = (e.clientX - startX) / scale;\n let dy = (e.clientY - startY) / scale;\n if (rotation === 90) {\n const tmp = dx; dx = dy; dy = -tmp;\n } else if (rotation === 180) {\n dx = -dx; dy = -dy;\n } else if (rotation === 270) {\n const tmp = dx; dx = -dy; dy = tmp;\n }\n\n let newW = initialAnn.width;\n let newH = initialAnn.height;\n let newX = initialAnn.x;\n let newY = initialAnn.y;\n\n if (handle.includes('e')) {\n newW = Math.max(30, initialAnn.width + dx);\n }\n if (handle.includes('s')) {\n newH = Math.max(16, initialAnn.height + dy);\n }\n if (handle.includes('w')) {\n newW = Math.max(30, initialAnn.width - dx);\n newX = initialAnn.x + (initialAnn.width - newW);\n }\n if (handle.includes('n')) {\n newH = Math.max(16, initialAnn.height - dy);\n newY = initialAnn.y + (initialAnn.height - newH);\n }\n\n setLiveResizingAnn({\n ...initialAnn,\n x: newX,\n y: newY,\n width: newW,\n height: newH\n });\n } else if (movingRef.current) {\n const { startX, startY, initialAnn } = movingRef.current;\n let dx = (e.clientX - startX) / scale;\n let dy = (e.clientY - startY) / scale;\n if (rotation === 90) {\n const tmp = dx; dx = dy; dy = -tmp;\n } else if (rotation === 180) {\n dx = -dx; dy = -dy;\n } else if (rotation === 270) {\n const tmp = dx; dx = -dy; dy = tmp;\n }\n\n setLiveMovingAnn({\n ...initialAnn,\n x: Math.max(0, initialAnn.x + dx),\n y: Math.max(0, initialAnn.y + dy)\n });\n }\n };\n\n const handleWindowMouseUp = () => {\n if (resizingRef.current) {\n if (latestResizingAnnRef.current) {\n const finalAnn = latestResizingAnnRef.current;\n commitAnnotations(annotations.map(a => a.id === finalAnn.id ? finalAnn : a));\n }\n resizingRef.current = null;\n setLiveResizingAnn(null);\n }\n if (movingRef.current) {\n if (latestMovingAnnRef.current) {\n const finalAnn = latestMovingAnnRef.current;\n commitAnnotations(annotations.map(a => a.id === finalAnn.id ? finalAnn : a));\n }\n movingRef.current = null;\n setLiveMovingAnn(null);\n }\n };\n\n window.addEventListener('mousemove', handleWindowMouseMove);\n window.addEventListener('mouseup', handleWindowMouseUp);\n return () => {\n window.removeEventListener('mousemove', handleWindowMouseMove);\n window.removeEventListener('mouseup', handleWindowMouseUp);\n };\n }, [scale, rotation, annotations, commitAnnotations]);\n\n const handleAnnotateSelection = useCallback((type: 'highlight' | 'underline' | 'strikeout' | 'squiggly') => {\n if (permissions?.canAddAnnotations === false) return;\n if (typeof window === 'undefined') return;\n const sel = window.getSelection();\n if (!sel || sel.isCollapsed || !sel.rangeCount) return;\n const range = sel.getRangeAt(0);\n const clientRects = Array.from(range.getClientRects());\n if (clientRects.length === 0) return;\n\n let node: Node | null = range.commonAncestorContainer;\n while (node && !(node instanceof HTMLElement && node.classList.contains('pdf-page-container'))) {\n node = node.parentNode;\n }\n if (!node || !(node instanceof HTMLElement)) return;\n\n const pageNumAttr = node.getAttribute('data-page-number') || node.id.replace('pdf-page-', '');\n const targetPage = parseInt(pageNumAttr, 10);\n if (!targetPage) return;\n\n const pageRect = node.getBoundingClientRect();\n const dims = dimsFor(targetPage);\n const unW = rotation % 180 === 0 ? dims.width : dims.height;\n const unH = rotation % 180 === 0 ? dims.height : dims.width;\n\n const rects = clientRects.map(r => {\n const rawX = (r.left - pageRect.left) / scale;\n const rawY = (r.top - pageRect.top) / scale;\n const rawW = r.width / scale;\n const rawH = r.height / scale;\n const p1 = convertToUnrotated(rawX, rawY, rotation, unW, unH);\n const p2 = convertToUnrotated(rawX + rawW, rawY + rawH, rotation, unW, unH);\n return {\n x: Math.min(p1.x, p2.x),\n y: Math.min(p1.y, p2.y),\n width: Math.abs(p2.x - p1.x),\n height: Math.abs(p2.y - p1.y)\n };\n }).filter(r => r.width > 2 && r.height > 2);\n\n if (rects.length === 0) return;\n\n const minX = Math.min(...rects.map(r => r.x));\n const minY = Math.min(...rects.map(r => r.y));\n const maxX = Math.max(...rects.map(r => r.x + r.width));\n const maxY = Math.max(...rects.map(r => r.y + r.height));\n\n const color = type === 'highlight' ? '#fbc02d' : type === 'squiggly' ? '#388e3c' : currentColor || '#d32f2f';\n const opacity = type === 'highlight' ? 0.5 : 1;\n const strokeWidth = type === 'squiggly' ? 1.5 : 2;\n\n const annId = newAnnotationId();\n commitAnnotations([...annotations, {\n id: annId,\n type,\n pageIndex: targetPage,\n x: minX,\n y: minY,\n width: maxX - minX,\n height: maxY - minY,\n rects: rects.length > 1 ? rects : undefined,\n color,\n strokeWidth,\n opacity\n }]);\n\n sel.removeAllRanges();\n }, [annotations, commitAnnotations, currentColor, dimsFor, permissions, rotation, scale]);\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 if (matchShortcut(e, getCommand('SEARCH'))) {\n e.preventDefault();\n bus.emit('action-open-search');\n return;\n }\n if (matchShortcut(e, getCommand('FILE_PICKER'))) {\n e.preventDefault();\n bus.emit('action-open-file-picker');\n return;\n }\n\n // Annotation clipboard & manipulation (only when not typing in text fields)\n if (!isInput && !activeTextEditor) {\n if (matchShortcut(e, getCommand('COPY'))) {\n const selectedText = typeof window !== 'undefined' ? window.getSelection()?.toString() : '';\n if (selectedText && selectedText.length > 0) {\n bus.emit('action-text-copied', { text: selectedText });\n return;\n }\n if (selectedAnnotationId) {\n const annToCopy = annotations.find(a => a.id === selectedAnnotationId);\n if (annToCopy) {\n e.preventDefault();\n clipboardAnnotationRef.current = annToCopy;\n }\n return;\n }\n }\n if (matchShortcut(e, getCommand('PASTE')) && clipboardAnnotationRef.current) {\n e.preventDefault();\n const base = clipboardAnnotationRef.current;\n const newAnn: Annotation = {\n ...base,\n id: newAnnotationId(),\n pageIndex: pageNum,\n x: base.x + 20,\n y: base.y + 20,\n author: undefined,\n authorId: undefined,\n createdAt: undefined,\n modifiedAt: undefined,\n readOnly: undefined,\n xfdfExtras: undefined\n };\n commitAnnotations([...annotations, newAnn]);\n setSelectedAnnotationId(newAnn.id);\n return;\n }\n if (matchShortcut(e, getCommand('DELETE')) && selectedAnnotationId) {\n e.preventDefault();\n commitAnnotations(annotations.filter(a => a.id !== selectedAnnotationId));\n setSelectedAnnotationId(null);\n return;\n }\n if (e.key === 'Enter' && selectedAnnotationId && !activeTextEditor) {\n const ann = annotations.find(a => a.id === selectedAnnotationId);\n if (ann && (ann.type === 'text' || ann.type === 'note' || ann.type === 'callout')) {\n e.preventDefault();\n setActiveTextEditor({\n x: ann.x,\n y: ann.y,\n type: ann.type as any,\n annId: ann.id,\n points: ann.points,\n pageIndex: ann.pageIndex\n });\n setCurrentText(ann.text || '');\n if (ann.color) setCurrentColor(ann.color);\n return;\n }\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 useEffect(() => {\n if (searchResults.length === 0) {\n setActiveSearchResult(null);\n }\n }, [searchResults]);\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 setPageDims([]);\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 try {\n const p1 = await doc.getPage(1);\n if (!cancelled) {\n const vp1 = p1.getViewport({ scale: 1, rotation: normalizeRotation(p1.rotate + rotation) });\n setPageDims(estimatePageDimensions(doc.numPages, { width: vp1.width, height: vp1.height }));\n }\n } catch {}\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, rotation]);\n\n const handlePageRendered = useCallback((renderedPage: number) => {\n callbacksRef.current.onPageRendered?.(renderedPage);\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 the target page (page ?? initialPage) as soon as row geometry is known,\n // and handle subsequent page/initialPage prop updates when citations are clicked.\n const initialScrollDoneRef = useRef<pdfjsLib.PDFDocumentProxy | null>(null);\n const lastTargetPageRef = useRef<number | undefined>(undefined);\n useEffect(() => {\n const target = page ?? initialPage;\n if (!pdfDoc || !target) return;\n if (initialScrollDoneRef.current === pdfDoc && lastTargetPageRef.current === target) return;\n if (pageDims.length < Math.min(target, pdfDoc.numPages)) return;\n\n const isInitial = initialScrollDoneRef.current !== pdfDoc;\n initialScrollDoneRef.current = pdfDoc;\n lastTargetPageRef.current = target;\n const t = setTimeout(() => scrollToPage(target, { smooth: !isInitial }), 50);\n return () => clearTimeout(t);\n }, [pdfDoc, page, initialPage, pageDims.length, scrollToPage]);\n\n // Measure base dimensions up front and reserve estimated space for all pages to avoid layout jumps / shaking on scroll.\n useEffect(() => {\n if (!pdfDoc) return;\n let cancelled = false;\n const doc = pdfDoc;\n\n (async () => {\n // 1. Measure Page 1 up front to obtain baseline page dimensions\n let p1: pdfjsLib.PDFPageProxy;\n try {\n p1 = await doc.getPage(1);\n } catch {\n return;\n }\n if (cancelled) return;\n\n const vp1 = p1.getViewport({ scale: 1, rotation: normalizeRotation(p1.rotate + rotation) });\n const p1Dim = { width: vp1.width, height: vp1.height };\n\n // 2. Reserve estimated space up front for all pages based on Page 1\n setPageDims((prev) => {\n if (\n prev.length === doc.numPages &&\n Math.abs((prev[0]?.width ?? 0) - p1Dim.width) <= 0.5 &&\n Math.abs((prev[0]?.height ?? 0) - p1Dim.height) <= 0.5\n ) {\n return prev;\n }\n return estimatePageDimensions(doc.numPages, p1Dim);\n });\n\n if (doc.numPages <= 1) return;\n\n // 3. Measure remaining page dimensions up front in parallel batches\n const allDims = estimatePageDimensions(doc.numPages, p1Dim);\n let mismatch = false;\n const batchSize = 25;\n\n for (let start = 2; start <= doc.numPages; start += batchSize) {\n if (cancelled) return;\n const end = Math.min(doc.numPages, start + batchSize - 1);\n const batchPromises: Promise<void>[] = [];\n\n for (let p = start; p <= end; p++) {\n const pageNum = p;\n batchPromises.push((async () => {\n try {\n const page = await doc.getPage(pageNum);\n if (cancelled) return;\n const vp = page.getViewport({ scale: 1, rotation: normalizeRotation(page.rotate + rotation) });\n if (Math.abs(vp.width - p1Dim.width) > 0.5 || Math.abs(vp.height - p1Dim.height) > 0.5) {\n mismatch = true;\n }\n allDims[pageNum - 1] = { width: vp.width, height: vp.height };\n } catch {\n // Retain estimated p1Dim\n }\n })());\n }\n\n await Promise.all(batchPromises);\n }\n\n if (cancelled) return;\n\n // 4. Update pageDims only if any page had different dimensions than the page 1 estimate\n if (mismatch) {\n const container = containerRef.current;\n if (container && container.scrollTop > 0 && pageTransitionRef.current === 'continuous') {\n const cRow = visibleRowRef.current;\n const newLayout = computeRowLayout(\n rowsRef.current,\n (p) => allDims[p - 1] ?? p1Dim,\n scaleRef.current,\n GAP\n );\n const oldTop = rowLayoutRef.current.tops[cRow] ?? 0;\n const newTop = newLayout.tops[cRow] ?? 0;\n const delta = newTop - oldTop;\n if (delta !== 0) {\n container.scrollTop += delta;\n }\n }\n setPageDims(allDims);\n }\n })();\n\n return () => {\n cancelled = true;\n };\n }, [pdfDoc, rotation]);\n\n // Dynamic Fit to Width calculation\n const handleFitToWidth = useCallback(() => {\n const dims = dimsFor(pageNum);\n if (!containerRef.current || !dims.width) return;\n const availableWidth = containerRef.current.clientWidth - 48;\n if (availableWidth > 0 && dims.width > 0) {\n const newScale = clampScale(availableWidth / dims.width);\n isProgrammaticScaleRef.current = true;\n if (containerRef.current && (pageNum === 1 || containerRef.current.scrollTop <= 1)) {\n containerRef.current.scrollTop = 0;\n containerRef.current.scrollLeft = 0;\n }\n setScale(newScale);\n }\n }, [dimsFor, pageNum, setScale]);\n\n // Dynamic Fit to Page calculation\n const handleFitToPage = useCallback(() => {\n const dims = dimsFor(pageNum);\n if (!containerRef.current || !dims.width || !dims.height) return;\n const availableWidth = containerRef.current.clientWidth - 48;\n const availableHeight = containerRef.current.clientHeight - 48;\n if (availableWidth > 0 && availableHeight > 0 && dims.width > 0 && dims.height > 0) {\n const scaleX = availableWidth / dims.width;\n const scaleY = availableHeight / dims.height;\n const newScale = clampScale(Math.min(scaleX, scaleY));\n isProgrammaticScaleRef.current = true;\n if (containerRef.current && (pageNum === 1 || containerRef.current.scrollTop <= 1)) {\n containerRef.current.scrollTop = 0;\n containerRef.current.scrollLeft = 0;\n }\n setScale(newScale);\n }\n }, [dimsFor, pageNum, setScale]);\n\n useBusEvent('action-fit-to-width', () => handleFitToWidth());\n useBusEvent('action-fit-to-page', () => handleFitToPage());\n\n const getUnrotatedPoint = (e: React.MouseEvent<Element>, pageNumber: number) => {\n const rect = e.currentTarget.getBoundingClientRect();\n const rawX = (e.clientX - rect.left) / scale;\n const rawY = (e.clientY - rect.top) / scale;\n const dims = dimsFor(pageNumber);\n const unW = rotation % 180 === 0 ? dims.width : dims.height;\n const unH = rotation % 180 === 0 ? dims.height : dims.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, targetPageNum);\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', 'underline', 'strikeout', 'squiggly', '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 = newAnnotationId();\n const defaultWidth = Math.max(160, Math.min(320, currentText.length * 9 + 20));\n const lineCount = currentText.split('\\n').length;\n const defaultHeight = Math.max(36, lineCount * 22);\n commitAnnotations([...annotations, {\n id: annId,\n type: activeTextEditor.type,\n pageIndex: activeTextEditor.pageIndex,\n x: activeTextEditor.x,\n y: activeTextEditor.y,\n width: defaultWidth,\n height: defaultHeight,\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 \n const { x, y } = getUnrotatedPoint(e, targetPageNum);\n setCurrentPos({ x, y });\n\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 if (activeTool === 'link') {\n const { x, y } = getUnrotatedPoint(e, targetPageNum);\n if (permissions?.canAddAnnotations === false) return;\n \n // Auto create a link box at click location\n const linkId = newAnnotationId();\n const newLinkAnn: any = {\n id: linkId,\n type: 'link',\n pageIndex: targetPageNum,\n x,\n y,\n width: 120,\n height: 35,\n text: 'Open Link',\n linkUrl: 'https://',\n color: 'transparent',\n strokeWidth: 0,\n opacity: 1,\n points: []\n };\n commitAnnotations([...annotations, newLinkAnn]);\n setSelectedAnnotationId(linkId);\n setIsLinkModalOpen(true);\n setActiveTool(null);\n return;\n } else if (activeTool === 'text' || activeTool === 'note') {\n const { x, y } = getUnrotatedPoint(e, targetPageNum);\n if (permissions?.canAddAnnotations === false) return;\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: newAnnotationId(), type: activeTool as any, pageIndex: targetPageNum,\n x: minX, y: minY, width: maxX - minX, height: maxY - minY,\n points: [...freehandPoints],\n strokes: [[...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 (['highlight', 'underline', 'strikeout', 'squiggly', 'redaction'].includes(activeTool) && 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: newAnnotationId(), 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' || activeTool === 'select') {\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 scrollToPage(targetPage);\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')) {\n if (permissions?.canEditAnnotations === false || !annotationManager.canEdit(ann)) {\n setSelectedAnnotationId(id);\n return;\n }\n // Open edit mode for note / callout\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 === 'text') {\n setSelectedAnnotationId(id);\n } else if (ann && ann.type === 'link') {\n if (permissions?.canEditAnnotations === false || !annotationManager.canEdit(ann)) {\n setSelectedAnnotationId(id);\n return;\n }\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 handleScroll = (e: React.UIEvent<HTMLDivElement>) => {\n setScrollPos({\n top: e.currentTarget.scrollTop,\n left: e.currentTarget.scrollLeft\n });\n visibleRowRef.current = rowIndexAtOffset(e.currentTarget.scrollTop);\n };\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, rowIndexAtOffset(midPoint)));\n const currentPage = rows[cRowIndex] ? rows[cRowIndex][0] : 1;\n if (currentPage !== pageNum) {\n setPageNum(currentPage);\n }\n }\n }, [scrollPos.top, scale, pdfDoc, pageNum, rowIndexAtOffset, 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={(p) => scrollToPage(p)}\n />\n )}\n <div style={{ flex: 1, display: 'flex', flexDirection: 'column', minWidth: 0, minHeight: 0, backgroundColor: 'var(--bg-color)', overflow: 'hidden' }}>\n {/* Compare Sub-toolbar */}\n {compareState.isActive && (\n <CompareToolbar\n compareState={compareState}\n onSetMode={(mode) => setCompareState(prev => ({ ...prev, mode }))}\n onSetColors={(colorA, colorB) => setCompareState(prev => ({ ...prev, colorA, colorB }))}\n onToggleCurtain={() => setCompareState(prev => ({ ...prev, showCurtain: !prev.showCurtain }))}\n onPrevDiff={() => {\n if (compareState.diffItems.length === 0) return;\n const newIdx = (compareState.currentDiffIndex - 1 + compareState.diffItems.length) % compareState.diffItems.length;\n handleSelectDiff(newIdx);\n }}\n onNextDiff={() => {\n if (compareState.diffItems.length === 0) return;\n const newIdx = (compareState.currentDiffIndex + 1) % compareState.diffItems.length;\n handleSelectDiff(newIdx);\n }}\n onExit={() => {\n setCompareState(prev => ({ ...prev, isActive: false }));\n setPdfDocB(null);\n setTextDiffs([]);\n }}\n />\n )}\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={<Undo2 size={16} />} disabled={!annotationManager.canUndo} onClick={handleUndo} label=\"Undo\" />\n <ToolButton icon={<Redo2 size={16} />} disabled={!annotationManager.canRedo} onClick={handleRedo} label=\"Redo\" />\n <div style={{ width: '1px', height: '24px', backgroundColor: 'var(--border-color)', margin: '0 4px' }} />\n\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={<Underline size={16} />} active={activeTool === 'underline'} onClick={() => { setActiveTool('underline'); setCurrentColor('#d32f2f'); setCurrentOpacity(1); setCurrentStrokeWidth(2); }} label=\"Underline\" />\n <ToolButton icon={<Strikethrough size={16} />} active={activeTool === 'strikeout'} onClick={() => { setActiveTool('strikeout'); setCurrentColor('#d32f2f'); setCurrentOpacity(1); setCurrentStrokeWidth(2); }} label=\"Strikeout\" />\n <ToolButton icon={<SquigglyIcon size={16} />} active={activeTool === 'squiggly'} onClick={() => { setActiveTool('squiggly'); setCurrentColor('#388e3c'); setCurrentOpacity(1); setCurrentStrokeWidth(1.5); }} label=\"Squiggly\" />\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', 'underline', 'strikeout', 'squiggly'].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 const nextManual: Redaction[] = manualRedactions.map(r => ({ ...r, status: 'applied' }));\n const nextAuto: Redaction[] = autoRedactions.map(r => ({ ...r, status: 'applied' }));\n const nextProp: Redaction[] = (redactions || []).map(r => ({ ...r, status: 'applied' }));\n const appliedList: Redaction[] = [...nextProp, ...nextAuto, ...nextManual].filter(r => r.status === 'applied');\n setManualRedactions(nextManual);\n setAutoRedactions(nextAuto);\n setIsCommitModalOpen(false);\n callbacksRef.current.onRedactionsApplied?.(appliedList);\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 / Compare Viewport Area */}\n <div style={{ flex: 1, display: 'flex', flexDirection: 'row', minWidth: 0, minHeight: 0, width: '100%', height: '100%', overflow: 'hidden', position: 'relative' }}>\n {compareState.isActive && compareState.mode === 'side-by-side' ? (\n <SideBySideViewer\n pdfDocA={pdfDoc}\n pdfDocB={pdfDocB}\n pageNum={pageNum}\n scale={scale}\n rotation={rotation}\n basePageDims={dimsFor(pageNum)}\n activeTab={activeTab}\n activeTool={activeTool}\n annotations={annotations}\n permissions={permissions}\n watermark={watermark}\n watermarkText={watermarkText}\n redactions={combinedRedactions}\n diffsA={compareState.pageDiffsA?.[pageNum] || []}\n diffsB={compareState.pageDiffsB?.[pageNum] || []}\n selectedDiffId={compareState.diffItems[compareState.currentDiffIndex]?.id}\n onSelectDiff={(id) => {\n const idx = compareState.diffItems.findIndex(d => d.id === id);\n if (idx !== -1) handleSelectDiff(idx);\n }}\n />\n ) : (\n <>\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 display: 'flex',\n flexDirection: 'column',\n minWidth: 0,\n minHeight: 0,\n overflow: 'hidden', \n position: 'relative', \n backgroundColor: 'var(--bg-color)', \n cursor: isPanning ? 'grabbing' : (activeTool === 'pan' ? 'grab' : (activeTool === 'eraser' ? 'cell' : (activeTool === 'select' || activeTool === null ? 'default' : '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') {\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 const hasTextSelection = Boolean(typeof window !== 'undefined' && window.getSelection()?.toString().trim());\n if (hasTextSelection) {\n // Allow native browser context menu on selected text (Copy, Search, etc.)\n return;\n }\n // Prevent default browser context menu on canvas\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 ? (rowLayout.tops[rIndex] ?? 0) : 0;\n \n // Virtualization filtering (only for continuous)\n if (isContinuous && containerRef.current) {\n // Scale-aware virtualization buffer: at high zoom levels each page is enormous,\n // so a smaller row buffer prevents mounting excessive gigantic canvas elements in DOM.\n const bufferBefore = scale >= 4 ? 1 : scale >= 2 ? 2 : 4;\n const bufferAfter = scale >= 4 ? 1 : scale >= 2 ? 2 : 5;\n if (rIndex < visibleRowRef.current - bufferBefore || rIndex > visibleRowRef.current + bufferAfter) {\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 (['highlight', 'underline', 'strikeout', 'squiggly'].includes(activeTool)) {\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: activeTool as any, pageIndex: activeDrawingPageNum,\n x, y, width, height,\n color: currentColor, strokeWidth: currentStrokeWidth, opacity: activeTool === 'highlight' ? currentOpacity : 1\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 const pageDim = dimsFor(p);\n const firstWidth = dimsFor(row[0]).width * scale;\n const thisWidth = pageDim.width * scale;\n if (row.length === 2) {\n if (pIdx === 0) pLeft = Math.max(0, cW / 2 - firstWidth);\n if (pIdx === 1) pLeft = Math.max(firstWidth, cW / 2);\n } else {\n pLeft = Math.max(0, cW / 2 - thisWidth / 2);\n }\n \n const displayAnns = annotations.map(a => (liveResizingAnn && a.id === liveResizingAnn.id ? liveResizingAnn : (liveMovingAnn && a.id === liveMovingAnn.id ? liveMovingAnn : a)));\n const pageAnnotations = (liveAnn && liveAnn.pageIndex === p) ? [...displayAnns, liveAnn] : displayAnns;\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={pageDim.width}\n basePageHeight={pageDim.height}\n activeTab={activeTab}\n activeTool={activeTool}\n annotations={pageAnnotations}\n transientHighlights={transientHighlights?.filter(h => h.pageIndex === p) || []}\n selectedAnnotationId={selectedAnnotationId}\n activeSearchResult={activeSearchResult}\n onMouseDown={handleMouseDown}\n onMouseMove={handleMouseMove}\n onMouseUp={handleMouseUp}\n onAnnotationClick={handleEraserClick}\n onAnnotationDoubleClick={handleAnnotationDoubleClick}\n onStartResize={handleStartResize}\n onStartMove={handleStartMove}\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 hideAnnotationsUntilPageRendered={hideAnnotationsUntilPageRendered}\n />\n {compareState.isActive && compareState.mode === 'overlay' && pdfDocB && (\n <div style={{\n position: 'absolute',\n top: `${rTop}px`,\n left: pLeft !== undefined ? `${pLeft}px` : '0px',\n width: `${pageDim.width * scale}px`,\n height: `${pageDim.height * scale}px`,\n pointerEvents: 'none',\n mixBlendMode: compareState.blendMode as any,\n opacity: compareState.opacityB,\n zIndex: 12,\n filter: 'contrast(1.2) brightness(0.95)'\n }}>\n <PageRenderer \n pageNum={p}\n pdfDoc={pdfDocB}\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={0}\n pageLeft={0}\n basePageWidth={pageDim.width}\n basePageHeight={pageDim.height}\n activeTab={activeTab}\n activeTool={null}\n annotations={[]}\n selectedAnnotationId={null}\n activeSearchResult={null}\n onMouseDown={() => {}}\n onMouseMove={() => {}}\n onMouseUp={() => {}}\n onAnnotationClick={() => {}}\n onAnnotationMouseEnter={() => {}}\n onClearSelection={() => {}}\n />\n </div>\n )}\n {compareState.isActive && (\n <div style={{\n position: 'absolute',\n top: `${rTop}px`,\n left: pLeft !== undefined ? `${pLeft}px` : '0px',\n width: `${pageDim.width * scale}px`,\n height: `${pageDim.height * scale}px`,\n pointerEvents: 'none',\n zIndex: 16\n }}>\n <DiffHighlightOverlay\n boxes={[\n ...(compareState.pageDiffsA?.[p] || []),\n ...(compareState.pageDiffsB?.[p] || [])\n ]}\n scale={scale}\n selectedDiffId={compareState.diffItems[compareState.currentDiffIndex]?.id}\n onSelectDiff={(id) => {\n const idx = compareState.diffItems.findIndex(d => d.id === id);\n if (idx !== -1) handleSelectDiff(idx);\n }}\n />\n </div>\n )}\n {activeTextEditor && activeTextEditor.pageIndex === p && (() => {\n const unW = rotation % 180 === 0 ? pageDim.width : pageDim.height;\n const unH = rotation % 180 === 0 ? pageDim.height : pageDim.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: `${rowLayout.total}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: `${rowLayout.heights[currentRowIndex] ?? 0}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={() => scrollToPage(Math.max(1, pageNum - 1))}\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={() => scrollToPage(Math.min(pdfDoc.numPages, pageNum + 1))}\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: newAnnotationId(), author: undefined, authorId: undefined, createdAt: undefined, modifiedAt: undefined, readOnly: undefined, xfdfExtras: undefined, 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 {compareState.isActive && compareState.showCurtain && (\n <CompareCurtainSlider\n positionPercent={compareState.curtainPosition}\n onChangePosition={(pos) => setCompareState(prev => ({ ...prev, curtainPosition: pos }))}\n containerRef={containerRef}\n />\n )}\n {enableTextSelection !== false && showSelectionTooltip !== false && (\n <TextSelectionTooltip\n containerRef={containerRef}\n onCopy={(text) => bus.emit('action-text-copied', { text })}\n onAnnotateSelection={handleAnnotateSelection}\n />\n )}\n </div>\n </>\n )}\n\n {compareState.isActive && (\n <DiffSummarySidebar\n isOpen={isDiffSidebarOpen}\n onClose={() => setIsDiffSidebarOpen(false)}\n diffItems={compareState.diffItems}\n textDiffs={textDiffs}\n currentDiffIndex={compareState.currentDiffIndex}\n onSelectDiff={(idx, item) => handleSelectDiff(idx, item)}\n onJumpToPage={(p) => scrollToPage(p)}\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, disabled }: { icon: React.ReactNode, active?: boolean, onClick: () => void, label: string, disabled?: boolean }) {\n return (\n <button\n onClick={disabled ? undefined : onClick}\n title={label}\n disabled={disabled}\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: disabled ? 'not-allowed' : 'pointer',\n opacity: disabled ? 0.38 : 1,\n pointerEvents: disabled ? 'none' : 'auto'\n }}\n onMouseEnter={e => { if (!active && !disabled) e.currentTarget.style.backgroundColor = '#f3f4f6'; }}\n onMouseLeave={e => { if (!active && !disabled) e.currentTarget.style.backgroundColor = 'transparent'; }}\n >\n {icon}\n </button>\n );\n}\n\nfunction SquigglyIcon({ size = 16 }: { size?: number }) {\n return (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M4 8v5a4 4 0 0 0 8 0V8\" />\n <path d=\"M4 19c1.5-1.5 2.5-1.5 4 0s2.5 1.5 4 0 2.5-1.5 4 0 2.5 1.5 4 0\" />\n </svg>\n );\n}\n\n\n","/**\n * © 2026 AngelBot Ai Pvt Ltd. All rights reserved.\n */\nimport React, { useState, useMemo } from 'react';\nimport { X, Edit2, Search, RotateCcw, Check } from 'lucide-react';\nimport { useShortcuts, parseCommandString } 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, resetShortcuts } = useShortcuts();\n const [activeTab, setActiveTab] = useState<'General' | 'Keyboard Shortcuts'>('Keyboard Shortcuts');\n const [editingAction, setEditingAction] = useState<ActionType | null>(null);\n const [searchQuery, setSearchQuery] = useState('');\n\n const handleKeyDown = (e: React.KeyboardEvent, action: ActionType) => {\n e.preventDefault();\n e.stopPropagation();\n\n // Escape cancels editing\n if (e.key === 'Escape') {\n setEditingAction(null);\n return;\n }\n\n // Ignore standalone modifier keys\n if (['Meta', 'Control', 'Shift', 'Alt'].includes(e.key)) return;\n\n const parts: string[] = [];\n if (e.metaKey || e.ctrlKey) parts.push('Meta');\n if (e.shiftKey) parts.push('Shift');\n if (e.altKey) parts.push('Alt');\n\n let key = e.key;\n if (key === ' ') key = 'Space';\n if (key === 'Backspace' || key === 'Delete') {\n key = 'Delete';\n } else if (e.shiftKey && (key === '+' || e.code === 'Equal')) {\n key = '=';\n } else if (e.shiftKey && (key === '_' || e.code === 'Minus')) {\n key = '-';\n } else if (key.length === 1) {\n key = key.toUpperCase();\n }\n\n parts.push(key);\n const internalCommand = parts.join('+');\n\n updateShortcut(action, internalCommand);\n setEditingAction(null);\n };\n\n const renderCommandBadges = (cmd: string) => {\n if (!cmd) return <span style={{ color: '#9ca3af', fontStyle: 'italic', fontSize: '13px' }}>None</span>;\n const parsed = parseCommandString(cmd);\n const isMac = typeof navigator !== 'undefined' && /mac/i.test(navigator.platform || navigator.userAgent || '');\n const tokens: string[] = [];\n\n if (parsed.meta) tokens.push(isMac ? '⌘' : 'Ctrl');\n if (parsed.alt) tokens.push(isMac ? '⌥' : 'Alt');\n if (parsed.shift) tokens.push(isMac ? '⇧' : 'Shift');\n if (parsed.key) {\n let k = parsed.key.toUpperCase();\n if (k === 'DELETE') k = isMac ? '⌫ Delete' : 'Del';\n tokens.push(k);\n }\n\n return (\n <div style={{ display: 'flex', gap: '4px', alignItems: 'center', flexWrap: 'wrap' }}>\n {tokens.map((t, idx) => (\n <kbd\n key={idx}\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n padding: '3px 7px',\n fontSize: '11.5px',\n fontFamily: 'ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace',\n fontWeight: 600,\n color: '#1f2937',\n backgroundColor: '#f3f4f6',\n border: '1px solid #d1d5db',\n borderRadius: '4px',\n boxShadow: '0 1px 1px rgba(0,0,0,0.06)',\n minWidth: '20px',\n textAlign: 'center',\n }}\n >\n {t}\n </kbd>\n ))}\n </div>\n );\n };\n\n const query = searchQuery.trim().toLowerCase();\n\n const filteredShortcuts = useMemo(() => {\n if (!query) return shortcuts;\n return shortcuts.filter((s: Shortcut) => {\n const descMatch = s.description.toLowerCase().includes(query);\n const actionMatch = s.action.toLowerCase().includes(query);\n const cmdMatch = s.command.toLowerCase().includes(query);\n return descMatch || actionMatch || cmdMatch;\n });\n }, [shortcuts, query]);\n\n const generalMatches = useMemo(() => {\n if (!query) return true;\n return 'forensic watermark persistent diagonal text overlay'.toLowerCase().includes(query) ||\n Boolean(watermarkText && watermarkText.toLowerCase().includes(query));\n }, [query, watermarkText]);\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: '8px', width: '800px', height: '620px', maxWidth: '92vw', maxHeight: '92vh', display: 'flex', flexDirection: 'column', boxShadow: '0 10px 25px rgba(0,0,0,0.2)', overflow: 'hidden' }}>\n \n {/* Header */}\n <div style={{ padding: '16px 24px', borderBottom: '1px solid var(--border-color)', display: 'flex', justifyContent: 'space-between', alignItems: 'center', backgroundColor: '#fff' }}>\n <h2 style={{ margin: 0, fontSize: '18px', fontWeight: 600, color: 'var(--text-color)' }}>Settings</h2>\n <button onClick={onClose} style={{ background: 'none', border: 'none', cursor: 'pointer', color: 'var(--text-muted)', display: 'flex', padding: '4px' }}>\n <X size={20} />\n </button>\n </div>\n\n {/* Search Bar */}\n <div style={{ padding: '12px 24px', borderBottom: '1px solid var(--border-color)', backgroundColor: '#fafafa' }}>\n <div style={{ position: 'relative' }}>\n <Search size={16} color=\"var(--text-muted)\" style={{ position: 'absolute', left: '12px', top: '50%', transform: 'translateY(-50%)' }} />\n <input \n type=\"text\" \n placeholder=\"Search shortcuts & settings...\" \n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n style={{\n width: '100%',\n padding: '9px 36px 9px 36px',\n border: '1px solid var(--border-color)',\n borderRadius: '6px',\n fontSize: '13px',\n boxSizing: 'border-box',\n outline: 'none',\n backgroundColor: '#fff',\n }}\n />\n {searchQuery && (\n <button\n onClick={() => setSearchQuery('')}\n style={{\n position: 'absolute', right: '10px', top: '50%', transform: 'translateY(-50%)',\n background: 'none', border: 'none', cursor: 'pointer', color: 'var(--text-muted)', display: 'flex', padding: 0\n }}\n title=\"Clear search\"\n >\n <X size={15} />\n </button>\n )}\n </div>\n </div>\n\n {/* Content */}\n <div style={{ display: 'flex', flex: 1, overflow: 'hidden' }}>\n {/* Sidebar Tabs */}\n <div style={{ width: '200px', borderRight: '1px solid var(--border-color)', backgroundColor: '#f9fafb', display: 'flex', flexDirection: 'column' }}>\n {(['General', 'Keyboard Shortcuts'] as const).map(tab => {\n const badgeCount = tab === 'Keyboard Shortcuts' ? (query ? filteredShortcuts.length : null) : (query && generalMatches ? 1 : null);\n return (\n <div \n key={tab}\n onClick={() => setActiveTab(tab)}\n style={{ \n padding: '12px 20px', \n cursor: 'pointer', \n backgroundColor: activeTab === tab ? '#eef2ff' : 'transparent', \n color: activeTab === tab ? 'var(--primary)' : 'var(--text-color)', \n fontWeight: activeTab === tab ? 600 : 400,\n fontSize: '13.5px',\n borderLeft: activeTab === tab ? '3px solid var(--primary)' : '3px solid transparent',\n transition: 'all 0.15s ease',\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center'\n }}\n >\n <span>{tab}</span>\n {badgeCount !== null && (\n <span style={{\n fontSize: '11px',\n padding: '1px 6px',\n borderRadius: '10px',\n backgroundColor: activeTab === tab ? 'var(--primary)' : '#e5e7eb',\n color: activeTab === tab ? '#fff' : '#4b5563',\n fontWeight: 600\n }}>\n {badgeCount}\n </span>\n )}\n </div>\n );\n })}\n </div>\n\n {/* Main Area */}\n <div style={{ flex: 1, overflowY: 'auto', padding: '24px' }}>\n {activeTab === 'Keyboard Shortcuts' && (\n <div>\n <div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center', marginBottom: '16px' }}>\n <span style={{ fontSize: '13px', color: 'var(--text-muted)' }}>\n {query ? `${filteredShortcuts.length} of ${shortcuts.length} shortcuts` : `${shortcuts.length} shortcuts available`}\n </span>\n <button\n onClick={resetShortcuts}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: '6px',\n background: 'none',\n border: '1px solid var(--border-color)',\n borderRadius: '4px',\n padding: '4px 10px',\n fontSize: '12px',\n color: 'var(--text-muted)',\n cursor: 'pointer',\n }}\n title=\"Reset all shortcuts to defaults\"\n >\n <RotateCcw size={13} />\n Reset to Defaults\n </button>\n </div>\n\n {filteredShortcuts.length === 0 ? (\n <div style={{ textAlign: 'center', padding: '40px 16px', color: 'var(--text-muted)', fontSize: '13px' }}>\n <div>No shortcuts matching &ldquo;{searchQuery}&rdquo;</div>\n {generalMatches && (\n <div style={{ marginTop: '8px' }}>\n <button\n onClick={() => setActiveTab('General')}\n style={{ background: 'none', border: 'none', color: 'var(--primary)', cursor: 'pointer', fontSize: '13px', fontWeight: 500, textDecoration: 'underline' }}\n >\n Matching setting found in General tab &rarr;\n </button>\n </div>\n )}\n <button\n onClick={() => setSearchQuery('')}\n style={{ marginTop: '8px', background: 'none', border: 'none', color: 'var(--primary)', cursor: 'pointer', fontSize: '13px', fontWeight: 500 }}\n >\n Clear search\n </button>\n </div>\n ) : (\n <table style={{ width: '100%', borderCollapse: 'collapse', fontSize: '13.5px' }}>\n <thead>\n <tr style={{ borderBottom: '1px solid var(--border-color)', textAlign: 'left', color: 'var(--text-muted)', fontSize: '12px' }}>\n <th style={{ padding: '8px 12px', fontWeight: 600, width: '220px' }}>Shortcut</th>\n <th style={{ padding: '8px 12px', fontWeight: 600 }}>Description</th>\n <th style={{ padding: '8px 12px', fontWeight: 600, width: '70px', textAlign: 'center' }}>Action</th>\n </tr>\n </thead>\n <tbody>\n {filteredShortcuts.map((s: Shortcut) => (\n <tr key={s.action} style={{ borderBottom: '1px solid #f0f0f0' }}>\n <td style={{ padding: '12px 12px' }}>\n {editingAction === s.action ? (\n <div style={{ display: 'flex', alignItems: 'center', gap: '6px' }}>\n <input \n autoFocus\n type=\"text\"\n placeholder=\"Press key combo...\"\n onKeyDown={(e) => handleKeyDown(e, s.action)}\n onBlur={() => setEditingAction(null)}\n style={{\n padding: '5px 8px',\n width: '150px',\n border: '2px solid var(--primary)',\n borderRadius: '4px',\n outline: 'none',\n fontSize: '12px',\n backgroundColor: '#eff6ff'\n }}\n />\n <button\n onMouseDown={(e) => { e.preventDefault(); setEditingAction(null); }}\n style={{ background: 'none', border: 'none', cursor: 'pointer', color: '#9ca3af', display: 'flex', padding: '2px' }}\n title=\"Cancel\"\n >\n <X size={14} />\n </button>\n </div>\n ) : (\n renderCommandBadges(s.command)\n )}\n </td>\n <td style={{ padding: '12px 12px', color: '#374151' }}>{s.description}</td>\n <td style={{ padding: '12px 12px', textAlign: 'center' }}>\n {editingAction === s.action ? (\n <span style={{ fontSize: '11px', color: 'var(--primary)', fontWeight: 600 }}>Recording</span>\n ) : (\n <button \n onClick={() => setEditingAction(s.action)}\n style={{\n background: '#f3f4f6',\n border: '1px solid #e5e7eb',\n borderRadius: '4px',\n cursor: 'pointer',\n color: 'var(--text-muted)',\n padding: '4px 8px',\n display: 'inline-flex',\n alignItems: 'center',\n gap: '4px',\n fontSize: '12px',\n }}\n title=\"Edit shortcut\"\n >\n <Edit2 size={13} /> Edit\n </button>\n )}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n )}\n </div>\n )}\n \n {activeTab === 'General' && (\n <div>\n {query && !generalMatches ? (\n <div style={{ textAlign: 'center', padding: '40px 16px', color: 'var(--text-muted)', fontSize: '13px' }}>\n <div>No general settings matching &ldquo;{searchQuery}&rdquo;</div>\n {filteredShortcuts.length > 0 && (\n <div style={{ marginTop: '8px' }}>\n <button\n onClick={() => setActiveTab('Keyboard Shortcuts')}\n style={{ background: 'none', border: 'none', color: 'var(--primary)', cursor: 'pointer', fontSize: '13px', fontWeight: 500, textDecoration: 'underline' }}\n >\n {filteredShortcuts.length} matching shortcut{filteredShortcuts.length > 1 ? 's' : ''} found in Keyboard Shortcuts &rarr;\n </button>\n </div>\n )}\n <button\n onClick={() => setSearchQuery('')}\n style={{ marginTop: '8px', background: 'none', border: 'none', color: 'var(--primary)', cursor: 'pointer', fontSize: '13px', fontWeight: 500 }}\n >\n Clear search\n </button>\n </div>\n ) : (\n <div style={{ marginTop: '8px' }}>\n <label style={{ display: 'block', fontSize: '14px', fontWeight: 600, color: '#1f2937', marginBottom: '4px' }}>\n Forensic Watermark\n </label>\n <div style={{ fontSize: '13px', color: 'var(--text-muted)', marginBottom: '12px' }}>\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: '9px 12px',\n border: '1px solid var(--border-color)',\n borderRadius: '6px',\n fontSize: '13.5px',\n outline: 'none',\n boxSizing: 'border-box'\n }}\n />\n {watermarkText && (\n <div style={{ display: 'flex', alignItems: 'center', gap: '6px', marginTop: '8px', color: '#16a34a', fontSize: '12.5px' }}>\n <Check size={14} /> Watermark active: &ldquo;{watermarkText}&rdquo;\n </div>\n )}\n </div>\n )}\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 * Page geometry — the single authority for converting between the viewer's \"base page space\"\n * (pdf.js viewport at scale 1 with the page's intrinsic /Rotate applied; top-left origin, points)\n * and PDF user space (bottom-left origin, as written into XFDF / drawn by pdf-lib).\n *\n * The transform replicates pdf.js `PageViewport` exactly (display_utils.js) so results are\n * identical to `viewport.convertToPdfPoint` / `convertToViewportPoint`, but it only needs the\n * page's `view` (viewBox) and `rotate`, which keeps it synchronous and unit-testable.\n */\nimport type { PDFDocumentProxy, PDFPageProxy } from 'pdfjs-dist';\nimport { normalizeRotation } from '../utils/rotationUtils';\n\nexport type Matrix = [number, number, number, number, number, number];\n\nexport interface PageGeometry {\n /** 1-based page number */\n pageNumber: number;\n /** PDF user-space bounding box [x0, y0, x1, y1] (the CropBox pdf.js renders). */\n viewBox: [number, number, number, number];\n /** Intrinsic page rotation (/Rotate), normalized to 0/90/180/270. */\n rotate: number;\n /** Base page size in points (already swapped for 90/270). */\n width: number;\n height: number;\n /** Base-space (viewer) -> PDF user-space transform is the inverse of this viewport transform. */\n transform: Matrix;\n}\n\nexport interface Rect {\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\nexport interface Point {\n x: number;\n y: number;\n}\n\n/** PDF rectangle as XFDF writes it: [llx, lly, urx, ury]. */\nexport type PdfRect = [number, number, number, number];\n\n/** Collapse -0 to 0 so equality checks and XFDF output never see a signed zero. */\nconst z = (n: number): number => (n === 0 ? 0 : n);\n\nfunction applyTransform(p: Point, m: Matrix): Point {\n return { x: z(p.x * m[0] + p.y * m[2] + m[4]), y: z(p.x * m[1] + p.y * m[3] + m[5]) };\n}\n\nfunction applyInverseTransform(p: Point, m: Matrix): Point {\n const d = m[0] * m[3] - m[1] * m[2];\n return {\n x: z((p.x * m[3] - p.y * m[2] + m[2] * m[5] - m[4] * m[3]) / d),\n y: z((-p.x * m[1] + p.y * m[0] + m[4] * m[1] - m[5] * m[0]) / d),\n };\n}\n\n/** Build the geometry for a page from its viewBox and intrinsic rotation (mirrors pdf.js PageViewport at scale 1). */\nexport function createPageGeometry(pageNumber: number, viewBox: [number, number, number, number], rotate: number): PageGeometry {\n const rotation = normalizeRotation(rotate);\n const [x0, y0, x1, y1] = viewBox;\n const centerX = (x1 + x0) / 2;\n const centerY = (y1 + y0) / 2;\n\n let rotateA: number, rotateB: number, rotateC: number, rotateD: number;\n switch (rotation) {\n case 180: rotateA = -1; rotateB = 0; rotateC = 0; rotateD = 1; break;\n case 90: rotateA = 0; rotateB = 1; rotateC = 1; rotateD = 0; break;\n case 270: rotateA = 0; rotateB = -1; rotateC = -1; rotateD = 0; break;\n default: rotateA = 1; rotateB = 0; rotateC = 0; rotateD = -1; break;\n }\n\n let offsetCanvasX: number, offsetCanvasY: number, width: number, height: number;\n if (rotateA === 0) {\n offsetCanvasX = Math.abs(centerY - y0);\n offsetCanvasY = Math.abs(centerX - x0);\n width = Math.abs(y1 - y0);\n height = Math.abs(x1 - x0);\n } else {\n offsetCanvasX = Math.abs(centerX - x0);\n offsetCanvasY = Math.abs(centerY - y0);\n width = x1 - x0;\n height = y1 - y0;\n }\n\n const transform: Matrix = [\n rotateA, rotateB, rotateC, rotateD,\n offsetCanvasX - rotateA * centerX - rotateC * centerY,\n offsetCanvasY - rotateB * centerX - rotateD * centerY,\n ];\n\n return { pageNumber, viewBox: [x0, y0, x1, y1], rotate: rotation, width, height, transform };\n}\n\nexport function geometryFromPage(page: PDFPageProxy): PageGeometry {\n const view = page.view as number[];\n return createPageGeometry(page.pageNumber, [view[0], view[1], view[2], view[3]], page.rotate);\n}\n\n/** Small per-document cache so callers can resolve geometry for many annotations cheaply. */\nexport function createGeometryResolver(pdfDoc: PDFDocumentProxy) {\n const cache = new Map<number, Promise<PageGeometry>>();\n return (pageNumber: number): Promise<PageGeometry> => {\n const n = Math.max(1, Math.min(pdfDoc.numPages, pageNumber));\n let p = cache.get(n);\n if (!p) {\n p = pdfDoc.getPage(n).then(geometryFromPage);\n cache.set(n, p);\n }\n return p;\n };\n}\n\nexport type GeometryResolver = (pageNumber: number) => Promise<PageGeometry>;\n\n// ---- point / rect / path conversions ----------------------------------------------------------\n\nexport function toPdfPoint(g: PageGeometry, p: Point): Point {\n return applyInverseTransform(p, g.transform);\n}\n\nexport function fromPdfPoint(g: PageGeometry, p: Point): Point {\n return applyTransform(p, g.transform);\n}\n\n/** Viewer rect (top-left origin) -> PDF rect [llx, lly, urx, ury]. */\nexport function rectToPdf(g: PageGeometry, r: Rect): PdfRect {\n const a = toPdfPoint(g, { x: r.x, y: r.y });\n const b = toPdfPoint(g, { x: r.x + r.width, y: r.y + r.height });\n return [Math.min(a.x, b.x), Math.min(a.y, b.y), Math.max(a.x, b.x), Math.max(a.y, b.y)];\n}\n\n/** PDF rect [llx, lly, urx, ury] -> viewer rect (top-left origin). */\nexport function rectFromPdf(g: PageGeometry, r: PdfRect): Rect {\n const a = fromPdfPoint(g, { x: r[0], y: r[1] });\n const b = fromPdfPoint(g, { x: r[2], y: r[3] });\n const x = Math.min(a.x, b.x);\n const y = Math.min(a.y, b.y);\n return { x, y, width: Math.abs(b.x - a.x), height: Math.abs(b.y - a.y) };\n}\n\nexport function pathToPdf(g: PageGeometry, points: Point[]): Point[] {\n return points.map((p) => toPdfPoint(g, p));\n}\n\nexport function pathFromPdf(g: PageGeometry, points: Point[]): Point[] {\n return points.map((p) => fromPdfPoint(g, p));\n}\n\n/**\n * XFDF QuadPoints for a viewer rect: x1,y1 (upper-left) x2,y2 (upper-right) x3,y3 (lower-left)\n * x4,y4 (lower-right) in PDF space — the order Acrobat and Apryse write for text markup.\n */\nexport function rectToQuadPoints(g: PageGeometry, r: Rect): number[] {\n const [llx, lly, urx, ury] = rectToPdf(g, r);\n return [llx, ury, urx, ury, llx, lly, urx, lly];\n}\n\n/** Bounding viewer rect of one or more XFDF quads (8 numbers each). */\nexport function quadPointsToRects(g: PageGeometry, quads: number[]): Rect[] {\n const rects: Rect[] = [];\n for (let i = 0; i + 7 < quads.length; i += 8) {\n const xs = [quads[i], quads[i + 2], quads[i + 4], quads[i + 6]];\n const ys = [quads[i + 1], quads[i + 3], quads[i + 5], quads[i + 7]];\n rects.push(rectFromPdf(g, [Math.min(...xs), Math.min(...ys), Math.max(...xs), Math.max(...ys)]));\n }\n return rects;\n}\n\nexport function unionRects(rects: Rect[]): Rect {\n if (rects.length === 0) return { x: 0, y: 0, width: 0, height: 0 };\n const x0 = Math.min(...rects.map((r) => r.x));\n const y0 = Math.min(...rects.map((r) => r.y));\n const x1 = Math.max(...rects.map((r) => r.x + r.width));\n const y1 = Math.max(...rects.map((r) => r.y + r.height));\n return { x: x0, y: y0, width: x1 - x0, height: y1 - y0 };\n}\n\n/** Round to 3 decimals for XFDF output (Apryse writes 3, Acrobat up to 6). */\nexport const fmt = (n: number): string => (Math.round(n * 1000) / 1000).toString();\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 * Geometry: every annotation is converted from the viewer's base page space to PDF user space\n * through `annotations/geometry.ts` (the same transform pdf.js uses), so baked markup lands exactly\n * where it was drawn — on any page size, CropBox offset or intrinsic /Rotate.\n */\nimport { PDFDocument, rgb, degrees, StandardFonts, BlendMode, type PDFPage } 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';\nimport { createGeometryResolver, pathToPdf, rectToPdf, toPdfPoint, type GeometryResolver, type PageGeometry } from '../annotations/geometry';\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 /** Page geometry resolver (from the loaded pdf.js document). Derived from the bytes when absent. */\n getPageGeometry?: GeometryResolver;\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; annotations are always taken from the live list / explicitAnnotations. */\n xfdfString?: string;\n}\n\nconst hexToRgb = (hex: string | undefined) => {\n const safe = hex && /^#[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\nfunction wrapText(text: string, maxWidth: number, fontSize: number): string[] {\n const approxCharWidth = fontSize * 0.55;\n const maxCharsPerLine = Math.max(1, Math.floor(maxWidth / approxCharWidth));\n const paragraphs = text.split('\\n');\n const lines: string[] = [];\n\n for (const p of paragraphs) {\n if (!p) {\n lines.push('');\n continue;\n }\n const words = p.split(/\\s+/);\n let currentLine = '';\n\n for (const word of words) {\n if (!currentLine) {\n currentLine = word;\n } else if ((currentLine + ' ' + word).length <= maxCharsPerLine) {\n currentLine += ' ' + word;\n } else {\n lines.push(currentLine);\n currentLine = word;\n }\n }\n if (currentLine) {\n lines.push(currentLine);\n }\n }\n return lines;\n}\n\nasync function bakeAnnotation(pdfDoc: PDFDocument, page: PDFPage, g: PageGeometry, ann: Annotation, signerName?: string): Promise<void> {\n const color = hexToRgb(ann.color);\n const opacity = ann.opacity ?? 1;\n const strokeWidth = ann.strokeWidth || 1;\n const rect = rectToPdf(g, { x: ann.x, y: ann.y, width: ann.width, height: ann.height });\n const [llx, lly, urx, ury] = rect;\n const w = urx - llx;\n const h = ury - lly;\n // Text drawn in user space appears rotated by /Rotate in the viewer; counter-rotate so it reads\n // upright the way it was authored.\n const textRotate = degrees(g.rotate);\n const topLeftBaseline = (x: number, y: number, size: number) => toPdfPoint(g, { x, y: y + size });\n\n switch (ann.type) {\n case 'rectangle':\n page.drawRectangle({ x: llx, y: lly, width: w, height: h, color, opacity, borderColor: color, borderWidth: strokeWidth, borderOpacity: 1 });\n return;\n case 'ellipse':\n page.drawEllipse({ x: llx + w / 2, y: lly + h / 2, xScale: w / 2, yScale: h / 2, color, opacity, borderColor: color, borderWidth: strokeWidth, borderOpacity: 1 });\n return;\n case 'highlight': {\n const rects = ann.rects && ann.rects.length > 0 ? ann.rects : [{ x: ann.x, y: ann.y, width: ann.width, height: ann.height }];\n for (const r of rects) {\n const [x0, y0, x1, y1] = rectToPdf(g, r);\n page.drawRectangle({ x: x0, y: y0, width: x1 - x0, height: y1 - y0, color, opacity: opacity < 1 ? opacity : 0.5, blendMode: BlendMode.Multiply });\n }\n return;\n }\n case 'underline': {\n const rects = ann.rects && ann.rects.length > 0 ? ann.rects : [{ x: ann.x, y: ann.y, width: ann.width, height: ann.height }];\n for (const r of rects) {\n const [s, e] = pathToPdf(g, [\n { x: r.x, y: r.y + r.height - 1.5 },\n { x: r.x + r.width, y: r.y + r.height - 1.5 }\n ]);\n page.drawLine({ start: s, end: e, color, opacity, thickness: strokeWidth || 1.5 });\n }\n return;\n }\n case 'strikeout': {\n const rects = ann.rects && ann.rects.length > 0 ? ann.rects : [{ x: ann.x, y: ann.y, width: ann.width, height: ann.height }];\n for (const r of rects) {\n const [s, e] = pathToPdf(g, [\n { x: r.x, y: r.y + r.height / 2 },\n { x: r.x + r.width, y: r.y + r.height / 2 }\n ]);\n page.drawLine({ start: s, end: e, color, opacity, thickness: strokeWidth || 1.5 });\n }\n return;\n }\n case 'squiggly': {\n const rects = ann.rects && ann.rects.length > 0 ? ann.rects : [{ x: ann.x, y: ann.y, width: ann.width, height: ann.height }];\n for (const r of rects) {\n const squigglyPts = [];\n const step = 3;\n let up = true;\n for (let curX = r.x; curX <= r.x + r.width; curX += step) {\n squigglyPts.push({ x: curX, y: r.y + r.height - (up ? 3 : 1) });\n up = !up;\n }\n if (squigglyPts.length >= 2) {\n const pdfPts = pathToPdf(g, squigglyPts);\n for (let i = 1; i < pdfPts.length; i++) {\n page.drawLine({ start: pdfPts[i - 1], end: pdfPts[i], color, opacity, thickness: strokeWidth || 1.5 });\n }\n }\n }\n return;\n }\n case 'line':\n case 'arrow': {\n const pts = ann.points && ann.points.length >= 2 ? ann.points : [{ x: ann.x, y: ann.y }, { x: ann.x + ann.width, y: ann.y + ann.height }];\n const [s, e] = pathToPdf(g, [pts[0], pts[1]]);\n page.drawLine({ start: s, end: e, color, opacity, thickness: strokeWidth });\n if (ann.type === 'arrow') {\n // Arrow head computed in viewer space (same as the on-screen rendering), then converted.\n const p1 = pts[0], p2 = pts[1];\n const angle = Math.atan2(p2.y - p1.y, p2.x - p1.x);\n const headLen = 15 + 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 const [ph1, ph2] = pathToPdf(g, [h1, h2]);\n page.drawLine({ start: ph1, end: e, color, opacity, thickness: strokeWidth });\n page.drawLine({ start: ph2, end: e, color, opacity, thickness: strokeWidth });\n }\n return;\n }\n case 'freehand': {\n const strokes = ann.strokes && ann.strokes.length > 0 ? ann.strokes : ann.points ? [ann.points] : [];\n for (const st of strokes) {\n const pdfPts = pathToPdf(g, st);\n for (let i = 1; i < pdfPts.length; i++) {\n page.drawLine({ start: pdfPts[i - 1], end: pdfPts[i], color, opacity, thickness: strokeWidth, lineCap: 1 });\n }\n }\n return;\n }\n case 'text': {\n if (!ann.text) return;\n const boxWidth = ann.width && ann.width > 0 ? ann.width : 200;\n const lines = wrapText(ann.text, boxWidth, 16);\n const lineHeight = 20;\n for (let i = 0; i < lines.length; i++) {\n if (!lines[i]) continue;\n const b = topLeftBaseline(ann.x, ann.y + i * lineHeight, 16);\n page.drawText(lines[i], { x: b.x, y: b.y, size: 16, color, opacity, rotate: textRotate });\n }\n return;\n }\n case 'note': {\n const [nx0, ny0, nx1, ny1] = rectToPdf(g, { x: ann.x, y: ann.y, width: 24, height: 24 });\n page.drawRectangle({ x: nx0, y: ny0, width: nx1 - nx0, height: ny1 - ny0, color: rgb(1, 0.97, 0.7), borderColor: color, borderWidth: strokeWidth });\n if (ann.text) {\n const b = topLeftBaseline(ann.x + 30, ann.y, 14);\n page.drawText(ann.text, { x: b.x, y: b.y, size: 14, color, opacity, rotate: textRotate });\n }\n return;\n }\n case 'callout': {\n const pts = ann.points && ann.points.length >= 2 ? ann.points : [{ x: ann.x, y: ann.y }, { x: ann.x, y: ann.y }];\n const [s, e] = pathToPdf(g, [pts[0], pts[1]]);\n page.drawLine({ start: s, end: e, color, opacity, thickness: strokeWidth });\n if (ann.text) {\n const boxW = ann.text.length * 8 + 20;\n const [bx0, by0, bx1, by1] = rectToPdf(g, { x: pts[1].x, y: pts[1].y, width: boxW, height: 24 });\n page.drawRectangle({ x: bx0, y: by0, width: bx1 - bx0, height: by1 - by0, color: rgb(1, 1, 1), borderColor: color, borderWidth: strokeWidth });\n const b = topLeftBaseline(pts[1].x + 10, pts[1].y + 2, 14);\n page.drawText(ann.text, { x: b.x, y: b.y, size: 14, color, opacity, rotate: textRotate });\n }\n return;\n }\n case 'signature': {\n if (!ann.imageUrl) return;\n const imageBytes = await fetch(ann.imageUrl).then((res) => res.arrayBuffer());\n const image = ann.imageUrl.startsWith('data:image/jpeg') || ann.imageUrl.startsWith('data:image/jpg')\n ? await pdfDoc.embedJpg(imageBytes)\n : await pdfDoc.embedPng(imageBytes);\n page.drawImage(image, { x: llx, y: lly, width: w, height: h, rotate: textRotate });\n return;\n }\n case 'digital_signature_placeholder': {\n const dateStr = ann.timestamp ? new Date(ann.timestamp).toLocaleString('en-GB') : new Date().toLocaleString('en-GB');\n const iconW = w * 0.15;\n page.drawRectangle({ x: llx, y: lly, width: w, height: h, color: rgb(1, 1, 1), borderColor: rgb(148 / 255, 163 / 255, 184 / 255), borderWidth: 1 });\n page.drawLine({ start: { x: llx + iconW, y: lly }, end: { x: llx + iconW, y: lly + h }, color: rgb(226 / 255, 232 / 255, 240 / 255), thickness: 1 });\n page.drawSvgPath('M22 6 L22 14 Q22 20 12 24 Q2 20 2 14 L2 6 L12 2 Z', { x: llx + iconW / 2 - 12, y: lly + h / 2 + 12, borderColor: rgb(2 / 255, 132 / 255, 199 / 255), borderWidth: 2, scale: 1 });\n page.drawSvgPath('M7 13 L10 16 L17 8', { x: llx + iconW / 2 - 12, y: lly + h / 2 + 12, borderColor: rgb(2 / 255, 132 / 255, 199 / 255), borderWidth: 2, scale: 1 });\n page.drawText(`Digitally signed by ${ann.signer || signerName || 'Unknown signer'}`, { x: llx + iconW + 10, y: lly + h - 16, size: 10, color: rgb(15 / 255, 23 / 255, 42 / 255) });\n page.drawText(`Date: ${dateStr}`, { x: llx + iconW + 10, y: lly + h - 28, size: 9, color: rgb(51 / 255, 65 / 255, 85 / 255) });\n page.drawText('Reason: Document Approval', { x: llx + iconW + 10, y: lly + h - 40, size: 9, color: rgb(51 / 255, 65 / 255, 85 / 255) });\n return;\n }\n case 'link':\n case 'opaque':\n default:\n return; // not visual (link) or not ours to render (opaque)\n }\n}\n\nasync function bakeWatermark(pdfDoc: PDFDocument, wm: WatermarkOptions): Promise<void> {\n const wmColor = hexToRgb(wm.color || '#737373');\n const wmOpacity = wm.opacity ?? 0.08;\n const helveticaFont = await pdfDoc.embedFont(StandardFonts.Helvetica);\n const angle = -Math.PI / 4;\n const cosA = Math.cos(angle);\n const sinA = Math.sin(angle);\n\n for (const page of pdfDoc.getPages()) {\n const { width, height } = page.getSize();\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 page.drawText(wm.text, {\n x: width / 2 + (dx * cosA - dy * sinA),\n y: height / 2 + (dx * sinA + dy * cosA),\n size: fontSize, font: helveticaFont, color: wmColor, opacity: wmOpacity, 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, { x: x + offset + rotatedDx, y: y + rotatedDy, size: fontSize, font: helveticaFont, color: wmColor, opacity: wmOpacity, rotate: degrees(-45) });\n }\n }\n }\n }\n}\n\nasync function rasterizeRedactions(pdfDoc: PDFDocument, redactions: Redaction[]): Promise<PDFDocument> {\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 = redactions.filter((r) => r.pageIndex === i);\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 const canvas = document.createElement('canvas');\n canvas.width = viewport.width;\n canvas.height = viewport.height;\n const ctx = canvas.getContext('2d');\n if (ctx) {\n await renderPage.render({ canvasContext: ctx, canvas, viewport }).promise;\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 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 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 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 if (i % 5 === 0) await new Promise((resolve) => setTimeout(resolve, 0));\n }\n } finally {\n await loadingTask.destroy().catch(() => {});\n }\n return flattenedPdf;\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 ignored; import the XFDF through annotationManager.importAnnotations() first.');\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 // Geometry: prefer the live pdf.js document; otherwise derive it from the bytes.\n let resolveGeometry = input.getPageGeometry;\n let geometryTask: pdfjsLib.PDFDocumentLoadingTask | null = null;\n if (!resolveGeometry && anns.length > 0) {\n geometryTask = pdfjsLib.getDocument({ data: sourceBytes.slice(), ...getDocumentParams() });\n resolveGeometry = createGeometryResolver(await geometryTask.promise);\n }\n\n try {\n for (const ann of anns) {\n const pageIdx = Math.max(0, Math.min((ann.pageIndex || 1) - 1, pages.length - 1));\n const g = await resolveGeometry!(pageIdx + 1);\n await bakeAnnotation(pdfDoc, pages[pageIdx], g, ann, input.signerName);\n }\n } finally {\n if (geometryTask) await geometryTask.destroy().catch(() => {});\n }\n\n if (input.watermark?.text) await bakeWatermark(pdfDoc, input.watermark);\n\n const combinedRedactions = input.redactions || [];\n const finalDoc = combinedRedactions.length > 0 ? await rasterizeRedactions(pdfDoc, combinedRedactions) : pdfDoc;\n return await finalDoc.save();\n}\n","/**\n * © 2026 AngelBot Ai Pvt Ltd. All rights reserved.\n * XFDF serializer / parser.\n *\n * Writes the subset of XFDF (ISO 32000 + Acrobat/Apryse conventions) that maps onto this viewer's\n * annotation model, and reads anything back. Elements it cannot model become `opaque`\n * annotations that re-export verbatim, and unknown attributes / children of known elements are\n * preserved in `xfdfExtras`, so a document can round-trip through another viewer (Apryse, Acrobat)\n * without losing metadata. Geometry goes through `annotations/geometry.ts`, the single coordinate\n * authority (base page space <-> PDF user space).\n */\nimport type { Annotation, AnnotationInput, AnnotationPoint } from './types';\nimport { newAnnotationId } from './ids';\nimport {\n fmt,\n pathFromPdf,\n pathToPdf,\n quadPointsToRects,\n rectFromPdf,\n rectToPdf,\n rectToQuadPoints,\n unionRects,\n type GeometryResolver,\n type PageGeometry,\n type PdfRect,\n type Point,\n} from './geometry';\n\nexport const XFDF_NS = 'http://ns.adobe.com/xfdf/';\n\nexport interface XfdfExportOptions {\n /** Annotations to serialize (default: all given). */\n annotList?: Annotation[];\n /** Write the author's display name into `title` (default true). */\n useDisplayAuthor?: boolean;\n}\n\n/** Custom data namespace inside Apryse's `trn-custom-data` element (survives an Apryse round-trip). */\nconst CUSTOM_KEY = 'tspdf';\n\n// ---- helpers ----------------------------------------------------------------------------------\n\nconst escapeXml = (s: string): string =>\n s.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\"/g, '&quot;').replace(/'/g, '&apos;');\n\nfunction pad(n: number, w = 2): string {\n return String(n).padStart(w, '0');\n}\n\n/** ISO-8601 -> PDF date `D:YYYYMMDDHHmmSS+HH'mm'`. */\nexport function toPdfDate(iso: string | undefined): string {\n const d = iso ? new Date(iso) : new Date();\n if (Number.isNaN(d.getTime())) return toPdfDate(undefined);\n const tz = -d.getTimezoneOffset();\n const sign = tz >= 0 ? '+' : '-';\n const tzh = pad(Math.floor(Math.abs(tz) / 60));\n const tzm = pad(Math.abs(tz) % 60);\n return `D:${d.getFullYear()}${pad(d.getMonth() + 1)}${pad(d.getDate())}${pad(d.getHours())}${pad(d.getMinutes())}${pad(d.getSeconds())}${sign}${tzh}'${tzm}'`;\n}\n\n/** PDF date -> ISO-8601 (best effort; returns undefined when unparseable). */\nexport function fromPdfDate(pdf: string | null | undefined): string | undefined {\n if (!pdf) return undefined;\n const m = /^D:(\\d{4})(\\d{2})?(\\d{2})?(\\d{2})?(\\d{2})?(\\d{2})?([+\\-Z])?(\\d{2})?'?(\\d{2})?/.exec(pdf.trim());\n if (!m) {\n const t = Date.parse(pdf);\n return Number.isNaN(t) ? undefined : new Date(t).toISOString();\n }\n const [, Y, Mo = '01', D = '01', h = '00', mi = '00', s = '00', tzs, tzh = '00', tzm = '00'] = m;\n let offset = '';\n if (tzs === 'Z' || !tzs) offset = 'Z';\n else offset = `${tzs}${tzh}:${tzm}`;\n const t = Date.parse(`${Y}-${Mo}-${D}T${h}:${mi}:${s}${offset}`);\n return Number.isNaN(t) ? undefined : new Date(t).toISOString();\n}\n\nconst toHexColor = (c: string | undefined): string | undefined => {\n if (!c || c === 'transparent') return undefined;\n if (/^#[0-9a-f]{6}$/i.test(c)) return c.toUpperCase();\n if (/^#[0-9a-f]{3}$/i.test(c)) return `#${c[1]}${c[1]}${c[2]}${c[2]}${c[3]}${c[3]}`.toUpperCase();\n return undefined;\n};\n\nconst attr = (name: string, value: string | number | undefined | null): string =>\n value === undefined || value === null || value === '' ? '' : ` ${name}=\"${escapeXml(String(value))}\"`;\n\nfunction customDataElement(data: Record<string, unknown>): string {\n return `<trn-custom-data bytes=\"${escapeXml(JSON.stringify({ [CUSTOM_KEY]: data }))}\"/>`;\n}\n\nfunction readCustomData(el: Element): Record<string, unknown> {\n const node = Array.from(el.children).find((c) => c.localName === 'trn-custom-data');\n if (!node) return {};\n try {\n const parsed = JSON.parse(node.getAttribute('bytes') || '{}');\n const data = parsed?.[CUSTOM_KEY];\n return data && typeof data === 'object' ? data : {};\n } catch {\n return {};\n }\n}\n\nfunction pointsAttr(points: Point[]): string {\n return points.map((p) => `${fmt(p.x)},${fmt(p.y)}`).join(';');\n}\n\nfunction parsePoints(s: string | null): Point[] {\n if (!s) return [];\n return s\n .split(';')\n .map((pair) => pair.trim().split(/[,\\s]+/).map(Number))\n .filter((xy) => xy.length >= 2 && xy.every((n) => Number.isFinite(n)))\n .map(([x, y]) => ({ x, y }));\n}\n\nfunction parseNumbers(s: string | null): number[] {\n if (!s) return [];\n return s.split(/[,\\s]+/).map(Number).filter((n) => Number.isFinite(n));\n}\n\nfunction pdfRectAttr(r: PdfRect): string {\n return r.map(fmt).join(',');\n}\n\n/** Attributes we own on every element (so they are not carried over from `xfdfExtras`). */\nconst OWNED_ATTRS = new Set([\n 'page', 'rect', 'color', 'interior-color', 'width', 'opacity', 'name', 'title', 'subject', 'date',\n 'creationdate', 'flags', 'coords', 'start', 'end', 'head', 'tail', 'icon', 'IT', 'callout', 'style',\n]);\n/** Child elements we own / regenerate. */\nconst OWNED_CHILDREN = new Set(['contents', 'contents-richtext', 'inklist', 'imagedata', 'OnActivation', 'trn-custom-data', 'defaultstyle', 'defaultappearance', 'popup', 'vertices']);\n\n// ---- export -----------------------------------------------------------------------------------\n\nfunction commonAttrs(a: Annotation, g: PageGeometry, useDisplayAuthor: boolean, rectOverride?: PdfRect): string {\n const rect = rectOverride ?? rectToPdf(g, { x: a.x, y: a.y, width: a.width, height: a.height });\n const created = a.createdAt ?? (a.timestamp ? new Date(a.timestamp).toISOString() : undefined);\n const flags = ['print', ...(a.readOnly ? ['readonly', 'locked'] : [])].join(',');\n return (\n attr('page', a.pageIndex - 1) +\n attr('rect', pdfRectAttr(rect)) +\n attr('name', a.id) +\n (useDisplayAuthor ? attr('title', a.author) : '') +\n attr('date', toPdfDate(a.modifiedAt ?? created)) +\n attr('creationdate', toPdfDate(created)) +\n attr('flags', flags) +\n attr('opacity', a.opacity !== undefined && a.opacity !== 1 ? fmt(a.opacity) : undefined)\n );\n}\n\nfunction extraAttrs(a: Annotation): string {\n const attrs = a.xfdfExtras?.attrs;\n if (!attrs) return '';\n return Object.entries(attrs)\n .filter(([k]) => !OWNED_ATTRS.has(k))\n .map(([k, v]) => attr(k, v))\n .join('');\n}\n\nfunction extraChildren(a: Annotation): string {\n return (a.xfdfExtras?.children ?? []).join('');\n}\n\nfunction customData(a: Annotation, extra: Record<string, unknown> = {}): string {\n const data: Record<string, unknown> = { type: a.type, ...extra };\n if (a.authorId) data.authorId = a.authorId;\n if (a.strokeWidth !== undefined) data.strokeWidth = a.strokeWidth;\n return customDataElement(data);\n}\n\nconst contentsElement = (text: string | undefined): string => (text ? `<contents>${escapeXml(text)}</contents>` : '');\n\nconst defaultStyle = (a: Annotation, size: number): string =>\n `<defaultstyle>font: Helvetica ${size}pt; text-align: left; color: ${toHexColor(a.color) ?? '#000000'}</defaultstyle>` +\n `<defaultappearance>0 0 0 rg /Helv ${size} Tf</defaultappearance>`;\n\n/** Serialize one annotation to an XFDF element (no envelope). */\nexport async function annotationToXfdfFragment(a: Annotation, resolve: GeometryResolver, opts: XfdfExportOptions = {}): Promise<string> {\n if (a.type === 'opaque' && a.rawXfdf) return a.rawXfdf;\n const g = await resolve(a.pageIndex);\n const useDisplayAuthor = opts.useDisplayAuthor !== false;\n const color = toHexColor(a.color);\n const strokeAttrs = attr('color', color) + attr('width', a.strokeWidth);\n const common = (rect?: PdfRect) => commonAttrs(a, g, useDisplayAuthor, rect) + extraAttrs(a);\n const tail = (extra: Record<string, unknown> = {}) => customData(a, extra) + extraChildren(a);\n\n switch (a.type) {\n case 'rectangle':\n return `<square${common()}${strokeAttrs}${attr('interior-color', color)} subject=\"Rectangle\">${tail()}</square>`;\n case 'ellipse':\n return `<circle${common()}${strokeAttrs}${attr('interior-color', color)} subject=\"Ellipse\">${tail()}</circle>`;\n case 'line':\n case 'arrow': {\n const pts = a.points && a.points.length >= 2 ? a.points : [{ x: a.x, y: a.y }, { x: a.x + a.width, y: a.y + a.height }];\n const [s, e] = pathToPdf(g, [pts[0], pts[1]]);\n const rect: PdfRect = [Math.min(s.x, e.x), Math.min(s.y, e.y), Math.max(s.x, e.x), Math.max(s.y, e.y)];\n const head = a.type === 'arrow' ? attr('head', 'OpenArrow') : '';\n return `<line${common(rect)}${strokeAttrs} start=\"${fmt(s.x)},${fmt(s.y)}\" end=\"${fmt(e.x)},${fmt(e.y)}\"${head} subject=\"${a.type === 'arrow' ? 'Arrow' : 'Line'}\">${tail()}</line>`;\n }\n case 'freehand': {\n const strokes = a.strokes && a.strokes.length > 0 ? a.strokes : a.points ? [a.points] : [];\n const gestures = strokes.map((st) => `<gesture>${pointsAttr(pathToPdf(g, st))}</gesture>`).join('');\n const all = strokes.flat();\n const bbox = all.length ? rectToPdf(g, boundsOf(all, a.strokeWidth)) : undefined;\n return `<ink${common(bbox)}${strokeAttrs} subject=\"Free Hand\"><inklist>${gestures}</inklist>${tail()}</ink>`;\n }\n case 'highlight':\n case 'underline':\n case 'strikeout':\n case 'squiggly': {\n const rects = a.rects && a.rects.length > 0 ? a.rects : [{ x: a.x, y: a.y, width: a.width, height: a.height }];\n const coords = rects.flatMap((r) => rectToQuadPoints(g, r)).map(fmt).join(',');\n const bbox = rectToPdf(g, unionRects(rects));\n const tag = a.type;\n const subject = a.type === 'highlight' ? 'Highlight' : a.type === 'underline' ? 'Underline' : a.type === 'strikeout' ? 'StrikeOut' : 'Squiggly';\n return `<${tag}${common(bbox)}${attr('color', color)} coords=\"${coords}\" subject=\"${subject}\">${tail()}</${tag}>`;\n }\n case 'text':\n return `<freetext${common()}${attr('color', color)} subject=\"Free Text\">${contentsElement(a.text)}${defaultStyle(a, 16)}${tail()}</freetext>`;\n case 'callout': {\n const pts = a.points && a.points.length >= 2 ? a.points : [{ x: a.x, y: a.y }, { x: a.x, y: a.y }];\n const [s, e] = pathToPdf(g, [pts[0], pts[1]]);\n const boxRect = rectToPdf(g, { x: pts[1].x, y: pts[1].y, width: a.text ? a.text.length * 8 + 20 : 100, height: 24 });\n const bbox: PdfRect = [Math.min(s.x, boxRect[0]), Math.min(s.y, boxRect[1]), Math.max(e.x, boxRect[2]), Math.max(e.y, boxRect[3])];\n return `<freetext${common(bbox)}${strokeAttrs} IT=\"FreeTextCallout\" callout=\"${fmt(s.x)},${fmt(s.y)},${fmt(e.x)},${fmt(e.y)}\" subject=\"Callout\">${contentsElement(a.text)}${defaultStyle(a, 14)}${tail({ box: boxRect })}</freetext>`;\n }\n case 'note':\n return `<text${common(rectToPdf(g, { x: a.x, y: a.y, width: 24, height: 24 }))}${attr('color', color)} icon=\"Comment\" subject=\"Sticky Note\">${contentsElement(a.text)}${tail()}</text>`;\n case 'link': {\n const url = a.linkUrl ?? '';\n const action = url.startsWith('#page=')\n ? `<OnActivation><Action Trigger=\"U\"><GoTo><Dest><Fit Page=\"${Math.max(0, (parseInt(url.slice(6), 10) || 1) - 1)}\"/></Dest></GoTo></Action></OnActivation>`\n : url\n ? `<OnActivation><Action Trigger=\"U\"><URI Name=\"${escapeXml(url)}\"/></Action></OnActivation>`\n : '';\n return `<link${common()}${attr('color', color)} subject=\"Link\">${action}${contentsElement(a.text)}${tail()}</link>`;\n }\n case 'signature':\n return `<stamp${common()} subject=\"Signature\">${a.imageUrl ? `<imagedata>${escapeXml(a.imageUrl)}</imagedata>` : ''}${tail({ signer: a.signer, signType: a.signType, timestamp: a.timestamp })}</stamp>`;\n case 'digital_signature_placeholder':\n return `<stamp${common()} subject=\"Digital Signature\">${tail({ signer: a.signer, timestamp: a.timestamp })}</stamp>`;\n case 'opaque':\n return a.rawXfdf ?? '';\n default:\n return '';\n }\n}\n\nfunction boundsOf(points: AnnotationPoint[], pad = 0) {\n const xs = points.map((p) => p.x);\n const ys = points.map((p) => p.y);\n const half = pad / 2;\n const x = Math.min(...xs) - half;\n const y = Math.min(...ys) - half;\n return { x, y, width: Math.max(...xs) - x + half, height: Math.max(...ys) - y + half };\n}\n\n/** Serialize annotations to a complete XFDF document. */\nexport async function annotationsToXfdf(annotations: Annotation[], resolve: GeometryResolver, opts: XfdfExportOptions = {}): Promise<string> {\n const list = opts.annotList ?? annotations;\n const fragments = await Promise.all(list.map((a) => annotationToXfdfFragment(a, resolve, opts)));\n return (\n `<?xml version=\"1.0\" encoding=\"UTF-8\"?>` +\n `<xfdf xmlns=\"${XFDF_NS}\" xml:space=\"preserve\"><annots>${fragments.filter(Boolean).join('')}</annots></xfdf>`\n );\n}\n\n// ---- import -----------------------------------------------------------------------------------\n\nfunction collectExtras(el: Element): Annotation['xfdfExtras'] {\n const attrs: Record<string, string> = {};\n for (const a of Array.from(el.attributes)) {\n if (!OWNED_ATTRS.has(a.name) && !a.name.startsWith('xmlns')) attrs[a.name] = a.value;\n }\n const children: string[] = [];\n for (const c of Array.from(el.children)) {\n if (!OWNED_CHILDREN.has(c.localName)) children.push(new XMLSerializer().serializeToString(c));\n }\n // Keep Apryse custom data that is not ours (e.g. teamsyncId) verbatim.\n const custom = Array.from(el.children).find((c) => c.localName === 'trn-custom-data');\n if (custom) {\n try {\n const parsed = JSON.parse(custom.getAttribute('bytes') || '{}');\n if (parsed && typeof parsed === 'object') {\n const rest = { ...parsed };\n delete rest[CUSTOM_KEY];\n if (Object.keys(rest).length > 0) {\n children.push(`<trn-custom-data bytes=\"${escapeXml(JSON.stringify(rest))}\"/>`);\n }\n }\n } catch {\n children.push(new XMLSerializer().serializeToString(custom));\n }\n }\n const out: Annotation['xfdfExtras'] = {};\n if (Object.keys(attrs).length) out.attrs = attrs;\n if (children.length) out.children = children;\n return Object.keys(out).length ? out : undefined;\n}\n\nfunction childText(el: Element, name: string): string | undefined {\n const c = Array.from(el.children).find((x) => x.localName === name);\n return c?.textContent ?? undefined;\n}\n\nfunction baseFromElement(el: Element, g: PageGeometry): Omit<AnnotationInput, 'type'> & { id: string } {\n const rectNums = parseNumbers(el.getAttribute('rect'));\n const rect = rectNums.length === 4 ? rectFromPdf(g, [rectNums[0], rectNums[1], rectNums[2], rectNums[3]]) : { x: 0, y: 0, width: 0, height: 0 };\n const custom = readCustomData(el);\n const color = toHexColor(el.getAttribute('color') || el.getAttribute('interior-color') || undefined) ?? '#000000';\n const opacityAttr = el.getAttribute('opacity');\n const opacity = opacityAttr !== null && Number.isFinite(Number(opacityAttr)) ? Number(opacityAttr) : 1;\n const widthAttr = el.getAttribute('width');\n const strokeWidth = typeof custom.strokeWidth === 'number' ? custom.strokeWidth : widthAttr !== null && Number.isFinite(Number(widthAttr)) ? Number(widthAttr) : 1;\n const flags = (el.getAttribute('flags') || '').toLowerCase();\n const readOnly = flags.includes('readonly') || flags.includes('locked');\n return {\n id: el.getAttribute('name') || newAnnotationId(),\n pageIndex: (parseInt(el.getAttribute('page') || '0', 10) || 0) + 1,\n x: rect.x,\n y: rect.y,\n width: rect.width,\n height: rect.height,\n color,\n strokeWidth,\n opacity,\n author: el.getAttribute('title') || undefined,\n authorId: typeof custom.authorId === 'string' ? custom.authorId : undefined,\n createdAt: fromPdfDate(el.getAttribute('creationdate')),\n modifiedAt: fromPdfDate(el.getAttribute('date')),\n readOnly: readOnly || undefined,\n xfdfExtras: collectExtras(el),\n };\n}\n\nfunction elementToAnnotation(el: Element, g: PageGeometry): Annotation | null {\n const kind = el.localName.toLowerCase();\n const custom = readCustomData(el);\n const base = baseFromElement(el, g);\n\n const opaque = (): Annotation => ({\n ...base,\n type: 'opaque',\n opaqueKind: kind,\n rawXfdf: new XMLSerializer().serializeToString(el),\n xfdfExtras: undefined,\n });\n\n switch (kind) {\n case 'square':\n return { ...base, type: 'rectangle' };\n case 'circle':\n return { ...base, type: 'ellipse' };\n case 'line': {\n const s = parseNumbers(el.getAttribute('start'));\n const e = parseNumbers(el.getAttribute('end'));\n const head = (el.getAttribute('head') || 'None').toLowerCase();\n const tailAttr = (el.getAttribute('tail') || 'None').toLowerCase();\n if (s.length < 2 || e.length < 2) return opaque();\n const [ps, pe] = pathFromPdf(g, [{ x: s[0], y: s[1] }, { x: e[0], y: e[1] }]);\n const bounds = boundsOf([ps, pe]);\n const isArrow = head !== 'none' || tailAttr !== 'none';\n return { ...base, ...bounds, type: isArrow ? 'arrow' : 'line', points: [ps, pe] };\n }\n case 'ink': {\n const gestures = Array.from(el.getElementsByTagName('*')).filter((n) => n.localName === 'gesture');\n const strokes = gestures.map((ge) => pathFromPdf(g, parsePoints(ge.textContent))).filter((st) => st.length > 0);\n if (strokes.length === 0) return opaque();\n const all = strokes.flat();\n return { ...base, ...boundsOf(all), type: 'freehand', points: strokes[0], strokes };\n }\n case 'highlight':\n case 'underline':\n case 'strikeout':\n case 'squiggly': {\n const quads = parseNumbers(el.getAttribute('coords'));\n const rects = quads.length >= 8 ? quadPointsToRects(g, quads) : [{ x: base.x, y: base.y, width: base.width, height: base.height }];\n const bbox = unionRects(rects);\n const type = kind as 'highlight' | 'underline' | 'strikeout' | 'squiggly';\n const defaultOpacity = type === 'highlight' ? 0.5 : 1;\n return {\n ...base,\n ...bbox,\n type,\n rects: rects.length > 1 ? rects : undefined,\n opacity: base.opacity === 1 && type === 'highlight' ? 0.5 : (base.opacity ?? defaultOpacity)\n };\n }\n case 'freetext': {\n const text = childText(el, 'contents') ?? '';\n const it = el.getAttribute('IT') || '';\n const callout = parseNumbers(el.getAttribute('callout'));\n if (it === 'FreeTextCallout' || custom.type === 'callout' || callout.length >= 4) {\n const pts = callout.length >= 4 ? pathFromPdf(g, [{ x: callout[0], y: callout[1] }, { x: callout[2], y: callout[3] }]) : [{ x: base.x, y: base.y }, { x: base.x, y: base.y }];\n return { ...base, type: 'callout', text, points: pts, x: pts[1].x, y: pts[1].y, width: Math.max(100, text.length * 8 + 20), height: 30 };\n }\n return { ...base, type: 'text', text, width: Math.max(base.width, 100), height: Math.max(base.height, 30) };\n }\n case 'text':\n return { ...base, type: 'note', text: childText(el, 'contents') ?? '', width: 24, height: 24 };\n case 'link': {\n const uri = Array.from(el.getElementsByTagName('*')).find((n) => n.localName === 'URI');\n const fit = Array.from(el.getElementsByTagName('*')).find((n) => n.localName === 'Fit' || n.localName === 'XYZ' || n.localName === 'FitH');\n let linkUrl = uri?.getAttribute('Name') ?? '';\n if (!linkUrl && fit) linkUrl = `#page=${(parseInt(fit.getAttribute('Page') || '0', 10) || 0) + 1}`;\n return { ...base, type: 'link', linkUrl, text: childText(el, 'contents') ?? '', color: 'transparent', strokeWidth: 0, opacity: 1, points: [] };\n }\n case 'stamp': {\n const image = childText(el, 'imagedata');\n if (custom.type === 'digital_signature_placeholder') {\n return { ...base, type: 'digital_signature_placeholder', signer: typeof custom.signer === 'string' ? custom.signer : undefined, timestamp: typeof custom.timestamp === 'number' ? custom.timestamp : undefined };\n }\n if (image) {\n return { ...base, type: 'signature', imageUrl: image, signer: typeof custom.signer === 'string' ? custom.signer : undefined, timestamp: typeof custom.timestamp === 'number' ? custom.timestamp : undefined };\n }\n return opaque();\n }\n default:\n return opaque();\n }\n}\n\n/**\n * Parse an XFDF document OR bare annotation elements (a concatenation of fragments) into\n * annotations. Unknown elements become `opaque` (re-exported verbatim).\n */\n/** Remove every `<?xml … ?>` declaration (linear scan — no regex backtracking on hostile input). */\nfunction stripXmlDeclarations(input: string): string {\n let out = '';\n let pos = 0;\n for (;;) {\n const start = input.indexOf('<?xml', pos);\n if (start === -1) break;\n const end = input.indexOf('?>', start + 5);\n if (end === -1) break;\n out += input.slice(pos, start);\n pos = end + 2;\n }\n return out + input.slice(pos);\n}\n\nexport async function parseXfdf(xml: string, resolve: GeometryResolver): Promise<Annotation[]> {\n // Hosts may store one full XFDF document per annotation and concatenate them inside an\n // envelope, so XML declarations can appear anywhere and <xfdf>/<annots> wrappers can nest.\n // Strip every declaration and collect annotation elements from every <annots> at any depth.\n const cleaned = stripXmlDeclarations(xml).trim();\n if (!cleaned) return [];\n // XFDF never carries a DTD; refuse one outright (entity expansion / external entity tricks).\n if (/<!DOCTYPE|<!ENTITY/i.test(cleaned)) {\n throw new Error('[teamsync-pdf-viewer] invalid XFDF: DOCTYPE/ENTITY declarations are not allowed');\n }\n // Parsed as application/xml: the parser is inert (no script execution, no resource loading)\n // and the resulting DOM is only read as data.\n const wrapped = `<xfdf xmlns=\"${XFDF_NS}\"><annots>${cleaned}</annots></xfdf>`;\n const doc = new DOMParser().parseFromString(wrapped, 'application/xml');\n const error = doc.getElementsByTagName('parsererror')[0];\n if (error) throw new Error(`[teamsync-pdf-viewer] invalid XFDF: ${error.textContent?.slice(0, 200)}`);\n\n const WRAPPERS = new Set(['xfdf', 'annots', 'fields', 'f', 'ids']);\n const elements = Array.from(doc.getElementsByTagName('*')).filter(\n (n) => n.parentElement?.localName === 'annots' && !WRAPPERS.has(n.localName)\n );\n const out: Annotation[] = [];\n for (const el of elements) {\n const page = (parseInt(el.getAttribute('page') || '0', 10) || 0) + 1;\n const g = await resolve(page);\n const ann = elementToAnnotation(el, g);\n if (ann) out.push(ann);\n }\n return out;\n}\n","/**\n * © 2026 AngelBot Ai Pvt Ltd. All rights reserved.\n * AnnotationManager — the canonical annotation list of a viewer instance.\n *\n * Responsibilities:\n * - single source of truth for the annotation list (React reads it via subscribe/getSnapshot)\n * - undo / redo history for user edits\n * - granular `annotationChanged` events (`add` | `modify` | `delete`, with an `imported` flag)\n * mirroring Apryse's annotationManager so host persistence bridges are near drop-in\n * - authorship stamping and edit permissions (read-only viewer, read-only annotation, other\n * author's annotation) enforced centrally in `commit()`\n * - XFDF import / export through `annotations/xfdf.ts` + `annotations/geometry.ts`\n */\nimport type { PDFDocumentProxy } from 'pdfjs-dist';\nimport type { Annotation, AnnotationInput } from './types';\nimport { newAnnotationId } from './ids';\nimport { createGeometryResolver, type GeometryResolver } from './geometry';\nimport { annotationsToXfdf, annotationToXfdfFragment, parseXfdf, type XfdfExportOptions } from './xfdf';\n\nexport type AnnotationAction = 'add' | 'modify' | 'delete';\n\nexport interface AnnotationChangedEvent {\n annotations: Annotation[];\n action: AnnotationAction;\n /** True when the change came from importAnnotations()/programmatic APIs flagged as imported. */\n imported: boolean;\n}\n\nexport interface CommitOptions {\n /** Mark the change as an import round-trip (not persisted by host bridges, not undoable). */\n imported?: boolean;\n /** Bypass read-only / authorship checks (programmatic host operations). */\n force?: boolean;\n /** Record in the undo history (default: true unless imported). */\n undoable?: boolean;\n}\n\nexport interface ViewerUserInfo {\n id?: string;\n name?: string;\n}\n\ntype ChangedListener = (event: AnnotationChangedEvent) => void;\n\n/** One undoable user action, recorded as the operations it performed (not a snapshot), so undo\n * and redo leave annotations imported in between untouched. */\ninterface HistoryEntry {\n added: Annotation[];\n modified: Array<{ before: Annotation; after: Annotation }>;\n deleted: Annotation[];\n}\n\nconst MAX_HISTORY = 100;\nconst nowIso = () => new Date().toISOString();\n\nexport class AnnotationManager {\n private list: Annotation[] = [];\n private past: HistoryEntry[] = [];\n private future: HistoryEntry[] = [];\n private changedListeners = new Set<ChangedListener>();\n private listListeners = new Set<() => void>();\n private user: ViewerUserInfo = {};\n private readOnly = false;\n private canEditOthers = false;\n private resolver: GeometryResolver | null = null;\n\n // ---- document / user / permissions ------------------------------------------------------\n\n setDocument(doc: PDFDocumentProxy | null): void {\n this.resolver = doc ? createGeometryResolver(doc) : null;\n }\n\n hasDocument(): boolean {\n return this.resolver !== null;\n }\n\n setCurrentUser(name: string, id?: string): void {\n this.user = { name, id: id ?? this.user.id };\n }\n\n setCurrentUserInfo(user: ViewerUserInfo | undefined): void {\n this.user = { ...(user ?? {}) };\n }\n\n getCurrentUser(): string {\n return this.user.name ?? '';\n }\n\n getCurrentUserInfo(): ViewerUserInfo {\n return { ...this.user };\n }\n\n setReadOnly(readOnly: boolean): void {\n this.readOnly = readOnly;\n }\n\n isReadOnly(): boolean {\n return this.readOnly;\n }\n\n /** Allow editing/deleting annotations authored by other users (default false). */\n setCanEditOthers(value: boolean): void {\n this.canEditOthers = value;\n }\n\n /** Whether the current user may modify or delete this annotation through the UI. */\n canEdit(a: Annotation): boolean {\n if (this.readOnly || a.readOnly || a.type === 'opaque') return false;\n if (this.canEditOthers) return true;\n if (!a.authorId && !a.author) return true; // unattributed (legacy / local draft)\n if (a.authorId) return Boolean(this.user.id) && a.authorId === this.user.id;\n return Boolean(this.user.name) && a.author === this.user.name;\n }\n\n canAdd(): boolean {\n return !this.readOnly;\n }\n\n // ---- reading --------------------------------------------------------------------------------\n\n /** The current list. The array reference is stable until the next change. */\n getAnnotationsList(): Annotation[] {\n return this.list;\n }\n\n getAnnotationById(id: string): Annotation | undefined {\n return this.list.find((a) => a.id === id);\n }\n\n /** React `useSyncExternalStore` pair. */\n subscribe = (listener: () => void): (() => void) => {\n this.listListeners.add(listener);\n return () => { this.listListeners.delete(listener); };\n };\n\n getSnapshot = (): Annotation[] => this.list;\n\n addEventListener(type: 'annotationChanged', listener: ChangedListener): () => void {\n if (type !== 'annotationChanged') return () => {};\n this.changedListeners.add(listener);\n return () => this.removeEventListener(type, listener);\n }\n\n removeEventListener(type: 'annotationChanged', listener: ChangedListener): void {\n if (type !== 'annotationChanged') return;\n this.changedListeners.delete(listener);\n }\n\n /** Apryse-compat no-op: React re-renders from the list. */\n drawAnnotationsFromList(_annotations: Annotation[]): void {}\n\n // ---- history --------------------------------------------------------------------------------\n\n get canUndo(): boolean {\n return this.past.length > 0;\n }\n\n get canRedo(): boolean {\n return this.future.length > 0;\n }\n\n undo(): boolean {\n const entry = this.past.pop();\n if (!entry) return false;\n const addedIds = new Set(entry.added.map((a) => a.id));\n const before = new Map(entry.modified.map((m) => [m.after.id, m.before]));\n const next = this.list.filter((a) => !addedIds.has(a.id)).map((a) => before.get(a.id) ?? a);\n for (const d of entry.deleted) if (!next.some((a) => a.id === d.id)) next.push(d);\n this.future.unshift(entry);\n this.apply(next, { force: true, undoable: false, imported: false, keepHistory: true });\n return true;\n }\n\n redo(): boolean {\n const entry = this.future.shift();\n if (!entry) return false;\n const deletedIds = new Set(entry.deleted.map((a) => a.id));\n const after = new Map(entry.modified.map((m) => [m.before.id, m.after]));\n const next = this.list.filter((a) => !deletedIds.has(a.id)).map((a) => after.get(a.id) ?? a);\n for (const ad of entry.added) if (!next.some((a) => a.id === ad.id)) next.push(ad);\n this.past.push(entry);\n this.apply(next, { force: true, undoable: false, imported: false, keepHistory: true });\n return true;\n }\n\n // ---- mutation ---------------------------------------------------------------------------------\n\n /**\n * Replace the whole list (the UI's edit path). Diffs against the current list, enforces\n * permissions (rejected edits keep the previous version), records history and emits one\n * `annotationChanged` event per action.\n */\n commit(next: Annotation[], opts: CommitOptions = {}): Annotation[] {\n return this.apply(next, { ...opts, keepHistory: false });\n }\n\n addAnnotations(inputs: AnnotationInput[], opts: CommitOptions = {}): Annotation[] {\n const withIds = inputs.map((i) => ({ ...i, id: i.id ?? newAnnotationId() }) as Annotation);\n this.commit([...this.list, ...withIds], opts);\n return withIds.map((a) => this.getAnnotationById(a.id)).filter((a): a is Annotation => Boolean(a));\n }\n\n updateAnnotation(id: string, patch: Partial<AnnotationInput>, opts: CommitOptions = {}): Annotation | undefined {\n const existing = this.getAnnotationById(id);\n if (!existing) return undefined;\n this.commit(this.list.map((a) => (a.id === id ? { ...a, ...patch, id } : a)), opts);\n return this.getAnnotationById(id);\n }\n\n deleteAnnotations(targets: Array<Annotation | string>, opts: CommitOptions = {}): void {\n const ids = new Set(targets.map((t) => (typeof t === 'string' ? t : t.id)));\n this.commit(this.list.filter((a) => !ids.has(a.id)), opts);\n }\n\n /** Remove every annotation (e.g. on document switch). Not undoable, emits deletes as imported. */\n clear(): void {\n this.past = [];\n this.future = [];\n this.apply([], { imported: true, force: true, undoable: false, keepHistory: false });\n }\n\n // ---- XFDF -------------------------------------------------------------------------------------\n\n /**\n * Import an XFDF document or bare fragments. Annotations whose `name` already exists are\n * replaced (modify), new ones added; the change is flagged `imported` and is not undoable.\n * Returns the imported annotations as they now exist in the list.\n */\n async importAnnotations(xfdf: string): Promise<Annotation[]> {\n const resolver = this.requireResolver();\n const parsed = await parseXfdf(xfdf, resolver);\n if (parsed.length === 0) return [];\n const incoming = new Map(parsed.map((a) => [a.id, a]));\n const merged = this.list.map((a) => incoming.get(a.id) ?? a);\n for (const a of parsed) if (!this.list.some((x) => x.id === a.id)) merged.push(a);\n this.commit(merged, { imported: true, force: true, undoable: false });\n return parsed.map((a) => this.getAnnotationById(a.id)).filter((a): a is Annotation => Boolean(a));\n }\n\n /**\n * Export as XFDF. With `annotList`, returns the bare fragment(s) for those annotations (the\n * form hosts persist per annotation); without it, a complete XFDF document.\n */\n async exportAnnotations(opts: XfdfExportOptions = {}): Promise<string> {\n const resolver = this.requireResolver();\n if (opts.annotList) {\n const parts = await Promise.all(opts.annotList.map((a) => annotationToXfdfFragment(a, resolver, opts)));\n return parts.join('');\n }\n return annotationsToXfdf(this.list, resolver, opts);\n }\n\n /** Legacy bespoke JSON export (pre-1.2 `exportAnnotations()` shape). */\n exportAnnotationsLegacyJson(): string {\n return JSON.stringify(this.list, null, 2);\n }\n\n // ---- internals ----------------------------------------------------------------------------------\n\n private requireResolver(): GeometryResolver {\n if (!this.resolver) throw new Error('[teamsync-pdf-viewer] no document loaded — XFDF needs page geometry');\n return this.resolver;\n }\n\n private apply(next: Annotation[], opts: CommitOptions & { keepHistory: boolean }): Annotation[] {\n const prev = this.list;\n const imported = Boolean(opts.imported);\n const force = Boolean(opts.force);\n const prevById = new Map(prev.map((a) => [a.id, a]));\n const nextIds = new Set(next.map((a) => a.id));\n\n const added: Annotation[] = [];\n const modified: Annotation[] = [];\n const modifiedPairs: Array<{ before: Annotation; after: Annotation }> = [];\n const deleted: Annotation[] = [];\n const finalList: Annotation[] = [];\n\n for (const a of next) {\n const p = prevById.get(a.id);\n if (!p) {\n if (!imported && !force && this.readOnly) continue; // reject: viewer is read-only\n const stamped = this.stampNew(a, imported);\n added.push(stamped);\n finalList.push(stamped);\n } else if (p !== a) {\n if (!imported && !force && !this.canEdit(p)) {\n finalList.push(p); // reject the edit, keep the previous version\n continue;\n }\n const m: Annotation = imported ? a : { ...a, modifiedAt: nowIso() };\n modified.push(m);\n modifiedPairs.push({ before: p, after: m });\n finalList.push(m);\n } else {\n finalList.push(a);\n }\n }\n for (const p of prev) {\n if (nextIds.has(p.id)) continue;\n if (!imported && !force && !this.canEdit(p)) {\n finalList.push(p); // reject the deletion\n continue;\n }\n deleted.push(p);\n }\n\n if (added.length === 0 && modified.length === 0 && deleted.length === 0) {\n // Nothing effectively changed (all edits rejected or identical list): keep the reference.\n return this.list;\n }\n\n if (!opts.keepHistory && (opts.undoable ?? !imported)) {\n this.past.push({ added, modified: modifiedPairs, deleted });\n if (this.past.length > MAX_HISTORY) this.past.shift();\n this.future = [];\n }\n\n this.list = finalList;\n for (const l of Array.from(this.listListeners)) {\n try { l(); } catch (err) { console.error('[teamsync-pdf-viewer] list listener threw', err); }\n }\n if (added.length) this.emit({ annotations: added, action: 'add', imported });\n if (modified.length) this.emit({ annotations: modified, action: 'modify', imported });\n if (deleted.length) this.emit({ annotations: deleted, action: 'delete', imported });\n return this.list;\n }\n\n private stampNew(a: Annotation, imported: boolean): Annotation {\n if (imported) return a;\n const created = a.createdAt ?? nowIso();\n return {\n ...a,\n author: a.author ?? this.user.name,\n authorId: a.authorId ?? this.user.id,\n createdAt: created,\n modifiedAt: a.modifiedAt ?? created,\n };\n }\n\n private emit(event: AnnotationChangedEvent): void {\n for (const l of Array.from(this.changedListeners)) {\n try { l(event); } catch (err) { console.error('[teamsync-pdf-viewer] annotationChanged listener threw', err); }\n }\n }\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 { AnnotationManager } from '../annotations/AnnotationManager';\nimport { createGeometryResolver } from '../annotations/geometry';\nimport type { Redaction, WatermarkOptions, ViewerEventMap, ViewerEventType, TransientHighlight } from './types';\nimport { searchPdfText, type SearchResult } from '../hooks/usePdfSearch';\nimport { copyTextToClipboard } from '../utils/clipboardUtils';\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 goToPage(pageNumber: number, options?: { smooth?: boolean }): void;\n getTransientHighlights(): TransientHighlight[];\n setTransientHighlights(highlights: TransientHighlight[]): 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 /** Annotation list, history, permissions and XFDF import/export. */\n readonly annotationManager: AnnotationManager;\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, annotationManager: AnnotationManager = new AnnotationManager()) {\n this.bus = bus;\n this.annotationManager = annotationManager;\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 /** Navigate to a specific page number (1-based). */\n goToPage(pageNumber: number, options: { smooth?: boolean } = {}): void {\n const b = this.binding;\n if (b) {\n b.goToPage(pageNumber, options);\n } else {\n this.bus.emit('action-go-to-page', { page: pageNumber, smooth: options.smooth });\n }\n }\n\n /** Set the current page number (1-based). Alias of goToPage. */\n setCurrentPage(pageNumber: number): void {\n this.goToPage(pageNumber);\n }\n\n /**\n * Search the document for text matches, returning snippets and page bounding boxes.\n *\n * @param query - Search term.\n * @param options - Search options:\n * - `pages`: Specific 1-based page numbers to search. Defaults to all pages.\n */\n async searchText(query: string, options: { pages?: number[] } = {}): Promise<SearchResult[]> {\n const pdf = this.getPdfDocument();\n if (!pdf) return [];\n const b = this.binding;\n const redactions = b ? b.getRedactions() : [];\n return searchPdfText(pdf, query, redactions, undefined, options.pages);\n }\n\n // ---- transient highlights (citations, search matches) -----------------------------------\n\n /** Get the current list of transient highlights. */\n getTransientHighlights(): TransientHighlight[] {\n return this.binding?.getTransientHighlights() ?? [];\n }\n\n /**\n * Set transient visual highlights across one or more pages.\n * These render directly on the PDF canvas but are NEVER saved into AnnotationManager\n * or exported to XFDF.\n */\n setTransientHighlights(highlights: TransientHighlight[]): void {\n const b = this.binding;\n if (b) {\n b.setTransientHighlights(highlights);\n } else {\n this.bus.emit('action-set-transient-highlights', { highlights });\n }\n this.bus.emit('transientHighlightsChanged', { highlights });\n }\n\n /** Add a single transient highlight to the current list. */\n addTransientHighlight(highlight: TransientHighlight): void {\n const current = this.getTransientHighlights();\n this.setTransientHighlights([...current, highlight]);\n }\n\n /** Clear all active transient highlights. */\n clearTransientHighlights(): void {\n this.setTransientHighlights([]);\n }\n\n /**\n * Search for a snippet or citation query, scroll to its page, and highlight it temporarily.\n * Returns the matched SearchResult or null if not found.\n *\n * @param query - The text snippet to locate and highlight.\n * @param options - Navigation and display options:\n * - `pageIndex`: Preferred page (1-based). When `scope: 'page'`, restricts search to this page.\n * - `scope`: Search scope. `'document'` (default) searches all pages, keeping `pageIndex` as a preference.\n * `'page'` restricts the search strictly to `pageIndex` (avoids full-document walk).\n * If `scope: 'page'` is provided without `pageIndex`, it gracefully degrades to `'document'`.\n * - `pulse`: Animate focus ring (default true).\n * - `scrollTo`: Scroll page into view (default true).\n * - `color`: Background highlight color.\n * - `tooltip`: Tooltip text above the highlight (defaults to matched snippet).\n */\n async highlightSnippet(\n query: string,\n options: {\n pageIndex?: number;\n scope?: 'document' | 'page';\n pulse?: boolean;\n scrollTo?: boolean;\n color?: string;\n tooltip?: string;\n } = {}\n ): Promise<SearchResult | null> {\n const searchOptions: { pages?: number[] } = {};\n if (options.scope === 'page' && options.pageIndex) {\n searchOptions.pages = [options.pageIndex];\n }\n const results = await this.searchText(query, searchOptions);\n let match = results[0];\n if (options.pageIndex) {\n match = results.find(r => r.pageIndex === options.pageIndex) || match;\n }\n if (!match) return null;\n\n const highlight: TransientHighlight = {\n id: match.id,\n pageIndex: match.pageIndex,\n bounds: match.bounds,\n color: options.color || 'rgba(250, 204, 21, 0.45)',\n borderColor: 'rgba(234, 179, 8, 0.85)',\n pulse: options.pulse !== false,\n tooltip: options.tooltip || match.snippet,\n };\n\n this.setTransientHighlights([highlight]);\n\n if (options.scrollTo !== false) {\n this.goToPage(match.pageIndex, { smooth: true });\n }\n\n return match;\n }\n\n // ---- annotations / export --------------------------------------------------------------\n\n getAnnotations(): Annotation[] {\n return this.annotationManager.getAnnotationsList();\n }\n\n /** Get the current list of redactions (pending and applied). */\n getRedactions(): Redaction[] {\n return this.binding?.getRedactions() ?? [];\n }\n\n /** Print the exported document (annotations, redactions and watermark baked in). */\n print(): void {\n this.bus.emit('action-print');\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 getPageGeometry: pdf ? createGeometryResolver(pdf) : undefined,\n annotations: this.annotationManager.getAnnotationsList(),\n redactions: b.getRedactions(),\n watermark: b.getWatermark(),\n signerName: b.getCurrentUserName(),\n },\n options\n );\n }\n\n /**\n * Returns the currently selected text string from the document viewer, or an empty string if nothing is selected.\n */\n getSelectedText(): string {\n if (typeof window === 'undefined') return '';\n const selection = window.getSelection();\n return selection ? selection.toString() : '';\n }\n\n /**\n * Copies the currently selected text to the system clipboard.\n * Resolves to true if copying succeeded, false otherwise.\n */\n async copySelectedText(): Promise<boolean> {\n const text = this.getSelectedText();\n if (!text) return false;\n const success = await copyTextToClipboard(text);\n if (success) {\n this.bus.emit('textCopied', { text });\n }\n return success;\n }\n\n // ---- legacy facade ---------------------------------------------------------------------\n\n readonly UI = {\n /** Theming is not implemented; kept for API compatibility. */\n setTheme: (_theme: string) => {},\n goToPage: (pageNumber: number) => this.goToPage(pageNumber),\n setCurrentPageNumber: (pageNumber: number) => this.goToPage(pageNumber),\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) => {\n let normalizedTool: any = tool;\n if (tool && (tool.toLowerCase() === 'select' || tool.toLowerCase() === 'textselect')) {\n normalizedTool = 'select';\n } else if (tool && tool.toLowerCase() === 'pan') {\n normalizedTool = 'pan';\n }\n this.bus.emit('action-set-tool', { tool: normalizedTool });\n },\n getSelectedText: () => this.getSelectedText(),\n copySelectedText: () => this.copySelectedText(),\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 startCompare: (docA: any, docB: any, options?: any) => {\n if (typeof window !== 'undefined') {\n window.dispatchEvent(new CustomEvent('action-start-compare', { detail: { docA, docB, options } }));\n }\n },\n stopCompare: () => {\n if (typeof window !== 'undefined') {\n window.dispatchEvent(new CustomEvent('action-stop-compare'));\n }\n },\n setCompareMode: (mode: 'overlay' | 'side-by-side' | 'semantic') => {\n if (typeof window !== 'undefined') {\n window.dispatchEvent(new CustomEvent('action-set-compare-mode', { detail: { mode } }));\n }\n },\n setCompareColors: (colorA: string, colorB: string) => {\n if (typeof window !== 'undefined') {\n window.dispatchEvent(new CustomEvent('action-set-compare-colors', { detail: { colorA, colorB } }));\n }\n },\n };\n\n readonly Core = ((self: WebViewerInstance) => ({\n /** The real AnnotationManager (XFDF import/export, granular events, permissions). */\n get annotationManager(): AnnotationManager {\n return self.annotationManager;\n },\n documentViewer: {\n addEventListener: (event: string, callback: (detail: unknown) => void): (() => void) =>\n self.bus.on(event, callback),\n removeEventListener: (event: string, callback: (detail: unknown) => void): void =>\n self.bus.off(event, callback),\n getCurrentPage: (): number => self.getCurrentPage(),\n getPageCount: (): number => self.getPageCount(),\n goToPage: (pageNumber: number): void => self.goToPage(pageNumber),\n setCurrentPage: (pageNumber: number): void => self.goToPage(pageNumber),\n setCurrentPageNumber: (pageNumber: number): void => self.goToPage(pageNumber),\n getDocument: () => ({\n getFileData: (options?: ExportOptions) => self.getFileData(options),\n }),\n },\n }))(this);\n}\n","/**\n * © 2026 AngelBot Ai Pvt Ltd. All rights reserved.\n * Printing: the exported document (annotations / redactions / watermark baked in) is loaded into a\n * hidden iframe and printed through the browser's PDF viewer. Falls back to opening the PDF in a\n * new tab when the frame cannot print (e.g. the browser has no inline PDF viewer).\n */\nexport interface PrintOptions {\n title?: string;\n /** How long the hidden frame is kept alive for the print dialog (default 60s). */\n timeoutMs?: number;\n}\n\nexport async function printPdfBytes(bytes: Uint8Array, opts: PrintOptions = {}): Promise<void> {\n if (typeof document === 'undefined') throw new Error('[teamsync-pdf-viewer] printing needs a browser');\n const blob = new Blob([bytes as BlobPart], { type: 'application/pdf' });\n const url = URL.createObjectURL(blob);\n const iframe = document.createElement('iframe');\n iframe.style.cssText = 'position:fixed;right:0;bottom:0;width:0;height:0;border:0;visibility:hidden;';\n iframe.title = opts.title ?? 'Print';\n iframe.setAttribute('aria-hidden', 'true');\n\n await new Promise<void>((resolve, reject) => {\n let settled = false;\n const cleanup = () => {\n iframe.remove();\n URL.revokeObjectURL(url);\n };\n const finish = () => {\n if (settled) return;\n settled = true;\n setTimeout(cleanup, opts.timeoutMs ?? 60000);\n resolve();\n };\n iframe.onload = () => {\n try {\n const w = iframe.contentWindow;\n if (!w) throw new Error('no frame window');\n w.focus();\n w.print();\n } catch {\n // No inline PDF viewer (or it refused): let the user print from a new tab instead.\n window.open(url, '_blank', 'noopener');\n }\n finish();\n };\n iframe.onerror = () => {\n cleanup();\n if (!settled) {\n settled = true;\n reject(new Error('[teamsync-pdf-viewer] print frame failed to load'));\n }\n };\n document.body.appendChild(iframe);\n iframe.src = url;\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 { AnnotationManager } from '../annotations/AnnotationManager';\nimport { printPdfBytes } from '../core/print';\nimport { useShortcuts, matchShortcut } from '../hooks/useShortcuts';\nimport type { WebViewerOptions, SDKPermissions, Redaction, TransientHighlight } from '../core/types';\nimport type { Annotation } from '../annotations/types';\nimport { calculateNextZoomIn, calculateNextZoomOut, clampScale, MIN_SCALE, MAX_SCALE } from '../utils/zoomUtils';\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 whenever any page canvas has finished rendering. */\n onPageRendered?: (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 /** Fires whenever pending or applied redactions change in the viewer. */\n onRedactionsChange?: (redactions: Redaction[]) => void;\n /** Fires once per user click of Apply in the confirmation modal with all applied redactions. */\n onRedactionsApplied?: (redactions: Redaction[]) => void;\n /** Fires whenever transient highlights change. */\n onTransientHighlightsChange?: (highlights: TransientHighlight[]) => void;\n /** Fires whenever the user selects text within the document. */\n onTextSelected?: (info: { text: string }) => void;\n /** Fires whenever text is copied from the document. */\n onTextCopied?: (info: { text: string }) => void;\n className?: string;\n style?: React.CSSProperties;\n}\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, page, transientHighlights: propTransientHighlights,\n 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, hideAnnotationsUntilPageRendered = true,\n enableTextSelection = true, defaultTool = 'select', showSelectionTooltip = true,\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 annotationManager = useMemo(() => new AnnotationManager(), []);\n const instanceRef = useRef<WebViewerInstance | null>(null);\n if (!instanceRef.current) instanceRef.current = new WebViewerInstance(bus, annotationManager);\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 // Keep the manager's user / permission state in sync with props.\n const currentUserId = props.currentUser?.id;\n const currentUserName = props.currentUser?.name;\n useEffect(() => {\n annotationManager.setCurrentUserInfo(currentUserId || currentUserName ? { id: currentUserId, name: currentUserName } : undefined);\n }, [annotationManager, currentUserId, currentUserName]);\n useEffect(() => {\n annotationManager.setReadOnly(readOnly);\n }, [annotationManager, readOnly]);\n useEffect(() => {\n annotationManager.setCanEditOthers(Boolean(permissions?.canEditOthers));\n }, [annotationManager, permissions?.canEditOthers]);\n\n // Annotations belong to a document: drop them when a different document is requested.\n useEffect(() => {\n annotationManager.clear();\n annotationManager.setDocument(null);\n }, [annotationManager, docUrl]);\n\n // Relay granular manager events to the instance bus (`instance.on('annotationChanged', ...)`).\n useEffect(() => annotationManager.addEventListener('annotationChanged', (e) => bus.emit('annotationChanged', e)), [annotationManager, bus]);\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 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 // Transient highlights (citations, search matches)\n const [internalTransientHighlights, setInternalTransientHighlights] = useState<TransientHighlight[]>([]);\n const transientHighlights = useMemo(() => {\n return propTransientHighlights ?? internalTransientHighlights;\n }, [propTransientHighlights, internalTransientHighlights]);\n const transientHighlightsRef = useRef(transientHighlights);\n transientHighlightsRef.current = transientHighlights;\n\n const setTransientHighlights = useCallback((highlights: TransientHighlight[]) => {\n setInternalTransientHighlights(highlights);\n latest.current.onTransientHighlightsChange?.(highlights);\n }, []);\n\n useEffect(() => {\n instance._bind(\n {\n getAnnotations: () => annotationManager.getAnnotationsList(),\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 goToPage: (pageNum: number, options?: { smooth?: boolean }) => {\n bus.emit('action-go-to-page', { page: pageNum, smooth: options?.smooth });\n },\n getTransientHighlights: () => transientHighlightsRef.current,\n setTransientHighlights,\n },\n rootRef.current\n );\n return () => instance._unbind();\n }, [instance, annotationManager, loadDocument, bus, setTransientHighlights]);\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-print', async () => {\n try {\n const data = await instance.getFileData();\n await printPdfBytes(data, { title: latest.current.fileName });\n } catch (err) {\n console.error('[teamsync-pdf-viewer] print failed', err);\n bus.emit('action-print-error', { error: err });\n }\n }),\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 bus.on<{ highlights: TransientHighlight[] }>('action-set-transient-highlights', (d) => {\n setTransientHighlights(d?.highlights ?? []);\n }),\n bus.on('action-clear-transient-highlights', () => {\n setTransientHighlights([]);\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 bus.on<{ text: string }>('action-text-selected', (d) => {\n bus.emit('textSelected', { text: d.text });\n latest.current.onTextSelected?.({ text: d.text });\n }),\n bus.on<{ text: string }>('action-text-copied', (d) => {\n bus.emit('textCopied', { text: d.text });\n latest.current.onTextCopied?.({ text: d.text });\n }),\n ];\n return () => offs.forEach((off) => off());\n }, [bus, instance, setTransientHighlights]);\n\n // ---- DocumentViewer callbacks ----------------------------------------------------------------\n const handleDocumentLoaded = useCallback(\n (doc: pdfjsLib.PDFDocumentProxy, url: string) => {\n pdfDocRef.current = doc;\n annotationManager.setDocument(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, annotationManager]\n );\n\n const handleLoadError = useCallback(\n (error: Error, info: DocumentLoadErrorInfo) => {\n pdfDocRef.current = null;\n annotationManager.setDocument(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, annotationManager]\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 handlePageRendered = useCallback(\n (pageNumber: number) => {\n const url = docUrlRef.current ?? '';\n bus.emit('pageRendered', { url, pageNumber });\n latest.current.onPageRendered?.({ 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 bus.emit('annotationsChanged', { annotations: anns });\n latest.current.onAnnotationsChange?.(anns);\n },\n [bus]\n );\n\n const handleRedactionsChange = useCallback(\n (reds: Redaction[]) => {\n redactionsRef.current = reds;\n bus.emit('redactionsChanged', { redactions: reds });\n latest.current.onRedactionsChange?.(reds);\n },\n [bus]\n );\n\n const handleRedactionsApplied = useCallback(\n (reds: Redaction[]) => {\n bus.emit('redactionsApplied', { redactions: reds });\n latest.current.onRedactionsApplied?.(reds);\n },\n [bus]\n );\n\n const { getCommand } = useShortcuts();\n const fileInputRef = useRef<HTMLInputElement>(null);\n\n const openSearchSidebar = useCallback(() => {\n if (sidebars) {\n setRightSidebarOpen(true);\n setSidebarTab('Search');\n setTimeout(() => bus.emit('action-focus-search'), 50);\n }\n }, [sidebars, bus]);\n\n const openFilePicker = useCallback(() => {\n fileInputRef.current?.click();\n }, []);\n\n useEffect(() => {\n const offSearch = bus.on('action-open-search', openSearchSidebar);\n const offFilePicker = bus.on('action-open-file-picker', openFilePicker);\n return () => {\n offSearch();\n offFilePicker();\n };\n }, [bus, openSearchSidebar, openFilePicker]);\n\n // Focus root element on mount if document is not currently focused elsewhere\n useEffect(() => {\n if (rootRef.current && (document.activeElement === document.body || !document.activeElement)) {\n rootRef.current.focus({ preventScroll: true });\n }\n }, []);\n\n // Global window keydown fallback so shortcuts fire reliably\n useEffect(() => {\n const handleGlobalKeyDown = (e: KeyboardEvent) => {\n const target = e.target as HTMLElement | null;\n if (\n target?.tagName === 'INPUT' ||\n target?.tagName === 'TEXTAREA' ||\n target?.isContentEditable\n ) {\n return;\n }\n\n const root = rootRef.current;\n if (!root) return;\n\n if (\n document.activeElement === document.body ||\n document.activeElement === document.documentElement ||\n document.activeElement === null ||\n root.contains(document.activeElement)\n ) {\n if (!root.contains(document.activeElement)) {\n if (matchShortcut(e, getCommand('SEARCH'))) {\n e.preventDefault();\n openSearchSidebar();\n return;\n }\n if (matchShortcut(e, getCommand('FILE_PICKER'))) {\n e.preventDefault();\n openFilePicker();\n return;\n }\n bus.emit('viewer-keydown', e);\n }\n }\n };\n\n window.addEventListener('keydown', handleGlobalKeyDown);\n return () => {\n window.removeEventListener('keydown', handleGlobalKeyDown);\n };\n }, [bus, getCommand, openSearchSidebar, openFilePicker]);\n\n // ---- root element handlers -------------------------------------------------------------------\n const handleRootKeyDownCapture = (e: React.KeyboardEvent<HTMLDivElement>) => {\n if (matchShortcut(e.nativeEvent, getCommand('SEARCH'))) {\n e.preventDefault();\n openSearchSidebar();\n return;\n }\n if (matchShortcut(e.nativeEvent, getCommand('FILE_PICKER'))) {\n e.preventDefault();\n openFilePicker();\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 if (tab === 'Search') {\n setTimeout(() => bus.emit('action-focus-search'), 50);\n }\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) => calculateNextZoomIn(s))}\n onZoomOut={() => setScale((s) => calculateNextZoomOut(s))}\n onZoomSet={(s) => setScale(clampScale(s))}\n onOpenFile={openFilePicker}\n onDownload={() => bus.emit('action-download')}\n onFullScreen={toggleFullscreen}\n onSaveAs={() => bus.emit('action-download')}\n onPrint={() => bus.emit('action-print')}\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 <input\n ref={fileInputRef}\n type=\"file\"\n accept=\"application/pdf\"\n style={{ display: 'none' }}\n onChange={(e) => {\n const file = e.target.files?.[0];\n if (file) {\n const url = URL.createObjectURL(file);\n loadDocument(url);\n }\n e.target.value = '';\n }}\n aria-hidden=\"true\"\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 annotationManager={annotationManager}\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 onRedactionsApplied={handleRedactionsApplied}\n onDocumentLoaded={handleDocumentLoaded}\n onLoadError={handleLoadError}\n onFirstPageRendered={handleFirstPageRendered}\n onPageRendered={handlePageRendered}\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 page={page}\n transientHighlights={transientHighlights}\n permissions={effectivePermissions}\n hideAnnotationsUntilPageRendered={hideAnnotationsUntilPageRendered}\n enableTextSelection={enableTextSelection}\n defaultTool={defaultTool}\n showSelectionTooltip={showSelectionTooltip}\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;;;ACpBA,IAAa,IAAY,IACZ,KAAY,GAEZ,WACX,OAAO,YAAc,QACnB,+EAA+E,KAAK,UAAU,SAAS,KACtG,iCAAiC,KAAK,UAAU,SAAS,IAKjD,KAAiB,MACjB,KAAwB,MACxB,KAAoB,SACpB,KAA2B;AAQxC,SAAgB,GAAoB,GAAsB,IAAA,GAA8B;CAEtF,OAAO,KAAK,IAAI,GAAU,KAAK,OAAO,KADzB,IAAe,IAAI,MAAO,IAAe,IAAI,KAAM,MACH,GAAG,IAAI,GAAG;AACzE;AAQA,SAAgB,GAAqB,GAAsB,IAAW,GAAmB;CAEvF,OAAO,KAAK,IAAI,GAAU,KAAK,OAAO,KADzB,KAAgB,IAAI,MAAO,KAAgB,IAAI,KAAM,MACL,GAAG,IAAI,GAAG;AACzE;AAKA,SAAgB,GAAW,GAAe,IAAW,GAAW,IAAA,GAA8B;CAC5F,OAAO,KAAK,IAAI,GAAU,KAAK,IAAI,GAAU,KAAK,MAAM,IAAQ,GAAG,IAAI,GAAG,CAAC;AAC7E;AAMA,SAAgB,GACd,GACA,GACA,GACA,GACA,IAAS,GAAiB,IAAI,KAAwB,IACtD,IAAY,GAAiB,IAAI,KAA2B,IACpD;CACR,IAAI,IAAc,IAAQ;CAU1B,OATI,IAAgB,IAAc,MAChC,IAAc,IAAS,IAErB,IAAiB,IAAc,MACjC,IAAc,IAAS,IAEpB,IAAgB,KAAgB,IAAiB,KAAe,MACnE,IAAc,KAAK,KAAK,KAAa,IAAgB,EAAe,IAE/D;AACT;AAuBA,SAAgB,GAA4B,GAAkD;CAC5F,IAAM,EACJ,cACA,aACA,gBAAgB,GAChB,iBAAiB,GACjB,sBACA,qBACA,eAAe,GACf,eACA,oBAAiB,OACf;CAIJ,IAAI,GACF,OAAO;EACL,YAAY;EACZ,WAAW,KAAoB,IAAI,IAAI;CACzC;CAGF,IAAM,IAAgB,GAAY,MAAM,QAAQ,GAAY,MAAM;CAIlE,IAAI,CAAC,KAAiB,KAAoB,GACxC,OAAO;EACL,YAAY;EACZ,WAAW;CACb;CAGF,IAAM,IAAK,IAAgB,EAAY,KAAM,IAAK,GAC5C,IAAK,IAAgB,EAAY,KAAM,IAAK,GAE5C,IAAI,IAAK,GACT,IAAI,IAAK,GAET,IAAS,KAAK,IAAI,GAAG,IAAK,IAAK,IAAQ,IAAa,CAAC,GAKrD,IAJS,KAAK,IAAI,GAAG,IAAK,IAAK,IAAQ,IAAY,CAI5C,KAFC,IAAI,MACQ,IAAW;CAGrC,OAAO;EACL,YAAY,KAAK,IAAI,GAAG,IAAO,CAAE;EACjC,WAAW,KAAK,IAAI,GAAS,IAAW,IAAhB,IAA8B,CAAE;CAC1D;AACF;;;AC/FA,IAAM,KAAO,CACX,QAAQ,UACV;AAEA,SAAwB,GAAO,EAC7B,cAAW,iBACX,oBAAiB,uBACjB,qBAAkB,qBAAqB,GACvC,eACA,UAAO,aAAU,cAAW,cAC5B,eACA,eAAY,iBAAc,aAAU,YAAS,mBAAgB,iBAAa,qBAC1E,oBAAgB,uBAAmB,gBAAY,mBAAe,cAAU,gBACxE,oBAAiB,GACjB,uBACA,iBAAa,IACb,aACA,mBACc;CACd,IAAM,KAAgB,MAAW,GAAQ,MAAK,MAAK,EAAE,MAAM,EAAE,GAAG,YAAY,CAAC,CAAC,SAAS,MAAM,CAAC,GACxF,KAAgB,OAAe,MAAQ,EAAQ,IAC/C,CAAC,GAAY,MAAiB,EAAS,EAAK,GAC5C,CAAC,IAAgB,MAAqB,EAAS,EAAK,GACpD,CAAC,IAAoB,MAAyB,EAAS,EAAK,GAC5D,CAAC,IAAY,KAAiB,EAAwB,QAAQ,GAC9D,KAAU,EAAuB,IAAI,GACrC,KAAc,EAAuB,IAAI,GACzC,KAAkB,EAAuB,IAAI,GAC7C,KAAM,GAAa;CAsBzB,OApBA,GAAqC,wBAAwB,MAAM,EAAc,GAAG,QAAQ,IAAI,CAAC,GAEjG,QAAgB;EACd,SAAS,EAAmB,GAAmB;GAO7C,AANI,GAAQ,WAAW,CAAC,GAAQ,QAAQ,SAAS,EAAM,MAAc,KACnE,GAAc,EAAK,GAEjB,GAAY,WAAW,CAAC,GAAY,QAAQ,SAAS,EAAM,MAAc,KAC3E,GAAkB,EAAK,GAErB,GAAgB,WAAW,CAAC,GAAgB,QAAQ,SAAS,EAAM,MAAc,KACnF,GAAsB,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,IAAD;QAAY,MAAM,kBAAC,IAAD,EAAM,MAAM,GAAK,CAAA;QAAG,OAAM;QAAO,eAAe,GAAc,CAAC,CAAU;QAAG,QAAQ;OAAa,CAAA,GAClH,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;SAMG,KACC,kBAAC,GAAD;UAAY,MAAM,kBAAC,GAAD,EAAY,MAAM,GAAK,CAAA;UAAG,OAAM;UAAc,eAAe;WAAgB,AAAd,EAAW,GAAG,GAAc,EAAK;UAAG;SAAI,CAAA;SAE3H,kBAAC,GAAD;UAAY,MAAM,kBAAC,IAAD,EAAU,MAAM,GAAK,CAAA;UAAG,OAAM;UAAW,eAAe;WAAgB,AAAd,EAAW,GAAG,GAAc,EAAK;UAAG;SAAI,CAAA;SACpH,kBAAC,GAAD;UAAY,MAAM,kBAAC,GAAD,EAAU,MAAM,GAAK,CAAA;UAAG,OAAM;UAAoB,eAAe;WAAkB,AAAhB,EAAa,GAAG,GAAc,EAAK;UAAG;SAAI,CAAA;SAC/H,kBAAC,GAAD;UAAY,MAAM,kBAAC,GAAD,EAAM,MAAM,GAAK,CAAA;UAAG,OAAM;UAAU,eAAe;WAAc,AAAZ,EAAS,GAAG,GAAc,EAAK;UAAG;SAAI,CAAA;SAC7G,kBAAC,GAAD;UAAY,MAAM,kBAAC,IAAD,EAAS,MAAM,GAAK,CAAA;UAAG,OAAM;UAAQ,UAAU,CAAC;UAAS,eAAe;WAAe,AAAb,IAAU,GAAG,GAAc,EAAK;UAAG;SAAI,CAAA;SACnI,kBAAC,OAAD,EAAK,OAAO;UAAE,QAAQ;UAAO,iBAAiB;UAAuB,QAAQ;SAAQ,EAAI,CAAA;SACzF,kBAAC,GAAD;UAAY,MAAM,kBAAC,GAAD;WAAQ,MAAM;WAAI,OAAM;UAAW,CAAA;UAAG,OAAM;UAAqB,eAAe;WAA+J,AAA7J,OAAO,cAAc,IAAI,YAAY,wBAAwB,EAAE,QAAQ;YAAE,MAAM;YAAkB,MAAM;YAAkB,SAAS,EAAE,MAAM,UAAU;WAAE,EAAE,CAAC,CAAC,GAAG,GAAc,EAAK;UAAG;SAAI,CAAA;SAC3R,kBAAC,GAAD;UAAY,MAAM,kBAAC,IAAD,EAAU,MAAM,GAAK,CAAA;UAAG,OAAM;UAAW,eAAe;WAAoB,AAAlB,EAAe,GAAG,GAAc,EAAK;UAAG;SAAI,CAAA;QACrH;OAEJ,CAAA,CAAA;;MACL,kBAAC,IAAD;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,IAAD;SACE,MACE,kBAAC,OAAD;UAAK,OAAO;WAAE,UAAU;WAAY,SAAS;WAAQ,YAAY;WAAU,gBAAgB;UAAS;UAApG,UAAA,CACE,kBAAC,IAAD,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,IAAD;YAAU,MAAM;YAAI,OAAM;WAAkB,CAAA;UACzC,CAAA,CACF;;SAEP,OAAM;SACN,QAAQ;SACR,eAAe,GAAsB,CAAC,EAAkB;QACzD,CAAA;OACE,CAAA,GACJ,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,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,OAAmB;UAC7B,eAAe;WAAmC,AAAjC,GAAkB,YAAY,GAAG,GAAsB,EAAK;UAAG;SACjF,CAAA;SACD,kBAAC,GAAD;UACE,MAAM,kBAAC,IAAD,EAAM,MAAM,GAAK,CAAA;UACvB,OAAM;UACN,UAAU,OAAmB;UAC7B,eAAe;WAAqC,AAAnC,GAAkB,cAAc,GAAG,GAAsB,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,GAAa,KAAW,MAAM,GAAG,GAAG,GAAsB,EAAK;UAAG;SACpF,CAAA;SACD,kBAAC,GAAD;UACE,MAAM,kBAAC,GAAD,EAAW,MAAM,GAAK,CAAA;UAC5B,OAAM;UACN,eAAe;WAA4C,AAA1C,GAAa,KAAW,KAAK,OAAO,GAAG,GAAG,GAAsB,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,OAAe;UACzB,eAAe;WAA2B,AAAzB,GAAc,QAAQ,GAAG,GAAsB,EAAK;UAAG;SACzE,CAAA;SACD,kBAAC,GAAD;UACE,MAAM,kBAAC,IAAD,EAAM,MAAM,GAAK,CAAA;UACvB,OAAM;UACN,UAAU,OAAe;UACzB,eAAe;WAA2B,AAAzB,GAAc,QAAQ,GAAG,GAAsB,EAAK;UAAG;SACzE,CAAA;SACD,kBAAC,GAAD;UACE,MAAM,kBAAC,IAAD,EAAU,MAAM,GAAK,CAAA;UAC3B,OAAM;UACN,UAAU,OAAe;UACzB,eAAe;WAAiC,AAA/B,GAAc,cAAc,GAAG,GAAsB,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,IAAD,EAAQ,MAAM,GAAK,CAAA;UACzB,OAAM;UACN,eAAe;WAAkB,AAAhB,EAAa,GAAG,GAAsB,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,KAAiB,6BAA6B;WAC3E,QAAQ;WAAW,YAAY;WAAQ,QAAQ;UACjD;UAJA,UAAA,CAKE,kBAAC,OAAD;WACE,eAAe,GAAkB,CAAC,EAAc;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,GAAkB,CAAC,EAAc;WAChD,OAAO;YACL,SAAS;YAAS,SAAS;YAAQ,YAAY;YAAU,QAAQ;YACjE,YAAY;YAAqB,OAAO,KAAiB,mBAAmB;WAC9E;WAEC,UAAiB,EAAjB,KAAkB,IAA0B,GAA3B,EAAW,MAAM,GAAK,CAA4B;UACjE,CAAA,CACF;SAEJ,CAAA,GAAA,MACC,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,GAAD,EAAgB,MAAM,GAAK,CAAA;YAAG,OAAM;YAAe,eAAe;aAAmC,AAAjC,GAAI,KAAK,qBAAqB,GAAG,GAAkB,EAAK;YAAG;WAAI,CAAA;WACrJ,kBAAC,GAAD;YAAY,MAAM,kBAAC,GAAD,EAAW,MAAM,GAAK,CAAA;YAAG,OAAM;YAAc,eAAe;aAAkC,AAAhC,GAAI,KAAK,oBAAoB,GAAG,GAAkB,EAAK;YAAG;WAAI,CAAA;WAC9I,kBAAC,OAAD,EAAK,OAAO;YAAE,QAAQ;YAAO,iBAAiB;YAAuB,QAAQ;WAAQ,EAAI,CAAA;WACxF;YAAC;YAAM;YAAK;YAAM;YAAG;YAAM;YAAK;YAAG;YAAG;YAAG;YAAG;WAAC,CAAC,CAAC,KAAI,MAClD,kBAAC,OAAD;YAEE,eAAe;aAAsC,AAAjC,KAAW,EAAU,CAAS,GAAG,GAAkB,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,GAAkB,EAAK;WAAI,CAAA;UACxG;SAEJ,CAAA,CAAA;;QACL,kBAAC,IAAD;SACE,MAAM,kBAAC,IAAD;UAAa,MAAM;UAAI,OAAO,KAAA,KAAqB,wBAAwB;SAAsB,CAAA;SACvG,OAAM;SACN,SAAS;SACT,UAAU,KAAS;QACpB,CAAA;QACD,kBAAC,IAAD;SACE,MAAM,kBAAC,IAAD;UAAY,MAAM;UAAI,OAAO,KAAA,IAAqB,wBAAwB;SAAsB,CAAA;SACtG,OAAM;SACN,SAAS;SACT,UAAU,KAAA;QACX,CAAA;OACE;;MACL,kBAAC,OAAD,EAAK,OAAO;OAAE,OAAO;OAAO,QAAQ;OAAQ,iBAAiB;OAAuB,QAAQ;MAAQ,EAAI,CAAA;MACxG,kBAAC,IAAD;OAAY,MAAM,kBAAC,IAAD,EAAc,MAAM,GAAK,CAAA;OAAG,OAAM;OAAc,QAAQ,OAAe;OAAU,eAAe,GAAI,KAAK,mBAAmB,EAAE,MAAM,SAAS,CAAC;MAAI,CAAA;MACpK,kBAAC,IAAD;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,IAAiB,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,IAAD;OACE,MAAM,kBAAC,GAAD,EAAM,MAAM,GAAK,CAAA;OACvB,OAAM;OACN,SAAS;MACV,CAAA;MAED,kBAAC,IAAD;OACE,MAAM,kBAAC,IAAD,EAAQ,MAAM,GAAK,CAAA;OACzB,OAAM;OACN,QAAQ,KAAoB,MAAe;OAC3C,eAAe,EAAiB,QAAQ;MACzC,CAAA;MACD,kBAAC,IAAD;OACE,MAAM,kBAAC,IAAD,EAAe,MAAM,GAAK,CAAA;OAChC,OAAM;OACN,QAAQ,KAAoB,MAAe;OAC3C,eAAe,EAAiB,UAAU;MAC3C,CAAA;KACE;;GACF;;CACF,CAAA;AAET;AAEA,SAAS,GAAW,EAAE,SAAM,YAAS,YAAS,IAAO,cAAW,IAAO,YAAgH;CACrL,OACE,kBAAC,UAAD;EACS;EACP,SAAS,IAAW,KAAA,IAAY;EACtB;EACV,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,IAAW,gBAAgB;GACnC,SAAS,IAAW,KAAM;GAC1B,SAAS;GACT,YAAY;GACZ,kBAAkB;EACpB;EACA,cAAc,MAAM;GAClB,AAAI,CAAC,KAAU,CAAC,MAAU,EAAE,cAAc,MAAM,kBAAkB;EACpE;EACA,aAAa,MAAM;GACjB,AAAI,CAAC,KAAU,CAAC,MAAU,EAAE,cAAc,MAAM,kBAAkB;EACpE;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;;;ACpaA,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,IAAD,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,IAAD,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;;;AC5IA,IAAa,KAAgC;CAC3C;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,GAEM,KAAc,uBACd,KAAe,+BAEjB,KAAqC,MACnC,qBAAY,IAAI,IAAgB;AAEtC,SAAgB,KAAkC;CAChD,IAAI,OAAO,SAAW,OAAe,CAAC,OAAO,cAAc,OAAO;CAClE,IAAI;EACF,IAAM,IAAQ,OAAO,aAAa,QAAQ,EAAW;EACrD,IAAI,GAAO;GACT,IAAM,IAAS,KAAK,MAAM,CAAK;GAC/B,IAAI,MAAM,QAAQ,CAAM,GACtB,OAAO,GAAkB,KAAI,MAAO;IAClC,IAAM,IAAQ,EAAO,MAAM,MAAgB,KAAK,EAAE,WAAW,EAAI,MAAM;IACvE,OAAO,KAAS,OAAO,EAAM,WAAY,WAAW;KAAE,GAAG;KAAK,SAAS,EAAM;IAAQ,IAAI;GAC3F,CAAC;EAEL;CACF,QAAQ,CAER;CACA,OAAO;AACT;AAEA,SAAS,KAAoB;CAE3B,AADA,GAAU,SAAQ,MAAM,EAAG,CAAC,GACxB,OAAO,SAAW,OACpB,OAAO,cAAc,IAAI,YAAY,EAAY,CAAC;AAEtD;AAEA,SAAgB,KAAe;CAC7B,IAAM,CAAC,GAAW,KAAgB,SAChC,AAAsB,OAAkB,GAAoB,GACrD,GACR;CAiDD,OA/CA,QAAgB;EACd,IAAM,UAAa;GAEjB,AADA,KAAkB,GAAoB,GACtC,EAAa,EAAe;EAC9B;EAQA,OANA,GAAU,IAAI,CAAI,GACd,OAAO,SAAW,QACpB,OAAO,iBAAiB,WAAW,CAAI,GACvC,OAAO,iBAAiB,IAAc,CAAI,UAG/B;GAEX,AADA,GAAU,OAAO,CAAI,GACjB,OAAO,SAAW,QACpB,OAAO,oBAAoB,WAAW,CAAI,GAC1C,OAAO,oBAAoB,IAAc,CAAI;EAEjD;CACF,GAAG,CAAC,CAAC,GA4BE;EAAE;EAAW,gBA1BG,GAAa,GAAoB,MAAuB;GAE7E,IAAM,KADO,MAAmB,GAAoB,EAAA,CAC/B,KAAI,MAAK,EAAE,WAAW,IAAS;IAAE,GAAG;IAAG,SAAS;GAAW,IAAI,CAAC;GAMrF,AALA,KAAkB,GACd,OAAO,SAAW,OAAe,OAAO,gBAC1C,OAAO,aAAa,QAAQ,IAAa,KAAK,UAAU,CAAO,CAAC,GAElE,EAAa,CAAO,GACpB,GAAkB;EACpB,GAAG,CAAC,CAiBgB;EAAgB,gBAfb,QAAkB;GAMvC,AALA,KAAkB,IACd,OAAO,SAAW,OAAe,OAAO,gBAC1C,OAAO,aAAa,WAAW,EAAW,GAE5C,EAAa,EAAiB,GAC9B,GAAkB;EACpB,GAAG,CAAC,CAQgC;EAAgB,YANjC,GAAa,MAA+B;GAE7D,IAAM,KADO,MAAmB,EAAA,CACjB,MAAK,MAAQ,EAAK,WAAW,CAAM;GAClD,OAAO,IAAI,EAAE,UAAU;EACzB,GAAG,CAAC,CAAS,CAEuC;CAAW;AACjE;AASA,SAAgB,GAAmB,GAAsC;CACvE,IAAI,CAAC,GAAe,OAAO;EAAE,MAAM;EAAO,OAAO;EAAO,KAAK;EAAO,KAAK;CAAG;CAE5E,IAAM,IAAY,EAAc,MAAM,GAAG,GACrC,IAAO,IACP,IAAQ,IACR,IAAM,IACJ,IAAsB,CAAC;CAE7B,KAAK,IAAI,IAAI,GAAG,IAAI,EAAU,QAAQ,KAAK;EACzC,IAAM,IAAM,EAAU,EAAE,CAAC,KAAK,GACxB,IAAQ,EAAI,YAAY;EAE9B,AAAI,MAAU,UAAU,MAAU,SAAS,MAAU,UAAU,MAAU,aAAa,MAAU,YAC9F,IAAO,KACE,MAAU,UACnB,IAAQ,KACC,MAAU,SAAS,MAAU,WACtC,IAAM,KACG,MAAQ,MAAM,IAAI,KAAK,EAAU,IAAI,OAAO,KAErD,EAAU,KAAK,GAAG,IACT,MAAQ,MACjB,EAAU,KAAK,CAAG;CAEtB;CAMA,OAJI,EAAc,SAAS,GAAG,KAAK,EAAU,WAAW,KACtD,EAAU,KAAK,GAAG,GAGb;EAAE;EAAM;EAAO;EAAK,KAAK,EAAU,KAAK,GAAG,CAAC,CAAC,YAAY;CAAE;AACpE;AAGA,SAAgB,GAAc,GAAkB,GAAgC;CAC9E,IAAI,CAAC,GAAe,OAAO;CAC3B,IAAM,IAAS,GAAmB,CAAa,GAEzC,IAAgB,GAAQ,EAAE,WAAW,EAAE;CAE7C,IADI,EAAO,SAAS,KAChB,EAAO,QAAQ,EAAQ,EAAE,QAAS,OAAO;CAE7C,IAAM,KAAY,EAAE,OAAO,GAAA,CAAI,YAAY,GACrC,IAAY,EAAO,IAAI,YAAY;CAkCzC,OA/BI,MAAc,YAAY,MAAc,cACtC,EAAO,UAAU,EAAQ,EAAE,WACxB,MAAa,YAAY,MAAa,cADI,KAK/C,MAAc,OAAO,MAAc,MAIrC,EAHyB,MAAa,OAAO,MAAa,OAAO,EAAE,SAAS,WAAW,EAAE,SAAS,eAE9F,EAAO,SAAS,CAAC,EAAE,YACnB,CAAC,EAAO,SAAS,MAAc,OAAO,EAAE,YAK1C,MAAc,OAAO,MAAc,MAIrC,EAHmB,MAAa,OAAO,MAAa,OAAO,EAAE,SAAS,WAAW,EAAE,SAAS,oBAExF,EAAO,SAAS,CAAC,EAAE,YACnB,CAAC,EAAO,SAAS,MAAc,OAAO,EAAE,YAK1C,EAAO,UAAU,EAAQ,EAAE,YAK/B,GAFI,MAAa,KACb,EAAE,QAAQ,EAAE,KAAK,YAAY,MAAM,MAAM,OACzC,EAAE,QAAQ,EAAE,KAAK,YAAY,MAAM,QAAQ;AAGjD;;;AChMA,SAAgB,GAAmB,GAAmB;CACpD,OAAO,EAAE,QAAQ,QAAQ,GAAG,CAAC,CAAC,KAAK;AACrC;AAOA,SAAgB,GAAc,GAAwB;CACpD,IAAI,IAAW,IACT,IAAwB,CAAC,GACzB,IAAwB,CAAC;CAG/B,EAAM,SAAS,GAAM,MAAU;EAC7B,IAAM,IAAM,EAAK,OAAO;EACxB,KAAK,IAAI,IAAI,GAAG,IAAI,EAAI,QAAQ,KAE9B,AADA,EAAY,KAAK,CAAK,GACtB,EAAY,KAAK,CAAC;EAIpB,AAFA,KAAY,GAER,EAAK,UACP,KAAY,MACZ,EAAY,KAAK,EAAE,GACnB,EAAY,KAAK,EAAE,MAEnB,KAAY,KACZ,EAAY,KAAK,EAAE,GACnB,EAAY,KAAK,EAAE;CAEvB,CAAC;CAGD,IAAI,IAAW,IACT,IAAsB,CAAC,GAEzB,IAAI;CACR,OAAO,IAAI,EAAS,SAAQ;EAC1B,IAAM,IAAO,EAAS;EACtB,IAAI,KAAK,KAAK,CAAI,GAAG;GACnB,IAAM,IAAW;GACjB,OAAO,IAAI,EAAS,UAAU,KAAK,KAAK,EAAS,EAAE,IACjD;GAGF,AADA,KAAY,KACZ,EAAU,KAAK,CAAQ;EACzB,OAGE,AAFA,KAAY,GACZ,EAAU,KAAK,CAAC,GAChB;CAEJ;CAEA,OAAO;EACL;EACA;EACA;EACA;EACA;CACF;AACF;AAMA,SAAgB,GACd,GACA,GACA,GACA,GACgB;CAChB,IAAM,EAAE,gBAAa,mBAAgB,GAC/B,oBAAc,IAAI,IAA0C;CAElE,KAAK,IAAI,IAAI,GAAU,IAAI,GAAY,KAAK;EAC1C,IAAM,IAAU,EAAY,IACtB,IAAU,EAAY;EAC5B,IAAI,MAAY,KAAA,KAAa,MAAY,IAAI;GAC3C,IAAM,IAAW,EAAY,IAAI,CAAO;GACxC,AAAI,KACF,EAAS,MAAM,KAAK,IAAI,EAAS,KAAK,CAAO,GAC7C,EAAS,MAAM,KAAK,IAAI,EAAS,KAAK,CAAO,KAE7C,EAAY,IAAI,GAAS;IAAE,KAAK;IAAS,KAAK;GAAQ,CAAC;EAE3D;CACF;CAEA,IAAM,IAAyB,CAAC;CAsBhC,OApBA,EAAY,SAAS,GAAO,MAAc;EACxC,IAAM,IAAO,EAAM;EACnB,IAAI,CAAC,KAAQ,CAAC,EAAK,WAAW;EAE9B,IAAM,IAAI,EAAK,UAAU,IACnB,IAAI,EAAK,UAAU,IACnB,IAAQ,EAAK,OACb,IAAS,EAAK,UAAU,KAAK,IAAI,EAAK,UAAU,EAAE,GAClD,KAAU,EAAK,OAAO,GAAA,CAAI;EAEhC,IAAI,IAAS,GAAG;GACd,IAAM,IAAY,IAAQ,GACpB,IAAS,IAAI,EAAM,MAAM,GACzB,KAAc,EAAM,MAAM,EAAM,MAAM,KAAK;GACjD,EAAO,KAAK;IAAE,GAAG;IAAQ;IAAG,OAAO;IAAY;GAAO,CAAC;EACzD,OACE,EAAO,KAAK;GAAE;GAAG;GAAG;GAAO;EAAO,CAAC;CAEvC,CAAC,GAEM;AACT;;;AC3GA,eAAsB,GACpB,GACA,GACA,IAA0B,CAAC,GAC3B,GACA,GACyB;CACzB,IAAI,CAAC,KAAU,CAAC,EAAM,KAAK,GAAG,OAAO,CAAC;CAEtC,IAAM,IAA0B,CAAC,GAC3B,IAAK,GAAmB,CAAK,CAAC,CAAC,YAAY;CACjD,IAAI,CAAC,GAAI,OAAO,CAAC;CAEjB,IAAM,IAAW,EAAO,UACpB;CACJ,IAAI,MAAU,KAAA,GAKZ;MAHA,IADgB,MAAM,KAAK,IAAI,IAAI,CAAK,CAC1B,CAAA,CACX,QAAO,MAAK,OAAO,UAAU,CAAC,KAAK,KAAK,KAAK,KAAK,CAAQ,CAAC,CAC3D,MAAM,GAAG,MAAM,IAAI,CAAC,GACnB,EAAY,WAAW,GAEzB,OADA,IAAa,GAAG,GACT,CAAC;CACV,OAEA,IAAc,MAAM,KAAK,EAAE,QAAQ,EAAS,IAAI,GAAG,MAAM,IAAI,CAAC;CAKhE,KAAK,IAAI,IAAa,GAAG,IAAa,EAAY,QAAQ,KAAc,IAAW;EACjF,IAAM,IAAa,EAAY,MAAM,GAAY,IAAa,EAAS,GACjE,IAAgB,EAAW,KAAI,OAClC,YAAY;GACX,IAAM,IAAO,MAAM,EAAO,QAAQ,CAAO,GAIrC,KAAQ,MAHc,EAAK,eAAe,EAAA,CAGtB;GACxB,IAAI,KAAc,EAAW,SAAS,GAAG;IACvC,IAAM,IAAiB,EAAW,QAAO,MAAK,EAAE,cAAc,CAAO;IACrE,IAAI,EAAe,SAAS,GAAG;KAC7B,IAAM,IAAK,EAAK,YAAY,EAAE,OAAO,EAAE,CAAC;KACxC,IAAQ,EAAM,QAAQ,MAAc;MAClC,IAAI,CAAC,EAAK,OAAO,EAAK,IAAI,KAAK,MAAM,IAAI,OAAO;MAEhD,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;MAErC,KAAK,IAAM,KAAO,GAAgB;OAChC,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;OAE5F,IAAI,KAAc,GAChB,OAAO;MAEX;MACA,OAAO;KACT,CAAC;IACH;GACF;GAEA,IAAM,IAAW,GAAc,CAAK,GAC9B,EAAE,aAAU,aAAU,iBAAc,GACpC,IAAgB,EAAS,YAAY,GACvC,IAAI,GACF,IAA8B,CAAC;GAErC,QAAQ,IAAI,EAAc,QAAQ,GAAI,CAAC,OAAO,KAAI;IAChD,IAAM,IAAW,EAAU,IACrB,IAAa,EAAU,IAAI,EAAG,SAAS,KAAK,GAC5C,IAAe,KAAK,IAAI,GAAG,IAAW,EAAE,GACxC,IAAa,KAAK,IAAI,EAAS,QAAQ,IAAa,EAAE,GACtD,IAAU,EAAS,UAAU,GAAc,CAAU,CAAC,CAAC,QAAQ,OAAO,GAAG,GAEzE,IAAS,GAAkB,GAAO,GAAU,GAAU,CAAU;IAWtE,AATA,EAAY,KAAK;KACf,IAAI,IAAI,EAAQ,MAAM;KACtB,WAAW;KACX;KACA,iBAAiB,IAAW;KAC5B,aAAa,IAAa;KAC1B;IACF,CAAC,GAED,KAAK,EAAG;GACV;GAGA,OADA,EAAK,UAAU,GACR;EACT,EAAA,CAAG,CACL;EAOA,CAJA,MADgC,QAAQ,IAAI,CAAa,EAAA,CACvC,SAAQ,MAAe,EAAQ,KAAK,GAAG,CAAW,CAAC,GAErE,IAAa,KAAK,OAAQ,IAAa,EAAW,UAAU,EAAY,SAAU,GAAG,CAAC,GAEtF,MAAM,IAAI,SAAQ,MAAW,WAAW,GAAS,EAAE,CAAC;CACtD;CAKA,OAFA,EAAQ,MAAM,GAAG,MAAM,EAAE,YAAY,EAAE,SAAS,GAEzC;AACT;AAEA,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;CAyBtD,OAAO;EAAE,QAvBM,EACb,OAAO,MAAkB;GACvB,IAAI,CAAC,KAAU,CAAC,EAAM,KAAK,GAAG;IAC5B,EAAiB,CAAC,CAAC;IACnB;GACF;GAGA,AADA,EAAe,EAAI,GACnB,EAAkB,CAAC;GAEnB,IAAI;IACF,IAAM,IAAU,MAAM,GAAc,GAAQ,GAAO,IAAY,MAAK,EAAkB,CAAC,CAAC;IACxF,EAAiB,CAAO;GAC1B,SAAS,GAAO;IACd,QAAQ,MAAM,iBAAiB,CAAK;GACtC,UAAU;IAER,AADA,EAAe,EAAK,GACpB,EAAkB,GAAG;GACvB;EACF,GACA,CAAC,GAAQ,CAAU,CAGZ;EAAQ;EAAe;EAAa;EAAgB,mBAAmB,EAAiB,CAAC,CAAC;CAAE;AACvG;;;AC5IA,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,KAAmB,EAAS,GAAG,GAC9C,CAAC,GAAY,KAAiB,EAAS,EAAK,GAC5C,IAAiB,EAAyB,IAAI;CA0CpD,AAxCA,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,GAEf,QAAgB;EACd,IAAM,IAAU,iBAAiB;GAC/B,EAAS,CAAW;EACtB,GAAG,GAAG;EACN,aAAa,aAAa,CAAO;CACnC,GAAG,CAAC,GAAa,CAAQ,CAAC,GAE1B,QAAgB;EACd,IAAI,KAAU,MAAc,UAAU;GACpC,IAAM,IAAQ,iBAAiB;IAE7B,AADA,EAAe,SAAS,MAAM,GAC9B,EAAe,SAAS,OAAO;GACjC,GAAG,EAAE;GACL,aAAa,aAAa,CAAK;EACjC;CACF,GAAG,CAAC,GAAQ,CAAS,CAAC,GAEtB,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,YAAW,MAAK;QACd,AAAI,EAAE,QAAQ,YACZ,EAAE,eAAe,GACjB,EAAS,CAAW;OAExB;OACA,OAAO;QACL,OAAO;QACP,SAAS;QACT,QAAQ;QACR,cAAc;QACd,UAAU;QACV,SAAS;QACT,WAAW;OACb;MACD,CAAA;MACA,KACC,kBAAC,UAAD;OACE,eAAe;QAEb,AADA,EAAe,EAAE,GACjB,EAAS,EAAE;OACb;OACA,OAAO;QACL,UAAU;QACV,OAAO;QACP,KAAK;QACL,WAAW;QACX,YAAY;QACZ,QAAQ;QACR,QAAQ;QACR,SAAS;QACT,OAAO;OACT;OACA,OAAM;OAEN,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,IAAD,EAAe,MAAM,GAAK,CAAA;QACrD,EAAQ,SAAS,aAAa,kBAAC,IAAD,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;QACnF,EAAQ,UAAU,kBAAC,QAAD;SAAM,OAAO;UAAE,UAAU;UAAQ,OAAO;SAAoB;SAA5D,UAAA,CAA+D,MAAG,EAAQ,MAAa;;OACvG;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;IAtCM,GAAA,EAAQ,EAsCd,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;;;ACrUA,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,KAAK,IAAI,OAAO,oBAAoB,GAAG,CAAC;IAY5D,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,IAAa,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,IAAD,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,EAAW,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;;;ACdA,SAAS,GAAsB,EAC7B,YAAS,WAAQ,UAAO,aAAU,gBAAgB,GAAiB,iBAAiB,GACpF,WAAW,GAAY,YAAY,GAAa,YAAS,cAAW,GAAG,kBAAe,mBACtF,cAAW,eAAY,gBAAa,yBAAsB,uBAAoB,wBAC9E,iBAAa,gBAAa,eAAW,uBAAmB,6BAAyB,mBAAe,iBAChG,4BAAwB,sBACxB,eAAW,mBAAe,eAAY,wBAAoB,gBAC1D,uCAAmC,MACf;CACpB,IAAM,IAAgB,EAAO,EAAU;CACvC,QAAgB;EACd,EAAc,UAAU;CAC1B,GAAG,CAAC,EAAU,CAAC;CACf,IAAM,IAAY,EAA0B,IAAI,GAC1C,IAAe,EAAuB,IAAI,GAC1C,IAAgB,EAAY,IAAI,GAChC,IAAe,EAAqC,IAAI,GACxD,IAAqB,EAAO,EAAK,GACjC,CAAC,IAAkB,MAAuB,EAAS,EAAK,GACxD,CAAC,IAAa,MAAkB,EAAc,IAAI,GAElD,KAAc,IAAgB,GAC9B,KAAe,IAAiB,GAEhC,CAAC,IAAgB,MAAqB,EAAS;EAAE;EAAQ;EAAS;CAAS,CAAC;CAgPlF,CA/OI,GAAe,WAAW,KAAU,GAAe,YAAY,KAAW,GAAe,aAAa,OACxG,GAAkB;EAAE;EAAQ;EAAS;CAAS,CAAC,GAC/C,GAAoB,EAAK,IAG3B,QAAgB;EACd,EAAmB,UAAU;CAC/B,GAAG;EAAC;EAAQ;EAAS;CAAQ,CAAC,GAG9B,QAAgB;EACd,IAAI,IAAc,IACd,IAAa,MAEX,IAAe,YAAY;GAC/B,IAAI,CAAC,EAAU,WAAW,CAAC,GAAQ;GACnC,IAAI,EAAc,SAAS;IACzB,IAAI;KAAE,EAAc,QAAQ,OAAO;IAAG,QAAQ,CAAC;IAC/C,EAAc,UAAU;GAC1B;GAEA,IAAI,IAA4C;GAChD,IAAI;IACF,IAAM,IAAO,MAAM,EAAO,QAAQ,CAAO;IACzC,IAAI,GAAa;KACf,IAAI;MAAE,EAAK,UAAU;KAAG,QAAQ,CAAC;KACjC;IACF;IAEA,AADA,IAAc,GACd,EAAa,UAAU;IAEvB,IAAM,IAAc,KAAK,IAAI,OAAO,oBAAoB,GAAG,CAAC,GACtD,IAAgB,GAAkB,EAAK,SAAS,CAAQ,GACxD,IAAmB,EAAK,YAAY;KAAE,OAAO;KAAK,UAAU;IAAc,CAAC,GAE7E,IAAc,GAChB,GACA,GACA,EAAiB,OACjB,EAAiB,MACnB,GAEI,IAAW,EAAK,YAAY;KAAE,OAAO;KAAa,UAAU;IAAc,CAAC,GAEzE,IAAa,SAAS,cAAc,QAAQ;IAElD,AADA,EAAW,QAAQ,KAAK,MAAM,EAAS,KAAK,GAC5C,EAAW,SAAS,KAAK,MAAM,EAAS,MAAM;IAC9C,IAAI,IAAM,EAAW,WAAW,IAAI;IASpC,IARA,AAME,OAJA,KAA4B,IAC5B,IAAW,EAAK,YAAY;KAAE,OAAO;KAAa,UAAU;IAAc,CAAC,GAC3E,EAAW,QAAQ,KAAK,MAAM,EAAS,KAAK,GAC5C,EAAW,SAAS,KAAK,MAAM,EAAS,MAAM,GACxC,EAAW,WAAW,IAAI,IAE9B,CAAC,KAAO,GAAa;KAEvB,AADA,EAAW,QAAQ,GACnB,EAAW,SAAS;KACpB;IACF;IAEA,IAAM,IAAa,EAAK,OAAO;KAC7B,eAAe;KACf,QAAQ;KACE;IACZ,CAAC;IAMD,IALA,EAAc,UAAU,GACxB,MAAM,EAAW,SACjB,EAAc,UAAU,MAGpB,KAAc,EAAW,SAAS,GAAG;KAEvC,AADA,EAAI,KAAK,GACT,EAAI,aAAa,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;KACjC,IAAM,IAAM,IAAW,OAAQ,IAAI,IAAgB,GAC7C,IAAM,IAAW,OAAQ,IAAI,IAAiB;KAEpD,KAAK,IAAM,KAAa,GACtB,IAAI,EAAU,cAAc,GAAS;MACnC,IAAM,IAAU,GAAqB,EAAU,GAAG,EAAU,GAAG,EAAU,OAAO,EAAU,QAAQ,GAAU,GAAK,CAAG,GAC9G,IAAK,EAAQ,IAAI,GACjB,IAAK,EAAQ,IAAI,GACjB,IAAK,EAAQ,QAAQ,GACrB,IAAK,EAAQ,SAAS;MAE5B,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,KAAK,IAAI,GAAQ,KAAe,KAAS,KAA7B,CAAgC,GAC5D,EAAI,cAAc,WAClB,EAAI,WAAW,KAAK,MAAM,CAAE,GAAG,KAAK,MAAM,CAAE,GAAG,KAAK,KAAK,CAAE,GAAG,KAAK,KAAK,CAAE,CAAC;KAE/E;KAEF,EAAI,QAAQ;IACd;IAGA,IAAM,IAAK,OAAc,KAAgB;KAAE,MAAM;KAAe,SAAS;KAAM,MAAM;KAAI,MAAM;KAAS,OAAO;IAAU,IAAI,KAAA;IAC7H,IAAI,KAAM,EAAG,MAAM;KAEjB,AADA,EAAI,KAAK,GACT,EAAI,aAAa,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;KAEjC,IAAM,IAAU,EAAG,WAAW,KACxB,IAAO,EAAG,QAAQ,SAClB,IAAc,MAAS,WAAW,KAAK,IACvC,KAAQ,EAAG,QAAQ,KAAe,GAClC,IAAO,EAAG;KAMhB,AAJA,EAAI,YAAY,EAAG,SAAS,WAC5B,EAAI,cAAc,GAClB,EAAI,OAAO,OAAO,EAAK,gBACvB,EAAI,YAAY,UAChB,EAAI,eAAe;KAEnB,IAAM,IAAU,EAAW,OACrB,IAAU,EAAW;KAE3B,IAAI,MAAS,UAGX,AAFA,EAAI,UAAU,IAAU,GAAG,IAAU,CAAC,GACtC,EAAI,OAAO,CAAC,KAAK,KAAK,CAAC,GACvB,EAAI,SAAS,GAAM,GAAG,CAAC;UAClB;MACL,IAAM,IAAQ,IAAO,EAAK,SAAS,KAAM,MAAM,GACzC,IAAQ,MAAM,GACd,IAAO,KAAK,KAAK,IAAU,IAAU,IAAU,CAAO;MAG5D,AADA,EAAI,UAAU,IAAU,GAAG,IAAU,CAAC,GACtC,EAAI,OAAO,CAAC,KAAK,KAAK,CAAC;MAEvB,KAAK,IAAI,IAAI,CAAC,GAAM,IAAI,GAAM,KAAK,GAAO;OACxC,IAAM,IAAa,KAAK,IAAI,IAAI,CAAK,IAAI,KAAM,IAAQ;OACvD,KAAK,IAAI,IAAI,CAAC,GAAM,IAAI,GAAM,KAAK,GACjC,EAAI,SAAS,GAAM,IAAI,GAAW,CAAC;MAEvC;KACF;KACA,EAAI,QAAQ;IACd;IAGA,IAAM,IAAa,EAAU;IAC7B,IAAI,KAAc,CAAC,GAAa;KAE9B,AADA,EAAW,QAAQ,EAAW,OAC9B,EAAW,SAAS,EAAW;KAC/B,IAAM,IAAU,EAAW,WAAW,IAAI;KAM1C,AALI,KACF,EAAQ,UAAU,GAAY,GAAG,CAAC,GAEpC,EAAmB,UAAU,IAC7B,GAAoB,EAAI,GACxB,EAAc,UAAU,CAAO;IACjC;IAGA,AADA,EAAW,QAAQ,GACnB,EAAW,SAAS;GACtB,SAAS,GAAU;IACjB,AAAI,GAAK,SAAS,iCAChB,QAAQ,MAAM,QAAQ,EAAQ,kBAAkB,CAAG;GAEvD,UAAU;IACR,IAAI,GACF,IAAI;KAAE,EAAY,UAAU;IAAG,QAAQ,CAAC;IAE1C,AAAI,EAAa,YAAY,MAC3B,EAAa,UAAU;GAE3B;EACF,GAKM,IAAQ,EAAmB,UAAU,MAAM;EAGjD,OAFA,IAAQ,WAAW,GAAc,CAAK,SAEzB;GAGX,IAFA,IAAc,IACV,KAAO,aAAa,CAAK,GACzB,EAAc,SAAS;IACzB,IAAI;KAAE,EAAc,QAAQ,OAAO;IAAG,QAAQ,CAAC;IAC/C,EAAc,UAAU;GAC1B;GACA,IAAI,EAAa,SAAS;IACxB,IAAI;KAAE,EAAa,QAAQ,UAAU;IAAG,QAAQ,CAAC;IACjD,EAAa,UAAU;GACzB;EACF;CACF,GAAG;EAAC;EAAS;EAAQ;EAAO;EAAU;EAAe;EAAgB;EAAW;EAAe;CAAU,CAAC,GAG1G,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,EAAa;EAC/B,IAAI,CAAC,MAAe,CAAC,GAAW;EAChC,IAAI,IAAc;EAgDlB,QADA,YA7C+B;GAC7B,IAAI;IACF,IAAM,IAAO,MAAM,EAAO,QAAQ,CAAO;IACzC,IAAI,GAAa;IACjB,IAAM,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,GAAY,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;IAEA,IAAI,GAAa;IAOjB,AANA,EAAU,YAAY,IAMtB,MAAM,IALgB,GAAS,UAAU;KACvC,mBAAmB;KACR;KACD;IACZ,CACM,CAAA,CAAU,OAAO;GACzB,SAAS,GAAG;IACV,AAAK,KACH,QAAQ,MAAM,4BAA4B,CAAC;GAE/C;EACF,EACA,CAAW,SACE;GACX,IAAc;EAChB;CACF,GAAG;EAAC;EAAa;EAAQ;EAAS;EAAU;CAAU,CAAC;CACvD,IAAM,IAAkB,EAAY,QAAO,MAAK,EAAE,cAAc,CAAO,GACjE,KAAmB,CAAC,MAAoC;CAE9D,OACE,kBAAC,OAAD;EACE,IAAI,YAAY;EAChB,WAAU;EACV,eAAe;GAAE,CAAI,MAAe,QAAQ,MAAe,aAAU,GAAiB;EAAG;EACzF,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,eAAgB,MAAoB,MAAe,QAAS,SAAS;KACrE,SAAS;KACT,YAAY,KAAmB,YAAY;KAC3C,OAAO,GAAG,EAAc;KACxB,QAAQ,GAAG,EAAe;KAC1B,QAAQ;IACV;GACD,CAAA;IAGE,KAAsB,EAAmB,cAAc,KAAa,KAAuB,EAAoB,SAAS,aAAc;IACvI,IAAM,IAAM,IAAW,OAAQ,IAAI,IAAgB,GAC7C,IAAM,IAAW,OAAQ,IAAI,IAAiB;IAEpD,OACE,kBAAC,OAAD;KAAK,OAAO;MACV,UAAU;MAAY,KAAK;MAAG,MAAM;MAAG,OAAO;MAAQ,QAAQ;MAC9D,eAAe;MAAQ,QAAQ;MAC/B,YAAY,KAAmB,YAAY;MAC3C,SAAS;KACX;KALA,UAAA;MAME,kBAAC,SAAD,EAAA,UAAQ,qfAYC,CAAA;MAER,KAAsB,EAAmB,cAAc,KAAW,EAAmB,OAAO,KAAK,GAAG,MAAQ;OAC3G,IAAM,IAAM,GAAqB,EAAE,GAAG,IAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,GAAU,GAAK,CAAG;OACjG,OACE,kBAAC,OAAD,EAA2B,OAAO;QAChC,UAAU;QACV,MAAM,GAAG,EAAI,IAAI,EAAM;QACvB,KAAK,GAAG,EAAI,IAAI,EAAM;QACtB,OAAO,GAAG,EAAI,QAAQ,EAAM;QAC5B,QAAQ,GAAG,EAAI,SAAS,EAAM;QAC9B,iBAAiB;QACjB,QAAQ;QACR,cAAc;QACd,WAAW;OACb,EAAI,GAVM,UAAU,GAUhB;MAER,CAAC;MAGA,KAAuB,EAAoB,QAAO,MAAM,EAAG,cAAc,CAAO,CAAC,CAAC,KAAK,GAAI,MAC1F,kBAAC,EAAM,UAAP,EAAA,UACG,EAAG,OAAO,KAAK,GAAG,MAAS;OAC1B,IAAM,IAAM,GAAqB,EAAE,GAAG,IAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,GAAU,GAAK,CAAG,GAC3F,IAAK,EAAG,SAAS,4BACjB,IAAS,EAAG,eAAe;OACjC,OACE,kBAAC,OAAD;QAEE,OAAO;SACL,UAAU;SACV,MAAM,GAAG,EAAI,IAAI,EAAM;SACvB,KAAK,GAAG,EAAI,IAAI,EAAM;SACtB,OAAO,GAAG,EAAI,QAAQ,EAAM;SAC5B,QAAQ,GAAG,EAAI,SAAS,EAAM;SAC9B,iBAAiB;SACjB,QAAQ,eAAe;SACvB,cAAc;SACd,WAAW,EAAG,UAAU,KAA0D,SAAlD;SAChC,WAAW;SACX,QAAQ;QACV;QAEC,UAAA,EAAG,WAAW,MAAS,KACtB,kBAAC,OAAD;SAAK,OAAO;UACV,UAAU;UACV,QAAQ;UACR,MAAM;UACN,WAAW;UACX,cAAc;UACd,iBAAiB;UACjB,OAAO;UACP,UAAU;UACV,YAAY;UACZ,SAAS;UACT,cAAc;UACd,YAAY;UACZ,WAAW;UACX,QAAQ;UACR,eAAe;SACjB;SACG,UAAA,EAAG,QAAQ,SAAS,KAAK,GAAG,EAAG,QAAQ,MAAM,GAAG,EAAE,EAAE,OAAO,EAAG;QAC5D,CAAA;OAEJ,GApCE,UAAU,GAoCZ;MAET,CAAC,EACa,GA9CK,EAAG,MAAM,MAAM,GA8CpB,CACjB;KACE;;GAET,EAAA,CAAG;UAGK;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,SAAS,MAAe,YAAY,CAAC,KAAoB,SAAS;MACxH,QAAQ;MACR,YAAY,KAAmB,YAAY;MAC3C,SAAS;KACX;KACA,SAAS,OAAO,EAAc,GAAG;KACjC,cAAc,MAAM,GAAY,GAAG,CAAO;KAC1C,cAAc,MAAM,EAAY,GAAG,CAAO;KAC1C,YAAY,MAAM,GAAU,GAAG,CAAO;KACtC,eAAe,MAAM,GAAU,GAAG,CAAO;KAEzC,UAAA,kBAAC,KAAD;MAAG,WAAW;MACZ,UAAA,kBAAC,EAAM,UAAP,EAAA,UAAA,CACG,EAAgB,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,gBAAgB,MAAwB;SACtC,KAA0B,EAAI,IAAI,CAAC;QACrC;QACA,cAAc,MAAwB;SACpC,AAAI,KAAc,OAChB,EAAE,gBAAgB,GAClB,GAAY,EAAI,IAAI,GAAG,CAAO;QAElC;QACA,OAAO;SACL,eAAe;SACf,QAAQ,MAAe,WAAW,YAAa,IAAa,SAAS;QACvE;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,MAAM;QAC1C,IAAM,IAAO,EAAI,SAAS,EAAI,QAAQ,IAAI,EAAI,QAAQ,KAChD,IAAO,EAAI,UAAU,EAAI,SAAS,IAAI,EAAI,SAAS;QACzD,IACE,kBAAC,KAAD,EAAA,UAAA,CACE,kBAAC,QAAD;SAAM,GAAG,EAAI;SAAG,GAAG,EAAI;SAAG,OAAO;SAAM,QAAQ;SAAM,MAAK;SAAc,OAAO,EAAE,eAAe,MAAM;QAAI,CAAA,GAC1G,kBAAC,iBAAD;SAAe,GAAG,EAAI;SAAG,GAAG,EAAI;SAAG,OAAO;SAAM,QAAQ;SAAM,OAAO;UAAE,UAAU;UAAW,eAAe;SAAO;SAChH,UAAA,kBAAC,OAAD;UACE,OAAO;WACL,OAAO,GAAG,EAAK;WACf,WAAW,GAAG,EAAK;WACnB,WAAW;WACX,cAAc;WACd,YAAY;WACZ,OAAO;WACP,UAAU;WACV,YAAY;WACZ,YAAY;WACZ,YAAY;WACZ,WAAW;WACX,SAAS;UACX;UAEC,UAAA,EAAI;SACF,CAAA;QACQ,CAAA,CACd,EAAA,CAAA;OAEP,OAAO,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,GAAW;QAC1F,IAAM,IAAU,EAAI,SAAS,EAAI,MAAM,SAAS,IAAI,EAAI,QAAQ,CAAC;SAAE,GAAG,EAAI;SAAG,GAAG,EAAI;SAAG,OAAO,EAAI;SAAO,QAAQ,EAAI;QAAO,CAAC;QAC7H,IACE,kBAAC,KAAD;SAAG,OAAO,EAAE,cAAc,WAAW;SAClC,UAAA,EAAQ,KAAK,GAAG,MACf,kBAAC,QAAD;UAAc,GAAG,EAAE;UAAG,GAAG,EAAE;UAAG,OAAO,EAAE;UAAO,QAAQ,EAAE;UAAQ,MAAM;UAAa,SAAS,EAAI;SAAU,GAA/F,CAA+F,CAC3G;QACA,CAAA;OAEP,OAAO,IAAI,EAAI,SAAS,aAAa;QACnC,IAAM,IAAU,EAAI,SAAS,EAAI,MAAM,SAAS,IAAI,EAAI,QAAQ,CAAC;SAAE,GAAG,EAAI;SAAG,GAAG,EAAI;SAAG,OAAO,EAAI;SAAO,QAAQ,EAAI;QAAO,CAAC,GACvH,IAAK,EAAI,eAAe;QAC9B,IACE,kBAAC,KAAD,EAAA,UACG,EAAQ,KAAK,GAAG,MACf,kBAAC,EAAM,UAAP,EAAA,UAAA,CACE,kBAAC,QAAD;SAAM,GAAG,EAAE;SAAG,GAAG,EAAE;SAAG,OAAO,EAAE;SAAO,QAAQ,EAAE;SAAQ,MAAK;QAAe,CAAA,GAC5E,kBAAC,QAAD;SACE,IAAI,EAAE;SACN,IAAI,EAAE,IAAI,EAAE,SAAS,IAAK;SAC1B,IAAI,EAAE,IAAI,EAAE;SACZ,IAAI,EAAE,IAAI,EAAE,SAAS,IAAK;SAC1B,QAAQ;SACR,aAAa;SACb,eAAc;QACf,CAAA,CACa,EAAA,GAXK,CAWL,CACjB,EACA,CAAA;OAEP,OAAO,IAAI,EAAI,SAAS,aAAa;QACnC,IAAM,IAAU,EAAI,SAAS,EAAI,MAAM,SAAS,IAAI,EAAI,QAAQ,CAAC;SAAE,GAAG,EAAI;SAAG,GAAG,EAAI;SAAG,OAAO,EAAI;SAAO,QAAQ,EAAI;QAAO,CAAC,GACvH,IAAK,EAAI,eAAe;QAC9B,IACE,kBAAC,KAAD,EAAA,UACG,EAAQ,KAAK,GAAG,MACf,kBAAC,EAAM,UAAP,EAAA,UAAA,CACE,kBAAC,QAAD;SAAM,GAAG,EAAE;SAAG,GAAG,EAAE;SAAG,OAAO,EAAE;SAAO,QAAQ,EAAE;SAAQ,MAAK;QAAe,CAAA,GAC5E,kBAAC,QAAD;SACE,IAAI,EAAE;SACN,IAAI,EAAE,IAAI,EAAE,SAAS;SACrB,IAAI,EAAE,IAAI,EAAE;SACZ,IAAI,EAAE,IAAI,EAAE,SAAS;SACrB,QAAQ;SACR,aAAa;SACb,eAAc;QACf,CAAA,CACa,EAAA,GAXK,CAWL,CACjB,EACA,CAAA;OAEP,OAAO,IAAI,EAAI,SAAS,YAAY;QAClC,IAAM,IAAU,EAAI,SAAS,EAAI,MAAM,SAAS,IAAI,EAAI,QAAQ,CAAC;SAAE,GAAG,EAAI;SAAG,GAAG,EAAI;SAAG,OAAO,EAAI;SAAO,QAAQ,EAAI;QAAO,CAAC,GACvH,IAAK,EAAI,eAAe,KACxB,KAAqB,GAAW,GAAW,MAAkB;SACjE,IAAI,IAAI,KAAK,EAAE,GAAG,KAEd,IAAK;SACT,KAAK,IAAI,IAAK,GAAG,IAAK,IAAI,GAAO,KAAM,GAAM;UAC3C,IAAM,IAAQ,KAAK,IAAI,IAAK,GAAM,IAAI,CAAK,GACrC,IAAO,KAAM,IAAQ,KAAM;UAGjC,AADA,KAAK,MAAM,EAAK,GAAG,KADR,IAAK,OAAO,KACG,IAAI,EAAM,GAAG,KACvC,IAAK,CAAC;SACR;SACA,OAAO;QACT;QACA,IACE,kBAAC,KAAD,EAAA,UACG,EAAQ,KAAK,GAAG,MACf,kBAAC,EAAM,UAAP,EAAA,UAAA,CACE,kBAAC,QAAD;SAAM,GAAG,EAAE;SAAG,GAAG,EAAE;SAAG,OAAO,EAAE;SAAO,QAAQ,EAAE;SAAQ,MAAK;QAAe,CAAA,GAC5E,kBAAC,QAAD;SACE,GAAG,EAAkB,EAAE,GAAG,EAAE,IAAI,EAAE,SAAS,GAAG,EAAE,KAAK;SACrD,MAAK;SACL,QAAQ;SACR,aAAa;SACb,eAAc;SACd,gBAAe;QAChB,CAAA,CACa,EAAA,GAVK,CAUL,CACjB,EACA,CAAA;OAEP,OAAO,IAAI,EAAI,SAAS,UAEtB,IACE,kBAAC,KAAD,EAAA,UAAA,CACE,kBAAC,QAAD;QAAM,GAAG,EAAI;QAAG,GAAG,EAAI;QAAG,OAAO,EAAI;QAAO,QAAQ,EAAI;QAAQ,MAAK;QAAO,QAAQ;QAAa,aAAY;QAAI,iBAAgB;QAAM,SAAS;OAAM,CAAA,GACrJ,EAAI,cAAc,EAAI,QAAQ,MAC7B,kBAAC,QAAD;QAAM,GAAG,EAAI,IAAI;QAAG,GAAG,EAAI,IAAI;QAAG,MAAM;QAAa,UAAS;QAAM,YAAW;QAAa,SAAS;QAAM,UAAA,EAAI;OAAiB,CAAA,CAEjI,EAAA,CAAA;YAEA,IAAI,EAAI,SAAS,UAAU,EAAI,UAAU,KAAA,KAAa,EAAI,WAAW,KAAA,GAAW;QACrF,IAAI,EAAI,MAAM;SACZ,IAAM,IAAY,EAAI,SAAS,EAAI,UAAU,gBAAgB,IAAc;SAC3E,IACE,kBAAC,QAAD;UAAM,GAAG,EAAI;UAAG,GAAG,EAAI,IAAI;UAAI,MAAM;UAAW,UAAS;UAAO,YAAW;UAAa,gBAAe;UAAY,OAAO,EAAE,QAAQ,UAAU;UAC3I,UAAA,EAAI;SACD,CAAA;QAEV,OAAO;SACL,IAAM,IAAc,EAAI,SAAS,EAAI,UAAU,gBAAgB,IAAc;SAC7E,IAAQ,kBAAC,QAAD;UAAM,GAAG,EAAI;UAAG,GAAG,EAAI;UAAG,OAAO,EAAI;UAAO,QAAQ,EAAI;UAAQ,MAAK;UAAc,QAAQ,IAAa,IAAc,GAAG,EAAY;UAAK,aAAa,IAAa,MAAM;UAAK,iBAAiB,IAAa,SAAS;SAAM,CAAA;QACtO;OACF,OAAO,IAAI,EAAI,SAAS,eAAe,EAAI,SAAS,UAAU,EAAI,SAAS;QACzE,IAAM,IAAU,EAAI,WAAW,EAAI,QAAQ,SAAS,IAAI,EAAI,UAAU,CAAC,EAAI,UAAU,CAAC,CAAC;QACvF,IACE,kBAAC,KAAD;SAAG,OAAO,EAAE,cAAc,EAAU;SACjC,UAAA,EAAQ,QAAO,MAAM,EAAG,SAAS,CAAC,CAAC,CAAC,KAAK,GAAI,MAAM;UAClD,IAAM,IAAI,KAAK,EAAG,KAAI,MAAK,GAAG,EAAE,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,KAAK,KAAK;UACtD,OACE,kBAAC,EAAM,UAAP,EAAA,UAAA,CACE,kBAAC,QAAD;WAAS;WAAG,MAAK;WAAO,QAAO;WAAc,aAAa,KAAK,IAAI,IAAI,EAAI,cAAc,CAAC;WAAG,gBAAe;WAAQ,eAAc;UAAS,CAAA,GAC3I,kBAAC,QAAD;WAAS;WAAG,MAAK;WAAO,QAAQ;WAAa,aAAa,EAAI;WAAa,gBAAe;WAAQ,eAAc;UAAS,CAAA,CAC3G,EAAA,GAHK,CAGL;SAEpB,CAAC;QACA,CAAA;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,YAAqB;SACpB,IAAM,IAAI,EAAI,SAAS,EAAI,QAAQ,IAAI,EAAI,QAAQ,IAC7C,IAAI,EAAI,UAAU,EAAI,SAAS,IAAI,EAAI,SAAS,IAChD,IAAc;UAAC;UAAQ;UAAa;UAAW;UAAa;UAAa;UAAa;SAAU,CAAC,CAAC,SAAS,EAAI,IAAI,GACnH,IAAyE;UAC7E,IAAI;WAAE,GAAG,EAAI;WAAG,GAAG,EAAI;WAAG,QAAQ;UAAc;UAChD,GAAG;WAAE,GAAG,EAAI,IAAI,IAAI;WAAG,GAAG,EAAI;WAAG,QAAQ;UAAY;UACrD,IAAI;WAAE,GAAG,EAAI,IAAI;WAAG,GAAG,EAAI;WAAG,QAAQ;UAAc;UACpD,GAAG;WAAE,GAAG,EAAI,IAAI;WAAG,GAAG,EAAI,IAAI,IAAI;WAAG,QAAQ;UAAY;UACzD,IAAI;WAAE,GAAG,EAAI,IAAI;WAAG,GAAG,EAAI,IAAI;WAAG,QAAQ;UAAc;UACxD,GAAG;WAAE,GAAG,EAAI,IAAI,IAAI;WAAG,GAAG,EAAI,IAAI;WAAG,QAAQ;UAAY;UACzD,IAAI;WAAE,GAAG,EAAI;WAAG,GAAG,EAAI,IAAI;WAAG,QAAQ;UAAc;UACpD,GAAG;WAAE,GAAG,EAAI;WAAG,GAAG,EAAI,IAAI,IAAI;WAAG,QAAQ;UAAY;SACvD;SAEA,OACE,kBAAC,KAAD;UAAG,WAAU;UAAb,UAAA,CACE,kBAAC,QAAD;WACE,GAAG,EAAI,IAAI;WAAG,GAAG,EAAI,IAAI;WACzB,OAAO,IAAI;WACX,QAAQ,IAAI;WACZ,MAAK;WAAO,QAAO;WAAiB,aAAY;WAAM,iBAAgB;WACtE,OAAO,EAAE,eAAe,OAAO;UAChC,CAAA,GACA,CAAC,EAAI,YAAY,KAAe,MAAiB,OAAO,QAAQ,CAAY,CAAC,CAAC,KAAK,CAAC,GAAW,OAC9F,kBAAC,QAAD;WAEE,GAAG,EAAM,IAAI;WACb,GAAG,EAAM,IAAI;WACb,OAAO;WACP,QAAQ;WACR,MAAK;WACL,QAAO;WACP,aAAY;WACZ,IAAI;WACJ,OAAO;YAAE,QAAQ,EAAM;YAAQ,eAAe;WAAM;WACpD,cAAc,MAAM;YAElB,AADA,EAAE,gBAAgB,GAClB,GAAc,EAAI,IAAI,GAAW,GAAG,CAAO;WAC7C;UACD,GAdM,CAcN,CACF,CACA;;QAEP,EAAA,CAAG,CACF;OA/CK,GAAA,EAAI,EA+CT;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,MAC1D,EAAU,YAAY,EAAU,WAChC,EAAU,WAAW,EAAU,UAC/B,EAAU,UAAU,EAAU,SAC9B,EAAU,aAAa,EAAU,YACjC,EAAU,kBAAkB,EAAU,iBACtC,EAAU,mBAAmB,EAAU,kBACvC,EAAU,YAAY,EAAU,WAChC,EAAU,aAAa,EAAU,YACjC,EAAU,cAAc,EAAU,aAClC,EAAU,eAAe,EAAU,cACnC,EAAU,yBAAyB,EAAU,wBAC7C,EAAU,uBAAuB,EAAU,sBAC3C,EAAU,cAAc,EAAU,aAClC,EAAU,kBAAkB,EAAU,iBACtC,EAAU,eAAe,EAAU,cACnC,EAAU,gBAAgB,EAAU,eACpC,EAAU,wBAAwB,EAAU,uBAC5C,EAAU,qCAAqC,EAAU,gCACjE;;;ACn5BD,SAAgB,KAA0B;CACxC,IAAI,OAAO,SAAW,OAAe,OAAO,OAAO,cAAe,YAChE,OAAO,OAAO,WAAW;CAG3B,IAAM,IAAM,MAAM,KAAK,EAAE,QAAQ,GAAG,SAAS,KAAK,MAAM,KAAK,OAAO,IAAI,EAAE,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,KAAK,EAAE;CACjG,OAAO,GAAG,EAAI,MAAM,GAAG,CAAC,EAAE,GAAG,EAAI,MAAM,GAAG,EAAE,EAAE,IAAI,EAAI,MAAM,IAAI,EAAE,EAAE,IAAI,EAAI,MAAM,IAAI,EAAE,EAAE,GAAG,EAAI,MAAM,IAAI,EAAE;AAC/G;;;ACPA,eAAsB,GAAoB,GAAgC;CACxE,IAAI,CAAC,GAAM,OAAO;CAGlB,IAAI,OAAO,YAAc,OAAe,UAAU,aAAa,OAAO,UAAU,UAAU,aAAc,YACtG,IAAI;EAEF,OADA,MAAM,UAAU,UAAU,UAAU,CAAI,GACjC;CACT,QAAQ,CAER;CAIF,IAAI,OAAO,WAAa,KACtB,IAAI;EACF,IAAM,IAAW,SAAS,cAAc,UAAU;EAUlD,AATA,EAAS,QAAQ,GACjB,EAAS,aAAa,YAAY,EAAE,GACpC,EAAS,MAAM,UAAU,UACzB,EAAS,MAAM,WAAW,SAC1B,EAAS,MAAM,OAAO,WACtB,EAAS,MAAM,MAAM,WACrB,EAAS,MAAM,UAAU,KACzB,SAAS,KAAK,YAAY,CAAQ,GAClC,EAAS,OAAO,GAChB,EAAS,kBAAkB,GAAG,EAAK,MAAM;EACzC,IAAM,IAAa,SAAS,YAAY,MAAM;EAE9C,OADA,SAAS,KAAK,YAAY,CAAQ,GAC3B;CACT,SAAS,GAAK;EAEZ,OADA,QAAQ,MAAM,8CAA8C,CAAG,GACxD;CACT;CAGF,OAAO;AACT;;;AC5BA,IAAa,MAA6D,EAAE,iBAAc,WAAQ,6BAA0B;CAC1H,IAAM,CAAC,GAAc,KAAmB,EAAiB,EAAE,GACrD,CAAC,GAAU,KAAe,EAA+C,IAAI,GAC7E,CAAC,GAAQ,KAAa,EAAkB,EAAK,GAC7C,IAAa,EAA6C,IAAI,GAE9D,IAAiB,QAAkB;EACvC,IAAI,OAAO,SAAW,KAAa;EACnC,IAAM,IAAY,OAAO,aAAa;EAEtC,IAAI,CAAC,KAAa,EAAU,eAAe,CAAC,EAAU,cAAc,CAAC,EAAa,SAAS;GAEzF,AADA,EAAY,IAAI,GAChB,EAAgB,EAAE;GAClB;EACF;EAEA,IAAM,IAAQ,EAAU,WAAW,CAAC,GAC9B,IAAiB,EAAM;EAG7B,IAAI,CAAC,EAAa,QAAQ,SAAS,CAAc,GAAG;GAElD,AADA,EAAY,IAAI,GAChB,EAAgB,EAAE;GAClB;EACF;EAEA,IAAM,IAAO,EAAU,SAAS,CAAC,CAAC,KAAK;EACvC,IAAI,CAAC,GAAM;GAET,AADA,EAAY,IAAI,GAChB,EAAgB,EAAE;GAClB;EACF;EAEA,IAAM,IAAY,EAAM,sBAAsB;EAC9C,IAAI,EAAU,UAAU,KAAK,EAAU,WAAW,GAAG;GAEnD,AADA,EAAY,IAAI,GAChB,EAAgB,EAAE;GAClB;EACF;EAEA,IAAM,IAAgB,EAAa,QAAQ,sBAAsB,GAE3D,IADU,EAAU,OAAO,EAAU,QAAQ,IACzB,EAAc,OAAO,EAAa,QAAQ,YAGhE,IAAS,EAAU,MAAM,EAAc,MAAM,EAAa,QAAQ,YAAY;EAMlF,AALI,IAAS,EAAa,QAAQ,YAAY,MAC5C,IAAS,EAAU,SAAS,EAAc,MAAM,EAAa,QAAQ,YAAY,IAGnF,EAAgB,CAAI,GACpB,EAAY;GAAE,KAAK;GAAQ,MAAM;EAAQ,CAAC;CAC5C,GAAG,CAAC,CAAY,CAAC;CA+CjB,OA7CA,QAAgB;EACd,IAAM,UAA8B;GAElC,sBAAsB,CAAc;EACtC;EAEA,SAAS,iBAAiB,mBAAmB,CAAqB;EAClE,IAAM,IAAY,EAAa;EAK/B,OAJI,KACF,EAAU,iBAAiB,UAAU,GAAgB,EAAE,SAAS,GAAK,CAAC,SAG3D;GAKX,AAJA,SAAS,oBAAoB,mBAAmB,CAAqB,GACjE,KACF,EAAU,oBAAoB,UAAU,CAAc,GAEpD,EAAW,WACb,aAAa,EAAW,OAAO;EAEnC;CACF,GAAG,CAAC,GAAc,CAAc,CAAC,GAoB7B,CAAC,KAAY,CAAC,IACT,OAIP,kBAAC,OAAD;EACE,MAAK;EACL,cAAW;EACX,OAAO;GACL,UAAU;GACV,KAAK,GAAG,EAAS,IAAI;GACrB,MAAM,GAAG,EAAS,KAAK;GACvB,WAAW;GACX,QAAQ;GACR,SAAS;GACT,YAAY;GACZ,iBAAiB;GACjB,cAAc;GACd,SAAS;GACT,WAAW;GACX,eAAe;GACf,YAAY;GACZ,YAAY;GACZ,WAAW;EACb;EACA,cAAc,MAAM;GAGlB,AADA,EAAE,eAAe,GACjB,EAAE,gBAAgB;EACpB;EAxBF,UAAA;GA0BE,kBAAC,SAAD,EAAA,UAAQ,wLAKC,CAAA;GACT,kBAAC,UAAD;IACE,SAAS,OAxDW,MAAwB;KAChD,EAAE,eAAe,GACjB,EAAE,gBAAgB,GAEb,KAGD,MADkB,GAAoB,CAAY,MAEpD,EAAU,EAAI,GACd,IAAS,CAAY,GAEjB,EAAW,WAAS,aAAa,EAAW,OAAO,GACvD,EAAW,UAAU,iBAAiB;MACpC,EAAU,EAAK;KACjB,GAAG,IAAI;IAEX;IAyCM,OAAO;KACL,SAAS;KACT,YAAY;KACZ,KAAK;KACL,YAAY;KACZ,QAAQ;KACR,OAAO,IAAS,YAAY;KAC5B,QAAQ;KACR,UAAU;KACV,YAAY;KACZ,SAAS;KACT,cAAc;KACd,YAAY;IACd;IACA,eAAe,MAAM;KACnB,EAAE,cAAc,MAAM,kBAAkB;IAC1C;IACA,eAAe,MAAM;KACnB,EAAE,cAAc,MAAM,kBAAkB;IAC1C;IACA,OAAM;IAtBR,UAAA,CAwBG,IAAS,kBAAC,GAAD;KAAO,MAAM;KAAI,OAAM;IAAW,CAAA,IAAI,kBAAC,IAAD;KAAM,MAAM;KAAI,OAAM;IAAW,CAAA,GACjF,kBAAC,QAAD,EAAA,UAAO,IAAS,YAAY,OAAa,CAAA,CACnC;;GAEP,KACC,kBAAA,IAAA,EAAA,UAAA;IACE,kBAAC,OAAD,EAAK,OAAO;KAAE,OAAO;KAAO,QAAQ;KAAQ,iBAAiB;KAA4B,QAAQ;IAAQ,EAAI,CAAA;IAC7G,kBAAC,UAAD;KACE,UAAU,MAAM;MAA2C,AAAzC,EAAE,eAAe,GAAG,EAAE,gBAAgB,GAAG,EAAoB,WAAW;KAAG;KAC7F,OAAO;MACL,SAAS;MAAQ,YAAY;MAAU,gBAAgB;MACvD,OAAO;MAAQ,QAAQ;MAAQ,YAAY;MAAe,QAAQ;MAClE,cAAc;MAAO,QAAQ;MAAW,SAAS;KACnD;KACA,eAAe,MAAM;MAAE,EAAE,cAAc,MAAM,kBAAkB;KAA6B;KAC5F,eAAe,MAAM;MAAE,EAAE,cAAc,MAAM,kBAAkB;KAAe;KAC9E,OAAM;KAEN,UAAA,kBAAC,IAAD;MAAa,MAAM;MAAI,OAAM;KAAW,CAAA;IAClC,CAAA;IACR,kBAAC,UAAD;KACE,UAAU,MAAM;MAA2C,AAAzC,EAAE,eAAe,GAAG,EAAE,gBAAgB,GAAG,EAAoB,WAAW;KAAG;KAC7F,OAAO;MACL,SAAS;MAAQ,YAAY;MAAU,gBAAgB;MACvD,OAAO;MAAQ,QAAQ;MAAQ,YAAY;MAAe,QAAQ;MAClE,cAAc;MAAO,QAAQ;MAAW,SAAS;KACnD;KACA,eAAe,MAAM;MAAE,EAAE,cAAc,MAAM,kBAAkB;KAA6B;KAC5F,eAAe,MAAM;MAAE,EAAE,cAAc,MAAM,kBAAkB;KAAe;KAC9E,OAAM;KAEN,UAAA,kBAAC,IAAD;MAAW,MAAM;MAAI,OAAM;KAAW,CAAA;IAChC,CAAA;IACR,kBAAC,UAAD;KACE,UAAU,MAAM;MAA2C,AAAzC,EAAE,eAAe,GAAG,EAAE,gBAAgB,GAAG,EAAoB,WAAW;KAAG;KAC7F,OAAO;MACL,SAAS;MAAQ,YAAY;MAAU,gBAAgB;MACvD,OAAO;MAAQ,QAAQ;MAAQ,YAAY;MAAe,QAAQ;MAClE,cAAc;MAAO,QAAQ;MAAW,SAAS;KACnD;KACA,eAAe,MAAM;MAAE,EAAE,cAAc,MAAM,kBAAkB;KAA6B;KAC5F,eAAe,MAAM;MAAE,EAAE,cAAc,MAAM,kBAAkB;KAAe;KAC9E,OAAM;KAEN,UAAA,kBAAC,IAAD;MAAe,MAAM;MAAI,OAAM;KAAW,CAAA;IACpC,CAAA;IACR,kBAAC,UAAD;KACE,UAAU,MAAM;MAA2C,AAAzC,EAAE,eAAe,GAAG,EAAE,gBAAgB,GAAG,EAAoB,UAAU;KAAG;KAC5F,OAAO;MACL,SAAS;MAAQ,YAAY;MAAU,gBAAgB;MACvD,OAAO;MAAQ,QAAQ;MAAQ,YAAY;MAAe,QAAQ;MAClE,cAAc;MAAO,QAAQ;MAAW,SAAS;KACnD;KACA,eAAe,MAAM;MAAE,EAAE,cAAc,MAAM,kBAAkB;KAA6B;KAC5F,eAAe,MAAM;MAAE,EAAE,cAAc,MAAM,kBAAkB;KAAe;KAC9E,OAAM;KAEN,UAAA,kBAAC,OAAD;MAAK,OAAO;MAAI,QAAQ;MAAI,SAAQ;MAAY,MAAK;MAAO,QAAO;MAAU,aAAY;MAAM,eAAc;MAAQ,gBAAe;MAClI,UAAA,kBAAC,QAAD,EAAM,GAAE,sDAAuD,CAAA;KAC5D,CAAA;IACC,CAAA;GACR,EAAA,CAAA;EAED;;AAET;;;ACpOA,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,GACnC,IAAW,EAAK,YAAY,EAAE,OAAO,EAAE,CAAC,GAExC,KAAQ,MADY,EAAK,eAAe,EAAA,CACpB,OAEpB,EAAE,aAAU,gBAAa,mBAAgB,GAAc,CAAK;EAGlE,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;KACnB,IAAI,CAAC,KAAQ,CAAC,EAAK,WAAW;KAI9B,IAAM,IAAK,EAAK,UAAU,IACpB,IAAK,EAAK,UAAU,IACpB,IAAS,KAAK,IAAI,EAAK,UAAU,EAAE,GAEnC,KAAU,EAAK,OAAO,GAAA,CAAI,QAC1B,IAAY,IAAS,IAAI,EAAK,QAAQ,IAAS,EAAK,OAEpD,IAAS,IAAM,EAAU,MAAM,GAC/B,KAAe,EAAU,MAAM,EAAU,MAAO,KAAK,GACrD,IAAc,EAAK,UAAU,GAG7B,IAAO,EAAS,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;;;ACrFA,IAAa,KAAuC;CAAE,OAAO;CAAK,QAAQ;AAAI;AAM9E,SAAgB,GACd,GACA,IAA2B,IACV;CACjB,IAAI,KAAY,GAAG,OAAO,CAAC;CAC3B,IAAM,IAAM;EAAE,OAAO,EAAU;EAAO,QAAQ,EAAU;CAAO;CAC/D,OAAO,MAAM,KAAK,EAAE,QAAQ,EAAS,UAAU,EAAE,GAAG,EAAI,EAAE;AAC5D;AAMA,SAAgB,GACd,GACA,GACA,GACA,IAAM,IACK;CACX,IAAM,IAAU,EAAK,KAAK,MACpB,EAAI,WAAW,IAAU,IACX,KAAK,IAAI,GAAG,EAAI,KAAK,MAAM,EAAQ,CAAC,CAAC,CAAC,MAAM,CACvD,IAAY,IAAQ,CAC5B,GAEK,IAAiB,CAAC,GACpB,IAAM;CACV,KAAK,IAAM,KAAK,GAEd,AADA,EAAK,KAAK,CAAG,GACb,KAAO;CAGT,OAAO;EAAE;EAAS;EAAM,OAAO;CAAI;AACrC;AAKA,SAAgB,EACd,GACA,GACA,IAAY,IACH;CACT,IAAI,EAAM,WAAW,EAAM,QAAQ,OAAO;CAC1C,KAAK,IAAI,IAAI,GAAG,IAAI,EAAM,QAAQ,KAAK;EACrC,IAAM,IAAI,EAAM,IACV,IAAI,EAAM;EAChB,IACE,KAAK,IAAI,EAAE,QAAQ,EAAE,KAAK,IAAI,KAC9B,KAAK,IAAI,EAAE,SAAS,EAAE,MAAM,IAAI,GAEhC,OAAO;CAEX;CACA,OAAO;AACT;;;ACzCA,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,IAA4C;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;;;ACnE7C,SAAwB,GAAqB,EAC3C,UACA,UACA,iBAAc,OACd,mBACA,mBAC4B;CAC5B,IAAM,CAAC,GAAW,KAAgB,EAAwB,IAAI;CAE9D,IAAI,CAAC,KAAS,EAAM,WAAW,GAAG,OAAO;CAEzC,IAAM,IAAgB,EAAM,QAAO,MAC7B,MAAgB,cAAoB,EAAE,SAAS,cAAc,EAAE,SAAS,iBACxE,MAAgB,eAAoB,EAAE,SAAS,cAAc,EAAE,SAAS,cAE7E;CAED,OACE,kBAAC,OAAD;EACE,WAAU;EACV,OAAO;GACL,UAAU;GACV,KAAK;GACL,MAAM;GACN,OAAO;GACP,QAAQ;GACR,eAAe;GACf,QAAQ;EACV;EAVF,UAAA,CAYE,kBAAC,SAAD,EAAA,UAAQ,waAYC,CAAA,GACR,EAAc,KAAK,MAAQ;GAC1B,IAAM,IAAa,MAAmB,EAAI,IACpC,IAAY,MAAc,EAAI,IAEhC,IAAK,4BACL,IAAS,uBACT,IAAa,WACb,IAAc;GAElB,AAAI,EAAI,SAAS,cACf,IAAK,IAAa,4BAA4B,2BAC9C,IAAS,IAAa,sBAAsB,uBAC5C,IAAa,WACb,IAAc,aACL,EAAI,SAAS,eACtB,IAAK,IAAa,6BAA6B,4BAC/C,IAAS,IAAa,sBAAsB,uBAC5C,IAAa,WACb,IAAc;GAGhB,IAAM,IAAI,EAAI,IAAI,GACZ,IAAI,EAAI,IAAI,GACZ,IAAI,EAAI,QAAQ,GAChB,IAAI,EAAI,SAAS;GAEvB,OACE,kBAAC,OAAD;IAEE,IAAI,kBAAkB,EAAI;IAC1B,UAAU,MAAM;KAEd,AADA,EAAE,gBAAgB,GAClB,IAAe,EAAI,EAAE;IACvB;IACA,oBAAoB,EAAa,EAAI,EAAE;IACvC,oBAAoB,EAAa,IAAI;IACrC,OAAO;KACL,UAAU;KACV,MAAM,GAAG,EAAE;KACX,KAAK,GAAG,EAAE;KACV,OAAO,GAAG,EAAE;KACZ,QAAQ,GAAG,EAAE;KACb,iBAAiB;KACT;KACR,cAAc;KACd,QAAQ;KACR,eAAe;KACf,WAAW,IAAa,+CAA+C;KACvE,WAAW,IACP,yDACA,IACA,+BACA;KACJ,YAAY;KACZ,QAAQ,IAAa,KAAK,IAAY,KAAK;IAC7C;IACA,OAAO,GAAG,EAAY,IAAI,EAAI;IAE5B,WAAA,KAAa,MACb,kBAAC,OAAD;KACE,OAAO;MACL,UAAU;MACV,QAAQ;MACR,MAAM;MACN,WAAW;MACX,cAAc;MACd,iBAAiB;MACjB,OAAO;MACP,UAAU;MACV,YAAY;MACZ,SAAS;MACT,cAAc;MACd,YAAY;MACZ,WAAW;MACX,QAAQ;MACR,SAAS;MACT,YAAY;MACZ,KAAK;MACL,eAAe;KACjB;KApBF,UAAA;MAsBE,kBAAC,QAAD;OAAM,OAAO;QAAE,OAAO;QAAY,YAAY;QAAK,eAAe;QAAa,UAAU;OAAO;OAC7F,UAAA;MACG,CAAA;MACN,kBAAC,QAAD;OAAM,OAAO;QAAE,UAAU;QAAS,UAAU;QAAU,cAAc;OAAW;OAA/E,UAAA;QAAkF;QAC9E,EAAI;QAAK;OACP;;MACN,kBAAC,OAAD,EAAK,OAAO;OACV,UAAU;OACV,KAAK;OACL,MAAM;OACN,WAAW;OACX,OAAO;OACP,QAAQ;OACR,YAAY;OACZ,aAAa;OACb,WAAW;MACb,EAAI,CAAA;KACD;;GAEJ,GAxEE,EAAI,EAwEN;EAET,CAAC,CACE;;AAET;;;AClIA,SAAwB,GAAiB,EACvC,YACA,YACA,YACA,UACA,aACA,iBACA,cACA,eACA,gBACA,cACA,kBACA,eACA,YAAS,CAAC,GACV,YAAS,CAAC,GACV,mBACA,iBACA,sCAAmC,MACX;CACxB,IAAM,IAAgB,EAAuB,IAAI,GAC3C,IAAgB,EAAuB,IAAI,GAC3C,KAAe,EAAO,EAAK;CAkCjC,AA/BA,QAAgB;EACd,IAAM,IAAM,EAAc,SACpB,IAAM,EAAc;EAC1B,IAAI,CAAC,KAAO,CAAC,GAAK;EAElB,IAAM,UAAiB;GACjB,GAAa,YACjB,GAAa,UAAU,IACvB,EAAI,YAAY,EAAI,WACpB,EAAI,aAAa,EAAI,YACrB,iBAAiB;IAAE,GAAa,UAAU;GAAO,GAAG,EAAE;EACxD,GAEM,UAAiB;GACjB,GAAa,YACjB,GAAa,UAAU,IACvB,EAAI,YAAY,EAAI,WACpB,EAAI,aAAa,EAAI,YACrB,iBAAiB;IAAE,GAAa,UAAU;GAAO,GAAG,EAAE;EACxD;EAKA,OAHA,EAAI,iBAAiB,UAAU,CAAQ,GACvC,EAAI,iBAAiB,UAAU,CAAQ,SAE1B;GAEX,AADA,EAAI,oBAAoB,UAAU,CAAQ,GAC1C,EAAI,oBAAoB,UAAU,CAAQ;EAC5C;CACF,GAAG,CAAC,CAAC,GAGL,QAAgB;EACd,IAAI,CAAC,GAAgB;EAErB,IAAM,IAAY,CADA,GAAI,KAAU,CAAC,GAAI,GAAI,KAAU,CAAC,CAClC,CAAA,CAAS,MAAK,MAAK,EAAE,OAAO,CAAc;EAC5D,IAAI,KAAa,EAAc,SAAS;GACtC,IAAM,IAAQ,EAAc,QAAQ,gBAAgB,KAC9C,IAAU,EAAU,IAAI,GACxB,IAAY,KAAK,IAAI,GAAG,IAAU,IAAQ,CAAC;GACjD,EAAc,QAAQ,SAAS;IAC7B,KAAK;IACL,UAAU;GACZ,CAAC;EACH;CACF,GAAG;EAAC;EAAgB;EAAQ;EAAQ;CAAK,CAAC;CAE1C,IAAM,CAAC,GAAO,MAAY,EAA4C,CAAY,GAC5E,CAAC,IAAO,MAAY,EAA4C,CAAY;CAWlF,AATA,QAAgB;EACd,AAAI,KACF,EAAQ,QAAQ,CAAO,CAAC,CAAC,MAAK,MAAQ;GACpC,IAAM,IAAK,EAAK,YAAY;IAAE,OAAO;IAAG,WAAW,EAAK,SAAS,KAAY;GAAI,CAAC;GAClF,GAAS;IAAE,OAAO,EAAG;IAAO,QAAQ,EAAG;GAAO,CAAC;EACjD,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;CAErB,GAAG;EAAC;EAAS;EAAS;CAAQ,CAAC,GAE/B,QAAgB;EACd,AAAI,KACF,EAAQ,QAAQ,CAAO,CAAC,CAAC,MAAK,MAAQ;GACpC,IAAM,IAAK,EAAK,YAAY;IAAE,OAAO;IAAG,WAAW,EAAK,SAAS,KAAY;GAAI,CAAC;GAClF,GAAS;IAAE,OAAO,EAAG;IAAO,QAAQ,EAAG;GAAO,CAAC;EACjD,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;CAErB,GAAG;EAAC;EAAS;EAAS;CAAQ,CAAC;CAE/B,IAAM,MAAgB,EAAM,SAAS,OAAO,GACtC,MAAiB,EAAM,UAAU,OAAO,GAExC,MAAgB,GAAM,SAAS,OAAO,GACtC,MAAiB,GAAM,UAAU,OAAO;CAE9C,OACE,kBAAC,OAAD;EAAK,OAAO;GAAE,MAAM;GAAG,SAAS;GAAQ,WAAW;GAAG,OAAO;GAAQ,QAAQ;GAAQ,UAAU;EAAS;EAAxG,UAAA,CAEE,kBAAC,OAAD;GACE,KAAK;GACL,OAAO;IACL,MAAM;IACN,QAAQ;IACR,UAAU;IACV,iBAAiB;IACjB,aAAa;IACb,SAAS;IACT,eAAe;IACf,YAAY;IACZ,SAAS;GACX;GAZF,UAAA,CAcE,kBAAC,OAAD;IAAK,OAAO;KACV,cAAc;KAAO,SAAS;KAAY,cAAc;KACxD,iBAAiB;KAAW,OAAO;KAAW,UAAU;KAAQ,YAAY;IAC9E;IAHA,UAAA,CAGG,6BACyB,CACvB;GACL,CAAA,GAAA,kBAAC,OAAD;IAAK,OAAO;KAAE,UAAU;KAAY,OAAO,GAAG,GAAa;KAAK,QAAQ,GAAG,GAAc;KAAK,WAAW;IAA8B;IAAvI,UAAA,CACG,KACC,kBAAC,IAAD;KACW;KACT,QAAQ;KACD;KACG;KACV,WAAW;KACX,YAAY;KACZ,SAAS;KACT,eAAe,EAAM;KACrB,gBAAgB,EAAM;KACtB,gBAAgB;KAChB,iBAAiB;KACN;KACC;KACC;KACb,sBAAsB;KACtB,oBAAoB;KACpB,mBAAmB,CAAC;KACpB,mBAAmB,CAAC;KACpB,iBAAiB,CAAC;KAClB,8BAA8B,CAAC;KAC/B,yBAAyB,CAAC;KAC1B,wBAAwB,CAAC;KACd;KACI;KACH;KACsB;IACnC,CAAA,GAEH,kBAAC,IAAD;KACE,OAAO;KACA;KACP,aAAY;KACI;KACF;IACf,CAAA,CACE;GACF,CAAA,CAAA;EAGL,CAAA,GAAA,kBAAC,OAAD;GACE,KAAK;GACL,OAAO;IACL,MAAM;IACN,QAAQ;IACR,UAAU;IACV,iBAAiB;IACjB,SAAS;IACT,eAAe;IACf,YAAY;IACZ,SAAS;GACX;GAXF,UAAA,CAaE,kBAAC,OAAD;IAAK,OAAO;KACV,cAAc;KAAO,SAAS;KAAY,cAAc;KACxD,iBAAiB;KAAW,OAAO;KAAW,UAAU;KAAQ,YAAY;IAC9E;IAHA,UAAA,CAGG,mCAC+B,CAC7B;GACL,CAAA,GAAA,kBAAC,OAAD;IAAK,OAAO;KAAE,UAAU;KAAY,OAAO,GAAG,GAAa;KAAK,QAAQ,GAAG,GAAc;KAAK,WAAW;IAA8B;IAAvI,UAAA,CACG,KACC,kBAAC,IAAD;KACW;KACT,QAAQ;KACD;KACG;KACV,WAAW;KACX,YAAY;KACZ,SAAS;KACT,eAAe,GAAM;KACrB,gBAAgB,GAAM;KACtB,gBAAgB;KAChB,iBAAiB;KACN;KACC;KACC;KACb,sBAAsB;KACtB,oBAAoB;KACpB,mBAAmB,CAAC;KACpB,mBAAmB,CAAC;KACpB,iBAAiB,CAAC;KAClB,8BAA8B,CAAC;KAC/B,yBAAyB,CAAC;KAC1B,wBAAwB,CAAC;KACd;KACI;KACH;KACsB;IACnC,CAAA,GAEH,kBAAC,IAAD;KACE,OAAO;KACA;KACP,aAAY;KACI;KACF;IACf,CAAA,CACE;GACF,CAAA,CAAA;EACF,CAAA,CAAA;;AAET;;;AC9OA,SAAwB,GAAe,EACrC,iBACA,cACA,gBACA,oBACA,eACA,eACA,aACsB;CACtB,IAAM,EAAE,SAAM,WAAQ,WAAQ,gBAAa,cAAW,wBAAqB;CAE3E,OACE,kBAAC,OAAD;EAAK,OAAO;GACV,SAAS;GACT,YAAY;GACZ,KAAK;GACL,SAAS;GACT,iBAAiB;GACjB,OAAO;GACP,cAAc;GACd,QAAQ;GACR,UAAU;GACV,QAAQ;EACV;EAXA,UAAA;GAaE,kBAAC,OAAD;IAAK,OAAO;KAAE,SAAS;KAAQ,YAAY;KAAU,KAAK;KAAO,YAAY;KAAK,OAAO;IAAU;IAAnG,UAAA,CACE,kBAAC,GAAD,EAAQ,MAAM,GAAK,CAAA,GACnB,kBAAC,QAAD,EAAA,UAAM,mBAAsB,CAAA,CACzB;;GAEL,kBAAC,OAAD,EAAK,OAAO;IAAE,OAAO;IAAO,QAAQ;IAAQ,iBAAiB;GAAU,EAAI,CAAA;GAG3E,kBAAC,OAAD;IAAK,OAAO;KAAE,SAAS;KAAQ,iBAAiB;KAAW,cAAc;KAAO,SAAS;IAAM;IAA/F,UAAA;KACE,kBAAC,UAAD;MACE,eAAe,EAAU,SAAS;MAClC,OAAO;OACL,SAAS;OAAQ,YAAY;OAAU,KAAK;OAC5C,SAAS;OAAY,cAAc;OAAO,QAAQ;OAClD,iBAAiB,MAAS,YAAY,YAAY;OAClD,OAAO,MAAS,YAAY,YAAY;OACxC,QAAQ;OAAW,UAAU;OAAQ,YAAY;MACnD;MACA,OAAM;MATR,UAAA,CAWE,kBAAC,GAAD,EAAQ,MAAM,GAAK,CAAA,GACnB,kBAAC,QAAD,EAAA,UAAM,eAAkB,CAAA,CAClB;;KAER,kBAAC,UAAD;MACE,eAAe,EAAU,cAAc;MACvC,OAAO;OACL,SAAS;OAAQ,YAAY;OAAU,KAAK;OAC5C,SAAS;OAAY,cAAc;OAAO,QAAQ;OAClD,iBAAiB,MAAS,iBAAiB,YAAY;OACvD,OAAO,MAAS,iBAAiB,YAAY;OAC7C,QAAQ;OAAW,UAAU;OAAQ,YAAY;MACnD;MACA,OAAM;MATR,UAAA,CAWE,kBAAC,GAAD,EAAS,MAAM,GAAK,CAAA,GACpB,kBAAC,QAAD,EAAA,UAAM,eAAkB,CAAA,CAClB;;KAER,kBAAC,UAAD;MACE,eAAe,EAAU,UAAU;MACnC,OAAO;OACL,SAAS;OAAQ,YAAY;OAAU,KAAK;OAC5C,SAAS;OAAY,cAAc;OAAO,QAAQ;OAClD,iBAAiB,MAAS,aAAa,YAAY;OACnD,OAAO,MAAS,aAAa,YAAY;OACzC,QAAQ;OAAW,UAAU;OAAQ,YAAY;MACnD;MACA,OAAM;MATR,UAAA,CAWE,kBAAC,IAAD,EAAU,MAAM,GAAK,CAAA,GACrB,kBAAC,QAAD,EAAA,UAAM,YAAe,CAAA,CACf;;IACL;;GAGJ,MAAS,aACR,kBAAA,IAAA,EAAA,UAAA;IACE,kBAAC,OAAD,EAAK,OAAO;KAAE,OAAO;KAAO,QAAQ;KAAQ,iBAAiB;IAAU,EAAI,CAAA;IAG3E,kBAAC,OAAD;KAAK,OAAO;MAAE,SAAS;MAAQ,YAAY;MAAU,KAAK;KAAM;KAAhE,UAAA,CACE,kBAAC,OAAD;MAAK,OAAO;OAAE,SAAS;OAAQ,YAAY;OAAU,KAAK;MAAM;MAAhE,UAAA,CACE,kBAAC,QAAD;OAAM,OAAO;QAAE,UAAU;QAAQ,OAAO;OAAU;OAAG,UAAA;MAAY,CAAA,GACjE,kBAAC,SAAD;OACE,MAAK;OACL,OAAO;OACP,WAAW,MAAM,EAAY,EAAE,OAAO,OAAO,CAAM;OACnD,OAAO;QAAE,OAAO;QAAQ,QAAQ;QAAQ,QAAQ;QAAQ,cAAc;QAAO,QAAQ;QAAW,iBAAiB;OAAc;OAC/H,OAAM;MACP,CAAA,CACE;KACL,CAAA,GAAA,kBAAC,OAAD;MAAK,OAAO;OAAE,SAAS;OAAQ,YAAY;OAAU,KAAK;MAAM;MAAhE,UAAA,CACE,kBAAC,QAAD;OAAM,OAAO;QAAE,UAAU;QAAQ,OAAO;OAAU;OAAG,UAAA;MAAY,CAAA,GACjE,kBAAC,SAAD;OACE,MAAK;OACL,OAAO;OACP,WAAW,MAAM,EAAY,GAAQ,EAAE,OAAO,KAAK;OACnD,OAAO;QAAE,OAAO;QAAQ,QAAQ;QAAQ,QAAQ;QAAQ,cAAc;QAAO,QAAQ;QAAW,iBAAiB;OAAc;OAC/H,OAAM;MACP,CAAA,CACE;KACF,CAAA,CAAA;;IAEL,kBAAC,UAAD;KACE,SAAS;KACT,OAAO;MACL,SAAS;MAAQ,YAAY;MAAU,KAAK;MAC5C,SAAS;MAAW,cAAc;MAAO,QAAQ;MACjD,iBAAiB,IAAc,YAAY;MAC3C,OAAO;MAAW,QAAQ;MAAW,UAAU;KACjD;KACA,OAAM;KARR,UAAA,CAUE,kBAAC,GAAD,EAAmB,MAAM,GAAK,CAAA,GAC9B,kBAAC,QAAD,EAAA,UAAM,iBAAoB,CAAA,CACpB;;GACR,EAAA,CAAA;GAIH,EAAU,SAAS,KAClB,kBAAA,IAAA,EAAA,UAAA,CACE,kBAAC,OAAD,EAAK,OAAO;IAAE,OAAO;IAAO,QAAQ;IAAQ,iBAAiB;GAAU,EAAI,CAAA,GAC3E,kBAAC,OAAD;IAAK,OAAO;KAAE,SAAS;KAAQ,YAAY;KAAU,KAAK;IAAM;IAAhE,UAAA;KACE,kBAAC,UAAD;MACE,SAAS;MACT,OAAO;OAAE,SAAS;OAAW,cAAc;OAAO,QAAQ;OAAQ,iBAAiB;OAAW,OAAO;OAAW,QAAQ;MAAU;MAClI,OAAM;MAEN,UAAA,kBAAC,GAAD,EAAa,MAAM,GAAK,CAAA;KAClB,CAAA;KACR,kBAAC,QAAD;MAAM,OAAO;OAAE,UAAU;OAAQ,OAAO;OAAW,UAAU;OAAQ,WAAW;MAAS;MAAzF,UAAA;OACG,IAAmB;OAAE;OAAK,EAAU;OAAO;MACxC;;KACN,kBAAC,UAAD;MACE,SAAS;MACT,OAAO;OAAE,SAAS;OAAW,cAAc;OAAO,QAAQ;OAAQ,iBAAiB;OAAW,OAAO;OAAW,QAAQ;MAAU;MAClI,OAAM;MAEN,UAAA,kBAAC,GAAD,EAAc,MAAM,GAAK,CAAA;KACnB,CAAA;IACL;GACL,CAAA,CAAA,EAAA,CAAA;GAGJ,kBAAC,OAAD,EAAK,OAAO,EAAE,MAAM,EAAE,EAAI,CAAA;GAG1B,kBAAC,UAAD;IACE,SAAS;IACT,OAAO;KACL,SAAS;KAAQ,YAAY;KAAU,KAAK;KAC5C,SAAS;KAAY,cAAc;KAAO,QAAQ;KAClD,iBAAiB;KAAW,OAAO;KACnC,QAAQ;KAAW,UAAU;KAAQ,YAAY;IACnD;IACA,OAAM;IARR,UAAA,CAUE,kBAAC,GAAD,EAAG,MAAM,GAAK,CAAA,GACd,kBAAC,QAAD,EAAA,UAAM,eAAkB,CAAA,CAClB;;EACL;;AAET;;;ACzKA,SAAwB,GAAmB,EACzC,WACA,cACA,cACA,qBACA,iBACA,mBAC0B;CAG1B,OAFK,IAGH,kBAAC,OAAD;EAAK,OAAO;GACV,OAAO;GACP,QAAQ;GACR,iBAAiB;GACjB,YAAY;GACZ,SAAS;GACT,eAAe;GACf,YAAY;GACZ,QAAQ;EACV;EATA,UAAA,CAWE,kBAAC,OAAD;GAAK,OAAO;IACV,SAAS;IACT,cAAc;IACd,SAAS;IACT,YAAY;IACZ,gBAAgB;IAChB,iBAAiB;GACnB;GAPA,UAAA,CAQE,kBAAC,OAAD;IAAK,OAAO;KAAE,SAAS;KAAQ,YAAY;KAAU,KAAK;KAAO,YAAY;KAAK,UAAU;KAAQ,OAAO;IAAU;IAArH,UAAA,CACE,kBAAC,GAAD;KAAQ,MAAM;KAAI,OAAM;IAAW,CAAA,GACnC,kBAAC,QAAD,EAAA,UAAM,kBAAqB,CAAA,CACxB;GACL,CAAA,GAAA,kBAAC,QAAD;IAAM,OAAO;KACX,UAAU;KAAQ,SAAS;KAAW,cAAc;KACpD,iBAAiB;KAAW,OAAO;KAAW,YAAY;IAC5D;IAHA,UAAA,CAIG,EAAU,QAAO,cACd;GACH,CAAA,CAAA;EAGL,CAAA,GAAA,kBAAC,OAAD;GAAK,OAAO;IAAE,MAAM;IAAG,WAAW;IAAQ,SAAS;GAAO;GAA1D,UAAA;IACG,EAAU,SAAS,KAClB,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,OAAD;KAAK,OAAO;MAAE,UAAU;MAAQ,YAAY;MAAK,OAAO;MAAW,cAAc;MAAO,SAAS;MAAQ,YAAY;MAAU,KAAK;KAAM;KAA1I,UAAA,CACE,kBAAC,GAAD,EAAQ,MAAM,GAAK,CAAA,GACnB,kBAAC,QAAD,EAAA,UAAA;MAAM;MAAsB,EAAU;MAAO;KAAO,EAAA,CAAA,CACjD;IAEJ,CAAA,GAAA,EAAU,KAAK,GAAM,MAAQ;KAC5B,IAAM,IAAa,MAAQ,GACrB,IAAQ,EAAK,SAAS,YACtB,IAAQ,EAAK,SAAS,YAExB,IAAa,IAAQ,YAAY,IAAQ,YAAY,WACrD,IAAU,IAAQ,YAAY,IAAQ,YAAY,WAClD,IAAa,IAAQ,YAAY,IAAQ,UAAU;KAEvD,OACE,kBAAC,OAAD;MAEE,eAAe;OAEb,AADA,EAAa,GAAK,CAAI,GAClB,EAAK,aAAW,EAAa,EAAK,SAAS;MACjD;MACA,OAAO;OACL,SAAS;OACT,cAAc;OACd,iBAAiB,IAAa,YAAY;OAC1C,QAAQ,IAAa,sBAAsB;OAC3C,YAAY,IAAa,sBAAsB,aAAa;OAC5D,cAAc;OACd,QAAQ;OACR,UAAU;OACV,WAAW,IAAa,sCAAsC;OAC9D,YAAY;MACd;MAjBF,UAAA,CAmBE,kBAAC,OAAD;OAAK,OAAO;QAAE,SAAS;QAAQ,YAAY;QAAU,gBAAgB;QAAiB,cAAc;OAAM;OAA1G,UAAA,CACE,kBAAC,OAAD;QAAK,OAAO;SAAE,SAAS;SAAQ,YAAY;SAAU,KAAK;QAAM;QAAhE,UAAA;SACG,KAAS,kBAAC,IAAD;UAAa,MAAM;UAAI,OAAM;SAAW,CAAA;SACjD,KAAS,kBAAC,IAAD;UAAY,MAAM;UAAI,OAAM;SAAW,CAAA;SAChD,CAAC,KAAS,CAAC,KAAS,kBAAC,GAAD;UAAa,MAAM;UAAI,OAAM;SAAW,CAAA;SAC7D,kBAAC,QAAD;UAAM,OAAO;WACX,UAAU;WACV,YAAY;WACZ,eAAe;WACf,SAAS;WACT,cAAc;WACd,iBAAiB;WACjB,OAAO;UACT;UACG,UAAA;SACG,CAAA;QACH;OACL,CAAA,GAAA,kBAAC,QAAD;QAAM,OAAO;SAAE,UAAU;SAAQ,OAAO;SAAW,YAAY;QAAI;QAAnE,UAAA,CAAsE,SAC9D,EAAK,SACP;OACH,CAAA,CAAA;MACL,CAAA,GAAA,kBAAC,OAAD;OAAK,OAAO;QACV,UAAU;QACV,OAAO,IAAa,YAAY;QAChC,YAAY,IAAa,MAAM;QAC/B,YAAY;QACZ,WAAW;OACb;OACG,UAAA,EAAK;MACH,CAAA,CACF;KAhDE,GAAA,EAAK,EAgDP;IAET,CAAC,CACE,EAAA,CAAA;IAGN,EAAU,SAAS,KAAK,EAAU,WAAW,KAC5C,kBAAC,OAAD;KAAK,OAAO,EAAE,cAAc,OAAO;KAAnC,UAAA,CACE,kBAAC,OAAD;MAAK,OAAO;OAAE,UAAU;OAAQ,YAAY;OAAK,OAAO;OAAW,cAAc;OAAO,SAAS;OAAQ,YAAY;OAAU,KAAK;MAAM;MAA1I,UAAA,CACE,kBAAC,IAAD,EAAU,MAAM,GAAK,CAAA,GACrB,kBAAC,QAAD,EAAA,UAAM,mBAAsB,CAAA,CACzB;KAEJ,CAAA,GAAA,EAAU,QAAO,MAAK,EAAE,SAAS,OAAO,CAAC,CAAC,KAAK,GAAK,MACnD,kBAAC,OAAD;MAEE,eAAe,EAAa,EAAI,SAAS;MACzC,OAAO;OACL,SAAS;OACT,cAAc;OACd,iBAAiB,EAAI,SAAS,QAAQ,YAAY;OAClD,QAAQ,aAAa,EAAI,SAAS,QAAQ,YAAY;OACtD,cAAc;OACd,QAAQ;OACR,UAAU;OACV,YAAY;MACd;MAZF,UAAA,CAcE,kBAAC,OAAD;OAAK,OAAO;QAAE,SAAS;QAAQ,gBAAgB;QAAiB,cAAc;QAAO,UAAU;QAAQ,OAAO;QAAW,YAAY;OAAI;OAAzI,UAAA,CACE,kBAAC,QAAD,EAAA,UAAA,CAAM,SAAM,EAAI,SAAgB,EAAA,CAAA,GAChC,kBAAC,QAAD;QAAM,OAAO;SAAE,OAAO,EAAI,SAAS,QAAQ,YAAY;SAAW,eAAe;QAAY;QAC1F,UAAA,EAAI,SAAS,QAAQ,eAAe;OACjC,CAAA,CACH;MACL,CAAA,GAAA,kBAAC,OAAD;OAAK,OAAO;QACV,OAAO,EAAI,SAAS,QAAQ,YAAY;QACxC,gBAAgB,EAAI,SAAS,WAAW,iBAAiB;QACzD,YAAY;QACZ,WAAW;OACb;OACG,UAAA,EAAI,KAAK,SAAS,MAAM,GAAG,EAAI,KAAK,UAAU,GAAG,GAAG,EAAE,OAAO,EAAI;MAC/D,CAAA,CACF;KA3BE,GAAA,aAAa,GA2Bf,CACN,CACE;;IAGN,EAAU,WAAW,KAAK,EAAU,QAAO,MAAK,EAAE,SAAS,OAAO,CAAC,CAAC,WAAW,KAC9E,kBAAC,OAAD;KAAK,OAAO;MAAE,SAAS;MAAa,WAAW;MAAU,OAAO;KAAU;KAA1E,UAAA;MACE,kBAAC,GAAD;OAAc,MAAM;OAAI,OAAM;OAAU,OAAO,EAAE,QAAQ,kBAAkB;MAAI,CAAA;MAC/E,kBAAC,OAAD;OAAK,OAAO;QAAE,YAAY;QAAK,UAAU;QAAQ,OAAO;OAAU;OAAG,UAAA;MAAoB,CAAA;MACzF,kBAAC,OAAD;OAAK,OAAO;QAAE,UAAU;QAAQ,WAAW;OAAM;OAAG,UAAA;MAAgF,CAAA;KACjI;;GAEJ;EACF,CAAA,CAAA;MA7Ja;AA+JtB;;;AC5KA,SAAwB,GAAqB,EAC3C,oBACA,qBACA,mBAC4B;CAC5B,IAAM,CAAC,GAAY,KAAiB,EAAS,EAAK,GAC5C,IAAY,EAAuB,IAAI;CA4B7C,OA1BA,QAAgB;EACd,IAAM,KAAmB,MAAkB;GACzC,IAAI,CAAC,KAAc,CAAC,EAAa,SAAS;GAC1C,IAAM,IAAO,EAAa,QAAQ,sBAAsB,GAClD,IAAY,EAAE,UAAU,EAAK;GAEnC,EADmB,KAAK,IAAI,GAAG,KAAK,IAAI,KAAM,IAAY,EAAK,QAAS,GAAG,CAC1D,CAAU;EAC7B,GAEM,UAAsB;GAC1B,AAAI,KACF,EAAc,EAAK;EAEvB;EAOA,OALI,MACF,OAAO,iBAAiB,aAAa,CAAe,GACpD,OAAO,iBAAiB,WAAW,CAAa,UAGrC;GAEX,AADA,OAAO,oBAAoB,aAAa,CAAe,GACvD,OAAO,oBAAoB,WAAW,CAAa;EACrD;CACF,GAAG;EAAC;EAAY;EAAc;CAAgB,CAAC,GAG7C,kBAAC,OAAD;EACE,KAAK;EACL,OAAO;GACL,UAAU;GACV,KAAK;GACL,QAAQ;GACR,MAAM,GAAG,EAAgB;GACzB,OAAO;GACP,iBAAiB;GACjB,WAAW;GACX,QAAQ;GACR,QAAQ;GACR,WAAW;EACb;EACA,cAAc,MAAM;GAElB,AADA,EAAE,eAAe,GACjB,EAAc,EAAI;EACpB;EAGA,UAAA,kBAAC,OAAD;GAAK,OAAO;IACV,UAAU;IACV,KAAK;IACL,MAAM;IACN,WAAW;IACX,OAAO;IACP,QAAQ;IACR,iBAAiB;IACjB,OAAO;IACP,cAAc;IACd,SAAS;IACT,YAAY;IACZ,gBAAgB;IAChB,WAAW;IACX,QAAQ;GACV;GACE,UAAA,kBAAC,IAAD,EAAc,MAAM,GAAK,CAAA;EACtB,CAAA;CACF,CAAA;AAET;;;AChEA,eAAsB,GAAqB,GAAmD;CAC5F,IAAM,IAAK,EAAK,YAAY;EAAE,OAAO;EAAG,UAAU,EAAK;CAAO,CAAC,GACzD,IAAc,MAAM,EAAK,eAAe,GACxC,IAA0B,CAAC;CAEjC,KAAK,IAAM,KAAQ,EAAY,OAAgB;EAC7C,IAAI,CAAC,EAAK,OAAO,OAAO,EAAK,OAAQ,UAAU;EAC/C,IAAM,IAAM,EAAK;EACjB,IAAI,EAAI,KAAK,CAAC,CAAC,WAAW,GAAG;EAE7B,IAAM,IAAK,EAAK,UAAU,IACpB,IAAK,EAAK,UAAU,IACpB,IAAY,EAAK,SAAS,GAC1B,IAAW,KAAK,MAAM,EAAK,UAAU,MAAM,MAAM,KAAK,EAAK,UAAU,MAAM,MAAM,CAAC,KAAK,IACvF,IAAa,EAAK,UAAU,GAE5B,CAAC,GAAK,KAAO,EAAG,uBAAuB,GAAI,IAAK,CAAU,GAC1D,CAAC,GAAK,KAAO,EAAG,uBAAuB,IAAK,GAAW,CAAE,GAEzD,IAAQ,KAAK,IAAI,GAAK,CAAG,GACzB,IAAQ,KAAK,IAAI,GAAK,CAAG,GACzB,IAAQ,KAAK,IAAI,KAAK,IAAI,IAAM,CAAG,GAAG,CAAC,GACvC,IAAQ,KAAK,IAAI,KAAK,IAAI,IAAM,CAAG,GAAG,CAAC,GAEvC,IAAQ,EAAI,MAAM,OAAO,GAC3B,IAAS,GACP,IAAa,EAAI,UAAU;EAEjC,KAAK,IAAM,KAAK,GAAO;GAErB,IAAM,IAAS,KADG,EAAE,SAAS,IAEvB,IAAK,IAAS,IAAS,IAAc;GAG3C,AAFA,KAAU,EAAE,QAER,EAAE,KAAK,CAAC,CAAC,SAAS,KACpB,EAAW,KAAK;IACd,MAAM,EAAE,KAAK;IACb,GAAG;IACH,GAAG;IACH,OAAO,KAAK,IAAI,GAAQ,CAAC;IACzB,QAAQ;GACV,CAAC;EAEL;CACF;CAEA,OAAO;AACT;AAKA,eAAsB,GACpB,GACA,GACA,GACyB;CACzB,IAAM,CAAC,GAAO,KAAS,MAAM,QAAQ,IAAI,CACvC,EAAQ,QAAQ,CAAS,GACzB,EAAQ,QAAQ,KAAK,IAAI,GAAW,EAAQ,QAAQ,CAAC,CACvD,CAAC,GAEK,CAAC,GAAQ,KAAU,MAAM,QAAQ,IAAI,CACzC,GAAqB,CAAK,GAC1B,GAAqB,CAAK,CAC5B,CAAC,GAEK,IAAW,EAAO,KAAI,MAAK,EAAE,IAAI,GACjC,IAAW,EAAO,KAAI,MAAK,EAAE,IAAI,GAGjC,IAAI,EAAS,QACb,IAAI,EAAS,QACb,IAAM,IAAI,GACV,IAAI,IAAI,WAAW,IAAI,IAAM,CAAC;CACpC,EAAE,KAAK;CACP,IAAM,IAAsB,CAAC;CAE7B,KAAK,IAAI,IAAI,GAAG,KAAK,GAAK,KAAK;EAC7B,EAAM,KAAK,EAAE,MAAM,CAAC;EACpB,KAAK,IAAI,IAAI,CAAC,GAAG,KAAK,GAAG,KAAK,GAAG;GAC/B,IAAI;GACJ,AAGE,IAHE,MAAM,CAAC,KAAM,MAAM,KAAK,EAAE,IAAI,IAAI,KAAO,EAAE,IAAI,IAAI,KACjD,EAAE,IAAI,IAAI,KAEV,EAAE,IAAI,IAAI,KAAO;GAEvB,IAAI,IAAI,IAAI;GACZ,OAAO,IAAI,KAAK,IAAI,KAAK,EAAS,OAAO,EAAS,KAEhD,AADA,KACA;GAGF,IADA,EAAE,IAAI,KAAO,GACT,KAAK,KAAK,KAAK,GACjB;EAEJ;EACA,IAAI,EAAE,IAAI,IAAI,MAAQ,KAAM,EAAE,IAAI,IAAI,MAAQ,IAAI,MAAO,GAAG;CAC9D;CAGA,IAAI,IAAI,GACJ,IAAI,GACF,IAAwB,CAAC,GACzB,IAAwB,CAAC;CAE/B,KAAK,IAAI,IAAI,EAAM,SAAS,GAAG,KAAK,GAAG,KAAK;EAC1C,IAAM,IAAO,EAAM,IACb,IAAI,IAAI,GACV;EACJ,AAGE,IAHE,MAAM,CAAC,KAAM,MAAM,KAAK,EAAK,IAAI,IAAI,KAAO,EAAK,IAAI,IAAI,KACnD,IAAI,IAEJ,IAAI;EAEd,IAAM,IAAQ,EAAK,IAAQ,IACrB,IAAQ,IAAQ;EAEtB,OAAO,IAAI,KAAS,IAAI,IAEtB,AADA,KACA;EAGF,AAAI,IAAI,MACF,MAAM,KACR,EAAY,KAAK,IAAI,CAAC,GACtB,OACS,MAAM,MACf,EAAY,KAAK,IAAI,CAAC,GACtB;CAGN;CAGA,AADA,EAAY,QAAQ,GACpB,EAAY,QAAQ;CAEpB,IAAM,IAAS,GAAoB,EAAY,KAAI,MAAK,EAAO,EAAE,GAAG,GAAW,UAAU,GACnF,IAAS,GAAoB,EAAY,KAAI,MAAK,EAAO,EAAE,GAAG,GAAW,UAAU,GAEnF,IAAsB,CAAC;CAC7B,KAAK,IAAM,KAAK,GACd,EAAQ,KAAK;EACX,IAAI,EAAE;EACN;EACA,MAAM;EACN,aAAa,YAAY,EAAE,KAAK,SAAS,KAAK,EAAE,KAAK,MAAM,GAAG,EAAE,IAAI,QAAQ,EAAE,KAAK;EACnF,GAAG,EAAE;EACL,GAAG,EAAE;EACL,OAAO,EAAE;EACT,QAAQ,EAAE;CACZ,CAAC;CAEH,KAAK,IAAM,KAAK,GACd,EAAQ,KAAK;EACX,IAAI,EAAE;EACN;EACA,MAAM;EACN,aAAa,UAAU,EAAE,KAAK,SAAS,KAAK,EAAE,KAAK,MAAM,GAAG,EAAE,IAAI,QAAQ,EAAE,KAAK;EACjF,GAAG,EAAE;EACL,GAAG,EAAE;EACL,OAAO,EAAE;EACT,QAAQ,EAAE;CACZ,CAAC;CAGH,OAAO;EAAE;EAAQ;EAAQ;CAAQ;AACnC;AAEA,SAAS,GAAoB,GAAoB,GAAmB,GAAmE;CACrI,IAAI,EAAM,WAAW,GAAG,OAAO,CAAC;CAChC,IAAM,IAA2B,CAAC,GAE9B,IAA4B,CAAC,EAAM,EAAE;CAEzC,KAAK,IAAI,IAAI,GAAG,IAAI,EAAM,QAAQ,KAAK;EACrC,IAAM,IAAO,EAAa,EAAa,SAAS,IAC1C,IAAO,EAAM,IAEb,IAAW,KAAK,IAAI,EAAK,IAAI,EAAK,CAAC,IAAI,KAAK,IAAI,EAAK,QAAQ,EAAK,MAAM,IAAI,IAC5E,IAAS,EAAK,KAAK,EAAK,IAAI,EAAK,SAAS;EAEhD,AAAI,KAAY,IACd,EAAa,KAAK,CAAI,KAEtB,EAAM,KAAK,GAAoB,GAAc,GAAW,GAAM,EAAM,SAAS,CAAC,CAAC,GAC/E,IAAe,CAAC,CAAI;CAExB;CAMA,OAJI,EAAa,SAAS,KACxB,EAAM,KAAK,GAAoB,GAAc,GAAW,GAAM,EAAM,SAAS,CAAC,CAAC,GAG1E;AACT;AAEA,SAAS,GAAoB,GAAqB,GAAmB,GAAgD,GAA8B;CACjJ,IAAM,IAAO,KAAK,IAAI,GAAG,EAAO,KAAI,MAAK,EAAE,CAAC,CAAC,GACvC,IAAO,KAAK,IAAI,GAAG,EAAO,KAAI,MAAK,EAAE,CAAC,CAAC,GACvC,IAAO,KAAK,IAAI,GAAG,EAAO,KAAI,MAAK,EAAE,IAAI,EAAE,KAAK,CAAC,GACjD,IAAO,KAAK,IAAI,GAAG,EAAO,KAAI,MAAK,EAAE,IAAI,EAAE,MAAM,CAAC,GAClD,IAAO,EAAO,KAAI,MAAK,EAAE,IAAI,CAAC,CAAC,KAAK,GAAG;CAE7C,OAAO;EACL,IAAI,YAAY,EAAU,GAAG,EAAK,GAAG,EAAI,GAAG,KAAK,MAAM,CAAI,EAAE,GAAG,KAAK,MAAM,CAAI;EAC/E;EACA;EACA;EACA,GAAG,KAAK,IAAI,GAAG,IAAO,CAAC;EACvB,GAAG,KAAK,IAAI,GAAG,IAAO,CAAC;EACvB,OAAO,IAAO,IAAO;EACrB,QAAQ,IAAO,IAAO;CACxB;AACF;AAKA,SAAgB,GAAgB,GAAe,GAAe,GAAsC;CAClG,IAAM,IAAS,EAAM,MAAM,OAAO,GAC5B,IAAS,EAAM,MAAM,OAAO,GAE5B,IAAI,EAAO,QACX,IAAI,EAAO,QACX,IAAM,IAAI,GACV,IAAI,IAAI,WAAW,IAAI,IAAM,CAAC;CACpC,EAAE,KAAK;CAEP,IAAM,IAAsB,CAAC;CAE7B,KAAK,IAAI,IAAI,GAAG,KAAK,GAAK,KAAK;EAC7B,EAAM,KAAK,EAAE,MAAM,CAAC;EACpB,KAAK,IAAI,IAAI,CAAC,GAAG,KAAK,GAAG,KAAK,GAAG;GAC/B,IAAI;GACJ,AAGE,IAHE,MAAM,CAAC,KAAM,MAAM,KAAK,EAAE,IAAI,IAAI,KAAO,EAAE,IAAI,IAAI,KACjD,EAAE,IAAI,IAAI,KAEV,EAAE,IAAI,IAAI,KAAO;GAEvB,IAAI,IAAI,IAAI;GACZ,OAAO,IAAI,KAAK,IAAI,KAAK,EAAO,OAAO,EAAO,KAE5C,AADA,KACA;GAGF,IADA,EAAE,IAAI,KAAO,GACT,KAAK,KAAK,KAAK,GACjB,OAAO,GAAgB,GAAO,GAAQ,GAAQ,CAAS;EAE3D;CACF;CAEA,OAAO,CACL;EAAE,MAAM;EAAU,MAAM;EAAO;CAAU,GACzC;EAAE,MAAM;EAAO,MAAM;EAAO;CAAU,CACxC;AACF;AAEA,SAAS,GAAgB,GAAqB,GAAkB,GAAkB,GAAsC;CACtH,IAAI,IAAI,EAAO,QACX,IAAI,EAAO,QACT,IAAM,EAAO,SAAS,EAAO,QAC7B,IAAkE,CAAC;CAEzE,KAAK,IAAI,IAAI,EAAM,SAAS,GAAG,KAAK,GAAG,KAAK;EAC1C,IAAM,IAAI,EAAM,IACV,IAAI,IAAI,GAEV;EACJ,AAGE,IAHE,MAAM,CAAC,KAAM,MAAM,KAAK,EAAE,IAAI,IAAI,KAAO,EAAE,IAAI,IAAI,KAC7C,IAAI,IAEJ,IAAI;EAGd,IAAM,IAAQ,EAAE,IAAQ,IAClB,IAAQ,IAAQ;EAEtB,OAAO,IAAI,KAAS,IAAI,IAGtB,AAFA,EAAU,KAAK;GAAE,MAAM;GAAS,MAAM,EAAO,IAAI;EAAG,CAAC,GACrD,KACA;EAGF,AAAI,IAAI,MACF,MAAM,KACR,EAAU,KAAK;GAAE,MAAM;GAAO,MAAM,EAAO,IAAI;EAAG,CAAC,GACnD,OACS,MAAM,MACf,EAAU,KAAK;GAAE,MAAM;GAAU,MAAM,EAAO,IAAI;EAAG,CAAC,GACtD;CAGN;CAEA,EAAU,QAAQ;CAElB,IAAM,IAAkC,CAAC;CACzC,KAAK,IAAM,KAAQ,GACjB,AAAI,EAAa,SAAS,KAAK,EAAa,EAAa,SAAS,EAAE,CAAC,SAAS,EAAK,OACjF,EAAa,EAAa,SAAS,EAAE,CAAC,QAAQ,EAAK,OAEnD,EAAa,KAAK;EAAE,GAAG;EAAM;CAAU,CAAC;CAI5C,OAAO;AACT;AAKA,SAAgB,GAAW,GAA+B,GAAe,GAAgB,GAAkB,IAAkB,KAAM;CAMjI,AALA,EAAI,KAAK,GACT,EAAI,2BAA2B,eAC/B,EAAI,YAAY,GAChB,EAAI,cAAc,GAClB,EAAI,SAAS,GAAG,GAAG,GAAO,CAAM,GAChC,EAAI,QAAQ;AACd;AAKA,SAAgB,GACd,GACA,GACA,GACA,GACY;CACZ,IAAM,IAAQ,KAAK,IAAI,EAAQ,OAAO,EAAQ,KAAK,GAC7C,IAAS,KAAK,IAAI,EAAQ,QAAQ,EAAQ,MAAM;CACtD,IAAI,MAAU,KAAK,MAAW,GAAG,OAAO,CAAC;CAEzC,IAAM,IAAO,EAAQ,WAAW,IAAI,GAC9B,IAAO,EAAQ,WAAW,IAAI;CACpC,IAAI,CAAC,KAAQ,CAAC,GAAM,OAAO,CAAC;CAE5B,IAAM,IAAW,EAAK,aAAa,GAAG,GAAG,GAAO,CAAM,GAChD,IAAW,EAAK,aAAa,GAAG,GAAG,GAAO,CAAM,GAChD,IAAQ,EAAS,MACjB,IAAQ,EAAS,MAEjB,IAAwB,CAAC;CAI/B,KAAK,IAAI,IAAK,GAAG,IAAK,GAAQ,KAAM,IAClC,KAAK,IAAI,IAAK,GAAG,IAAK,GAAO,KAAM,IAAW;EAC5C,IAAI,IAAa,GACX,IAAQ,KAAK,IAAI,IAAW,IAAQ,CAAE,GACtC,IAAQ,KAAK,IAAI,IAAW,IAAS,CAAE;EAE7C,KAAK,IAAI,IAAI,GAAI,IAAI,IAAK,GAAO,KAAK,GACpC,KAAK,IAAI,IAAI,GAAI,IAAI,IAAK,GAAO,KAAK,GAAG;GACvC,IAAM,KAAO,IAAI,IAAQ,KAAK,GACxB,IAAK,KAAK,IAAI,EAAM,KAAO,EAAM,EAAI,GACrC,IAAK,KAAK,IAAI,EAAM,IAAM,KAAK,EAAM,IAAM,EAAE,GAC7C,IAAK,KAAK,IAAI,EAAM,IAAM,KAAK,EAAM,IAAM,EAAE;GAEnD,AAAI,IAAK,IAAK,IAAK,MACjB;EAEJ;EAGF,AAAI,IAAa,KACf,EAAU,KAAK;GACb,IAAI,QAAQ,EAAU,GAAG,EAAG,GAAG;GAC/B;GACA,MAAM;GACN,aAAa,sCAAsC,EAAU,IAAI,KAAK,MAAM,IAAK,CAAK,EAAE,MAAM,KAAK,MAAM,IAAK,CAAK,EAAE;GACrH,GAAG,IAAK;GACR,GAAG,IAAK;GACR,OAAO,IAAQ;GACf,QAAQ,IAAQ;EAClB,CAAC;CAEL;CAGF,OAAO;AACT;;;AC7TA,SAAwB,GAAe,EACrC,oBAAiB,qBAAkB,cAAW,sBAAmB,eAAY,eAAY,GAAG,qBAAkB,IAAO,WAAQ,cAAW,IACxI,eAAY,oBAAiB,UAAO,cAAU,gBAAY,mBAAe,yBAAqB,wBAAoB,yBAClH,sBAAkB,gBAAa,yBAAqB,oBAAgB,iBACpE,mBAAgB,eAAY,aAAU,gBAAa,eAAW,mBAAe,mBAAmB,IAAoB,iBAAa,UAAM,yBAAqB,gBAC5J,uCAAmC,IACnC,0BAAsB,IACtB,kBAAc,UACd,2BAAuB,MACD;CACtB,IAAM,IAAe,EAAuB,IAAI,GAC1C,IAAM,GAAa,GACnB,CAAC,GAAQ,MAAa,EAA2C,IAAI,GACrE,CAAC,IAAW,MAAgB,EAAuB,IAAI,GACvD,CAAC,GAAS,KAAc,EAAS,CAAC,GAClC,CAAC,IAAkB,MAAuB,EAAsB,CAAC,CAAC,GAClE,EAAE,mBAAe,GAAa,GAG9B,CAAC,IAAS,KAAc,EAA2C,IAAI,GACvE,CAAC,GAAc,KAAmB,EAAuB;EAC7D,UAAU;EACV,MAAM;EACN,QAAQ;EACR,QAAQ;EACR,UAAU;EACV,UAAU;EACV,WAAW;EACX,aAAa;EACb,iBAAiB;EACjB,WAAW,CAAC;EACZ,kBAAkB;CACpB,CAAC,GACK,CAAC,IAAW,MAAgB,EAA4B,CAAC,CAAC,GAC1D,CAAC,IAAmB,MAAwB,EAAS,EAAK,GAG1D,KAAe,EAAO;EAAE;EAAoB;EAAqB;EAAkB;EAAa;EAAqB;EAAgB;CAAa,CAAC;CACzJ,GAAa,UAAU;EAAE;EAAoB;EAAqB;EAAkB;EAAa;EAAqB;EAAgB;CAAa;CACnJ,IAAM,KAAY,EAAO,CAAM;CAC/B,GAAU,UAAU;CAEpB,IAAM,KAAW,EAAY,OAAO,MAAiD;EACnF,IAAI;GAEF,AADA,GAAuB,GACnB,GAAU,WAAS,GAAmB,GAAU,OAAO;GAC3D,IAAM,IAAc,OAAO,KAAc,WAAW,EAAE,KAAK,EAAU,IAAI,EAAE,MAAM,EAAU;GAE3F,AADI,MAAiB,EAAO,kBAAkB,KAC9C,OAAO,OAAO,GAAQ,GAAkB,CAAC;GAEzC,IAAM,IAAa,MADC,GAAS,YAAY,CAChB,CAAA,CAAY;GAErC,AADA,GAAU,CAAU,GACpB,GAAa,QAAQ,mBAAmB,GAAY,OAAO,KAAc,WAAW,IAAY,eAAe;EACjH,SAAS,GAAU;GACjB,QAAQ,MAAM,yCAAyC,CAAG;EAC5D;CACF,GAAG,CAAC,CAAe,CAAC,GAEd,KAAiB,EAAY,OAAO,MAAiD;EACzF,IAAI;GAEF,AADA,GAAuB,GACnB,GAAU,WAAS,GAAmB,GAAU,OAAO;GAC3D,IAAM,IAAc,OAAO,KAAc,WAAW,EAAE,KAAK,EAAU,IAAI,EAAE,MAAM,EAAU;GAE3F,AADI,MAAiB,EAAO,kBAAkB,KAC9C,OAAO,OAAO,GAAQ,GAAkB,CAAC;GAEzC,IAAM,IAAa,MADC,GAAS,YAAY,CAChB,CAAA,CAAY;GASrC,AARA,EAAW,CAAU,GACrB,GAAgB,OAAS;IACvB,GAAG;IACH,UAAU;IACV,WAAW,CACT;KAAE,IAAI;KAAU,WAAW;KAAG,MAAM;KAAgB,aAAa;IAA8B,CACjG;GACF,EAAE,GACF,GAAqB,EAAI;EAC3B,SAAS,GAAU;GACjB,QAAQ,MAAM,yCAAyC,CAAG;EAC5D;CACF,GAAG,CAAC,CAAe,CAAC;CAiDpB,AA/CA,QAAgB;EACd,IAAI,EAAa,YAAY,KAAU,IAAS;GAC9C,IAAI,IAAY;GAwChB,QADA,YAtCoC;IAClC,IAAI;KACF,IAAM,IAAa,KAAK,IAAI,EAAO,UAAU,GAAQ,QAAQ,GACzD,IAAyB,CAAC,GACxB,IAA0C,CAAC,GAC3C,IAA0C,CAAC;KAEjD,KAAK,IAAI,IAAI,GAAG,KAAK,GAAY,KAAK;MACpC,IAAM,EAAE,WAAQ,WAAQ,eAAY,MAAM,GAAqB,GAAQ,IAAS,CAAC;MACjF,IAAI,GAAW;MAGf,AAFA,EAAK,KAAK,GACV,EAAK,KAAK,GACV,IAAa,EAAW,OAAO,CAAO;KACxC;KAEA,AAAK,KACH,GAAgB,OAAS;MACvB,GAAG;MACH,WAAW;MACX,YAAY;MACZ,YAAY;KACd,EAAE;KAGJ,IAAM,IAAK,MAAM,EAAO,QAAQ,CAAO,GACjC,IAAK,MAAM,GAAQ,QAAQ,KAAK,IAAI,GAAS,GAAQ,QAAQ,CAAC,GAC9D,IAAe,MAAM,EAAG,eAAe,GACvC,IAAe,MAAM,EAAG,eAAe,GAKvC,IAAQ,GAHD,EAAa,MAAM,KAAK,MAAW,EAAE,GAAG,CAAC,CAAC,KAAK,GAG9B,GAFjB,EAAa,MAAM,KAAK,MAAW,EAAE,GAAG,CAAC,CAAC,KAAK,GAExB,GAAM,CAAO;KACjD,AAAK,KAAW,GAAa,CAAK;IACpC,SAAS,GAAG;KACV,QAAQ,MAAM,mCAAmC,CAAC;IACpD;GACF,EACA,CAAgB,SACH;IAAE,IAAY;GAAM;EACnC;CACF,GAAG;EAAC,EAAa;EAAU;EAAQ;EAAS;CAAO,CAAC,GAGpD,QAAgB;EACd,IAAM,KAAsB,MAAc;GACxC,IAAM,EAAE,SAAM,SAAM,eAAY,KAAQ,CAAC;GAezC,AAdI,KACF,GAAgB,OAAS;IACvB,GAAG;IACH,MAAM,EAAQ,QAAQ,EAAK;IAC3B,QAAQ,EAAQ,UAAU,EAAK;IAC/B,QAAQ,EAAQ,UAAU,EAAK;IAC/B,UAAU,EAAQ,YAAY,EAAK;IACnC,UAAU,EAAQ,YAAY,EAAK;IACnC,WAAW,EAAQ,aAAa,EAAK;GACvC,EAAE,GAEA,KACF,GAAS,CAAI,GAEX,KACF,GAAe,CAAI;EAEvB,GAEM,UAA0B;GAG9B,AAFA,GAAgB,OAAS;IAAE,GAAG;IAAM,UAAU;GAAM,EAAE,GACtD,EAAW,IAAI,GACf,GAAa,CAAC,CAAC;EACjB,GAEM,KAAwB,MAAiB;GAC7C,AAAI,KAAM,GAAgB,OAAS;IAAE,GAAG;IAAY;GAAY,EAAE;EACpE,GAEM,KAA0B,GAAgB,MAAmB;GACjE,AAAI,KAAU,KAAQ,GAAgB,OAAS;IAAE,GAAG;IAAM;IAAQ;GAAO,EAAE;EAC7E,GAEM,IAAW,EAAI,GAAG,wBAAwB,CAAkB,GAC5D,IAAU,EAAI,GAAG,uBAAuB,CAAiB,GACzD,IAAU,EAAI,GAAqB,4BAA4B,MAAM,KAAK,EAAqB,EAAE,IAAI,CAAC,GACtG,IAAY,EAAI,GAAuC,8BAA8B,MAAM,KAAK,EAAuB,EAAE,QAAQ,EAAE,MAAM,CAAC,GAE1I,KAAe,MAAW,EAAmB,EAAE,MAAM,GACrD,UAAmB,EAAkB,GACrC,KAAc,MAAW,EAAqB,EAAE,QAAQ,IAAI,GAC5D,KAAgB,MAAW,EAAuB,EAAE,QAAQ,QAAQ,EAAE,QAAQ,MAAM;EAO1F,OALA,OAAO,iBAAiB,wBAAwB,CAAW,GAC3D,OAAO,iBAAiB,uBAAuB,CAAU,GACzD,OAAO,iBAAiB,2BAA2B,CAAU,GAC7D,OAAO,iBAAiB,6BAA6B,CAAY,SAEpD;GAKX,AAJA,EAAS,GAAG,EAAQ,GAAG,EAAQ,GAAG,EAAU,GAC5C,OAAO,oBAAoB,wBAAwB,CAAW,GAC9D,OAAO,oBAAoB,uBAAuB,CAAU,GAC5D,OAAO,oBAAoB,2BAA2B,CAAU,GAChE,OAAO,oBAAoB,6BAA6B,CAAY;EACtE;CACF,GAAG;EAAC;EAAK;EAAU;CAAc,CAAC;CAMlC,IAAM,CAAC,IAAoB,MAAyB,EAA8B,IAAI,GAIhF,CAAC,IAAU,MAAe,EAAmD,CAAC,CAAC,GAC/E,IAAe,GAAS,MAAM,IAC9B,IAAU,GACb,MAAc,GAAS,IAAI,MAAM,GAElC;EAAC;EAAU,EAAa;EAAO,EAAa;CAAM,CACpD,GACM,CAAC,IAAW,MAAgB,EAAS;EAAE,KAAK;EAAG,MAAM;CAAE,CAAC,GACxD,CAAC,IAAW,MAAgB,EAAS,EAAK,GAC1C,KAAc,EAA+E,IAAI,GAKjG,KAAO,QAAc;EACzB,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,KAAY,QACT,GAAiB,IAAM,GAAS,GAAO,EAAG,GAChD;EAAC;EAAM;EAAO;CAAO,CAAC,GAEnB,KAAU,EAAO,EAAI;CAC3B,GAAQ,UAAU;CAClB,IAAM,KAAW,EAAO,CAAK;CAC7B,GAAS,UAAU;CACnB,IAAM,KAAe,EAAO,EAAS;CACrC,GAAa,UAAU;CACvB,IAAM,KAAoB,EAAO,CAAc;CAC/C,GAAkB,UAAU;CAC5B,IAAM,KAAgB,EAAO,CAAC,GAExB,KAAiB,GAAa,MAAc,GAAK,WAAU,MAAO,EAAI,SAAS,CAAC,CAAC,GAAG,CAAC,EAAI,CAAC,GAE1F,KAAmB,GAAa,MAAc;EAClD,IAAM,IAAO,GAAU;EACvB,IAAI,EAAK,WAAW,GAAG,OAAO;EAC9B,IAAI,IAAK,GAAG,IAAK,EAAK,SAAS;EAC/B,OAAO,IAAK,IAAI;GACd,IAAM,IAAO,IAAK,IAAK,KAAM;GAC7B,AAAI,EAAK,MAAQ,IAAG,IAAK,IAAU,IAAK,IAAM;EAChD;EACA,OAAO;CACT,GAAG,CAAC,EAAS,CAAC,GAER,KAAe,GAAa,GAAW,IAAgC,CAAC,MAAM;EAClF,IAAM,IAAc,IAAS,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,EAAO,QAAQ,CAAC,IAAI,KAAK,IAAI,GAAG,CAAC;EACtF,EAAW,CAAW;EACtB,IAAM,IAAI,GAAe,CAAW;EACpC,AAAI,KAAK,KAAK,EAAa,YACrB,EAAQ,SACV,EAAa,QAAQ,SAAS;GAAE,KAAK,GAAU,KAAK;GAAI,UAAU;EAAS,CAAC,IAE5E,EAAa,QAAQ,YAAY,GAAU,KAAK;CAGtD,GAAG;EAAC;EAAQ;EAAgB;CAAS,CAAC;CAEtC,QAAgB;EACd,IAAM,KAAkB,MAAgD;GACtE,AAAI,GAAQ,QACV,GAAa,EAAO,MAAM,EAAE,QAAQ,EAAO,UAAU,GAAK,CAAC;EAE/D,GACM,IAAc,EAAI,GAAuC,sBAAsB,MAAM,EAAe,CAAC,CAAC,GACtG,KAAkB,MAAW,EAAe,EAAE,MAAM;EAG1D,OAFA,OAAO,iBAAiB,qBAAqB,CAAc,SAE9C;GAEX,AADA,EAAY,GACZ,OAAO,oBAAoB,qBAAqB,CAAc;EAChE;CACF,GAAG,CAAC,GAAK,EAAY,CAAC;CAEtB,IAAM,MAA2B,MAAyB;EAGxD,AAFA,EAAW,EAAO,SAAS,GAC3B,GAAsB,CAAM,GAC5B,GAAa,EAAO,SAAS;CAC/B,GAEM,KAAmB,GAAa,GAAa,MAAoB;EACrE,IAAM,IAAW,KAAQ,EAAa,UAAU;EAGhD,IAFA,GAAgB,OAAS;GAAE,GAAG;GAAM,kBAAkB;EAAI,EAAE,GAExD,CAAC,GAAU;EAEf,AAAI,EAAS,aAAa,EAAS,cAAc,KAC/C,EAAW,EAAS,SAAS;EAG/B,IAAM,KAAW,EAAS,KAAK,KAAK,GAC9B,KAAW,EAAS,KAAK,KAAK;EAEpC,IAAI,EAAa,SAAS;GACxB,IAAM,IAAI,EAAS,aAAa,GAC1B,IAAO,GAAe,CAAC,GACvB,IAAS,MAAmB,gBAAgB,KAAQ,IAAK,GAAU,KAAK,MAAS,IAAK,GACtF,IAAa,EAAa,QAAQ,gBAAgB,KAClD,IAAY,EAAa,QAAQ,eAAe,KAEhD,IAAY,KAAK,IAAI,GAAG,IAAS,IAAU,IAAa,CAAC,GACzD,IAAY,KAAK,IAAI,GAAG,IAAU,IAAY,CAAC;GAErD,EAAa,QAAQ,SAAS;IAC5B,KAAK;IACL,MAAM;IACN,UAAU;GACZ,CAAC;EACH;CACF,GAAG;EAAC,EAAa;EAAW;EAAS;EAAO;EAAgB;EAAgB,GAAU;CAAI,CAAC,GAGrF,IAAc,EAAqB,EAAkB,WAAW,EAAkB,aAAa,EAAkB,WAAW,GAC5H,CAAC,GAAY,KAAiB,EAAmB,EAAW;CAoBlE,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,EAAW;CAE7B,GAAG,CAAC,GAAW,EAAW,CAAC,GAE3B,QAAgB;EACd,EAAI,KAAK,uBAAuB,EAAE,MAAM,EAAW,CAAC;CACtD,GAAG,CAAC,GAAY,CAAG,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,KAA2B,EAAwB,IAAI,GAC9E,CAAC,IAAgB,MAAqB,EAA+C,IAAI,GACzF,CAAC,IAAiB,MAAsB,EAAS,EAAK,GACtD,KAAqB,EAAO,EAAK,GACjC,KAAyB,EAA0B,IAAI;CAK7D,AAFA,GAAgC,oBAAoB,MAAM,EAAc,GAAG,QAAQ,IAAI,CAAC,GAExF,QAAgB;EACd,IAAM,UAAwB;GAC5B,IAAM,IAAO,OAAO,SAAW,MAAc,OAAO,aAAa,CAAC,EAAE,SAAS,KAAK,KAAK;GACvF,EAAI,KAAK,wBAAwB,EAAE,QAAK,CAAC;EAC3C;EAEA,OADA,SAAS,iBAAiB,mBAAmB,CAAe,SAC/C,SAAS,oBAAoB,mBAAmB,CAAe;CAC9E,GAAG,CAAC,CAAG,CAAC;CAER,IAAM,KAAe,EAA+C;EAAE,IAAI;EAAM,IAAI;CAAK,CAAC,GACpF,KAAe,EAAO,CAAK,GAC3B,KAAyB,EAAO,EAAK,GACrC,KAAoB,EAAO,EAAK;CAgDtC,AA9CA,QAAgB;EACd,GAAkB,UAAU;CAC9B,GAAG,CAAC,CAAM,CAAC,GAGX,QAAgB;EACd,IAAI,GAAa,YAAY,GAAO;GAClC,IAAM,IAAI,GAAa,SACjB,IAAW;GACjB,GAAa,UAAU;GAEvB,IAAM,IAAY,EAAa;GAC/B,IAAI,CAAC,GAAW;GAEhB,IAAM,IAAiB,GAAuB,WAAW,CAAC,GAAkB,WAAW,GAAqB,YAAY;GAExH,AADA,GAAkB,UAAU,IAC5B,GAAuB,UAAU;GAEjC,IAAM,IAAS,GAA4B;IACzC,WAAW;IACX;IACA,gBAAgB,EAAU;IAC1B,iBAAiB,EAAU;IAC3B,mBAAmB,EAAU;IAC7B,kBAAkB,EAAU;IAC5B,eAAe,EAAQ,CAAO,CAAC,CAAC;IAChC,YAAY,GAAa;IACzB;GACF,CAAC;GAID,IAFA,GAAa,UAAU;IAAE,IAAI;IAAM,IAAI;GAAK,GAExC,KAAkB,IAAU,KAAK,MAAmB,cAAc;IACpE,IAAM,IAAO,GAAe,CAAO;IAInC,AAHI,KAAQ,MACV,EAAU,YAAY,GAAU,KAAK,MAAS,IAEhD,EAAU,aAAa;GACzB,OAEE,AADA,EAAU,aAAa,EAAO,YAC9B,EAAU,YAAY,EAAO;EAEjC;CAEF,GAAG,CAAC,CAAK,CAAC,GAEV,QAAgB;EACd,IAAM,IAAY,EAAa;EAC/B,IAAI,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,IAAS,MAAK;KACZ,IAAM,IAAe,GAAW,IAAI,CAAU;KAO9C,OANI,MAAiB,MACnB,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,EAAQ,CAAC;CAGb,IAAM,IAAoB,GAAa,MAA0B;EAC/D,EAAkB,OAAO,CAAO;CAClC,GAAG,CAAC,CAAiB,CAAC;CAEtB,GAAqC,0CAA0C,MAAM;EACnF,AAAI,GAAG,WAAS,EAAkB,CAAC,GAAG,GAAa,EAAE,OAAO,CAAC;CAC/D,CAAC;CAED,IAAM,KAAa,QAAkB;EAAE,EAAkB,KAAK;CAAG,GAAG,CAAC,CAAiB,CAAC,GACjF,KAAa,QAAkB;EAAE,EAAkB,KAAK;CAAG,GAAG,CAAC,CAAiB,CAAC,GAGjF,CAAC,IAAiB,MAAsB,EAA4B,IAAI,GACxE,CAAC,IAAe,MAAoB,EAA4B,IAAI,GACpE,KAAc,EAOV,IAAI,GACR,KAAY,EAMR,IAAI,GAER,IAAuB,EAA0B,IAAI;CAC3D,EAAqB,UAAU;CAC/B,IAAM,KAAqB,EAA0B,IAAI;CACzD,GAAmB,UAAU;CAE7B,IAAM,KAAoB,GAAa,GAAY,GAAgB,GAAqB,MAAoB;EAC1G,IAAM,IAAM,EAAY,MAAK,MAAK,EAAE,OAAO,CAAE;EAC7C,IAAI,CAAC,KAAO,GAAa,uBAAuB,MAAS,CAAC,EAAkB,QAAQ,CAAG,GAAG;EAC1F,IAAM,IAAa;GACjB,GAAG;GACH,OAAO,EAAI,SAAS,EAAI,QAAQ,IAAI,EAAI,QAAQ;GAChD,QAAQ,EAAI,UAAU,EAAI,SAAS,IAAI,EAAI,SAAS;EACtD;EASA,AARA,GAAY,UAAU;GACpB,OAAO;GACP;GACA,QAAQ,EAAE;GACV,QAAQ,EAAE;GACV;GACA,WAAW;EACb,GACA,GAAmB,CAAU;CAC/B,GAAG;EAAC;EAAa;EAAmB;CAAW,CAAC,GAE1C,KAAkB,GAAa,GAAY,GAAqB,MAAoB;EACxF,IAAM,IAAM,EAAY,MAAK,MAAK,EAAE,OAAO,CAAE;EACzC,CAAC,KAAO,GAAa,uBAAuB,MAAS,CAAC,EAAkB,QAAQ,CAAG,MACvF,GAAU,UAAU;GAClB,OAAO;GACP,QAAQ,EAAE;GACV,QAAQ,EAAE;GACV,YAAY,EAAE,GAAG,EAAI;GACrB,WAAW;EACb,GACA,GAAiB,EAAE,GAAG,EAAI,CAAC;CAC7B,GAAG;EAAC;EAAa;EAAmB;CAAW,CAAC,GAE1C,KAA8B,GAAa,GAAY,MAAwB;EACnF,EAAE,gBAAgB;EAClB,IAAM,IAAM,EAAY,MAAK,MAAK,EAAE,OAAO,CAAE;EAC7C,IAAI,MAAQ,EAAI,SAAS,UAAU,EAAI,SAAS,UAAU,EAAI,SAAS,YAAY;GACjF,IAAI,GAAa,uBAAuB,MAAS,CAAC,EAAkB,QAAQ,CAAG,GAAG;IAChF,EAAwB,CAAE;IAC1B;GACF;GAWA,AAVA,GAAoB;IAClB,GAAG,EAAI;IACP,GAAG,EAAI;IACP,MAAM,EAAI;IACV,OAAO,EAAI;IACX,QAAQ,EAAI;IACZ,WAAW,EAAI;GACjB,CAAC,GACD,GAAe,EAAI,QAAQ,EAAE,GACzB,EAAI,SAAO,GAAgB,EAAI,KAAK,GACxC,EAAwB,CAAE;EAC5B;CACF,GAAG;EAAC;EAAa;EAAmB;CAAW,CAAC;CAEhD,QAAgB;EACd,IAAM,KAAyB,MAAkB;GAC/C,IAAI,GAAY,SAAS;IACvB,IAAM,EAAE,WAAQ,WAAQ,WAAQ,kBAAe,GAAY,SACvD,KAAM,EAAE,UAAU,KAAU,GAC5B,KAAM,EAAE,UAAU,KAAU;IAChC,IAAI,MAAa,IAAI;KACnB,IAAM,IAAM;KAAa,AAAT,IAAK,GAAI,IAAK,CAAC;IACjC,OAAO,IAAI,MAAa,KACZ,AAAV,IAAK,CAAC,GAAI,IAAK,CAAC;SACX,IAAI,MAAa,KAAK;KAC3B,IAAM,IAAM;KAAc,AAAV,IAAK,CAAC,GAAI,IAAK;IACjC;IAEA,IAAI,IAAO,EAAW,OAClB,IAAO,EAAW,QAClB,IAAO,EAAW,GAClB,IAAO,EAAW;IAiBtB,AAfI,EAAO,SAAS,GAAG,MACrB,IAAO,KAAK,IAAI,IAAI,EAAW,QAAQ,CAAE,IAEvC,EAAO,SAAS,GAAG,MACrB,IAAO,KAAK,IAAI,IAAI,EAAW,SAAS,CAAE,IAExC,EAAO,SAAS,GAAG,MACrB,IAAO,KAAK,IAAI,IAAI,EAAW,QAAQ,CAAE,GACzC,IAAO,EAAW,KAAK,EAAW,QAAQ,KAExC,EAAO,SAAS,GAAG,MACrB,IAAO,KAAK,IAAI,IAAI,EAAW,SAAS,CAAE,GAC1C,IAAO,EAAW,KAAK,EAAW,SAAS,KAG7C,GAAmB;KACjB,GAAG;KACH,GAAG;KACH,GAAG;KACH,OAAO;KACP,QAAQ;IACV,CAAC;GACH,OAAO,IAAI,GAAU,SAAS;IAC5B,IAAM,EAAE,WAAQ,WAAQ,kBAAe,GAAU,SAC7C,KAAM,EAAE,UAAU,KAAU,GAC5B,KAAM,EAAE,UAAU,KAAU;IAChC,IAAI,MAAa,IAAI;KACnB,IAAM,IAAM;KAAa,AAAT,IAAK,GAAI,IAAK,CAAC;IACjC,OAAO,IAAI,MAAa,KACZ,AAAV,IAAK,CAAC,GAAI,IAAK,CAAC;SACX,IAAI,MAAa,KAAK;KAC3B,IAAM,IAAM;KAAc,AAAV,IAAK,CAAC,GAAI,IAAK;IACjC;IAEA,GAAiB;KACf,GAAG;KACH,GAAG,KAAK,IAAI,GAAG,EAAW,IAAI,CAAE;KAChC,GAAG,KAAK,IAAI,GAAG,EAAW,IAAI,CAAE;IAClC,CAAC;GACH;EACF,GAEM,UAA4B;GAChC,IAAI,GAAY,SAAS;IACvB,IAAI,EAAqB,SAAS;KAChC,IAAM,IAAW,EAAqB;KACtC,EAAkB,EAAY,KAAI,MAAK,EAAE,OAAO,EAAS,KAAK,IAAW,CAAC,CAAC;IAC7E;IAEA,AADA,GAAY,UAAU,MACtB,GAAmB,IAAI;GACzB;GACA,IAAI,GAAU,SAAS;IACrB,IAAI,GAAmB,SAAS;KAC9B,IAAM,IAAW,GAAmB;KACpC,EAAkB,EAAY,KAAI,MAAK,EAAE,OAAO,EAAS,KAAK,IAAW,CAAC,CAAC;IAC7E;IAEA,AADA,GAAU,UAAU,MACpB,GAAiB,IAAI;GACvB;EACF;EAIA,OAFA,OAAO,iBAAiB,aAAa,CAAqB,GAC1D,OAAO,iBAAiB,WAAW,CAAmB,SACzC;GAEX,AADA,OAAO,oBAAoB,aAAa,CAAqB,GAC7D,OAAO,oBAAoB,WAAW,CAAmB;EAC3D;CACF,GAAG;EAAC;EAAO;EAAU;EAAa;CAAiB,CAAC;CAEpD,IAAM,KAA0B,GAAa,MAA+D;EAE1G,IADI,GAAa,sBAAsB,MACnC,OAAO,SAAW,KAAa;EACnC,IAAM,IAAM,OAAO,aAAa;EAChC,IAAI,CAAC,KAAO,EAAI,eAAe,CAAC,EAAI,YAAY;EAChD,IAAM,IAAQ,EAAI,WAAW,CAAC,GACxB,IAAc,MAAM,KAAK,EAAM,eAAe,CAAC;EACrD,IAAI,EAAY,WAAW,GAAG;EAE9B,IAAI,IAAoB,EAAM;EAC9B,OAAO,KAAQ,EAAE,aAAgB,eAAe,EAAK,UAAU,SAAS,oBAAoB,KAC1F,IAAO,EAAK;EAEd,IAAI,CAAC,KAAQ,EAAE,aAAgB,cAAc;EAE7C,IAAM,IAAc,EAAK,aAAa,kBAAkB,KAAK,EAAK,GAAG,QAAQ,aAAa,EAAE,GACtF,IAAa,SAAS,GAAa,EAAE;EAC3C,IAAI,CAAC,GAAY;EAEjB,IAAM,IAAW,EAAK,sBAAsB,GACtC,IAAO,EAAQ,CAAU,GACzB,IAAM,IAAW,OAAQ,IAAI,EAAK,QAAQ,EAAK,QAC/C,IAAM,IAAW,OAAQ,IAAI,EAAK,SAAS,EAAK,OAEhD,IAAQ,EAAY,KAAI,MAAK;GACjC,IAAM,KAAQ,EAAE,OAAO,EAAS,QAAQ,GAClC,KAAQ,EAAE,MAAM,EAAS,OAAO,GAChC,IAAO,EAAE,QAAQ,GACjB,IAAO,EAAE,SAAS,GAClB,IAAK,GAAmB,GAAM,GAAM,GAAU,GAAK,CAAG,GACtD,IAAK,GAAmB,IAAO,GAAM,IAAO,GAAM,GAAU,GAAK,CAAG;GAC1E,OAAO;IACL,GAAG,KAAK,IAAI,EAAG,GAAG,EAAG,CAAC;IACtB,GAAG,KAAK,IAAI,EAAG,GAAG,EAAG,CAAC;IACtB,OAAO,KAAK,IAAI,EAAG,IAAI,EAAG,CAAC;IAC3B,QAAQ,KAAK,IAAI,EAAG,IAAI,EAAG,CAAC;GAC9B;EACF,CAAC,CAAC,CAAC,QAAO,MAAK,EAAE,QAAQ,KAAK,EAAE,SAAS,CAAC;EAE1C,IAAI,EAAM,WAAW,GAAG;EAExB,IAAM,IAAO,KAAK,IAAI,GAAG,EAAM,KAAI,MAAK,EAAE,CAAC,CAAC,GACtC,IAAO,KAAK,IAAI,GAAG,EAAM,KAAI,MAAK,EAAE,CAAC,CAAC,GACtC,IAAO,KAAK,IAAI,GAAG,EAAM,KAAI,MAAK,EAAE,IAAI,EAAE,KAAK,CAAC,GAChD,IAAO,KAAK,IAAI,GAAG,EAAM,KAAI,MAAK,EAAE,IAAI,EAAE,MAAM,CAAC,GAEjD,IAAQ,MAAS,cAAc,YAAY,MAAS,aAAa,YAAY,MAAgB,WAC7F,IAAU,MAAS,cAAc,KAAM,GACvC,IAAc,MAAS,aAAa,MAAM,GAE1C,IAAQ,GAAgB;EAe9B,AAdA,EAAkB,CAAC,GAAG,GAAa;GACjC,IAAI;GACJ;GACA,WAAW;GACX,GAAG;GACH,GAAG;GACH,OAAO,IAAO;GACd,QAAQ,IAAO;GACf,OAAO,EAAM,SAAS,IAAI,IAAQ,KAAA;GAClC;GACA;GACA;EACF,CAAC,CAAC,GAEF,EAAI,gBAAgB;CACtB,GAAG;EAAC;EAAa;EAAmB;EAAc;EAAS;EAAa;EAAU;CAAK,CAAC;CA6GxF,AAzGA,GAA2B,mBAAmB,MAAM;EAClD,IAAM,IAAU,SAAS,eAAe,YAAY,cAAc,SAAS,eAAe,YAAY;EAEtG,IAAI,GAAc,GAAG,GAAW,WAAW,CAAC,GAAG;GAE7C,AADA,EAAE,eAAe,GACjB,GAAY,OAAM,IAAI,MAAM,GAAG;GAC/B;EACF;EACA,IAAI,GAAc,GAAG,GAAW,YAAY,CAAC,GAAG;GAE9C,AADA,EAAE,eAAe,GACjB,GAAY,OAAM,IAAI,MAAM,GAAG;GAC/B;EACF;EACA,IAAI,GAAc,GAAG,GAAW,MAAM,CAAC,GAAG;GAExC,AADA,EAAE,eAAe,GACjB,GAAW;GACX;EACF;EACA,IAAI,GAAc,GAAG,GAAW,MAAM,CAAC,GAAG;GAExC,AADA,EAAE,eAAe,GACjB,GAAW;GACX;EACF;EACA,IAAI,GAAc,GAAG,GAAW,QAAQ,CAAC,GAAG;GAE1C,AADA,EAAE,eAAe,GACjB,EAAI,KAAK,oBAAoB;GAC7B;EACF;EACA,IAAI,GAAc,GAAG,GAAW,aAAa,CAAC,GAAG;GAE/C,AADA,EAAE,eAAe,GACjB,EAAI,KAAK,yBAAyB;GAClC;EACF;EAGA,IAAI,CAAC,KAAW,CAAC,GAAkB;GACjC,IAAI,GAAc,GAAG,GAAW,MAAM,CAAC,GAAG;IACxC,IAAM,IAAe,OAAO,SAAW,MAAc,OAAO,aAAa,CAAC,EAAE,SAAS,IAAI;IACzF,IAAI,KAAgB,EAAa,SAAS,GAAG;KAC3C,EAAI,KAAK,sBAAsB,EAAE,MAAM,EAAa,CAAC;KACrD;IACF;IACA,IAAI,GAAsB;KACxB,IAAM,IAAY,EAAY,MAAK,MAAK,EAAE,OAAO,CAAoB;KACrE,AAAI,MACF,EAAE,eAAe,GACjB,GAAuB,UAAU;KAEnC;IACF;GACF;GACA,IAAI,GAAc,GAAG,GAAW,OAAO,CAAC,KAAK,GAAuB,SAAS;IAC3E,EAAE,eAAe;IACjB,IAAM,IAAO,GAAuB,SAC9B,IAAqB;KACzB,GAAG;KACH,IAAI,GAAgB;KACpB,WAAW;KACX,GAAG,EAAK,IAAI;KACZ,GAAG,EAAK,IAAI;KACZ,QAAQ,KAAA;KACR,UAAU,KAAA;KACV,WAAW,KAAA;KACX,YAAY,KAAA;KACZ,UAAU,KAAA;KACV,YAAY,KAAA;IACd;IAEA,AADA,EAAkB,CAAC,GAAG,GAAa,CAAM,CAAC,GAC1C,EAAwB,EAAO,EAAE;IACjC;GACF;GACA,IAAI,GAAc,GAAG,GAAW,QAAQ,CAAC,KAAK,GAAsB;IAGlE,AAFA,EAAE,eAAe,GACjB,EAAkB,EAAY,QAAO,MAAK,EAAE,OAAO,CAAoB,CAAC,GACxE,EAAwB,IAAI;IAC5B;GACF;GACA,IAAI,EAAE,QAAQ,WAAW,KAAwB,CAAC,GAAkB;IAClE,IAAM,IAAM,EAAY,MAAK,MAAK,EAAE,OAAO,CAAoB;IAC/D,IAAI,MAAQ,EAAI,SAAS,UAAU,EAAI,SAAS,UAAU,EAAI,SAAS,YAAY;KAWjF,AAVA,EAAE,eAAe,GACjB,GAAoB;MAClB,GAAG,EAAI;MACP,GAAG,EAAI;MACP,MAAM,EAAI;MACV,OAAO,EAAI;MACX,QAAQ,EAAI;MACZ,WAAW,EAAI;KACjB,CAAC,GACD,GAAe,EAAI,QAAQ,EAAE,GACzB,EAAI,SAAO,GAAgB,EAAI,KAAK;KACxC;IACF;GACF;EACF;CACF,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,MACF,GAAoB,CAAW;CAEnC,GAAG,CAAC,GAAa,EAAmB,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,GAAa,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,IAAoB,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,IAAoB,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;CAEtG,QAAgB;EACd,AAAI,GAAc,WAAW,KAC3B,GAAsB,IAAI;CAE9B,GAAG,CAAC,EAAa,CAAC;CAIlB,IAAM,KAAuB,EAAO,EAAK;CACzC,QAAgB;EAMd,IALA,GAAU,IAAI,GACd,GAAa,IAAI,GACjB,EAAW,CAAC,GACZ,GAAY,CAAC,CAAC,GACd,GAAqB,UAAU,IAC3B,CAAC,GAAY;EAEjB,IAAM,IAAM,GACR,IAAY,IACZ,IAAsD;EAgC1D,QAFA,YA5B4B;GAC1B,IAAI;IAGF,AAFI,GAAU,WAAS,GAAmB,GAAU,OAAO,GAC3D,GAAuB,GACvB,IAAc,GAAS,YAAY;KAAE;KAAK;KAAiB,GAAG,GAAkB;IAAE,CAAC;IACnF,IAAM,IAAM,MAAM,EAAY;IAG9B,IAAI,GAAW;IACf,IAAI;KACF,IAAM,IAAK,MAAM,EAAI,QAAQ,CAAC;KAC9B,IAAI,CAAC,GAAW;MACd,IAAM,IAAM,EAAG,YAAY;OAAE,OAAO;OAAG,UAAU,GAAkB,EAAG,SAAS,CAAQ;MAAE,CAAC;MAC1F,GAAY,GAAuB,EAAI,UAAU;OAAE,OAAO,EAAI;OAAO,QAAQ,EAAI;MAAO,CAAC,CAAC;KAC5F;IACF,QAAQ,CAAC;IACT,IAAI,GAAW;IAEf,AADA,GAAU,CAAG,GACb,GAAa,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,GAAa,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;EAAiB;CAAQ,CAAC;CAErD,IAAM,KAAqB,GAAa,MAAyB;EAC/D,GAAa,QAAQ,iBAAiB,CAAY,GAC9C,IAAqB,YACzB,GAAqB,UAAU,IAC/B,GAAa,QAAQ,sBAAsB,CAAY;CACzD,GAAG,CAAC,CAAC;CAEL,QAAgB;EACd,AAAI,KAAQ,GAAa,QAAQ,eAAe,GAAS,EAAO,QAAQ;CAC1E,GAAG,CAAC,GAAS,CAAM,CAAC;CAIpB,IAAM,KAAuB,EAAyC,IAAI,GACpE,KAAoB,EAA2B,KAAA,CAAS;CAe9D,AAdA,QAAgB;EACd,IAAM,IAAS,MAAQ;EAGvB,IAFI,CAAC,KAAU,CAAC,KACZ,GAAqB,YAAY,KAAU,GAAkB,YAAY,KACzE,GAAS,SAAS,KAAK,IAAI,GAAQ,EAAO,QAAQ,GAAG;EAEzD,IAAM,IAAY,GAAqB,YAAY;EAEnD,AADA,GAAqB,UAAU,GAC/B,GAAkB,UAAU;EAC5B,IAAM,IAAI,iBAAiB,GAAa,GAAQ,EAAE,QAAQ,CAAC,EAAU,CAAC,GAAG,EAAE;EAC3E,aAAa,aAAa,CAAC;CAC7B,GAAG;EAAC;EAAQ;EAAM;EAAa,GAAS;EAAQ;CAAY,CAAC,GAG7D,QAAgB;EACd,IAAI,CAAC,GAAQ;EACb,IAAI,IAAY,IACV,IAAM;EAmFZ,QAjFC,YAAY;GAEX,IAAI;GACJ,IAAI;IACF,IAAK,MAAM,EAAI,QAAQ,CAAC;GAC1B,QAAQ;IACN;GACF;GACA,IAAI,GAAW;GAEf,IAAM,IAAM,EAAG,YAAY;IAAE,OAAO;IAAG,UAAU,GAAkB,EAAG,SAAS,CAAQ;GAAE,CAAC,GACpF,IAAQ;IAAE,OAAO,EAAI;IAAO,QAAQ,EAAI;GAAO;GAcrD,IAXA,IAAa,MAET,EAAK,WAAW,EAAI,YACpB,KAAK,KAAK,EAAK,EAAE,EAAE,SAAS,KAAK,EAAM,KAAK,KAAK,MACjD,KAAK,KAAK,EAAK,EAAE,EAAE,UAAU,KAAK,EAAM,MAAM,KAAK,KAE5C,IAEF,GAAuB,EAAI,UAAU,CAAK,CAClD,GAEG,EAAI,YAAY,GAAG;GAGvB,IAAM,IAAU,GAAuB,EAAI,UAAU,CAAK,GACtD,IAAW;GAGf,KAAK,IAAI,IAAQ,GAAG,KAAS,EAAI,UAAU,KAAS,IAAW;IAC7D,IAAI,GAAW;IACf,IAAM,IAAM,KAAK,IAAI,EAAI,UAAU,IAAQ,KAAY,CAAC,GAClD,IAAiC,CAAC;IAExC,KAAK,IAAI,IAAI,GAAO,KAAK,GAAK,KAAK;KACjC,IAAM,IAAU;KAChB,EAAc,MAAM,YAAY;MAC9B,IAAI;OACF,IAAM,IAAO,MAAM,EAAI,QAAQ,CAAO;OACtC,IAAI,GAAW;OACf,IAAM,IAAK,EAAK,YAAY;QAAE,OAAO;QAAG,UAAU,GAAkB,EAAK,SAAS,CAAQ;OAAE,CAAC;OAI7F,CAHI,KAAK,IAAI,EAAG,QAAQ,EAAM,KAAK,IAAI,MAAO,KAAK,IAAI,EAAG,SAAS,EAAM,MAAM,IAAI,QACjF,IAAW,KAEb,EAAQ,IAAU,KAAK;QAAE,OAAO,EAAG;QAAO,QAAQ,EAAG;OAAO;MAC9D,QAAQ,CAER;KACF,EAAA,CAAG,CAAC;IACN;IAEA,MAAM,QAAQ,IAAI,CAAa;GACjC;GAEI,UAGA,GAAU;IACZ,IAAM,IAAY,EAAa;IAC/B,IAAI,KAAa,EAAU,YAAY,KAAK,GAAkB,YAAY,cAAc;KACtF,IAAM,IAAO,GAAc,SACrB,IAAY,GAChB,GAAQ,UACP,MAAM,EAAQ,IAAI,MAAM,GACzB,GAAS,SACT,EACF,GACM,IAAS,GAAa,QAAQ,KAAK,MAAS,GAE5C,KADS,EAAU,KAAK,MAAS,KAChB;KACvB,AAAI,MAAU,MACZ,EAAU,aAAa;IAE3B;IACA,GAAY,CAAO;GACrB;EACF,EAAA,CAAG,SAEU;GACX,IAAY;EACd;CACF,GAAG,CAAC,GAAQ,CAAQ,CAAC;CAGrB,IAAM,KAAmB,QAAkB;EACzC,IAAM,IAAO,EAAQ,CAAO;EAC5B,IAAI,CAAC,EAAa,WAAW,CAAC,EAAK,OAAO;EAC1C,IAAM,IAAiB,EAAa,QAAQ,cAAc;EAC1D,IAAI,IAAiB,KAAK,EAAK,QAAQ,GAAG;GACxC,IAAM,IAAW,GAAW,IAAiB,EAAK,KAAK;GAMvD,AALA,GAAuB,UAAU,IAC7B,EAAa,YAAY,MAAY,KAAK,EAAa,QAAQ,aAAa,OAC9E,EAAa,QAAQ,YAAY,GACjC,EAAa,QAAQ,aAAa,IAEpC,GAAS,CAAQ;EACnB;CACF,GAAG;EAAC;EAAS;EAAS;CAAQ,CAAC,GAGzB,KAAkB,QAAkB;EACxC,IAAM,IAAO,EAAQ,CAAO;EAC5B,IAAI,CAAC,EAAa,WAAW,CAAC,EAAK,SAAS,CAAC,EAAK,QAAQ;EAC1D,IAAM,IAAiB,EAAa,QAAQ,cAAc,IACpD,IAAkB,EAAa,QAAQ,eAAe;EAC5D,IAAI,IAAiB,KAAK,IAAkB,KAAK,EAAK,QAAQ,KAAK,EAAK,SAAS,GAAG;GAClF,IAAM,IAAS,IAAiB,EAAK,OAC/B,IAAS,IAAkB,EAAK,QAChC,IAAW,GAAW,KAAK,IAAI,GAAQ,CAAM,CAAC;GAMpD,AALA,GAAuB,UAAU,IAC7B,EAAa,YAAY,MAAY,KAAK,EAAa,QAAQ,aAAa,OAC9E,EAAa,QAAQ,YAAY,GACjC,EAAa,QAAQ,aAAa,IAEpC,GAAS,CAAQ;EACnB;CACF,GAAG;EAAC;EAAS;EAAS;CAAQ,CAAC;CAG/B,AADA,GAAY,6BAA6B,GAAiB,CAAC,GAC3D,GAAY,4BAA4B,GAAgB,CAAC;CAEzD,IAAM,MAAqB,GAA8B,MAAuB;EAC9E,IAAM,IAAO,EAAE,cAAc,sBAAsB,GAC7C,KAAQ,EAAE,UAAU,EAAK,QAAQ,GACjC,KAAQ,EAAE,UAAU,EAAK,OAAO,GAChC,IAAO,EAAQ,CAAU;EAG/B,OAAO,GAAmB,GAAM,GAAM,GAF1B,IAAW,OAAQ,IAAI,EAAK,QAAQ,EAAK,QACzC,IAAW,OAAQ,IAAI,EAAK,SAAS,EAAK,KACE;CAC1D,GAEM,MAAmB,GAA8B,MAA0B;EAC/E,IAAI,CAAC,GAAY;EAEjB,IAAM,EAAE,MAAG,SAAM,GAAkB,GAAG,CAAa;EAEnD,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;GAAa;GAAa;GAAY;EAAW,CAAC,CAAC,SAAS,CAAU,KAG7H,CAAC,WAAW,MAAM,CAAC,CAAC,SAAS,CAAU,OAFhD,GAAa,EAAI,GACjB,GAAwB,CAAa;CAKzC,GAEM,WAA6B;EACjC,IAAI,KAAoB,GAAY,KAAK,GAAG;GAC1C,IAAI,EAAiB,OACnB,EAAkB,EAAY,KAAI,MAChC,EAAE,OAAO,EAAiB,QAAQ;IAAE,GAAG;IAAG,MAAM;GAAY,IAAI,CAClE,CAAC;QACI;IACL,IAAM,IAAQ,GAAgB,GACxB,IAAe,KAAK,IAAI,KAAK,KAAK,IAAI,KAAK,GAAY,SAAS,IAAI,EAAE,CAAC,GACvE,IAAY,GAAY,MAAM,IAAI,CAAC,CAAC,QACpC,IAAgB,KAAK,IAAI,IAAI,IAAY,EAAE;IACjD,EAAkB,CAAC,GAAG,GAAa;KACjC,IAAI;KACJ,MAAM,EAAiB;KACvB,WAAW,EAAiB;KAC5B,GAAG,EAAiB;KACpB,GAAG,EAAiB;KACpB,OAAO;KACP,QAAQ;KACR,MAAM;KACN,QAAQ,EAAiB;KACzB,OAAO;KAAc,aAAa;KAAoB,SAAS;IACjE,CAAC,CAAC;GACJ;EACF;EAGA,AAFA,GAAoB,IAAI,GACxB,GAAe,EAAE,GACb,MAAe,UACjB,EAAc,IAAI;CAEtB,GAEM,MAAmB,GAA8B,MAA0B;EAC/E,IAAI,CAAC,IAAW;EAEhB,IAAM,EAAE,MAAG,SAAM,GAAkB,GAAG,CAAa;EAGnD,AAFA,GAAc;GAAE;GAAG;EAAE,CAAC,GAElB,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,IAAI,MAAe,QAAQ;IACzB,IAAM,EAAE,MAAG,SAAM,GAAkB,GAAG,CAAa;IACnD,IAAI,GAAa,sBAAsB,IAAO;IAG9C,IAAM,IAAS,GAAgB,GACzB,IAAkB;KACtB,IAAI;KACJ,MAAM;KACN,WAAW;KACX;KACA;KACA,OAAO;KACP,QAAQ;KACR,MAAM;KACN,SAAS;KACT,OAAO;KACP,aAAa;KACb,SAAS;KACT,QAAQ,CAAC;IACX;IAIA,AAHA,EAAkB,CAAC,GAAG,GAAa,CAAU,CAAC,GAC9C,EAAwB,CAAM,GAC9B,GAAmB,EAAI,GACvB,EAAc,IAAI;IAClB;GACF;GAAO,IAAI,MAAe,UAAU,MAAe,QAAQ;IACzD,IAAM,EAAE,MAAG,SAAM,GAAkB,GAAG,CAAa;IACnD,IAAI,GAAa,sBAAsB,IAAO;IAK9C,AAJI,KACF,GAAqB,GAEvB,GAAoB;KAAE;KAAG;KAAG,MAAM;KAAmB,WAAW;IAAc,CAAC,GAC/E,GAAe,EAAE;GACnB;GACA;EACF;EAEK,WACL,GAAa,EAAK,GAClB,GAAwB,IAAI,GACvB,IAEL;OAAI,MAAe,YAAY;IAC7B,IAAI,GAAe,SAAS,GAAG;KAE7B,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;KAE3B,EAAkB,CAAC,GAAG,GAAa;MACjC,IAAI,GAAgB;MAAG,MAAM;MAAmB,WAAW;MAC3D,GAAG;MAAM,GAAG;MAAM,OAAO,IAAO;MAAM,QAAQ,IAAO;MACrD,QAAQ,CAAC,GAAG,EAAc;MAC1B,SAAS,CAAC,CAAC,GAAG,EAAc,CAAC;MAC7B,OAAO;MAAc,aAAa;MAAoB,SAAS;KACjE,CAAC,CAAC;IACJ;IACA,GAAkB,CAAC,CAAC;GACtB,OAAO;IACL,IAAI,IAAQ,KAAK,IAAI,EAAW,IAAI,EAAS,CAAC,GAC1C,IAAS,KAAK,IAAI,EAAW,IAAI,EAAS,CAAC;IAC/C,IAAI,IAAQ,KAAK,IAAS,GAAG;KAC3B,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;KAOxH,IALI;MAAC;MAAa;MAAa;MAAa;MAAY;KAAW,CAAC,CAAC,SAAS,CAAU,KAAK,IAAS,OACpG,IAAS,KAAK,IAAI,IAAI,CAAM,GAC5B,IAAI,EAAS,IAAI,IAGf,MAAe,WAAW;MAC5B,IAAI,GAAa,sBAAsB,IAAO;MAE9C,AADA,GAAoB;OAAE,GAAG,EAAW;OAAG,GAAG,EAAW;OAAG,MAAM;OAAW;OAAQ,WAAW;MAAc,CAAC,GAC3G,GAAe,EAAE;MACjB;KACF;KAEA,IAAI,MAAe,aAAa;MAC9B,IAAI,GAAa,cAAc,IAAO;MACtC,IAAoB,MAAQ,CAAC,GAAG,GAAM;OACpC,IAAI,UAAU,KAAK,IAAI,EAAE,GAAG,KAAK,OAAO,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,OAAO,GAAG,CAAC;OAClE,WAAW;OACX;OACA;OACA;OACA;OACA,QAAQ;MACV,CAAC,CAAC;MACF;KACF;KAEA,IAAI,GAAa,sBAAsB,IAAO;KAE9C,EAAkB,CAAC,GAAG,GAAa;MACjC,IAAI,GAAgB;MAAG,MAAM;MAAmB,WAAW;MAAe;MAAG;MAAG;MAAO;MAAQ;MAC/F,OAAO;MAAc,aAAa;MAAoB,SAAS;KACjE,CAAC,CAAC;IACJ;GACF;;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,EAAwB,IAAI,GAC5B,GAAkB,IAAI;EAE1B,OAAO,IAAI,MAAe,QAAQ,MAAe,SAAS,MAAe,UAAU;GACjF,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;KACrD,GAAa,CAAU;IACzB,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,YAAY;IACjE,IAAI,GAAa,uBAAuB,MAAS,CAAC,EAAkB,QAAQ,CAAG,GAAG;KAChF,EAAwB,CAAE;KAC1B;IACF;IAIA,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,QAC7B,EAAwB,CAAE;QACrB,IAAI,KAAO,EAAI,SAAS,QAAQ;IACrC,IAAI,GAAa,uBAAuB,MAAS,CAAC,EAAkB,QAAQ,CAAG,GAAG;KAChF,EAAwB,CAAE;KAC1B;IACF;IACA,GAAmB,EAAI;GACzB;GACA,EAAwB,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;CAqBA,OAXA,QAAgB;EACd,IAAI,KAAU,EAAa,WAAW,MAAmB,cAAc;GACrE,IAAM,IAAW,GAAU,MAAM,EAAa,QAAQ,eAAe,GAC/D,IAAY,KAAK,IAAI,GAAG,KAAK,IAAI,GAAK,SAAS,GAAG,GAAiB,CAAQ,CAAC,CAAC,GAC7E,IAAc,GAAK,KAAa,GAAK,EAAU,CAAC,KAAK;GAC3D,AAAI,MAAgB,KAClB,EAAW,CAAW;EAE1B;CACF,GAAG;EAAC,GAAU;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;IACT,aAAa,MAAM,GAAa,CAAC;GAClC,CAAA;GAEH,kBAAC,OAAD;IAAK,OAAO;KAAE,MAAM;KAAG,SAAS;KAAQ,eAAe;KAAU,UAAU;KAAG,WAAW;KAAG,iBAAiB;KAAmB,UAAU;IAAS;IAAnJ,UAAA;KAEC,EAAa,YACZ,kBAAC,IAAD;MACgB;MACd,YAAY,MAAS,GAAgB,OAAS;OAAE,GAAG;OAAM;MAAK,EAAE;MAChE,cAAc,GAAQ,MAAW,GAAgB,OAAS;OAAE,GAAG;OAAM;OAAQ;MAAO,EAAE;MACtF,uBAAuB,GAAgB,OAAS;OAAE,GAAG;OAAM,aAAa,CAAC,EAAK;MAAY,EAAE;MAC5F,kBAAkB;OAChB,IAAI,EAAa,UAAU,WAAW,GAAG;OACzC,IAAM,KAAU,EAAa,mBAAmB,IAAI,EAAa,UAAU,UAAU,EAAa,UAAU;OAC5G,GAAiB,CAAM;MACzB;MACA,kBAAkB;OAChB,IAAI,EAAa,UAAU,WAAW,GAAG;OACzC,IAAM,KAAU,EAAa,mBAAmB,KAAK,EAAa,UAAU;OAC5E,GAAiB,CAAM;MACzB;MACA,cAAc;OAGZ,AAFA,GAAgB,OAAS;QAAE,GAAG;QAAM,UAAU;OAAM,EAAE,GACtD,EAAW,IAAI,GACf,GAAa,CAAC,CAAC;MACjB;KACD,CAAA;KAGF,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,IAAD,EAAO,MAAM,GAAK,CAAA;QAAG,UAAU,CAAC,EAAkB;QAAS,SAAS;QAAY,OAAM;OAAQ,CAAA;OAChH,kBAAC,GAAD;QAAY,MAAM,kBAAC,IAAD,EAAO,MAAM,GAAK,CAAA;QAAG,UAAU,CAAC,EAAkB;QAAS,SAAS;QAAY,OAAM;OAAQ,CAAA;OAChH,kBAAC,OAAD,EAAK,OAAO;QAAE,OAAO;QAAO,QAAQ;QAAQ,iBAAiB;QAAuB,QAAQ;OAAQ,EAAI,CAAA;OAExG,kBAAC,GAAD;QAAY,MAAM,kBAAC,IAAD,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,IAAD,EAAW,MAAM,GAAK,CAAA;QAAG,QAAQ,MAAe;QAAa,eAAe;SAAgF,AAA9E,EAAc,WAAW,GAAG,GAAgB,SAAS,GAAG,GAAkB,CAAC,GAAG,GAAsB,CAAC;QAAG;QAAG,OAAM;OAAa,CAAA;OAC9N,kBAAC,GAAD;QAAY,MAAM,kBAAC,IAAD,EAAe,MAAM,GAAK,CAAA;QAAG,QAAQ,MAAe;QAAa,eAAe;SAAgF,AAA9E,EAAc,WAAW,GAAG,GAAgB,SAAS,GAAG,GAAkB,CAAC,GAAG,GAAsB,CAAC;QAAG;QAAG,OAAM;OAAa,CAAA;OAClO,kBAAC,GAAD;QAAY,MAAM,kBAAC,IAAD,EAAc,MAAM,GAAK,CAAA;QAAG,QAAQ,MAAe;QAAY,eAAe;SAA+E,AAA7E,EAAc,UAAU,GAAG,GAAgB,SAAS,GAAG,GAAkB,CAAC,GAAG,GAAsB,GAAG;QAAG;QAAG,OAAM;OAAY,CAAA;OAChO,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;UAAa;UAAa;UAAa;SAAU,CAAC,CAAC,SAAS,KAAc,EAAE,KACjI,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;YACb,IAAM,IAA0B,GAAiB,KAAI,OAAM;aAAE,GAAG;aAAG,QAAQ;YAAU,EAAE,GACjF,IAAwB,GAAe,KAAI,OAAM;aAAE,GAAG;aAAG,QAAQ;YAAU,EAAE,GAE7E,IAA2B;aAAC,IADH,KAAc,CAAC,EAAA,CAAG,KAAI,OAAM;cAAE,GAAG;cAAG,QAAQ;aAAU,EAChD;aAAU,GAAG;aAAU,GAAG;YAAU,CAAC,CAAC,QAAO,MAAK,EAAE,WAAW,SAAS;YAI7G,AAHA,GAAoB,CAAU,GAC9B,GAAkB,CAAQ,GAC1B,GAAqB,EAAK,GAC1B,GAAa,QAAQ,sBAAsB,CAAW;WACxD;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;KAMP,kBAAC,OAAD;MAAK,OAAO;OAAE,MAAM;OAAG,SAAS;OAAQ,eAAe;OAAO,UAAU;OAAG,WAAW;OAAG,OAAO;OAAQ,QAAQ;OAAQ,UAAU;OAAU,UAAU;MAAW;MAAjK,UAAA,CACG,EAAa,YAAY,EAAa,SAAS,iBAC9C,kBAAC,IAAD;OACE,SAAS;OACA;OACA;OACF;OACG;OACV,cAAc,EAAQ,CAAO;OAClB;OACC;OACC;OACA;OACF;OACI;OACf,YAAY;OACZ,QAAQ,EAAa,aAAa,MAAY,CAAC;OAC/C,QAAQ,EAAa,aAAa,MAAY,CAAC;OAC/C,gBAAgB,EAAa,UAAU,EAAa,iBAAiB,EAAE;OACvE,eAAe,MAAO;QACpB,IAAM,IAAM,EAAa,UAAU,WAAU,MAAK,EAAE,OAAO,CAAE;QAC7D,AAAI,MAAQ,MAAI,GAAiB,CAAG;OACtC;MACD,CAAA,IAED,kBAAA,IAAA,EAAA,UAAA,CACG,MAAe,eACd,kBAAC,SAAD,EAAA,UAAQ,8iBAIC,CAAA,GAEX,kBAAC,OAAD;OACE,WAAU;OACV,OAAO;QACL,MAAM;QACN,SAAS;QACT,eAAe;QACf,UAAU;QACV,WAAW;QACX,UAAU;QACV,UAAU;QACV,iBAAiB;QACjB,QAAQ,KAAY,aAAc,MAAe,QAAQ,SAAU,MAAe,WAAW,SAAU,MAAe,YAAY,MAAe,OAAO,YAAY;OACtK;OACJ,cAAc,MAAM;QAClB,IAAI,MAAa,GAAY,WAAW,EAAa,SAAS;SAC5D,IAAM,IAAK,EAAE,UAAU,GAAY,QAAQ,GACrC,IAAK,EAAE,UAAU,GAAY,QAAQ;SAE3C,AADA,EAAa,QAAQ,aAAa,GAAY,QAAQ,aAAa,GACnE,EAAa,QAAQ,YAAY,GAAY,QAAQ,YAAY;QACnE;OACF;OACA,oBAAoB;QAClB,AAAI,OACF,GAAa,EAAK,GAClB,GAAY,UAAU;OAE1B;OA1BE,UAAA;QA4BF,kBAAC,OAAD;SACE,KAAK;SACL,WA3VY,MAAqC;UAKzD,AAJA,GAAa;WACX,KAAK,EAAE,cAAc;WACrB,MAAM,EAAE,cAAc;UACxB,CAAC,GACD,GAAc,UAAU,GAAiB,EAAE,cAAc,SAAS;SACpE;SAsVU,cAAc,MAAM;UAClB,AAAI,MAAe,SACb,EAAE,WAAW,MACf,GAAa,EAAI,GACjB,GAAY,UAAU;WACpB,GAAG,EAAE;WACL,GAAG,EAAE;WACL,YAAY,EAAE,cAAc;WAC5B,WAAW,EAAE,cAAc;UAC7B;SAGN;SACA,YAAY,MAAO;UACjB,AAAI,OACF,GAAa,EAAK,GAClB,GAAY,UAAU;SAE1B;SACA,gBAAgB,MAAM;UACa,OAAO,SAAW,OAAe,OAAO,aAAa,CAAC,EAAE,SAAS,CAAC,CAAC,KAAK,MAMzG,EAAE,eAAe,GACjB,EAAE,gBAAgB;SACpB;SACA,OAAO;UACL,OAAO;UACP,QAAQ;UACR,UAAU;UACV,UAAU;SACZ;SAEQ,iBAAA;UACN,IAAM,KAAa,GAAe,GAAgB,MAA0B;WAC1E,IAAM,IAAO,IAAgB,GAAU,KAAK,MAAW,IAAK;WAG5D,IAAI,KAAgB,EAAa,SAAS;YAGxC,IAAM,IAAe,KAAS,IAAI,IAAI,KAAS,IAAI,IAAI,GACjD,IAAc,KAAS,IAAI,IAAI,KAAS,IAAI,IAAI;YACtD,IAAI,IAAS,GAAc,UAAU,KAAgB,IAAS,GAAc,UAAU,GACpF,OAAO;WAEX;WAGA,IAAM,IAAW,MAAa,MAAwB,KAAc,MAAe,kBAAmB;YACpG,IAAI,MAAe,YACjB,OAAO;aACL,IAAI;aAAqB,MAAM;aAAqB,WAAW;aAC/D,GAAG;aAAG,GAAG;aAAG,OAAO;aAAG,QAAQ;aAAG,QAAQ;aACzC,OAAO;aAAc,aAAa;aAAoB,SAAS;YACjE;YACK,IAAI;aAAC;aAAa;aAAa;aAAa;YAAU,CAAC,CAAC,SAAS,CAAU,GAAG;aACnF,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;aAKzC,OAJI,IAAS,OACX,IAAS,KAAK,IAAI,IAAI,CAAM,GAC5B,IAAI,EAAS,IAAI,IAEZ;cACL,IAAI;cAAqB,MAAM;cAAmB,WAAW;cAC7D;cAAG;cAAG;cAAO;cACb,OAAO;cAAc,aAAa;cAAoB,SAAS,MAAe,cAAc,KAAiB;aAC/G;YACF;YAAO,IAAI,MAAe,aAAa;aACrC,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;aAKzC,OAJI,IAAS,OACX,IAAS,KAAK,IAAI,IAAI,CAAM,GAC5B,IAAI,EAAS,IAAI,IAEZ;cACL,IAAI;cAAqB,MAAM;cAAsB,WAAW;cAChE;cAAG;cAAG;cAAO;cACb,OAAO;cAAW,aAAa;cAAG,SAAS;aAC7C;YACF;YAAO,IAAI;aAAC;aAAQ;aAAS;aAAW;aAAa;aAAW;YAAM,CAAC,CAAC,SAAS,CAAoB,GAAG;aACtG,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;aAE3C,OAAO;cACL,IAAI;cAAqB,MAAM;cAAmB,WAAW;cAC7D;cAAG;cAAG;cAAO;cAAQ,QAHP,MAAe,UAAU,MAAe,WAAW,MAAe,YAAa,CAAC,GAAU,CAAU,IAAI,KAAA;cAItH,OAAO;cAAc,aAAa;cAAoB,SAAS;aACjE;YACF;WACF,EAAA,CAAG,IAAI;WAEP,OAAO,EAAI,KAAK,GAAG,MAAS;YAC1B,IAAI,GACE,IAAK,EAAa,SAAS,eAAe,GAC1C,IAAU,EAAQ,CAAC,GACnB,IAAa,EAAQ,EAAI,EAAE,CAAC,CAAC,QAAQ,GACrC,IAAY,EAAQ,QAAQ;YAClC,AAAI,EAAI,WAAW,KACb,MAAS,MAAG,IAAQ,KAAK,IAAI,GAAG,IAAK,IAAI,CAAU,IACnD,MAAS,MAAG,IAAQ,KAAK,IAAI,GAAY,IAAK,CAAC,MAEnD,IAAQ,KAAK,IAAI,GAAG,IAAK,IAAI,IAAY,CAAC;YAG5C,IAAM,IAAc,EAAY,KAAI,MAAM,MAAmB,EAAE,OAAO,GAAgB,KAAK,KAAmB,MAAiB,EAAE,OAAO,GAAc,KAAK,KAAgB,CAAG,GACxK,IAAmB,KAAW,EAAQ,cAAc,IAAK,CAAC,GAAG,GAAa,CAAO,IAAI;YAE3F,OACE,kBAAC,EAAM,UAAP,EAAA,UAAA;aACE,kBAAC,IAAD;cACE,SAAS;cACD;cACD;cACG;cACV,gBAAgB,EAAa,SAAS,eAAe;cACrD,iBAAiB,EAAa,SAAS,gBAAgB;cACvD,WAAW,GAAU;cACrB,YAAY,GAAU;cACtB,SAAS;cACT,UAAU;cACV,eAAe,EAAQ;cACvB,gBAAgB,EAAQ;cACb;cACC;cACZ,aAAa;cACb,qBAAqB,IAAqB,QAAO,MAAK,EAAE,cAAc,CAAC,KAAK,CAAC;cACvD;cACF;cACpB,aAAa;cACb,aAAa;cACb,WAAW;cACX,mBAAmB;cACnB,yBAAyB;cACzB,eAAe;cACf,aAAa;cACb,wBAAwB;cACxB,wBAAwB;eACtB,IAAI,GAAmB,WAAW,IAAiB;gBACjD,GAAmB,UAAU;gBAC7B;eACF;eAEA,AADA,EAAwB,IAAI,GAC5B,GAAkB,IAAI;cACxB;cACW;cACI;cACf,YAAY;cACZ,oBAAoB;cACpB,YAAY;cACsB;aACnC,CAAA;aACA,EAAa,YAAY,EAAa,SAAS,aAAa,MAC3D,kBAAC,OAAD;cAAK,OAAO;eACV,UAAU;eACV,KAAK,GAAG,EAAK;eACb,MAAM,MAAU,KAAA,IAA2B,QAAf,GAAG,EAAM;eACrC,OAAO,GAAG,EAAQ,QAAQ,EAAM;eAChC,QAAQ,GAAG,EAAQ,SAAS,EAAM;eAClC,eAAe;eACf,cAAc,EAAa;eAC3B,SAAS,EAAa;eACtB,QAAQ;eACR,QAAQ;cACV;cACE,UAAA,kBAAC,IAAD;eACE,SAAS;eACT,QAAQ;eACD;eACG;eACV,gBAAgB,EAAa,SAAS,eAAe;eACrD,iBAAiB,EAAa,SAAS,gBAAgB;eACvD,WAAW,GAAU;eACrB,YAAY,GAAU;eACtB,SAAS;eACT,UAAU;eACV,eAAe,EAAQ;eACvB,gBAAgB,EAAQ;eACb;eACX,YAAY;eACZ,aAAa,CAAC;eACd,sBAAsB;eACtB,oBAAoB;eACpB,mBAAmB,CAAC;eACpB,mBAAmB,CAAC;eACpB,iBAAiB,CAAC;eAClB,yBAAyB,CAAC;eAC1B,8BAA8B,CAAC;eAC/B,wBAAwB,CAAC;cAC1B,CAAA;aACE,CAAA;aAEN,EAAa,YACZ,kBAAC,OAAD;cAAK,OAAO;eACV,UAAU;eACV,KAAK,GAAG,EAAK;eACb,MAAM,MAAU,KAAA,IAA2B,QAAf,GAAG,EAAM;eACrC,OAAO,GAAG,EAAQ,QAAQ,EAAM;eAChC,QAAQ,GAAG,EAAQ,SAAS,EAAM;eAClC,eAAe;eACf,QAAQ;cACV;cACE,UAAA,kBAAC,IAAD;eACE,OAAO,CACL,GAAI,EAAa,aAAa,MAAM,CAAC,GACrC,GAAI,EAAa,aAAa,MAAM,CAAC,CACvC;eACO;eACP,gBAAgB,EAAa,UAAU,EAAa,iBAAiB,EAAE;eACvE,eAAe,MAAO;gBACpB,IAAM,IAAM,EAAa,UAAU,WAAU,MAAK,EAAE,OAAO,CAAE;gBAC7D,AAAI,MAAQ,MAAI,GAAiB,CAAG;eACtC;cACD,CAAA;aACE,CAAA;aAEN,KAAoB,EAAiB,cAAc,YAAY;cAC9D,IAAM,IAAM,IAAW,OAAQ,IAAI,EAAQ,QAAQ,EAAQ,QACrD,IAAM,IAAW,OAAQ,IAAI,EAAQ,SAAS,EAAQ,OACtD,IAAe,GAAiB,EAAiB,GAAG,EAAiB,GAAG,GAAU,GAAK,CAAG;cAChG,OACE,kBAAC,OAAD;eAAK,OAAO;gBACV,UAAU;gBACV,MAAM,IAAI,KAAS,KAAK,EAAa,IAAI,EAAM;gBAC/C,KAAK,GAAG,IAAO,EAAa,IAAI,EAAM;gBACtC,QAAQ;gBACR,iBAAiB;gBACjB,WAAW;gBACX,cAAc;gBACd,SAAS;gBACT,eAAe;eACjB;eAVA,UAAA,CAWA,kBAAC,YAAD;gBACE,KAAK;gBACL,OAAO;gBACP,WAAU,MAAK,GAAe,EAAE,OAAO,KAAK;gBAC5C,SAAS,MAAM;iBAEb,AAAK,EAAE,cAAc,eAAe,SAAS,EAAE,aAAqB,KAClE,GAAqB;gBAEzB;gBACA,YAAW,MAAK;iBAAE,AAAI,EAAE,QAAQ,WAAW,CAAC,EAAE,aAAY,EAAE,eAAe,GAAG,GAAqB;gBAAK;gBACxG,OAAO;iBACL,iBAAiB;iBACjB,QAAQ;iBACR,OAAO;iBACP,UAAU;iBACV,YAAY;iBACZ,UAAU;iBACV,WAAW;iBACX,SAAS;iBACT,QAAQ;iBACR,SAAS;gBACX;gBACA,aAAa,EAAiB,SAAS,SAAS,iBAAiB;gBACjE,WAAA;eACD,CAAA,GACD,kBAAC,OAAD;gBAAK,OAAO;iBAAE,SAAS;iBAAQ,gBAAgB;iBAAY,SAAS;iBAAW,WAAW;gBAAiB;gBACzG,UAAA,kBAAC,UAAD;iBACE,cAAc,MAAM;kBAAsB,AAApB,EAAE,eAAe,GAAG,GAAqB;iBAAG;iBAClE,OAAO;kBAAE,SAAS;kBAAY,YAAY;kBAAkB,OAAO;kBAAQ,QAAQ;kBAAQ,cAAc;kBAAO,QAAQ;kBAAW,UAAU;iBAAO;iBACrJ,UAAA;gBAEO,CAAA;eACL,CAAA,CACF;;aAET,EAAA,CAAG;YACa,EAAA,GAhKK,CAgKL;WAEpB,CAAC;UACH;UAEA,IAAI,MAAmB,cACrB,OACE,kBAAC,OAAD;WAAK,OAAO;YACV,UAAU;YAAY,OAAO;YAAQ,QAAQ,GAAG,GAAU,MAAM;WAClE;WACG,UAAA,GAAK,KAAK,GAAK,MAAW,EAAU,GAAK,GAAQ,EAAI,CAAC;UACpD,CAAA;UAEF;WACL,IAAM,IAAkB,KAAK,IAAI,GAAG,GAAK,WAAU,MAAO,EAAI,SAAS,CAAO,CAAC,CAAC,GAC1E,IAAa,GAAK,MAAoB,CAAC;WAC7C,OACE,kBAAC,OAAD;YAAK,OAAO;aACV,UAAU;aAAY,OAAO;aAAQ,WAAW,GAAG,GAAU,QAAQ,MAAoB,EAAE;YAC7F;YACG,UAAA,EAAU,GAAY,GAAiB,EAAK;WAC1C,CAAA;UAET;SACF,EAAA,CAAG;QACA,CAAA;QAGJ,MAAmB,kBAAkB,KACpC,kBAAC,OAAD;SAAK,OAAO;UACV,UAAU;UACV,QAAQ;UACR,MAAM;UACN,WAAW;UACX,SAAS;UACT,YAAY;UACZ,KAAK;UACL,iBAAiB;UACjB,SAAS;UACT,cAAc;UACd,OAAO;UACP,QAAQ;UACR,WAAW;SACb;SAdA,UAAA;UAeE,kBAAC,UAAD;WACE,eAAe,EAAW,KAAK,IAAI,GAAG,IAAU,CAAC,CAAC;WAClD,UAAU,KAAW;WACrB,OAAO;YAAE,YAAY;YAAQ,QAAQ;YAAQ,OAAO,KAAW,IAAI,SAAS;YAAQ,QAAQ,KAAW,IAAI,YAAY;YAAW,SAAS;YAAQ,YAAY;WAAS;WAExK,UAAA,kBAAC,GAAD,EAAa,MAAM,GAAK,CAAA;UAClB,CAAA;UACR,kBAAC,QAAD;WAAM,OAAO;YAAE,UAAU;YAAQ,YAAY;WAAI;WAAjD,UAAA;YAAoD;YAC5C;YAAQ;YAAK,EAAO;WACtB;;UACN,kBAAC,UAAD;WACE,eAAe,EAAW,KAAK,IAAI,EAAO,UAAU,IAAU,CAAC,CAAC;WAChE,UAAU,KAAW,EAAO;WAC5B,OAAO;YAAE,YAAY;YAAQ,QAAQ;YAAQ,OAAO,KAAW,EAAO,WAAW,SAAS;YAAQ,QAAQ,KAAW,EAAO,WAAW,YAAY;YAAW,SAAS;YAAQ,YAAY;WAAS;WAEpM,UAAA,kBAAC,GAAD,EAAc,MAAM,GAAK,CAAA;UACnB,CAAA;SACL;;QAIJ,CAAC,KACA,kBAAC,OAAD;SAAK,OAAO;UACV,UAAU;UACV,KAAK;UAAG,MAAM;UAAG,OAAO;UAAG,QAAQ;UACnC,SAAS;UACT,eAAe;UACf,KAAK;UACL,YAAY;UACZ,gBAAgB;UAChB,OAAO;UACP,SAAS;UACT,WAAW;SACb;SACG,UAAA,KACC,kBAAA,IAAA,EAAA,UAAA,CACE,kBAAC,OAAD;UAAK,OAAO;WAAE,YAAY;WAAK,OAAO;UAAoB;UACvD,UAAA,GAAU,SAAS,sBAAsB,yCAAyC;SAChF,CAAA,GACL,kBAAC,OAAD;UAAK,OAAO;WAAE,UAAU;WAAQ,UAAU;WAAS,WAAW;UAAa;UAAI,UAAA,GAAU;SAAa,CAAA,CACtG,EAAA,CAAA,IACA,IAAa,sBAAsB;QACpC,CAAA;QAIN,KACC,kBAAC,OAAD;SAAK,OAAO;UACV,UAAU;UACV,QAAQ;UACR,MAAM;UACN,WAAW;UACX,iBAAiB;UACjB,OAAO;UACP,SAAS;UACT,cAAc;UACd,SAAS;UACT,YAAY;UACZ,KAAK;UACL,QAAQ;UACR,WAAW;UACX,gBAAgB;SAClB;SAfA,UAAA;UAgBE,kBAAC,UAAD;WACE,eAAe,GAAa,KAAK,IAAI,GAAG,IAAU,CAAC,CAAC;WACpD,UAAU,KAAW;WACrB,OAAO;YAAE,YAAY;YAAQ,QAAQ;YAAQ,OAAO,KAAW,IAAI,0BAA0B;YAAS,QAAQ,KAAW,IAAI,YAAY;YAAW,SAAS;YAAQ,SAAS;WAAE;WAEhL,UAAA,kBAAC,GAAD,EAAa,MAAM,GAAK,CAAA;UAClB,CAAA;UACR,kBAAC,QAAD;WAAM,OAAO;YAAE,UAAU;YAAQ,YAAY;YAAK,UAAU;YAAQ,WAAW;WAAS;WAAxF,UAAA;YAA2F;YACnF;YAAQ;YAAI,EAAO;WACrB;;UACN,kBAAC,UAAD;WACE,eAAe,GAAa,KAAK,IAAI,EAAO,UAAU,IAAU,CAAC,CAAC;WAClE,UAAU,KAAW,EAAO;WAC5B,OAAO;YAAE,YAAY;YAAQ,QAAQ;YAAQ,OAAO,KAAW,EAAO,WAAW,0BAA0B;YAAS,QAAQ,KAAW,EAAO,WAAW,YAAY;YAAW,SAAS;YAAQ,SAAS;WAAE;WAE5M,UAAA,kBAAC,GAAD,EAAc,MAAM,GAAK,CAAA;UACnB,CAAA;SACL;;QAIN,KAAwB,MACvB,kBAAC,IAAD;SACE,YAAY,EAAY,MAAK,MAAK,EAAE,OAAO,CAAoB;SAC/D,UAAU;SACV,cAAc;UACZ,IAAM,IAAY,EAAY,MAAK,MAAK,EAAE,OAAO,CAAoB;UACrE,IAAI,GAAW;WACb,IAAM,IAAS;YAAE,GAAG;YAAW,IAAI,GAAgB;YAAG,QAAQ,KAAA;YAAW,UAAU,KAAA;YAAW,WAAW,KAAA;YAAW,YAAY,KAAA;YAAW,UAAU,KAAA;YAAW,YAAY,KAAA;YAAW,GAAG,EAAU,IAAI;YAAI,GAAG,EAAU,IAAI;WAAG;WAChO,EAAkB,CAAC,GAAG,GAAa,CAAM,CAAC;UAC5C;UAEA,AADA,EAAwB,IAAI,GAC5B,GAAkB,IAAI;SACxB;SACA,gBAAgB;UAGd,AAFA,EAAkB,EAAY,QAAO,MAAK,EAAE,OAAO,CAAoB,CAAC,GACxE,EAAwB,IAAI,GAC5B,GAAkB,IAAI;SACxB;SACA,gBAAgB,MAAkB;UAChC,EAAkB,EAAY,KAAI,MAAK,EAAE,OAAO,IAAuB;WAAE,GAAG;WAAG;UAAM,IAAI,CAAC,CAAC;SAC7F;SACA,uBAAuB;UAErB,AADA,GAAmB,EAAI,GACvB,GAAkB,IAAI;SACxB;SACa;QACd,CAAA;QAEF,EAAa,YAAY,EAAa,eACrC,kBAAC,IAAD;SACE,iBAAiB,EAAa;SAC9B,mBAAmB,MAAQ,GAAgB,OAAS;UAAE,GAAG;UAAM,iBAAiB;SAAI,EAAE;SACxE;QACf,CAAA;QAEF,OAAwB,MAAS,OAAyB,MACzD,kBAAC,IAAD;SACgB;SACd,SAAS,MAAS,EAAI,KAAK,sBAAsB,EAAE,QAAK,CAAC;SACzD,qBAAqB;QACtB,CAAA;OAEA;MACL,CAAA,CAAA,EAAA,CAAA,GAGH,EAAa,YACZ,kBAAC,IAAD;OACE,QAAQ;OACR,eAAe,GAAqB,EAAK;OACzC,WAAW,EAAa;OACb;OACX,kBAAkB,EAAa;OAC/B,eAAe,GAAK,MAAS,GAAiB,GAAK,CAAI;OACvD,eAAe,MAAM,GAAa,CAAC;MACpC,CAAA,CAEE;;IACA;;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,EAAwB,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,EAAwB,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,UAAO,eAAiH;CACnK,OACE,kBAAC,UAAD;EACE,SAAS,IAAW,KAAA,IAAY;EAChC,OAAO;EACG;EACV,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,IAAW,gBAAgB;GACnC,SAAS,IAAW,MAAO;GAC3B,eAAe,IAAW,SAAS;EACrC;EACA,eAAc,MAAK;GAAE,AAAI,CAAC,KAAU,CAAC,MAAU,EAAE,cAAc,MAAM,kBAAkB;EAAW;EAClG,eAAc,MAAK;GAAE,AAAI,CAAC,KAAU,CAAC,MAAU,EAAE,cAAc,MAAM,kBAAkB;EAAe;EAErG,UAAA;CACK,CAAA;AAEZ;AAEA,SAAS,GAAa,EAAE,UAAO,MAAyB;CACtD,OACE,kBAAC,OAAD;EAAK,OAAO;EAAM,QAAQ;EAAM,SAAQ;EAAY,MAAK;EAAO,QAAO;EAAe,aAAY;EAAI,eAAc;EAAQ,gBAAe;EAA3I,UAAA,CACE,kBAAC,QAAD,EAAM,GAAE,yBAA0B,CAAA,GAClC,kBAAC,QAAD,EAAM,GAAE,gEAAiE,CAAA,CACtE;;AAET;;;AC9vEA,SAAwB,GAAc,EAAE,YAAS,kBAAe,uBAAwC;CACtG,IAAM,EAAE,cAAW,mBAAgB,sBAAmB,GAAa,GAC7D,CAAC,GAAW,KAAgB,EAA2C,oBAAoB,GAC3F,CAAC,GAAe,KAAoB,EAA4B,IAAI,GACpE,CAAC,GAAa,KAAkB,EAAS,EAAE,GAE3C,KAAiB,GAAwB,MAAuB;EAKpE,IAJA,EAAE,eAAe,GACjB,EAAE,gBAAgB,GAGd,EAAE,QAAQ,UAAU;GACtB,EAAiB,IAAI;GACrB;EACF;EAGA,IAAI;GAAC;GAAQ;GAAW;GAAS;EAAK,CAAC,CAAC,SAAS,EAAE,GAAG,GAAG;EAEzD,IAAM,IAAkB,CAAC;EAGzB,CAFI,EAAE,WAAW,EAAE,YAAS,EAAM,KAAK,MAAM,GACzC,EAAE,YAAU,EAAM,KAAK,OAAO,GAC9B,EAAE,UAAQ,EAAM,KAAK,KAAK;EAE9B,IAAI,IAAM,EAAE;EAYZ,AAXI,MAAQ,QAAK,IAAM,UACnB,MAAQ,eAAe,MAAQ,WACjC,IAAM,WACG,EAAE,aAAa,MAAQ,OAAO,EAAE,SAAS,WAClD,IAAM,MACG,EAAE,aAAa,MAAQ,OAAO,EAAE,SAAS,WAClD,IAAM,MACG,EAAI,WAAW,MACxB,IAAM,EAAI,YAAY,IAGxB,EAAM,KAAK,CAAG;EACd,IAAM,IAAkB,EAAM,KAAK,GAAG;EAGtC,AADA,EAAe,GAAQ,CAAe,GACtC,EAAiB,IAAI;CACvB,GAEM,KAAuB,MAAgB;EAC3C,IAAI,CAAC,GAAK,OAAO,kBAAC,QAAD;GAAM,OAAO;IAAE,OAAO;IAAW,WAAW;IAAU,UAAU;GAAO;GAAG,UAAA;EAAU,CAAA;EACrG,IAAM,IAAS,GAAmB,CAAG,GAC/B,IAAQ,OAAO,YAAc,OAAe,OAAO,KAAK,UAAU,YAAY,UAAU,aAAa,EAAE,GACvG,IAAmB,CAAC;EAK1B,IAHI,EAAO,QAAM,EAAO,KAAK,IAAQ,MAAM,MAAM,GAC7C,EAAO,OAAK,EAAO,KAAK,IAAQ,MAAM,KAAK,GAC3C,EAAO,SAAO,EAAO,KAAK,IAAQ,MAAM,OAAO,GAC/C,EAAO,KAAK;GACd,IAAI,IAAI,EAAO,IAAI,YAAY;GAE/B,AADI,MAAM,aAAU,IAAI,IAAQ,aAAa,QAC7C,EAAO,KAAK,CAAC;EACf;EAEA,OACE,kBAAC,OAAD;GAAK,OAAO;IAAE,SAAS;IAAQ,KAAK;IAAO,YAAY;IAAU,UAAU;GAAO;GAC/E,UAAA,EAAO,KAAK,GAAG,MACd,kBAAC,OAAD;IAEE,OAAO;KACL,SAAS;KACT,YAAY;KACZ,gBAAgB;KAChB,SAAS;KACT,UAAU;KACV,YAAY;KACZ,YAAY;KACZ,OAAO;KACP,iBAAiB;KACjB,QAAQ;KACR,cAAc;KACd,WAAW;KACX,UAAU;KACV,WAAW;IACb;IAEC,UAAA;GACE,GAnBE,CAmBF,CACN;EACE,CAAA;CAET,GAEM,IAAQ,EAAY,KAAK,CAAC,CAAC,YAAY,GAEvC,IAAoB,QACnB,IACE,EAAU,QAAQ,MAAgB;EACvC,IAAM,IAAY,EAAE,YAAY,YAAY,CAAC,CAAC,SAAS,CAAK,GACtD,IAAc,EAAE,OAAO,YAAY,CAAC,CAAC,SAAS,CAAK,GACnD,IAAW,EAAE,QAAQ,YAAY,CAAC,CAAC,SAAS,CAAK;EACvD,OAAO,KAAa,KAAe;CACrC,CAAC,IANkB,GAOlB,CAAC,GAAW,CAAK,CAAC,GAEf,IAAiB,QACrB,CAAK,KACE,sDAAoE,SAAS,CAAK,KAClF,GAAQ,KAAiB,EAAc,YAAY,CAAC,CAAC,SAAS,CAAK,IACzE,CAAC,GAAO,CAAa,CAAC;CAEzB,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;IAA+B,UAAU;GAAS;GAAzO,UAAA;IAGE,kBAAC,OAAD;KAAK,OAAO;MAAE,SAAS;MAAa,cAAc;MAAiC,SAAS;MAAQ,gBAAgB;MAAiB,YAAY;MAAU,iBAAiB;KAAO;KAAnL,UAAA,CACE,kBAAC,MAAD;MAAI,OAAO;OAAE,QAAQ;OAAG,UAAU;OAAQ,YAAY;OAAK,OAAO;MAAoB;MAAG,UAAA;KAAY,CAAA,GACrG,kBAAC,UAAD;MAAQ,SAAS;MAAS,OAAO;OAAE,YAAY;OAAQ,QAAQ;OAAQ,QAAQ;OAAW,OAAO;OAAqB,SAAS;OAAQ,SAAS;MAAM;MACpJ,UAAA,kBAAC,GAAD,EAAG,MAAM,GAAK,CAAA;KACR,CAAA,CACL;;IAGL,kBAAC,OAAD;KAAK,OAAO;MAAE,SAAS;MAAa,cAAc;MAAiC,iBAAiB;KAAU;KAC5G,UAAA,kBAAC,OAAD;MAAK,OAAO,EAAE,UAAU,WAAW;MAAnC,UAAA;OACE,kBAAC,IAAD;QAAQ,MAAM;QAAI,OAAM;QAAoB,OAAO;SAAE,UAAU;SAAY,MAAM;SAAQ,KAAK;SAAO,WAAW;QAAmB;OAAI,CAAA;OACvI,kBAAC,SAAD;QACE,MAAK;QACL,aAAY;QACZ,OAAO;QACP,WAAW,MAAM,EAAe,EAAE,OAAO,KAAK;QAC9C,OAAO;SACL,OAAO;SACP,SAAS;SACT,QAAQ;SACR,cAAc;SACd,UAAU;SACV,WAAW;SACX,SAAS;SACT,iBAAiB;QACnB;OACD,CAAA;OACA,KACC,kBAAC,UAAD;QACE,eAAe,EAAe,EAAE;QAChC,OAAO;SACL,UAAU;SAAY,OAAO;SAAQ,KAAK;SAAO,WAAW;SAC5D,YAAY;SAAQ,QAAQ;SAAQ,QAAQ;SAAW,OAAO;SAAqB,SAAS;SAAQ,SAAS;QAC/G;QACA,OAAM;QAEN,UAAA,kBAAC,GAAD,EAAG,MAAM,GAAK,CAAA;OACR,CAAA;MAEP;;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;MAC7I,UAAA,CAAC,WAAW,oBAAoB,CAAC,CAAW,KAAI,MAAO;OACvD,IAAM,IAAa,MAAQ,uBAAwB,IAAQ,EAAkB,SAAS,OAAS,KAAS,IAAiB,IAAI;OAC7H,OACE,kBAAC,OAAD;QAEE,eAAe,EAAa,CAAG;QAC/B,OAAO;SACL,SAAS;SACT,QAAQ;SACR,iBAAiB,MAAc,IAAM,YAAY;SACjD,OAAO,MAAc,IAAM,mBAAmB;SAC9C,YAAY,MAAc,IAAM,MAAM;SACtC,UAAU;SACV,YAAY,MAAc,IAAM,6BAA6B;SAC7D,YAAY;SACZ,SAAS;SACT,gBAAgB;SAChB,YAAY;QACd;QAfF,UAAA,CAiBE,kBAAC,QAAD,EAAA,UAAO,EAAU,CAAA,GAChB,MAAe,QACd,kBAAC,QAAD;SAAM,OAAO;UACX,UAAU;UACV,SAAS;UACT,cAAc;UACd,iBAAiB,MAAc,IAAM,mBAAmB;UACxD,OAAO,MAAc,IAAM,SAAS;UACpC,YAAY;SACd;SACG,UAAA;QACG,CAAA,CAEL;OA7BE,GAAA,CA6BF;MAET,CAAC;KACE,CAAA,GAGL,kBAAC,OAAD;MAAK,OAAO;OAAE,MAAM;OAAG,WAAW;OAAQ,SAAS;MAAO;MAA1D,UAAA,CACG,MAAc,wBACb,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,OAAD;OAAK,OAAO;QAAE,SAAS;QAAQ,gBAAgB;QAAiB,YAAY;QAAU,cAAc;OAAO;OAA3G,UAAA,CACE,kBAAC,QAAD;QAAM,OAAO;SAAE,UAAU;SAAQ,OAAO;QAAoB;QACzD,UAAA,IAAQ,GAAG,EAAkB,OAAO,MAAM,EAAU,OAAO,cAAc,GAAG,EAAU,OAAO;OAC1F,CAAA,GACN,kBAAC,UAAD;QACE,SAAS;QACT,OAAO;SACL,SAAS;SACT,YAAY;SACZ,KAAK;SACL,YAAY;SACZ,QAAQ;SACR,cAAc;SACd,SAAS;SACT,UAAU;SACV,OAAO;SACP,QAAQ;QACV;QACA,OAAM;QAdR,UAAA,CAgBE,kBAAC,GAAD,EAAW,MAAM,GAAK,CAAA,GAAC,mBAEjB;OACL,CAAA,CAAA;MAEJ,CAAA,GAAA,EAAkB,WAAW,IAC5B,kBAAC,OAAD;OAAK,OAAO;QAAE,WAAW;QAAU,SAAS;QAAa,OAAO;QAAqB,UAAU;OAAO;OAAtG,UAAA;QACE,kBAAC,OAAD,EAAA,UAAA;SAAK;SAA8B;SAAY;QAAY,EAAA,CAAA;QAC1D,KACC,kBAAC,OAAD;SAAK,OAAO,EAAE,WAAW,MAAM;SAC7B,UAAA,kBAAC,UAAD;UACE,eAAe,EAAa,SAAS;UACrC,OAAO;WAAE,YAAY;WAAQ,QAAQ;WAAQ,OAAO;WAAkB,QAAQ;WAAW,UAAU;WAAQ,YAAY;WAAK,gBAAgB;UAAY;UACzJ,UAAA;SAEO,CAAA;QACL,CAAA;QAEP,kBAAC,UAAD;SACE,eAAe,EAAe,EAAE;SAChC,OAAO;UAAE,WAAW;UAAO,YAAY;UAAQ,QAAQ;UAAQ,OAAO;UAAkB,QAAQ;UAAW,UAAU;UAAQ,YAAY;SAAI;SAC9I,UAAA;QAEO,CAAA;OACL;MAEL,CAAA,IAAA,kBAAC,SAAD;OAAO,OAAO;QAAE,OAAO;QAAQ,gBAAgB;QAAY,UAAU;OAAS;OAA9E,UAAA,CACE,kBAAC,SAAD,EAAA,UACE,kBAAC,MAAD;QAAI,OAAO;SAAE,cAAc;SAAiC,WAAW;SAAQ,OAAO;SAAqB,UAAU;QAAO;QAA5H,UAAA;SACE,kBAAC,MAAD;UAAI,OAAO;WAAE,SAAS;WAAY,YAAY;WAAK,OAAO;UAAQ;UAAG,UAAA;SAAY,CAAA;SACjF,kBAAC,MAAD;UAAI,OAAO;WAAE,SAAS;WAAY,YAAY;UAAI;UAAG,UAAA;SAAe,CAAA;SACpE,kBAAC,MAAD;UAAI,OAAO;WAAE,SAAS;WAAY,YAAY;WAAK,OAAO;WAAQ,WAAW;UAAS;UAAG,UAAA;SAAU,CAAA;QACjG;OACC,CAAA,EAAA,CAAA,GACP,kBAAC,SAAD,EAAA,UACG,EAAkB,KAAK,MACtB,kBAAC,MAAD;QAAmB,OAAO,EAAE,cAAc,oBAAoB;QAA9D,UAAA;SACE,kBAAC,MAAD;UAAI,OAAO,EAAE,SAAS,YAAY;UAC/B,UAAA,MAAkB,EAAE,SACnB,kBAAC,OAAD;WAAK,OAAO;YAAE,SAAS;YAAQ,YAAY;YAAU,KAAK;WAAM;WAAhE,UAAA,CACE,kBAAC,SAAD;YACE,WAAA;YACA,MAAK;YACL,aAAY;YACZ,YAAY,MAAM,EAAc,GAAG,EAAE,MAAM;YAC3C,cAAc,EAAiB,IAAI;YACnC,OAAO;aACL,SAAS;aACT,OAAO;aACP,QAAQ;aACR,cAAc;aACd,SAAS;aACT,UAAU;aACV,iBAAiB;YACnB;WACD,CAAA,GACD,kBAAC,UAAD;YACE,cAAc,MAAM;aAAsB,AAApB,EAAE,eAAe,GAAG,EAAiB,IAAI;YAAG;YAClE,OAAO;aAAE,YAAY;aAAQ,QAAQ;aAAQ,QAAQ;aAAW,OAAO;aAAW,SAAS;aAAQ,SAAS;YAAM;YAClH,OAAM;YAEN,UAAA,kBAAC,GAAD,EAAG,MAAM,GAAK,CAAA;WACR,CAAA,CACL;UAEL,CAAA,IAAA,EAAoB,EAAE,OAAO;SAE7B,CAAA;SACJ,kBAAC,MAAD;UAAI,OAAO;WAAE,SAAS;WAAa,OAAO;UAAU;UAAI,UAAA,EAAE;SAAgB,CAAA;SAC1E,kBAAC,MAAD;UAAI,OAAO;WAAE,SAAS;WAAa,WAAW;UAAS;UACpD,UAAA,MAAkB,EAAE,SACnB,kBAAC,QAAD;WAAM,OAAO;YAAE,UAAU;YAAQ,OAAO;YAAkB,YAAY;WAAI;WAAG,UAAA;UAAe,CAAA,IAE5F,kBAAC,UAAD;WACE,eAAe,EAAiB,EAAE,MAAM;WACxC,OAAO;YACL,YAAY;YACZ,QAAQ;YACR,cAAc;YACd,QAAQ;YACR,OAAO;YACP,SAAS;YACT,SAAS;YACT,YAAY;YACZ,KAAK;YACL,UAAU;WACZ;WACA,OAAM;WAdR,UAAA,CAgBE,kBAAC,IAAD,EAAO,MAAM,GAAK,CAAA,GAAC,OACb;;SAER,CAAA;QACF;OAzDK,GAAA,EAAE,MAyDP,CACL,EACI,CAAA,CACF;MAEN,CAAA,CAAA,EAAA,CAAA,GAGN,MAAc,aACb,kBAAC,OAAD,EAAA,UACG,KAAS,CAAC,IACT,kBAAC,OAAD;OAAK,OAAO;QAAE,WAAW;QAAU,SAAS;QAAa,OAAO;QAAqB,UAAU;OAAO;OAAtG,UAAA;QACE,kBAAC,OAAD,EAAA,UAAA;SAAK;SAAqC;SAAY;QAAY,EAAA,CAAA;QACjE,EAAkB,SAAS,KAC1B,kBAAC,OAAD;SAAK,OAAO,EAAE,WAAW,MAAM;SAC7B,UAAA,kBAAC,UAAD;UACE,eAAe,EAAa,oBAAoB;UAChD,OAAO;WAAE,YAAY;WAAQ,QAAQ;WAAQ,OAAO;WAAkB,QAAQ;WAAW,UAAU;WAAQ,YAAY;WAAK,gBAAgB;UAAY;UAF1J,UAAA;WAIG,EAAkB;WAAO;WAAmB,EAAkB,SAAS,IAAI,MAAM;WAAG;UAC/E;;QACL,CAAA;QAEP,kBAAC,UAAD;SACE,eAAe,EAAe,EAAE;SAChC,OAAO;UAAE,WAAW;UAAO,YAAY;UAAQ,QAAQ;UAAQ,OAAO;UAAkB,QAAQ;UAAW,UAAU;UAAQ,YAAY;SAAI;SAC9I,UAAA;QAEO,CAAA;OACL;MAEL,CAAA,IAAA,kBAAC,OAAD;OAAK,OAAO,EAAE,WAAW,MAAM;OAA/B,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;SAAO;SAAG,UAAA;QAE/E,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;UACT,WAAW;SACb;QACD,CAAA;QACA,KACC,kBAAC,OAAD;SAAK,OAAO;UAAE,SAAS;UAAQ,YAAY;UAAU,KAAK;UAAO,WAAW;UAAO,OAAO;UAAW,UAAU;SAAS;SAAxH,UAAA;UACE,kBAAC,GAAD,EAAO,MAAM,GAAK,CAAA;UAAC;UAA2B;UAAc;SACzD;;OAEJ;MAEJ,CAAA,EAAA,CAAA,CAEJ;KACF,CAAA,CAAA;;GAEF;;CACF,CAAA;AAET;;;AC/XA,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,GAAD;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,KAAb,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,GChCM,KAAK,MAAuB,MAAM,IAAI,IAAI;AAEhD,SAAS,GAAe,GAAU,GAAkB;CAClD,OAAO;EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE;EAAG,GAAG,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE;CAAE;AACtF;AAEA,SAAS,GAAsB,GAAU,GAAkB;CACzD,IAAM,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE;CACjC,OAAO;EACL,GAAG,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC;EAC9D,GAAG,GAAG,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC;CACjE;AACF;AAGA,SAAgB,GAAmB,GAAoB,GAA2C,GAA8B;CAC9H,IAAM,IAAW,GAAkB,CAAM,GACnC,CAAC,GAAI,GAAI,GAAI,KAAM,GACnB,KAAW,IAAK,KAAM,GACtB,KAAW,IAAK,KAAM,GAExB,GAAiB,GAAiB,GAAiB;CACvD,QAAQ,GAAR;EACE,KAAK;GAA6C,AAAxC,IAAU,IAAI,IAAU,GAAG,IAAU,GAAG,IAAU;GAAG;EAC/D,KAAK;GAA2C,AAAvC,IAAU,GAAG,IAAU,GAAG,IAAU,GAAG,IAAU;GAAG;EAC7D,KAAK;GAA8C,AAAzC,IAAU,GAAG,IAAU,IAAI,IAAU,IAAI,IAAU;GAAG;EAChE,SAAgD,AAAvC,IAAU,GAAG,IAAU,GAAG,IAAU,GAAG,IAAU;CAC5D;CAEA,IAAI,GAAuB,GAAuB,GAAe;CACjE,AAAI,MAAY,KACd,IAAgB,KAAK,IAAI,IAAU,CAAE,GACrC,IAAgB,KAAK,IAAI,IAAU,CAAE,GACrC,IAAQ,KAAK,IAAI,IAAK,CAAE,GACxB,IAAS,KAAK,IAAI,IAAK,CAAE,MAEzB,IAAgB,KAAK,IAAI,IAAU,CAAE,GACrC,IAAgB,KAAK,IAAI,IAAU,CAAE,GACrC,IAAQ,IAAK,GACb,IAAS,IAAK;CAGhB,IAAM,IAAoB;EACxB;EAAS;EAAS;EAAS;EAC3B,IAAgB,IAAU,IAAU,IAAU;EAC9C,IAAgB,IAAU,IAAU,IAAU;CAChD;CAEA,OAAO;EAAE;EAAY,SAAS;GAAC;GAAI;GAAI;GAAI;EAAE;EAAG,QAAQ;EAAU;EAAO;EAAQ;CAAU;AAC7F;AAEA,SAAgB,EAAiB,GAAkC;CACjE,IAAM,IAAO,EAAK;CAClB,OAAO,GAAmB,EAAK,YAAY;EAAC,EAAK;EAAI,EAAK;EAAI,EAAK;EAAI,EAAK;CAAE,GAAG,EAAK,MAAM;AAC9F;AAGA,SAAgB,GAAuB,GAA0B;CAC/D,IAAM,oBAAQ,IAAI,IAAmC;CACrD,QAAQ,MAA8C;EACpD,IAAM,IAAI,KAAK,IAAI,GAAG,KAAK,IAAI,EAAO,UAAU,CAAU,CAAC,GACvD,IAAI,EAAM,IAAI,CAAC;EAKnB,OAJK,MACH,IAAI,EAAO,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAgB,GAC3C,EAAM,IAAI,GAAG,CAAC,IAET;CACT;AACF;AAMA,SAAgB,GAAW,GAAiB,GAAiB;CAC3D,OAAO,GAAsB,GAAG,EAAE,SAAS;AAC7C;AAEA,SAAgB,GAAa,GAAiB,GAAiB;CAC7D,OAAO,GAAe,GAAG,EAAE,SAAS;AACtC;AAGA,SAAgB,GAAU,GAAiB,GAAkB;CAC3D,IAAM,IAAI,GAAW,GAAG;EAAE,GAAG,EAAE;EAAG,GAAG,EAAE;CAAE,CAAC,GACpC,IAAI,GAAW,GAAG;EAAE,GAAG,EAAE,IAAI,EAAE;EAAO,GAAG,EAAE,IAAI,EAAE;CAAO,CAAC;CAC/D,OAAO;EAAC,KAAK,IAAI,EAAE,GAAG,EAAE,CAAC;EAAG,KAAK,IAAI,EAAE,GAAG,EAAE,CAAC;EAAG,KAAK,IAAI,EAAE,GAAG,EAAE,CAAC;EAAG,KAAK,IAAI,EAAE,GAAG,EAAE,CAAC;CAAC;AACxF;AAGA,SAAgB,EAAY,GAAiB,GAAkB;CAC7D,IAAM,IAAI,GAAa,GAAG;EAAE,GAAG,EAAE;EAAI,GAAG,EAAE;CAAG,CAAC,GACxC,IAAI,GAAa,GAAG;EAAE,GAAG,EAAE;EAAI,GAAG,EAAE;CAAG,CAAC;CAG9C,OAAO;EAAE,GAFC,KAAK,IAAI,EAAE,GAAG,EAAE,CAEjB;EAAG,GADF,KAAK,IAAI,EAAE,GAAG,EAAE,CACd;EAAG,OAAO,KAAK,IAAI,EAAE,IAAI,EAAE,CAAC;EAAG,QAAQ,KAAK,IAAI,EAAE,IAAI,EAAE,CAAC;CAAE;AACzE;AAEA,SAAgB,EAAU,GAAiB,GAA0B;CACnE,OAAO,EAAO,KAAK,MAAM,GAAW,GAAG,CAAC,CAAC;AAC3C;AAEA,SAAgB,GAAY,GAAiB,GAA0B;CACrE,OAAO,EAAO,KAAK,MAAM,GAAa,GAAG,CAAC,CAAC;AAC7C;AAMA,SAAgB,GAAiB,GAAiB,GAAmB;CACnE,IAAM,CAAC,GAAK,GAAK,GAAK,KAAO,GAAU,GAAG,CAAC;CAC3C,OAAO;EAAC;EAAK;EAAK;EAAK;EAAK;EAAK;EAAK;EAAK;CAAG;AAChD;AAGA,SAAgB,GAAkB,GAAiB,GAAyB;CAC1E,IAAM,IAAgB,CAAC;CACvB,KAAK,IAAI,IAAI,GAAG,IAAI,IAAI,EAAM,QAAQ,KAAK,GAAG;EAC5C,IAAM,IAAK;GAAC,EAAM;GAAI,EAAM,IAAI;GAAI,EAAM,IAAI;GAAI,EAAM,IAAI;EAAE,GACxD,IAAK;GAAC,EAAM,IAAI;GAAI,EAAM,IAAI;GAAI,EAAM,IAAI;GAAI,EAAM,IAAI;EAAE;EAClE,EAAM,KAAK,EAAY,GAAG;GAAC,KAAK,IAAI,GAAG,CAAE;GAAG,KAAK,IAAI,GAAG,CAAE;GAAG,KAAK,IAAI,GAAG,CAAE;GAAG,KAAK,IAAI,GAAG,CAAE;EAAC,CAAC,CAAC;CACjG;CACA,OAAO;AACT;AAEA,SAAgB,GAAW,GAAqB;CAC9C,IAAI,EAAM,WAAW,GAAG,OAAO;EAAE,GAAG;EAAG,GAAG;EAAG,OAAO;EAAG,QAAQ;CAAE;CACjE,IAAM,IAAK,KAAK,IAAI,GAAG,EAAM,KAAK,MAAM,EAAE,CAAC,CAAC,GACtC,IAAK,KAAK,IAAI,GAAG,EAAM,KAAK,MAAM,EAAE,CAAC,CAAC,GACtC,IAAK,KAAK,IAAI,GAAG,EAAM,KAAK,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,GAChD,IAAK,KAAK,IAAI,GAAG,EAAM,KAAK,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC;CACvD,OAAO;EAAE,GAAG;EAAI,GAAG;EAAI,OAAO,IAAK;EAAI,QAAQ,IAAK;CAAG;AACzD;AAGA,IAAa,MAAO,OAAuB,KAAK,MAAM,IAAI,GAAI,IAAI,IAAA,CAAM,SAAS,GChKpE,KAAmB,UAqB1B,MAAY,MAA4B;CAC5C,IAAM,IAAO,KAAO,kBAAkB,KAAK,CAAG,IAAI,IAAM,WAClD,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,SAAS,GAAS,GAAc,GAAkB,GAA4B;CAC5E,IAAM,IAAkB,IAAW,KAC7B,IAAkB,KAAK,IAAI,GAAG,KAAK,MAAM,IAAW,CAAe,CAAC,GACpE,IAAa,EAAK,MAAM,IAAI,GAC5B,IAAkB,CAAC;CAEzB,KAAK,IAAM,KAAK,GAAY;EAC1B,IAAI,CAAC,GAAG;GACN,EAAM,KAAK,EAAE;GACb;EACF;EACA,IAAM,IAAQ,EAAE,MAAM,KAAK,GACvB,IAAc;EAElB,KAAK,IAAM,KAAQ,GACjB,AAAK,KAEO,IAAc,MAAM,EAAA,CAAM,UAAU,IAC9C,KAAe,MAAM,KAErB,EAAM,KAAK,CAAW,GACtB,IAAc,KALd,IAAc;EAQlB,AAAI,KACF,EAAM,KAAK,CAAW;CAE1B;CACA,OAAO;AACT;AAEA,eAAe,GAAe,GAAqB,GAAe,GAAiB,GAAiB,GAAoC;CACtI,IAAM,IAAQ,GAAS,EAAI,KAAK,GAC1B,IAAU,EAAI,WAAW,GACzB,IAAc,EAAI,eAAe,GAEjC,CAAC,GAAK,GAAK,GAAK,KADT,GAAU,GAAG;EAAE,GAAG,EAAI;EAAG,GAAG,EAAI;EAAG,OAAO,EAAI;EAAO,QAAQ,EAAI;CAAO,CACxD,GACvB,IAAI,IAAM,GACV,IAAI,IAAM,GAGV,IAAa,GAAQ,EAAE,MAAM,GAC7B,KAAmB,GAAW,GAAW,MAAiB,GAAW,GAAG;EAAE;EAAG,GAAG,IAAI;CAAK,CAAC;CAEhG,QAAQ,EAAI,MAAZ;EACE,KAAK;GACH,EAAK,cAAc;IAAE,GAAG;IAAK,GAAG;IAAK,OAAO;IAAG,QAAQ;IAAG;IAAO;IAAS,aAAa;IAAO,aAAa;IAAa,eAAe;GAAE,CAAC;GAC1I;EACF,KAAK;GACH,EAAK,YAAY;IAAE,GAAG,IAAM,IAAI;IAAG,GAAG,IAAM,IAAI;IAAG,QAAQ,IAAI;IAAG,QAAQ,IAAI;IAAG;IAAO;IAAS,aAAa;IAAO,aAAa;IAAa,eAAe;GAAE,CAAC;GACjK;EACF,KAAK,aAAa;GAChB,IAAM,IAAQ,EAAI,SAAS,EAAI,MAAM,SAAS,IAAI,EAAI,QAAQ,CAAC;IAAE,GAAG,EAAI;IAAG,GAAG,EAAI;IAAG,OAAO,EAAI;IAAO,QAAQ,EAAI;GAAO,CAAC;GAC3H,KAAK,IAAM,KAAK,GAAO;IACrB,IAAM,CAAC,GAAI,GAAI,GAAI,KAAM,GAAU,GAAG,CAAC;IACvC,EAAK,cAAc;KAAE,GAAG;KAAI,GAAG;KAAI,OAAO,IAAK;KAAI,QAAQ,IAAK;KAAI;KAAO,SAAS,IAAU,IAAI,IAAU;KAAK,WAAW,GAAU;IAAS,CAAC;GAClJ;GACA;EACF;EACA,KAAK,aAAa;GAChB,IAAM,IAAQ,EAAI,SAAS,EAAI,MAAM,SAAS,IAAI,EAAI,QAAQ,CAAC;IAAE,GAAG,EAAI;IAAG,GAAG,EAAI;IAAG,OAAO,EAAI;IAAO,QAAQ,EAAI;GAAO,CAAC;GAC3H,KAAK,IAAM,KAAK,GAAO;IACrB,IAAM,CAAC,GAAG,KAAK,EAAU,GAAG,CAC1B;KAAE,GAAG,EAAE;KAAG,GAAG,EAAE,IAAI,EAAE,SAAS;IAAI,GAClC;KAAE,GAAG,EAAE,IAAI,EAAE;KAAO,GAAG,EAAE,IAAI,EAAE,SAAS;IAAI,CAC9C,CAAC;IACD,EAAK,SAAS;KAAE,OAAO;KAAG,KAAK;KAAG;KAAO;KAAS,WAAW,KAAe;IAAI,CAAC;GACnF;GACA;EACF;EACA,KAAK,aAAa;GAChB,IAAM,IAAQ,EAAI,SAAS,EAAI,MAAM,SAAS,IAAI,EAAI,QAAQ,CAAC;IAAE,GAAG,EAAI;IAAG,GAAG,EAAI;IAAG,OAAO,EAAI;IAAO,QAAQ,EAAI;GAAO,CAAC;GAC3H,KAAK,IAAM,KAAK,GAAO;IACrB,IAAM,CAAC,GAAG,KAAK,EAAU,GAAG,CAC1B;KAAE,GAAG,EAAE;KAAG,GAAG,EAAE,IAAI,EAAE,SAAS;IAAE,GAChC;KAAE,GAAG,EAAE,IAAI,EAAE;KAAO,GAAG,EAAE,IAAI,EAAE,SAAS;IAAE,CAC5C,CAAC;IACD,EAAK,SAAS;KAAE,OAAO;KAAG,KAAK;KAAG;KAAO;KAAS,WAAW,KAAe;IAAI,CAAC;GACnF;GACA;EACF;EACA,KAAK,YAAY;GACf,IAAM,IAAQ,EAAI,SAAS,EAAI,MAAM,SAAS,IAAI,EAAI,QAAQ,CAAC;IAAE,GAAG,EAAI;IAAG,GAAG,EAAI;IAAG,OAAO,EAAI;IAAO,QAAQ,EAAI;GAAO,CAAC;GAC3H,KAAK,IAAM,KAAK,GAAO;IACrB,IAAM,IAAc,CAAC,GAEjB,IAAK;IACT,KAAK,IAAI,IAAO,EAAE,GAAG,KAAQ,EAAE,IAAI,EAAE,OAAO,KAAQ,GAElD,AADA,EAAY,KAAK;KAAE,GAAG;KAAM,GAAG,EAAE,IAAI,EAAE,UAAU,IAAK,IAAI;IAAG,CAAC,GAC9D,IAAK,CAAC;IAER,IAAI,EAAY,UAAU,GAAG;KAC3B,IAAM,IAAS,EAAU,GAAG,CAAW;KACvC,KAAK,IAAI,IAAI,GAAG,IAAI,EAAO,QAAQ,KACjC,EAAK,SAAS;MAAE,OAAO,EAAO,IAAI;MAAI,KAAK,EAAO;MAAI;MAAO;MAAS,WAAW,KAAe;KAAI,CAAC;IAEzG;GACF;GACA;EACF;EACA,KAAK;EACL,KAAK,SAAS;GACZ,IAAM,IAAM,EAAI,UAAU,EAAI,OAAO,UAAU,IAAI,EAAI,SAAS,CAAC;IAAE,GAAG,EAAI;IAAG,GAAG,EAAI;GAAE,GAAG;IAAE,GAAG,EAAI,IAAI,EAAI;IAAO,GAAG,EAAI,IAAI,EAAI;GAAO,CAAC,GAClI,CAAC,GAAG,KAAK,EAAU,GAAG,CAAC,EAAI,IAAI,EAAI,EAAE,CAAC;GAE5C,IADA,EAAK,SAAS;IAAE,OAAO;IAAG,KAAK;IAAG;IAAO;IAAS,WAAW;GAAY,CAAC,GACtE,EAAI,SAAS,SAAS;IAExB,IAAM,IAAK,EAAI,IAAI,IAAK,EAAI,IACtB,IAAQ,KAAK,MAAM,EAAG,IAAI,EAAG,GAAG,EAAG,IAAI,EAAG,CAAC,GAC3C,IAAU,KAAK,GAGf,CAAC,GAAK,KAAO,EAAU,GAAG,CAAC;KAFpB,GAAG,EAAG,IAAI,IAAU,KAAK,IAAI,IAAQ,KAAK,KAAK,CAAC;KAAG,GAAG,EAAG,IAAI,IAAU,KAAK,IAAI,IAAQ,KAAK,KAAK,CAAC;IAE/E,GAAI;KADxB,GAAG,EAAG,IAAI,IAAU,KAAK,IAAI,IAAQ,KAAK,KAAK,CAAC;KAAG,GAAG,EAAG,IAAI,IAAU,KAAK,IAAI,IAAQ,KAAK,KAAK,CAAC;IAC3E,CAAE,CAAC;IAExC,AADA,EAAK,SAAS;KAAE,OAAO;KAAK,KAAK;KAAG;KAAO;KAAS,WAAW;IAAY,CAAC,GAC5E,EAAK,SAAS;KAAE,OAAO;KAAK,KAAK;KAAG;KAAO;KAAS,WAAW;IAAY,CAAC;GAC9E;GACA;EACF;EACA,KAAK,YAAY;GACf,IAAM,IAAU,EAAI,WAAW,EAAI,QAAQ,SAAS,IAAI,EAAI,UAAU,EAAI,SAAS,CAAC,EAAI,MAAM,IAAI,CAAC;GACnG,KAAK,IAAM,KAAM,GAAS;IACxB,IAAM,IAAS,EAAU,GAAG,CAAE;IAC9B,KAAK,IAAI,IAAI,GAAG,IAAI,EAAO,QAAQ,KACjC,EAAK,SAAS;KAAE,OAAO,EAAO,IAAI;KAAI,KAAK,EAAO;KAAI;KAAO;KAAS,WAAW;KAAa,SAAS;IAAE,CAAC;GAE9G;GACA;EACF;EACA,KAAK,QAAQ;GACX,IAAI,CAAC,EAAI,MAAM;GACf,IAAM,IAAW,EAAI,SAAS,EAAI,QAAQ,IAAI,EAAI,QAAQ,KACpD,IAAQ,GAAS,EAAI,MAAM,GAAU,EAAE;GAE7C,KAAK,IAAI,IAAI,GAAG,IAAI,EAAM,QAAQ,KAAK;IACrC,IAAI,CAAC,EAAM,IAAI;IACf,IAAM,IAAI,EAAgB,EAAI,GAAG,EAAI,IAAI,IAAI,IAAY,EAAE;IAC3D,EAAK,SAAS,EAAM,IAAI;KAAE,GAAG,EAAE;KAAG,GAAG,EAAE;KAAG,MAAM;KAAI;KAAO;KAAS,QAAQ;IAAW,CAAC;GAC1F;GACA;EACF;EACA,KAAK,QAAQ;GACX,IAAM,CAAC,GAAK,GAAK,GAAK,KAAO,GAAU,GAAG;IAAE,GAAG,EAAI;IAAG,GAAG,EAAI;IAAG,OAAO;IAAI,QAAQ;GAAG,CAAC;GAEvF,IADA,EAAK,cAAc;IAAE,GAAG;IAAK,GAAG;IAAK,OAAO,IAAM;IAAK,QAAQ,IAAM;IAAK,OAAO,EAAI,GAAG,KAAM,EAAG;IAAG,aAAa;IAAO,aAAa;GAAY,CAAC,GAC9I,EAAI,MAAM;IACZ,IAAM,IAAI,EAAgB,EAAI,IAAI,IAAI,EAAI,GAAG,EAAE;IAC/C,EAAK,SAAS,EAAI,MAAM;KAAE,GAAG,EAAE;KAAG,GAAG,EAAE;KAAG,MAAM;KAAI;KAAO;KAAS,QAAQ;IAAW,CAAC;GAC1F;GACA;EACF;EACA,KAAK,WAAW;GACd,IAAM,IAAM,EAAI,UAAU,EAAI,OAAO,UAAU,IAAI,EAAI,SAAS,CAAC;IAAE,GAAG,EAAI;IAAG,GAAG,EAAI;GAAE,GAAG;IAAE,GAAG,EAAI;IAAG,GAAG,EAAI;GAAE,CAAC,GACzG,CAAC,GAAG,KAAK,EAAU,GAAG,CAAC,EAAI,IAAI,EAAI,EAAE,CAAC;GAE5C,IADA,EAAK,SAAS;IAAE,OAAO;IAAG,KAAK;IAAG;IAAO;IAAS,WAAW;GAAY,CAAC,GACtE,EAAI,MAAM;IACZ,IAAM,IAAO,EAAI,KAAK,SAAS,IAAI,IAC7B,CAAC,GAAK,GAAK,GAAK,KAAO,GAAU,GAAG;KAAE,GAAG,EAAI,EAAE,CAAC;KAAG,GAAG,EAAI,EAAE,CAAC;KAAG,OAAO;KAAM,QAAQ;IAAG,CAAC;IAC/F,EAAK,cAAc;KAAE,GAAG;KAAK,GAAG;KAAK,OAAO,IAAM;KAAK,QAAQ,IAAM;KAAK,OAAO,EAAI,GAAG,GAAG,CAAC;KAAG,aAAa;KAAO,aAAa;IAAY,CAAC;IAC7I,IAAM,IAAI,EAAgB,EAAI,EAAE,CAAC,IAAI,IAAI,EAAI,EAAE,CAAC,IAAI,GAAG,EAAE;IACzD,EAAK,SAAS,EAAI,MAAM;KAAE,GAAG,EAAE;KAAG,GAAG,EAAE;KAAG,MAAM;KAAI;KAAO;KAAS,QAAQ;IAAW,CAAC;GAC1F;GACA;EACF;EACA,KAAK,aAAa;GAChB,IAAI,CAAC,EAAI,UAAU;GACnB,IAAM,IAAa,MAAM,MAAM,EAAI,QAAQ,CAAC,CAAC,MAAM,MAAQ,EAAI,YAAY,CAAC,GACtE,IAAQ,EAAI,SAAS,WAAW,iBAAiB,KAAK,EAAI,SAAS,WAAW,gBAAgB,IAChG,MAAM,EAAO,SAAS,CAAU,IAChC,MAAM,EAAO,SAAS,CAAU;GACpC,EAAK,UAAU,GAAO;IAAE,GAAG;IAAK,GAAG;IAAK,OAAO;IAAG,QAAQ;IAAG,QAAQ;GAAW,CAAC;GACjF;EACF;EACA,KAAK,iCAAiC;GACpC,IAAM,IAAU,EAAI,YAAY,IAAI,KAAK,EAAI,SAAS,CAAC,CAAC,eAAe,OAAO,qBAAI,IAAI,KAAK,EAAA,CAAE,eAAe,OAAO,GAC7G,IAAQ,IAAI;GAOlB,AANA,EAAK,cAAc;IAAE,GAAG;IAAK,GAAG;IAAK,OAAO;IAAG,QAAQ;IAAG,OAAO,EAAI,GAAG,GAAG,CAAC;IAAG,aAAa,EAAI,MAAM,KAAK,MAAM,KAAK,MAAM,GAAG;IAAG,aAAa;GAAE,CAAC,GAClJ,EAAK,SAAS;IAAE,OAAO;KAAE,GAAG,IAAM;KAAO,GAAG;IAAI;IAAG,KAAK;KAAE,GAAG,IAAM;KAAO,GAAG,IAAM;IAAE;IAAG,OAAO,EAAI,MAAM,KAAK,MAAM,KAAK,MAAM,GAAG;IAAG,WAAW;GAAE,CAAC,GACnJ,EAAK,YAAY,qDAAqD;IAAE,GAAG,IAAM,IAAQ,IAAI;IAAI,GAAG,IAAM,IAAI,IAAI;IAAI,aAAa,EAAI,IAAI,KAAK,MAAM,KAAK,MAAM,GAAG;IAAG,aAAa;IAAG,OAAO;GAAE,CAAC,GACjM,EAAK,YAAY,sBAAsB;IAAE,GAAG,IAAM,IAAQ,IAAI;IAAI,GAAG,IAAM,IAAI,IAAI;IAAI,aAAa,EAAI,IAAI,KAAK,MAAM,KAAK,MAAM,GAAG;IAAG,aAAa;IAAG,OAAO;GAAE,CAAC,GAClK,EAAK,SAAS,uBAAuB,EAAI,UAAU,KAAc,oBAAoB;IAAE,GAAG,IAAM,IAAQ;IAAI,GAAG,IAAM,IAAI;IAAI,MAAM;IAAI,OAAO,EAAI,KAAK,KAAK,KAAK,KAAK,KAAK,GAAG;GAAE,CAAC,GACjL,EAAK,SAAS,SAAS,KAAW;IAAE,GAAG,IAAM,IAAQ;IAAI,GAAG,IAAM,IAAI;IAAI,MAAM;IAAG,OAAO,EAAI,KAAK,KAAK,KAAK,KAAK,KAAK,GAAG;GAAE,CAAC,GAC7H,EAAK,SAAS,6BAA6B;IAAE,GAAG,IAAM,IAAQ;IAAI,GAAG,IAAM,IAAI;IAAI,MAAM;IAAG,OAAO,EAAI,KAAK,KAAK,KAAK,KAAK,KAAK,GAAG;GAAE,CAAC;GACtI;EACF;EAGA,SACE;CACJ;AACF;AAEA,eAAe,GAAc,GAAqB,GAAqC;CACrF,IAAM,IAAU,GAAS,EAAG,SAAS,SAAS,GACxC,IAAY,EAAG,WAAW,KAC1B,IAAgB,MAAM,EAAO,UAAU,GAAc,SAAS,GAC9D,IAAQ,CAAC,KAAK,KAAK,GACnB,IAAO,KAAK,IAAI,CAAK,GACrB,IAAO,KAAK,IAAI,CAAK;CAE3B,KAAK,IAAM,KAAQ,EAAO,SAAS,GAAG;EACpC,IAAM,EAAE,UAAO,cAAW,EAAK,QAAQ;EACvC,IAAI,EAAG,SAAS,UAAU;GACxB,IAAM,IAAW,EAAG,QAAQ,IAEtB,IAAK,CADO,EAAc,kBAAkB,EAAG,MAAM,CAC/C,IAAY,GAClB,IAAK,CAAC,IAAW;GACvB,EAAK,SAAS,EAAG,MAAM;IACrB,GAAG,IAAQ,KAAK,IAAK,IAAO,IAAK;IACjC,GAAG,IAAS,KAAK,IAAK,IAAO,IAAK;IAClC,MAAM;IAAU,MAAM;IAAe,OAAO;IAAS,SAAS;IAAW,QAAQ,GAAQ,GAAG;GAC9F,CAAC;EACH,OAAO;GACL,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;GACnC,KAAK,IAAI,IAAI,CAAC,GAAQ,IAAI,IAAS,GAAG,KAAK,KAAO;IAChD,IAAM,IAAU,KAAK,IAAI,IAAI,GAAK,IAAI,KAAM,IAAQ;IACpD,KAAK,IAAI,IAAI,CAAC,GAAO,IAAI,IAAQ,GAAG,KAAK,GACvC,EAAK,SAAS,EAAG,MAAM;KAAE,GAAG,IAAI,IAAS;KAAW,GAAG,IAAI;KAAW,MAAM;KAAU,MAAM;KAAe,OAAO;KAAS,SAAS;KAAW,QAAQ,GAAQ,GAAG;IAAE,CAAC;GAEzK;EACF;CACF;AACF;AAEA,eAAe,EAAoB,GAAqB,GAA+C;CACrG,IAAM,IAAa,MAAM,EAAO,KAAK,GAC/B,IAAc,GAAS,YAAY;EAAE,MAAM;EAAY,GAAG,GAAkB;CAAE,CAAC,GAC/E,IAAY,MAAM,EAAY,SAC9B,IAAe,MAAM,GAAY,OAAO;CAE9C,IAAI;EACF,KAAK,IAAI,IAAI,GAAG,KAAK,EAAU,UAAU,KAAK;GAC5C,IAAM,IAAiB,EAAW,QAAQ,MAAM,EAAE,cAAc,CAAC;GACjE,IAAI,EAAe,SAAS,GAAG;IAC7B,IAAM,IAAa,MAAM,EAAU,QAAQ,CAAC,GAEtC,IAAW,EAAW,YAAY,EAAE,OAAO,EAAY,CAAC,GACxD,IAAS,SAAS,cAAc,QAAQ;IAE9C,AADA,EAAO,QAAQ,EAAS,OACxB,EAAO,SAAS,EAAS;IACzB,IAAM,IAAM,EAAO,WAAW,IAAI;IAClC,IAAI,GAAK;KAGP,AAFA,MAAM,EAAW,OAAO;MAAE,eAAe;MAAK;MAAQ;KAAS,CAAC,CAAC,CAAC,SAClE,EAAI,KAAK,GACT,EAAI,YAAY;KAChB,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;KAEF,EAAI,QAAQ;KACZ,IAAM,IAAa,EAAO,UAAU,cAAc,GAAI,GAChD,IAAW,MAAM,MAAM,CAAU,CAAC,CAAC,MAAM,MAAQ,EAAI,YAAY,CAAC,GAClE,IAAW,MAAM,EAAa,SAAS,CAAQ,GAC/C,IAAa,EAAW,YAAY,EAAE,OAAO,EAAE,CAAC;KAItD,AAFA,EAD6B,QAAQ,CAAC,EAAW,OAAO,EAAW,MAAM,CACzE,CAAA,CAAQ,UAAU,GAAU;MAAE,GAAG;MAAG,GAAG;MAAG,OAAO,EAAW;MAAO,QAAQ,EAAW;KAAO,CAAC,GAC9F,EAAO,QAAQ,GACf,EAAO,SAAS;IAClB;IACA,EAAW,QAAQ;GACrB,OAAO;IACL,IAAM,CAAC,KAAc,MAAM,EAAa,UAAU,GAAQ,CAAC,IAAI,CAAC,CAAC;IACjE,EAAa,QAAQ,CAAU;GACjC;GACA,AAAI,IAAI,KAAM,KAAG,MAAM,IAAI,SAAS,MAAY,WAAW,GAAS,CAAC,CAAC;EACxE;CACF,UAAU;EACR,MAAM,EAAY,QAAQ,CAAC,CAAC,YAAY,CAAC,CAAC;CAC5C;CACA,OAAO;AACT;AAEA,eAAsB,GAAc,GAAoB,IAAyB,CAAC,GAAwB;CACxG,AAAI,EAAQ,cACV,QAAQ,KAAK,oIAAoI;CAGnJ,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,GAAY,KAAK,GAAa,EAAE,kBAAkB,GAAK,CAAC,GACvE,IAAQ,EAAO,SAAS,GACxB,IAAO,EAAQ,uBAAuB,EAAM,aAG9C,IAAkB,EAAM,iBACxB,IAAuD;CAC3D,AAAI,CAAC,KAAmB,EAAK,SAAS,MACpC,IAAe,GAAS,YAAY;EAAE,MAAM,EAAY,MAAM;EAAG,GAAG,GAAkB;CAAE,CAAC,GACzF,IAAkB,GAAuB,MAAM,EAAa,OAAO;CAGrE,IAAI;EACF,KAAK,IAAM,KAAO,GAAM;GACtB,IAAM,IAAU,KAAK,IAAI,GAAG,KAAK,KAAK,EAAI,aAAa,KAAK,GAAG,EAAM,SAAS,CAAC,CAAC,GAC1E,IAAI,MAAM,EAAiB,IAAU,CAAC;GAC5C,MAAM,GAAe,GAAQ,EAAM,IAAU,GAAG,GAAK,EAAM,UAAU;EACvE;CACF,UAAU;EACR,AAAI,KAAc,MAAM,EAAa,QAAQ,CAAC,CAAC,YAAY,CAAC,CAAC;CAC/D;CAEA,AAAI,EAAM,WAAW,QAAM,MAAM,GAAc,GAAQ,EAAM,SAAS;CAEtE,IAAM,IAAqB,EAAM,cAAc,CAAC;CAEhD,OAAO,OADU,EAAmB,SAAS,IAAI,MAAM,EAAoB,GAAQ,CAAkB,IAAI,EAAA,CACnF,KAAK;AAC7B;;;ACzVA,IAAa,KAAU,6BAUjB,KAAa,SAIb,MAAa,MACjB,EAAE,QAAQ,MAAM,OAAO,CAAC,CAAC,QAAQ,MAAM,MAAM,CAAC,CAAC,QAAQ,MAAM,MAAM,CAAC,CAAC,QAAQ,MAAM,QAAQ,CAAC,CAAC,QAAQ,MAAM,QAAQ;AAErH,SAAS,GAAI,GAAW,IAAI,GAAW;CACrC,OAAO,OAAO,CAAC,CAAC,CAAC,SAAS,GAAG,GAAG;AAClC;AAGA,SAAgB,GAAU,GAAiC;CACzD,IAAM,IAAI,IAAM,IAAI,KAAK,CAAG,oBAAI,IAAI,KAAK;CACzC,IAAI,OAAO,MAAM,EAAE,QAAQ,CAAC,GAAG,OAAO,GAAU,KAAA,CAAS;CACzD,IAAM,IAAK,CAAC,EAAE,kBAAkB,GAC1B,IAAO,KAAM,IAAI,MAAM,KACvB,IAAM,GAAI,KAAK,MAAM,KAAK,IAAI,CAAE,IAAI,EAAE,CAAC,GACvC,IAAM,GAAI,KAAK,IAAI,CAAE,IAAI,EAAE;CACjC,OAAO,KAAK,EAAE,YAAY,IAAI,GAAI,EAAE,SAAS,IAAI,CAAC,IAAI,GAAI,EAAE,QAAQ,CAAC,IAAI,GAAI,EAAE,SAAS,CAAC,IAAI,GAAI,EAAE,WAAW,CAAC,IAAI,GAAI,EAAE,WAAW,CAAC,IAAI,IAAO,EAAI,GAAG,EAAI;AAC7J;AAGA,SAAgB,GAAY,GAAoD;CAC9E,IAAI,CAAC,GAAK;CACV,IAAM,IAAI,gFAAgF,KAAK,EAAI,KAAK,CAAC;CACzG,IAAI,CAAC,GAAG;EACN,IAAM,IAAI,KAAK,MAAM,CAAG;EACxB,OAAO,OAAO,MAAM,CAAC,IAAI,KAAA,IAAY,IAAI,KAAK,CAAC,CAAC,CAAC,YAAY;CAC/D;CACA,IAAM,GAAG,GAAG,IAAK,MAAM,IAAI,MAAM,IAAI,MAAM,IAAK,MAAM,IAAI,MAAM,GAAK,IAAM,MAAM,IAAM,QAAQ,GAC3F,IAAS;CACb,AACK,IADD,MAAQ,OAAO,CAAC,IAAc,MACpB,GAAG,IAAM,EAAI,GAAG;CAC9B,IAAM,IAAI,KAAK,MAAM,GAAG,EAAE,GAAG,EAAG,GAAG,EAAE,GAAG,EAAE,GAAG,EAAG,GAAG,IAAI,GAAQ;CAC/D,OAAO,OAAO,MAAM,CAAC,IAAI,KAAA,IAAY,IAAI,KAAK,CAAC,CAAC,CAAC,YAAY;AAC/D;AAEA,IAAM,MAAc,MAA8C;CAC5D,OAAC,KAAK,MAAM,gBAChB;MAAI,kBAAkB,KAAK,CAAC,GAAG,OAAO,EAAE,YAAY;EACpD,IAAI,kBAAkB,KAAK,CAAC,GAAG,OAAO,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,YAAY;CAD5C;AAGtD,GAEM,KAAQ,GAAc,MAC1B,KAAiC,QAAQ,MAAU,KAAK,KAAK,IAAI,EAAK,IAAI,GAAU,OAAO,CAAK,CAAC,EAAE;AAErG,SAAS,GAAkB,GAAuC;CAChE,OAAO,2BAA2B,GAAU,KAAK,UAAU,GAAG,KAAa,EAAK,CAAC,CAAC,EAAE;AACtF;AAEA,SAAS,GAAe,GAAsC;CAC5D,IAAM,IAAO,MAAM,KAAK,EAAG,QAAQ,CAAC,CAAC,MAAM,MAAM,EAAE,cAAc,iBAAiB;CAClF,IAAI,CAAC,GAAM,OAAO,CAAC;CACnB,IAAI;EAEF,IAAM,IADS,KAAK,MAAM,EAAK,aAAa,OAAO,KAAK,IAC3C,CAAA,GAAS;EACtB,OAAO,KAAQ,OAAO,KAAS,WAAW,IAAO,CAAC;CACpD,QAAQ;EACN,OAAO,CAAC;CACV;AACF;AAEA,SAAS,GAAW,GAAyB;CAC3C,OAAO,EAAO,KAAK,MAAM,GAAG,GAAI,EAAE,CAAC,EAAE,GAAG,GAAI,EAAE,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG;AAC9D;AAEA,SAAS,GAAY,GAA2B;CAE9C,OADK,IACE,EACJ,MAAM,GAAG,CAAC,CACV,KAAK,MAAS,EAAK,KAAK,CAAC,CAAC,MAAM,QAAQ,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,CACtD,QAAQ,MAAO,EAAG,UAAU,KAAK,EAAG,OAAO,MAAM,OAAO,SAAS,CAAC,CAAC,CAAC,CAAC,CACrE,KAAK,CAAC,GAAG,QAAQ;EAAE;EAAG;CAAE,EAAE,IALd,CAAC;AAMlB;AAEA,SAAS,GAAa,GAA4B;CAEhD,OADK,IACE,EAAE,MAAM,QAAQ,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,QAAQ,MAAM,OAAO,SAAS,CAAC,CAAC,IADtD,CAAC;AAElB;AAEA,SAAS,GAAY,GAAoB;CACvC,OAAO,EAAE,IAAI,EAAG,CAAC,CAAC,KAAK,GAAG;AAC5B;AAGA,IAAM,qBAAc,IAAI,IAAI;CAC1B;CAAQ;CAAQ;CAAS;CAAkB;CAAS;CAAW;CAAQ;CAAS;CAAW;CAC3F;CAAgB;CAAS;CAAU;CAAS;CAAO;CAAQ;CAAQ;CAAQ;CAAM;CAAW;AAC9F,CAAC,GAEK,qBAAiB,IAAI,IAAI;CAAC;CAAY;CAAqB;CAAW;CAAa;CAAgB;CAAmB;CAAgB;CAAqB;CAAS;AAAU,CAAC;AAIrL,SAAS,GAAY,GAAe,GAAiB,GAA2B,GAAgC;CAC9G,IAAM,IAAO,KAAgB,GAAU,GAAG;EAAE,GAAG,EAAE;EAAG,GAAG,EAAE;EAAG,OAAO,EAAE;EAAO,QAAQ,EAAE;CAAO,CAAC,GACxF,IAAU,EAAE,cAAc,EAAE,YAAY,IAAI,KAAK,EAAE,SAAS,CAAC,CAAC,YAAY,IAAI,KAAA,IAC9E,IAAQ,CAAC,SAAS,GAAI,EAAE,WAAW,CAAC,YAAY,QAAQ,IAAI,CAAC,CAAE,CAAC,CAAC,KAAK,GAAG;CAC/E,OACE,EAAK,QAAQ,EAAE,YAAY,CAAC,IAC5B,EAAK,QAAQ,GAAY,CAAI,CAAC,IAC9B,EAAK,QAAQ,EAAE,EAAE,KAChB,IAAmB,EAAK,SAAS,EAAE,MAAM,IAAI,MAC9C,EAAK,QAAQ,GAAU,EAAE,cAAc,CAAO,CAAC,IAC/C,EAAK,gBAAgB,GAAU,CAAO,CAAC,IACvC,EAAK,SAAS,CAAK,IACnB,EAAK,WAAW,EAAE,YAAY,KAAA,KAAa,EAAE,YAAY,IAAI,GAAI,EAAE,OAAO,IAAI,KAAA,CAAS;AAE3F;AAEA,SAAS,GAAW,GAAuB;CACzC,IAAM,IAAQ,EAAE,YAAY;CAE5B,OADK,IACE,OAAO,QAAQ,CAAK,CAAC,CACzB,QAAQ,CAAC,OAAO,CAAC,GAAY,IAAI,CAAC,CAAC,CAAC,CACpC,KAAK,CAAC,GAAG,OAAO,EAAK,GAAG,CAAC,CAAC,CAAC,CAC3B,KAAK,EAAE,IAJS;AAKrB;AAEA,SAAS,GAAc,GAAuB;CAC5C,QAAQ,EAAE,YAAY,YAAY,CAAC,EAAA,CAAG,KAAK,EAAE;AAC/C;AAEA,SAAS,GAAW,GAAe,IAAiC,CAAC,GAAW;CAC9E,IAAM,IAAgC;EAAE,MAAM,EAAE;EAAM,GAAG;CAAM;CAG/D,OAFI,EAAE,aAAU,EAAK,WAAW,EAAE,WAC9B,EAAE,gBAAgB,KAAA,MAAW,EAAK,cAAc,EAAE,cAC/C,GAAkB,CAAI;AAC/B;AAEA,IAAM,MAAmB,MAAsC,IAAO,aAAa,GAAU,CAAI,EAAE,eAAe,IAE5G,MAAgB,GAAe,MACnC,iCAAiC,EAAK,+BAA+B,GAAW,EAAE,KAAK,KAAK,UAAU,mDACjE,EAAK;AAG5C,eAAsB,GAAyB,GAAe,GAA2B,IAA0B,CAAC,GAAoB;CACtI,IAAI,EAAE,SAAS,YAAY,EAAE,SAAS,OAAO,EAAE;CAC/C,IAAM,IAAI,MAAM,EAAQ,EAAE,SAAS,GAC7B,IAAmB,EAAK,qBAAqB,IAC7C,IAAQ,GAAW,EAAE,KAAK,GAC1B,IAAc,EAAK,SAAS,CAAK,IAAI,EAAK,SAAS,EAAE,WAAW,GAChE,KAAU,MAAmB,GAAY,GAAG,GAAG,GAAkB,CAAI,IAAI,GAAW,CAAC,GACrF,KAAQ,IAAiC,CAAC,MAAM,GAAW,GAAG,CAAK,IAAI,GAAc,CAAC;CAE5F,QAAQ,EAAE,MAAV;EACE,KAAK,aACH,OAAO,UAAU,EAAO,IAAI,IAAc,EAAK,kBAAkB,CAAK,EAAE,uBAAuB,EAAK,EAAE;EACxG,KAAK,WACH,OAAO,UAAU,EAAO,IAAI,IAAc,EAAK,kBAAkB,CAAK,EAAE,qBAAqB,EAAK,EAAE;EACtG,KAAK;EACL,KAAK,SAAS;GACZ,IAAM,IAAM,EAAE,UAAU,EAAE,OAAO,UAAU,IAAI,EAAE,SAAS,CAAC;IAAE,GAAG,EAAE;IAAG,GAAG,EAAE;GAAE,GAAG;IAAE,GAAG,EAAE,IAAI,EAAE;IAAO,GAAG,EAAE,IAAI,EAAE;GAAO,CAAC,GAChH,CAAC,GAAG,KAAK,EAAU,GAAG,CAAC,EAAI,IAAI,EAAI,EAAE,CAAC,GACtC,IAAgB;IAAC,KAAK,IAAI,EAAE,GAAG,EAAE,CAAC;IAAG,KAAK,IAAI,EAAE,GAAG,EAAE,CAAC;IAAG,KAAK,IAAI,EAAE,GAAG,EAAE,CAAC;IAAG,KAAK,IAAI,EAAE,GAAG,EAAE,CAAC;GAAC,GAC/F,IAAO,EAAE,SAAS,UAAU,EAAK,QAAQ,WAAW,IAAI;GAC9D,OAAO,QAAQ,EAAO,CAAI,IAAI,EAAY,UAAU,GAAI,EAAE,CAAC,EAAE,GAAG,GAAI,EAAE,CAAC,EAAE,SAAS,GAAI,EAAE,CAAC,EAAE,GAAG,GAAI,EAAE,CAAC,EAAE,GAAG,EAAK,YAAY,EAAE,SAAS,UAAU,UAAU,OAAO,IAAI,EAAK,EAAE;EAC9K;EACA,KAAK,YAAY;GACf,IAAM,IAAU,EAAE,WAAW,EAAE,QAAQ,SAAS,IAAI,EAAE,UAAU,EAAE,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC,GACnF,IAAW,EAAQ,KAAK,MAAO,YAAY,GAAW,EAAU,GAAG,CAAE,CAAC,EAAE,WAAW,CAAC,CAAC,KAAK,EAAE,GAC5F,IAAM,EAAQ,KAAK;GAEzB,OAAO,OAAO,EADD,EAAI,SAAS,GAAU,GAAG,GAAS,GAAK,EAAE,WAAW,CAAC,IAAI,KAAA,CAC9C,IAAI,EAAY,gCAAgC,EAAS,YAAY,EAAK,EAAE;EACvG;EACA,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK,YAAY;GACf,IAAM,IAAQ,EAAE,SAAS,EAAE,MAAM,SAAS,IAAI,EAAE,QAAQ,CAAC;IAAE,GAAG,EAAE;IAAG,GAAG,EAAE;IAAG,OAAO,EAAE;IAAO,QAAQ,EAAE;GAAO,CAAC,GACvG,IAAS,EAAM,SAAS,MAAM,GAAiB,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,EAAG,CAAC,CAAC,KAAK,GAAG,GACvE,IAAO,GAAU,GAAG,GAAW,CAAK,CAAC,GACrC,IAAM,EAAE,MACR,IAAU,EAAE,SAAS,cAAc,cAAc,EAAE,SAAS,cAAc,cAAc,EAAE,SAAS,cAAc,cAAc;GACrI,OAAO,IAAI,IAAM,EAAO,CAAI,IAAI,EAAK,SAAS,CAAK,EAAE,WAAW,EAAO,aAAa,EAAQ,IAAI,EAAK,EAAE,IAAI,EAAI;EACjH;EACA,KAAK,QACH,OAAO,YAAY,EAAO,IAAI,EAAK,SAAS,CAAK,EAAE,uBAAuB,GAAgB,EAAE,IAAI,IAAI,GAAa,GAAG,EAAE,IAAI,EAAK,EAAE;EACnI,KAAK,WAAW;GACd,IAAM,IAAM,EAAE,UAAU,EAAE,OAAO,UAAU,IAAI,EAAE,SAAS,CAAC;IAAE,GAAG,EAAE;IAAG,GAAG,EAAE;GAAE,GAAG;IAAE,GAAG,EAAE;IAAG,GAAG,EAAE;GAAE,CAAC,GAC3F,CAAC,GAAG,KAAK,EAAU,GAAG,CAAC,EAAI,IAAI,EAAI,EAAE,CAAC,GACtC,IAAU,GAAU,GAAG;IAAE,GAAG,EAAI,EAAE,CAAC;IAAG,GAAG,EAAI,EAAE,CAAC;IAAG,OAAO,EAAE,OAAO,EAAE,KAAK,SAAS,IAAI,KAAK;IAAK,QAAQ;GAAG,CAAC;GAEnH,OAAO,YAAY,EAAO;IADH,KAAK,IAAI,EAAE,GAAG,EAAQ,EAAE;IAAG,KAAK,IAAI,EAAE,GAAG,EAAQ,EAAE;IAAG,KAAK,IAAI,EAAE,GAAG,EAAQ,EAAE;IAAG,KAAK,IAAI,EAAE,GAAG,EAAQ,EAAE;GACtG,CAAI,IAAI,EAAY,iCAAiC,GAAI,EAAE,CAAC,EAAE,GAAG,GAAI,EAAE,CAAC,EAAE,GAAG,GAAI,EAAE,CAAC,EAAE,GAAG,GAAI,EAAE,CAAC,EAAE,sBAAsB,GAAgB,EAAE,IAAI,IAAI,GAAa,GAAG,EAAE,IAAI,EAAK,EAAE,KAAK,EAAQ,CAAC,EAAE;EAC3N;EACA,KAAK,QACH,OAAO,QAAQ,EAAO,GAAU,GAAG;GAAE,GAAG,EAAE;GAAG,GAAG,EAAE;GAAG,OAAO;GAAI,QAAQ;EAAG,CAAC,CAAC,IAAI,EAAK,SAAS,CAAK,EAAE,wCAAwC,GAAgB,EAAE,IAAI,IAAI,EAAK,EAAE;EACjL,KAAK,QAAQ;GACX,IAAM,IAAM,EAAE,WAAW,IACnB,IAAS,EAAI,WAAW,QAAQ,IAClC,4DAA4D,KAAK,IAAI,IAAI,SAAS,EAAI,MAAM,CAAC,GAAG,EAAE,KAAK,KAAK,CAAC,EAAE,6CAC/G,IACE,gDAAgD,GAAU,CAAG,EAAE,+BAC/D;GACN,OAAO,QAAQ,EAAO,IAAI,EAAK,SAAS,CAAK,EAAE,kBAAkB,IAAS,GAAgB,EAAE,IAAI,IAAI,EAAK,EAAE;EAC7G;EACA,KAAK,aACH,OAAO,SAAS,EAAO,EAAE,uBAAuB,EAAE,WAAW,cAAc,GAAU,EAAE,QAAQ,EAAE,gBAAgB,KAAK,EAAK;GAAE,QAAQ,EAAE;GAAQ,UAAU,EAAE;GAAU,WAAW,EAAE;EAAU,CAAC,EAAE;EACjM,KAAK,iCACH,OAAO,SAAS,EAAO,EAAE,+BAA+B,EAAK;GAAE,QAAQ,EAAE;GAAQ,WAAW,EAAE;EAAU,CAAC,EAAE;EAC7G,KAAK,UACH,OAAO,EAAE,WAAW;EACtB,SACE,OAAO;CACX;AACF;AAEA,SAAS,GAAS,GAA2B,IAAM,GAAG;CACpD,IAAM,IAAK,EAAO,KAAK,MAAM,EAAE,CAAC,GAC1B,IAAK,EAAO,KAAK,MAAM,EAAE,CAAC,GAC1B,IAAO,IAAM,GACb,IAAI,KAAK,IAAI,GAAG,CAAE,IAAI,GACtB,IAAI,KAAK,IAAI,GAAG,CAAE,IAAI;CAC5B,OAAO;EAAE;EAAG;EAAG,OAAO,KAAK,IAAI,GAAG,CAAE,IAAI,IAAI;EAAM,QAAQ,KAAK,IAAI,GAAG,CAAE,IAAI,IAAI;CAAK;AACvF;AAGA,eAAsB,GAAkB,GAA2B,GAA2B,IAA0B,CAAC,GAAoB;CAC3I,IAAM,IAAO,EAAK,aAAa;CAE/B,OACE,sDACgB,GAAQ,kCAAiC,MAHnC,QAAQ,IAAI,EAAK,KAAK,MAAM,GAAyB,GAAG,GAAS,CAAI,CAAC,CAAC,EAGpC,CAAU,OAAO,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;AAEhG;AAIA,SAAS,GAAc,GAAuC;CAC5D,IAAM,IAAgC,CAAC;CACvC,KAAK,IAAM,KAAK,MAAM,KAAK,EAAG,UAAU,GACtC,AAAI,CAAC,GAAY,IAAI,EAAE,IAAI,KAAK,CAAC,EAAE,KAAK,WAAW,OAAO,MAAG,EAAM,EAAE,QAAQ,EAAE;CAEjF,IAAM,IAAqB,CAAC;CAC5B,KAAK,IAAM,KAAK,MAAM,KAAK,EAAG,QAAQ,GACpC,AAAK,GAAe,IAAI,EAAE,SAAS,KAAG,EAAS,KAAK,IAAI,cAAc,CAAC,CAAC,kBAAkB,CAAC,CAAC;CAG9F,IAAM,IAAS,MAAM,KAAK,EAAG,QAAQ,CAAC,CAAC,MAAM,MAAM,EAAE,cAAc,iBAAiB;CACpF,IAAI,GACF,IAAI;EACF,IAAM,IAAS,KAAK,MAAM,EAAO,aAAa,OAAO,KAAK,IAAI;EAC9D,IAAI,KAAU,OAAO,KAAW,UAAU;GACxC,IAAM,IAAO,EAAE,GAAG,EAAO;GAEzB,AADA,OAAO,EAAK,KACR,OAAO,KAAK,CAAI,CAAC,CAAC,SAAS,KAC7B,EAAS,KAAK,2BAA2B,GAAU,KAAK,UAAU,CAAI,CAAC,EAAE,IAAI;EAEjF;CACF,QAAQ;EACN,EAAS,KAAK,IAAI,cAAc,CAAC,CAAC,kBAAkB,CAAM,CAAC;CAC7D;CAEF,IAAM,IAAgC,CAAC;CAGvC,OAFI,OAAO,KAAK,CAAK,CAAC,CAAC,WAAQ,EAAI,QAAQ,IACvC,EAAS,WAAQ,EAAI,WAAW,IAC7B,OAAO,KAAK,CAAG,CAAC,CAAC,SAAS,IAAM,KAAA;AACzC;AAEA,SAAS,GAAU,GAAa,GAAkC;CAEhE,OADU,MAAM,KAAK,EAAG,QAAQ,CAAC,CAAC,MAAM,MAAM,EAAE,cAAc,CACvD,CAAA,EAAG,eAAe,KAAA;AAC3B;AAEA,SAAS,GAAgB,GAAa,GAAiE;CACrG,IAAM,IAAW,GAAa,EAAG,aAAa,MAAM,CAAC,GAC/C,IAAO,EAAS,WAAW,IAAI,EAAY,GAAG;EAAC,EAAS;EAAI,EAAS;EAAI,EAAS;EAAI,EAAS;CAAE,CAAC,IAAI;EAAE,GAAG;EAAG,GAAG;EAAG,OAAO;EAAG,QAAQ;CAAE,GACxI,IAAS,GAAe,CAAE,GAC1B,IAAQ,GAAW,EAAG,aAAa,OAAO,KAAK,EAAG,aAAa,gBAAgB,KAAK,KAAA,CAAS,KAAK,WAClG,IAAc,EAAG,aAAa,SAAS,GACvC,IAAU,MAAgB,QAAQ,OAAO,SAAS,OAAO,CAAW,CAAC,IAAI,OAAO,CAAW,IAAI,GAC/F,IAAY,EAAG,aAAa,OAAO,GACnC,IAAc,OAAO,EAAO,eAAgB,WAAW,EAAO,cAAc,MAAc,QAAQ,OAAO,SAAS,OAAO,CAAS,CAAC,IAAI,OAAO,CAAS,IAAI,GAC3J,KAAS,EAAG,aAAa,OAAO,KAAK,GAAA,CAAI,YAAY,GACrD,IAAW,EAAM,SAAS,UAAU,KAAK,EAAM,SAAS,QAAQ;CACtE,OAAO;EACL,IAAI,EAAG,aAAa,MAAM,KAAK,GAAgB;EAC/C,YAAY,SAAS,EAAG,aAAa,MAAM,KAAK,KAAK,EAAE,KAAK,KAAK;EACjE,GAAG,EAAK;EACR,GAAG,EAAK;EACR,OAAO,EAAK;EACZ,QAAQ,EAAK;EACb;EACA;EACA;EACA,QAAQ,EAAG,aAAa,OAAO,KAAK,KAAA;EACpC,UAAU,OAAO,EAAO,YAAa,WAAW,EAAO,WAAW,KAAA;EAClE,WAAW,GAAY,EAAG,aAAa,cAAc,CAAC;EACtD,YAAY,GAAY,EAAG,aAAa,MAAM,CAAC;EAC/C,UAAU,KAAY,KAAA;EACtB,YAAY,GAAc,CAAE;CAC9B;AACF;AAEA,SAAS,GAAoB,GAAa,GAAoC;CAC5E,IAAM,IAAO,EAAG,UAAU,YAAY,GAChC,IAAS,GAAe,CAAE,GAC1B,IAAO,GAAgB,GAAI,CAAC,GAE5B,WAA4B;EAChC,GAAG;EACH,MAAM;EACN,YAAY;EACZ,SAAS,IAAI,cAAc,CAAC,CAAC,kBAAkB,CAAE;EACjD,YAAY,KAAA;CACd;CAEA,QAAQ,GAAR;EACE,KAAK,UACH,OAAO;GAAE,GAAG;GAAM,MAAM;EAAY;EACtC,KAAK,UACH,OAAO;GAAE,GAAG;GAAM,MAAM;EAAU;EACpC,KAAK,QAAQ;GACX,IAAM,IAAI,GAAa,EAAG,aAAa,OAAO,CAAC,GACzC,IAAI,GAAa,EAAG,aAAa,KAAK,CAAC,GACvC,KAAQ,EAAG,aAAa,MAAM,KAAK,OAAA,CAAQ,YAAY,GACvD,KAAY,EAAG,aAAa,MAAM,KAAK,OAAA,CAAQ,YAAY;GACjE,IAAI,EAAE,SAAS,KAAK,EAAE,SAAS,GAAG,OAAO,EAAO;GAChD,IAAM,CAAC,GAAI,KAAM,GAAY,GAAG,CAAC;IAAE,GAAG,EAAE;IAAI,GAAG,EAAE;GAAG,GAAG;IAAE,GAAG,EAAE;IAAI,GAAG,EAAE;GAAG,CAAC,CAAC,GACtE,IAAS,GAAS,CAAC,GAAI,CAAE,CAAC,GAC1B,IAAU,MAAS,UAAU,MAAa;GAChD,OAAO;IAAE,GAAG;IAAM,GAAG;IAAQ,MAAM,IAAU,UAAU;IAAQ,QAAQ,CAAC,GAAI,CAAE;GAAE;EAClF;EACA,KAAK,OAAO;GAEV,IAAM,IADW,MAAM,KAAK,EAAG,qBAAqB,GAAG,CAAC,CAAC,CAAC,QAAQ,MAAM,EAAE,cAAc,SACxE,CAAA,CAAS,KAAK,MAAO,GAAY,GAAG,GAAY,EAAG,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,MAAO,EAAG,SAAS,CAAC;GAC9G,IAAI,EAAQ,WAAW,GAAG,OAAO,EAAO;GACxC,IAAM,IAAM,EAAQ,KAAK;GACzB,OAAO;IAAE,GAAG;IAAM,GAAG,GAAS,CAAG;IAAG,MAAM;IAAY,QAAQ,EAAQ;IAAI;GAAQ;EACpF;EACA,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK,YAAY;GACf,IAAM,IAAQ,GAAa,EAAG,aAAa,QAAQ,CAAC,GAC9C,IAAQ,EAAM,UAAU,IAAI,GAAkB,GAAG,CAAK,IAAI,CAAC;IAAE,GAAG,EAAK;IAAG,GAAG,EAAK;IAAG,OAAO,EAAK;IAAO,QAAQ,EAAK;GAAO,CAAC,GAC3H,IAAO,GAAW,CAAK,GACvB,IAAO,GACP,IAAiB,MAAS,cAAc,KAAM;GACpD,OAAO;IACL,GAAG;IACH,GAAG;IACH;IACA,OAAO,EAAM,SAAS,IAAI,IAAQ,KAAA;IAClC,SAAS,EAAK,YAAY,KAAK,MAAS,cAAc,KAAO,EAAK,WAAW;GAC/E;EACF;EACA,KAAK,YAAY;GACf,IAAM,IAAO,GAAU,GAAI,UAAU,KAAK,IACpC,IAAK,EAAG,aAAa,IAAI,KAAK,IAC9B,IAAU,GAAa,EAAG,aAAa,SAAS,CAAC;GACvD,IAAI,MAAO,qBAAqB,EAAO,SAAS,aAAa,EAAQ,UAAU,GAAG;IAChF,IAAM,IAAM,EAAQ,UAAU,IAAI,GAAY,GAAG,CAAC;KAAE,GAAG,EAAQ;KAAI,GAAG,EAAQ;IAAG,GAAG;KAAE,GAAG,EAAQ;KAAI,GAAG,EAAQ;IAAG,CAAC,CAAC,IAAI,CAAC;KAAE,GAAG,EAAK;KAAG,GAAG,EAAK;IAAE,GAAG;KAAE,GAAG,EAAK;KAAG,GAAG,EAAK;IAAE,CAAC;IAC5K,OAAO;KAAE,GAAG;KAAM,MAAM;KAAW;KAAM,QAAQ;KAAK,GAAG,EAAI,EAAE,CAAC;KAAG,GAAG,EAAI,EAAE,CAAC;KAAG,OAAO,KAAK,IAAI,KAAK,EAAK,SAAS,IAAI,EAAE;KAAG,QAAQ;IAAG;GACzI;GACA,OAAO;IAAE,GAAG;IAAM,MAAM;IAAQ;IAAM,OAAO,KAAK,IAAI,EAAK,OAAO,GAAG;IAAG,QAAQ,KAAK,IAAI,EAAK,QAAQ,EAAE;GAAE;EAC5G;EACA,KAAK,QACH,OAAO;GAAE,GAAG;GAAM,MAAM;GAAQ,MAAM,GAAU,GAAI,UAAU,KAAK;GAAI,OAAO;GAAI,QAAQ;EAAG;EAC/F,KAAK,QAAQ;GACX,IAAM,IAAM,MAAM,KAAK,EAAG,qBAAqB,GAAG,CAAC,CAAC,CAAC,MAAM,MAAM,EAAE,cAAc,KAAK,GAChF,IAAM,MAAM,KAAK,EAAG,qBAAqB,GAAG,CAAC,CAAC,CAAC,MAAM,MAAM,EAAE,cAAc,SAAS,EAAE,cAAc,SAAS,EAAE,cAAc,MAAM,GACrI,IAAU,GAAK,aAAa,MAAM,KAAK;GAE3C,OADI,CAAC,KAAW,MAAK,IAAU,UAAU,SAAS,EAAI,aAAa,MAAM,KAAK,KAAK,EAAE,KAAK,KAAK,MACxF;IAAE,GAAG;IAAM,MAAM;IAAQ;IAAS,MAAM,GAAU,GAAI,UAAU,KAAK;IAAI,OAAO;IAAe,aAAa;IAAG,SAAS;IAAG,QAAQ,CAAC;GAAE;EAC/I;EACA,KAAK,SAAS;GACZ,IAAM,IAAQ,GAAU,GAAI,WAAW;GAOvC,OANI,EAAO,SAAS,kCACX;IAAE,GAAG;IAAM,MAAM;IAAiC,QAAQ,OAAO,EAAO,UAAW,WAAW,EAAO,SAAS,KAAA;IAAW,WAAW,OAAO,EAAO,aAAc,WAAW,EAAO,YAAY,KAAA;GAAU,IAE7M,IACK;IAAE,GAAG;IAAM,MAAM;IAAa,UAAU;IAAO,QAAQ,OAAO,EAAO,UAAW,WAAW,EAAO,SAAS,KAAA;IAAW,WAAW,OAAO,EAAO,aAAc,WAAW,EAAO,YAAY,KAAA;GAAU,IAEvM,EAAO;EAChB;EACA,SACE,OAAO,EAAO;CAClB;AACF;AAOA,SAAS,GAAqB,GAAuB;CACnD,IAAI,IAAM,IACN,IAAM;CACV,SAAS;EACP,IAAM,IAAQ,EAAM,QAAQ,SAAS,CAAG;EACxC,IAAI,MAAU,IAAI;EAClB,IAAM,IAAM,EAAM,QAAQ,MAAM,IAAQ,CAAC;EACzC,IAAI,MAAQ,IAAI;EAEhB,AADA,KAAO,EAAM,MAAM,GAAK,CAAK,GAC7B,IAAM,IAAM;CACd;CACA,OAAO,IAAM,EAAM,MAAM,CAAG;AAC9B;AAEA,eAAsB,GAAU,GAAa,GAAkD;CAI7F,IAAM,IAAU,GAAqB,CAAG,CAAC,CAAC,KAAK;CAC/C,IAAI,CAAC,GAAS,OAAO,CAAC;CAEtB,IAAI,sBAAsB,KAAK,CAAO,GACpC,MAAU,MAAM,iFAAiF;CAInG,IAAM,IAAU,gBAAgB,GAAQ,YAAY,EAAQ,mBACtD,IAAM,IAAI,UAAU,CAAC,CAAC,gBAAgB,GAAS,iBAAiB,GAChE,IAAQ,EAAI,qBAAqB,aAAa,CAAC,CAAC;CACtD,IAAI,GAAO,MAAU,MAAM,uCAAuC,EAAM,aAAa,MAAM,GAAG,GAAG,GAAG;CAEpG,IAAM,oBAAW,IAAI,IAAI;EAAC;EAAQ;EAAU;EAAU;EAAK;CAAK,CAAC,GAC3D,IAAW,MAAM,KAAK,EAAI,qBAAqB,GAAG,CAAC,CAAC,CAAC,QACxD,MAAM,EAAE,eAAe,cAAc,YAAY,CAAC,EAAS,IAAI,EAAE,SAAS,CAC7E,GACM,IAAoB,CAAC;CAC3B,KAAK,IAAM,KAAM,GAAU;EAGzB,IAAM,IAAM,GAAoB,GAAI,MADpB,GADF,SAAS,EAAG,aAAa,MAAM,KAAK,KAAK,EAAE,KAAK,KAAK,CACvC,CACS;EACrC,AAAI,KAAK,EAAI,KAAK,CAAG;CACvB;CACA,OAAO;AACT;;;AClaA,IAAM,KAAc,KACd,4BAAe,IAAI,KAAK,EAAA,CAAE,YAAY,GAE/B,KAAb,MAA+B;CAC7B,OAA6B,CAAC;CAC9B,OAA+B,CAAC;CAChC,SAAiC,CAAC;CAClC,mCAA2B,IAAI,IAAqB;CACpD,gCAAwB,IAAI,IAAgB;CAC5C,OAA+B,CAAC;CAChC,WAAmB;CACnB,gBAAwB;CACxB,WAA4C;CAI5C,YAAY,GAAoC;EAC9C,KAAK,WAAW,IAAM,GAAuB,CAAG,IAAI;CACtD;CAEA,cAAuB;EACrB,OAAO,KAAK,aAAa;CAC3B;CAEA,eAAe,GAAc,GAAmB;EAC9C,KAAK,OAAO;GAAE;GAAM,IAAI,KAAM,KAAK,KAAK;EAAG;CAC7C;CAEA,mBAAmB,GAAwC;EACzD,KAAK,OAAO,EAAE,GAAI,KAAQ,CAAC,EAAG;CAChC;CAEA,iBAAyB;EACvB,OAAO,KAAK,KAAK,QAAQ;CAC3B;CAEA,qBAAqC;EACnC,OAAO,EAAE,GAAG,KAAK,KAAK;CACxB;CAEA,YAAY,GAAyB;EACnC,KAAK,WAAW;CAClB;CAEA,aAAsB;EACpB,OAAO,KAAK;CACd;CAGA,iBAAiB,GAAsB;EACrC,KAAK,gBAAgB;CACvB;CAGA,QAAQ,GAAwB;EAK9B,OAJI,KAAK,YAAY,EAAE,YAAY,EAAE,SAAS,WAAiB,KAC3D,KAAK,iBACL,CAAC,EAAE,YAAY,CAAC,EAAE,SAAe,KACjC,EAAE,WAAiB,EAAQ,KAAK,KAAK,MAAO,EAAE,aAAa,KAAK,KAAK,KAClE,EAAQ,KAAK,KAAK,QAAS,EAAE,WAAW,KAAK,KAAK;CAC3D;CAEA,SAAkB;EAChB,OAAO,CAAC,KAAK;CACf;CAKA,qBAAmC;EACjC,OAAO,KAAK;CACd;CAEA,kBAAkB,GAAoC;EACpD,OAAO,KAAK,KAAK,MAAM,MAAM,EAAE,OAAO,CAAE;CAC1C;CAGA,aAAa,OACX,KAAK,cAAc,IAAI,CAAQ,SAClB;EAAE,KAAK,cAAc,OAAO,CAAQ;CAAG;CAGtD,oBAAkC,KAAK;CAEvC,iBAAiB,GAA2B,GAAuC;EAGjF,OAFI,MAAS,uBACb,KAAK,iBAAiB,IAAI,CAAQ,SACrB,KAAK,oBAAoB,GAAM,CAAQ,WAFL,CAAC;CAGlD;CAEA,oBAAoB,GAA2B,GAAiC;EAC1E,MAAS,uBACb,KAAK,iBAAiB,OAAO,CAAQ;CACvC;CAGA,wBAAwB,GAAkC,CAAC;CAI3D,IAAI,UAAmB;EACrB,OAAO,KAAK,KAAK,SAAS;CAC5B;CAEA,IAAI,UAAmB;EACrB,OAAO,KAAK,OAAO,SAAS;CAC9B;CAEA,OAAgB;EACd,IAAM,IAAQ,KAAK,KAAK,IAAI;EAC5B,IAAI,CAAC,GAAO,OAAO;EACnB,IAAM,IAAW,IAAI,IAAI,EAAM,MAAM,KAAK,MAAM,EAAE,EAAE,CAAC,GAC/C,IAAS,IAAI,IAAI,EAAM,SAAS,KAAK,MAAM,CAAC,EAAE,MAAM,IAAI,EAAE,MAAM,CAAC,CAAC,GAClE,IAAO,KAAK,KAAK,QAAQ,MAAM,CAAC,EAAS,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,MAAM,EAAO,IAAI,EAAE,EAAE,KAAK,CAAC;EAC1F,KAAK,IAAM,KAAK,EAAM,SAAS,AAAK,EAAK,MAAM,MAAM,EAAE,OAAO,EAAE,EAAE,KAAG,EAAK,KAAK,CAAC;EAGhF,OAFA,KAAK,OAAO,QAAQ,CAAK,GACzB,KAAK,MAAM,GAAM;GAAE,OAAO;GAAM,UAAU;GAAO,UAAU;GAAO,aAAa;EAAK,CAAC,GAC9E;CACT;CAEA,OAAgB;EACd,IAAM,IAAQ,KAAK,OAAO,MAAM;EAChC,IAAI,CAAC,GAAO,OAAO;EACnB,IAAM,IAAa,IAAI,IAAI,EAAM,QAAQ,KAAK,MAAM,EAAE,EAAE,CAAC,GACnD,IAAQ,IAAI,IAAI,EAAM,SAAS,KAAK,MAAM,CAAC,EAAE,OAAO,IAAI,EAAE,KAAK,CAAC,CAAC,GACjE,IAAO,KAAK,KAAK,QAAQ,MAAM,CAAC,EAAW,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,MAAM,EAAM,IAAI,EAAE,EAAE,KAAK,CAAC;EAC3F,KAAK,IAAM,KAAM,EAAM,OAAO,AAAK,EAAK,MAAM,MAAM,EAAE,OAAO,EAAG,EAAE,KAAG,EAAK,KAAK,CAAE;EAGjF,OAFA,KAAK,KAAK,KAAK,CAAK,GACpB,KAAK,MAAM,GAAM;GAAE,OAAO;GAAM,UAAU;GAAO,UAAU;GAAO,aAAa;EAAK,CAAC,GAC9E;CACT;CASA,OAAO,GAAoB,IAAsB,CAAC,GAAiB;EACjE,OAAO,KAAK,MAAM,GAAM;GAAE,GAAG;GAAM,aAAa;EAAM,CAAC;CACzD;CAEA,eAAe,GAA2B,IAAsB,CAAC,GAAiB;EAChF,IAAM,IAAU,EAAO,KAAK,OAAO;GAAE,GAAG;GAAG,IAAI,EAAE,MAAM,GAAgB;EAAE,EAAgB;EAEzF,OADA,KAAK,OAAO,CAAC,GAAG,KAAK,MAAM,GAAG,CAAO,GAAG,CAAI,GACrC,EAAQ,KAAK,MAAM,KAAK,kBAAkB,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,MAAuB,EAAQ,CAAE;CACnG;CAEA,iBAAiB,GAAY,GAAiC,IAAsB,CAAC,GAA2B;EAC7F,SAAK,kBAAkB,CACnC,GAEL,OADA,KAAK,OAAO,KAAK,KAAK,KAAK,MAAO,EAAE,OAAO,IAAK;GAAE,GAAG;GAAG,GAAG;GAAO;EAAG,IAAI,CAAE,GAAG,CAAI,GAC3E,KAAK,kBAAkB,CAAE;CAClC;CAEA,kBAAkB,GAAqC,IAAsB,CAAC,GAAS;EACrF,IAAM,IAAM,IAAI,IAAI,EAAQ,KAAK,MAAO,OAAO,KAAM,WAAW,IAAI,EAAE,EAAG,CAAC;EAC1E,KAAK,OAAO,KAAK,KAAK,QAAQ,MAAM,CAAC,EAAI,IAAI,EAAE,EAAE,CAAC,GAAG,CAAI;CAC3D;CAGA,QAAc;EAGZ,AAFA,KAAK,OAAO,CAAC,GACb,KAAK,SAAS,CAAC,GACf,KAAK,MAAM,CAAC,GAAG;GAAE,UAAU;GAAM,OAAO;GAAM,UAAU;GAAO,aAAa;EAAM,CAAC;CACrF;CASA,MAAM,kBAAkB,GAAqC;EAE3D,IAAM,IAAS,MAAM,GAAU,GADd,KAAK,gBACe,CAAQ;EAC7C,IAAI,EAAO,WAAW,GAAG,OAAO,CAAC;EACjC,IAAM,IAAW,IAAI,IAAI,EAAO,KAAK,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,GAC/C,IAAS,KAAK,KAAK,KAAK,MAAM,EAAS,IAAI,EAAE,EAAE,KAAK,CAAC;EAC3D,KAAK,IAAM,KAAK,GAAQ,AAAK,KAAK,KAAK,MAAM,MAAM,EAAE,OAAO,EAAE,EAAE,KAAG,EAAO,KAAK,CAAC;EAEhF,OADA,KAAK,OAAO,GAAQ;GAAE,UAAU;GAAM,OAAO;GAAM,UAAU;EAAM,CAAC,GAC7D,EAAO,KAAK,MAAM,KAAK,kBAAkB,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,MAAuB,EAAQ,CAAE;CAClG;CAMA,MAAM,kBAAkB,IAA0B,CAAC,GAAoB;EACrE,IAAM,IAAW,KAAK,gBAAgB;EAKtC,OAJI,EAAK,aAEA,MADa,QAAQ,IAAI,EAAK,UAAU,KAAK,MAAM,GAAyB,GAAG,GAAU,CAAI,CAAC,CAAC,EAAA,CACzF,KAAK,EAAE,IAEf,GAAkB,KAAK,MAAM,GAAU,CAAI;CACpD;CAGA,8BAAsC;EACpC,OAAO,KAAK,UAAU,KAAK,MAAM,MAAM,CAAC;CAC1C;CAIA,kBAA4C;EAC1C,IAAI,CAAC,KAAK,UAAU,MAAU,MAAM,qEAAqE;EACzG,OAAO,KAAK;CACd;CAEA,MAAc,GAAoB,GAA8D;EAC9F,IAAM,IAAO,KAAK,MACZ,IAAW,EAAQ,EAAK,UACxB,IAAQ,EAAQ,EAAK,OACrB,IAAW,IAAI,IAAI,EAAK,KAAK,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,GAC7C,IAAU,IAAI,IAAI,EAAK,KAAK,MAAM,EAAE,EAAE,CAAC,GAEvC,IAAsB,CAAC,GACvB,IAAyB,CAAC,GAC1B,IAAkE,CAAC,GACnE,IAAwB,CAAC,GACzB,IAA0B,CAAC;EAEjC,KAAK,IAAM,KAAK,GAAM;GACpB,IAAM,IAAI,EAAS,IAAI,EAAE,EAAE;GAC3B,IAAI,CAAC,GAAG;IACN,IAAI,CAAC,KAAY,CAAC,KAAS,KAAK,UAAU;IAC1C,IAAM,IAAU,KAAK,SAAS,GAAG,CAAQ;IAEzC,AADA,EAAM,KAAK,CAAO,GAClB,EAAU,KAAK,CAAO;GACxB,OAAO,IAAI,MAAM,GAAG;IAClB,IAAI,CAAC,KAAY,CAAC,KAAS,CAAC,KAAK,QAAQ,CAAC,GAAG;KAC3C,EAAU,KAAK,CAAC;KAChB;IACF;IACA,IAAM,IAAgB,IAAW,IAAI;KAAE,GAAG;KAAG,YAAY,GAAO;IAAE;IAGlE,AAFA,EAAS,KAAK,CAAC,GACf,EAAc,KAAK;KAAE,QAAQ;KAAG,OAAO;IAAE,CAAC,GAC1C,EAAU,KAAK,CAAC;GAClB,OACE,EAAU,KAAK,CAAC;EAEpB;EACA,KAAK,IAAM,KAAK,GACV,OAAQ,IAAI,EAAE,EAAE,GACpB;OAAI,CAAC,KAAY,CAAC,KAAS,CAAC,KAAK,QAAQ,CAAC,GAAG;IAC3C,EAAU,KAAK,CAAC;IAChB;GACF;GACA,EAAQ,KAAK,CAAC;EADd;EAIF,IAAI,EAAM,WAAW,KAAK,EAAS,WAAW,KAAK,EAAQ,WAAW,GAEpE,OAAO,KAAK;EASd,AANI,CAAC,EAAK,gBAAgB,EAAK,YAAY,CAAC,OAC1C,KAAK,KAAK,KAAK;GAAE;GAAO,UAAU;GAAe;EAAQ,CAAC,GACtD,KAAK,KAAK,SAAS,MAAa,KAAK,KAAK,MAAM,GACpD,KAAK,SAAS,CAAC,IAGjB,KAAK,OAAO;EACZ,KAAK,IAAM,KAAK,MAAM,KAAK,KAAK,aAAa,GAC3C,IAAI;GAAE,EAAE;EAAG,SAAS,GAAK;GAAE,QAAQ,MAAM,6CAA6C,CAAG;EAAG;EAK9F,OAHI,EAAM,UAAQ,KAAK,KAAK;GAAE,aAAa;GAAO,QAAQ;GAAO;EAAS,CAAC,GACvE,EAAS,UAAQ,KAAK,KAAK;GAAE,aAAa;GAAU,QAAQ;GAAU;EAAS,CAAC,GAChF,EAAQ,UAAQ,KAAK,KAAK;GAAE,aAAa;GAAS,QAAQ;GAAU;EAAS,CAAC,GAC3E,KAAK;CACd;CAEA,SAAiB,GAAe,GAA+B;EAC7D,IAAI,GAAU,OAAO;EACrB,IAAM,IAAU,EAAE,aAAa,GAAO;EACtC,OAAO;GACL,GAAG;GACH,QAAQ,EAAE,UAAU,KAAK,KAAK;GAC9B,UAAU,EAAE,YAAY,KAAK,KAAK;GAClC,WAAW;GACX,YAAY,EAAE,cAAc;EAC9B;CACF;CAEA,KAAa,GAAqC;EAChD,KAAK,IAAM,KAAK,MAAM,KAAK,KAAK,gBAAgB,GAC9C,IAAI;GAAE,EAAE,CAAK;EAAG,SAAS,GAAK;GAAE,QAAQ,MAAM,0DAA0D,CAAG;EAAG;CAElH;AACF,GCxTM,WAAyB;CAC7B,MAAU,MAAM,qEAAqE;AACvF,GAEa,KAAb,MAA+B;CAC7B;CAEA;CAEA,UAA8B;CAE9B,UAAwC;CACxC,cAA2C;CAC3C,YAAoB;CAEpB,YAAY,GAAgB,IAAuC,IAAI,GAAkB,GAAG;EAE1F,AADA,KAAK,MAAM,GACX,KAAK,oBAAoB;CAC3B;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;CAGA,SAAS,GAAoB,IAAgC,CAAC,GAAS;EACrE,IAAM,IAAI,KAAK;EACf,AAAI,IACF,EAAE,SAAS,GAAY,CAAO,IAE9B,KAAK,IAAI,KAAK,qBAAqB;GAAE,MAAM;GAAY,QAAQ,EAAQ;EAAO,CAAC;CAEnF;CAGA,eAAe,GAA0B;EACvC,KAAK,SAAS,CAAU;CAC1B;CASA,MAAM,WAAW,GAAe,IAAgC,CAAC,GAA4B;EAC3F,IAAM,IAAM,KAAK,eAAe;EAChC,IAAI,CAAC,GAAK,OAAO,CAAC;EAClB,IAAM,IAAI,KAAK;EAEf,OAAO,GAAc,GAAK,GADP,IAAI,EAAE,cAAc,IAAI,CAAC,GACC,KAAA,GAAW,EAAQ,KAAK;CACvE;CAKA,yBAA+C;EAC7C,OAAO,KAAK,SAAS,uBAAuB,KAAK,CAAC;CACpD;CAOA,uBAAuB,GAAwC;EAC7D,IAAM,IAAI,KAAK;EAMf,AALI,IACF,EAAE,uBAAuB,CAAU,IAEnC,KAAK,IAAI,KAAK,mCAAmC,EAAE,cAAW,CAAC,GAEjE,KAAK,IAAI,KAAK,8BAA8B,EAAE,cAAW,CAAC;CAC5D;CAGA,sBAAsB,GAAqC;EACzD,IAAM,IAAU,KAAK,uBAAuB;EAC5C,KAAK,uBAAuB,CAAC,GAAG,GAAS,CAAS,CAAC;CACrD;CAGA,2BAAiC;EAC/B,KAAK,uBAAuB,CAAC,CAAC;CAChC;CAiBA,MAAM,iBACJ,GACA,IAOI,CAAC,GACyB;EAC9B,IAAM,IAAsC,CAAC;EAC7C,AAAI,EAAQ,UAAU,UAAU,EAAQ,cACtC,EAAc,QAAQ,CAAC,EAAQ,SAAS;EAE1C,IAAM,IAAU,MAAM,KAAK,WAAW,GAAO,CAAa,GACtD,IAAQ,EAAQ;EAIpB,IAHI,EAAQ,cACV,IAAQ,EAAQ,MAAK,MAAK,EAAE,cAAc,EAAQ,SAAS,KAAK,IAE9D,CAAC,GAAO,OAAO;EAEnB,IAAM,IAAgC;GACpC,IAAI,EAAM;GACV,WAAW,EAAM;GACjB,QAAQ,EAAM;GACd,OAAO,EAAQ,SAAS;GACxB,aAAa;GACb,OAAO,EAAQ,UAAU;GACzB,SAAS,EAAQ,WAAW,EAAM;EACpC;EAQA,OANA,KAAK,uBAAuB,CAAC,CAAS,CAAC,GAEnC,EAAQ,aAAa,MACvB,KAAK,SAAS,EAAM,WAAW,EAAE,QAAQ,GAAK,CAAC,GAG1C;CACT;CAIA,iBAA+B;EAC7B,OAAO,KAAK,kBAAkB,mBAAmB;CACnD;CAGA,gBAA6B;EAC3B,OAAO,KAAK,SAAS,cAAc,KAAK,CAAC;CAC3C;CAGA,QAAc;EACZ,KAAK,IAAI,KAAK,cAAc;CAC9B;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,iBAAiB,IAAM,GAAuB,CAAG,IAAI,KAAA;GACrD,aAAa,KAAK,kBAAkB,mBAAmB;GACvD,YAAY,EAAE,cAAc;GAC5B,WAAW,EAAE,aAAa;GAC1B,YAAY,EAAE,mBAAmB;EACnC,GACA,CACF;CACF;CAKA,kBAA0B;EACxB,IAAI,OAAO,SAAW,KAAa,OAAO;EAC1C,IAAM,IAAY,OAAO,aAAa;EACtC,OAAO,IAAY,EAAU,SAAS,IAAI;CAC5C;CAMA,MAAM,mBAAqC;EACzC,IAAM,IAAO,KAAK,gBAAgB;EAClC,IAAI,CAAC,GAAM,OAAO;EAClB,IAAM,IAAU,MAAM,GAAoB,CAAI;EAI9C,OAHI,KACF,KAAK,IAAI,KAAK,cAAc,EAAE,QAAK,CAAC,GAE/B;CACT;CAIA,KAAc;EAEZ,WAAW,MAAmB,CAAC;EAC/B,WAAW,MAAuB,KAAK,SAAS,CAAU;EAC1D,uBAAuB,MAAuB,KAAK,SAAS,CAAU;EACtE,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;GACpC,IAAI,IAAsB;GAM1B,AALI,MAAS,EAAK,YAAY,MAAM,YAAY,EAAK,YAAY,MAAM,gBACrE,IAAiB,WACR,KAAQ,EAAK,YAAY,MAAM,UACxC,IAAiB,QAEnB,KAAK,IAAI,KAAK,mBAAmB,EAAE,MAAM,EAAe,CAAC;EAC3D;EACA,uBAAuB,KAAK,gBAAgB;EAC5C,wBAAwB,KAAK,iBAAiB;EAC9C,gBAAgB,KAAK,IAAI,KAAK,qBAAqB;EACnD,eAAe,KAAK,IAAI,KAAK,oBAAoB;EACjD,kBAAkB,KAAK,IAAI,KAAK,qBAAqB;EACrD,iBAAiB,KAAK,IAAI,KAAK,oBAAoB;EACnD,eAAe,GAAW,GAAW,MAAkB;GACrD,AAAI,OAAO,SAAW,OACpB,OAAO,cAAc,IAAI,YAAY,wBAAwB,EAAE,QAAQ;IAAE;IAAM;IAAM;GAAQ,EAAE,CAAC,CAAC;EAErG;EACA,mBAAmB;GACjB,AAAI,OAAO,SAAW,OACpB,OAAO,cAAc,IAAI,YAAY,qBAAqB,CAAC;EAE/D;EACA,iBAAiB,MAAkD;GACjE,AAAI,OAAO,SAAW,OACpB,OAAO,cAAc,IAAI,YAAY,2BAA2B,EAAE,QAAQ,EAAE,QAAK,EAAE,CAAC,CAAC;EAEzF;EACA,mBAAmB,GAAgB,MAAmB;GACpD,AAAI,OAAO,SAAW,OACpB,OAAO,cAAc,IAAI,YAAY,6BAA6B,EAAE,QAAQ;IAAE;IAAQ;GAAO,EAAE,CAAC,CAAC;EAErG;CACF;CAEA,SAAkB,OAA6B;EAE7C,IAAI,oBAAuC;GACzC,OAAO,EAAK;EACd;EACA,gBAAgB;GACd,mBAAmB,GAAe,MAChC,EAAK,IAAI,GAAG,GAAO,CAAQ;GAC7B,sBAAsB,GAAe,MACnC,EAAK,IAAI,IAAI,GAAO,CAAQ;GAC9B,sBAA8B,EAAK,eAAe;GAClD,oBAA4B,EAAK,aAAa;GAC9C,WAAW,MAA6B,EAAK,SAAS,CAAU;GAChE,iBAAiB,MAA6B,EAAK,SAAS,CAAU;GACtE,uBAAuB,MAA6B,EAAK,SAAS,CAAU;GAC5E,oBAAoB,EAClB,cAAc,MAA4B,EAAK,YAAY,CAAO,EACpE;EACF;CACF,GAAA,CAAI,IAAI;AACV;;;AC3YA,eAAsB,GAAc,GAAmB,IAAqB,CAAC,GAAkB;CAC7F,IAAI,OAAO,WAAa,KAAa,MAAU,MAAM,gDAAgD;CACrG,IAAM,IAAO,IAAI,KAAK,CAAC,CAAiB,GAAG,EAAE,MAAM,kBAAkB,CAAC,GAChE,IAAM,IAAI,gBAAgB,CAAI,GAC9B,IAAS,SAAS,cAAc,QAAQ;CAK9C,AAJA,EAAO,MAAM,UAAU,gFACvB,EAAO,QAAQ,EAAK,SAAS,SAC7B,EAAO,aAAa,eAAe,MAAM,GAEzC,MAAM,IAAI,SAAe,GAAS,MAAW;EAC3C,IAAI,IAAU,IACR,UAAgB;GAEpB,AADA,EAAO,OAAO,GACd,IAAI,gBAAgB,CAAG;EACzB,GACM,UAAe;GACf,MACJ,IAAU,IACV,WAAW,GAAS,EAAK,aAAa,GAAK,GAC3C,EAAQ;EACV;EAqBA,AApBA,EAAO,eAAe;GACpB,IAAI;IACF,IAAM,IAAI,EAAO;IACjB,IAAI,CAAC,GAAG,MAAU,MAAM,iBAAiB;IAEzC,AADA,EAAE,MAAM,GACR,EAAE,MAAM;GACV,QAAQ;IAEN,OAAO,KAAK,GAAK,UAAU,UAAU;GACvC;GACA,EAAO;EACT,GACA,EAAO,gBAAgB;GAErB,AADA,EAAQ,GACH,MACH,IAAU,IACV,EAAO,gBAAI,MAAM,kDAAkD,CAAC;EAExE,GACA,SAAS,KAAK,YAAY,CAAM,GAChC,EAAO,MAAM;CACf,CAAC;AACH;;;ACKA,IAAM,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,SAAM,qBAAqB,GAC3E,YAAS,eAAY,oBACrB,sBAAmB,gBAAa,IAAO,cAAW,gBAAa,qBAC/D,uBAAmB,uBAAoB,0BAAsB,eAAW,IACxE,YAAQ,sBAAkB,IAAO,cAAU,IAAM,eAAW,IAAM,oBAAgB,IAClF,eAAW,WAAO,sCAAmC,IACrD,0BAAsB,IAAM,kBAAc,UAAU,2BAAuB,OACzE,GAGE,IAAS,EAAO,CAAK;CAC3B,EAAO,UAAU;CAEjB,IAAM,IAAU,EAAuB,IAAI,GACrC,IAAM,QAAc,IAAI,GAAU,GAAG,CAAC,CAAC,GACvC,IAAoB,QAAc,IAAI,GAAkB,GAAG,CAAC,CAAC,GAC7D,IAAc,EAAiC,IAAI;CACzD,AAA0B,EAAY,YAAU,IAAI,GAAkB,GAAK,CAAiB;CAC5F,IAAM,IAAW,EAAY;CAC7B,EAAoB,SAAW,GAAU,CAAC,CAAQ,CAAC;CAGnD,IAAM,KAAe,KAAW,GAC1B,CAAC,IAAQ,MAAa,EAA6B,EAAY,GAC/D,CAAC,IAAW,MAAgB,EAAS,CAAC;CAC5C,QAAgB;EACd,GAAU,EAAY;CACxB,GAAG,CAAC,EAAY,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,GAAiB,MAAsB,EAAS,MAAY,EAAa,GAC1E,CAAC,IAAkB,MAAuB,EAAS,EAAK,GACxD,CAAC,IAAY,MAAiB,EAAgC,UAAU,GACxE,CAAC,IAAO,KAAY,EAAS,OAAO,KAAiB,WAAW,IAAe,CAAG,GAClF,CAAC,GAAgB,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,MAAe,EAAS,CAAC,GAEpC,CAAC,IAAe,MAAoB,EAAS,EAAE,GAE/C,KAAuB,QACvB,KACK;EAAE,mBAAmB;EAAO,oBAAoB;EAAO,sBAAsB;EAAO,WAAW;CAAM,IAEvG;EACL,mBAAmB,GAAa,qBAAqB,MAAqB,MAAsB;EAChG,oBAAoB,GAAa,sBAAsB,KAAsB,MAAsB;EACnG,sBAAsB,GAAa,wBAAwB,MAAwB,MAAsB;EACzG,WAAW,GAAa,aAAa,KAAoB;CAC3D,GACC;EAAC;EAAU;EAAa;EAAmB;EAAoB;EAAsB;EAAmB;CAAgB,CAAC,GACtH,IAAqB,CAAC,MAAY,MAAsB,IAGxD,KAAgB,EAAM,aAAa,IACnC,KAAkB,EAAM,aAAa;CAoB3C,AAnBA,QAAgB;EACd,EAAkB,mBAAmB,MAAiB,KAAkB;GAAE,IAAI;GAAe,MAAM;EAAgB,IAAI,KAAA,CAAS;CAClI,GAAG;EAAC;EAAmB;EAAe;CAAe,CAAC,GACtD,QAAgB;EACd,EAAkB,YAAY,EAAQ;CACxC,GAAG,CAAC,GAAmB,EAAQ,CAAC,GAChC,QAAgB;EACd,EAAkB,iBAAiB,EAAQ,GAAa,aAAc;CACxE,GAAG,CAAC,GAAmB,GAAa,aAAa,CAAC,GAGlD,QAAgB;EAEd,AADA,EAAkB,MAAM,GACxB,EAAkB,YAAY,IAAI;CACpC,GAAG,CAAC,GAAmB,EAAM,CAAC,GAG9B,QAAgB,EAAkB,iBAAiB,sBAAsB,MAAM,EAAI,KAAK,qBAAqB,CAAC,CAAC,GAAG,CAAC,GAAmB,CAAG,CAAC,GAE1I,QAAgB;EACd,AAAI,GAAqB,sBAAsB,MAAS,OAAc,cAAY,GAAa,MAAM;CACvG,GAAG,CAAC,GAAqB,mBAAmB,EAAS,CAAC;CAGtD,IAAM,KAAgB,EAAoB,CAAC,CAAC,GACtC,KAAY,EAAyC,IAAI,GACzD,KAAU,EAAO;EAAE,SAAS;EAAG,OAAO;CAAE,CAAC,GACzC,KAAY,EAAO,EAAM;CAC/B,GAAU,UAAU;CACpB,IAAM,IAAiB,EAA0B,IAAI,GAC/C,KAAuB,EAAO,EAAK,GAGnC,CAAC,IAA6B,KAAkC,EAA+B,CAAC,CAAC,GACjG,KAAsB,QACnB,KAA2B,IACjC,CAAC,GAAyB,EAA2B,CAAC,GACnD,KAAyB,EAAO,EAAmB;CACzD,GAAuB,UAAU;CAEjC,IAAM,KAAyB,GAAa,MAAqC;EAE/E,AADA,EAA+B,CAAU,GACzC,EAAO,QAAQ,8BAA8B,CAAU;CACzD,GAAG,CAAC,CAAC;CAEL,SACE,EAAS,MACP;EACE,sBAAsB,EAAkB,mBAAmB;EAC3D,qBAAqB,GAAc;EACnC,oBAAoB,EAAO,QAAQ;EACnC,sBAAsB,GAAU;EAChC,sBAAsB,GAAU;EAChC,mBAAmB,EAAO,QAAQ;EAClC,0BAA0B,EAAO,QAAQ,aAAa;EACtD,sBAAsB,GAAQ,QAAQ;EACtC,oBAAoB,GAAQ,QAAQ;EACpC;EACA,WAAW,GAAiB,MAAmC;GAC7D,EAAI,KAAK,qBAAqB;IAAE,MAAM;IAAS,QAAQ,GAAS;GAAO,CAAC;EAC1E;EACA,8BAA8B,GAAuB;EACrD;CACF,GACA,EAAQ,OACV,SACa,EAAS,QAAQ,IAC7B;EAAC;EAAU;EAAmB;EAAc;EAAK;CAAsB,CAAC;CAG3E,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,GAAoB,EAAI,GACxB,GAAc,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,GAAoB,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,gBAAgB,YAAY;IACjC,IAAI;KAEF,MAAM,GAAc,MADD,EAAS,YAAY,GACd,EAAE,OAAO,EAAO,QAAQ,SAAS,CAAC;IAC9D,SAAS,GAAK;KAEZ,AADA,QAAQ,MAAM,sCAAsC,CAAG,GACvD,EAAI,KAAK,sBAAsB,EAAE,OAAO,EAAI,CAAC;IAC/C;GACF,CAAC;GACD,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;GACA,EAAI,GAAyC,oCAAoC,MAAM;IACrF,GAAuB,GAAG,cAAc,CAAC,CAAC;GAC5C,CAAC;GACD,EAAI,GAAG,2CAA2C;IAChD,GAAuB,CAAC,CAAC;GAC3B,CAAC;GAED,EAAI,GAA4B,oCAAoC,MAClE,EAAI,KAAK,yCAAyC,CAAC,CACrD;GACA,EAAI,GAAqB,yBAAyB,MAAM;IAEtD,AADA,EAAI,KAAK,gBAAgB,EAAE,MAAM,EAAE,KAAK,CAAC,GACzC,EAAO,QAAQ,iBAAiB,EAAE,MAAM,EAAE,KAAK,CAAC;GAClD,CAAC;GACD,EAAI,GAAqB,uBAAuB,MAAM;IAEpD,AADA,EAAI,KAAK,cAAc,EAAE,MAAM,EAAE,KAAK,CAAC,GACvC,EAAO,QAAQ,eAAe,EAAE,MAAM,EAAE,KAAK,CAAC;GAChD,CAAC;EACH;EACA,aAAa,EAAK,SAAS,MAAQ,EAAI,CAAC;CAC1C,GAAG;EAAC;EAAK;EAAU;CAAsB,CAAC;CAG1C,IAAM,KAAuB,GAC1B,GAAgC,MAAgB;EAM/C,AALA,GAAU,UAAU,GACpB,EAAkB,YAAY,CAAG,GACjC,GAAQ,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,GAAK,CAAiB,CACzB,GAEM,KAAkB,GACrB,GAAc,MAAgC;EAK7C,AAJA,GAAU,UAAU,MACpB,EAAkB,YAAY,IAAI,GAClC,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;EAAC;EAAK;EAAc;CAAiB,CACvC,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,KAAqB,GACxB,MAAuB;EACtB,IAAM,IAAM,GAAU,WAAW;EAEjC,AADA,EAAI,KAAK,gBAAgB;GAAE;GAAK;EAAW,CAAC,GAC5C,EAAO,QAAQ,iBAAiB;GAAE;GAAK;EAAW,CAAC;CACrD,GACA,CAAC,CAAG,CACN,GAEM,KAAmB,GACtB,GAAoB,MAAqB;EAGxC,AAFA,GAAQ,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;EAEtB,AADA,EAAI,KAAK,sBAAsB,EAAE,aAAa,EAAK,CAAC,GACpD,EAAO,QAAQ,sBAAsB,CAAI;CAC3C,GACA,CAAC,CAAG,CACN,GAEM,IAAyB,GAC5B,MAAsB;EAGrB,AAFA,GAAc,UAAU,GACxB,EAAI,KAAK,qBAAqB,EAAE,YAAY,EAAK,CAAC,GAClD,EAAO,QAAQ,qBAAqB,CAAI;CAC1C,GACA,CAAC,CAAG,CACN,GAEM,KAA0B,GAC7B,MAAsB;EAErB,AADA,EAAI,KAAK,qBAAqB,EAAE,YAAY,EAAK,CAAC,GAClD,EAAO,QAAQ,sBAAsB,CAAI;CAC3C,GACA,CAAC,CAAG,CACN,GAEM,EAAE,kBAAe,GAAa,GAC9B,KAAe,EAAyB,IAAI,GAE5C,KAAoB,QAAkB;EAC1C,AAAI,OACF,GAAoB,EAAI,GACxB,GAAc,QAAQ,GACtB,iBAAiB,EAAI,KAAK,qBAAqB,GAAG,EAAE;CAExD,GAAG,CAAC,IAAU,CAAG,CAAC,GAEZ,KAAiB,QAAkB;EACvC,GAAa,SAAS,MAAM;CAC9B,GAAG,CAAC,CAAC;CAwGL,OAtGA,QAAgB;EACd,IAAM,IAAY,EAAI,GAAG,sBAAsB,EAAiB,GAC1D,IAAgB,EAAI,GAAG,2BAA2B,EAAc;EACtE,aAAa;GAEX,AADA,EAAU,GACV,EAAc;EAChB;CACF,GAAG;EAAC;EAAK;EAAmB;CAAc,CAAC,GAG3C,QAAgB;EACd,AAAI,EAAQ,YAAY,SAAS,kBAAkB,SAAS,QAAQ,CAAC,SAAS,kBAC5E,EAAQ,QAAQ,MAAM,EAAE,eAAe,GAAK,CAAC;CAEjD,GAAG,CAAC,CAAC,GAGL,QAAgB;EACd,IAAM,KAAuB,MAAqB;GAChD,IAAM,IAAS,EAAE;GACjB,IACE,GAAQ,YAAY,WACpB,GAAQ,YAAY,cACpB,GAAQ,mBAER;GAGF,IAAM,IAAO,EAAQ;GAChB,UAGH,SAAS,kBAAkB,SAAS,QACpC,SAAS,kBAAkB,SAAS,mBACpC,SAAS,kBAAkB,QAC3B,EAAK,SAAS,SAAS,aAAa,MAEhC,CAAC,EAAK,SAAS,SAAS,aAAa,GAAG;IAC1C,IAAI,GAAc,GAAG,EAAW,QAAQ,CAAC,GAAG;KAE1C,AADA,EAAE,eAAe,GACjB,GAAkB;KAClB;IACF;IACA,IAAI,GAAc,GAAG,EAAW,aAAa,CAAC,GAAG;KAE/C,AADA,EAAE,eAAe,GACjB,GAAe;KACf;IACF;IACA,EAAI,KAAK,kBAAkB,CAAC;GAC9B;EAEJ;EAGA,OADA,OAAO,iBAAiB,WAAW,CAAmB,SACzC;GACX,OAAO,oBAAoB,WAAW,CAAmB;EAC3D;CACF,GAAG;EAAC;EAAK;EAAY;EAAmB;CAAc,CAAC,GA8CrD,kBAAC,EAAiB,UAAlB;EAA2B,OAAO;EAChC,UAAA,kBAAC,OAAD;GACE,KAAK;GACL,WAAW,CAAC,cAAc,EAAS,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK,GAAG;GACtD;GACP,UAAU;GACV,4BAAyB;GACzB,mBAlD4B,MAA2C;IAC3E,IAAI,GAAc,EAAE,aAAa,EAAW,QAAQ,CAAC,GAAG;KAEtD,AADA,EAAE,eAAe,GACjB,GAAkB;KAClB;IACF;IACA,IAAI,GAAc,EAAE,aAAa,EAAW,aAAa,CAAC,GAAG;KAE3D,AADA,EAAE,eAAe,GACjB,GAAe;KACf;IACF;IACA,EAAI,KAAK,kBAAkB,EAAE,WAAW;GAC1C;GAuCM,0BApCmC;IACvC,IAAM,IAAO,EAAQ;IACrB,AAAI,KAAQ,CAAC,EAAK,SAAS,SAAS,aAAa,KAAG,EAAK,MAAM,EAAE,eAAe,GAAK,CAAC;GACxF;GA0BI,UAAA;IASG,MACC,kBAAC,IAAD;KACa;KACX,eAAe,MAAQ;MACjB,IAAqB,sBAAsB,MAAS,MAAQ,eAChE,GAAa,CAAG;KAClB;KACiB;KACjB,qBAAqB,MAAS;MAAE,AAAI,MAAU,GAAmB,CAAI;KAAG;KACtD;KACG;KACT;KACL;KACP,gBAAgB,GAAU,MAAM,GAAoB,CAAC,CAAC;KACtD,iBAAiB,GAAU,MAAM,GAAqB,CAAC,CAAC;KACxD,YAAY,MAAM,EAAS,GAAW,CAAC,CAAC;KACxC,YAAY;KACZ,kBAAkB,EAAI,KAAK,iBAAiB;KAC5C,oBAnDqB;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;KA6CU,gBAAgB,EAAI,KAAK,iBAAiB;KAC1C,eAAe,EAAI,KAAK,cAAc;KACtC,sBAAsB,EAAkB,EAAI;KAC5C,mBAAmB,GAAoB,EAAI;KAC3C,mBA/Cc,MAA+B;MAChD,OACD,MAAoB,OAAe,IACrC,GAAoB,EAAK,KAEzB,GAAoB,EAAI,GACxB,GAAc,CAAG,GACb,MAAQ,YACV,iBAAiB,EAAI,KAAK,qBAAqB,GAAG,EAAE;KAG1D;KAqC0B;KACG;KACP;KACG;KACL;KACG;KACb,mBAAmB;KACP;KACH;KACT,aAAa;IACd,CAAA;IAEH,kBAAC,SAAD;KACE,KAAK;KACL,MAAK;KACL,QAAO;KACP,OAAO,EAAE,SAAS,OAAO;KACzB,WAAW,MAAM;MACf,IAAM,IAAO,EAAE,OAAO,QAAQ;MAC9B,IAAI,GAAM;OACR,IAAM,IAAM,IAAI,gBAAgB,CAAI;OACpC,GAAa,CAAG;MAClB;MACA,EAAE,OAAO,QAAQ;KACnB;KACA,eAAY;IACb,CAAA;IACD,kBAAC,OAAD;KAAK,OAAO;MAAE,SAAS;MAAQ,MAAM;MAAG,WAAW;MAAG,UAAU;KAAS;KACvE,UAAA,kBAAC,IAAD;MACE,iBAAiB,MAAY;MAC7B,kBAAkB,MAAY;MAClB;MACG;MACL;MACC;MACQ;MACnB,YAAY;MACD;MACM;MACT;MACI;MACK;MACV;MACG;MACV,qBAAqB;MACrB,oBAAoB;MACpB,qBAAqB;MACrB,kBAAkB;MAClB,aAAa;MACb,qBAAqB;MACrB,gBAAgB;MAChB,cAAc;MACE;MACJ;MACF;MACG;MACF;MACI;MACf,mBAAmB;MACN;MACP;MACe;MACrB,aAAa;MACqB;MACb;MACR;MACS;KACvB,CAAA;IACE,CAAA;IACJ,KACC,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;;;AC/lBD,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,KAAY"}