@mxmweb/fviewer 1.5.5 → 1.5.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +155 -506
- package/index.js +4 -3
- package/index.js.map +1 -1
- package/package.json +1 -1
- package/stats.html +1 -1
- package/examples/CoreReader/index.d.ts +0 -1
package/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../src/core/Annotation/index.tsx","../src/core/PdfRender/index.tsx","../src/core/Fviewer.tsx","../../../node_modules/.pnpm/lucide-react@0.456.0_react@18.3.1/node_modules/lucide-react/dist/esm/shared/src/utils.js","../../../node_modules/.pnpm/lucide-react@0.456.0_react@18.3.1/node_modules/lucide-react/dist/esm/defaultAttributes.js","../../../node_modules/.pnpm/lucide-react@0.456.0_react@18.3.1/node_modules/lucide-react/dist/esm/Icon.js","../../../node_modules/.pnpm/lucide-react@0.456.0_react@18.3.1/node_modules/lucide-react/dist/esm/createLucideIcon.js","../../../node_modules/.pnpm/lucide-react@0.456.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/chevron-left.js","../../../node_modules/.pnpm/lucide-react@0.456.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/chevron-right.js","../../../node_modules/.pnpm/lucide-react@0.456.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/download.js","../../../node_modules/.pnpm/lucide-react@0.456.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/pencil.js","../../../node_modules/.pnpm/lucide-react@0.456.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/rotate-ccw.js","../../../node_modules/.pnpm/lucide-react@0.456.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/rotate-cw.js","../../../node_modules/.pnpm/lucide-react@0.456.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/x.js","../../../node_modules/.pnpm/lucide-react@0.456.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/zoom-in.js","../../../node_modules/.pnpm/lucide-react@0.456.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/zoom-out.js","../src/adopters/components/Header/index.tsx","../src/core/utils/fileParser.ts","../src/adopters/StaticFileReader.tsx","../src/lib_enter.ts"],"sourcesContent":["import React, { useState, useRef, useCallback, useEffect } from 'react';\nimport { Trash2 } from 'lucide-react';\nimport type { Annotation as AnnotationType } from '../types';\n\nconst DEFAULT_COLOR = '#FFEB3B';\n\n// 生成唯一ID\nconst generateId = () => {\n return `annotation_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\n};\n\nexport interface AnnotationProps {\n pageNumber: number;\n scale: number;\n isAnnotating: boolean;\n annotations: AnnotationType[];\n onAnnotationAdd?: (annotation: AnnotationType) => void;\n onAnnotationDelete?: (annotationId: string) => void;\n readOnly?: boolean;\n}\n\nexport const Annotation: React.FC<AnnotationProps> = ({\n pageNumber,\n scale,\n isAnnotating,\n annotations = [],\n onAnnotationAdd,\n onAnnotationDelete,\n readOnly = false,\n}) => {\n const containerRef = useRef<HTMLDivElement>(null);\n const [isDrawing, setIsDrawing] = useState(false);\n const [startPoint, setStartPoint] = useState({ x: 0, y: 0 });\n const [currentRect, setCurrentRect] = useState<{\n x: number;\n y: number;\n width: number;\n height: number;\n } | null>(null);\n const [selectedAnnotation, setSelectedAnnotation] = useState<string | null>(null);\n\n // 移除复杂的容器尺寸监听,使用 inset-0 自动覆盖\n\n const handleMouseDown = useCallback(\n (e: React.MouseEvent) => {\n if (!isAnnotating || !containerRef.current) return;\n\n const rect = containerRef.current.getBoundingClientRect();\n // 转换为百分比坐标,考虑缩放因素\n // rect.width 和 rect.height 是缩放后的尺寸,需要除以 scale 得到未缩放尺寸\n const x = (e.clientX - rect.left) / rect.width;\n const y = (e.clientY - rect.top) / rect.height;\n\n console.log('鼠标按下位置:', { clientX: e.clientX, clientY: e.clientY, rect, x, y, scale });\n setIsDrawing(true);\n setStartPoint({ x, y });\n },\n [isAnnotating, scale]\n );\n\n const handleMouseMove = useCallback(\n (e: React.MouseEvent) => {\n if (!isDrawing || !containerRef.current) return;\n\n const rect = containerRef.current.getBoundingClientRect();\n // 转换为百分比坐标,考虑缩放因素\n // rect.width 和 rect.height 是缩放后的尺寸,直接使用即可\n const currentX = (e.clientX - rect.left) / rect.width;\n const currentY = (e.clientY - rect.top) / rect.height;\n\n setCurrentRect({\n x: Math.min(startPoint.x, currentX),\n y: Math.min(startPoint.y, currentY),\n width: Math.abs(currentX - startPoint.x),\n height: Math.abs(currentY - startPoint.y),\n });\n },\n [isDrawing, startPoint, scale]\n );\n\n const handleMouseUp = useCallback(() => {\n if (!isDrawing || !currentRect) return;\n\n setIsDrawing(false);\n if (currentRect.width < 5 || currentRect.height < 5) {\n setCurrentRect(null);\n return;\n }\n\n const newAnnotation: AnnotationType = {\n id: generateId(),\n pageNumber,\n ...currentRect,\n content: '',\n color: DEFAULT_COLOR,\n };\n\n onAnnotationAdd?.(newAnnotation);\n setCurrentRect(null);\n }, [isDrawing, currentRect, pageNumber, onAnnotationAdd]);\n\n const handleAnnotationClick = useCallback((annotationId: string) => {\n setSelectedAnnotation(selectedAnnotation === annotationId ? null : annotationId);\n }, [selectedAnnotation]);\n\n const handleContentChange = useCallback((annotation: AnnotationType, content: string) => {\n const updatedAnnotation = {\n ...annotation,\n content,\n };\n onAnnotationAdd?.(updatedAnnotation);\n }, [onAnnotationAdd]);\n\n const handleDeleteAnnotation = useCallback((annotationId: string) => {\n onAnnotationDelete?.(annotationId);\n setSelectedAnnotation(null);\n }, [onAnnotationDelete]);\n\n console.log('标注组件渲染:', {\n pageNumber,\n annotations: annotations.length,\n currentPageAnnotationsCount: annotations.filter(a => a.pageNumber === pageNumber).length,\n currentPageAnnotations: annotations.filter(a => a.pageNumber === pageNumber)\n });\n\n return (\n <div\n ref={containerRef}\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n width: '100%',\n height: '100%',\n zIndex: 10,\n pointerEvents: 'auto', // 确保可以接收鼠标事件\n }}\n onMouseDown={handleMouseDown}\n onMouseMove={handleMouseMove}\n onMouseUp={handleMouseUp}\n onMouseLeave={handleMouseUp}\n >\n {/* 当前绘制的标注 */}\n {currentRect && (\n <div\n className=\"absolute border-2 border-yellow-400 bg-yellow-100/30\"\n style={{\n left: `${currentRect.x * 100}%`,\n top: `${currentRect.y * 100}%`,\n width: `${currentRect.width * 100}%`,\n height: `${currentRect.height * 100}%`,\n }}\n />\n )}\n\n {/* 已保存的标注 */}\n {annotations\n .filter(anno => anno.pageNumber === pageNumber)\n .map(annotation => {\n console.log('渲染标注:', annotation.id, `位置: ${annotation.x * 100}%, ${annotation.y * 100}%`);\n return (\n <div key={annotation.id} style={{\n width: '100%',\n height: '100%',\n position: 'absolute',\n top: 0,\n left: 0,\n\n }} >\n <div\n className='border border-solid'\n style={{\n position: 'absolute',\n left: `${annotation.x * 100}%`,\n top: `${annotation.y * 100}%`,\n width: `${annotation.width * 100}%`,\n height: `${annotation.height * 100}%`,\n borderWidth: '2px',\n borderColor: `${annotation.color}`,\n backgroundColor: `${annotation.color}4D`, // 30%透明度 (4D = 77/255 ≈ 0.3)\n zIndex: 1000,\n }}\n onClick={() => handleAnnotationClick(annotation.id)}\n />\n </div>\n );\n })}\n </div>\n );\n};\n\nexport default Annotation;\n","import React, { useState, useCallback, useRef, useEffect, useLayoutEffect, useMemo } from 'react';\nimport * as pdfjsLib from 'pdfjs-dist';\nimport styled from 'styled-components';\nimport Annotation from '../Annotation';\nimport type { AppTheme, Annotation as AnnotationType } from '../types';\nimport { isPDFWorkerRegistered, getPDFWorkerPath } from '../../lib_enter';\n\n// 注意:不再自动注册 PDF Worker\n// Worker 应该由最终调用方在应用入口处通过 registerPDFWorker() 手动注册\n// 这样可以避免打包后函数引用问题,并给用户更多控制权\n\n// 默认主题\nconst defaultTheme: AppTheme = {\n colors: {\n primary: '#007bff',\n secondary: '#6c757d',\n success: '#008000',\n warning: '#FFA500',\n error: '#FF0000',\n info: '#0000FF',\n background: '#f8f9fa',\n text: '#343a40',\n border: '#dee2e6',\n disabled: '#808080',\n disabledBackground: '#F5F5F5',\n disabledText: '#808080',\n },\n space: {\n sidebar: 'md',\n size: 'md',\n radius: 'md',\n padding: 'md',\n margin: 'md',\n shadow: 'md',\n lineHeight: 'md',\n },\n};\n\n// PDF渲染组件属性接口\nexport interface PdfRenderProps {\n setScale?: (scale: number) => void;\n // PDF数据 - 统一接受已解析的PDFDocument对象\n pdfDocument: any | null;\n\n // 当前页码(全局页码)\n currentPage: number;\n\n // PDF文档的起始页码(用于分页PDF)\n pdfStartPage?: number;\n\n // 缩放比例\n scale: number;\n\n // 标注数据\n annotations: AnnotationType[];\n\n // 是否处于标注模式\n isAnnotating: boolean;\n\n // 是否为幻灯片模式(影响布局显示)\n isSlidesMode?: boolean;\n\n // 事件回调\n onPageChange?: (pageNumber: number) => void;\n onScaleChange?: (scale: number) => void; // 添加缩放更新回调\n onAnnotationChange?: (annotation: AnnotationType) => void;\n onAnnotationDelete?: (annotationId: string) => void;\n\n // 样式配置\n styles?: {\n theme?: AppTheme;\n };\n}\n\n// 样式组件\nconst LoadingText = styled.div<{ $theme: AppTheme }>`\n display: flex;\n align-items: center;\n justify-content: center;\n height: 200px;\n color: ${props => props.$theme.colors.disabledText};\n font-size: 14px;\n`;\n\nconst ErrorText = styled.div<{ $theme: AppTheme }>`\n display: flex;\n align-items: center;\n justify-content: center;\n height: 200px;\n color: ${props => props.$theme.colors.error};\n font-size: 14px;\n text-align: center;\n`;\n\n/**\n * PDF渲染组件\n * 负责PDF文件的具体渲染和标注功能\n *\n * @param props - 组件属性\n * @returns PDF渲染组件\n */\nconst PdfRender: React.FC<PdfRenderProps> = ({\n pdfDocument,\n currentPage,\n pdfStartPage = 1, // 默认从第1页开始\n scale,\n annotations,\n isAnnotating,\n isSlidesMode = false,\n setScale,\n onScaleChange,\n onAnnotationChange,\n onAnnotationDelete,\n styles,\n}) => {\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [canvasSize, setCanvasSize] = useState<any>(null);\n const [isInitialRender, setIsInitialRender] = useState(true);\n\n // 使用主题\n const mergedTheme = styles?.theme || defaultTheme;\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n const pageRendering = useRef(false);\n const pageCurrentNumber = useRef<number | null>(null);\n\n /**\n * 计算合适的初始缩放比例\n */\n const calculateAutoScale = useCallback(\n (viewport: any) => {\n if (!containerRef.current || !isInitialRender || !onScaleChange) return null;\n\n const container = containerRef.current;\n const containerWidth = container.offsetWidth - 40; // 减去padding\n const containerHeight = container.offsetHeight - 40; // 减去padding\n\n // 计算宽度和高度的缩放比例\n const scaleX = containerWidth / viewport.width;\n const scaleY = containerHeight / viewport.height;\n\n // 选择较小的缩放比例,确保内容完全显示\n const autoScale = Math.min(scaleX, scaleY, 1); // 不超过100%\n\n // 限制缩放范围在0.3到1之间\n const finalScale = Math.max(0.3, Math.min(1, autoScale));\n\n console.log('自动计算缩放比例:', {\n containerWidth,\n containerHeight,\n viewportWidth: viewport.width,\n viewportHeight: viewport.height,\n scaleX,\n scaleY,\n autoScale,\n finalScale,\n });\n\n return finalScale;\n },\n [isInitialRender, onScaleChange]\n );\n\n /**\n * 渲染PDF页面\n */\n const renderPage = useCallback(async () => {\n if (!pdfDocument || !canvasRef.current) return;\n\n // 防止重复渲染\n if (pageRendering.current || pageCurrentNumber.current === currentPage) {\n console.log('页面正在渲染中,跳过');\n return;\n }\n\n try {\n pageCurrentNumber.current = currentPage;\n pageRendering.current = true;\n\n // 计算PDF文档内的相对页码\n const relativePageNumber = currentPage - pdfStartPage + 1;\n console.log(\n `计算下,渲染页面: PDF起始页:pdfStartPage=${pdfStartPage}, 全局页码:currentPage=${currentPage}, 相对页码=${relativePageNumber}`\n );\n\n // 验证页码是否在PDF文档范围内\n if (relativePageNumber < 1 || relativePageNumber > pdfDocument.numPages) {\n console.error(\n `页码超出范围: 相对页码=${relativePageNumber}, PDF总页数=${pdfDocument.numPages}`\n );\n throw new Error(\n `页码超出范围: 请求第${currentPage}页,但PDF文档只包含${pdfDocument.numPages}页`\n );\n }\n\n const page = await pdfDocument.getPage(relativePageNumber);\n const canvas = canvasRef.current;\n\n const context = canvas.getContext('2d');\n\n // 使用scale直接调整viewport,而不是CSS transform\n console.log('当前scale值:', scale);\n const viewport = page.getViewport({ scale: 1 }); // 使用原始尺寸,让CSS transform处理缩放\n console.log('viewport尺寸:', viewport.width, 'x', viewport.height);\n\n // 暂时禁用自动缩放,先恢复PDF渲染\n if (isInitialRender) {\n setIsInitialRender(false);\n }\n canvas.width = viewport.width;\n canvas.height = viewport.height;\n if (canvas.width && canvas.height) {\n setCanvasSize({ width: canvas.width, height: canvas.height });\n }\n\n await page.render({\n canvasContext: context,\n viewport: viewport,\n }).promise;\n\n console.log('PDF渲染成功, canvas尺寸:', canvas.width, 'x', canvas.height);\n\n // 确保父容器能正确获取canvas尺寸\n if (containerRef.current) {\n const container = containerRef.current;\n console.log('容器尺寸:', container.offsetWidth, 'x', container.offsetHeight);\n console.log('Canvas显示尺寸:', canvas.offsetWidth, 'x', canvas.offsetHeight);\n }\n } catch (error) {\n console.error('PDF渲染失败:', error);\n } finally {\n pageRendering.current = false;\n }\n }, [pdfDocument, scale, pdfStartPage, calculateAutoScale, onScaleChange, currentPage]);\n\n // 监听当前页面变化,重新渲染\n useEffect(() => {\n if (pdfDocument && currentPage && pdfStartPage) {\n console.log(\n '计算下,renderPage:',\n 'pdfStartPage:' + pdfStartPage,\n 'currentPage:' + currentPage,\n 'pdfDocument:',\n pdfDocument\n );\n renderPage();\n }\n }, [currentPage, pdfDocument, pdfStartPage]);\n\n // 监听缩放变化,重新渲染当前页面\n useEffect(() => {\n if (pdfDocument && currentPage) {\n renderPage();\n }\n }, [scale, pdfDocument, currentPage]);\n\n if (isLoading) {\n return (\n <div className=\"flex justify-center items-center min-h-full\">\n <LoadingText $theme={mergedTheme}>加载中...</LoadingText>\n </div>\n );\n }\n\n if (error) {\n return (\n <div className=\"flex justify-center items-center min-h-full\">\n <ErrorText $theme={mergedTheme}>\n <div>\n <div>加载失败</div>\n <div style={{ fontSize: '12px', marginTop: '8px' }}>{error}</div>\n </div>\n </ErrorText>\n </div>\n );\n }\n\n const zoomTimer: any = useRef(null);\n const getInitialZoom = () => {\n const boxWidth = containerRef.current ? containerRef.current.offsetWidth - 40 : null;\n if (!boxWidth) return;\n if (!canvasSize?.width) return;\n const naturalWidth = canvasSize.width;\n const autoScale = boxWidth / naturalWidth;\n const finalScale = +autoScale.toFixed(2);\n if (typeof finalScale === 'number') {\n setScale && setScale(finalScale);\n } else {\n clearInterval(zoomTimer.current);\n zoomTimer.current = null;\n }\n };\n\n useEffect(() => {\n if (!containerRef.current || !canvasSize?.width || !canvasSize?.height) {\n clearInterval(zoomTimer.current);\n zoomTimer.current = null;\n zoomTimer.current = setInterval(() => {\n getInitialZoom();\n }, 34);\n return;\n } else {\n getInitialZoom();\n }\n return () => {\n clearInterval(zoomTimer.current);\n zoomTimer.current = null;\n };\n }, [canvasSize]);\n\n // 优化布局:支持大尺寸canvas的滚动\n return (\n <div\n ref={containerRef}\n className=\"bg-gray-100\"\n style={{\n display: isSlidesMode ? 'block' : 'flex',\n justifyContent: isSlidesMode ? 'initial' : 'center',\n alignItems: isSlidesMode ? 'initial' : 'flex-start',\n padding: '20px',\n minHeight: '100%',\n width: '100%',\n // 移除overflow设置,让外层容器处理滚动\n overflow: 'visible',\n }}\n >\n {isLoading ? (\n <div className=\"flex flex-col items-center gap-2 mt-20\">\n <div className=\"animate-spin rounded-full h-6 w-6 border-b-2 border-gray-900\" />\n <div className=\"text-xs text-gray-600\">PDF加载中...</div>\n </div>\n ) : error ? (\n <div className=\"flex flex-col items-center gap-2 mt-20 text-red-500\">\n <div>渲染错误</div>\n <div className=\"text-xs\">{error}</div>\n </div>\n ) : (\n <div className=\"flex justify-center items-start\">\n <div\n className=\"relative\"\n style={{\n transform: `scale(${scale})`,\n transformOrigin: 'center',\n display: 'inline-block', // 确保容器适应内容尺寸\n }}\n >\n <canvas\n ref={canvasRef}\n className=\"shadow-lg bg-white border border-gray-300\"\n style={{\n display: 'block',\n }}\n />\n <Annotation\n pageNumber={currentPage}\n scale={scale || 1}\n isAnnotating={isAnnotating}\n annotations={annotations}\n onAnnotationAdd={onAnnotationChange}\n onAnnotationDelete={onAnnotationDelete}\n readOnly={!isAnnotating}\n />\n </div>\n </div>\n )}\n </div>\n );\n};\n\nexport default PdfRender;\n","import React, { useState, useCallback, useEffect, useRef } from 'react';\nimport styled from 'styled-components';\nimport PdfRender from './PdfRender';\nimport { Markdownit, DataType } from '@mxmweb/rtext';\nimport type { AppTheme, Annotation, MDAnnotation, TableAnnotation, ToolsConfig } from './types';\n\n// 文件类型枚举\ntype FileType =\n | 'pdf'\n | 'image'\n | 'text'\n | 'markdown'\n | 'pdf_slides'\n | 'markdown_table'\n | 'html'\n | 'unknown';\n\n// Fviewer数据接口定义\n// 自定义组件接口\nexport interface CustomizeComponents {\n LoadingComponent?: React.ComponentType<{\n status: string;\n theme: AppTheme;\n }>;\n ErrorComponent?: React.ComponentType<{\n error: string;\n theme: AppTheme;\n }>;\n}\n\nexport interface FviewerData {\n content: any; // 文件内容\n fileName?: string; // 可选:文件名\n fileType?: string; // 可选:文件类型\n totalPages?: number; // 可选:总页数\n pdfStartPage?: number; // 可选:PDF文档的起始页码(用于分页PDF)\n}\n\n// Fviewer组件属性接口\nexport interface FviewerProps {\n // 数据相关\n data: FviewerData; // 文件数据\n annotationData?: (Annotation | MDAnnotation | TableAnnotation)[]; // 统一的标注数据\n totalPage?: number;\n currentPage?: number;\n scale?: number; // 缩放比例\n initialZoom?: number; // 初始缩放比例\n rotation?: number; // 旋转角度\n setScale?: (scale: number) => void;\n // 事件回调\n eventsEmit?: (name: string, data?: any, innerFn?: any) => void;\n\n // 样式配置\n styles?: {\n theme?: AppTheme;\n mode?: 'light' | 'dark';\n };\n\n // 工具配置\n tools?: ToolsConfig;\n\n // 自定义组件\n customComponents?: CustomizeComponents;\n\n // 自定义类名\n className?: string;\n contentClass?: string;\n}\n\n// 样式组件\nconst ContentContainer = styled.div<{ $theme: AppTheme }>`\n flex: 1;\n background: ${props => props.$theme.colors.background};\n position: relative;\n display: flex;\n flex-direction: column;\n scroll-behavior: smooth;\n\n min-height: 0; /* 确保flex子元素可以收缩 */\n height: calc(100% - 1px); /* 明确的高度设置,减去header高度 */\n /* 支持大尺寸内容的滚动 */\n overflow-x: auto;\n overflow-y: auto; /* 改为auto,允许垂直滚动 */\n`;\n\nconst LoadingContainer = styled.div<{ $theme: AppTheme }>`\n display: flex;\n align-items: center;\n justify-content: center;\n height: 100%;\n color: ${props => props.$theme.colors.disabledText};\n`;\n\nconst ErrorContainer = styled.div<{ $theme: AppTheme }>`\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 100%;\n color: ${props => props.$theme.colors.error};\n text-align: center;\n padding: 20px;\n`;\n\n// Markdown标注样式\nconst markdownAnnotationStyles = `\n .md-annotation {\n position: relative;\n display: inline;\n cursor: pointer;\n transition: opacity 0.2s;\n background-color: var(--highlight-color, #FFE599);\n }\n\n .md-annotation:hover {\n opacity: 0.8;\n }\n\n /* 表格标注样式 */\n .table-annotation {\n background-color: var(--table-highlight-color, rgba(255, 229, 153, 0.5));\n }\n\n /* markdown_table模式下的表格样式 */\n .markdown-table-mode table {\n overflow: visible !important;\n max-width: none !important;\n width: auto !important;\n table-layout: auto !important;\n }\n\n .markdown-table-mode table,\n .markdown-table-mode table * {\n overflow: visible !important;\n }\n\n .markdown-table-mode .table-container{\n margin: 0 !important;\n overflow: auto !important;\n width: 100% !important;\n min-width: 100% !important;\n }\n\n /* 确保表格单元格不会被压缩 */\n .markdown-table-mode table td,\n .markdown-table-mode table th {\n white-space: nowrap !important;\n min-width: 50px !important;\n }\n\n /* 移除fit-content,使用100%宽度确保内容能正常显示 */\n .markdown-table-mode div{\n width: fit-content !important;\n }\n\n /* 为表格添加最小宽度,确保内容不被压缩 */\n .markdown-table-mode table {\n min-width: fit-content !important;\n }\n\n .markdown-table-mode.markdown-scrollbar::-webkit-scrollbar {\n width: 12px;\n height: 12px;\n }\n\n\n /* 自定义滚动条样式 */\n .markdown-scrollbar::-webkit-scrollbar {\n width: 8px;\n height: 8px;\n }\n\n .markdown-scrollbar::-webkit-scrollbar-track {\n background: #f1f1f1;\n border-radius: 4px;\n }\n\n .markdown-scrollbar::-webkit-scrollbar-thumb {\n background: #c1c1c1;\n border-radius: 4px;\n }\n\n .markdown-scrollbar::-webkit-scrollbar-thumb:hover {\n background: #a9a9a;\n }\n`;\n\n// 默认主题\nconst defaultTheme: AppTheme = {\n colors: {\n primary: '#007bff',\n secondary: '#6c757d',\n success: '#008000',\n warning: '#FFA500',\n error: '#FF0000',\n info: '#0000FF',\n background: '#f8f9fa',\n text: '#343a40',\n border: '#dee2e6',\n disabled: '#808080',\n disabledBackground: '#F5F5F5',\n disabledText: '#808080',\n },\n space: {\n sidebar: 'md',\n size: 'md',\n radius: 'md',\n padding: 'md',\n margin: 'md',\n shadow: 'md',\n lineHeight: 'md',\n },\n};\n\n/**\n * 检测文件类型\n */\nconst detectFileType = (data: any): FileType => {\n console.log('=== detectFileType 开始 ===');\n console.log('输入数据:', data);\n\n if (!data) {\n console.log('数据为空,返回 unknown');\n return 'unknown';\n }\n\n const fileName = data.fileName || '';\n const fileType = data.fileType || '';\n const content = data.content;\n\n console.log('检测参数:', { fileName, fileType, content });\n\n // 优先使用 fileType 参数进行检测,这是最准确的\n if (fileType === 'pdf' || fileType === 'pdf_slides') {\n console.log('检测到PDF文件');\n return fileType as FileType;\n }\n if (fileType === 'image') {\n console.log('检测到图片文件');\n return 'image';\n }\n if (fileType === 'markdown_table') {\n console.log('检测到Markdown表格文件');\n return 'markdown_table';\n }\n if (fileType === 'markdown') {\n console.log('检测到Markdown文件');\n return 'markdown';\n }\n if (fileType === 'html') {\n console.log('检测到HTML文件');\n return 'html';\n }\n if (fileType === 'text') {\n console.log('检测到文本文件');\n return 'text';\n }\n\n // 如果 fileType 没有明确指定,则根据文件名和内容进行推断\n if (fileName.toLowerCase().endsWith('.pdf') || content?.type === 'pdf') {\n console.log('检测到PDF文件');\n return 'pdf';\n }\n if (fileName.toLowerCase().match(/\\.(jpg|jpeg|png|gif|bmp|webp)$/) || content?.type === 'image') {\n console.log('检测到图片文件');\n return 'image';\n }\n if (fileName.toLowerCase().endsWith('.md') || content?.type === 'markdown') {\n console.log('检测到Markdown文件');\n return 'markdown';\n }\n if (fileName.toLowerCase().match(/\\.(html|htm)$/) || content?.type === 'html') {\n console.log('检测到HTML文件');\n return 'html';\n }\n if (fileName.toLowerCase().match(/\\.(txt|log|json|xml|css|js|ts)$/) || content?.type === 'text') {\n console.log('检测到文本文件');\n return 'text';\n }\n\n console.log('未识别的文件类型,返回 unknown');\n return 'unknown';\n};\n\n/**\n * 渲染PDF内容\n */\nconst renderPdfContent = (\n data: any,\n props: FviewerProps,\n isSlidesMode: boolean = false,\n setScale: ((scale: number) => void) | undefined = undefined\n) => {\n console.log(\n '计算下,renderPdfContent:',\n 'pdfStartPage:' + data.pdfStartPage,\n 'currentPage:' + props.currentPage\n );\n console.log('=== renderPdfContent 开始 ===');\n console.log('PDF数据:', data);\n console.log('PDF文档:', data.content?.document);\n console.log('PDF文档类型:', typeof data.content?.document);\n console.log('PDF文档是否为null:', data.content?.document === null);\n console.log('PDF文档是否为undefined:', data.content?.document === undefined);\n console.log(\n 'PDF文档方法:',\n data.content?.document\n ? Object.getOwnPropertyNames(Object.getPrototypeOf(data.content.document))\n : '无文档'\n );\n console.log(\n 'PDF文档属性:',\n data.content?.document ? Object.keys(data.content.document) : '无文档'\n );\n\n // 计算PDF文档的起始页码(用于分页PDF)\n const pdfStartPage = data.pdfStartPage || 1;\n console.log('PDF起始页:', pdfStartPage);\n\n // 过滤出PDF标注数据\n const pdfAnnotations = (props.annotationData || []).filter(\n anno => 'pageNumber' in anno && 'x' in anno && 'y' in anno\n ) as Annotation[];\n\n console.log('=== PDF标注数据 ===');\n console.log('原始annotationData:', props.annotationData);\n console.log('过滤后的pdfAnnotations:', pdfAnnotations);\n\n // 根据文件类型设置默认缩放值\n const defaultScale = isSlidesMode ? 0.82 : 1;\n\n // 优先使用initialZoom,然后是scale,最后是默认值\n const finalScale = props.initialZoom || props.scale || defaultScale;\n\n return (\n <PdfRender\n pdfDocument={data.content?.document || null}\n currentPage={props.currentPage || 1}\n pdfStartPage={pdfStartPage}\n scale={finalScale} // 使用计算后的最终缩放值\n setScale={setScale}\n annotations={pdfAnnotations}\n isAnnotating={false} // PDF模式关闭标注功能\n isSlidesMode={isSlidesMode}\n onPageChange={\n props.eventsEmit\n ? (pageNumber: number) => props.eventsEmit?.('pageChange', { pageNumber })\n : undefined\n }\n onScaleChange={\n props.eventsEmit\n ? (scale: number) => props.eventsEmit?.('scaleChange', { scale })\n : undefined\n }\n onAnnotationChange={\n props.eventsEmit\n ? (annotation: Annotation) => props.eventsEmit?.('annotationChange', { annotation })\n : undefined\n }\n onAnnotationDelete={\n props.eventsEmit\n ? (annotationId: string) => props.eventsEmit?.('annotationDelete', { annotationId })\n : undefined\n }\n styles={props.styles}\n />\n );\n};\n\n/**\n * 渲染图片内容\n */\nconst renderImageContent = (data: any, props: FviewerProps) => {\n console.log('=== Fviewer renderImageContent ===');\n console.log('data:', data);\n console.log('data.content:', data.content);\n console.log('data.content?.url:', data.content?.url);\n console.log('rotation:', props.rotation);\n\n const imageUrl = data.content?.url || data.content;\n const [imageLoading, setImageLoading] = useState(true);\n const [imageError, setImageError] = useState(false);\n\n const handleImageLoad = () => {\n console.log('图片加载完成:', imageUrl);\n setImageLoading(false);\n setImageError(false);\n };\n\n const handleImageError = () => {\n console.error('图片加载失败:', imageUrl);\n setImageLoading(false);\n setImageError(true);\n };\n\n return (\n <div\n style={{\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n height: '100%',\n padding: '20px',\n overflow: 'auto',\n position: 'relative',\n backgroundColor: '#272727', // 图片模式深色背景\n }}\n >\n {imageLoading && (\n <div\n style={{\n position: 'absolute',\n top: '50%',\n left: '50%',\n transform: 'translate(-50%, -50%)',\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n gap: '12px',\n zIndex: 1,\n }}\n >\n <div\n style={{\n width: '32px',\n height: '32px',\n border: `3px solid ${props.styles?.theme?.colors?.border || '#dee2e6'}`,\n borderTop: `3px solid ${props.styles?.theme?.colors?.primary || '#007bff'}`,\n borderRadius: '50%',\n animation: 'spin 1s linear infinite',\n }}\n />\n <div\n style={{\n fontSize: '12px',\n color: props.styles?.theme?.colors?.text || '#343a40',\n }}\n >\n 图片加载中...\n </div>\n </div>\n )}\n\n {imageError && (\n <div\n style={{\n position: 'absolute',\n top: '50%',\n left: '50%',\n transform: 'translate(-50%, -50%)',\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n gap: '8px',\n zIndex: 1,\n }}\n >\n <div\n style={{\n fontSize: '14px',\n color: props.styles?.theme?.colors?.error || '#dc3545',\n }}\n >\n 图片加载失败\n </div>\n </div>\n )}\n\n <img\n src={imageUrl}\n alt={data.fileName || '图片'}\n onLoad={handleImageLoad}\n onError={handleImageError}\n style={{\n maxWidth: '100%',\n maxHeight: '100%',\n objectFit: 'contain',\n transform: `scale(${props.scale || 1}) rotate(${props.rotation || 0}deg)`,\n opacity: imageLoading ? 0 : 1,\n transition: 'opacity 0.3s ease-in-out, transform 0.2s ease-in-out',\n }}\n />\n\n <style>{`\n @keyframes spin {\n 0% { transform: rotate(0deg); }\n 100% { transform: rotate(360deg); }\n }\n `}</style>\n </div>\n );\n};\n\n/**\n * 渲染文本内容\n */\nconst renderTextContent = (data: any, props: FviewerProps) => {\n console.log('=== Fviewer renderTextContent ===');\n console.log('data:', data);\n console.log('data.content:', data.content);\n\n // 获取实际的文本内容 - 兼容多种数据结构\n let textContent = '';\n if (typeof data.content === 'string') {\n textContent = data.content;\n } else if (data.content?.text) {\n // 线上环境:{ type: 'text', text: '...' }\n textContent = data.content.text;\n } else if (data.content?.content) {\n // 本地环境:{ content: '...' }\n textContent = data.content.content;\n }\n console.log('实际文本内容:', textContent);\n\n // 使用 ref 来动态调整纸张高度\n const textRef = useRef<HTMLDivElement>(null);\n const paperRef = useRef<HTMLDivElement>(null);\n\n // 动态调整纸张高度的 useEffect\n useEffect(() => {\n if (textRef.current && paperRef.current && textContent) {\n // 延迟执行,确保内容完全渲染\n const timer = setTimeout(() => {\n const textHeight = textRef.current?.scrollHeight || 0;\n const minHeight = Math.max(textHeight + 80, 200); // 至少200px高度,加上padding\n\n if (paperRef.current) {\n paperRef.current.style.minHeight = `${minHeight}px`;\n console.log('文本纸张高度调整完成:', minHeight);\n }\n }, 100);\n\n return () => clearTimeout(timer);\n }\n }, [textContent]);\n\n return (\n <div\n style={{\n height: '100%',\n overflow: 'auto',\n backgroundColor: '#f5f5f5', // 纸张背景色\n padding: '20px',\n display: 'flex',\n justifyContent: 'center',\n position: 'relative',\n }}\n >\n {/* 纸张容器 */}\n <div\n ref={paperRef}\n style={{\n width: '100%',\n maxWidth: '800px',\n backgroundColor: 'white',\n boxShadow: '0 4px 8px rgba(0, 0, 0, 0.1), 0 2px 4px rgba(0, 0, 0, 0.06)',\n borderRadius: '8px',\n padding: '40px',\n margin: '20px 0',\n position: 'relative',\n transform: `scale(${props.scale || 1})`,\n transition: 'transform 0.2s ease-in-out',\n transformOrigin: 'top center',\n }}\n >\n {/* 使用 rtext 组件渲染文本内容 */}\n <div\n ref={textRef}\n style={{\n width: '100%',\n overflow: 'visible',\n }}\n >\n <Markdownit\n dataSource={{\n type: DataType.TEXT,\n content: textContent,\n }}\n size=\"md\"\n theme={{\n primaryColor: props.styles?.theme?.colors?.primary || '#007bff',\n backgroundColor: 'transparent',\n textColor: '#333',\n borderColor: 'transparent',\n borderRadius: '0',\n padding: '0',\n }}\n style={{\n border: 'none',\n background: 'transparent',\n width: '100%',\n height: 'auto',\n overflow: 'visible',\n }}\n />\n </div>\n\n {/* 简约的顶部装饰效果 */}\n <div\n style={{\n position: 'absolute',\n top: '0',\n left: '0',\n right: '0',\n height: '2px',\n background: 'linear-gradient(90deg, #e0e0e0 0%, #f0f0f0 50%, #e0e0e0 100%)',\n borderTopLeftRadius: '8px',\n borderTopRightRadius: '8px',\n }}\n />\n </div>\n </div>\n );\n};\n\n/**\n * 渲染Markdown内容\n */\n// 将 Markdown 渲染逻辑提取为真正的 React 子组件,避免在渲染过程中条件执行 Hook\nconst MarkdownContentView: React.FC<{\n data: any;\n parentProps: FviewerProps;\n isTableMode?: boolean;\n}> = ({ data, parentProps, isTableMode = false }) => {\n const markdownRef = useRef<HTMLDivElement>(null);\n const annotationTimeoutRef = useRef<number | null>(null);\n const tableObserverRef = useRef<MutationObserver | null>(null);\n const tableReapplyInProgressRef = useRef<boolean>(false);\n const lastMutationTsRef = useRef<number>(0);\n const idleDisconnectTimerRef = useRef<number | null>(null);\n const [isAnnotating] = useState(false);\n\n const handleScroll = (scrollTop: number, scrollHeight: number) => {\n console.log('=== Markdownit滚动事件触发 ===');\n console.log('滚动位置:', { scrollTop, scrollHeight });\n\n if (parentProps.eventsEmit) {\n // 直接传递滚动信息给业务层,让业务层决定如何处理\n parentProps.eventsEmit('markdown_scroll', { scrollTop, scrollHeight });\n }\n };\n\n const handleScrollToTop = () => {\n console.log('=== Markdownit滚动到顶部 ===');\n if (parentProps.eventsEmit) {\n parentProps.eventsEmit('markdown_scroll_to_top');\n }\n };\n\n const handleScrollToBottom = () => {\n console.log('=== Markdownit滚动到底部 ===');\n if (parentProps.eventsEmit) {\n parentProps.eventsEmit('markdown_scroll_to_bottom');\n }\n };\n\n // Markdownit 渲染完成回调:仅在表格模式下一次性应用表格标注\n const handleMarkdownRenderedRef = useRef<(root: HTMLElement) => void>();\n handleMarkdownRenderedRef.current = (root: HTMLElement) => {\n try {\n if (!isTableMode) return;\n const content = typeof data.content === 'string' ? data.content : data.content?.content || '';\n if (!content || tableAnnotations.length === 0) return;\n const annoSig = JSON.stringify(tableAnnotations.map(a => ({ o: a.offsets, c: a.color })));\n const runtimeSig = `${content.length}:${content.substring(0, 64)}:${content.substring(content.length - 64)}|${annoSig}`;\n const prevSig = (root as any).dataset?.tableAnnoRuntimeSig;\n if (prevSig === runtimeSig) return;\n setTimeout(() => {\n applyTableAnnotations();\n if ((root as any).dataset) {\n (root as any).dataset.tableAnnoRuntimeSig = runtimeSig;\n }\n }, 50);\n } catch (e) {\n console.warn('[MarkdownRendered] apply failed', e);\n }\n };\n const handleMarkdownRendered = React.useCallback(\n (root: HTMLElement) => handleMarkdownRenderedRef.current?.(root),\n []\n );\n\n // 处理文本选择和高亮\n const handleTextSelection = useCallback(() => {\n if (!isAnnotating || !markdownRef.current) return;\n\n const selection = window.getSelection();\n if (!selection || selection.isCollapsed) return;\n\n const range = selection.getRangeAt(0);\n const text = range.toString().trim();\n if (!text) return;\n\n // 计算选中文本的绝对位置\n const container = markdownRef.current;\n let charCount = 0;\n let startOffset = 0;\n\n const walker = document.createTreeWalker(container, NodeFilter.SHOW_TEXT, {\n acceptNode: node => {\n // 跳过代码块内的文本\n if (node.parentElement?.closest('pre')) {\n return NodeFilter.FILTER_REJECT;\n }\n return NodeFilter.FILTER_ACCEPT;\n },\n });\n\n let node: Node | null = walker.nextNode();\n while (node) {\n if (node === range.startContainer) {\n startOffset = charCount + range.startOffset;\n break;\n }\n charCount += node.textContent?.length || 0;\n node = walker.nextNode();\n }\n\n console.log('选中文本信息:', {\n text,\n startOffset,\n charCount,\n container: range.startContainer.textContent,\n });\n\n const newAnnotation: MDAnnotation = {\n id: `md-anno-${Date.now()}`,\n start: startOffset,\n end: startOffset + text.length,\n color: '#FFE599',\n };\n\n console.log('创建新标注:', newAnnotation);\n if (parentProps.eventsEmit) {\n parentProps.eventsEmit('md_annotation_add', newAnnotation);\n }\n selection.removeAllRanges();\n }, [isAnnotating, parentProps.eventsEmit]);\n\n // 根据模式过滤标注数据\n const mdAnnotations = isTableMode\n ? [] // markdown_table模式不使用MDAnnotation\n : ((parentProps.annotationData || []).filter(\n anno => 'start' in anno && 'end' in anno && !('pageNumber' in anno)\n ) as MDAnnotation[]);\n\n // 过滤出Table标注数据\n const tableAnnotations = isTableMode\n ? ((parentProps.annotationData || []).filter(\n anno => 'offsets' in anno && Array.isArray(anno.offsets)\n ) as TableAnnotation[])\n : [];\n\n /**\n * 清空所有标注的函数\n * 移除所有标注元素,恢复原始文本和样式\n */\n const clearAllAnnotations = useCallback(() => {\n console.log('=== 开始清空所有标注 ===');\n\n if (!markdownRef.current) {\n console.log('markdownRef不存在,无法清空标注');\n return;\n }\n\n // 清空Markdown标注\n const existingMdAnnotations = markdownRef.current.querySelectorAll('.md-annotation');\n console.log('清空Markdown标注数量:', existingMdAnnotations.length);\n\n if (existingMdAnnotations.length > 0) {\n existingMdAnnotations.forEach(el => {\n const parent = el.parentNode;\n if (parent) {\n // 将标注元素替换为原始文本\n parent.replaceChild(document.createTextNode(el.textContent || ''), el);\n }\n });\n }\n\n // 不再清空表格背景色,避免已应用的表格高亮被重置\n\n console.log('所有标注已清空');\n }, []);\n\n // 清空表格标注的函数\n const clearTableAnnotations = useCallback(() => {\n if (!markdownRef.current) return;\n\n const tables = markdownRef.current.querySelectorAll('table');\n tables.forEach(table => {\n const allRows = Array.from(table.rows);\n allRows.forEach(row => {\n Array.from(row.cells).forEach(cell => {\n if (cell.getAttribute('data-table-annotated') === '1') {\n cell.style.removeProperty('background');\n cell.style.removeProperty('background-color');\n cell.removeAttribute('data-table-annotated');\n cell.removeAttribute('title');\n }\n });\n });\n });\n console.log('已清空所有表格标注');\n }, []);\n\n // 应用表格标注的函数\n const applyTableAnnotations = useCallback(() => {\n console.log('=== 开始应用表格标注 ===');\n console.log('tableAnnotations:', tableAnnotations);\n\n if (!markdownRef.current) {\n console.log('markdownRef不存在,退出');\n return;\n }\n\n // 先清空所有旧的表格标注\n clearTableAnnotations();\n\n if (!tableAnnotations.length) {\n console.log('没有表格标注数据,仅清空旧标注');\n return;\n }\n\n // 查找所有表格\n const tables = markdownRef.current.querySelectorAll('table');\n console.log('找到表格数量:', tables.length);\n if (tables.length === 0) {\n console.log('没有找到表格元素');\n return;\n }\n\n tableReapplyInProgressRef.current = true;\n tableAnnotations.forEach((annotation, i: number) => {\n const offsets = annotation.offsets;\n console.log('处理表格标注:', annotation);\n\n // 只判断 offsets 是否为 [ [number, number], ... ]\n if (\n !Array.isArray(offsets) ||\n !offsets.length ||\n !Array.isArray(offsets[0]) ||\n offsets[0].length !== 2\n ) {\n console.warn('[TableAnnotation] annotation.offsets is not valid', annotation);\n return;\n }\n\n offsets.forEach((offset: [number, number], index: number) => {\n const [row, col] = offset;\n if (typeof row !== 'number' || typeof col !== 'number') {\n console.warn('[TableAnnotation] offset is not [number, number]', offset);\n return;\n }\n\n // 遍历所有表格,找到对应的单元格\n tables.forEach((table, tableIndex) => {\n // 从表头开始计算,row=0 指向表头第一行\n const allRows = Array.from(table.rows);\n const rowEl = allRows[row];\n if (!rowEl) {\n console.warn('[TableAnnotation] row out of range', {\n row,\n tableIndex,\n totalRows: allRows.length,\n });\n return;\n }\n\n const cell = rowEl.cells?.[col] as HTMLTableCellElement | undefined;\n if (!cell) {\n console.warn('[TableAnnotation] cell is undefined', { row, col, tableIndex });\n return;\n }\n\n const targetColor = annotation.color || 'rgba(255, 229, 153, 0.5)';\n const computedBg = getComputedStyle(cell).backgroundColor;\n const alreadyAnnotated =\n cell.getAttribute('data-table-annotated') === '1' &&\n (computedBg === targetColor || cell.style.backgroundColor === targetColor);\n if (!alreadyAnnotated) {\n cell.style.setProperty('background', targetColor, 'important');\n cell.style.setProperty('background-color', targetColor, 'important');\n cell.setAttribute('data-table-annotated', '1');\n }\n if (annotation.content) cell.title = annotation.content;\n\n if (index === 0 && i === 0) {\n setTimeout(() => {\n cell.scrollIntoView({ behavior: 'smooth', block: 'start' });\n }, 300);\n }\n });\n });\n });\n\n requestAnimationFrame(() => {\n tableReapplyInProgressRef.current = false;\n });\n }, [tableAnnotations, clearTableAnnotations]);\n\n // 应用Markdown标注的函数\n const applyMarkdownAnnotations = useCallback(() => {\n console.log('=== 开始应用Markdown标注 ===');\n\n if (!markdownRef.current || !mdAnnotations.length) {\n console.log('条件不满足,跳过标注应用');\n return;\n }\n\n // 清除之前的定时器,避免重复应用\n if (annotationTimeoutRef.current) {\n clearTimeout(annotationTimeoutRef.current);\n }\n\n // 直接应用标注,不使用MutationObserver避免时序问题\n const applyMarkdownAnnotationsInner = () => {\n console.log('开始应用标注...');\n\n // 移除现有标注\n const existingAnnotations = markdownRef.current?.querySelectorAll('.md-annotation');\n console.log('移除现有标注数量:', existingAnnotations?.length || 0);\n existingAnnotations?.forEach(el => {\n const parent = el.parentNode;\n if (parent) {\n parent.replaceChild(document.createTextNode(el.textContent || ''), el);\n }\n });\n\n // 获取所有文本节点\n const walker = document.createTreeWalker(markdownRef.current!, NodeFilter.SHOW_TEXT, {\n acceptNode: node => {\n // 跳过代码块内的文本\n if (node.parentElement?.closest('pre')) {\n return NodeFilter.FILTER_REJECT;\n }\n return NodeFilter.FILTER_ACCEPT;\n },\n });\n\n const textNodes: Text[] = [];\n let node: Text | null;\n while ((node = walker.nextNode() as Text)) {\n textNodes.push(node);\n }\n\n console.log('找到文本节点数量:', textNodes.length);\n\n if (textNodes.length === 0) {\n console.log('没有找到文本节点,延迟重试...');\n // 延迟重试,确保DOM完全渲染\n annotationTimeoutRef.current = setTimeout(() => {\n applyMarkdownAnnotationsInner();\n }, 200);\n return;\n }\n\n // 计算每个文本节点的起始位置\n let totalLength = 0;\n const nodePositions = textNodes.map(node => {\n const start = totalLength;\n totalLength += node.textContent?.length || 0;\n return {\n node,\n start,\n end: totalLength,\n text: node.textContent,\n };\n });\n\n console.log('文本节点位置:', nodePositions);\n console.log('总文本长度:', totalLength);\n\n // 应用标注\n const sortedAnnotations = [...mdAnnotations].sort((a, b) => b.start - a.start);\n console.log('排序后的标注:', sortedAnnotations);\n\n sortedAnnotations.forEach(annotation => {\n const { start, end, color } = annotation;\n console.log('处理标注:', { annotation, nodePositions });\n\n // 找到相关的文本节点\n const relevantNodes = nodePositions.filter(pos => start < pos.end && end > pos.start);\n\n console.log('相关节点数量:', relevantNodes.length);\n\n relevantNodes.forEach(({ node, start: nodeStart }) => {\n const localStart = Math.max(0, start - nodeStart);\n const localEnd = Math.min(node.textContent?.length || 0, end - nodeStart);\n\n console.log('本地位置:', {\n localStart,\n localEnd,\n nodeTextLength: node.textContent?.length,\n });\n\n if (localStart >= localEnd) {\n console.log('本地位置无效,跳过');\n return;\n }\n\n const before = node.textContent?.slice(0, localStart) || '';\n const annotatedText = node.textContent?.slice(localStart, localEnd) || '';\n const after = node.textContent?.slice(localEnd) || '';\n\n console.log('分割文本:', { before, annotatedText, after });\n\n const span = document.createElement('span');\n span.className = 'md-annotation';\n span.style.backgroundColor = color || '#FFE599';\n span.textContent = annotatedText;\n\n const fragment = document.createDocumentFragment();\n if (before) fragment.appendChild(document.createTextNode(before));\n fragment.appendChild(span);\n if (after) fragment.appendChild(document.createTextNode(after));\n\n node.parentNode?.replaceChild(fragment, node);\n console.log('成功应用标注:', annotatedText);\n });\n });\n };\n\n // 延迟应用标注,确保DOM完全渲染\n annotationTimeoutRef.current = setTimeout(() => {\n applyMarkdownAnnotationsInner();\n }, 100);\n }, [mdAnnotations]);\n\n // 应用标注高亮(表格模式改由 onRendered 触发,这里跳过)\n useEffect(() => {\n if (isTableMode) {\n console.log('[MarkdownContentView] table mode: skip effect, wait for onRendered');\n return;\n }\n // 获取实际的内容字符串\n const content = typeof data.content === 'string' ? data.content : data.content?.content || '';\n\n if (!content || typeof content !== 'string') {\n console.log('Markdown内容不是字符串类型,跳过标注应用');\n return;\n }\n\n console.log('=== 开始应用Markdown标注高亮 ===');\n console.log('markdownRef.current:', markdownRef.current);\n console.log('isTableMode:', isTableMode);\n console.log('mdAnnotations:', mdAnnotations);\n console.log('tableAnnotations:', tableAnnotations);\n console.log('data.content:', data.content);\n console.log('实际内容:', content);\n\n if (!markdownRef.current) {\n console.log('markdownRef不存在,退出标注应用');\n return;\n }\n\n // 表格模式不清空,避免已应用高亮被抹掉\n if (!isTableMode) {\n clearAllAnnotations();\n }\n\n // 表格模式下不从 effect 触发,交由 onRendered\n\n // 如果是普通markdown模式且有markdown标注,应用markdown标注\n if (!isTableMode && mdAnnotations.length > 0) {\n applyMarkdownAnnotations();\n return;\n }\n\n console.log('没有需要应用的标注');\n }, [isTableMode, tableAnnotations, mdAnnotations]);\n\n // 监听文本选择事件\n useEffect(() => {\n // 只在非表格模式下启用文本选择标注\n if (!isTableMode) {\n document.addEventListener('mouseup', handleTextSelection);\n return () => {\n document.removeEventListener('mouseup', handleTextSelection);\n };\n }\n }, [handleTextSelection, isTableMode]);\n\n // 调试:打印markdown内容信息\n useEffect(() => {\n // 获取实际的内容字符串\n const content = typeof data.content === 'string' ? data.content : data.content?.content || '';\n\n if (!content || typeof content !== 'string') {\n console.log('Markdown内容不是字符串类型,跳过调试信息打印');\n return;\n }\n\n console.log('=== Markdown内容信息 ===');\n console.log('isTableMode:', isTableMode);\n console.log('内容长度:', content.length || 0);\n\n // 安全检查:确保content是字符串类型才调用substring方法\n if (typeof content === 'string') {\n console.log('内容前100字符:', content.substring(0, 100));\n console.log('内容后100字符:', content.substring(content.length - 100));\n } else {\n console.log('内容不是字符串类型:', typeof content);\n console.log('内容值:', content);\n }\n\n console.log('标注数据:', mdAnnotations);\n console.log('表格标注数据:', tableAnnotations);\n }, [mdAnnotations, tableAnnotations, isTableMode]);\n\n // 监听内容变化,在表格模式下调整表格尺寸\n useEffect(() => {\n if (isTableMode && markdownRef.current) {\n // 延迟执行,确保Markdownit完全渲染完成\n const timer = setTimeout(() => {\n const tables = markdownRef.current?.querySelectorAll('table');\n if (tables && tables.length > 0) {\n console.log('调整表格尺寸,找到表格数量:', tables.length);\n\n tables.forEach((table, index) => {\n if (table instanceof HTMLTableElement) {\n // 确保表格有足够的宽度来显示内容\n table.style.width = '100%';\n table.style.minWidth = '100%';\n table.style.tableLayout = 'auto';\n\n // 调整表格容器\n const container = table.closest('.markdown-table-mode');\n if (container && container instanceof HTMLElement) {\n container.style.width = '100%';\n container.style.overflowX = 'auto';\n }\n\n console.log(`表格 ${index + 1} 尺寸调整完成`);\n }\n });\n }\n }, 500); // 延迟500ms确保渲染完成\n\n return () => clearTimeout(timer);\n }\n }, [isTableMode, data.content]);\n\n // 清理定时器与观察器\n useEffect(() => {\n return () => {\n if (annotationTimeoutRef.current) {\n clearTimeout(annotationTimeoutRef.current);\n }\n if (tableObserverRef.current) {\n tableObserverRef.current.disconnect();\n tableObserverRef.current = null;\n }\n };\n }, []);\n\n return (\n <div\n style={{\n height: '100%',\n width: '100%',\n overflow: 'auto', // 改为auto,允许滚动条显示\n }}\n className={`markdown-container markdown-scrollbar ${isTableMode ? 'markdown-table-mode' : ''}`}\n >\n <style>{markdownAnnotationStyles}</style>\n <div ref={markdownRef}>\n <Markdownit\n dataSource={{\n type: DataType.MARKDOWN,\n content: (() => {\n // 兼容多种数据结构\n if (typeof data.content === 'string') {\n return data.content;\n } else if (data.content?.text) {\n // 线上环境:{ type: 'markdown', text: '...' }\n return data.content.text;\n } else if (data.content?.content) {\n // 本地环境:{ content: '...' }\n return data.content.content;\n }\n return '';\n })(),\n }}\n size=\"md\"\n onScroll={!isTableMode ? handleScroll : undefined}\n onScrollToTop={!isTableMode ? handleScrollToTop : undefined}\n onScrollToBottom={!isTableMode ? handleScrollToBottom : undefined}\n onRendered={handleMarkdownRendered}\n theme={{\n primaryColor: parentProps.styles?.theme?.colors?.primary || '#007bff',\n backgroundColor: parentProps.styles?.theme?.colors?.background || '#f8f9fa',\n textColor: parentProps.styles?.theme?.colors?.text || '#343a40',\n borderColor: parentProps.styles?.theme?.colors?.border || '#dee2e6',\n borderRadius: isTableMode ? '0px' : '8px',\n padding: isTableMode ? '0px' : '20px',\n }}\n style={{\n height: '100%',\n border: 'none',\n background: 'transparent',\n overflowY: isTableMode ? 'visible' : 'scroll',\n }}\n />\n </div>\n </div>\n );\n};\n\n/**\n * 极简 markdown_table 渲染组件(绕过 Markdownit)\n * - 仅支持管道表语法,渲染单个 <table>\n * - 不引入内部状态与滚动回调\n */\nconst MinimalMarkdownTable: React.FC<{\n markdown: string;\n onRendered?: () => void;\n tableAnnotations?: TableAnnotation[];\n}> = ({ markdown, onRendered, tableAnnotations = [] }) => {\n const rootRef = useRef<HTMLDivElement>(null);\n\n // 解析简单管道表\n const parseTable = (md: string): { headers: string[]; rows: string[][] } | null => {\n const lines = md.split(/\\r?\\n/).filter(l => l.trim().length > 0);\n // 找首个表头行和分隔行\n let headerLineIdx = -1;\n for (let i = 0; i < lines.length - 1; i++) {\n const a = lines[i].trim();\n const b = lines[i + 1].trim();\n if (a.startsWith('|') && a.endsWith('|') && b.replace(/\\s|:|\\|/g, '').match(/^[-]+$/)) {\n headerLineIdx = i;\n break;\n }\n }\n if (headerLineIdx === -1) return null;\n const headerLine = lines[headerLineIdx];\n const header = headerLine\n .split('|')\n .slice(1, -1)\n .map(s => s.trim());\n const bodyLines = [] as string[];\n for (let i = headerLineIdx + 2; i < lines.length; i++) {\n const l = lines[i].trim();\n if (!l.startsWith('|') || !l.endsWith('|')) break;\n bodyLines.push(l);\n }\n const rows = bodyLines.map(l =>\n l\n .split('|')\n .slice(1, -1)\n .map(s => s.trim())\n );\n return { headers: header, rows };\n };\n\n const table = React.useMemo(() => parseTable(markdown), [markdown]);\n\n // 渲染完成后应用表格标注(仅 DOM 操作,无 setState)\n useEffect(() => {\n const apply = () => {\n try {\n if (!rootRef.current) return;\n\n // 先清空所有旧的表格标注\n const tables = rootRef.current.querySelectorAll('table');\n tables.forEach(table => {\n const allRows = Array.from(table.rows);\n allRows.forEach(row => {\n Array.from(row.cells).forEach(cell => {\n if (cell.getAttribute('data-table-annotated') === '1') {\n cell.style.removeProperty('background');\n cell.style.removeProperty('background-color');\n cell.removeAttribute('data-table-annotated');\n cell.removeAttribute('title');\n }\n });\n });\n });\n\n if (!tableAnnotations.length) return;\n if (!tables || tables.length === 0) return;\n tableAnnotations.forEach((annotation, i) => {\n const offsets = annotation.offsets || [];\n offsets.forEach((offset, idx) => {\n const [row, col] = offset as [number, number];\n tables.forEach(tableEl => {\n // 从表头开始计算,row=0 指向表头第一行\n const allRows = Array.from(tableEl.rows);\n const rowEl = allRows[row] as HTMLTableRowElement | undefined;\n if (!rowEl) return;\n const cell = rowEl.cells?.[col] as HTMLTableCellElement | undefined;\n if (!cell) return;\n const color = annotation.color || 'rgba(255, 229, 153, 0.5)';\n const already = cell.getAttribute('data-table-annotated') === '1';\n if (!already) {\n cell.style.setProperty('background', color, 'important');\n cell.style.setProperty('background-color', color, 'important');\n cell.setAttribute('data-table-annotated', '1');\n if (annotation.content) cell.title = annotation.content;\n }\n if (i === 0 && idx === 0) {\n setTimeout(() => cell.scrollIntoView({ behavior: 'smooth', block: 'start' }), 50);\n }\n });\n });\n });\n } catch (e) {\n console.warn('[MinimalMarkdownTable] apply annotations failed', e);\n }\n };\n\n const id = requestAnimationFrame(() => {\n apply();\n onRendered && onRendered();\n });\n return () => cancelAnimationFrame(id);\n }, [markdown, tableAnnotations, onRendered]);\n\n if (!table) {\n return (\n <div ref={rootRef} style={{ padding: '8px' }}>\n 无法解析为表格\n </div>\n );\n }\n\n const scopedStyles = `\n .z-mdtbl-wrapper { overflow: auto; position: relative; }\n .z-mdtbl { border-collapse: separate; border-spacing: 0; background: transparent; box-shadow: 0 1px 3px rgba(16,24,40,.08), 0 1px 2px rgba(16,24,40,.06); border-radius: 8px; }\n .z-mdtbl th, .z-mdtbl td { border: 1px solid #e5e7eb; padding: 10px 14px; font-size: 13px; line-height: 1.4; color: inherit; }\n .z-mdtbl th { background: transparent; font-weight: 600; color: inherit; }\n .z-mdtbl tbody tr:nth-child(odd) { background: transparent; }\n .z-mdtbl tbody tr:hover { background: transparent; }\n .z-mdtbl td, .z-mdtbl th { white-space: nowrap; }\n .z-mdtbl thead tr:first-child th:first-child { border-top-left-radius: 8px; }\n .z-mdtbl thead tr:first-child th:last-child { border-top-right-radius: 8px; }\n .z-mdtbl tbody tr:last-child td:first-child { border-bottom-left-radius: 8px; }\n .z-mdtbl tbody tr:last-child td:last-child { border-bottom-right-radius: 8px; }\n `;\n\n return (\n <div ref={rootRef} className=\"markdown-table-mode z-mdtbl-wrapper\">\n <style>{scopedStyles}</style>\n <table className=\"z-mdtbl\">\n <thead>\n <tr>\n {table.headers.map((h, i) => (\n <th key={i}>{h}</th>\n ))}\n </tr>\n </thead>\n <tbody>\n {table.rows.map((r, ri) => (\n <tr key={ri}>\n {r.map((c, ci) => (\n <td key={ci}>{c}</td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n );\n};\n\n/**\n * 渲染HTML内容\n */\nconst renderHtmlContent = (data: any, _props: FviewerProps) => {\n console.log('=== Fviewer renderHtmlContent ===');\n console.log('data:', data);\n console.log('data.content:', data.content);\n\n // 获取实际的HTML内容 - 兼容多种数据结构\n let htmlContent = '';\n if (typeof data.content === 'string') {\n htmlContent = data.content;\n } else if (data.content?.text) {\n // 线上环境:{ type: 'html', text: '...' }\n htmlContent = data.content.text;\n } else if (data.content?.content) {\n // 本地环境:{ content: '...' }\n htmlContent = data.content.content;\n }\n console.log('最终传递给 iframe 的 content:', htmlContent);\n\n return (\n <div\n style={{\n height: '100%',\n overflow: 'auto',\n position: 'relative',\n }}\n >\n <iframe\n srcDoc={htmlContent}\n style={{\n width: '100%',\n height: '100%',\n border: 'none',\n background: 'white',\n }}\n title=\"HTML Preview\"\n sandbox=\"allow-same-origin allow-scripts\"\n />\n </div>\n );\n};\n\n/**\n * 渲染未知类型内容\n */\nconst renderUnknownContent = (data: any, _props: FviewerProps) => {\n return (\n <div\n style={{\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n height: '100%',\n color: '#666',\n }}\n >\n <div>\n <div>不支持的文件类型</div>\n <div style={{ fontSize: '12px', marginTop: '8px' }}>{data.fileName || '未知文件'}</div>\n </div>\n </div>\n );\n};\n\n/**\n * Fviewer核心组件\n * 负责文件类型检测、内容渲染和状态管理\n *\n * @param props - 组件属性\n * @returns Fviewer组件\n */\nconst Fviewer: React.FC<FviewerProps> = ({\n data,\n annotationData = [],\n totalPage = 0,\n currentPage = 1,\n setScale,\n scale: userScale, // 重命名避免冲突\n rotation = 0, // 添加rotation参数\n eventsEmit,\n styles,\n tools = {\n annotation: true,\n download: true,\n zoom: true,\n close: true,\n navigation: true,\n },\n customComponents,\n className,\n contentClass,\n}) => {\n // 使用主题\n const mergedTheme = styles?.theme || defaultTheme;\n\n // 状态管理\n const [isLoading, setIsLoading] = useState(false);\n const [loadingStatus] = useState<string>('内容加载中...');\n const [error, setError] = useState<string | null>(null);\n\n console.log('=== Fviewer 接收数据 ===');\n console.log('Fviewer data:', data);\n console.log('Fviewer data.content:', data?.content);\n console.log('Fviewer data.content.document:', data?.content?.document);\n console.log('Fviewer data.content.document类型:', typeof data?.content?.document);\n console.log('Fviewer data.content.document是否为null:', data?.content?.document === null);\n console.log(\n 'Fviewer data.content.document是否为undefined:',\n data?.content?.document === undefined\n );\n console.log('Fviewer currentPage:', currentPage);\n console.log('Fviewer scale:', userScale);\n\n // 调试:跟踪 data 引用变化导致的 effect 触发\n const prevDataRef = useRef<any>(null);\n const prevContentRef = useRef<any>(null);\n const renderCountRef = useRef<number>(0);\n renderCountRef.current += 1;\n console.log('[Fviewer] render count:', renderCountRef.current);\n\n // 检测文件类型\n const fileType = detectFileType(data);\n console.log('=== Fviewer 组件 ===');\n console.log('检测到的文件类型:', fileType);\n console.log('完整数据:', data);\n\n // 根据文件类型渲染内容\n const renderContent = () => {\n console.log('开始渲染内容,文件类型:', fileType);\n\n switch (fileType) {\n case 'pdf':\n case 'pdf_slides':\n console.log(\n '计算下,渲染PDF内容:',\n fileType,\n 'pdfStartPage:' + data.pdfStartPage,\n 'currentPage:' + currentPage\n );\n return renderPdfContent(\n data,\n {\n data,\n annotationData,\n totalPage,\n currentPage,\n scale: userScale,\n eventsEmit,\n styles,\n tools,\n className,\n contentClass,\n },\n fileType === 'pdf_slides',\n setScale\n );\n case 'image':\n console.log('渲染图片内容');\n return renderImageContent(data, {\n data,\n annotationData,\n scale: userScale,\n rotation,\n eventsEmit,\n styles,\n tools,\n className,\n contentClass,\n });\n case 'text':\n console.log('渲染文本内容');\n return renderTextContent(data, {\n data,\n annotationData,\n scale: userScale,\n eventsEmit,\n styles,\n tools,\n className,\n contentClass,\n });\n case 'markdown':\n case 'markdown_table':\n console.log('渲染Markdown内容:', fileType);\n if (fileType === 'markdown_table') {\n const md = typeof data.content === 'string' ? data.content : data.content?.content || '';\n const tableAnnotations = (annotationData || []).filter(\n anno => 'offsets' in anno && Array.isArray((anno as any).offsets)\n ) as TableAnnotation[];\n return <MinimalMarkdownTable markdown={md} tableAnnotations={tableAnnotations} />;\n }\n return (\n <MarkdownContentView\n data={data}\n parentProps={{\n data,\n annotationData,\n eventsEmit,\n styles,\n tools,\n className,\n contentClass,\n }}\n isTableMode={false}\n />\n );\n case 'html':\n console.log('渲染HTML内容');\n return renderHtmlContent(data, {\n data,\n annotationData,\n eventsEmit,\n styles,\n tools,\n className,\n contentClass,\n });\n default:\n console.log('渲染未知类型内容');\n return renderUnknownContent(data, {\n data,\n annotationData,\n eventsEmit,\n styles,\n tools,\n className,\n contentClass,\n });\n }\n };\n\n // 监听数据变化(调试数据引用变化与状态更新)\n React.useEffect(() => {\n const prevData = prevDataRef.current;\n const prevContent = prevContentRef.current;\n const dataChanged = prevData !== data;\n const contentChanged = prevContent !== (data ? data.content : undefined);\n console.log('[Fviewer useEffect:data] triggered', {\n dataChanged,\n contentChanged,\n hasData: !!data,\n hasContent: !!data?.content,\n isLoadingBefore: isLoading,\n });\n // 仅记录引用变更,避免在这里 setState 造成循环\n prevDataRef.current = data;\n prevContentRef.current = data ? data.content : undefined;\n }, [data?.content]);\n\n // 监听错误\n React.useEffect(() => {\n if (error) {\n setIsLoading(false);\n }\n }, [error]);\n\n // 监听标注数据变化\n React.useEffect(() => {\n console.log('=== Fviewer annotationData 变化监听 ===');\n console.log('annotationData:', annotationData);\n console.log('annotationData 长度:', annotationData?.length || 0);\n console.log('当前文件类型:', fileType);\n }, [annotationData, fileType]);\n\n return (\n <ContentContainer $theme={mergedTheme} className={contentClass}>\n {isLoading ? (\n customComponents?.LoadingComponent ? (\n <customComponents.LoadingComponent status={loadingStatus} theme={mergedTheme} />\n ) : (\n <LoadingContainer $theme={mergedTheme}>{loadingStatus}</LoadingContainer>\n )\n ) : error ? (\n customComponents?.ErrorComponent ? (\n <customComponents.ErrorComponent error={error} theme={mergedTheme} />\n ) : (\n <ErrorContainer $theme={mergedTheme}>\n <div>加载失败</div>\n <div style={{ fontSize: '12px', marginTop: '8px' }}>{error}</div>\n </ErrorContainer>\n )\n ) : (\n renderContent()\n )}\n </ContentContainer>\n );\n};\n\nexport default Fviewer;\n","/**\n * @license lucide-react v0.456.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nconst toKebabCase = (string) => string.replace(/([a-z0-9])([A-Z])/g, \"$1-$2\").toLowerCase();\nconst mergeClasses = (...classes) => classes.filter((className, index, array) => {\n return Boolean(className) && className.trim() !== \"\" && array.indexOf(className) === index;\n}).join(\" \").trim();\n\nexport { mergeClasses, toKebabCase };\n//# sourceMappingURL=utils.js.map\n","/**\n * @license lucide-react v0.456.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nvar defaultAttributes = {\n xmlns: \"http://www.w3.org/2000/svg\",\n width: 24,\n height: 24,\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n stroke: \"currentColor\",\n strokeWidth: 2,\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\"\n};\n\nexport { defaultAttributes as default };\n//# sourceMappingURL=defaultAttributes.js.map\n","/**\n * @license lucide-react v0.456.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport { forwardRef, createElement } from 'react';\nimport defaultAttributes from './defaultAttributes.js';\nimport { mergeClasses } from './shared/src/utils.js';\n\nconst Icon = forwardRef(\n ({\n color = \"currentColor\",\n size = 24,\n strokeWidth = 2,\n absoluteStrokeWidth,\n className = \"\",\n children,\n iconNode,\n ...rest\n }, ref) => {\n return createElement(\n \"svg\",\n {\n ref,\n ...defaultAttributes,\n width: size,\n height: size,\n stroke: color,\n strokeWidth: absoluteStrokeWidth ? Number(strokeWidth) * 24 / Number(size) : strokeWidth,\n className: mergeClasses(\"lucide\", className),\n ...rest\n },\n [\n ...iconNode.map(([tag, attrs]) => createElement(tag, attrs)),\n ...Array.isArray(children) ? children : [children]\n ]\n );\n }\n);\n\nexport { Icon as default };\n//# sourceMappingURL=Icon.js.map\n","/**\n * @license lucide-react v0.456.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport { forwardRef, createElement } from 'react';\nimport { mergeClasses, toKebabCase } from './shared/src/utils.js';\nimport Icon from './Icon.js';\n\nconst createLucideIcon = (iconName, iconNode) => {\n const Component = forwardRef(\n ({ className, ...props }, ref) => createElement(Icon, {\n ref,\n iconNode,\n className: mergeClasses(`lucide-${toKebabCase(iconName)}`, className),\n ...props\n })\n );\n Component.displayName = `${iconName}`;\n return Component;\n};\n\nexport { createLucideIcon as default };\n//# sourceMappingURL=createLucideIcon.js.map\n","/**\n * @license lucide-react v0.456.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst ChevronLeft = createLucideIcon(\"ChevronLeft\", [\n [\"path\", { d: \"m15 18-6-6 6-6\", key: \"1wnfg3\" }]\n]);\n\nexport { ChevronLeft as default };\n//# sourceMappingURL=chevron-left.js.map\n","/**\n * @license lucide-react v0.456.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst ChevronRight = createLucideIcon(\"ChevronRight\", [\n [\"path\", { d: \"m9 18 6-6-6-6\", key: \"mthhwq\" }]\n]);\n\nexport { ChevronRight as default };\n//# sourceMappingURL=chevron-right.js.map\n","/**\n * @license lucide-react v0.456.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Download = createLucideIcon(\"Download\", [\n [\"path\", { d: \"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\", key: \"ih7n3h\" }],\n [\"polyline\", { points: \"7 10 12 15 17 10\", key: \"2ggqvy\" }],\n [\"line\", { x1: \"12\", x2: \"12\", y1: \"15\", y2: \"3\", key: \"1vk2je\" }]\n]);\n\nexport { Download as default };\n//# sourceMappingURL=download.js.map\n","/**\n * @license lucide-react v0.456.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Pencil = createLucideIcon(\"Pencil\", [\n [\n \"path\",\n {\n d: \"M21.174 6.812a1 1 0 0 0-3.986-3.987L3.842 16.174a2 2 0 0 0-.5.83l-1.321 4.352a.5.5 0 0 0 .623.622l4.353-1.32a2 2 0 0 0 .83-.497z\",\n key: \"1a8usu\"\n }\n ],\n [\"path\", { d: \"m15 5 4 4\", key: \"1mk7zo\" }]\n]);\n\nexport { Pencil as default };\n//# sourceMappingURL=pencil.js.map\n","/**\n * @license lucide-react v0.456.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst RotateCcw = createLucideIcon(\"RotateCcw\", [\n [\"path\", { d: \"M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8\", key: \"1357e3\" }],\n [\"path\", { d: \"M3 3v5h5\", key: \"1xhq8a\" }]\n]);\n\nexport { RotateCcw as default };\n//# sourceMappingURL=rotate-ccw.js.map\n","/**\n * @license lucide-react v0.456.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst RotateCw = createLucideIcon(\"RotateCw\", [\n [\"path\", { d: \"M21 12a9 9 0 1 1-9-9c2.52 0 4.93 1 6.74 2.74L21 8\", key: \"1p45f6\" }],\n [\"path\", { d: \"M21 3v5h-5\", key: \"1q7to0\" }]\n]);\n\nexport { RotateCw as default };\n//# sourceMappingURL=rotate-cw.js.map\n","/**\n * @license lucide-react v0.456.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst X = createLucideIcon(\"X\", [\n [\"path\", { d: \"M18 6 6 18\", key: \"1bl5f8\" }],\n [\"path\", { d: \"m6 6 12 12\", key: \"d8bk6v\" }]\n]);\n\nexport { X as default };\n//# sourceMappingURL=x.js.map\n","/**\n * @license lucide-react v0.456.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst ZoomIn = createLucideIcon(\"ZoomIn\", [\n [\"circle\", { cx: \"11\", cy: \"11\", r: \"8\", key: \"4ej97u\" }],\n [\"line\", { x1: \"21\", x2: \"16.65\", y1: \"21\", y2: \"16.65\", key: \"13gj7c\" }],\n [\"line\", { x1: \"11\", x2: \"11\", y1: \"8\", y2: \"14\", key: \"1vmskp\" }],\n [\"line\", { x1: \"8\", x2: \"14\", y1: \"11\", y2: \"11\", key: \"durymu\" }]\n]);\n\nexport { ZoomIn as default };\n//# sourceMappingURL=zoom-in.js.map\n","/**\n * @license lucide-react v0.456.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst ZoomOut = createLucideIcon(\"ZoomOut\", [\n [\"circle\", { cx: \"11\", cy: \"11\", r: \"8\", key: \"4ej97u\" }],\n [\"line\", { x1: \"21\", x2: \"16.65\", y1: \"21\", y2: \"16.65\", key: \"13gj7c\" }],\n [\"line\", { x1: \"8\", x2: \"14\", y1: \"11\", y2: \"11\", key: \"durymu\" }]\n]);\n\nexport { ZoomOut as default };\n//# sourceMappingURL=zoom-out.js.map\n","import React from 'react';\nimport styled from 'styled-components';\nimport { X, ChevronLeft, ChevronRight, ZoomIn, ZoomOut, Download, Pencil, RotateCcw, RotateCw } from 'lucide-react';\nimport type { AppTheme, ToolsConfig } from '../../../core/types';\n\n// Header组件属性接口\nexport interface HeaderProps {\n // 文件信息\n fileName?: string;\n currentPage?: number;\n totalPage?: number;\n\n // 工具配置\n tools?: ToolsConfig;\n\n // 样式配置\n styles?: {\n theme?: AppTheme;\n };\n\n // 事件回调\n onPrevPage?: () => void;\n onNextPage?: () => void;\n onZoomIn?: () => void;\n onZoomOut?: () => void;\n onAnnotationToggle?: () => void;\n onDownload?: () => void;\n onRotateLeft?: () => void;\n onRotateRight?: () => void;\n onClose?: () => void;\n\n // 状态\n scale?: number;\n isAnnotating?: boolean;\n\n // 自定义类名\n className?: string;\n}\n\n// 样式组件\nconst HeaderContainer = styled.div<{ $theme: AppTheme }>`\n display: flex;\n align-items: center;\n padding: 0px 12px;\n justify-content: space-between;\n padding: ${props => props.$theme.space.padding};\n border-bottom: 1px solid ${props => props.$theme.colors.border};\n background: ${props => props.$theme.colors.background};\n min-height: 52px;\n`;\n\nconst FileInfo = styled.div<{ $theme: AppTheme }>`\n display: flex;\n align-items: center;\n gap: 8px;\n flex: 1;\n min-width: 0;\n`;\n\nconst FileName = styled.div<{ $theme: AppTheme }>`\n font-size: 14px;\n font-weight: 500;\n color: ${props => props.$theme.colors.text};\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n`;\n\nconst PageInfo = styled.div<{ $theme: AppTheme }>`\n font-size: 12px;\n color: ${props => props.$theme.colors.disabledText};\n white-space: nowrap;\n`;\n\nconst ToolBar = styled.div<{ $theme: AppTheme }>`\n display: flex;\n align-items: center;\n gap: 4px;\n`;\n\nconst ToolButton = styled.button<{ $theme: AppTheme; $active?: boolean }>`\n display: flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n border: none;\n border-radius: ${props => props.$theme.space.radius};\n background: ${props => props.$active ? props.$theme.colors.primary + '20' : 'transparent'};\n color: ${props => props.$active ? props.$theme.colors.primary : props.$theme.colors.text};\n cursor: pointer;\n transition: all 0.2s ease;\n\n /* 确保图标有默认颜色 */\n & > svg {\n color: currentColor;\n stroke: currentColor;\n }\n\n &:hover {\n background: ${props => props.$theme.colors.primary + '10'};\n color: ${props => props.$theme.colors.primary};\n }\n\n &:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n`;\n\nconst ZoomInfo = styled.div<{ $theme: AppTheme }>`\n font-size: 12px;\n color: ${props => props.$theme.colors.disabledText};\n min-width: 40px;\n text-align: center;\n`;\n\n// 默认主题\nconst defaultTheme: AppTheme = {\n colors: {\n primary: '#007bff',\n secondary: '#6c757d',\n success: '#008000',\n warning: '#FFA500',\n error: '#FF0000',\n info: '#0000FF',\n background: '#f8f9fa',\n text: '#343a40',\n border: '#dee2e6',\n disabled: '#808080',\n disabledBackground: '#F5F5F5',\n disabledText: '#808080',\n },\n space: {\n sidebar: '12px',\n size: '12px',\n radius: '4px',\n padding: '8px 12px',\n margin: '4px',\n shadow: '0 2px 4px rgba(0,0,0,0.1)',\n lineHeight: '1.5',\n },\n};\n\n/**\n * Header组件\n * 负责文件查看器的头部工具栏\n *\n * @param props - 组件属性\n * @returns Header组件\n */\nconst Header: React.FC<HeaderProps> = React.memo(({\n fileName = '未知文件',\n currentPage = 1,\n totalPage = 0,\n tools = {\n annotation: true,\n download: true,\n zoom: true,\n close: true,\n navigation: true,\n rotate: true,\n },\n styles,\n onPrevPage,\n onNextPage,\n onZoomIn,\n onZoomOut,\n onAnnotationToggle,\n onDownload,\n onRotateLeft,\n onRotateRight,\n onClose,\n scale = 1,\n isAnnotating = false,\n className,\n}) => {\n // 使用主题\n const mergedTheme = styles?.theme || defaultTheme;\n\n // 添加调试信息\n console.log('Header组件渲染 - currentPage:', currentPage, 'totalPage:', totalPage);\n\n return (\n <HeaderContainer $theme={mergedTheme} className={className}>\n <FileInfo $theme={mergedTheme}>\n <FileName $theme={mergedTheme}>\n {fileName}\n </FileName>\n </FileInfo>\n\n <ToolBar $theme={mergedTheme}>\n {/* 页面导航 */}\n {tools.navigation && (\n <>\n <ToolButton\n $theme={mergedTheme}\n onClick={onPrevPage}\n disabled={currentPage <= 1}\n title=\"上一页\"\n >\n <ChevronLeft size={16} />\n </ToolButton>\n {totalPage > 0 && (\n <PageInfo $theme={mergedTheme}>\n {currentPage} / {totalPage}\n </PageInfo>\n )}\n <ToolButton\n $theme={mergedTheme}\n onClick={onNextPage}\n disabled={!totalPage || currentPage >= totalPage}\n title=\"下一页\"\n >\n <ChevronRight size={16} />\n </ToolButton>\n </>\n )}\n\n {/* 缩放控制 */}\n {tools.zoom && (\n <>\n <ToolButton\n $theme={mergedTheme}\n onClick={onZoomOut}\n disabled={scale <= 0.3}\n title=\"缩小\"\n >\n <ZoomOut size={16} />\n </ToolButton>\n <ZoomInfo $theme={mergedTheme}>\n {Math.round(scale * 100)}%\n </ZoomInfo>\n <ToolButton\n $theme={mergedTheme}\n onClick={onZoomIn}\n disabled={scale >= 3}\n title=\"放大\"\n >\n <ZoomIn size={16} />\n </ToolButton>\n </>\n )}\n\n {/* 标注工具 */}\n {tools.annotation && (\n <ToolButton\n $theme={mergedTheme}\n $active={isAnnotating}\n onClick={onAnnotationToggle}\n title={isAnnotating ? '退出标注' : '开始标注'}\n >\n <Pencil size={16} />\n </ToolButton>\n )}\n\n {/* 下载按钮 */}\n {tools.download && (\n <ToolButton\n $theme={mergedTheme}\n onClick={onDownload}\n title=\"下载\"\n >\n <Download size={16} />\n </ToolButton>\n )}\n\n {/* 旋转控制 */}\n {tools.rotate && (\n <>\n <ToolButton\n $theme={mergedTheme}\n onClick={onRotateLeft}\n title=\"向左旋转\"\n >\n <RotateCcw size={16} />\n </ToolButton>\n <ToolButton\n $theme={mergedTheme}\n onClick={onRotateRight}\n title=\"向右旋转\"\n >\n <RotateCw size={16} />\n </ToolButton>\n </>\n )}\n\n {/* 关闭按钮 */}\n {tools.close && (\n <ToolButton\n $theme={mergedTheme}\n onClick={onClose}\n title=\"关闭\"\n >\n <X size={16} />\n </ToolButton>\n )}\n </ToolBar>\n </HeaderContainer>\n );\n});\n\nexport default Header;\n","import * as pdfjsLib from 'pdfjs-dist';\nimport { isPDFWorkerRegistered } from '../../lib_enter';\n\n// 文件类型枚举\nexport type FileType = 'pdf' | 'image' | 'text' | 'markdown' | 'markdown_table' | 'html' | 'unknown';\n\n// 解析结果接口\nexport interface ParseResult {\n type: FileType;\n content: any;\n fileName?: string;\n fileType?: string;\n totalPages?: number;\n error?: string;\n}\n\n// 解析选项接口\nexport interface ParseOptions {\n fileName?: string;\n fileType?: string;\n token?: string;\n}\n\n/**\n * 确保PDF Worker已注册\n * 注意:此函数不会自动注册 Worker,只检查是否已注册\n * Worker 应该由最终调用方通过 registerPDFWorker 注册\n */\nconst ensurePDFWorkerRegistered = () => {\n // 检查是否已经注册过worker\n if (isPDFWorkerRegistered()) {\n console.log('PDF Worker 已经注册');\n return;\n }\n\n // Worker 未注册,抛出友好的错误提示\n const errorMsg =\n 'PDF Worker 未注册。请在应用入口处调用 registerPDFWorker() 注册 Worker。\\n' +\n '示例:import { registerPDFWorker } from \"@mxmweb/fviewer\";\\n' +\n ' registerPDFWorker(\"/worker/pdf.worker.min.js\");\\n' +\n '注意:Worker 文件路径需要根据实际部署情况调整。';\n\n console.error(errorMsg);\n throw new Error(errorMsg);\n};\n\n/**\n * 检测文件类型\n * @param fileName - 文件名\n * @param fileType - 文件类型\n * @param content - 文件内容\n * @returns 文件类型\n */\nexport const detectFileType = (fileName?: string, fileType?: string, content?: any): FileType => {\n if (!fileName && !fileType && !content) return 'unknown';\n\n const name = fileName || '';\n const type = fileType || '';\n\n if (name.toLowerCase().endsWith('.pdf') || type === 'pdf' || content?.type === 'pdf') {\n return 'pdf';\n }\n if (name.toLowerCase().match(/\\.(jpg|jpeg|png|gif|bmp|webp)$/) || type === 'image' || content?.type === 'image') {\n return 'image';\n }\n if (name.toLowerCase().endsWith('.md') || type === 'markdown' || content?.type === 'markdown') {\n // 检查是否为markdown_table类型\n if (type === 'markdown_table' || content?.type === 'markdown_table') {\n return 'markdown_table';\n }\n return 'markdown';\n }\n if (name.toLowerCase().match(/\\.(html|htm)$/) || type === 'html' || content?.type === 'html') {\n return 'html';\n }\n if (name.toLowerCase().match(/\\.(txt|log|json|xml|css|js|ts)$/) || type === 'text' || content?.type === 'text') {\n return 'text';\n }\n\n return 'unknown';\n};\n\n/**\n * 解析PDF文件(支持静态文件和stream chunk)\n * @param data - PDF数据(ArrayBuffer或URL)\n * @param options - 解析选项\n * @returns 解析结果\n */\nexport const parsePdfFile = async (data: ArrayBuffer | string, options: ParseOptions = {}): Promise<ParseResult> => {\n console.log('=== parsePdfFile 开始 ===');\n console.log('输入数据:', { data: typeof data, options });\n\n try {\n // 确保PDF Worker已注册\n ensurePDFWorkerRegistered();\n\n let pdfDocument: pdfjsLib.PDFDocumentProxy;\n\n if (typeof data === 'string') {\n console.log('从URL加载PDF:', data);\n // 静态文件URL\n const loadingTask = pdfjsLib.getDocument({\n url: data,\n httpHeaders: options.token ? { 'Authorization': options.token } : undefined,\n });\n console.log('=== PDF加载任务详细信息 ===');\n console.log('加载任务对象:', loadingTask);\n console.log('加载任务类型:', typeof loadingTask);\n console.log('加载任务方法:', Object.getOwnPropertyNames(Object.getPrototypeOf(loadingTask)));\n console.log('加载任务属性:', Object.keys(loadingTask));\n\n pdfDocument = await loadingTask.promise;\n console.log('=== PDF文档加载完成 ===');\n console.log('PDF文档对象:', pdfDocument);\n console.log('PDF文档类型:', typeof pdfDocument);\n console.log('PDF文档方法:', Object.getOwnPropertyNames(Object.getPrototypeOf(pdfDocument)));\n console.log('PDF文档属性:', Object.keys(pdfDocument));\n } else {\n console.log('从ArrayBuffer加载PDF');\n // ArrayBuffer数据(stream chunk)\n const loadingTask = pdfjsLib.getDocument({\n data: data,\n });\n console.log('=== PDF加载任务详细信息 ===');\n console.log('加载任务对象:', loadingTask);\n console.log('加载任务类型:', typeof loadingTask);\n\n pdfDocument = await loadingTask.promise;\n console.log('=== PDF文档加载完成 ===');\n console.log('PDF文档对象:', pdfDocument);\n console.log('PDF文档类型:', typeof pdfDocument);\n }\n\n const totalPages = pdfDocument.numPages;\n console.log('PDF加载成功,总页数:', totalPages);\n console.log('PDF指纹:', pdfDocument.fingerprints);\n console.log('PDF传输对象:', pdfDocument._transport);\n\n const result: ParseResult = {\n type: 'pdf' as FileType,\n content: {\n type: 'pdf',\n document: pdfDocument,\n totalPages,\n },\n fileName: options.fileName,\n fileType: 'pdf',\n totalPages,\n };\n\n console.log('=== 解析结果详细信息 ===');\n console.log('解析结果:', result);\n console.log('解析结果类型:', typeof result);\n console.log('解析结果属性:', Object.keys(result));\n console.log('内容对象:', result.content);\n console.log('文档对象:', result.content.document);\n\n return result;\n } catch (error) {\n console.error('PDF解析失败:', error);\n console.error('错误详情:', {\n message: error instanceof Error ? error.message : '未知错误',\n stack: error instanceof Error ? error.stack : undefined,\n name: error instanceof Error ? error.name : undefined,\n url: typeof data === 'string' ? data : 'ArrayBuffer',\n options: options\n });\n\n // 提供更详细的错误信息\n let errorMessage = 'PDF解析失败';\n if (error instanceof Error) {\n if (error.message.includes('PDF Worker 未注册') || error.message.includes('Worker 未注册')) {\n // Worker 未注册的错误,保留原始错误信息,让用户知道需要注册\n errorMessage = error.message;\n } else if (error.message.includes('Invalid PDF structure')) {\n errorMessage = 'PDF文件结构无效,可能文件损坏或不是有效的PDF文件';\n } else if (error.message.includes('Failed to fetch')) {\n errorMessage = 'PDF文件下载失败,请检查网络连接和文件URL';\n } else if (error.message.includes('Worker') || error.message.includes('worker')) {\n errorMessage = 'PDF解析器初始化失败。请确保在应用入口处调用 registerPDFWorker() 注册 Worker 文件。';\n } else {\n errorMessage = `PDF解析失败: ${error.message}`;\n }\n }\n\n return {\n type: 'pdf',\n content: null,\n fileName: options.fileName,\n fileType: 'pdf',\n error: errorMessage,\n };\n }\n};\n\n/**\n * 解析图片文件\n * @param data - 图片数据(URL或ArrayBuffer)\n * @param options - 解析选项\n * @returns 解析结果\n */\nexport const parseImageFile = async (data: ArrayBuffer | string, options: ParseOptions = {}): Promise<ParseResult> => {\n console.log('=== parseImageFile 开始 ===');\n console.log('输入数据:', { data: typeof data, options });\n\n try {\n let imageUrl: string;\n\n if (typeof data === 'string') {\n console.log('从URL加载图片:', data);\n // 静态文件URL\n imageUrl = data;\n } else {\n console.log('从ArrayBuffer加载图片');\n // ArrayBuffer数据,转换为blob URL\n const blob = new Blob([data]);\n imageUrl = URL.createObjectURL(blob);\n }\n\n // 预加载图片以验证是否能正常加载\n console.log('开始预加载图片:', imageUrl);\n await new Promise<void>((resolve, reject) => {\n const img = new Image();\n\n img.onload = () => {\n console.log('图片预加载成功:', imageUrl);\n console.log('图片尺寸:', img.width, 'x', img.height);\n resolve();\n };\n\n img.onerror = () => {\n console.error('图片预加载失败:', imageUrl);\n reject(new Error('图片加载失败'));\n };\n\n // 设置超时时间(10秒)\n const timeout = setTimeout(() => {\n reject(new Error('图片加载超时'));\n }, 10000);\n\n img.onload = () => {\n clearTimeout(timeout);\n console.log('图片预加载成功:', imageUrl);\n console.log('图片尺寸:', img.width, 'x', img.height);\n resolve();\n };\n\n img.onerror = () => {\n clearTimeout(timeout);\n console.error('图片预加载失败:', imageUrl);\n reject(new Error('图片加载失败'));\n };\n\n img.src = imageUrl;\n });\n\n const result: ParseResult = {\n type: 'image',\n content: {\n type: 'image',\n url: imageUrl,\n },\n fileName: options.fileName,\n fileType: 'image',\n };\n\n console.log('=== parseImageFile 结果 ===');\n console.log('result:', result);\n\n return result;\n } catch (error) {\n console.error('图片解析失败:', error);\n return {\n type: 'image',\n content: null,\n fileName: options.fileName,\n fileType: 'image',\n error: `图片解析失败: ${error instanceof Error ? error.message : '未知错误'}`,\n };\n }\n};\n\n/**\n * 解析文本文件\n * @param data - 文本数据(URL或ArrayBuffer)\n * @param options - 解析选项\n * @returns 解析结果\n */\nexport const parseTextFile = async (data: ArrayBuffer | string, options: ParseOptions = {}): Promise<ParseResult> => {\n try {\n let textContent: string;\n\n if (typeof data === 'string') {\n // 静态文件URL\n const response = await fetch(data, {\n headers: options.token ? { 'Authorization': options.token } : undefined,\n });\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n }\n textContent = await response.text();\n } else {\n // ArrayBuffer数据\n const decoder = new TextDecoder('utf-8');\n textContent = decoder.decode(data);\n }\n\n return {\n type: 'text',\n content: {\n type: 'text',\n text: textContent,\n },\n fileName: options.fileName,\n fileType: 'text',\n };\n } catch (error) {\n return {\n type: 'text',\n content: null,\n fileName: options.fileName,\n fileType: 'text',\n error: `文本解析失败: ${error instanceof Error ? error.message : '未知错误'}`,\n };\n }\n};\n\n/**\n * 解析Markdown文件\n * @param data - Markdown数据(URL或ArrayBuffer)\n * @param options - 解析选项\n * @returns 解析结果\n */\nexport const parseMarkdownFile = async (data: ArrayBuffer | string, options: ParseOptions = {}): Promise<ParseResult> => {\n try {\n let markdownContent: string;\n\n if (typeof data === 'string') {\n // 静态文件URL\n const response = await fetch(data, {\n headers: options.token ? { 'Authorization': options.token } : undefined,\n });\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n }\n markdownContent = await response.text();\n } else {\n // ArrayBuffer数据\n const decoder = new TextDecoder('utf-8');\n markdownContent = decoder.decode(data);\n }\n\n return {\n type: 'markdown',\n content: {\n type: 'markdown',\n text: markdownContent,\n },\n fileName: options.fileName,\n fileType: 'markdown',\n };\n } catch (error) {\n return {\n type: 'markdown',\n content: null,\n fileName: options.fileName,\n fileType: 'markdown',\n error: `Markdown解析失败: ${error instanceof Error ? error.message : '未知错误'}`,\n };\n }\n};\n\n/**\n * 解析HTML文件\n * @param data - HTML数据(URL或ArrayBuffer)\n * @param options - 解析选项\n * @returns 解析结果\n */\nexport const parseHtmlFile = async (data: ArrayBuffer | string, options: ParseOptions = {}): Promise<ParseResult> => {\n console.log('=== parseHtmlFile 开始 ===');\n console.log('输入数据:', { data: typeof data, options });\n\n try {\n let htmlContent: string;\n\n if (typeof data === 'string') {\n console.log('从URL加载HTML:', data);\n // 静态文件URL\n const response = await fetch(data, {\n headers: options.token ? { 'Authorization': options.token } : undefined,\n });\n console.log('HTTP响应状态:', response.status, response.statusText);\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n }\n htmlContent = await response.text();\n console.log('HTML内容长度:', htmlContent.length);\n console.log('HTML内容前500字符:', htmlContent.substring(0, 500));\n } else {\n console.log('从ArrayBuffer加载HTML');\n // ArrayBuffer数据\n const decoder = new TextDecoder('utf-8');\n htmlContent = decoder.decode(data);\n }\n\n const result: ParseResult = {\n type: 'html' as FileType,\n content: {\n type: 'html',\n text: htmlContent,\n },\n fileName: options.fileName,\n fileType: 'html',\n };\n\n console.log('=== parseHtmlFile 结果 ===');\n console.log('result:', result);\n console.log('result.content.text 长度:', result.content.text.length);\n console.log('result.content.text 前200字符:', result.content.text.substring(0, 200));\n\n return result;\n } catch (error) {\n console.error('HTML解析失败:', error);\n return {\n type: 'html',\n content: null,\n fileName: options.fileName,\n fileType: 'html',\n error: `HTML解析失败: ${error instanceof Error ? error.message : '未知错误'}`,\n };\n }\n};\n\n/**\n * 统一文件解析函数\n * @param data - 文件数据(URL或ArrayBuffer)\n * @param options - 解析选项\n * @returns 解析结果\n */\nexport const parseFile = async (data: ArrayBuffer | string, options: ParseOptions = {}): Promise<ParseResult> => {\n const fileType = detectFileType(options.fileName, options.fileType);\n\n switch (fileType) {\n case 'pdf':\n return await parsePdfFile(data, options);\n case 'image':\n return await parseImageFile(data, options);\n case 'text':\n return await parseTextFile(data, options);\n case 'markdown':\n case 'markdown_table':\n return await parseMarkdownFile(data, options);\n case 'html':\n return await parseHtmlFile(data, options);\n default:\n return {\n type: 'unknown',\n content: null,\n fileName: options.fileName,\n fileType: options.fileType,\n error: '不支持的文件类型',\n };\n }\n};\n","import React, { useState, useEffect, useCallback } from 'react';\nimport styled from 'styled-components';\nimport Fviewer from '../core/Fviewer';\nimport Header from './components/Header';\nimport { parseFile, detectFileType } from '../core/utils/fileParser';\nimport type {\n AppTheme,\n Annotation,\n MDAnnotation,\n TableAnnotation,\n ToolsConfig,\n} from '../core/types';\nimport type { ParseResult } from '../core/utils/fileParser';\n\n// StaticFileReader组件属性接口\nexport interface StaticFileReaderProps {\n // 文件相关(data 直传时可不提供 fileUrl)\n fileUrl?: string;\n fileType?: string;\n fileName?: string;\n token?: string;\n initialPage?: number;\n annotations?: (Annotation | MDAnnotation | TableAnnotation)[];\n // 直接数据传递\n data?: any;\n // 事件回调\n eventsEmit?: (name: string, data?: any, innerFn?: any) => void;\n\n // 样式配置\n styles?: {\n theme?: AppTheme;\n mode?: 'light' | 'dark';\n };\n\n // 工具配置\n tools?: ToolsConfig;\n\n // 自定义组件\n customComponents?: {\n LoadingComponent?: React.ComponentType<{\n status: string;\n theme: AppTheme;\n }>;\n ErrorComponent?: React.ComponentType<{\n error: string;\n theme: AppTheme;\n }>;\n };\n\n // 自定义类名\n className?: string;\n headerClass?: string;\n contentClass?: string;\n}\n\n// 样式组件\nconst ReaderContainer = styled.div<{ $theme: AppTheme }>`\n display: flex;\n flex-direction: column;\n height: 100%;\n width: 100%;\n background: ${props => props.$theme.colors.background};\n border: 1px solid ${props => props.$theme.colors.border};\n border-radius: ${props => props.$theme.space.radius};\n overflow: hidden;\n min-height: 0; /* 确保flex子元素可以收缩 */\n`;\n\n/**\n * 默认文件加载动画组件\n * 提供美观的文件加载动画效果,支持状态文本显示\n */\nconst DefaultLoadingComponent: React.FC<{\n status: string;\n theme: AppTheme;\n}> = ({ status, theme }) => {\n return (\n <div\n style={{\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n height: '100%',\n padding: '40px',\n background: theme.colors.background,\n }}\n >\n {/* 文件图标动画 */}\n <div\n style={{\n position: 'relative',\n width: '80px',\n height: '80px',\n marginBottom: '24px',\n }}\n >\n {/* 文件图标背景 */}\n <div\n style={{\n width: '60px',\n height: '80px',\n background: theme.colors.primary,\n borderRadius: '8px 8px 0 0',\n position: 'relative',\n margin: '0 auto',\n }}\n >\n {/* 文件折角 */}\n <div\n style={{\n position: 'absolute',\n top: '0',\n right: '0',\n width: '0',\n height: '0',\n borderStyle: 'solid',\n borderWidth: '0 20px 20px 0',\n borderColor: `transparent ${theme.colors.background} transparent transparent`,\n }}\n />\n </div>\n\n {/* 加载动画圆点 */}\n <div\n style={{\n position: 'absolute',\n top: '50%',\n left: '50%',\n transform: 'translate(-50%, -50%)',\n width: '20px',\n height: '20px',\n borderRadius: '50%',\n background: theme.colors.background,\n animation: 'pulse 1.5s ease-in-out infinite',\n }}\n />\n </div>\n\n {/* 状态文本 */}\n <div\n style={{\n fontSize: '16px',\n fontWeight: '500',\n color: theme.colors.text,\n marginBottom: '8px',\n textAlign: 'center',\n }}\n >\n {status}\n </div>\n\n {/* 进度指示器 */}\n <div\n style={{\n width: '200px',\n height: '4px',\n background: theme.colors.border,\n borderRadius: '2px',\n overflow: 'hidden',\n position: 'relative',\n }}\n >\n <div\n style={{\n width: '30%',\n height: '100%',\n background: theme.colors.primary,\n borderRadius: '2px',\n animation: 'loading-progress 2s ease-in-out infinite',\n }}\n />\n </div>\n\n {/* 动画样式 */}\n <style>{`\n @keyframes pulse {\n 0%, 100% {\n opacity: 1;\n transform: translate(-50%, -50%) scale(1);\n }\n 50% {\n opacity: 0.5;\n transform: translate(-50%, -50%) scale(1.1);\n }\n }\n\n @keyframes loading-progress {\n 0% {\n transform: translateX(-100%);\n }\n 50% {\n transform: translateX(0%);\n }\n 100% {\n transform: translateX(100%);\n }\n }\n `}</style>\n </div>\n );\n};\n\nconst LoadingContainer = styled.div<{ $theme: AppTheme }>`\n display: flex;\n align-items: center;\n justify-content: center;\n height: 100%;\n color: ${props => props.$theme.colors.disabledText};\n font-size: 14px;\n`;\n\nconst ErrorContainer = styled.div<{ $theme: AppTheme }>`\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 100%;\n color: ${props => props.$theme.colors.error};\n text-align: center;\n padding: 20px;\n`;\n\n// 默认主题\nconst defaultTheme: AppTheme = {\n colors: {\n primary: '#007bff',\n secondary: '#6c757d',\n success: '#008000',\n warning: '#FFA500',\n error: '#FF0000',\n info: '#0000FF',\n background: '#f8f9fa',\n text: '#343a40',\n border: '#dee2e6',\n disabled: '#808080',\n disabledBackground: '#F5F5F5',\n disabledText: '#808080',\n },\n space: {\n sidebar: 'md',\n size: 'md',\n radius: 'md',\n padding: 'md',\n margin: 'md',\n shadow: 'md',\n lineHeight: 'md',\n },\n};\n\n/**\n * StaticFileReader组件\n * 静态文件读取器,支持从URL加载文件并解析显示\n *\n * @param props - 组件属性\n * @returns StaticFileReader组件\n */\nconst StaticFileReader: React.FC<StaticFileReaderProps> = ({\n fileUrl,\n fileType,\n annotations,\n fileName,\n token,\n initialPage = 1,\n data,\n eventsEmit = () => {},\n styles,\n tools = {\n annotation: false,\n download: false,\n zoom: true,\n close: true,\n navigation: true,\n },\n customComponents,\n className,\n headerClass,\n contentClass,\n}) => {\n // 使用主题\n const mergedTheme = styles?.theme || defaultTheme;\n\n // 状态管理\n const [isLoading, setIsLoading] = useState(true);\n const [loadingStatus, setLoadingStatus] = useState<string>('文件下载中...');\n const [error, setError] = useState<string | null>(null);\n const [parseResult, setParseResult] = useState<ParseResult | null>(null);\n const [currentPage, setCurrentPage] = useState(initialPage);\n const [scale, setScale] = useState(1);\n const [rotation, setRotation] = useState(0); // 图片旋转角度\n const [isAnnotating, setIsAnnotating] = useState(false);\n //const [annotations, setAnnotations] = useState<Annotation[]>([]);\n\n /**\n * 重置所有状态\n */\n const resetState = useCallback(() => {\n setIsLoading(true);\n setLoadingStatus('文件下载中...');\n setError(null);\n setParseResult(null);\n setCurrentPage(initialPage);\n setRotation(0);\n setIsAnnotating(false);\n }, [initialPage]);\n\n /**\n * 加载并解析文件\n */\n const loadFile = useCallback(async () => {\n console.log('=== loadFile 开始 ===');\n console.log('当前参数:', { fileUrl, fileName, fileType, data });\n\n // 重置所有状态\n resetState();\n\n // 如果有直接传递的数据,直接使用\n if (data) {\n setIsLoading(false);\n setError(null);\n setParseResult({\n type: data.fileType || fileType || 'text',\n content: data.content,\n fileName: data.fileName || fileName,\n fileType: data.fileType || fileType,\n totalPages: data.totalPages || 1,\n });\n return;\n }\n\n if (!fileUrl) {\n setError('文件URL不能为空');\n setIsLoading(false);\n return;\n }\n\n try {\n setIsLoading(true);\n setError(null);\n\n // 根据文件类型设置不同的加载状态\n const detectedType = detectFileType(fileName, fileType);\n if (detectedType === 'image') {\n setLoadingStatus('图片下载中...');\n } else if (detectedType === 'pdf') {\n setLoadingStatus('PDF文件下载中...');\n } else if (detectedType === 'markdown' || detectedType === 'markdown_table') {\n setLoadingStatus('Markdown文件下载中...');\n } else {\n setLoadingStatus('文件下载中...');\n }\n\n // 使用core层的解析函数\n const result = await parseFile(fileUrl, {\n fileName,\n fileType,\n token,\n });\n\n console.log('=== StaticFileReader parseFile 结果 ===');\n console.log('result:', result);\n console.log('result.type:', result.type);\n console.log('result.content:', result.content);\n console.log('result.content?.text:', result.content?.text);\n console.log('result.fileName:', result.fileName);\n console.log('result.fileType:', result.fileType);\n\n if (result.error) {\n setError(result.error);\n } else {\n // 根据文件类型设置不同的完成状态\n if (result.type === 'image') {\n setLoadingStatus('图片加载完成');\n } else if (result.type === 'pdf') {\n setLoadingStatus('PDF加载完成');\n } else if (result.type === 'markdown' || result.type === 'markdown_table') {\n setLoadingStatus('Markdown加载完成');\n } else {\n setLoadingStatus('文件加载完成');\n }\n\n console.log('=== parseResult 设置 ===');\n console.log('parseResult:', result);\n console.log('parseResult.content:', result.content);\n console.log('parseResult.content.document:', result.content?.document);\n setParseResult(result);\n }\n } catch (err) {\n setError(`文件加载失败: ${err instanceof Error ? err.message : '未知错误'}`);\n } finally {\n setIsLoading(false);\n }\n }, [fileUrl, fileName, fileType, token, data, resetState]);\n\n // 监听文件URL变化\n useEffect(() => {\n loadFile();\n }, [loadFile]);\n\n /**\n * 处理事件回调\n */\n const handleEventsEmit = useCallback(\n (name: string, data?: any, innerFn?: any) => {\n // 处理内部事件\n switch (name) {\n case 'pageChange':\n if (data?.pageNumber) {\n setCurrentPage(data.pageNumber);\n }\n break;\n\n // if (data?.annotationId) {\n // setAnnotations(prev => prev.filter(a => a.id !== data.annotationId));\n // }\n // break;\n default:\n // 传递给外部事件处理器\n eventsEmit(name, data, innerFn);\n break;\n }\n },\n [eventsEmit]\n );\n\n /**\n * 处理缩放放大\n */\n const handleZoomIn = useCallback(() => {\n const newScale = Math.min(3, scale + 0.1);\n setScale(newScale);\n handleEventsEmit('zoom:change', { scale: newScale });\n }, [scale, handleEventsEmit]);\n\n /**\n * 处理缩放缩小\n */\n const handleZoomOut = useCallback(() => {\n const newScale = Math.max(0.3, scale - 0.1);\n setScale(newScale);\n handleEventsEmit('zoom:change', { scale: newScale });\n }, [scale, handleEventsEmit]);\n\n /**\n * 处理上一页\n */\n const handlePrevPage = useCallback(() => {\n if (currentPage > 1) {\n const newPage = currentPage - 1;\n setCurrentPage(newPage);\n handleEventsEmit('page:change', { page: newPage });\n }\n }, [currentPage, handleEventsEmit]);\n\n /**\n * 处理下一页\n */\n const handleNextPage = useCallback(() => {\n const totalPages = parseResult?.totalPages || 0;\n if (totalPages && currentPage < totalPages) {\n const newPage = currentPage + 1;\n setCurrentPage(newPage);\n handleEventsEmit('page:change', { page: newPage });\n }\n }, [currentPage, parseResult?.totalPages, handleEventsEmit]);\n\n /**\n * 处理标注切换\n */\n const handleAnnotationToggle = useCallback(() => {\n const newAnnotating = !isAnnotating;\n setIsAnnotating(newAnnotating);\n handleEventsEmit('annotation:toggle', { isAnnotating: newAnnotating });\n }, [isAnnotating, handleEventsEmit]);\n\n /**\n * 处理下载\n */\n const handleDownload = useCallback(() => {\n handleEventsEmit('download:start', { fileUrl, fileName });\n }, [handleEventsEmit, fileUrl, fileName]);\n\n /**\n * 处理向左旋转\n */\n const handleRotateLeft = useCallback(() => {\n setRotation(prev => (prev - 90) % 360);\n handleEventsEmit('rotate:left', { rotation: (rotation - 90) % 360 });\n }, [rotation, handleEventsEmit]);\n\n /**\n * 处理向右旋转\n */\n const handleRotateRight = useCallback(() => {\n setRotation(prev => (prev + 90) % 360);\n handleEventsEmit('rotate:right', { rotation: (rotation + 90) % 360 });\n }, [rotation, handleEventsEmit]);\n\n /**\n * 处理关闭\n */\n const handleClose = useCallback(() => {\n handleEventsEmit('viewer:close');\n }, [handleEventsEmit]);\n\n /**\n * 根据文件类型动态控制工具按钮\n */\n const getDynamicTools = useCallback((fileType: string, baseTools: ToolsConfig): ToolsConfig => {\n const isMultiPageFile = fileType === 'pdf'; // 只有 PDF 是多页文件\n const isTextBasedFile =\n fileType === 'text' ||\n fileType === 'markdown' ||\n fileType === 'markdown_table' ||\n fileType === 'html';\n\n return {\n ...baseTools,\n // 缩放功能:只有 PDF 和图片支持\n zoom: baseTools.zoom && !isTextBasedFile,\n // 导航功能:只有多页文件支持(PDF)\n navigation: baseTools.navigation && isMultiPageFile,\n // 标注功能:PDF、Markdown、Markdown表格都支持\n annotation:\n baseTools.annotation &&\n (fileType === 'pdf' || fileType === 'markdown' || fileType === 'markdown_table'),\n // 旋转功能:只有图片支持\n rotate: baseTools.rotate && fileType === 'image',\n // 下载功能:所有文件都支持\n download: baseTools.download,\n // 关闭功能:所有文件都支持\n close: baseTools.close,\n };\n }, []);\n\n // 渲染加载状态\n if (isLoading) {\n const loadingTools = getDynamicTools(fileType || 'unknown', {\n ...tools,\n navigation: false,\n });\n\n return (\n <ReaderContainer $theme={mergedTheme} className={className}>\n {/* 头部工具栏 - 始终显示 */}\n <Header\n fileName={fileName || '加载中...'}\n currentPage={1}\n totalPage={0}\n tools={loadingTools}\n styles={styles}\n onPrevPage={() => {}}\n onNextPage={() => {}}\n onZoomIn={() => {}}\n onZoomOut={() => {}}\n onAnnotationToggle={() => {}}\n onDownload={() => {}}\n onClose={handleClose}\n scale={1}\n isAnnotating={false}\n className={headerClass}\n />\n\n {/* 内容区域 - 显示加载状态 */}\n {customComponents?.LoadingComponent ? (\n <customComponents.LoadingComponent status={loadingStatus} theme={mergedTheme} />\n ) : (\n <DefaultLoadingComponent status={loadingStatus} theme={mergedTheme} />\n )}\n </ReaderContainer>\n );\n }\n\n // 渲染错误状态\n if (error) {\n const errorTools = getDynamicTools(fileType || 'unknown', {\n ...tools,\n navigation: false,\n });\n\n return (\n <ReaderContainer $theme={mergedTheme} className={className}>\n {/* 头部工具栏 - 始终显示 */}\n <Header\n fileName={fileName || '错误'}\n currentPage={1}\n totalPage={0}\n tools={errorTools}\n styles={styles}\n onPrevPage={() => {}}\n onNextPage={() => {}}\n onZoomIn={() => {}}\n onZoomOut={() => {}}\n onAnnotationToggle={() => {}}\n onDownload={() => {}}\n onClose={handleClose}\n scale={1}\n isAnnotating={false}\n className={headerClass}\n />\n\n {/* 内容区域 - 显示错误状态 */}\n <ErrorContainer $theme={mergedTheme}>\n <div>文件加载失败</div>\n <div style={{ fontSize: '12px', marginTop: '8px' }}>{error}</div>\n </ErrorContainer>\n </ReaderContainer>\n );\n }\n\n // 渲染文件内容\n if (!parseResult) {\n const unknownTools = getDynamicTools(fileType || 'unknown', {\n ...tools,\n navigation: false,\n });\n\n return (\n <ReaderContainer $theme={mergedTheme} className={className}>\n {/* 头部工具栏 - 始终显示 */}\n <Header\n fileName={fileName || '未知文件'}\n currentPage={1}\n totalPage={0}\n tools={unknownTools}\n styles={styles}\n onPrevPage={() => {}}\n onNextPage={() => {}}\n onZoomIn={() => {}}\n onZoomOut={() => {}}\n onAnnotationToggle={() => {}}\n onDownload={() => {}}\n onClose={handleClose}\n scale={1}\n isAnnotating={false}\n className={headerClass}\n />\n\n {/* 内容区域 - 显示解析错误 */}\n <ErrorContainer $theme={mergedTheme}>\n <div>无法解析文件</div>\n </ErrorContainer>\n </ReaderContainer>\n );\n }\n\n // 准备传递给Fviewer的数据\n const viewerData = {\n content: parseResult.content,\n ...((parseResult.fileName || fileName) && { fileName: parseResult.fileName || fileName }),\n ...((parseResult.fileType || fileType) && { fileType: parseResult.fileType || fileType }),\n ...(parseResult.totalPages && { totalPages: parseResult.totalPages }),\n };\n\n // 根据文件类型动态控制工具按钮\n const dynamicTools = getDynamicTools(parseResult.type, tools);\n\n console.log('=== viewerData 准备 ===');\n console.log('viewerData:', viewerData);\n console.log('viewerData.content:', viewerData.content);\n console.log('viewerData.content.document:', viewerData.content?.document);\n console.log('文件类型:', parseResult.type);\n console.log('动态工具配置:', dynamicTools);\n console.log('=== 标注数据传递 ===');\n console.log('annotations prop:', annotations);\n console.log('annotations 长度:', annotations?.length || 0);\n\n return (\n <ReaderContainer $theme={mergedTheme} className={className}>\n {/* 头部工具栏 */}\n <Header\n fileName={viewerData.fileName || parseResult.fileName || fileName || '未知文件'}\n currentPage={parseResult.type === 'pdf' ? currentPage : 1}\n totalPage={parseResult.type === 'pdf' ? parseResult.totalPages || 0 : 0}\n tools={dynamicTools}\n styles={styles}\n onPrevPage={parseResult.type === 'pdf' ? handlePrevPage : () => {}}\n onNextPage={parseResult.type === 'pdf' ? handleNextPage : () => {}}\n onZoomIn={dynamicTools.zoom ? handleZoomIn : () => {}}\n onZoomOut={dynamicTools.zoom ? handleZoomOut : () => {}}\n onAnnotationToggle={dynamicTools.annotation ? handleAnnotationToggle : () => {}}\n onDownload={dynamicTools.download ? handleDownload : () => {}}\n onRotateLeft={dynamicTools.rotate ? handleRotateLeft : () => {}}\n onRotateRight={dynamicTools.rotate ? handleRotateRight : () => {}}\n onClose={handleClose}\n scale={scale}\n isAnnotating={isAnnotating}\n className={headerClass}\n />\n\n {/* 内容区域 */}\n <Fviewer\n data={viewerData}\n annotationData={annotations || []}\n totalPage={parseResult.type === 'pdf' ? parseResult.totalPages || 0 : 0}\n currentPage={parseResult.type === 'pdf' ? currentPage : 1}\n scale={scale}\n rotation={rotation}\n eventsEmit={handleEventsEmit}\n styles={styles}\n tools={dynamicTools}\n className={contentClass}\n setScale={setScale}\n />\n </ReaderContainer>\n );\n};\n\nexport default StaticFileReader;\n","import './styles/index.css';\n\n// 导出类型\nexport type {\n PdfRenderProps,\n Annotation,\n ToolsConfig\n} from './core';\n\n// 导出其他类型\nexport type { MDAnnotation, TableAnnotation } from './core/types';\n\nexport type { StaticFileReaderProps } from './adopters/StaticFileReader';\n// export type { GientechStreamReaderProps } from './adopters/GientechStreamReader';\nexport { default as Fviewer } from './core/Fviewer';\nexport { default as StaticFileReader } from './adopters/StaticFileReader';\n// export { default as GientechStreamReader } from './adopters/GientechStreamReader';\n\n// 导出文件解析工具\nexport {\n parseFile,\n parsePdfFile,\n parseImageFile,\n parseTextFile,\n parseMarkdownFile,\n detectFileType,\n type ParseResult,\n type ParseOptions,\n type FileType\n} from './core/utils/fileParser';\n\n\n\n/**\n * 文档忽略输出\n */\nimport * as pdfjsLib from 'pdfjs-dist';\n\nexport const isPDFWorkerRegistered = (): boolean => {\n return !!pdfjsLib.GlobalWorkerOptions.workerSrc;\n};\n\nexport const getPDFWorkerPath = (): string | undefined => {\n return pdfjsLib.GlobalWorkerOptions.workerSrc;\n};\nexport const registerPDFWorker = (workerPath: string = '/worker/pdf.worker.min.js') => {\n try {\n if (pdfjsLib.GlobalWorkerOptions.workerSrc) {\n console.log('PDF Worker 已经注册:', pdfjsLib.GlobalWorkerOptions.workerSrc);\n return;\n }\n pdfjsLib.GlobalWorkerOptions.workerSrc = workerPath;\n console.log('PDF Worker 注册成功:', workerPath);\n } catch (error) {\n console.error('PDF Worker 注册失败:', error);\n }\n};\n"],"names":["DEFAULT_COLOR","generateId","Annotation","pageNumber","scale","isAnnotating","annotations","onAnnotationAdd","onAnnotationDelete","readOnly","containerRef","useRef","isDrawing","setIsDrawing","useState","startPoint","setStartPoint","currentRect","setCurrentRect","selectedAnnotation","setSelectedAnnotation","handleMouseDown","useCallback","e","rect","x","y","handleMouseMove","currentX","currentY","handleMouseUp","newAnnotation","handleAnnotationClick","annotationId","annotation","content","updatedAnnotation","a","React","anno","defaultTheme","LoadingText","styled","props","ErrorText","PdfRender","pdfDocument","currentPage","pdfStartPage","isSlidesMode","setScale","onScaleChange","onAnnotationChange","styles","isLoading","setIsLoading","error","setError","canvasSize","setCanvasSize","isInitialRender","setIsInitialRender","mergedTheme","canvasRef","pageRendering","pageCurrentNumber","calculateAutoScale","viewport","container","containerWidth","containerHeight","scaleX","scaleY","autoScale","finalScale","renderPage","relativePageNumber","page","canvas","context","useEffect","zoomTimer","getInitialZoom","boxWidth","naturalWidth","ContentContainer","LoadingContainer","ErrorContainer","markdownAnnotationStyles","detectFileType","data","fileName","fileType","renderPdfContent","_a","_b","_c","_d","_e","_f","_g","pdfAnnotations","defaultScale","renderImageContent","_h","_i","_j","_k","_l","_m","_n","imageUrl","imageLoading","setImageLoading","imageError","setImageError","handleImageLoad","handleImageError","renderTextContent","textContent","textRef","paperRef","timer","textHeight","minHeight","Markdownit","DataType","MarkdownContentView","parentProps","isTableMode","markdownRef","annotationTimeoutRef","tableObserverRef","tableReapplyInProgressRef","handleScroll","scrollTop","scrollHeight","handleScrollToTop","handleScrollToBottom","handleMarkdownRenderedRef","root","tableAnnotations","annoSig","runtimeSig","applyTableAnnotations","handleMarkdownRendered","handleTextSelection","selection","range","text","charCount","startOffset","walker","node","mdAnnotations","clearAllAnnotations","existingMdAnnotations","el","parent","clearTableAnnotations","table","row","cell","tables","i","offsets","offset","index","col","tableIndex","allRows","rowEl","targetColor","computedBg","applyMarkdownAnnotations","applyMarkdownAnnotationsInner","existingAnnotations","textNodes","totalLength","nodePositions","start","sortedAnnotations","b","end","color","relevantNodes","pos","nodeStart","localStart","localEnd","before","annotatedText","after","span","fragment","MinimalMarkdownTable","markdown","onRendered","rootRef","parseTable","md","lines","l","headerLineIdx","header","s","bodyLines","rows","apply","idx","tableEl","id","h","r","ri","c","ci","renderHtmlContent","_props","htmlContent","renderUnknownContent","Fviewer","annotationData","totalPage","userScale","rotation","eventsEmit","tools","customComponents","className","contentClass","loadingStatus","prevDataRef","prevContentRef","renderCountRef","renderContent","prevData","prevContent","dataChanged","contentChanged","toKebabCase","string","mergeClasses","classes","array","defaultAttributes","Icon","forwardRef","size","strokeWidth","absoluteStrokeWidth","children","iconNode","rest","ref","createElement","tag","attrs","createLucideIcon","iconName","Component","ChevronLeft","ChevronRight","Download","Pencil","RotateCcw","RotateCw","X","ZoomIn","ZoomOut","HeaderContainer","FileInfo","FileName","PageInfo","ToolBar","ToolButton","ZoomInfo","Header","onPrevPage","onNextPage","onZoomIn","onZoomOut","onAnnotationToggle","onDownload","onRotateLeft","onRotateRight","onClose","ensurePDFWorkerRegistered","isPDFWorkerRegistered","errorMsg","name","type","parsePdfFile","options","loadingTask","pdfjsLib","totalPages","result","errorMessage","parseImageFile","blob","resolve","reject","img","timeout","parseTextFile","response","parseMarkdownFile","markdownContent","parseHtmlFile","parseFile","ReaderContainer","DefaultLoadingComponent","status","theme","StaticFileReader","fileUrl","token","initialPage","headerClass","setLoadingStatus","parseResult","setParseResult","setCurrentPage","setRotation","setIsAnnotating","resetState","loadFile","detectedType","err","handleEventsEmit","innerFn","handleZoomIn","newScale","handleZoomOut","handlePrevPage","newPage","handleNextPage","handleAnnotationToggle","newAnnotating","handleDownload","handleRotateLeft","prev","handleRotateRight","handleClose","getDynamicTools","baseTools","isMultiPageFile","isTextBasedFile","loadingTools","errorTools","unknownTools","viewerData","dynamicTools","getPDFWorkerPath","registerPDFWorker","workerPath"],"mappings":"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","x_google_ignoreList":[3,4,5,6,7,8,9,10,11,12,13,14,15]}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/core/Annotation/index.tsx","../src/core/PdfRender/index.tsx","../src/core/Fviewer.tsx","../../../node_modules/.pnpm/lucide-react@0.456.0_react@18.3.1/node_modules/lucide-react/dist/esm/shared/src/utils.js","../../../node_modules/.pnpm/lucide-react@0.456.0_react@18.3.1/node_modules/lucide-react/dist/esm/defaultAttributes.js","../../../node_modules/.pnpm/lucide-react@0.456.0_react@18.3.1/node_modules/lucide-react/dist/esm/Icon.js","../../../node_modules/.pnpm/lucide-react@0.456.0_react@18.3.1/node_modules/lucide-react/dist/esm/createLucideIcon.js","../../../node_modules/.pnpm/lucide-react@0.456.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/chevron-left.js","../../../node_modules/.pnpm/lucide-react@0.456.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/chevron-right.js","../../../node_modules/.pnpm/lucide-react@0.456.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/download.js","../../../node_modules/.pnpm/lucide-react@0.456.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/pencil.js","../../../node_modules/.pnpm/lucide-react@0.456.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/rotate-ccw.js","../../../node_modules/.pnpm/lucide-react@0.456.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/rotate-cw.js","../../../node_modules/.pnpm/lucide-react@0.456.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/x.js","../../../node_modules/.pnpm/lucide-react@0.456.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/zoom-in.js","../../../node_modules/.pnpm/lucide-react@0.456.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/zoom-out.js","../src/adopters/components/Header/index.tsx","../src/core/utils/fileParser.ts","../src/adopters/StaticFileReader.tsx","../src/lib_enter.ts"],"sourcesContent":["import React, { useState, useRef, useCallback, useEffect } from 'react';\nimport { Trash2 } from 'lucide-react';\nimport type { Annotation as AnnotationType } from '../types';\n\nconst DEFAULT_COLOR = '#FFEB3B';\n\n// 生成唯一ID\nconst generateId = () => {\n return `annotation_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\n};\n\nexport interface AnnotationProps {\n pageNumber: number;\n scale: number;\n isAnnotating: boolean;\n annotations: AnnotationType[];\n onAnnotationAdd?: (annotation: AnnotationType) => void;\n onAnnotationDelete?: (annotationId: string) => void;\n readOnly?: boolean;\n}\n\nexport const Annotation: React.FC<AnnotationProps> = ({\n pageNumber,\n scale,\n isAnnotating,\n annotations = [],\n onAnnotationAdd,\n onAnnotationDelete,\n readOnly = false,\n}) => {\n const containerRef = useRef<HTMLDivElement>(null);\n const [isDrawing, setIsDrawing] = useState(false);\n const [startPoint, setStartPoint] = useState({ x: 0, y: 0 });\n const [currentRect, setCurrentRect] = useState<{\n x: number;\n y: number;\n width: number;\n height: number;\n } | null>(null);\n const [selectedAnnotation, setSelectedAnnotation] = useState<string | null>(null);\n\n // 移除复杂的容器尺寸监听,使用 inset-0 自动覆盖\n\n const handleMouseDown = useCallback(\n (e: React.MouseEvent) => {\n if (!isAnnotating || !containerRef.current) return;\n\n const rect = containerRef.current.getBoundingClientRect();\n // 转换为百分比坐标,考虑缩放因素\n // rect.width 和 rect.height 是缩放后的尺寸,需要除以 scale 得到未缩放尺寸\n const x = (e.clientX - rect.left) / rect.width;\n const y = (e.clientY - rect.top) / rect.height;\n\n console.log('鼠标按下位置:', { clientX: e.clientX, clientY: e.clientY, rect, x, y, scale });\n setIsDrawing(true);\n setStartPoint({ x, y });\n },\n [isAnnotating, scale]\n );\n\n const handleMouseMove = useCallback(\n (e: React.MouseEvent) => {\n if (!isDrawing || !containerRef.current) return;\n\n const rect = containerRef.current.getBoundingClientRect();\n // 转换为百分比坐标,考虑缩放因素\n // rect.width 和 rect.height 是缩放后的尺寸,直接使用即可\n const currentX = (e.clientX - rect.left) / rect.width;\n const currentY = (e.clientY - rect.top) / rect.height;\n\n setCurrentRect({\n x: Math.min(startPoint.x, currentX),\n y: Math.min(startPoint.y, currentY),\n width: Math.abs(currentX - startPoint.x),\n height: Math.abs(currentY - startPoint.y),\n });\n },\n [isDrawing, startPoint, scale]\n );\n\n const handleMouseUp = useCallback(() => {\n if (!isDrawing || !currentRect) return;\n\n setIsDrawing(false);\n if (currentRect.width < 5 || currentRect.height < 5) {\n setCurrentRect(null);\n return;\n }\n\n const newAnnotation: AnnotationType = {\n id: generateId(),\n pageNumber,\n ...currentRect,\n content: '',\n color: DEFAULT_COLOR,\n };\n\n onAnnotationAdd?.(newAnnotation);\n setCurrentRect(null);\n }, [isDrawing, currentRect, pageNumber, onAnnotationAdd]);\n\n const handleAnnotationClick = useCallback((annotationId: string) => {\n setSelectedAnnotation(selectedAnnotation === annotationId ? null : annotationId);\n }, [selectedAnnotation]);\n\n const handleContentChange = useCallback((annotation: AnnotationType, content: string) => {\n const updatedAnnotation = {\n ...annotation,\n content,\n };\n onAnnotationAdd?.(updatedAnnotation);\n }, [onAnnotationAdd]);\n\n const handleDeleteAnnotation = useCallback((annotationId: string) => {\n onAnnotationDelete?.(annotationId);\n setSelectedAnnotation(null);\n }, [onAnnotationDelete]);\n\n console.log('标注组件渲染:', {\n pageNumber,\n annotations: annotations.length,\n currentPageAnnotationsCount: annotations.filter(a => a.pageNumber === pageNumber).length,\n currentPageAnnotations: annotations.filter(a => a.pageNumber === pageNumber)\n });\n\n return (\n <div\n ref={containerRef}\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n width: '100%',\n height: '100%',\n zIndex: 10,\n pointerEvents: 'auto', // 确保可以接收鼠标事件\n }}\n onMouseDown={handleMouseDown}\n onMouseMove={handleMouseMove}\n onMouseUp={handleMouseUp}\n onMouseLeave={handleMouseUp}\n >\n {/* 当前绘制的标注 */}\n {currentRect && (\n <div\n className=\"absolute border-2 border-yellow-400 bg-yellow-100/30\"\n style={{\n left: `${currentRect.x * 100}%`,\n top: `${currentRect.y * 100}%`,\n width: `${currentRect.width * 100}%`,\n height: `${currentRect.height * 100}%`,\n }}\n />\n )}\n\n {/* 已保存的标注 */}\n {annotations\n .filter(anno => anno.pageNumber === pageNumber)\n .map(annotation => {\n console.log('渲染标注:', annotation.id, `位置: ${annotation.x * 100}%, ${annotation.y * 100}%`);\n return (\n <div key={annotation.id} style={{\n width: '100%',\n height: '100%',\n position: 'absolute',\n top: 0,\n left: 0,\n\n }} >\n <div\n className='border border-solid'\n style={{\n position: 'absolute',\n left: `${annotation.x * 100}%`,\n top: `${annotation.y * 100}%`,\n width: `${annotation.width * 100}%`,\n height: `${annotation.height * 100}%`,\n borderWidth: '2px',\n borderColor: `${annotation.color}`,\n backgroundColor: `${annotation.color}4D`, // 30%透明度 (4D = 77/255 ≈ 0.3)\n zIndex: 1000,\n }}\n onClick={() => handleAnnotationClick(annotation.id)}\n />\n </div>\n );\n })}\n </div>\n );\n};\n\nexport default Annotation;\n","import React, { useState, useCallback, useRef, useEffect, useLayoutEffect, useMemo } from 'react';\nimport * as pdfjsLib from 'pdfjs-dist';\nimport styled from 'styled-components';\nimport Annotation from '../Annotation';\nimport type { AppTheme, Annotation as AnnotationType } from '../types';\nimport { isPDFWorkerRegistered, getPDFWorkerPath } from '../../lib_enter';\n\n// 注意:不再自动注册 PDF Worker\n// Worker 应该由最终调用方在应用入口处通过 registerPDFWorker() 手动注册\n// 这样可以避免打包后函数引用问题,并给用户更多控制权\n\n// 默认主题\nconst defaultTheme: AppTheme = {\n colors: {\n primary: '#007bff',\n secondary: '#6c757d',\n success: '#008000',\n warning: '#FFA500',\n error: '#FF0000',\n info: '#0000FF',\n background: '#f8f9fa',\n text: '#343a40',\n border: '#dee2e6',\n disabled: '#808080',\n disabledBackground: '#F5F5F5',\n disabledText: '#808080',\n },\n space: {\n sidebar: 'md',\n size: 'md',\n radius: 'md',\n padding: 'md',\n margin: 'md',\n shadow: 'md',\n lineHeight: 'md',\n },\n};\n\n// PDF渲染组件属性接口\nexport interface PdfRenderProps {\n setScale?: (scale: number) => void;\n // PDF数据 - 统一接受已解析的PDFDocument对象\n pdfDocument: any | null;\n\n // 当前页码(全局页码)\n currentPage: number;\n\n // PDF文档的起始页码(用于分页PDF)\n pdfStartPage?: number;\n\n // 缩放比例\n scale: number;\n\n // 标注数据\n annotations: AnnotationType[];\n\n // 是否处于标注模式\n isAnnotating: boolean;\n\n // 是否为幻灯片模式(影响布局显示)\n isSlidesMode?: boolean;\n\n // 事件回调\n onPageChange?: (pageNumber: number) => void;\n onScaleChange?: (scale: number) => void; // 添加缩放更新回调\n onAnnotationChange?: (annotation: AnnotationType) => void;\n onAnnotationDelete?: (annotationId: string) => void;\n\n // 样式配置\n styles?: {\n theme?: AppTheme;\n };\n}\n\n// 样式组件\nconst LoadingText = styled.div<{ $theme: AppTheme }>`\n display: flex;\n align-items: center;\n justify-content: center;\n height: 200px;\n color: ${props => props.$theme.colors.disabledText};\n font-size: 14px;\n`;\n\nconst ErrorText = styled.div<{ $theme: AppTheme }>`\n display: flex;\n align-items: center;\n justify-content: center;\n height: 200px;\n color: ${props => props.$theme.colors.error};\n font-size: 14px;\n text-align: center;\n`;\n\n/**\n * PDF渲染组件\n * 负责PDF文件的具体渲染和标注功能\n *\n * @param props - 组件属性\n * @returns PDF渲染组件\n */\nconst PdfRender: React.FC<PdfRenderProps> = ({\n pdfDocument,\n currentPage,\n pdfStartPage = 1, // 默认从第1页开始\n scale,\n annotations,\n isAnnotating,\n isSlidesMode = false,\n setScale,\n onScaleChange,\n onAnnotationChange,\n onAnnotationDelete,\n styles,\n}) => {\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [canvasSize, setCanvasSize] = useState<any>(null);\n const [isInitialRender, setIsInitialRender] = useState(true);\n\n // 使用主题\n const mergedTheme = styles?.theme || defaultTheme;\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n const pageRendering = useRef(false);\n const pageCurrentNumber = useRef<number | null>(null);\n\n /**\n * 计算合适的初始缩放比例\n */\n const calculateAutoScale = useCallback(\n (viewport: any) => {\n if (!containerRef.current || !isInitialRender || !onScaleChange) return null;\n\n const container = containerRef.current;\n const containerWidth = container.offsetWidth - 40; // 减去padding\n const containerHeight = container.offsetHeight - 40; // 减去padding\n\n // 计算宽度和高度的缩放比例\n const scaleX = containerWidth / viewport.width;\n const scaleY = containerHeight / viewport.height;\n\n // 选择较小的缩放比例,确保内容完全显示\n const autoScale = Math.min(scaleX, scaleY, 1); // 不超过100%\n\n // 限制缩放范围在0.3到1之间\n const finalScale = Math.max(0.3, Math.min(1, autoScale));\n\n console.log('自动计算缩放比例:', {\n containerWidth,\n containerHeight,\n viewportWidth: viewport.width,\n viewportHeight: viewport.height,\n scaleX,\n scaleY,\n autoScale,\n finalScale,\n });\n\n return finalScale;\n },\n [isInitialRender, onScaleChange]\n );\n\n /**\n * 渲染PDF页面\n */\n const renderPage = useCallback(async () => {\n if (!pdfDocument || !canvasRef.current) return;\n\n // 防止重复渲染\n if (pageRendering.current || pageCurrentNumber.current === currentPage) {\n console.log('页面正在渲染中,跳过');\n return;\n }\n\n try {\n pageCurrentNumber.current = currentPage;\n pageRendering.current = true;\n\n // 计算PDF文档内的相对页码\n const relativePageNumber = currentPage - pdfStartPage + 1;\n console.log(\n `计算下,渲染页面: PDF起始页:pdfStartPage=${pdfStartPage}, 全局页码:currentPage=${currentPage}, 相对页码=${relativePageNumber}`\n );\n\n // 验证页码是否在PDF文档范围内\n if (relativePageNumber < 1 || relativePageNumber > pdfDocument.numPages) {\n console.error(\n `页码超出范围: 相对页码=${relativePageNumber}, PDF总页数=${pdfDocument.numPages}`\n );\n throw new Error(\n `页码超出范围: 请求第${currentPage}页,但PDF文档只包含${pdfDocument.numPages}页`\n );\n }\n\n const page = await pdfDocument.getPage(relativePageNumber);\n const canvas = canvasRef.current;\n\n const context = canvas.getContext('2d');\n\n // 使用scale直接调整viewport,而不是CSS transform\n console.log('当前scale值:', scale);\n const viewport = page.getViewport({ scale: 1 }); // 使用原始尺寸,让CSS transform处理缩放\n console.log('viewport尺寸:', viewport.width, 'x', viewport.height);\n\n // 暂时禁用自动缩放,先恢复PDF渲染\n if (isInitialRender) {\n setIsInitialRender(false);\n }\n canvas.width = viewport.width;\n canvas.height = viewport.height;\n if (canvas.width && canvas.height) {\n setCanvasSize({ width: canvas.width, height: canvas.height });\n }\n\n await page.render({\n canvasContext: context,\n viewport: viewport,\n }).promise;\n\n console.log('PDF渲染成功, canvas尺寸:', canvas.width, 'x', canvas.height);\n\n // 确保父容器能正确获取canvas尺寸\n if (containerRef.current) {\n const container = containerRef.current;\n console.log('容器尺寸:', container.offsetWidth, 'x', container.offsetHeight);\n console.log('Canvas显示尺寸:', canvas.offsetWidth, 'x', canvas.offsetHeight);\n }\n } catch (error) {\n console.error('PDF渲染失败:', error);\n } finally {\n pageRendering.current = false;\n }\n }, [pdfDocument, scale, pdfStartPage, calculateAutoScale, onScaleChange, currentPage]);\n\n // 监听当前页面变化,重新渲染\n useEffect(() => {\n if (pdfDocument && currentPage && pdfStartPage) {\n console.log(\n '计算下,renderPage:',\n 'pdfStartPage:' + pdfStartPage,\n 'currentPage:' + currentPage,\n 'pdfDocument:',\n pdfDocument\n );\n renderPage();\n }\n }, [currentPage, pdfDocument, pdfStartPage]);\n\n // 监听缩放变化,重新渲染当前页面\n useEffect(() => {\n if (pdfDocument && currentPage) {\n renderPage();\n }\n }, [scale, pdfDocument, currentPage]);\n\n if (isLoading) {\n return (\n <div className=\"flex justify-center items-center min-h-full\">\n <LoadingText $theme={mergedTheme}>加载中...</LoadingText>\n </div>\n );\n }\n\n if (error) {\n return (\n <div className=\"flex justify-center items-center min-h-full\">\n <ErrorText $theme={mergedTheme}>\n <div>\n <div>加载失败</div>\n <div style={{ fontSize: '12px', marginTop: '8px' }}>{error}</div>\n </div>\n </ErrorText>\n </div>\n );\n }\n\n const zoomTimer: any = useRef(null);\n const getInitialZoom = () => {\n const boxWidth = containerRef.current ? containerRef.current.offsetWidth - 40 : null;\n if (!boxWidth) return;\n if (!canvasSize?.width) return;\n const naturalWidth = canvasSize.width;\n const autoScale = boxWidth / naturalWidth;\n const finalScale = +autoScale.toFixed(2);\n if (typeof finalScale === 'number') {\n setScale && setScale(Math.min(finalScale, 1));\n } else {\n clearInterval(zoomTimer.current);\n zoomTimer.current = null;\n }\n };\n\n useEffect(() => {\n if (!containerRef.current || !canvasSize?.width || !canvasSize?.height) {\n clearInterval(zoomTimer.current);\n zoomTimer.current = null;\n zoomTimer.current = setInterval(() => {\n getInitialZoom();\n }, 34);\n return;\n } else {\n getInitialZoom();\n }\n return () => {\n clearInterval(zoomTimer.current);\n zoomTimer.current = null;\n };\n }, [canvasSize]);\n\n // 优化布局:支持大尺寸canvas的滚动\n return (\n <div\n ref={containerRef}\n className=\"bg-gray-100\"\n style={{\n display: isSlidesMode ? 'block' : 'flex',\n justifyContent: isSlidesMode ? 'initial' : 'center',\n alignItems: isSlidesMode ? 'initial' : 'flex-start',\n padding: '20px',\n minHeight: '100%',\n width: '100%',\n // 移除overflow设置,让外层容器处理滚动\n overflow: 'visible',\n }}\n >\n {isLoading ? (\n <div className=\"flex flex-col items-center gap-2 mt-20\">\n <div className=\"animate-spin rounded-full h-6 w-6 border-b-2 border-gray-900\" />\n <div className=\"text-xs text-gray-600\">PDF加载中...</div>\n </div>\n ) : error ? (\n <div className=\"flex flex-col items-center gap-2 mt-20 text-red-500\">\n <div>渲染错误</div>\n <div className=\"text-xs\">{error}</div>\n </div>\n ) : (\n <div className=\"flex justify-center items-start\">\n <div\n className=\"relative\"\n style={{\n transform: `scale(${scale})`,\n transformOrigin: 'top',\n display: 'inline-block', // 确保容器适应内容尺寸\n }}\n >\n <canvas\n ref={canvasRef}\n className=\"shadow-lg bg-white border border-gray-300\"\n style={{\n display: 'block',\n }}\n />\n <Annotation\n pageNumber={currentPage}\n scale={scale || 1}\n isAnnotating={isAnnotating}\n annotations={annotations}\n onAnnotationAdd={onAnnotationChange}\n onAnnotationDelete={onAnnotationDelete}\n readOnly={!isAnnotating}\n />\n </div>\n </div>\n )}\n </div>\n );\n};\n\nexport default PdfRender;\n","import React, { useState, useCallback, useEffect, useRef } from 'react';\nimport styled from 'styled-components';\nimport PdfRender from './PdfRender';\nimport { Markdownit, DataType } from '@mxmweb/rtext';\nimport type { AppTheme, Annotation, MDAnnotation, TableAnnotation, ToolsConfig } from './types';\n\n// 文件类型枚举\ntype FileType =\n | 'pdf'\n | 'image'\n | 'text'\n | 'markdown'\n | 'pdf_slides'\n | 'markdown_table'\n | 'html'\n | 'unknown';\n\n// Fviewer数据接口定义\n// 自定义组件接口\nexport interface CustomizeComponents {\n LoadingComponent?: React.ComponentType<{\n status: string;\n theme: AppTheme;\n }>;\n ErrorComponent?: React.ComponentType<{\n error: string;\n theme: AppTheme;\n }>;\n}\n\nexport interface FviewerData {\n content: any; // 文件内容\n fileName?: string; // 可选:文件名\n fileType?: string; // 可选:文件类型\n totalPages?: number; // 可选:总页数\n pdfStartPage?: number; // 可选:PDF文档的起始页码(用于分页PDF)\n}\n\n// Fviewer组件属性接口\nexport interface FviewerProps {\n // 数据相关\n data: FviewerData; // 文件数据\n annotationData?: (Annotation | MDAnnotation | TableAnnotation)[]; // 统一的标注数据\n totalPage?: number;\n currentPage?: number;\n scale?: number; // 缩放比例\n initialZoom?: number; // 初始缩放比例\n rotation?: number; // 旋转角度\n setScale?: (scale: number) => void;\n // 事件回调\n eventsEmit?: (name: string, data?: any, innerFn?: any) => void;\n\n // 样式配置\n styles?: {\n theme?: AppTheme;\n mode?: 'light' | 'dark';\n };\n\n // 工具配置\n tools?: ToolsConfig;\n\n // 自定义组件\n customComponents?: CustomizeComponents;\n\n // 自定义类名\n className?: string;\n contentClass?: string;\n}\n\n// 样式组件\nconst ContentContainer = styled.div<{ $theme: AppTheme }>`\n flex: 1;\n background: ${props => props.$theme.colors.background};\n position: relative;\n display: flex;\n flex-direction: column;\n scroll-behavior: smooth;\n\n min-height: 0; /* 确保flex子元素可以收缩 */\n height: calc(100% - 1px); /* 明确的高度设置,减去header高度 */\n /* 支持大尺寸内容的滚动 */\n overflow-x: auto;\n overflow-y: auto; /* 改为auto,允许垂直滚动 */\n`;\n\nconst LoadingContainer = styled.div<{ $theme: AppTheme }>`\n display: flex;\n align-items: center;\n justify-content: center;\n height: 100%;\n color: ${props => props.$theme.colors.disabledText};\n`;\n\nconst ErrorContainer = styled.div<{ $theme: AppTheme }>`\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 100%;\n color: ${props => props.$theme.colors.error};\n text-align: center;\n padding: 20px;\n`;\n\n// Markdown标注样式\nconst markdownAnnotationStyles = `\n .md-annotation {\n position: relative;\n display: inline;\n cursor: pointer;\n transition: opacity 0.2s;\n background-color: var(--highlight-color, #FFE599);\n }\n\n .md-annotation:hover {\n opacity: 0.8;\n }\n\n /* 表格标注样式 */\n .table-annotation {\n background-color: var(--table-highlight-color, rgba(255, 229, 153, 0.5));\n }\n\n /* markdown_table模式下的表格样式 */\n .markdown-table-mode table {\n overflow: visible !important;\n max-width: none !important;\n width: auto !important;\n table-layout: auto !important;\n }\n\n .markdown-table-mode table,\n .markdown-table-mode table * {\n overflow: visible !important;\n }\n\n .markdown-table-mode .table-container{\n margin: 0 !important;\n overflow: auto !important;\n width: 100% !important;\n min-width: 100% !important;\n }\n\n /* 确保表格单元格不会被压缩 */\n .markdown-table-mode table td,\n .markdown-table-mode table th {\n white-space: nowrap !important;\n min-width: 50px !important;\n }\n\n /* 移除fit-content,使用100%宽度确保内容能正常显示 */\n .markdown-table-mode div{\n width: fit-content !important;\n }\n\n /* 为表格添加最小宽度,确保内容不被压缩 */\n .markdown-table-mode table {\n min-width: fit-content !important;\n }\n\n .markdown-table-mode.markdown-scrollbar::-webkit-scrollbar {\n width: 12px;\n height: 12px;\n }\n\n\n /* 自定义滚动条样式 */\n .markdown-scrollbar::-webkit-scrollbar {\n width: 8px;\n height: 8px;\n }\n\n .markdown-scrollbar::-webkit-scrollbar-track {\n background: #f1f1f1;\n border-radius: 4px;\n }\n\n .markdown-scrollbar::-webkit-scrollbar-thumb {\n background: #c1c1c1;\n border-radius: 4px;\n }\n\n .markdown-scrollbar::-webkit-scrollbar-thumb:hover {\n background: #a9a9a;\n }\n`;\n\n// 默认主题\nconst defaultTheme: AppTheme = {\n colors: {\n primary: '#007bff',\n secondary: '#6c757d',\n success: '#008000',\n warning: '#FFA500',\n error: '#FF0000',\n info: '#0000FF',\n background: '#f8f9fa',\n text: '#343a40',\n border: '#dee2e6',\n disabled: '#808080',\n disabledBackground: '#F5F5F5',\n disabledText: '#808080',\n },\n space: {\n sidebar: 'md',\n size: 'md',\n radius: 'md',\n padding: 'md',\n margin: 'md',\n shadow: 'md',\n lineHeight: 'md',\n },\n};\n\n/**\n * 检测文件类型\n */\nconst detectFileType = (data: any): FileType => {\n console.log('=== detectFileType 开始 ===');\n console.log('输入数据:', data);\n\n if (!data) {\n console.log('数据为空,返回 unknown');\n return 'unknown';\n }\n\n const fileName = data.fileName || '';\n const fileType = data.fileType || '';\n const content = data.content;\n\n console.log('检测参数:', { fileName, fileType, content });\n\n // 优先使用 fileType 参数进行检测,这是最准确的\n if (fileType === 'pdf' || fileType === 'pdf_slides') {\n console.log('检测到PDF文件');\n return fileType as FileType;\n }\n if (fileType === 'image') {\n console.log('检测到图片文件');\n return 'image';\n }\n if (fileType === 'markdown_table') {\n console.log('检测到Markdown表格文件');\n return 'markdown_table';\n }\n if (fileType === 'markdown') {\n console.log('检测到Markdown文件');\n return 'markdown';\n }\n if (fileType === 'html') {\n console.log('检测到HTML文件');\n return 'html';\n }\n if (fileType === 'text') {\n console.log('检测到文本文件');\n return 'text';\n }\n\n // 如果 fileType 没有明确指定,则根据文件名和内容进行推断\n if (fileName.toLowerCase().endsWith('.pdf') || content?.type === 'pdf') {\n console.log('检测到PDF文件');\n return 'pdf';\n }\n if (fileName.toLowerCase().match(/\\.(jpg|jpeg|png|gif|bmp|webp)$/) || content?.type === 'image') {\n console.log('检测到图片文件');\n return 'image';\n }\n if (fileName.toLowerCase().endsWith('.md') || content?.type === 'markdown') {\n console.log('检测到Markdown文件');\n return 'markdown';\n }\n if (fileName.toLowerCase().match(/\\.(html|htm)$/) || content?.type === 'html') {\n console.log('检测到HTML文件');\n return 'html';\n }\n if (fileName.toLowerCase().match(/\\.(txt|log|json|xml|css|js|ts)$/) || content?.type === 'text') {\n console.log('检测到文本文件');\n return 'text';\n }\n\n console.log('未识别的文件类型,返回 unknown');\n return 'unknown';\n};\n\n/**\n * 渲染PDF内容\n */\nconst renderPdfContent = (\n data: any,\n props: FviewerProps,\n isSlidesMode: boolean = false,\n setScale: ((scale: number) => void) | undefined = undefined\n) => {\n console.log(\n '计算下,renderPdfContent:',\n 'pdfStartPage:' + data.pdfStartPage,\n 'currentPage:' + props.currentPage\n );\n console.log('=== renderPdfContent 开始 ===');\n console.log('PDF数据:', data);\n console.log('PDF文档:', data.content?.document);\n console.log('PDF文档类型:', typeof data.content?.document);\n console.log('PDF文档是否为null:', data.content?.document === null);\n console.log('PDF文档是否为undefined:', data.content?.document === undefined);\n console.log(\n 'PDF文档方法:',\n data.content?.document\n ? Object.getOwnPropertyNames(Object.getPrototypeOf(data.content.document))\n : '无文档'\n );\n console.log(\n 'PDF文档属性:',\n data.content?.document ? Object.keys(data.content.document) : '无文档'\n );\n\n // 计算PDF文档的起始页码(用于分页PDF)\n const pdfStartPage = data.pdfStartPage || 1;\n console.log('PDF起始页:', pdfStartPage);\n\n // 过滤出PDF标注数据\n const pdfAnnotations = (props.annotationData || []).filter(\n anno => 'pageNumber' in anno && 'x' in anno && 'y' in anno\n ) as Annotation[];\n\n console.log('=== PDF标注数据 ===');\n console.log('原始annotationData:', props.annotationData);\n console.log('过滤后的pdfAnnotations:', pdfAnnotations);\n\n // 根据文件类型设置默认缩放值\n const defaultScale = isSlidesMode ? 0.82 : 1;\n\n // 优先使用initialZoom,然后是scale,最后是默认值\n const finalScale = props.initialZoom || props.scale || defaultScale;\n\n return (\n <PdfRender\n pdfDocument={data.content?.document || null}\n currentPage={props.currentPage || 1}\n pdfStartPage={pdfStartPage}\n scale={finalScale} // 使用计算后的最终缩放值\n setScale={setScale}\n annotations={pdfAnnotations}\n isAnnotating={false} // PDF模式关闭标注功能\n isSlidesMode={isSlidesMode}\n onPageChange={\n props.eventsEmit\n ? (pageNumber: number) => props.eventsEmit?.('pageChange', { pageNumber })\n : undefined\n }\n onScaleChange={\n props.eventsEmit\n ? (scale: number) => props.eventsEmit?.('scaleChange', { scale })\n : undefined\n }\n onAnnotationChange={\n props.eventsEmit\n ? (annotation: Annotation) => props.eventsEmit?.('annotationChange', { annotation })\n : undefined\n }\n onAnnotationDelete={\n props.eventsEmit\n ? (annotationId: string) => props.eventsEmit?.('annotationDelete', { annotationId })\n : undefined\n }\n styles={props.styles}\n />\n );\n};\n\n/**\n * 渲染图片内容\n */\nconst renderImageContent = (data: any, props: FviewerProps) => {\n console.log('=== Fviewer renderImageContent ===');\n console.log('data:', data);\n console.log('data.content:', data.content);\n console.log('data.content?.url:', data.content?.url);\n console.log('rotation:', props.rotation);\n\n const imageUrl = data.content?.url || data.content;\n const [imageLoading, setImageLoading] = useState(true);\n const [imageError, setImageError] = useState(false);\n\n const handleImageLoad = () => {\n console.log('图片加载完成:', imageUrl);\n setImageLoading(false);\n setImageError(false);\n };\n\n const handleImageError = () => {\n console.error('图片加载失败:', imageUrl);\n setImageLoading(false);\n setImageError(true);\n };\n\n return (\n <div\n style={{\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n height: '100%',\n padding: '20px',\n overflow: 'auto',\n position: 'relative',\n backgroundColor: '#272727', // 图片模式深色背景\n }}\n >\n {imageLoading && (\n <div\n style={{\n position: 'absolute',\n top: '50%',\n left: '50%',\n transform: 'translate(-50%, -50%)',\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n gap: '12px',\n zIndex: 1,\n }}\n >\n <div\n style={{\n width: '32px',\n height: '32px',\n border: `3px solid ${props.styles?.theme?.colors?.border || '#dee2e6'}`,\n borderTop: `3px solid ${props.styles?.theme?.colors?.primary || '#007bff'}`,\n borderRadius: '50%',\n animation: 'spin 1s linear infinite',\n }}\n />\n <div\n style={{\n fontSize: '12px',\n color: props.styles?.theme?.colors?.text || '#343a40',\n }}\n >\n 图片加载中...\n </div>\n </div>\n )}\n\n {imageError && (\n <div\n style={{\n position: 'absolute',\n top: '50%',\n left: '50%',\n transform: 'translate(-50%, -50%)',\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n gap: '8px',\n zIndex: 1,\n }}\n >\n <div\n style={{\n fontSize: '14px',\n color: props.styles?.theme?.colors?.error || '#dc3545',\n }}\n >\n 图片加载失败\n </div>\n </div>\n )}\n\n <img\n src={imageUrl}\n alt={data.fileName || '图片'}\n onLoad={handleImageLoad}\n onError={handleImageError}\n style={{\n maxWidth: '100%',\n maxHeight: '100%',\n objectFit: 'contain',\n transform: `scale(${props.scale || 1}) rotate(${props.rotation || 0}deg)`,\n opacity: imageLoading ? 0 : 1,\n transition: 'opacity 0.3s ease-in-out, transform 0.2s ease-in-out',\n }}\n />\n\n <style>{`\n @keyframes spin {\n 0% { transform: rotate(0deg); }\n 100% { transform: rotate(360deg); }\n }\n `}</style>\n </div>\n );\n};\n\n/**\n * 渲染文本内容\n */\nconst renderTextContent = (data: any, props: FviewerProps) => {\n console.log('=== Fviewer renderTextContent ===');\n console.log('data:', data);\n console.log('data.content:', data.content);\n\n // 获取实际的文本内容 - 兼容多种数据结构\n let textContent = '';\n if (typeof data.content === 'string') {\n textContent = data.content;\n } else if (data.content?.text) {\n // 线上环境:{ type: 'text', text: '...' }\n textContent = data.content.text;\n } else if (data.content?.content) {\n // 本地环境:{ content: '...' }\n textContent = data.content.content;\n }\n console.log('实际文本内容:', textContent);\n\n // 使用 ref 来动态调整纸张高度\n const textRef = useRef<HTMLDivElement>(null);\n const paperRef = useRef<HTMLDivElement>(null);\n\n // 动态调整纸张高度的 useEffect\n useEffect(() => {\n if (textRef.current && paperRef.current && textContent) {\n // 延迟执行,确保内容完全渲染\n const timer = setTimeout(() => {\n const textHeight = textRef.current?.scrollHeight || 0;\n const minHeight = Math.max(textHeight + 80, 200); // 至少200px高度,加上padding\n\n if (paperRef.current) {\n paperRef.current.style.minHeight = `${minHeight}px`;\n console.log('文本纸张高度调整完成:', minHeight);\n }\n }, 100);\n\n return () => clearTimeout(timer);\n }\n }, [textContent]);\n\n return (\n <div\n style={{\n height: '100%',\n overflow: 'auto',\n backgroundColor: '#f5f5f5', // 纸张背景色\n padding: '20px',\n display: 'flex',\n justifyContent: 'center',\n position: 'relative',\n }}\n >\n {/* 纸张容器 */}\n <div\n ref={paperRef}\n style={{\n width: '100%',\n maxWidth: '800px',\n backgroundColor: 'white',\n boxShadow: '0 4px 8px rgba(0, 0, 0, 0.1), 0 2px 4px rgba(0, 0, 0, 0.06)',\n borderRadius: '8px',\n padding: '40px',\n margin: '20px 0',\n position: 'relative',\n transform: `scale(${props.scale || 1})`,\n transition: 'transform 0.2s ease-in-out',\n transformOrigin: 'top center',\n }}\n >\n {/* 使用 rtext 组件渲染文本内容 */}\n <div\n ref={textRef}\n style={{\n width: '100%',\n overflow: 'visible',\n }}\n >\n <Markdownit\n dataSource={{\n type: DataType.TEXT,\n content: textContent,\n }}\n size=\"md\"\n theme={{\n primaryColor: props.styles?.theme?.colors?.primary || '#007bff',\n backgroundColor: 'transparent',\n textColor: '#333',\n borderColor: 'transparent',\n borderRadius: '0',\n padding: '0',\n }}\n style={{\n border: 'none',\n background: 'transparent',\n width: '100%',\n height: 'auto',\n overflow: 'visible',\n whiteSpace: 'pre-line',\n }}\n />\n </div>\n\n {/* 简约的顶部装饰效果 */}\n <div\n style={{\n position: 'absolute',\n top: '0',\n left: '0',\n right: '0',\n height: '2px',\n background: 'linear-gradient(90deg, #e0e0e0 0%, #f0f0f0 50%, #e0e0e0 100%)',\n borderTopLeftRadius: '8px',\n borderTopRightRadius: '8px',\n }}\n />\n </div>\n </div>\n );\n};\n\n/**\n * 渲染Markdown内容\n */\n// 将 Markdown 渲染逻辑提取为真正的 React 子组件,避免在渲染过程中条件执行 Hook\nconst MarkdownContentView: React.FC<{\n data: any;\n parentProps: FviewerProps;\n isTableMode?: boolean;\n}> = ({ data, parentProps, isTableMode = false }) => {\n const markdownRef = useRef<HTMLDivElement>(null);\n const annotationTimeoutRef = useRef<number | null>(null);\n const tableObserverRef = useRef<MutationObserver | null>(null);\n const tableReapplyInProgressRef = useRef<boolean>(false);\n const lastMutationTsRef = useRef<number>(0);\n const idleDisconnectTimerRef = useRef<number | null>(null);\n const [isAnnotating] = useState(false);\n\n const handleScroll = (scrollTop: number, scrollHeight: number) => {\n console.log('=== Markdownit滚动事件触发 ===');\n console.log('滚动位置:', { scrollTop, scrollHeight });\n\n if (parentProps.eventsEmit) {\n // 直接传递滚动信息给业务层,让业务层决定如何处理\n parentProps.eventsEmit('markdown_scroll', { scrollTop, scrollHeight });\n }\n };\n\n const handleScrollToTop = () => {\n console.log('=== Markdownit滚动到顶部 ===');\n if (parentProps.eventsEmit) {\n parentProps.eventsEmit('markdown_scroll_to_top');\n }\n };\n\n const handleScrollToBottom = () => {\n console.log('=== Markdownit滚动到底部 ===');\n if (parentProps.eventsEmit) {\n parentProps.eventsEmit('markdown_scroll_to_bottom');\n }\n };\n\n // Markdownit 渲染完成回调:仅在表格模式下一次性应用表格标注\n const handleMarkdownRenderedRef = useRef<(root: HTMLElement) => void>();\n handleMarkdownRenderedRef.current = (root: HTMLElement) => {\n try {\n if (!isTableMode) return;\n const content = typeof data.content === 'string' ? data.content : data.content?.content || '';\n if (!content || tableAnnotations.length === 0) return;\n const annoSig = JSON.stringify(tableAnnotations.map(a => ({ o: a.offsets, c: a.color })));\n const runtimeSig = `${content.length}:${content.substring(0, 64)}:${content.substring(content.length - 64)}|${annoSig}`;\n const prevSig = (root as any).dataset?.tableAnnoRuntimeSig;\n if (prevSig === runtimeSig) return;\n setTimeout(() => {\n applyTableAnnotations();\n if ((root as any).dataset) {\n (root as any).dataset.tableAnnoRuntimeSig = runtimeSig;\n }\n }, 50);\n } catch (e) {\n console.warn('[MarkdownRendered] apply failed', e);\n }\n };\n const handleMarkdownRendered = React.useCallback(\n (root: HTMLElement) => handleMarkdownRenderedRef.current?.(root),\n []\n );\n\n // 处理文本选择和高亮\n const handleTextSelection = useCallback(() => {\n if (!isAnnotating || !markdownRef.current) return;\n\n const selection = window.getSelection();\n if (!selection || selection.isCollapsed) return;\n\n const range = selection.getRangeAt(0);\n const text = range.toString().trim();\n if (!text) return;\n\n // 计算选中文本的绝对位置\n const container = markdownRef.current;\n let charCount = 0;\n let startOffset = 0;\n\n const walker = document.createTreeWalker(container, NodeFilter.SHOW_TEXT, {\n acceptNode: node => {\n // 跳过代码块内的文本\n if (node.parentElement?.closest('pre')) {\n return NodeFilter.FILTER_REJECT;\n }\n return NodeFilter.FILTER_ACCEPT;\n },\n });\n\n let node: Node | null = walker.nextNode();\n while (node) {\n if (node === range.startContainer) {\n startOffset = charCount + range.startOffset;\n break;\n }\n charCount += node.textContent?.length || 0;\n node = walker.nextNode();\n }\n\n console.log('选中文本信息:', {\n text,\n startOffset,\n charCount,\n container: range.startContainer.textContent,\n });\n\n const newAnnotation: MDAnnotation = {\n id: `md-anno-${Date.now()}`,\n start: startOffset,\n end: startOffset + text.length,\n color: '#FFE599',\n };\n\n console.log('创建新标注:', newAnnotation);\n if (parentProps.eventsEmit) {\n parentProps.eventsEmit('md_annotation_add', newAnnotation);\n }\n selection.removeAllRanges();\n }, [isAnnotating, parentProps.eventsEmit]);\n\n // 根据模式过滤标注数据\n const mdAnnotations = isTableMode\n ? [] // markdown_table模式不使用MDAnnotation\n : ((parentProps.annotationData || []).filter(\n anno => 'start' in anno && 'end' in anno && !('pageNumber' in anno)\n ) as MDAnnotation[]);\n\n // 过滤出Table标注数据\n const tableAnnotations = isTableMode\n ? ((parentProps.annotationData || []).filter(\n anno => 'offsets' in anno && Array.isArray(anno.offsets)\n ) as TableAnnotation[])\n : [];\n\n /**\n * 清空所有标注的函数\n * 移除所有标注元素,恢复原始文本和样式\n */\n const clearAllAnnotations = useCallback(() => {\n console.log('=== 开始清空所有标注 ===');\n\n if (!markdownRef.current) {\n console.log('markdownRef不存在,无法清空标注');\n return;\n }\n\n // 清空Markdown标注\n const existingMdAnnotations = markdownRef.current.querySelectorAll('.md-annotation');\n console.log('清空Markdown标注数量:', existingMdAnnotations.length);\n\n if (existingMdAnnotations.length > 0) {\n existingMdAnnotations.forEach(el => {\n const parent = el.parentNode;\n if (parent) {\n // 将标注元素替换为原始文本\n parent.replaceChild(document.createTextNode(el.textContent || ''), el);\n }\n });\n }\n\n // 不再清空表格背景色,避免已应用的表格高亮被重置\n\n console.log('所有标注已清空');\n }, []);\n\n // 清空表格标注的函数\n const clearTableAnnotations = useCallback(() => {\n if (!markdownRef.current) return;\n\n const tables = markdownRef.current.querySelectorAll('table');\n tables.forEach(table => {\n const allRows = Array.from(table.rows);\n allRows.forEach(row => {\n Array.from(row.cells).forEach(cell => {\n if (cell.getAttribute('data-table-annotated') === '1') {\n cell.style.removeProperty('background');\n cell.style.removeProperty('background-color');\n cell.removeAttribute('data-table-annotated');\n cell.removeAttribute('title');\n }\n });\n });\n });\n console.log('已清空所有表格标注');\n }, []);\n\n // 应用表格标注的函数\n const applyTableAnnotations = useCallback(() => {\n console.log('=== 开始应用表格标注 ===');\n console.log('tableAnnotations:', tableAnnotations);\n\n if (!markdownRef.current) {\n console.log('markdownRef不存在,退出');\n return;\n }\n\n // 先清空所有旧的表格标注\n clearTableAnnotations();\n\n if (!tableAnnotations.length) {\n console.log('没有表格标注数据,仅清空旧标注');\n return;\n }\n\n // 查找所有表格\n const tables = markdownRef.current.querySelectorAll('table');\n console.log('找到表格数量:', tables.length);\n if (tables.length === 0) {\n console.log('没有找到表格元素');\n return;\n }\n\n tableReapplyInProgressRef.current = true;\n tableAnnotations.forEach((annotation, i: number) => {\n const offsets = annotation.offsets;\n console.log('处理表格标注:', annotation);\n\n // 只判断 offsets 是否为 [ [number, number], ... ]\n if (\n !Array.isArray(offsets) ||\n !offsets.length ||\n !Array.isArray(offsets[0]) ||\n offsets[0].length !== 2\n ) {\n console.warn('[TableAnnotation] annotation.offsets is not valid', annotation);\n return;\n }\n\n offsets.forEach((offset: [number, number], index: number) => {\n const [row, col] = offset;\n if (typeof row !== 'number' || typeof col !== 'number') {\n console.warn('[TableAnnotation] offset is not [number, number]', offset);\n return;\n }\n\n // 遍历所有表格,找到对应的单元格\n tables.forEach((table, tableIndex) => {\n // 从表头开始计算,row=0 指向表头第一行\n const allRows = Array.from(table.rows);\n const rowEl = allRows[row];\n if (!rowEl) {\n console.warn('[TableAnnotation] row out of range', {\n row,\n tableIndex,\n totalRows: allRows.length,\n });\n return;\n }\n\n const cell = rowEl.cells?.[col] as HTMLTableCellElement | undefined;\n if (!cell) {\n console.warn('[TableAnnotation] cell is undefined', { row, col, tableIndex });\n return;\n }\n\n const targetColor = annotation.color || 'rgba(255, 229, 153, 0.5)';\n const computedBg = getComputedStyle(cell).backgroundColor;\n const alreadyAnnotated =\n cell.getAttribute('data-table-annotated') === '1' &&\n (computedBg === targetColor || cell.style.backgroundColor === targetColor);\n if (!alreadyAnnotated) {\n cell.style.setProperty('background', targetColor, 'important');\n cell.style.setProperty('background-color', targetColor, 'important');\n cell.setAttribute('data-table-annotated', '1');\n }\n if (annotation.content) cell.title = annotation.content;\n\n if (index === 0 && i === 0) {\n setTimeout(() => {\n cell.scrollIntoView({ behavior: 'smooth', block: 'start' });\n }, 300);\n }\n });\n });\n });\n\n requestAnimationFrame(() => {\n tableReapplyInProgressRef.current = false;\n });\n }, [tableAnnotations, clearTableAnnotations]);\n\n // 应用Markdown标注的函数\n const applyMarkdownAnnotations = useCallback(() => {\n console.log('=== 开始应用Markdown标注 ===');\n\n if (!markdownRef.current || !mdAnnotations.length) {\n console.log('条件不满足,跳过标注应用');\n return;\n }\n\n // 清除之前的定时器,避免重复应用\n if (annotationTimeoutRef.current) {\n clearTimeout(annotationTimeoutRef.current);\n }\n\n // 直接应用标注,不使用MutationObserver避免时序问题\n const applyMarkdownAnnotationsInner = () => {\n console.log('开始应用标注...');\n\n // 移除现有标注\n const existingAnnotations = markdownRef.current?.querySelectorAll('.md-annotation');\n console.log('移除现有标注数量:', existingAnnotations?.length || 0);\n existingAnnotations?.forEach(el => {\n const parent = el.parentNode;\n if (parent) {\n parent.replaceChild(document.createTextNode(el.textContent || ''), el);\n }\n });\n\n // 获取所有文本节点\n const walker = document.createTreeWalker(markdownRef.current!, NodeFilter.SHOW_TEXT, {\n acceptNode: node => {\n // 跳过代码块内的文本\n if (node.parentElement?.closest('pre')) {\n return NodeFilter.FILTER_REJECT;\n }\n return NodeFilter.FILTER_ACCEPT;\n },\n });\n\n const textNodes: Text[] = [];\n let node: Text | null;\n while ((node = walker.nextNode() as Text)) {\n textNodes.push(node);\n }\n\n console.log('找到文本节点数量:', textNodes.length);\n\n if (textNodes.length === 0) {\n console.log('没有找到文本节点,延迟重试...');\n // 延迟重试,确保DOM完全渲染\n annotationTimeoutRef.current = setTimeout(() => {\n applyMarkdownAnnotationsInner();\n }, 200);\n return;\n }\n\n // 计算每个文本节点的起始位置\n let totalLength = 0;\n const nodePositions = textNodes.map(node => {\n const start = totalLength;\n totalLength += node.textContent?.length || 0;\n return {\n node,\n start,\n end: totalLength,\n text: node.textContent,\n };\n });\n\n console.log('文本节点位置:', nodePositions);\n console.log('总文本长度:', totalLength);\n\n // 应用标注\n const sortedAnnotations = [...mdAnnotations].sort((a, b) => b.start - a.start);\n console.log('排序后的标注:', sortedAnnotations);\n\n sortedAnnotations.forEach(annotation => {\n const { start, end, color } = annotation;\n console.log('处理标注:', { annotation, nodePositions });\n\n // 找到相关的文本节点\n const relevantNodes = nodePositions.filter(pos => start < pos.end && end > pos.start);\n\n console.log('相关节点数量:', relevantNodes.length);\n\n relevantNodes.forEach(({ node, start: nodeStart }) => {\n const localStart = Math.max(0, start - nodeStart);\n const localEnd = Math.min(node.textContent?.length || 0, end - nodeStart);\n\n console.log('本地位置:', {\n localStart,\n localEnd,\n nodeTextLength: node.textContent?.length,\n });\n\n if (localStart >= localEnd) {\n console.log('本地位置无效,跳过');\n return;\n }\n\n const before = node.textContent?.slice(0, localStart) || '';\n const annotatedText = node.textContent?.slice(localStart, localEnd) || '';\n const after = node.textContent?.slice(localEnd) || '';\n\n console.log('分割文本:', { before, annotatedText, after });\n\n const span = document.createElement('span');\n span.className = 'md-annotation';\n span.style.backgroundColor = color || '#FFE599';\n span.textContent = annotatedText;\n\n const fragment = document.createDocumentFragment();\n if (before) fragment.appendChild(document.createTextNode(before));\n fragment.appendChild(span);\n if (after) fragment.appendChild(document.createTextNode(after));\n\n node.parentNode?.replaceChild(fragment, node);\n console.log('成功应用标注:', annotatedText);\n });\n });\n };\n\n // 延迟应用标注,确保DOM完全渲染\n annotationTimeoutRef.current = setTimeout(() => {\n applyMarkdownAnnotationsInner();\n }, 100);\n }, [mdAnnotations]);\n\n // 应用标注高亮(表格模式改由 onRendered 触发,这里跳过)\n useEffect(() => {\n if (isTableMode) {\n console.log('[MarkdownContentView] table mode: skip effect, wait for onRendered');\n return;\n }\n // 获取实际的内容字符串\n const content = typeof data.content === 'string' ? data.content : data.content?.content || '';\n\n if (!content || typeof content !== 'string') {\n console.log('Markdown内容不是字符串类型,跳过标注应用');\n return;\n }\n\n console.log('=== 开始应用Markdown标注高亮 ===');\n console.log('markdownRef.current:', markdownRef.current);\n console.log('isTableMode:', isTableMode);\n console.log('mdAnnotations:', mdAnnotations);\n console.log('tableAnnotations:', tableAnnotations);\n console.log('data.content:', data.content);\n console.log('实际内容:', content);\n\n if (!markdownRef.current) {\n console.log('markdownRef不存在,退出标注应用');\n return;\n }\n\n // 表格模式不清空,避免已应用高亮被抹掉\n if (!isTableMode) {\n clearAllAnnotations();\n }\n\n // 表格模式下不从 effect 触发,交由 onRendered\n\n // 如果是普通markdown模式且有markdown标注,应用markdown标注\n if (!isTableMode && mdAnnotations.length > 0) {\n applyMarkdownAnnotations();\n return;\n }\n\n console.log('没有需要应用的标注');\n }, [isTableMode, tableAnnotations, mdAnnotations]);\n\n // 监听文本选择事件\n useEffect(() => {\n // 只在非表格模式下启用文本选择标注\n if (!isTableMode) {\n document.addEventListener('mouseup', handleTextSelection);\n return () => {\n document.removeEventListener('mouseup', handleTextSelection);\n };\n }\n }, [handleTextSelection, isTableMode]);\n\n // 调试:打印markdown内容信息\n useEffect(() => {\n // 获取实际的内容字符串\n const content = typeof data.content === 'string' ? data.content : data.content?.content || '';\n\n if (!content || typeof content !== 'string') {\n console.log('Markdown内容不是字符串类型,跳过调试信息打印');\n return;\n }\n\n console.log('=== Markdown内容信息 ===');\n console.log('isTableMode:', isTableMode);\n console.log('内容长度:', content.length || 0);\n\n // 安全检查:确保content是字符串类型才调用substring方法\n if (typeof content === 'string') {\n console.log('内容前100字符:', content.substring(0, 100));\n console.log('内容后100字符:', content.substring(content.length - 100));\n } else {\n console.log('内容不是字符串类型:', typeof content);\n console.log('内容值:', content);\n }\n\n console.log('标注数据:', mdAnnotations);\n console.log('表格标注数据:', tableAnnotations);\n }, [mdAnnotations, tableAnnotations, isTableMode]);\n\n // 监听内容变化,在表格模式下调整表格尺寸\n useEffect(() => {\n if (isTableMode && markdownRef.current) {\n // 延迟执行,确保Markdownit完全渲染完成\n const timer = setTimeout(() => {\n const tables = markdownRef.current?.querySelectorAll('table');\n if (tables && tables.length > 0) {\n console.log('调整表格尺寸,找到表格数量:', tables.length);\n\n tables.forEach((table, index) => {\n if (table instanceof HTMLTableElement) {\n // 确保表格有足够的宽度来显示内容\n table.style.width = '100%';\n table.style.minWidth = '100%';\n table.style.tableLayout = 'auto';\n\n // 调整表格容器\n const container = table.closest('.markdown-table-mode');\n if (container && container instanceof HTMLElement) {\n container.style.width = '100%';\n container.style.overflowX = 'auto';\n }\n\n console.log(`表格 ${index + 1} 尺寸调整完成`);\n }\n });\n }\n }, 500); // 延迟500ms确保渲染完成\n\n return () => clearTimeout(timer);\n }\n }, [isTableMode, data.content]);\n\n // 清理定时器与观察器\n useEffect(() => {\n return () => {\n if (annotationTimeoutRef.current) {\n clearTimeout(annotationTimeoutRef.current);\n }\n if (tableObserverRef.current) {\n tableObserverRef.current.disconnect();\n tableObserverRef.current = null;\n }\n };\n }, []);\n\n return (\n <div\n style={{\n height: '100%',\n width: '100%',\n overflow: 'auto', // 改为auto,允许滚动条显示\n }}\n className={`markdown-container markdown-scrollbar ${isTableMode ? 'markdown-table-mode' : ''}`}\n >\n <style>{markdownAnnotationStyles}</style>\n <div ref={markdownRef}>\n <Markdownit\n dataSource={{\n type: DataType.MARKDOWN,\n content: (() => {\n // 兼容多种数据结构\n if (typeof data.content === 'string') {\n return data.content;\n } else if (data.content?.text) {\n // 线上环境:{ type: 'markdown', text: '...' }\n return data.content.text;\n } else if (data.content?.content) {\n // 本地环境:{ content: '...' }\n return data.content.content;\n }\n return '';\n })(),\n }}\n size=\"md\"\n onScroll={!isTableMode ? handleScroll : undefined}\n onScrollToTop={!isTableMode ? handleScrollToTop : undefined}\n onScrollToBottom={!isTableMode ? handleScrollToBottom : undefined}\n onRendered={handleMarkdownRendered}\n theme={{\n primaryColor: parentProps.styles?.theme?.colors?.primary || '#007bff',\n backgroundColor: parentProps.styles?.theme?.colors?.background || '#f8f9fa',\n textColor: parentProps.styles?.theme?.colors?.text || '#343a40',\n borderColor: parentProps.styles?.theme?.colors?.border || '#dee2e6',\n borderRadius: isTableMode ? '0px' : '8px',\n padding: isTableMode ? '0px' : '20px',\n }}\n style={{\n height: '100%',\n border: 'none',\n background: 'transparent',\n overflowY: isTableMode ? 'visible' : 'scroll',\n }}\n />\n </div>\n </div>\n );\n};\n\n/**\n * 极简 markdown_table 渲染组件(绕过 Markdownit)\n * - 仅支持管道表语法,渲染单个 <table>\n * - 不引入内部状态与滚动回调\n */\nconst MinimalMarkdownTable: React.FC<{\n markdown: string;\n onRendered?: () => void;\n tableAnnotations?: TableAnnotation[];\n}> = ({ markdown, onRendered, tableAnnotations = [] }) => {\n const rootRef = useRef<HTMLDivElement>(null);\n\n // 解析简单管道表\n const parseTable = (md: string): { headers: string[]; rows: string[][] } | null => {\n const lines = md.split(/\\r?\\n/).filter(l => l.trim().length > 0);\n // 找首个表头行和分隔行\n let headerLineIdx = -1;\n for (let i = 0; i < lines.length - 1; i++) {\n const a = lines[i].trim();\n const b = lines[i + 1].trim();\n if (a.startsWith('|') && a.endsWith('|') && b.replace(/\\s|:|\\|/g, '').match(/^[-]+$/)) {\n headerLineIdx = i;\n break;\n }\n }\n if (headerLineIdx === -1) return null;\n const headerLine = lines[headerLineIdx];\n const header = headerLine\n .split('|')\n .slice(1, -1)\n .map(s => s.trim());\n const bodyLines = [] as string[];\n for (let i = headerLineIdx + 2; i < lines.length; i++) {\n const l = lines[i].trim();\n if (!l.startsWith('|') || !l.endsWith('|')) break;\n bodyLines.push(l);\n }\n const rows = bodyLines.map(l =>\n l\n .split('|')\n .slice(1, -1)\n .map(s => s.trim())\n );\n return { headers: header, rows };\n };\n\n const table = React.useMemo(() => parseTable(markdown), [markdown]);\n\n // 渲染完成后应用表格标注(仅 DOM 操作,无 setState)\n useEffect(() => {\n const apply = () => {\n try {\n if (!rootRef.current) return;\n\n // 先清空所有旧的表格标注\n const tables = rootRef.current.querySelectorAll('table');\n tables.forEach(table => {\n const allRows = Array.from(table.rows);\n allRows.forEach(row => {\n Array.from(row.cells).forEach(cell => {\n if (cell.getAttribute('data-table-annotated') === '1') {\n cell.style.removeProperty('background');\n cell.style.removeProperty('background-color');\n cell.removeAttribute('data-table-annotated');\n cell.removeAttribute('title');\n }\n });\n });\n });\n\n if (!tableAnnotations.length) return;\n if (!tables || tables.length === 0) return;\n tableAnnotations.forEach((annotation, i) => {\n const offsets = annotation.offsets || [];\n offsets.forEach((offset, idx) => {\n const [row, col] = offset as [number, number];\n tables.forEach(tableEl => {\n // 从表头开始计算,row=0 指向表头第一行\n const allRows = Array.from(tableEl.rows);\n const rowEl = allRows[row] as HTMLTableRowElement | undefined;\n if (!rowEl) return;\n const cell = rowEl.cells?.[col] as HTMLTableCellElement | undefined;\n if (!cell) return;\n const color = annotation.color || 'rgba(255, 229, 153, 0.5)';\n const already = cell.getAttribute('data-table-annotated') === '1';\n if (!already) {\n cell.style.setProperty('background', color, 'important');\n cell.style.setProperty('background-color', color, 'important');\n cell.setAttribute('data-table-annotated', '1');\n if (annotation.content) cell.title = annotation.content;\n }\n if (i === 0 && idx === 0) {\n setTimeout(() => cell.scrollIntoView({ behavior: 'smooth', block: 'start' }), 50);\n }\n });\n });\n });\n } catch (e) {\n console.warn('[MinimalMarkdownTable] apply annotations failed', e);\n }\n };\n\n const id = requestAnimationFrame(() => {\n apply();\n onRendered && onRendered();\n });\n return () => cancelAnimationFrame(id);\n }, [markdown, tableAnnotations, onRendered]);\n\n if (!table) {\n return (\n <div ref={rootRef} style={{ padding: '8px' }}>\n 无法解析为表格\n </div>\n );\n }\n\n const scopedStyles = `\n .z-mdtbl-wrapper { overflow: auto; position: relative; }\n .z-mdtbl { border-collapse: separate; border-spacing: 0; background: transparent; box-shadow: 0 1px 3px rgba(16,24,40,.08), 0 1px 2px rgba(16,24,40,.06); border-radius: 8px; }\n .z-mdtbl th, .z-mdtbl td { border: 1px solid #e5e7eb; padding: 10px 14px; font-size: 13px; line-height: 1.4; color: inherit; }\n .z-mdtbl th { background: transparent; font-weight: 600; color: inherit; }\n .z-mdtbl tbody tr:nth-child(odd) { background: transparent; }\n .z-mdtbl tbody tr:hover { background: transparent; }\n .z-mdtbl td, .z-mdtbl th { white-space: nowrap; }\n .z-mdtbl thead tr:first-child th:first-child { border-top-left-radius: 8px; }\n .z-mdtbl thead tr:first-child th:last-child { border-top-right-radius: 8px; }\n .z-mdtbl tbody tr:last-child td:first-child { border-bottom-left-radius: 8px; }\n .z-mdtbl tbody tr:last-child td:last-child { border-bottom-right-radius: 8px; }\n `;\n\n return (\n <div ref={rootRef} className=\"markdown-table-mode z-mdtbl-wrapper\">\n <style>{scopedStyles}</style>\n <table className=\"z-mdtbl\">\n <thead>\n <tr>\n {table.headers.map((h, i) => (\n <th key={i}>{h}</th>\n ))}\n </tr>\n </thead>\n <tbody>\n {table.rows.map((r, ri) => (\n <tr key={ri}>\n {r.map((c, ci) => (\n <td key={ci}>{c}</td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n );\n};\n\n/**\n * 渲染HTML内容\n */\nconst renderHtmlContent = (data: any, _props: FviewerProps) => {\n console.log('=== Fviewer renderHtmlContent ===');\n console.log('data:', data);\n console.log('data.content:', data.content);\n\n // 获取实际的HTML内容 - 兼容多种数据结构\n let htmlContent = '';\n if (typeof data.content === 'string') {\n htmlContent = data.content;\n } else if (data.content?.text) {\n // 线上环境:{ type: 'html', text: '...' }\n htmlContent = data.content.text;\n } else if (data.content?.content) {\n // 本地环境:{ content: '...' }\n htmlContent = data.content.content;\n }\n console.log('最终传递给 iframe 的 content:', htmlContent);\n\n return (\n <div\n style={{\n height: '100%',\n overflow: 'auto',\n position: 'relative',\n }}\n >\n <iframe\n srcDoc={htmlContent}\n style={{\n width: '100%',\n height: '100%',\n border: 'none',\n background: 'white',\n }}\n title=\"HTML Preview\"\n sandbox=\"allow-same-origin allow-scripts\"\n />\n </div>\n );\n};\n\n/**\n * 渲染未知类型内容\n */\nconst renderUnknownContent = (data: any, _props: FviewerProps) => {\n return (\n <div\n style={{\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n height: '100%',\n color: '#666',\n }}\n >\n <div>\n <div>不支持的文件类型</div>\n <div style={{ fontSize: '12px', marginTop: '8px' }}>{data.fileName || '未知文件'}</div>\n </div>\n </div>\n );\n};\n\n/**\n * Fviewer核心组件\n * 负责文件类型检测、内容渲染和状态管理\n *\n * @param props - 组件属性\n * @returns Fviewer组件\n */\nconst Fviewer: React.FC<FviewerProps> = ({\n data,\n annotationData = [],\n totalPage = 0,\n currentPage = 1,\n setScale,\n scale: userScale, // 重命名避免冲突\n rotation = 0, // 添加rotation参数\n eventsEmit,\n styles,\n tools = {\n annotation: true,\n download: true,\n zoom: true,\n close: true,\n navigation: true,\n },\n customComponents,\n className,\n contentClass,\n}) => {\n // 使用主题\n const mergedTheme = styles?.theme || defaultTheme;\n\n // 状态管理\n const [isLoading, setIsLoading] = useState(false);\n const [loadingStatus] = useState<string>('内容加载中...');\n const [error, setError] = useState<string | null>(null);\n\n console.log('=== Fviewer 接收数据 ===');\n console.log('Fviewer data:', data);\n console.log('Fviewer data.content:', data?.content);\n console.log('Fviewer data.content.document:', data?.content?.document);\n console.log('Fviewer data.content.document类型:', typeof data?.content?.document);\n console.log('Fviewer data.content.document是否为null:', data?.content?.document === null);\n console.log(\n 'Fviewer data.content.document是否为undefined:',\n data?.content?.document === undefined\n );\n console.log('Fviewer currentPage:', currentPage);\n console.log('Fviewer scale:', userScale);\n\n // 调试:跟踪 data 引用变化导致的 effect 触发\n const prevDataRef = useRef<any>(null);\n const prevContentRef = useRef<any>(null);\n const renderCountRef = useRef<number>(0);\n renderCountRef.current += 1;\n console.log('[Fviewer] render count:', renderCountRef.current);\n\n // 检测文件类型\n const fileType = detectFileType(data);\n console.log('=== Fviewer 组件 ===');\n console.log('检测到的文件类型:', fileType);\n console.log('完整数据:', data);\n\n // 根据文件类型渲染内容\n const renderContent = () => {\n console.log('开始渲染内容,文件类型:', fileType);\n\n switch (fileType) {\n case 'pdf':\n case 'pdf_slides':\n console.log(\n '计算下,渲染PDF内容:',\n fileType,\n 'pdfStartPage:' + data.pdfStartPage,\n 'currentPage:' + currentPage\n );\n return renderPdfContent(\n data,\n {\n data,\n annotationData,\n totalPage,\n currentPage,\n scale: userScale,\n eventsEmit,\n styles,\n tools,\n className,\n contentClass,\n },\n fileType === 'pdf_slides',\n setScale\n );\n case 'image':\n console.log('渲染图片内容');\n return renderImageContent(data, {\n data,\n annotationData,\n scale: userScale,\n rotation,\n eventsEmit,\n styles,\n tools,\n className,\n contentClass,\n });\n case 'text':\n console.log('渲染文本内容');\n return renderTextContent(data, {\n data,\n annotationData,\n scale: userScale,\n eventsEmit,\n styles,\n tools,\n className,\n contentClass,\n });\n case 'markdown':\n case 'markdown_table':\n console.log('渲染Markdown内容:', fileType);\n if (fileType === 'markdown_table') {\n const md = typeof data.content === 'string' ? data.content : data.content?.content || '';\n const tableAnnotations = (annotationData || []).filter(\n anno => 'offsets' in anno && Array.isArray((anno as any).offsets)\n ) as TableAnnotation[];\n return <MinimalMarkdownTable markdown={md} tableAnnotations={tableAnnotations} />;\n }\n return (\n <MarkdownContentView\n data={data}\n parentProps={{\n data,\n annotationData,\n eventsEmit,\n styles,\n tools,\n className,\n contentClass,\n }}\n isTableMode={false}\n />\n );\n case 'html':\n console.log('渲染HTML内容');\n return renderHtmlContent(data, {\n data,\n annotationData,\n eventsEmit,\n styles,\n tools,\n className,\n contentClass,\n });\n default:\n console.log('渲染未知类型内容');\n return renderUnknownContent(data, {\n data,\n annotationData,\n eventsEmit,\n styles,\n tools,\n className,\n contentClass,\n });\n }\n };\n\n // 监听数据变化(调试数据引用变化与状态更新)\n React.useEffect(() => {\n const prevData = prevDataRef.current;\n const prevContent = prevContentRef.current;\n const dataChanged = prevData !== data;\n const contentChanged = prevContent !== (data ? data.content : undefined);\n console.log('[Fviewer useEffect:data] triggered', {\n dataChanged,\n contentChanged,\n hasData: !!data,\n hasContent: !!data?.content,\n isLoadingBefore: isLoading,\n });\n // 仅记录引用变更,避免在这里 setState 造成循环\n prevDataRef.current = data;\n prevContentRef.current = data ? data.content : undefined;\n }, [data?.content]);\n\n // 监听错误\n React.useEffect(() => {\n if (error) {\n setIsLoading(false);\n }\n }, [error]);\n\n // 监听标注数据变化\n React.useEffect(() => {\n console.log('=== Fviewer annotationData 变化监听 ===');\n console.log('annotationData:', annotationData);\n console.log('annotationData 长度:', annotationData?.length || 0);\n console.log('当前文件类型:', fileType);\n }, [annotationData, fileType]);\n\n return (\n <ContentContainer $theme={mergedTheme} className={contentClass}>\n {isLoading ? (\n customComponents?.LoadingComponent ? (\n <customComponents.LoadingComponent status={loadingStatus} theme={mergedTheme} />\n ) : (\n <LoadingContainer $theme={mergedTheme}>{loadingStatus}</LoadingContainer>\n )\n ) : error ? (\n customComponents?.ErrorComponent ? (\n <customComponents.ErrorComponent error={error} theme={mergedTheme} />\n ) : (\n <ErrorContainer $theme={mergedTheme}>\n <div>加载失败</div>\n <div style={{ fontSize: '12px', marginTop: '8px' }}>{error}</div>\n </ErrorContainer>\n )\n ) : (\n renderContent()\n )}\n </ContentContainer>\n );\n};\n\nexport default Fviewer;\n","/**\n * @license lucide-react v0.456.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nconst toKebabCase = (string) => string.replace(/([a-z0-9])([A-Z])/g, \"$1-$2\").toLowerCase();\nconst mergeClasses = (...classes) => classes.filter((className, index, array) => {\n return Boolean(className) && className.trim() !== \"\" && array.indexOf(className) === index;\n}).join(\" \").trim();\n\nexport { mergeClasses, toKebabCase };\n//# sourceMappingURL=utils.js.map\n","/**\n * @license lucide-react v0.456.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nvar defaultAttributes = {\n xmlns: \"http://www.w3.org/2000/svg\",\n width: 24,\n height: 24,\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n stroke: \"currentColor\",\n strokeWidth: 2,\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\"\n};\n\nexport { defaultAttributes as default };\n//# sourceMappingURL=defaultAttributes.js.map\n","/**\n * @license lucide-react v0.456.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport { forwardRef, createElement } from 'react';\nimport defaultAttributes from './defaultAttributes.js';\nimport { mergeClasses } from './shared/src/utils.js';\n\nconst Icon = forwardRef(\n ({\n color = \"currentColor\",\n size = 24,\n strokeWidth = 2,\n absoluteStrokeWidth,\n className = \"\",\n children,\n iconNode,\n ...rest\n }, ref) => {\n return createElement(\n \"svg\",\n {\n ref,\n ...defaultAttributes,\n width: size,\n height: size,\n stroke: color,\n strokeWidth: absoluteStrokeWidth ? Number(strokeWidth) * 24 / Number(size) : strokeWidth,\n className: mergeClasses(\"lucide\", className),\n ...rest\n },\n [\n ...iconNode.map(([tag, attrs]) => createElement(tag, attrs)),\n ...Array.isArray(children) ? children : [children]\n ]\n );\n }\n);\n\nexport { Icon as default };\n//# sourceMappingURL=Icon.js.map\n","/**\n * @license lucide-react v0.456.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport { forwardRef, createElement } from 'react';\nimport { mergeClasses, toKebabCase } from './shared/src/utils.js';\nimport Icon from './Icon.js';\n\nconst createLucideIcon = (iconName, iconNode) => {\n const Component = forwardRef(\n ({ className, ...props }, ref) => createElement(Icon, {\n ref,\n iconNode,\n className: mergeClasses(`lucide-${toKebabCase(iconName)}`, className),\n ...props\n })\n );\n Component.displayName = `${iconName}`;\n return Component;\n};\n\nexport { createLucideIcon as default };\n//# sourceMappingURL=createLucideIcon.js.map\n","/**\n * @license lucide-react v0.456.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst ChevronLeft = createLucideIcon(\"ChevronLeft\", [\n [\"path\", { d: \"m15 18-6-6 6-6\", key: \"1wnfg3\" }]\n]);\n\nexport { ChevronLeft as default };\n//# sourceMappingURL=chevron-left.js.map\n","/**\n * @license lucide-react v0.456.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst ChevronRight = createLucideIcon(\"ChevronRight\", [\n [\"path\", { d: \"m9 18 6-6-6-6\", key: \"mthhwq\" }]\n]);\n\nexport { ChevronRight as default };\n//# sourceMappingURL=chevron-right.js.map\n","/**\n * @license lucide-react v0.456.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Download = createLucideIcon(\"Download\", [\n [\"path\", { d: \"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\", key: \"ih7n3h\" }],\n [\"polyline\", { points: \"7 10 12 15 17 10\", key: \"2ggqvy\" }],\n [\"line\", { x1: \"12\", x2: \"12\", y1: \"15\", y2: \"3\", key: \"1vk2je\" }]\n]);\n\nexport { Download as default };\n//# sourceMappingURL=download.js.map\n","/**\n * @license lucide-react v0.456.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Pencil = createLucideIcon(\"Pencil\", [\n [\n \"path\",\n {\n d: \"M21.174 6.812a1 1 0 0 0-3.986-3.987L3.842 16.174a2 2 0 0 0-.5.83l-1.321 4.352a.5.5 0 0 0 .623.622l4.353-1.32a2 2 0 0 0 .83-.497z\",\n key: \"1a8usu\"\n }\n ],\n [\"path\", { d: \"m15 5 4 4\", key: \"1mk7zo\" }]\n]);\n\nexport { Pencil as default };\n//# sourceMappingURL=pencil.js.map\n","/**\n * @license lucide-react v0.456.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst RotateCcw = createLucideIcon(\"RotateCcw\", [\n [\"path\", { d: \"M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8\", key: \"1357e3\" }],\n [\"path\", { d: \"M3 3v5h5\", key: \"1xhq8a\" }]\n]);\n\nexport { RotateCcw as default };\n//# sourceMappingURL=rotate-ccw.js.map\n","/**\n * @license lucide-react v0.456.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst RotateCw = createLucideIcon(\"RotateCw\", [\n [\"path\", { d: \"M21 12a9 9 0 1 1-9-9c2.52 0 4.93 1 6.74 2.74L21 8\", key: \"1p45f6\" }],\n [\"path\", { d: \"M21 3v5h-5\", key: \"1q7to0\" }]\n]);\n\nexport { RotateCw as default };\n//# sourceMappingURL=rotate-cw.js.map\n","/**\n * @license lucide-react v0.456.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst X = createLucideIcon(\"X\", [\n [\"path\", { d: \"M18 6 6 18\", key: \"1bl5f8\" }],\n [\"path\", { d: \"m6 6 12 12\", key: \"d8bk6v\" }]\n]);\n\nexport { X as default };\n//# sourceMappingURL=x.js.map\n","/**\n * @license lucide-react v0.456.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst ZoomIn = createLucideIcon(\"ZoomIn\", [\n [\"circle\", { cx: \"11\", cy: \"11\", r: \"8\", key: \"4ej97u\" }],\n [\"line\", { x1: \"21\", x2: \"16.65\", y1: \"21\", y2: \"16.65\", key: \"13gj7c\" }],\n [\"line\", { x1: \"11\", x2: \"11\", y1: \"8\", y2: \"14\", key: \"1vmskp\" }],\n [\"line\", { x1: \"8\", x2: \"14\", y1: \"11\", y2: \"11\", key: \"durymu\" }]\n]);\n\nexport { ZoomIn as default };\n//# sourceMappingURL=zoom-in.js.map\n","/**\n * @license lucide-react v0.456.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst ZoomOut = createLucideIcon(\"ZoomOut\", [\n [\"circle\", { cx: \"11\", cy: \"11\", r: \"8\", key: \"4ej97u\" }],\n [\"line\", { x1: \"21\", x2: \"16.65\", y1: \"21\", y2: \"16.65\", key: \"13gj7c\" }],\n [\"line\", { x1: \"8\", x2: \"14\", y1: \"11\", y2: \"11\", key: \"durymu\" }]\n]);\n\nexport { ZoomOut as default };\n//# sourceMappingURL=zoom-out.js.map\n","import React from 'react';\nimport styled from 'styled-components';\nimport { X, ChevronLeft, ChevronRight, ZoomIn, ZoomOut, Download, Pencil, RotateCcw, RotateCw } from 'lucide-react';\nimport type { AppTheme, ToolsConfig } from '../../../core/types';\n\n// Header组件属性接口\nexport interface HeaderProps {\n // 文件信息\n fileName?: string;\n currentPage?: number;\n totalPage?: number;\n\n // 工具配置\n tools?: ToolsConfig;\n\n // 样式配置\n styles?: {\n theme?: AppTheme;\n };\n\n // 事件回调\n onPrevPage?: () => void;\n onNextPage?: () => void;\n onZoomIn?: () => void;\n onZoomOut?: () => void;\n onAnnotationToggle?: () => void;\n onDownload?: () => void;\n onRotateLeft?: () => void;\n onRotateRight?: () => void;\n onClose?: () => void;\n\n // 状态\n scale?: number;\n isAnnotating?: boolean;\n\n // 自定义类名\n className?: string;\n}\n\n// 样式组件\nconst HeaderContainer = styled.div<{ $theme: AppTheme }>`\n display: flex;\n align-items: center;\n padding: 0px 12px;\n justify-content: space-between;\n padding: ${props => props.$theme.space.padding};\n border-bottom: 1px solid ${props => props.$theme.colors.border};\n background: ${props => props.$theme.colors.background};\n min-height: 52px;\n`;\n\nconst FileInfo = styled.div<{ $theme: AppTheme }>`\n display: flex;\n align-items: center;\n gap: 8px;\n flex: 1;\n min-width: 0;\n`;\n\nconst FileName = styled.div<{ $theme: AppTheme }>`\n font-size: 14px;\n font-weight: 500;\n color: ${props => props.$theme.colors.text};\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n`;\n\nconst PageInfo = styled.div<{ $theme: AppTheme }>`\n font-size: 12px;\n color: ${props => props.$theme.colors.disabledText};\n white-space: nowrap;\n`;\n\nconst ToolBar = styled.div<{ $theme: AppTheme }>`\n display: flex;\n align-items: center;\n gap: 4px;\n`;\n\nconst ToolButton = styled.button<{ $theme: AppTheme; $active?: boolean }>`\n display: flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n border: none;\n border-radius: ${props => props.$theme.space.radius};\n background: ${props => props.$active ? props.$theme.colors.primary + '20' : 'transparent'};\n color: ${props => props.$active ? props.$theme.colors.primary : props.$theme.colors.text};\n cursor: pointer;\n transition: all 0.2s ease;\n\n /* 确保图标有默认颜色 */\n & > svg {\n color: currentColor;\n stroke: currentColor;\n }\n\n &:hover {\n background: ${props => props.$theme.colors.primary + '10'};\n color: ${props => props.$theme.colors.primary};\n }\n\n &:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n`;\n\nconst ZoomInfo = styled.div<{ $theme: AppTheme }>`\n font-size: 12px;\n color: ${props => props.$theme.colors.disabledText};\n min-width: 40px;\n text-align: center;\n`;\n\n// 默认主题\nconst defaultTheme: AppTheme = {\n colors: {\n primary: '#007bff',\n secondary: '#6c757d',\n success: '#008000',\n warning: '#FFA500',\n error: '#FF0000',\n info: '#0000FF',\n background: '#f8f9fa',\n text: '#343a40',\n border: '#dee2e6',\n disabled: '#808080',\n disabledBackground: '#F5F5F5',\n disabledText: '#808080',\n },\n space: {\n sidebar: '12px',\n size: '12px',\n radius: '4px',\n padding: '8px 12px',\n margin: '4px',\n shadow: '0 2px 4px rgba(0,0,0,0.1)',\n lineHeight: '1.5',\n },\n};\n\n/**\n * Header组件\n * 负责文件查看器的头部工具栏\n *\n * @param props - 组件属性\n * @returns Header组件\n */\nconst Header: React.FC<HeaderProps> = React.memo(({\n fileName = '未知文件',\n currentPage = 1,\n totalPage = 0,\n tools = {\n annotation: true,\n download: true,\n zoom: true,\n close: true,\n navigation: true,\n rotate: true,\n },\n styles,\n onPrevPage,\n onNextPage,\n onZoomIn,\n onZoomOut,\n onAnnotationToggle,\n onDownload,\n onRotateLeft,\n onRotateRight,\n onClose,\n scale = 1,\n isAnnotating = false,\n className,\n}) => {\n // 使用主题\n const mergedTheme = styles?.theme || defaultTheme;\n\n // 添加调试信息\n console.log('Header组件渲染 - currentPage:', currentPage, 'totalPage:', totalPage);\n\n return (\n <HeaderContainer $theme={mergedTheme} className={className}>\n <FileInfo $theme={mergedTheme}>\n <FileName $theme={mergedTheme}>\n {fileName}\n </FileName>\n </FileInfo>\n\n <ToolBar $theme={mergedTheme}>\n {/* 页面导航 */}\n {tools.navigation && (\n <>\n <ToolButton\n $theme={mergedTheme}\n onClick={onPrevPage}\n disabled={currentPage <= 1}\n title=\"上一页\"\n >\n <ChevronLeft size={16} />\n </ToolButton>\n {totalPage > 0 && (\n <PageInfo $theme={mergedTheme}>\n {currentPage} / {totalPage}\n </PageInfo>\n )}\n <ToolButton\n $theme={mergedTheme}\n onClick={onNextPage}\n disabled={!totalPage || currentPage >= totalPage}\n title=\"下一页\"\n >\n <ChevronRight size={16} />\n </ToolButton>\n </>\n )}\n\n {/* 缩放控制 */}\n {tools.zoom && (\n <>\n <ToolButton\n $theme={mergedTheme}\n onClick={onZoomOut}\n disabled={scale <= 0.3}\n title=\"缩小\"\n >\n <ZoomOut size={16} />\n </ToolButton>\n <ZoomInfo $theme={mergedTheme}>\n {Math.round(scale * 100)}%\n </ZoomInfo>\n <ToolButton\n $theme={mergedTheme}\n onClick={onZoomIn}\n disabled={scale >= 3}\n title=\"放大\"\n >\n <ZoomIn size={16} />\n </ToolButton>\n </>\n )}\n\n {/* 标注工具 */}\n {tools.annotation && (\n <ToolButton\n $theme={mergedTheme}\n $active={isAnnotating}\n onClick={onAnnotationToggle}\n title={isAnnotating ? '退出标注' : '开始标注'}\n >\n <Pencil size={16} />\n </ToolButton>\n )}\n\n {/* 下载按钮 */}\n {tools.download && (\n <ToolButton\n $theme={mergedTheme}\n onClick={onDownload}\n title=\"下载\"\n >\n <Download size={16} />\n </ToolButton>\n )}\n\n {/* 旋转控制 */}\n {tools.rotate && (\n <>\n <ToolButton\n $theme={mergedTheme}\n onClick={onRotateLeft}\n title=\"向左旋转\"\n >\n <RotateCcw size={16} />\n </ToolButton>\n <ToolButton\n $theme={mergedTheme}\n onClick={onRotateRight}\n title=\"向右旋转\"\n >\n <RotateCw size={16} />\n </ToolButton>\n </>\n )}\n\n {/* 关闭按钮 */}\n {tools.close && (\n <ToolButton\n $theme={mergedTheme}\n onClick={onClose}\n title=\"关闭\"\n >\n <X size={16} />\n </ToolButton>\n )}\n </ToolBar>\n </HeaderContainer>\n );\n});\n\nexport default Header;\n","import * as pdfjsLib from 'pdfjs-dist';\nimport { isPDFWorkerRegistered } from '../../lib_enter';\n\n// 文件类型枚举\nexport type FileType = 'pdf' | 'image' | 'text' | 'markdown' | 'markdown_table' | 'html' | 'unknown';\n\n// 解析结果接口\nexport interface ParseResult {\n type: FileType;\n content: any;\n fileName?: string;\n fileType?: string;\n totalPages?: number;\n error?: string;\n}\n\n// 解析选项接口\nexport interface ParseOptions {\n fileName?: string;\n fileType?: string;\n token?: string;\n}\n\n/**\n * 确保PDF Worker已注册\n * 注意:此函数不会自动注册 Worker,只检查是否已注册\n * Worker 应该由最终调用方通过 registerPDFWorker 注册\n */\nconst ensurePDFWorkerRegistered = () => {\n // 检查是否已经注册过worker\n if (isPDFWorkerRegistered()) {\n console.log('PDF Worker 已经注册');\n return;\n }\n\n // Worker 未注册,抛出友好的错误提示\n const errorMsg =\n 'PDF Worker 未注册。请在应用入口处调用 registerPDFWorker() 注册 Worker。\\n' +\n '示例:import { registerPDFWorker } from \"@mxmweb/fviewer\";\\n' +\n ' registerPDFWorker(\"/worker/pdf.worker.min.js\");\\n' +\n '注意:Worker 文件路径需要根据实际部署情况调整。';\n\n console.error(errorMsg);\n throw new Error(errorMsg);\n};\n\n/**\n * 检测文件类型\n * @param fileName - 文件名\n * @param fileType - 文件类型\n * @param content - 文件内容\n * @returns 文件类型\n */\nexport const detectFileType = (fileName?: string, fileType?: string, content?: any): FileType => {\n if (!fileName && !fileType && !content) return 'unknown';\n\n const name = fileName || '';\n const type = fileType || '';\n\n if (name.toLowerCase().endsWith('.pdf') || type === 'pdf' || content?.type === 'pdf') {\n return 'pdf';\n }\n if (name.toLowerCase().match(/\\.(jpg|jpeg|png|gif|bmp|webp)$/) || type === 'image' || content?.type === 'image') {\n return 'image';\n }\n if (name.toLowerCase().endsWith('.md') || type === 'markdown' || content?.type === 'markdown') {\n // 检查是否为markdown_table类型\n if (type === 'markdown_table' || content?.type === 'markdown_table') {\n return 'markdown_table';\n }\n return 'markdown';\n }\n if (name.toLowerCase().match(/\\.(html|htm)$/) || type === 'html' || content?.type === 'html') {\n return 'html';\n }\n if (name.toLowerCase().match(/\\.(txt|log|json|xml|css|js|ts)$/) || type === 'text' || content?.type === 'text') {\n return 'text';\n }\n\n return 'unknown';\n};\n\n/**\n * 解析PDF文件(支持静态文件和stream chunk)\n * @param data - PDF数据(ArrayBuffer或URL)\n * @param options - 解析选项\n * @returns 解析结果\n */\nexport const parsePdfFile = async (data: ArrayBuffer | string, options: ParseOptions = {}): Promise<ParseResult> => {\n console.log('=== parsePdfFile 开始 ===');\n console.log('输入数据:', { data: typeof data, options });\n\n try {\n // 确保PDF Worker已注册\n ensurePDFWorkerRegistered();\n\n let pdfDocument: pdfjsLib.PDFDocumentProxy;\n\n if (typeof data === 'string') {\n console.log('从URL加载PDF:', data);\n // 静态文件URL\n const loadingTask = pdfjsLib.getDocument({\n url: data,\n httpHeaders: options.token ? { 'Authorization': options.token } : undefined,\n });\n console.log('=== PDF加载任务详细信息 ===');\n console.log('加载任务对象:', loadingTask);\n console.log('加载任务类型:', typeof loadingTask);\n console.log('加载任务方法:', Object.getOwnPropertyNames(Object.getPrototypeOf(loadingTask)));\n console.log('加载任务属性:', Object.keys(loadingTask));\n\n pdfDocument = await loadingTask.promise;\n console.log('=== PDF文档加载完成 ===');\n console.log('PDF文档对象:', pdfDocument);\n console.log('PDF文档类型:', typeof pdfDocument);\n console.log('PDF文档方法:', Object.getOwnPropertyNames(Object.getPrototypeOf(pdfDocument)));\n console.log('PDF文档属性:', Object.keys(pdfDocument));\n } else {\n console.log('从ArrayBuffer加载PDF');\n // ArrayBuffer数据(stream chunk)\n const loadingTask = pdfjsLib.getDocument({\n data: data,\n });\n console.log('=== PDF加载任务详细信息 ===');\n console.log('加载任务对象:', loadingTask);\n console.log('加载任务类型:', typeof loadingTask);\n\n pdfDocument = await loadingTask.promise;\n console.log('=== PDF文档加载完成 ===');\n console.log('PDF文档对象:', pdfDocument);\n console.log('PDF文档类型:', typeof pdfDocument);\n }\n\n const totalPages = pdfDocument.numPages;\n console.log('PDF加载成功,总页数:', totalPages);\n console.log('PDF指纹:', pdfDocument.fingerprints);\n console.log('PDF传输对象:', pdfDocument._transport);\n\n const result: ParseResult = {\n type: 'pdf' as FileType,\n content: {\n type: 'pdf',\n document: pdfDocument,\n totalPages,\n },\n fileName: options.fileName,\n fileType: 'pdf',\n totalPages,\n };\n\n console.log('=== 解析结果详细信息 ===');\n console.log('解析结果:', result);\n console.log('解析结果类型:', typeof result);\n console.log('解析结果属性:', Object.keys(result));\n console.log('内容对象:', result.content);\n console.log('文档对象:', result.content.document);\n\n return result;\n } catch (error) {\n console.error('PDF解析失败:', error);\n console.error('错误详情:', {\n message: error instanceof Error ? error.message : '未知错误',\n stack: error instanceof Error ? error.stack : undefined,\n name: error instanceof Error ? error.name : undefined,\n url: typeof data === 'string' ? data : 'ArrayBuffer',\n options: options\n });\n\n // 提供更详细的错误信息\n let errorMessage = 'PDF解析失败';\n if (error instanceof Error) {\n if (error.message.includes('PDF Worker 未注册') || error.message.includes('Worker 未注册')) {\n // Worker 未注册的错误,保留原始错误信息,让用户知道需要注册\n errorMessage = error.message;\n } else if (error.message.includes('Invalid PDF structure')) {\n errorMessage = 'PDF文件结构无效,可能文件损坏或不是有效的PDF文件';\n } else if (error.message.includes('Failed to fetch')) {\n errorMessage = 'PDF文件下载失败,请检查网络连接和文件URL';\n } else if (error.message.includes('Worker') || error.message.includes('worker')) {\n errorMessage = 'PDF解析器初始化失败。请确保在应用入口处调用 registerPDFWorker() 注册 Worker 文件。';\n } else {\n errorMessage = `PDF解析失败: ${error.message}`;\n }\n }\n\n return {\n type: 'pdf',\n content: null,\n fileName: options.fileName,\n fileType: 'pdf',\n error: errorMessage,\n };\n }\n};\n\n/**\n * 解析图片文件\n * @param data - 图片数据(URL或ArrayBuffer)\n * @param options - 解析选项\n * @returns 解析结果\n */\nexport const parseImageFile = async (data: ArrayBuffer | string, options: ParseOptions = {}): Promise<ParseResult> => {\n console.log('=== parseImageFile 开始 ===');\n console.log('输入数据:', { data: typeof data, options });\n\n try {\n let imageUrl: string;\n\n if (typeof data === 'string') {\n console.log('从URL加载图片:', data);\n // 静态文件URL\n imageUrl = data;\n } else {\n console.log('从ArrayBuffer加载图片');\n // ArrayBuffer数据,转换为blob URL\n const blob = new Blob([data]);\n imageUrl = URL.createObjectURL(blob);\n }\n\n // 预加载图片以验证是否能正常加载\n console.log('开始预加载图片:', imageUrl);\n await new Promise<void>((resolve, reject) => {\n const img = new Image();\n\n img.onload = () => {\n console.log('图片预加载成功:', imageUrl);\n console.log('图片尺寸:', img.width, 'x', img.height);\n resolve();\n };\n\n img.onerror = () => {\n console.error('图片预加载失败:', imageUrl);\n reject(new Error('图片加载失败'));\n };\n\n // 设置超时时间(10秒)\n const timeout = setTimeout(() => {\n reject(new Error('图片加载超时'));\n }, 10000);\n\n img.onload = () => {\n clearTimeout(timeout);\n console.log('图片预加载成功:', imageUrl);\n console.log('图片尺寸:', img.width, 'x', img.height);\n resolve();\n };\n\n img.onerror = () => {\n clearTimeout(timeout);\n console.error('图片预加载失败:', imageUrl);\n reject(new Error('图片加载失败'));\n };\n\n img.src = imageUrl;\n });\n\n const result: ParseResult = {\n type: 'image',\n content: {\n type: 'image',\n url: imageUrl,\n },\n fileName: options.fileName,\n fileType: 'image',\n };\n\n console.log('=== parseImageFile 结果 ===');\n console.log('result:', result);\n\n return result;\n } catch (error) {\n console.error('图片解析失败:', error);\n return {\n type: 'image',\n content: null,\n fileName: options.fileName,\n fileType: 'image',\n error: `图片解析失败: ${error instanceof Error ? error.message : '未知错误'}`,\n };\n }\n};\n\n/**\n * 解析文本文件\n * @param data - 文本数据(URL或ArrayBuffer)\n * @param options - 解析选项\n * @returns 解析结果\n */\nexport const parseTextFile = async (data: ArrayBuffer | string, options: ParseOptions = {}): Promise<ParseResult> => {\n try {\n let textContent: string;\n\n if (typeof data === 'string') {\n // 静态文件URL\n const response = await fetch(data, {\n headers: options.token ? { 'Authorization': options.token } : undefined,\n });\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n }\n textContent = await response.text();\n } else {\n // ArrayBuffer数据\n const decoder = new TextDecoder('utf-8');\n textContent = decoder.decode(data);\n }\n\n return {\n type: 'text',\n content: {\n type: 'text',\n text: textContent,\n },\n fileName: options.fileName,\n fileType: 'text',\n };\n } catch (error) {\n return {\n type: 'text',\n content: null,\n fileName: options.fileName,\n fileType: 'text',\n error: `文本解析失败: ${error instanceof Error ? error.message : '未知错误'}`,\n };\n }\n};\n\n/**\n * 解析Markdown文件\n * @param data - Markdown数据(URL或ArrayBuffer)\n * @param options - 解析选项\n * @returns 解析结果\n */\nexport const parseMarkdownFile = async (data: ArrayBuffer | string, options: ParseOptions = {}): Promise<ParseResult> => {\n try {\n let markdownContent: string;\n\n if (typeof data === 'string') {\n // 静态文件URL\n const response = await fetch(data, {\n headers: options.token ? { 'Authorization': options.token } : undefined,\n });\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n }\n markdownContent = await response.text();\n } else {\n // ArrayBuffer数据\n const decoder = new TextDecoder('utf-8');\n markdownContent = decoder.decode(data);\n }\n\n return {\n type: 'markdown',\n content: {\n type: 'markdown',\n text: markdownContent,\n },\n fileName: options.fileName,\n fileType: 'markdown',\n };\n } catch (error) {\n return {\n type: 'markdown',\n content: null,\n fileName: options.fileName,\n fileType: 'markdown',\n error: `Markdown解析失败: ${error instanceof Error ? error.message : '未知错误'}`,\n };\n }\n};\n\n/**\n * 解析HTML文件\n * @param data - HTML数据(URL或ArrayBuffer)\n * @param options - 解析选项\n * @returns 解析结果\n */\nexport const parseHtmlFile = async (data: ArrayBuffer | string, options: ParseOptions = {}): Promise<ParseResult> => {\n console.log('=== parseHtmlFile 开始 ===');\n console.log('输入数据:', { data: typeof data, options });\n\n try {\n let htmlContent: string;\n\n if (typeof data === 'string') {\n console.log('从URL加载HTML:', data);\n // 静态文件URL\n const response = await fetch(data, {\n headers: options.token ? { 'Authorization': options.token } : undefined,\n });\n console.log('HTTP响应状态:', response.status, response.statusText);\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n }\n htmlContent = await response.text();\n console.log('HTML内容长度:', htmlContent.length);\n console.log('HTML内容前500字符:', htmlContent.substring(0, 500));\n } else {\n console.log('从ArrayBuffer加载HTML');\n // ArrayBuffer数据\n const decoder = new TextDecoder('utf-8');\n htmlContent = decoder.decode(data);\n }\n\n const result: ParseResult = {\n type: 'html' as FileType,\n content: {\n type: 'html',\n text: htmlContent,\n },\n fileName: options.fileName,\n fileType: 'html',\n };\n\n console.log('=== parseHtmlFile 结果 ===');\n console.log('result:', result);\n console.log('result.content.text 长度:', result.content.text.length);\n console.log('result.content.text 前200字符:', result.content.text.substring(0, 200));\n\n return result;\n } catch (error) {\n console.error('HTML解析失败:', error);\n return {\n type: 'html',\n content: null,\n fileName: options.fileName,\n fileType: 'html',\n error: `HTML解析失败: ${error instanceof Error ? error.message : '未知错误'}`,\n };\n }\n};\n\n/**\n * 统一文件解析函数\n * @param data - 文件数据(URL或ArrayBuffer)\n * @param options - 解析选项\n * @returns 解析结果\n */\nexport const parseFile = async (data: ArrayBuffer | string, options: ParseOptions = {}): Promise<ParseResult> => {\n const fileType = detectFileType(options.fileName, options.fileType);\n\n switch (fileType) {\n case 'pdf':\n return await parsePdfFile(data, options);\n case 'image':\n return await parseImageFile(data, options);\n case 'text':\n return await parseTextFile(data, options);\n case 'markdown':\n case 'markdown_table':\n return await parseMarkdownFile(data, options);\n case 'html':\n return await parseHtmlFile(data, options);\n default:\n return {\n type: 'unknown',\n content: null,\n fileName: options.fileName,\n fileType: options.fileType,\n error: '不支持的文件类型',\n };\n }\n};\n","import React, { useState, useEffect, useCallback } from 'react';\nimport styled from 'styled-components';\nimport Fviewer from '../core/Fviewer';\nimport Header from './components/Header';\nimport { parseFile, detectFileType } from '../core/utils/fileParser';\nimport type {\n AppTheme,\n Annotation,\n MDAnnotation,\n TableAnnotation,\n ToolsConfig,\n} from '../core/types';\nimport type { ParseResult } from '../core/utils/fileParser';\n\n// StaticFileReader组件属性接口\nexport interface StaticFileReaderProps {\n // 文件相关(data 直传时可不提供 fileUrl)\n fileUrl?: string;\n fileType?: string;\n fileName?: string;\n token?: string;\n initialPage?: number;\n annotations?: (Annotation | MDAnnotation | TableAnnotation)[];\n // 直接数据传递\n data?: any;\n // 事件回调\n eventsEmit?: (name: string, data?: any, innerFn?: any) => void;\n\n // 样式配置\n styles?: {\n theme?: AppTheme;\n mode?: 'light' | 'dark';\n };\n\n // 工具配置\n tools?: ToolsConfig;\n\n // 自定义组件\n customComponents?: {\n LoadingComponent?: React.ComponentType<{\n status: string;\n theme: AppTheme;\n }>;\n ErrorComponent?: React.ComponentType<{\n error: string;\n theme: AppTheme;\n }>;\n };\n\n // 自定义类名\n className?: string;\n headerClass?: string;\n contentClass?: string;\n}\n\n// 样式组件\nconst ReaderContainer = styled.div<{ $theme: AppTheme }>`\n display: flex;\n flex-direction: column;\n height: 100%;\n width: 100%;\n background: ${props => props.$theme.colors.background};\n border: 1px solid ${props => props.$theme.colors.border};\n border-radius: ${props => props.$theme.space.radius};\n overflow: hidden;\n min-height: 0; /* 确保flex子元素可以收缩 */\n`;\n\n/**\n * 默认文件加载动画组件\n * 提供美观的文件加载动画效果,支持状态文本显示\n */\nconst DefaultLoadingComponent: React.FC<{\n status: string;\n theme: AppTheme;\n}> = ({ status, theme }) => {\n return (\n <div\n style={{\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n height: '100%',\n padding: '40px',\n background: theme.colors.background,\n }}\n >\n {/* 文件图标动画 */}\n <div\n style={{\n position: 'relative',\n width: '80px',\n height: '80px',\n marginBottom: '24px',\n }}\n >\n {/* 文件图标背景 */}\n <div\n style={{\n width: '60px',\n height: '80px',\n background: theme.colors.primary,\n borderRadius: '8px 8px 0 0',\n position: 'relative',\n margin: '0 auto',\n }}\n >\n {/* 文件折角 */}\n <div\n style={{\n position: 'absolute',\n top: '0',\n right: '0',\n width: '0',\n height: '0',\n borderStyle: 'solid',\n borderWidth: '0 20px 20px 0',\n borderColor: `transparent ${theme.colors.background} transparent transparent`,\n }}\n />\n </div>\n\n {/* 加载动画圆点 */}\n <div\n style={{\n position: 'absolute',\n top: '50%',\n left: '50%',\n transform: 'translate(-50%, -50%)',\n width: '20px',\n height: '20px',\n borderRadius: '50%',\n background: theme.colors.background,\n animation: 'pulse 1.5s ease-in-out infinite',\n }}\n />\n </div>\n\n {/* 状态文本 */}\n <div\n style={{\n fontSize: '16px',\n fontWeight: '500',\n color: theme.colors.text,\n marginBottom: '8px',\n textAlign: 'center',\n }}\n >\n {status}\n </div>\n\n {/* 进度指示器 */}\n <div\n style={{\n width: '200px',\n height: '4px',\n background: theme.colors.border,\n borderRadius: '2px',\n overflow: 'hidden',\n position: 'relative',\n }}\n >\n <div\n style={{\n width: '30%',\n height: '100%',\n background: theme.colors.primary,\n borderRadius: '2px',\n animation: 'loading-progress 2s ease-in-out infinite',\n }}\n />\n </div>\n\n {/* 动画样式 */}\n <style>{`\n @keyframes pulse {\n 0%, 100% {\n opacity: 1;\n transform: translate(-50%, -50%) scale(1);\n }\n 50% {\n opacity: 0.5;\n transform: translate(-50%, -50%) scale(1.1);\n }\n }\n\n @keyframes loading-progress {\n 0% {\n transform: translateX(-100%);\n }\n 50% {\n transform: translateX(0%);\n }\n 100% {\n transform: translateX(100%);\n }\n }\n `}</style>\n </div>\n );\n};\n\nconst LoadingContainer = styled.div<{ $theme: AppTheme }>`\n display: flex;\n align-items: center;\n justify-content: center;\n height: 100%;\n color: ${props => props.$theme.colors.disabledText};\n font-size: 14px;\n`;\n\nconst ErrorContainer = styled.div<{ $theme: AppTheme }>`\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 100%;\n color: ${props => props.$theme.colors.error};\n text-align: center;\n padding: 20px;\n`;\n\n// 默认主题\nconst defaultTheme: AppTheme = {\n colors: {\n primary: '#007bff',\n secondary: '#6c757d',\n success: '#008000',\n warning: '#FFA500',\n error: '#FF0000',\n info: '#0000FF',\n background: '#f8f9fa',\n text: '#343a40',\n border: '#dee2e6',\n disabled: '#808080',\n disabledBackground: '#F5F5F5',\n disabledText: '#808080',\n },\n space: {\n sidebar: 'md',\n size: 'md',\n radius: 'md',\n padding: 'md',\n margin: 'md',\n shadow: 'md',\n lineHeight: 'md',\n },\n};\n\n/**\n * StaticFileReader组件\n * 静态文件读取器,支持从URL加载文件并解析显示\n *\n * @param props - 组件属性\n * @returns StaticFileReader组件\n */\nconst StaticFileReader: React.FC<StaticFileReaderProps> = ({\n fileUrl,\n fileType,\n annotations,\n fileName,\n token,\n initialPage = 1,\n data,\n eventsEmit = () => {},\n styles,\n tools = {\n annotation: false,\n download: false,\n zoom: true,\n close: true,\n navigation: true,\n },\n customComponents,\n className,\n headerClass,\n contentClass,\n}) => {\n // 使用主题\n const mergedTheme = styles?.theme || defaultTheme;\n\n // 状态管理\n const [isLoading, setIsLoading] = useState(true);\n const [loadingStatus, setLoadingStatus] = useState<string>('文件下载中...');\n const [error, setError] = useState<string | null>(null);\n const [parseResult, setParseResult] = useState<ParseResult | null>(null);\n const [currentPage, setCurrentPage] = useState(initialPage);\n const [scale, setScale] = useState(1);\n const [rotation, setRotation] = useState(0); // 图片旋转角度\n const [isAnnotating, setIsAnnotating] = useState(false);\n //const [annotations, setAnnotations] = useState<Annotation[]>([]);\n\n /**\n * 重置所有状态\n */\n const resetState = useCallback(() => {\n setIsLoading(true);\n setLoadingStatus('文件下载中...');\n setError(null);\n setParseResult(null);\n setCurrentPage(initialPage);\n setRotation(0);\n setIsAnnotating(false);\n }, [initialPage]);\n\n /**\n * 加载并解析文件\n */\n const loadFile = useCallback(async () => {\n console.log('=== loadFile 开始 ===');\n console.log('当前参数:', { fileUrl, fileName, fileType, data });\n\n // 重置所有状态\n resetState();\n\n // 如果有直接传递的数据,直接使用\n if (data) {\n setIsLoading(false);\n setError(null);\n setParseResult({\n type: data.fileType || fileType || 'text',\n content: data.content,\n fileName: data.fileName || fileName,\n fileType: data.fileType || fileType,\n totalPages: data.totalPages || 1,\n });\n return;\n }\n\n if (!fileUrl) {\n setError('文件URL不能为空');\n setIsLoading(false);\n return;\n }\n\n try {\n setIsLoading(true);\n setError(null);\n\n // 根据文件类型设置不同的加载状态\n const detectedType = detectFileType(fileName, fileType);\n if (detectedType === 'image') {\n setLoadingStatus('图片下载中...');\n } else if (detectedType === 'pdf') {\n setLoadingStatus('PDF文件下载中...');\n } else if (detectedType === 'markdown' || detectedType === 'markdown_table') {\n setLoadingStatus('Markdown文件下载中...');\n } else {\n setLoadingStatus('文件下载中...');\n }\n\n // 使用core层的解析函数\n const result = await parseFile(fileUrl, {\n fileName,\n fileType,\n token,\n });\n\n console.log('=== StaticFileReader parseFile 结果 ===');\n console.log('result:', result);\n console.log('result.type:', result.type);\n console.log('result.content:', result.content);\n console.log('result.content?.text:', result.content?.text);\n console.log('result.fileName:', result.fileName);\n console.log('result.fileType:', result.fileType);\n\n if (result.error) {\n setError(result.error);\n } else {\n // 根据文件类型设置不同的完成状态\n if (result.type === 'image') {\n setLoadingStatus('图片加载完成');\n } else if (result.type === 'pdf') {\n setLoadingStatus('PDF加载完成');\n } else if (result.type === 'markdown' || result.type === 'markdown_table') {\n setLoadingStatus('Markdown加载完成');\n } else {\n setLoadingStatus('文件加载完成');\n }\n\n console.log('=== parseResult 设置 ===');\n console.log('parseResult:', result);\n console.log('parseResult.content:', result.content);\n console.log('parseResult.content.document:', result.content?.document);\n setParseResult(result);\n }\n } catch (err) {\n setError(`文件加载失败: ${err instanceof Error ? err.message : '未知错误'}`);\n } finally {\n setIsLoading(false);\n }\n }, [fileUrl, fileName, fileType, token, data, resetState]);\n\n // 监听文件URL变化\n useEffect(() => {\n loadFile();\n }, [loadFile]);\n\n /**\n * 处理事件回调\n */\n const handleEventsEmit = useCallback(\n (name: string, data?: any, innerFn?: any) => {\n // 处理内部事件\n switch (name) {\n case 'pageChange':\n if (data?.pageNumber) {\n setCurrentPage(data.pageNumber);\n }\n break;\n\n // if (data?.annotationId) {\n // setAnnotations(prev => prev.filter(a => a.id !== data.annotationId));\n // }\n // break;\n default:\n // 传递给外部事件处理器\n eventsEmit(name, data, innerFn);\n break;\n }\n },\n [eventsEmit]\n );\n\n /**\n * 处理缩放放大\n */\n const handleZoomIn = useCallback(() => {\n const newScale = Math.min(3, scale + 0.1);\n setScale(newScale);\n handleEventsEmit('zoom:change', { scale: newScale });\n }, [scale, handleEventsEmit]);\n\n /**\n * 处理缩放缩小\n */\n const handleZoomOut = useCallback(() => {\n const newScale = Math.max(0.3, scale - 0.1);\n setScale(newScale);\n handleEventsEmit('zoom:change', { scale: newScale });\n }, [scale, handleEventsEmit]);\n\n /**\n * 处理上一页\n */\n const handlePrevPage = useCallback(() => {\n if (currentPage > 1) {\n const newPage = currentPage - 1;\n setCurrentPage(newPage);\n handleEventsEmit('page:change', { page: newPage });\n }\n }, [currentPage, handleEventsEmit]);\n\n /**\n * 处理下一页\n */\n const handleNextPage = useCallback(() => {\n const totalPages = parseResult?.totalPages || 0;\n if (totalPages && currentPage < totalPages) {\n const newPage = currentPage + 1;\n setCurrentPage(newPage);\n handleEventsEmit('page:change', { page: newPage });\n }\n }, [currentPage, parseResult?.totalPages, handleEventsEmit]);\n\n /**\n * 处理标注切换\n */\n const handleAnnotationToggle = useCallback(() => {\n const newAnnotating = !isAnnotating;\n setIsAnnotating(newAnnotating);\n handleEventsEmit('annotation:toggle', { isAnnotating: newAnnotating });\n }, [isAnnotating, handleEventsEmit]);\n\n /**\n * 处理下载\n */\n const handleDownload = useCallback(() => {\n handleEventsEmit('download:start', { fileUrl, fileName });\n }, [handleEventsEmit, fileUrl, fileName]);\n\n /**\n * 处理向左旋转\n */\n const handleRotateLeft = useCallback(() => {\n setRotation(prev => (prev - 90) % 360);\n handleEventsEmit('rotate:left', { rotation: (rotation - 90) % 360 });\n }, [rotation, handleEventsEmit]);\n\n /**\n * 处理向右旋转\n */\n const handleRotateRight = useCallback(() => {\n setRotation(prev => (prev + 90) % 360);\n handleEventsEmit('rotate:right', { rotation: (rotation + 90) % 360 });\n }, [rotation, handleEventsEmit]);\n\n /**\n * 处理关闭\n */\n const handleClose = useCallback(() => {\n handleEventsEmit('viewer:close');\n }, [handleEventsEmit]);\n\n /**\n * 根据文件类型动态控制工具按钮\n */\n const getDynamicTools = useCallback((fileType: string, baseTools: ToolsConfig): ToolsConfig => {\n const isMultiPageFile = fileType === 'pdf'; // 只有 PDF 是多页文件\n const isTextBasedFile =\n fileType === 'text' ||\n fileType === 'markdown' ||\n fileType === 'markdown_table' ||\n fileType === 'html';\n\n return {\n ...baseTools,\n // 缩放功能:只有 PDF 和图片支持\n zoom: baseTools.zoom && !isTextBasedFile,\n // 导航功能:只有多页文件支持(PDF)\n navigation: baseTools.navigation && isMultiPageFile,\n // 标注功能:PDF、Markdown、Markdown表格都支持\n annotation:\n baseTools.annotation &&\n (fileType === 'pdf' || fileType === 'markdown' || fileType === 'markdown_table'),\n // 旋转功能:只有图片支持\n rotate: baseTools.rotate && fileType === 'image',\n // 下载功能:所有文件都支持\n download: baseTools.download,\n // 关闭功能:所有文件都支持\n close: baseTools.close,\n };\n }, []);\n\n // 渲染加载状态\n if (isLoading) {\n const loadingTools = getDynamicTools(fileType || 'unknown', {\n ...tools,\n navigation: false,\n });\n\n return (\n <ReaderContainer $theme={mergedTheme} className={className}>\n {/* 头部工具栏 - 始终显示 */}\n <Header\n fileName={fileName || '加载中...'}\n currentPage={1}\n totalPage={0}\n tools={loadingTools}\n styles={styles}\n onPrevPage={() => {}}\n onNextPage={() => {}}\n onZoomIn={() => {}}\n onZoomOut={() => {}}\n onAnnotationToggle={() => {}}\n onDownload={() => {}}\n onClose={handleClose}\n scale={1}\n isAnnotating={false}\n className={headerClass}\n />\n\n {/* 内容区域 - 显示加载状态 */}\n {customComponents?.LoadingComponent ? (\n <customComponents.LoadingComponent status={loadingStatus} theme={mergedTheme} />\n ) : (\n <DefaultLoadingComponent status={loadingStatus} theme={mergedTheme} />\n )}\n </ReaderContainer>\n );\n }\n\n // 渲染错误状态\n if (error) {\n const errorTools = getDynamicTools(fileType || 'unknown', {\n ...tools,\n navigation: false,\n });\n\n return (\n <ReaderContainer $theme={mergedTheme} className={className}>\n {/* 头部工具栏 - 始终显示 */}\n <Header\n fileName={fileName || '错误'}\n currentPage={1}\n totalPage={0}\n tools={errorTools}\n styles={styles}\n onPrevPage={() => {}}\n onNextPage={() => {}}\n onZoomIn={() => {}}\n onZoomOut={() => {}}\n onAnnotationToggle={() => {}}\n onDownload={() => {}}\n onClose={handleClose}\n scale={1}\n isAnnotating={false}\n className={headerClass}\n />\n\n {/* 内容区域 - 显示错误状态 */}\n <ErrorContainer $theme={mergedTheme}>\n <div>文件加载失败</div>\n <div style={{ fontSize: '12px', marginTop: '8px' }}>{error}</div>\n </ErrorContainer>\n </ReaderContainer>\n );\n }\n\n // 渲染文件内容\n if (!parseResult) {\n const unknownTools = getDynamicTools(fileType || 'unknown', {\n ...tools,\n navigation: false,\n });\n\n return (\n <ReaderContainer $theme={mergedTheme} className={className}>\n {/* 头部工具栏 - 始终显示 */}\n <Header\n fileName={fileName || '未知文件'}\n currentPage={1}\n totalPage={0}\n tools={unknownTools}\n styles={styles}\n onPrevPage={() => {}}\n onNextPage={() => {}}\n onZoomIn={() => {}}\n onZoomOut={() => {}}\n onAnnotationToggle={() => {}}\n onDownload={() => {}}\n onClose={handleClose}\n scale={1}\n isAnnotating={false}\n className={headerClass}\n />\n\n {/* 内容区域 - 显示解析错误 */}\n <ErrorContainer $theme={mergedTheme}>\n <div>无法解析文件</div>\n </ErrorContainer>\n </ReaderContainer>\n );\n }\n\n // 准备传递给Fviewer的数据\n const viewerData = {\n content: parseResult.content,\n ...((parseResult.fileName || fileName) && { fileName: parseResult.fileName || fileName }),\n ...((parseResult.fileType || fileType) && { fileType: parseResult.fileType || fileType }),\n ...(parseResult.totalPages && { totalPages: parseResult.totalPages }),\n };\n\n // 根据文件类型动态控制工具按钮\n const dynamicTools = getDynamicTools(parseResult.type, tools);\n\n console.log('=== viewerData 准备 ===');\n console.log('viewerData:', viewerData);\n console.log('viewerData.content:', viewerData.content);\n console.log('viewerData.content.document:', viewerData.content?.document);\n console.log('文件类型:', parseResult.type);\n console.log('动态工具配置:', dynamicTools);\n console.log('=== 标注数据传递 ===');\n console.log('annotations prop:', annotations);\n console.log('annotations 长度:', annotations?.length || 0);\n\n return (\n <ReaderContainer $theme={mergedTheme} className={className}>\n {/* 头部工具栏 */}\n <Header\n fileName={viewerData.fileName || parseResult.fileName || fileName || '未知文件'}\n currentPage={parseResult.type === 'pdf' ? currentPage : 1}\n totalPage={parseResult.type === 'pdf' ? parseResult.totalPages || 0 : 0}\n tools={dynamicTools}\n styles={styles}\n onPrevPage={parseResult.type === 'pdf' ? handlePrevPage : () => {}}\n onNextPage={parseResult.type === 'pdf' ? handleNextPage : () => {}}\n onZoomIn={dynamicTools.zoom ? handleZoomIn : () => {}}\n onZoomOut={dynamicTools.zoom ? handleZoomOut : () => {}}\n onAnnotationToggle={dynamicTools.annotation ? handleAnnotationToggle : () => {}}\n onDownload={dynamicTools.download ? handleDownload : () => {}}\n onRotateLeft={dynamicTools.rotate ? handleRotateLeft : () => {}}\n onRotateRight={dynamicTools.rotate ? handleRotateRight : () => {}}\n onClose={handleClose}\n scale={scale}\n isAnnotating={isAnnotating}\n className={headerClass}\n />\n\n {/* 内容区域 */}\n <Fviewer\n data={viewerData}\n annotationData={annotations || []}\n totalPage={parseResult.type === 'pdf' ? parseResult.totalPages || 0 : 0}\n currentPage={parseResult.type === 'pdf' ? currentPage : 1}\n scale={scale}\n rotation={rotation}\n eventsEmit={handleEventsEmit}\n styles={styles}\n tools={dynamicTools}\n className={contentClass}\n setScale={setScale}\n />\n </ReaderContainer>\n );\n};\n\nexport default StaticFileReader;\n","import './styles/index.css';\n\n// 导出类型\nexport type {\n PdfRenderProps,\n Annotation,\n ToolsConfig\n} from './core';\n\n// 导出其他类型\nexport type { MDAnnotation, TableAnnotation } from './core/types';\n\nexport type { StaticFileReaderProps } from './adopters/StaticFileReader';\n// export type { GientechStreamReaderProps } from './adopters/GientechStreamReader';\nexport { default as Fviewer } from './core/Fviewer';\nexport { default as StaticFileReader } from './adopters/StaticFileReader';\n// export { default as GientechStreamReader } from './adopters/GientechStreamReader';\n\n// 导出文件解析工具\nexport {\n parseFile,\n parsePdfFile,\n parseImageFile,\n parseTextFile,\n parseMarkdownFile,\n detectFileType,\n type ParseResult,\n type ParseOptions,\n type FileType\n} from './core/utils/fileParser';\n\n\n\n/**\n * 文档忽略输出\n */\nimport * as pdfjsLib from 'pdfjs-dist';\n\nexport const isPDFWorkerRegistered = (): boolean => {\n return !!pdfjsLib.GlobalWorkerOptions.workerSrc;\n};\n\nexport const getPDFWorkerPath = (): string | undefined => {\n return pdfjsLib.GlobalWorkerOptions.workerSrc;\n};\nexport const registerPDFWorker = (workerPath: string = '/worker/pdf.worker.min.js') => {\n try {\n if (pdfjsLib.GlobalWorkerOptions.workerSrc) {\n console.log('PDF Worker 已经注册:', pdfjsLib.GlobalWorkerOptions.workerSrc);\n return;\n }\n pdfjsLib.GlobalWorkerOptions.workerSrc = workerPath;\n console.log('PDF Worker 注册成功:', workerPath);\n } catch (error) {\n console.error('PDF Worker 注册失败:', error);\n }\n};\n"],"names":["DEFAULT_COLOR","generateId","Annotation","pageNumber","scale","isAnnotating","annotations","onAnnotationAdd","onAnnotationDelete","readOnly","containerRef","useRef","isDrawing","setIsDrawing","useState","startPoint","setStartPoint","currentRect","setCurrentRect","selectedAnnotation","setSelectedAnnotation","handleMouseDown","useCallback","e","rect","x","y","handleMouseMove","currentX","currentY","handleMouseUp","newAnnotation","handleAnnotationClick","annotationId","annotation","content","updatedAnnotation","a","React","anno","defaultTheme","LoadingText","styled","props","ErrorText","PdfRender","pdfDocument","currentPage","pdfStartPage","isSlidesMode","setScale","onScaleChange","onAnnotationChange","styles","isLoading","setIsLoading","error","setError","canvasSize","setCanvasSize","isInitialRender","setIsInitialRender","mergedTheme","canvasRef","pageRendering","pageCurrentNumber","calculateAutoScale","viewport","container","containerWidth","containerHeight","scaleX","scaleY","autoScale","finalScale","renderPage","relativePageNumber","page","canvas","context","useEffect","zoomTimer","getInitialZoom","boxWidth","naturalWidth","ContentContainer","LoadingContainer","ErrorContainer","markdownAnnotationStyles","detectFileType","data","fileName","fileType","renderPdfContent","_a","_b","_c","_d","_e","_f","_g","pdfAnnotations","defaultScale","renderImageContent","_h","_i","_j","_k","_l","_m","_n","imageUrl","imageLoading","setImageLoading","imageError","setImageError","handleImageLoad","handleImageError","renderTextContent","textContent","textRef","paperRef","timer","textHeight","minHeight","Markdownit","DataType","MarkdownContentView","parentProps","isTableMode","markdownRef","annotationTimeoutRef","tableObserverRef","tableReapplyInProgressRef","handleScroll","scrollTop","scrollHeight","handleScrollToTop","handleScrollToBottom","handleMarkdownRenderedRef","root","tableAnnotations","annoSig","runtimeSig","applyTableAnnotations","handleMarkdownRendered","handleTextSelection","selection","range","text","charCount","startOffset","walker","node","mdAnnotations","clearAllAnnotations","existingMdAnnotations","el","parent","clearTableAnnotations","table","row","cell","tables","i","offsets","offset","index","col","tableIndex","allRows","rowEl","targetColor","computedBg","applyMarkdownAnnotations","applyMarkdownAnnotationsInner","existingAnnotations","textNodes","totalLength","nodePositions","start","sortedAnnotations","b","end","color","relevantNodes","pos","nodeStart","localStart","localEnd","before","annotatedText","after","span","fragment","MinimalMarkdownTable","markdown","onRendered","rootRef","parseTable","md","lines","l","headerLineIdx","header","s","bodyLines","rows","apply","idx","tableEl","id","h","r","ri","c","ci","renderHtmlContent","_props","htmlContent","renderUnknownContent","Fviewer","annotationData","totalPage","userScale","rotation","eventsEmit","tools","customComponents","className","contentClass","loadingStatus","prevDataRef","prevContentRef","renderCountRef","renderContent","prevData","prevContent","dataChanged","contentChanged","toKebabCase","string","mergeClasses","classes","array","defaultAttributes","Icon","forwardRef","size","strokeWidth","absoluteStrokeWidth","children","iconNode","rest","ref","createElement","tag","attrs","createLucideIcon","iconName","Component","ChevronLeft","ChevronRight","Download","Pencil","RotateCcw","RotateCw","X","ZoomIn","ZoomOut","HeaderContainer","FileInfo","FileName","PageInfo","ToolBar","ToolButton","ZoomInfo","Header","onPrevPage","onNextPage","onZoomIn","onZoomOut","onAnnotationToggle","onDownload","onRotateLeft","onRotateRight","onClose","ensurePDFWorkerRegistered","isPDFWorkerRegistered","errorMsg","name","type","parsePdfFile","options","loadingTask","pdfjsLib","totalPages","result","errorMessage","parseImageFile","blob","resolve","reject","img","timeout","parseTextFile","response","parseMarkdownFile","markdownContent","parseHtmlFile","parseFile","ReaderContainer","DefaultLoadingComponent","status","theme","StaticFileReader","fileUrl","token","initialPage","headerClass","setLoadingStatus","parseResult","setParseResult","setCurrentPage","setRotation","setIsAnnotating","resetState","loadFile","detectedType","err","handleEventsEmit","innerFn","handleZoomIn","newScale","handleZoomOut","handlePrevPage","newPage","handleNextPage","handleAnnotationToggle","newAnnotating","handleDownload","handleRotateLeft","prev","handleRotateRight","handleClose","getDynamicTools","baseTools","isMultiPageFile","isTextBasedFile","loadingTools","errorTools","unknownTools","viewerData","dynamicTools","getPDFWorkerPath","registerPDFWorker","workerPath"],"mappings":";;;;AAIA,MAAMA,KAAgB,WAGhBC,KAAa,MACV,cAAc,KAAK,IAAA,CAAK,IAAI,KAAK,OAAA,EAAS,SAAS,EAAE,EAAE,OAAO,GAAG,CAAC,CAAC,IAa/DC,KAAwC,CAAC;AAAA,EACpD,YAAAC;AAAA,EACA,OAAAC;AAAA,EACA,cAAAC;AAAA,EACA,aAAAC,IAAc,CAAA;AAAA,EACd,iBAAAC;AAAA,EACA,oBAAAC;AAAA,EACA,UAAAC,IAAW;AACb,MAAM;AACJ,QAAMC,IAAeC,EAAuB,IAAI,GAC1C,CAACC,GAAWC,CAAY,IAAIC,EAAS,EAAK,GAC1C,CAACC,GAAYC,CAAa,IAAIF,EAAS,EAAE,GAAG,GAAG,GAAG,GAAG,GACrD,CAACG,GAAaC,CAAc,IAAIJ,EAK5B,IAAI,GACR,CAACK,GAAoBC,CAAqB,IAAIN,EAAwB,IAAI,GAI1EO,IAAkBC;AAAA,IACtB,CAACC,MAAwB;AACvB,UAAI,CAAClB,KAAgB,CAACK,EAAa,QAAS;AAE5C,YAAMc,IAAOd,EAAa,QAAQ,sBAAA,GAG5Be,KAAKF,EAAE,UAAUC,EAAK,QAAQA,EAAK,OACnCE,KAAKH,EAAE,UAAUC,EAAK,OAAOA,EAAK;AAExC,cAAQ,IAAI,yCAAW,EAAE,SAASD,EAAE,SAAS,SAASA,EAAE,SAAS,MAAAC,GAAM,GAAAC,GAAG,GAAAC,GAAG,OAAAtB,GAAO,GACpFS,EAAa,EAAI,GACjBG,EAAc,EAAE,GAAAS,GAAG,GAAAC,GAAG;AAAA,IACxB;AAAA,IACA,CAACrB,GAAcD,CAAK;AAAA,EAAA,GAGhBuB,IAAkBL;AAAA,IACtB,CAACC,MAAwB;AACvB,UAAI,CAACX,KAAa,CAACF,EAAa,QAAS;AAEzC,YAAMc,IAAOd,EAAa,QAAQ,sBAAA,GAG5BkB,KAAYL,EAAE,UAAUC,EAAK,QAAQA,EAAK,OAC1CK,KAAYN,EAAE,UAAUC,EAAK,OAAOA,EAAK;AAE/C,MAAAN,EAAe;AAAA,QACb,GAAG,KAAK,IAAIH,EAAW,GAAGa,CAAQ;AAAA,QAClC,GAAG,KAAK,IAAIb,EAAW,GAAGc,CAAQ;AAAA,QAClC,OAAO,KAAK,IAAID,IAAWb,EAAW,CAAC;AAAA,QACvC,QAAQ,KAAK,IAAIc,IAAWd,EAAW,CAAC;AAAA,MAAA,CACzC;AAAA,IACH;AAAA,IACA,CAACH,GAAWG,GAAYX,CAAK;AAAA,EAAA,GAGzB0B,IAAgBR,EAAY,MAAM;AACtC,QAAI,CAACV,KAAa,CAACK,EAAa;AAGhC,QADAJ,EAAa,EAAK,GACdI,EAAY,QAAQ,KAAKA,EAAY,SAAS,GAAG;AACnD,MAAAC,EAAe,IAAI;AACnB;AAAA,IACF;AAEA,UAAMa,IAAgC;AAAA,MACpC,IAAI9B,GAAA;AAAA,MACJ,YAAAE;AAAA,MACA,GAAGc;AAAA,MACH,SAAS;AAAA,MACT,OAAOjB;AAAA,IAAA;AAGT,IAAAO,KAAA,QAAAA,EAAkBwB,CAAA,GAClBb,EAAe,IAAI;AAAA,EACrB,GAAG,CAACN,GAAWK,GAAad,GAAYI,CAAe,CAAC,GAElDyB,IAAwBV,EAAY,CAACW,MAAyB;AAClE,IAAAb,EAAsBD,MAAuBc,IAAe,OAAOA,CAAY;AAAA,EACjF,GAAG,CAACd,CAAkB,CAAC;AAEK,SAAAG,EAAY,CAACY,GAA4BC,MAAoB;AACvF,UAAMC,IAAoB;AAAA,MACxB,GAAGF;AAAA,MACH,SAAAC;AAAA,IAAA;AAEF,IAAA5B,KAAA,QAAAA,EAAkB6B,CAAA;AAAA,EACpB,GAAG,CAAC7B,CAAe,CAAC,GAEWe,EAAY,CAACW,MAAyB;AACnE,IAAAzB,KAAA,QAAAA,EAAqByB,CAAA,GACrBb,EAAsB,IAAI;AAAA,EAC5B,GAAG,CAACZ,CAAkB,CAAC,GAEvB,QAAQ,IAAI,yCAAW;AAAA,IACrB,YAAAL;AAAA,IACA,aAAaG,EAAY;AAAA,IACzB,6BAA6BA,EAAY,OAAO,OAAK+B,EAAE,eAAelC,CAAU,EAAE;AAAA,IAClF,wBAAwBG,EAAY,OAAO,CAAA+B,MAAKA,EAAE,eAAelC,CAAU;AAAA,EAAA,CAC5E,GAGC,gBAAAmC,EAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,KAAK5B;AAAA,MACL,OAAO;AAAA,QACL,UAAU;AAAA,QACV,KAAK;AAAA,QACL,MAAM;AAAA,QACN,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,eAAe;AAAA;AAAA,MAAA;AAAA,MAEjB,aAAaW;AAAA,MACb,aAAaM;AAAA,MACb,WAAWG;AAAA,MACX,cAAcA;AAAA,IAAA;AAAA,IAGbb,KACC,gBAAAqB,EAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,WAAU;AAAA,QACV,OAAO;AAAA,UACL,MAAM,GAAGrB,EAAY,IAAI,GAAG;AAAA,UAC5B,KAAK,GAAGA,EAAY,IAAI,GAAG;AAAA,UAC3B,OAAO,GAAGA,EAAY,QAAQ,GAAG;AAAA,UACjC,QAAQ,GAAGA,EAAY,SAAS,GAAG;AAAA,QAAA;AAAA,MACrC;AAAA,IAAA;AAAA,IAKHX,EACE,OAAO,CAAAiC,MAAQA,EAAK,eAAepC,CAAU,EAC7C,IAAI,CAAA+B,OACH,QAAQ,IAAI,6BAASA,EAAW,IAAI,iBAAOA,EAAW,IAAI,GAAG,MAAMA,EAAW,IAAI,GAAG,GAAG,GAEtF,gBAAAI,EAAA,cAAC,OAAA,EAAI,KAAKJ,EAAW,IAAI,OAAO;AAAA,MAC9B,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,KAAK;AAAA,MACL,MAAM;AAAA,IAAA,EAER,GACkB,gBAAAI,EAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACb,WAAU;AAAA,QACV,OAAO;AAAA,UACL,UAAU;AAAA,UACV,MAAM,GAAGJ,EAAW,IAAI,GAAG;AAAA,UAC3B,KAAK,GAAGA,EAAW,IAAI,GAAG;AAAA,UAC1B,OAAO,GAAGA,EAAW,QAAQ,GAAG;AAAA,UAChC,QAAQ,GAAGA,EAAW,SAAS,GAAG;AAAA,UAClC,aAAa;AAAA,UACb,aAAa,GAAGA,EAAW,KAAK;AAAA,UAChC,iBAAiB,GAAGA,EAAW,KAAK;AAAA;AAAA,UACpC,QAAQ;AAAA,QAAA;AAAA,QAEZ,SAAS,MAAMF,EAAsBE,EAAW,EAAE;AAAA,MAAA;AAAA,IAAA,CAEtD,EAEH;AAAA,EAAA;AAGT,GCjLMM,KAAyB;AAAA,EAC7B,QAAQ;AAAA,IACN,SAAS;AAAA,IACT,WAAW;AAAA,IACX,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAO;AAAA,IACP,MAAM;AAAA,IACN,YAAY;AAAA,IACZ,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,oBAAoB;AAAA,IACpB,cAAc;AAAA,EAAA;AAAA,EAEhB,OAAO;AAAA,IACL,SAAS;AAAA,IACT,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,YAAY;AAAA,EAAA;AAEhB,GAuCMC,KAAcC,EAAO;AAAA;AAAA;AAAA;AAAA;AAAA,WAKhB,CAAAC,MAASA,EAAM,OAAO,OAAO,YAAY;AAAA;AAAA,GAI9CC,KAAYF,EAAO;AAAA;AAAA;AAAA;AAAA;AAAA,WAKd,CAAAC,MAASA,EAAM,OAAO,OAAO,KAAK;AAAA;AAAA;AAAA,GAYvCE,KAAsC,CAAC;AAAA,EAC3C,aAAAC;AAAA,EACA,aAAAC;AAAA,EACA,cAAAC,IAAe;AAAA;AAAA,EACf,OAAA5C;AAAA,EACA,aAAAE;AAAA,EACA,cAAAD;AAAA,EACA,cAAA4C,IAAe;AAAA,EACf,UAAAC;AAAA,EACA,eAAAC;AAAA,EACA,oBAAAC;AAAA,EACA,oBAAA5C;AAAA,EACA,QAAA6C;AACF,MAAM;AACJ,QAAM,CAACC,GAAWC,CAAY,IAAIzC,EAAS,EAAK,GAC1C,CAAC0C,GAAOC,CAAQ,IAAI3C,EAAwB,IAAI,GAChD,CAAC4C,GAAYC,CAAa,IAAI7C,EAAc,IAAI,GAChD,CAAC8C,GAAiBC,CAAkB,IAAI/C,EAAS,EAAI,GAGrDgD,KAAcT,uBAAQ,UAASb,IAC/BuB,IAAYpD,EAA0B,IAAI,GAC1CD,IAAeC,EAAuB,IAAI,GAC1CqD,IAAgBrD,EAAO,EAAK,GAC5BsD,IAAoBtD,EAAsB,IAAI,GAK9CuD,IAAqB5C;AAAA,IACzB,CAAC6C,MAAkB;AACjB,UAAI,CAACzD,EAAa,WAAW,CAACkD,KAAmB,CAACT,EAAe,QAAO;AAExE,YAAMiB,IAAY1D,EAAa,SACzB2D,IAAiBD,EAAU,cAAc,IACzCE,IAAkBF,EAAU,eAAe,IAG3CG,IAASF,IAAiBF,EAAS,OACnCK,IAASF,IAAkBH,EAAS,QAGpCM,IAAY,KAAK,IAAIF,GAAQC,GAAQ,CAAC,GAGtCE,IAAa,KAAK,IAAI,KAAK,KAAK,IAAI,GAAGD,CAAS,CAAC;AAEvD,qBAAQ,IAAI,qDAAa;AAAA,QACvB,gBAAAJ;AAAA,QACA,iBAAAC;AAAA,QACA,eAAeH,EAAS;AAAA,QACxB,gBAAgBA,EAAS;AAAA,QACzB,QAAAI;AAAA,QACA,QAAAC;AAAA,QACA,WAAAC;AAAA,QACA,YAAAC;AAAA,MAAA,CACD,GAEMA;AAAA,IACT;AAAA,IACA,CAACd,GAAiBT,CAAa;AAAA,EAAA,GAM3BwB,IAAarD,EAAY,YAAY;AACzC,QAAI,GAACwB,KAAe,CAACiB,EAAU,UAG/B;AAAA,UAAIC,EAAc,WAAWC,EAAkB,YAAYlB,GAAa;AACtE,gBAAQ,IAAI,8DAAY;AACxB;AAAA,MACF;AAEA,UAAI;AACF,QAAAkB,EAAkB,UAAUlB,GAC5BiB,EAAc,UAAU;AAGxB,cAAMY,IAAqB7B,IAAcC,IAAe;AAMxD,YALA,QAAQ;AAAA,UACN,6FAAiCA,CAAY,+CAAsBD,CAAW,8BAAU6B,CAAkB;AAAA,QAAA,GAIxGA,IAAqB,KAAKA,IAAqB9B,EAAY;AAC7D,wBAAQ;AAAA,YACN,kEAAgB8B,CAAkB,2BAAY9B,EAAY,QAAQ;AAAA,UAAA,GAE9D,IAAI;AAAA,YACR,2DAAcC,CAAW,sDAAcD,EAAY,QAAQ;AAAA,UAAA;AAI/D,cAAM+B,IAAO,MAAM/B,EAAY,QAAQ8B,CAAkB,GACnDE,IAASf,EAAU,SAEnBgB,IAAUD,EAAO,WAAW,IAAI;AAGtC,gBAAQ,IAAI,4BAAa1E,CAAK;AAC9B,cAAM+D,IAAWU,EAAK,YAAY,EAAE,OAAO,GAAG;AAqB9C,YApBA,QAAQ,IAAI,yBAAeV,EAAS,OAAO,KAAKA,EAAS,MAAM,GAG3DP,KACFC,EAAmB,EAAK,GAE1BiB,EAAO,QAAQX,EAAS,OACxBW,EAAO,SAASX,EAAS,QACrBW,EAAO,SAASA,EAAO,UACzBnB,EAAc,EAAE,OAAOmB,EAAO,OAAO,QAAQA,EAAO,QAAQ,GAG9D,MAAMD,EAAK,OAAO;AAAA,UAChB,eAAeE;AAAA,UACf,UAAAZ;AAAA,QAAA,CACD,EAAE,SAEH,QAAQ,IAAI,oDAAsBW,EAAO,OAAO,KAAKA,EAAO,MAAM,GAG9DpE,EAAa,SAAS;AACxB,gBAAM0D,IAAY1D,EAAa;AAC/B,kBAAQ,IAAI,6BAAS0D,EAAU,aAAa,KAAKA,EAAU,YAAY,GACvE,QAAQ,IAAI,mCAAeU,EAAO,aAAa,KAAKA,EAAO,YAAY;AAAA,QACzE;AAAA,MACF,SAAStB,GAAO;AACd,gBAAQ,MAAM,gCAAYA,CAAK;AAAA,MACjC,UAAA;AACE,QAAAQ,EAAc,UAAU;AAAA,MAC1B;AAAA;AAAA,EACF,GAAG,CAAClB,GAAa1C,GAAO4C,GAAckB,GAAoBf,GAAeJ,CAAW,CAAC;AAuBrF,MApBAiC,GAAU,MAAM;AACd,IAAIlC,KAAeC,KAAeC,MAChC,QAAQ;AAAA,MACN;AAAA,MACA,kBAAkBA;AAAA,MAClB,iBAAiBD;AAAA,MACjB;AAAA,MACAD;AAAA,IAAA,GAEF6B,EAAA;AAAA,EAEJ,GAAG,CAAC5B,GAAaD,GAAaE,CAAY,CAAC,GAG3CgC,GAAU,MAAM;AACd,IAAIlC,KAAeC,KACjB4B,EAAA;AAAA,EAEJ,GAAG,CAACvE,GAAO0C,GAAaC,CAAW,CAAC,GAEhCO;AACF,WACE,gBAAAhB,EAAA,cAAC,SAAI,WAAU,8CAAA,mCACZG,IAAA,EAAY,QAAQqB,EAAA,GAAa,uBAAM,CAC1C;AAIJ,MAAIN;AACF,WACE,gBAAAlB,EAAA,cAAC,OAAA,EAAI,WAAU,8CAAA,GACb,gBAAAA,EAAA,cAACM,IAAA,EAAU,QAAQkB,EAAA,GACjB,gBAAAxB,EAAA,cAAC,OAAA,MACC,gBAAAA,EAAA,cAAC,OAAA,MAAI,0BAAI,GACT,gBAAAA,EAAA,cAAC,OAAA,EAAI,OAAO,EAAE,UAAU,QAAQ,WAAW,MAAA,EAAM,GAAIkB,CAAM,CAC7D,CACF,CACF;AAIJ,QAAMyB,IAAiBtE,EAAO,IAAI,GAC5BuE,IAAiB,MAAM;AAC3B,UAAMC,IAAWzE,EAAa,UAAUA,EAAa,QAAQ,cAAc,KAAK;AAEhF,QADI,CAACyE,KACD,EAACzB,eAAY,OAAO;AACxB,UAAM0B,IAAe1B,EAAW,OAE1BgB,IAAa,EADDS,IAAWC,GACC,QAAQ,CAAC;AACvC,IAAI,OAAOV,KAAe,WACxBxB,KAAYA,EAAS,KAAK,IAAIwB,GAAY,CAAC,CAAC,KAE5C,cAAcO,EAAU,OAAO,GAC/BA,EAAU,UAAU;AAAA,EAExB;AAEA,SAAAD,GAAU,MAAM;AACd,QAAI,CAACtE,EAAa,WAAW,EAACgD,eAAY,UAAS,EAACA,eAAY,SAAQ;AACtE,oBAAcuB,EAAU,OAAO,GAC/BA,EAAU,UAAU,MACpBA,EAAU,UAAU,YAAY,MAAM;AACpC,QAAAC,EAAA;AAAA,MACF,GAAG,EAAE;AACL;AAAA,IACF;AACE,MAAAA,EAAA;AAEF,WAAO,MAAM;AACX,oBAAcD,EAAU,OAAO,GAC/BA,EAAU,UAAU;AAAA,IACtB;AAAA,EACF,GAAG,CAACvB,CAAU,CAAC,GAIb,gBAAApB,EAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,KAAK5B;AAAA,MACL,WAAU;AAAA,MACV,OAAO;AAAA,QACL,SAASuC,IAAe,UAAU;AAAA,QAClC,gBAAgBA,IAAe,YAAY;AAAA,QAC3C,YAAYA,IAAe,YAAY;AAAA,QACvC,SAAS;AAAA,QACT,WAAW;AAAA,QACX,OAAO;AAAA;AAAA,QAEP,UAAU;AAAA,MAAA;AAAA,IACZ;AAAA,IAECK,IACC,gBAAAhB,EAAA,cAAC,OAAA,EAAI,WAAU,yCAAA,mCACZ,OAAA,EAAI,WAAU,+DAAA,CAA+D,mCAC7E,OAAA,EAAI,WAAU,wBAAA,GAAwB,0BAAS,CAClD,IACEkB,IACF,gBAAAlB,EAAA,cAAC,OAAA,EAAI,WAAU,yDACb,gBAAAA,EAAA,cAAC,OAAA,MAAI,0BAAI,GACT,gBAAAA,EAAA,cAAC,OAAA,EAAI,WAAU,UAAA,GAAWkB,CAAM,CAClC,IAEA,gBAAAlB,EAAA,cAAC,OAAA,EAAI,WAAU,kCAAA,GACb,gBAAAA,EAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,WAAU;AAAA,QACV,OAAO;AAAA,UACL,WAAW,SAASlC,CAAK;AAAA,UACzB,iBAAiB;AAAA,UACjB,SAAS;AAAA;AAAA,QAAA;AAAA,MACX;AAAA,MAEA,gBAAAkC,EAAA;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,KAAKyB;AAAA,UACL,WAAU;AAAA,UACV,OAAO;AAAA,YACL,SAAS;AAAA,UAAA;AAAA,QACX;AAAA,MAAA;AAAA,MAEF,gBAAAzB,EAAA;AAAA,QAACpC;AAAA,QAAA;AAAA,UACC,YAAY6C;AAAA,UACZ,OAAO3C,KAAS;AAAA,UAChB,cAAAC;AAAA,UACA,aAAAC;AAAA,UACA,iBAAiB8C;AAAA,UACjB,oBAAA5C;AAAA,UACA,UAAU,CAACH;AAAA,QAAA;AAAA,MAAA;AAAA,IACb,CAEJ;AAAA,EAAA;AAIR,GC1SMgF,KAAmB3C,EAAO;AAAA;AAAA,gBAEhB,CAAAC,MAASA,EAAM,OAAO,OAAO,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAajD2C,KAAmB5C,EAAO;AAAA;AAAA;AAAA;AAAA;AAAA,WAKrB,CAAAC,MAASA,EAAM,OAAO,OAAO,YAAY;AAAA,GAG9C4C,KAAiB7C,EAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,WAMnB,CAAAC,MAASA,EAAM,OAAO,OAAO,KAAK;AAAA;AAAA;AAAA,GAMvC6C,KAA2B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAmF3BhD,KAAyB;AAAA,EAC7B,QAAQ;AAAA,IACN,SAAS;AAAA,IACT,WAAW;AAAA,IACX,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAO;AAAA,IACP,MAAM;AAAA,IACN,YAAY;AAAA,IACZ,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,oBAAoB;AAAA,IACpB,cAAc;AAAA,EAAA;AAAA,EAEhB,OAAO;AAAA,IACL,SAAS;AAAA,IACT,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,YAAY;AAAA,EAAA;AAEhB,GAKMiD,KAAiB,CAACC,MAAwB;AAI9C,MAHA,QAAQ,IAAI,qCAA2B,GACvC,QAAQ,IAAI,6BAASA,CAAI,GAErB,CAACA;AACH,mBAAQ,IAAI,oDAAiB,GACtB;AAGT,QAAMC,IAAWD,EAAK,YAAY,IAC5BE,IAAWF,EAAK,YAAY,IAC5BvD,IAAUuD,EAAK;AAKrB,SAHA,QAAQ,IAAI,6BAAS,EAAE,UAAAC,GAAU,UAAAC,GAAU,SAAAzD,GAAS,GAGhDyD,MAAa,SAASA,MAAa,gBACrC,QAAQ,IAAI,mCAAU,GACfA,KAELA,MAAa,WACf,QAAQ,IAAI,4CAAS,GACd,WAELA,MAAa,oBACf,QAAQ,IAAI,oDAAiB,GACtB,oBAELA,MAAa,cACf,QAAQ,IAAI,wCAAe,GACpB,cAELA,MAAa,UACf,QAAQ,IAAI,oCAAW,GAChB,UAELA,MAAa,UACf,QAAQ,IAAI,4CAAS,GACd,UAILD,EAAS,cAAc,SAAS,MAAM,MAAKxD,KAAA,OAAA,SAAAA,EAAS,UAAS,SAC/D,QAAQ,IAAI,mCAAU,GACf,SAELwD,EAAS,cAAc,MAAM,gCAAgC,MAAKxD,KAAA,OAAA,SAAAA,EAAS,UAAS,WACtF,QAAQ,IAAI,4CAAS,GACd,WAELwD,EAAS,cAAc,SAAS,KAAK,MAAKxD,KAAA,OAAA,SAAAA,EAAS,UAAS,cAC9D,QAAQ,IAAI,wCAAe,GACpB,cAELwD,EAAS,cAAc,MAAM,eAAe,MAAKxD,KAAA,OAAA,SAAAA,EAAS,UAAS,UACrE,QAAQ,IAAI,oCAAW,GAChB,UAELwD,EAAS,cAAc,MAAM,iCAAiC,MAAKxD,KAAA,OAAA,SAAAA,EAAS,UAAS,UACvF,QAAQ,IAAI,4CAAS,GACd,WAGT,QAAQ,IAAI,4EAAqB,GAC1B;AACT,GAKM0D,KAAmB,CACvBH,GACA/C,GACAM,IAAwB,IACxBC,IAAkD,WAC/C;AApSL,MAAA4C,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC;AAqSE,UAAQ;AAAA,IACN;AAAA,IACA,kBAAkBV,EAAK;AAAA,IACvB,iBAAiB/C,EAAM;AAAA,EAAA,GAEzB,QAAQ,IAAI,uCAA6B,GACzC,QAAQ,IAAI,oBAAU+C,CAAI,GAC1B,QAAQ,IAAI,qBAAUI,IAAAJ,EAAK,YAAL,kBAAc,QAAQ,GAC5C,QAAQ,IAAI,gCAAY,SAAOK,IAAAL,EAAK,YAAL,kBAAc,SAAQ,GACrD,QAAQ,IAAI,4CAAiBM,IAAAN,EAAK,YAAL,OAAA,SAAAM,EAAc,cAAa,IAAI,GAC5D,QAAQ,IAAI,iDAAsBC,IAAAP,EAAK,YAAL,OAAA,SAAAO,EAAc,cAAa,MAAS,GACtE,QAAQ;AAAA,IACN;AAAA,KACAC,IAAAR,EAAK,YAAL,QAAAQ,EAAc,WACV,OAAO,oBAAoB,OAAO,eAAeR,EAAK,QAAQ,QAAQ,CAAC,IACvE;AAAA,EAAA,GAEN,QAAQ;AAAA,IACN;AAAA,KACAS,IAAAT,EAAK,YAAL,QAAAS,EAAc,WAAW,OAAO,KAAKT,EAAK,QAAQ,QAAQ,IAAI;AAAA,EAAA;AAIhE,QAAM1C,IAAe0C,EAAK,gBAAgB;AAC1C,UAAQ,IAAI,0BAAW1C,CAAY;AAGnC,QAAMqD,KAAkB1D,EAAM,kBAAkB,CAAA,GAAI;AAAA,IAClD,CAAAJ,MAAQ,gBAAgBA,KAAQ,OAAOA,KAAQ,OAAOA;AAAA,EAAA;AAGxD,UAAQ,IAAI,qCAAiB,GAC7B,QAAQ,IAAI,+BAAqBI,EAAM,cAAc,GACrD,QAAQ,IAAI,2CAAuB0D,CAAc;AAGjD,QAAMC,IAAerD,IAAe,OAAO,GAGrCyB,IAAa/B,EAAM,eAAeA,EAAM,SAAS2D;AAEvD,SACE,gBAAAhE,EAAA;AAAA,IAACO;AAAA,IAAA;AAAA,MACC,eAAauD,IAAAV,EAAK,YAAL,OAAA,SAAAU,EAAc,aAAY;AAAA,MACvC,aAAazD,EAAM,eAAe;AAAA,MAClC,cAAAK;AAAA,MACA,OAAO0B;AAAA,MACP,UAAAxB;AAAA,MACA,aAAamD;AAAA,MACb,cAAc;AAAA,MACd,cAAApD;AAAA,MACA,cACEN,EAAM,aACF,CAACxC,MAAoB;AA1VjC,YAAA2F;AA0VoC,gBAAAA,IAAAnD,EAAM,eAAN,OAAA,SAAAmD,EAAA,KAAAnD,GAAmB,cAAc,EAAE,YAAAxC,EAAA,CAAW;AAAA,MAAA,IACtE;AAAA,MAEN,eACEwC,EAAM,aACF,CAACvC,MAAe;AA/V5B,YAAA0F;AA+V+B,gBAAAA,IAAAnD,EAAM,eAAN,OAAA,SAAAmD,EAAA,KAAAnD,GAAmB,eAAe,EAAE,OAAAvC,EAAA,CAAM;AAAA,MAAA,IAC7D;AAAA,MAEN,oBACEuC,EAAM,aACF,CAACT,MAAwB;AApWrC,YAAA4D;AAoWwC,gBAAAA,IAAAnD,EAAM,eAAN,OAAA,SAAAmD,EAAA,KAAAnD,GAAmB,oBAAoB,EAAE,YAAAT,EAAA,CAAW;AAAA,MAAA,IAChF;AAAA,MAEN,oBACES,EAAM,aACF,CAACV,MAAsB;AAzWnC,YAAA6D;AAyWsC,gBAAAA,IAAAnD,EAAM,eAAN,OAAA,SAAAmD,EAAA,KAAAnD,GAAmB,oBAAoB,EAAE,cAAAV,EAAA,CAAa;AAAA,MAAA,IAChF;AAAA,MAEN,QAAQU,EAAM;AAAA,IAAA;AAAA,EAAA;AAGpB,GAKM4D,KAAqB,CAACb,GAAW/C,MAAwB;AApX/D,MAAAmD,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAI,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC;AAqXE,UAAQ,IAAI,oCAAoC,GAChD,QAAQ,IAAI,SAASpB,CAAI,GACzB,QAAQ,IAAI,iBAAiBA,EAAK,OAAO,GACzC,QAAQ,IAAI,uBAAsBI,IAAAJ,EAAK,YAAL,kBAAc,GAAG,GACnD,QAAQ,IAAI,aAAa/C,EAAM,QAAQ;AAEvC,QAAMoE,MAAWhB,IAAAL,EAAK,YAAL,OAAA,SAAAK,EAAc,QAAOL,EAAK,SACrC,CAACsB,GAAcC,CAAe,IAAInG,EAAS,EAAI,GAC/C,CAACoG,GAAYC,CAAa,IAAIrG,EAAS,EAAK,GAE5CsG,IAAkB,MAAM;AAC5B,YAAQ,IAAI,yCAAWL,CAAQ,GAC/BE,EAAgB,EAAK,GACrBE,EAAc,EAAK;AAAA,EACrB,GAEME,IAAmB,MAAM;AAC7B,YAAQ,MAAM,yCAAWN,CAAQ,GACjCE,EAAgB,EAAK,GACrBE,EAAc,EAAI;AAAA,EACpB;AAEA,SACE,gBAAA7E,EAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,OAAO;AAAA,QACL,SAAS;AAAA,QACT,gBAAgB;AAAA,QAChB,YAAY;AAAA,QACZ,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,UAAU;AAAA,QACV,UAAU;AAAA,QACV,iBAAiB;AAAA;AAAA,MAAA;AAAA,IACnB;AAAA,IAEC0E,KACC,gBAAA1E,EAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,OAAO;AAAA,UACL,UAAU;AAAA,UACV,KAAK;AAAA,UACL,MAAM;AAAA,UACN,WAAW;AAAA,UACX,SAAS;AAAA,UACT,eAAe;AAAA,UACf,YAAY;AAAA,UACZ,KAAK;AAAA,UACL,QAAQ;AAAA,QAAA;AAAA,MACV;AAAA,MAEA,gBAAAA,EAAA;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,OAAO;AAAA,YACL,OAAO;AAAA,YACP,QAAQ;AAAA,YACR,QAAQ,eAAa4D,KAAAD,KAAAD,IAAArD,EAAM,WAAN,OAAA,SAAAqD,EAAc,UAAd,OAAA,SAAAC,EAAqB,WAArB,OAAA,SAAAC,EAA6B,WAAU,SAAS;AAAA,YACrE,WAAW,eAAaM,KAAAJ,KAAAD,IAAAxD,EAAM,WAAN,OAAA,SAAAwD,EAAc,UAAd,OAAA,SAAAC,EAAqB,WAArB,OAAA,SAAAI,EAA6B,YAAW,SAAS;AAAA,YACzE,cAAc;AAAA,YACd,WAAW;AAAA,UAAA;AAAA,QACb;AAAA,MAAA;AAAA,MAEF,gBAAAlE,EAAA;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,OAAO;AAAA,YACL,UAAU;AAAA,YACV,SAAOqE,gBAAM,WAAN,OAAA,SAAAF,EAAc,UAAd,OAAA,SAAAC,EAAqB,WAArB,kBAA6B,SAAQ;AAAA,UAAA;AAAA,QAC9C;AAAA,QACD;AAAA,MAAA;AAAA,IAED;AAAA,IAIHQ,KACC,gBAAA5E,EAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,OAAO;AAAA,UACL,UAAU;AAAA,UACV,KAAK;AAAA,UACL,MAAM;AAAA,UACN,WAAW;AAAA,UACX,SAAS;AAAA,UACT,eAAe;AAAA,UACf,YAAY;AAAA,UACZ,KAAK;AAAA,UACL,QAAQ;AAAA,QAAA;AAAA,MACV;AAAA,MAEA,gBAAAA,EAAA;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,OAAO;AAAA,YACL,UAAU;AAAA,YACV,SAAOwE,gBAAM,WAAN,OAAA,SAAAF,EAAc,UAAd,OAAA,SAAAC,EAAqB,WAArB,kBAA6B,UAAS;AAAA,UAAA;AAAA,QAC/C;AAAA,QACD;AAAA,MAAA;AAAA,IAED;AAAA,IAIJ,gBAAAvE,EAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,KAAKyE;AAAA,QACL,KAAKrB,EAAK,YAAY;AAAA,QACtB,QAAQ0B;AAAA,QACR,SAASC;AAAA,QACT,OAAO;AAAA,UACL,UAAU;AAAA,UACV,WAAW;AAAA,UACX,WAAW;AAAA,UACX,WAAW,SAAS1E,EAAM,SAAS,CAAC,YAAYA,EAAM,YAAY,CAAC;AAAA,UACnE,SAASqE,IAAe,IAAI;AAAA,UAC5B,YAAY;AAAA,QAAA;AAAA,MACd;AAAA,IAAA;AAAA,oCAGD,SAAA,MAAO;AAAA;AAAA;AAAA;AAAA;AAAA,OAKN;AAAA,EAAA;AAGR,GAKMM,KAAoB,CAAC5B,GAAW/C,MAAwB;AAhf9D,MAAAmD,GAAAC,GAAAC,GAAAC,GAAAC;AAifE,UAAQ,IAAI,mCAAmC,GAC/C,QAAQ,IAAI,SAASR,CAAI,GACzB,QAAQ,IAAI,iBAAiBA,EAAK,OAAO;AAGzC,MAAI6B,IAAc;AAClB,EAAI,OAAO7B,EAAK,WAAY,WAC1B6B,IAAc7B,EAAK,WACVI,IAAAJ,EAAK,YAAL,QAAAI,EAAc,OAEvByB,IAAc7B,EAAK,QAAQ,QAClBK,IAAAL,EAAK,YAAL,QAAAK,EAAc,YAEvBwB,IAAc7B,EAAK,QAAQ,UAE7B,QAAQ,IAAI,yCAAW6B,CAAW;AAGlC,QAAMC,IAAU7G,EAAuB,IAAI,GACrC8G,IAAW9G,EAAuB,IAAI;AAG5C,SAAAqE,GAAU,MAAM;AACd,QAAIwC,EAAQ,WAAWC,EAAS,WAAWF,GAAa;AAEtD,YAAMG,IAAQ,WAAW,MAAM;AA1gBrC,YAAA5B;AA2gBQ,cAAM6B,MAAa7B,IAAA0B,EAAQ,YAAR,OAAA,SAAA1B,EAAiB,iBAAgB,GAC9C8B,IAAY,KAAK,IAAID,IAAa,IAAI,GAAG;AAE/C,QAAIF,EAAS,YACXA,EAAS,QAAQ,MAAM,YAAY,GAAGG,CAAS,MAC/C,QAAQ,IAAI,iEAAeA,CAAS;AAAA,MAExC,GAAG,GAAG;AAEN,aAAO,MAAM,aAAaF,CAAK;AAAA,IACjC;AAAA,EACF,GAAG,CAACH,CAAW,CAAC,GAGd,gBAAAjF,EAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,OAAO;AAAA,QACL,QAAQ;AAAA,QACR,UAAU;AAAA,QACV,iBAAiB;AAAA;AAAA,QACjB,SAAS;AAAA,QACT,SAAS;AAAA,QACT,gBAAgB;AAAA,QAChB,UAAU;AAAA,MAAA;AAAA,IACZ;AAAA,IAGA,gBAAAA,EAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,KAAKmF;AAAA,QACL,OAAO;AAAA,UACL,OAAO;AAAA,UACP,UAAU;AAAA,UACV,iBAAiB;AAAA,UACjB,WAAW;AAAA,UACX,cAAc;AAAA,UACd,SAAS;AAAA,UACT,QAAQ;AAAA,UACR,UAAU;AAAA,UACV,WAAW,SAAS9E,EAAM,SAAS,CAAC;AAAA,UACpC,YAAY;AAAA,UACZ,iBAAiB;AAAA,QAAA;AAAA,MACnB;AAAA,MAGA,gBAAAL,EAAA;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,KAAKkF;AAAA,UACL,OAAO;AAAA,YACL,OAAO;AAAA,YACP,UAAU;AAAA,UAAA;AAAA,QACZ;AAAA,QAEA,gBAAAlF,EAAA;AAAA,UAACuF;AAAA,UAAA;AAAA,YACC,YAAY;AAAA,cACV,MAAMC,GAAS;AAAA,cACf,SAASP;AAAA,YAAA;AAAA,YAEX,MAAK;AAAA,YACL,OAAO;AAAA,cACL,gBAAcrB,gBAAM,WAAN,OAAA,SAAAF,EAAc,UAAd,OAAA,SAAAC,EAAqB,WAArB,kBAA6B,YAAW;AAAA,cACtD,iBAAiB;AAAA,cACjB,WAAW;AAAA,cACX,aAAa;AAAA,cACb,cAAc;AAAA,cACd,SAAS;AAAA,YAAA;AAAA,YAEX,OAAO;AAAA,cACL,QAAQ;AAAA,cACR,YAAY;AAAA,cACZ,OAAO;AAAA,cACP,QAAQ;AAAA,cACR,UAAU;AAAA,cACV,YAAY;AAAA,YAAA;AAAA,UACd;AAAA,QAAA;AAAA,MACF;AAAA,MAIF,gBAAA3D,EAAA;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,OAAO;AAAA,YACL,UAAU;AAAA,YACV,KAAK;AAAA,YACL,MAAM;AAAA,YACN,OAAO;AAAA,YACP,QAAQ;AAAA,YACR,YAAY;AAAA,YACZ,qBAAqB;AAAA,YACrB,sBAAsB;AAAA,UAAA;AAAA,QACxB;AAAA,MAAA;AAAA,IACF;AAAA,EACF;AAGN,GAMMyF,KAID,CAAC,EAAE,MAAArC,GAAM,aAAAsC,GAAa,aAAAC,IAAc,SAAY;AAhnBrD,MAAAnC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAI,GAAAC,GAAAC,GAAAC,GAAAC;AAinBE,QAAMsB,IAAcvH,EAAuB,IAAI,GACzCwH,IAAuBxH,EAAsB,IAAI,GACjDyH,IAAmBzH,EAAgC,IAAI,GACvD0H,IAA4B1H,EAAgB,EAAK;AAC7B,EAAAA,EAAe,CAAC,GACXA,EAAsB,IAAI;AACzD,QAAM,CAACN,CAAY,IAAIS,EAAS,EAAK,GAE/BwH,IAAe,CAACC,GAAmBC,MAAyB;AAChE,YAAQ,IAAI,wDAA0B,GACtC,QAAQ,IAAI,6BAAS,EAAE,WAAAD,GAAW,cAAAC,GAAc,GAE5CR,EAAY,cAEdA,EAAY,WAAW,mBAAmB,EAAE,WAAAO,GAAW,cAAAC,GAAc;AAAA,EAEzE,GAEMC,IAAoB,MAAM;AAC9B,YAAQ,IAAI,kDAAyB,GACjCT,EAAY,cACdA,EAAY,WAAW,wBAAwB;AAAA,EAEnD,GAEMU,IAAuB,MAAM;AACjC,YAAQ,IAAI,kDAAyB,GACjCV,EAAY,cACdA,EAAY,WAAW,2BAA2B;AAAA,EAEtD,GAGMW,IAA4BhI,EAAA;AAClC,EAAAgI,EAA0B,UAAU,CAACC,MAAsB;AAnpB7D,QAAA9C,GAAAC;AAopBI,QAAI;AACF,UAAI,CAACkC,EAAa;AAClB,YAAM9F,IAAU,OAAOuD,EAAK,WAAY,WAAWA,EAAK,YAAUI,IAAAJ,EAAK,YAAL,OAAA,SAAAI,EAAc,YAAW;AAC3F,UAAI,CAAC3D,KAAW0G,EAAiB,WAAW,EAAG;AAC/C,YAAMC,IAAU,KAAK,UAAUD,EAAiB,IAAI,CAAAxG,OAAM,EAAE,GAAGA,EAAE,SAAS,GAAGA,EAAE,MAAA,EAAQ,CAAC,GAClF0G,IAAa,GAAG5G,EAAQ,MAAM,IAAIA,EAAQ,UAAU,GAAG,EAAE,CAAC,IAAIA,EAAQ,UAAUA,EAAQ,SAAS,EAAE,CAAC,IAAI2G,CAAO;AAErH,YADiB/C,IAAA6C,EAAa,YAAb,gBAAA7C,EAAsB,yBACvBgD,EAAY;AAC5B,iBAAW,MAAM;AACf,QAAAC,EAAA,GACKJ,EAAa,YACfA,EAAa,QAAQ,sBAAsBG;AAAA,MAEhD,GAAG,EAAE;AAAA,IACP,SAASxH,GAAG;AACV,cAAQ,KAAK,mCAAmCA,CAAC;AAAA,IACnD;AAAA,EACF;AACA,QAAM0H,IAAyB3G,EAAM;AAAA,IACnC,CAACsG,MAAmB;AAvqBxB,UAAA9C;AAuqB2B,cAAAA,IAAA6C,EAA0B,YAA1B,OAAA,SAAA7C,EAAA,KAAA6C,GAAoCC,CAAA;AAAA,IAAA;AAAA,IAC3D,CAAA;AAAA,EAAC,GAIGM,IAAsB5H,EAAY,MAAM;AA5qBhD,QAAAwE;AA6qBI,QAAI,CAACzF,KAAgB,CAAC6H,EAAY,QAAS;AAE3C,UAAMiB,IAAY,OAAO,aAAA;AACzB,QAAI,CAACA,KAAaA,EAAU,YAAa;AAEzC,UAAMC,IAAQD,EAAU,WAAW,CAAC,GAC9BE,IAAOD,EAAM,SAAA,EAAW,KAAA;AAC9B,QAAI,CAACC,EAAM;AAGX,UAAMjF,IAAY8D,EAAY;AAC9B,QAAIoB,IAAY,GACZC,IAAc;AAElB,UAAMC,IAAS,SAAS,iBAAiBpF,GAAW,WAAW,WAAW;AAAA,MACxE,YAAY,CAAAqF,MAAQ;AA5rB1B,YAAA3D;AA8rBQ,gBAAIA,IAAA2D,EAAK,kBAAL,QAAA3D,EAAoB,QAAQ,KAAA,IACvB,WAAW,gBAEb,WAAW;AAAA,MACpB;AAAA,IAAA,CACD;AAED,QAAI2D,KAAoBD,EAAO,SAAA;AAC/B,WAAOC,MAAM;AACX,UAAIA,OAASL,EAAM,gBAAgB;AACjC,QAAAG,IAAcD,IAAYF,EAAM;AAChC;AAAA,MACF;AACA,MAAAE,OAAaxD,IAAA2D,GAAK,gBAAL,OAAA,SAAA3D,EAAkB,WAAU,GACzC2D,KAAOD,EAAO,SAAA;AAAA,IAChB;AAEA,YAAQ,IAAI,yCAAW;AAAA,MACrB,MAAAH;AAAA,MACA,aAAAE;AAAA,MACA,WAAAD;AAAA,MACA,WAAWF,EAAM,eAAe;AAAA,IAAA,CACjC;AAED,UAAMrH,IAA8B;AAAA,MAClC,IAAI,WAAW,KAAK,IAAA,CAAK;AAAA,MACzB,OAAOwH;AAAA,MACP,KAAKA,IAAcF,EAAK;AAAA,MACxB,OAAO;AAAA,IAAA;AAGT,YAAQ,IAAI,mCAAUtH,CAAa,GAC/BiG,EAAY,cACdA,EAAY,WAAW,qBAAqBjG,CAAa,GAE3DoH,EAAU,gBAAA;AAAA,EACZ,GAAG,CAAC9I,GAAc2H,EAAY,UAAU,CAAC,GAGnC0B,IAAgBzB,IAClB,CAAA,KACED,EAAY,kBAAkB,CAAA,GAAI;AAAA,IAClC,OAAQ,WAAWzF,KAAQ,SAASA,KAAQ,EAAE,gBAAgBA;AAAA,EAAA,GAI9DsG,IAAmBZ,KACnBD,EAAY,kBAAkB,CAAA,GAAI;AAAA,IAClC,OAAQ,aAAazF,KAAQ,MAAM,QAAQA,EAAK,OAAO;AAAA,EAAA,IAEzD,CAAA,GAMEoH,IAAsBrI,EAAY,MAAM;AAG5C,QAFA,QAAQ,IAAI,0DAAkB,GAE1B,CAAC4G,EAAY,SAAS;AACxB,cAAQ,IAAI,yEAAuB;AACnC;AAAA,IACF;AAGA,UAAM0B,IAAwB1B,EAAY,QAAQ,iBAAiB,gBAAgB;AACnF,YAAQ,IAAI,iDAAmB0B,EAAsB,MAAM,GAEvDA,EAAsB,SAAS,KACjCA,EAAsB,QAAQ,CAAAC,MAAM;AAClC,YAAMC,IAASD,EAAG;AAClB,MAAIC,KAEFA,EAAO,aAAa,SAAS,eAAeD,EAAG,eAAe,EAAE,GAAGA,CAAE;AAAA,IAEzE,CAAC,GAKH,QAAQ,IAAI,4CAAS;AAAA,EACvB,GAAG,CAAA,CAAE,GAGCE,IAAwBzI,EAAY,MAAM;AAC9C,QAAI,CAAC4G,EAAY,QAAS;AAG1B,IADeA,EAAY,QAAQ,iBAAiB,OAAO,EACpD,QAAQ,CAAA8B,MAAS;AAEtB,MADgB,MAAM,KAAKA,EAAM,IAAI,EAC7B,QAAQ,CAAAC,MAAO;AACrB,cAAM,KAAKA,EAAI,KAAK,EAAE,QAAQ,CAAAC,MAAQ;AACpC,UAAIA,EAAK,aAAa,sBAAsB,MAAM,QAChDA,EAAK,MAAM,eAAe,YAAY,GACtCA,EAAK,MAAM,eAAe,kBAAkB,GAC5CA,EAAK,gBAAgB,sBAAsB,GAC3CA,EAAK,gBAAgB,OAAO;AAAA,QAEhC,CAAC;AAAA,MACH,CAAC;AAAA,IACH,CAAC,GACD,QAAQ,IAAI,wDAAW;AAAA,EACzB,GAAG,CAAA,CAAE,GAGClB,IAAwB1H,EAAY,MAAM;AAI9C,QAHA,QAAQ,IAAI,0DAAkB,GAC9B,QAAQ,IAAI,qBAAqBuH,CAAgB,GAE7C,CAACX,EAAY,SAAS;AACxB,cAAQ,IAAI,iDAAmB;AAC/B;AAAA,IACF;AAKA,QAFA6B,EAAA,GAEI,CAAClB,EAAiB,QAAQ;AAC5B,cAAQ,IAAI,4FAAiB;AAC7B;AAAA,IACF;AAGA,UAAMsB,IAASjC,EAAY,QAAQ,iBAAiB,OAAO;AAE3D,QADA,QAAQ,IAAI,yCAAWiC,EAAO,MAAM,GAChCA,EAAO,WAAW,GAAG;AACvB,cAAQ,IAAI,kDAAU;AACtB;AAAA,IACF;AAEA,IAAA9B,EAA0B,UAAU,IACpCQ,EAAiB,QAAQ,CAAC3G,GAAYkI,MAAc;AAClD,YAAMC,IAAUnI,EAAW;AAI3B,UAHA,QAAQ,IAAI,yCAAWA,CAAU,GAI/B,CAAC,MAAM,QAAQmI,CAAO,KACtB,CAACA,EAAQ,UACT,CAAC,MAAM,QAAQA,EAAQ,CAAC,CAAC,KACzBA,EAAQ,CAAC,EAAE,WAAW,GACtB;AACA,gBAAQ,KAAK,qDAAqDnI,CAAU;AAC5E;AAAA,MACF;AAEA,MAAAmI,EAAQ,QAAQ,CAACC,GAA0BC,MAAkB;AAC3D,cAAM,CAACN,GAAKO,CAAG,IAAIF;AACnB,YAAI,OAAOL,KAAQ,YAAY,OAAOO,KAAQ,UAAU;AACtD,kBAAQ,KAAK,oDAAoDF,CAAM;AACvE;AAAA,QACF;AAGA,QAAAH,EAAO,QAAQ,CAACH,IAAOS,MAAe;AAx1B9C,cAAA3E;AA01BU,gBAAM4E,IAAU,MAAM,KAAKV,GAAM,IAAI,GAC/BW,KAAQD,EAAQT,CAAG;AACzB,cAAI,CAACU,IAAO;AACV,oBAAQ,KAAK,sCAAsC;AAAA,cACjD,KAAAV;AAAA,cACA,YAAAQ;AAAA,cACA,WAAWC,EAAQ;AAAA,YAAA,CACpB;AACD;AAAA,UACF;AAEA,gBAAMR,KAAOpE,IAAA6E,GAAM,UAAN,gBAAA7E,EAAc0E,CAAA;AAC3B,cAAI,CAACN,GAAM;AACT,oBAAQ,KAAK,uCAAuC,EAAE,KAAAD,GAAK,KAAAO,GAAK,YAAAC,GAAY;AAC5E;AAAA,UACF;AAEA,gBAAMG,IAAc1I,EAAW,SAAS,4BAClC2I,IAAa,iBAAiBX,CAAI,EAAE;AAI1C,UAFEA,EAAK,aAAa,sBAAsB,MAAM,QAC7CW,MAAeD,KAAeV,EAAK,MAAM,oBAAoBU,OAE9DV,EAAK,MAAM,YAAY,cAAcU,GAAa,WAAW,GAC7DV,EAAK,MAAM,YAAY,oBAAoBU,GAAa,WAAW,GACnEV,EAAK,aAAa,wBAAwB,GAAG,IAE3ChI,EAAW,YAASgI,EAAK,QAAQhI,EAAW,UAE5CqI,MAAU,KAAKH,MAAM,KACvB,WAAW,MAAM;AACf,YAAAF,EAAK,eAAe,EAAE,UAAU,UAAU,OAAO,SAAS;AAAA,UAC5D,GAAG,GAAG;AAAA,QAEV,CAAC;AAAA,MACH,CAAC;AAAA,IACH,CAAC,GAED,sBAAsB,MAAM;AAC1B,MAAA7B,EAA0B,UAAU;AAAA,IACtC,CAAC;AAAA,EACH,GAAG,CAACQ,GAAkBkB,CAAqB,CAAC,GAGtCe,IAA2BxJ,EAAY,MAAM;AAGjD,QAFA,QAAQ,IAAI,sDAAwB,GAEhC,CAAC4G,EAAY,WAAW,CAACwB,EAAc,QAAQ;AACjD,cAAQ,IAAI,0EAAc;AAC1B;AAAA,IACF;AAGA,IAAIvB,EAAqB,WACvB,aAAaA,EAAqB,OAAO;AAI3C,UAAM4C,IAAgC,MAAM;AAp5BhD,UAAAjF;AAq5BM,cAAQ,IAAI,yCAAW;AAGvB,YAAMkF,KAAsBlF,IAAAoC,EAAY,YAAZ,OAAA,SAAApC,EAAqB,iBAAiB,gBAAA;AAClE,cAAQ,IAAI,sDAAakF,KAAA,OAAA,SAAAA,EAAqB,WAAU,CAAC,GACzDA,KAAA,QAAAA,EAAqB,QAAQ,CAAAnB,MAAM;AACjC,cAAMC,IAASD,EAAG;AAClB,QAAIC,KACFA,EAAO,aAAa,SAAS,eAAeD,EAAG,eAAe,EAAE,GAAGA,CAAE;AAAA,MAEzE,CAAA;AAGA,YAAML,IAAS,SAAS,iBAAiBtB,EAAY,SAAU,WAAW,WAAW;AAAA,QACnF,YAAY,CAAAuB,MAAQ;AAn6B5B,cAAA3D;AAq6BU,kBAAIA,IAAA2D,EAAK,kBAAL,QAAA3D,EAAoB,QAAQ,KAAA,IACvB,WAAW,gBAEb,WAAW;AAAA,QACpB;AAAA,MAAA,CACD,GAEKmF,IAAoB,CAAA;AAC1B,UAAIxB;AACJ,aAAQA,IAAOD,EAAO;AACpB,QAAAyB,EAAU,KAAKxB,CAAI;AAKrB,UAFA,QAAQ,IAAI,qDAAawB,EAAU,MAAM,GAErCA,EAAU,WAAW,GAAG;AAC1B,gBAAQ,IAAI,mFAAkB,GAE9B9C,EAAqB,UAAU,WAAW,MAAM;AAC9C,UAAA4C,EAAA;AAAA,QACF,GAAG,GAAG;AACN;AAAA,MACF;AAGA,UAAIG,IAAc;AAClB,YAAMC,IAAgBF,EAAU,IAAI,CAAAxB,MAAQ;AA/7BlD,YAAA3D;AAg8BQ,cAAMsF,IAAQF;AACd,eAAAA,OAAepF,IAAA2D,EAAK,gBAAL,OAAA,SAAA3D,EAAkB,WAAU,GACpC;AAAA,UACL,MAAA2D;AAAAA,UACA,OAAA2B;AAAA,UACA,KAAKF;AAAA,UACL,MAAMzB,EAAK;AAAA,QAAA;AAAA,MAEf,CAAC;AAED,cAAQ,IAAI,yCAAW0B,CAAa,GACpC,QAAQ,IAAI,mCAAUD,CAAW;AAGjC,YAAMG,KAAoB,CAAC,GAAG3B,CAAa,EAAE,KAAK,CAACrH,GAAGiJ,MAAMA,EAAE,QAAQjJ,EAAE,KAAK;AAC7E,cAAQ,IAAI,yCAAWgJ,EAAiB,GAExCA,GAAkB,QAAQ,CAAAnJ,MAAc;AACtC,cAAM,EAAE,OAAAkJ,GAAO,KAAAG,GAAK,OAAAC,GAAA,IAAUtJ;AAC9B,gBAAQ,IAAI,6BAAS,EAAE,YAAAA,GAAY,eAAAiJ,GAAe;AAGlD,cAAMM,IAAgBN,EAAc,OAAO,CAAAO,MAAON,IAAQM,EAAI,OAAOH,IAAMG,EAAI,KAAK;AAEpF,gBAAQ,IAAI,yCAAWD,EAAc,MAAM,GAE3CA,EAAc,QAAQ,CAAC,EAAE,MAAAhC,GAAM,OAAOkC,QAAgB;AA19B9D,cAAA7F,GAAAC,GAAAC,GAAAC,IAAAC,IAAAC;AA29BU,gBAAMyF,KAAa,KAAK,IAAI,GAAGR,IAAQO,CAAS,GAC1CE,KAAW,KAAK,MAAI/F,IAAA2D,EAAK,gBAAL,OAAA,SAAA3D,EAAkB,WAAU,GAAGyF,IAAMI,CAAS;AAQxE,cANA,QAAQ,IAAI,6BAAS;AAAA,YACnB,YAAAC;AAAA,YACA,UAAAC;AAAA,YACA,iBAAgB9F,IAAA0D,EAAK,gBAAL,gBAAA1D,EAAkB;AAAA,UAAA,CACnC,GAEG6F,MAAcC,IAAU;AAC1B,oBAAQ,IAAI,wDAAW;AACvB;AAAA,UACF;AAEA,gBAAMC,OAAS9F,IAAAyD,EAAK,gBAAL,gBAAAzD,EAAkB,MAAM,GAAG4F,EAAA,MAAe,IACnDG,OAAgB9F,KAAAwD,EAAK,gBAAL,gBAAAxD,GAAkB,MAAM2F,IAAYC,EAAA,MAAa,IACjEG,OAAQ9F,KAAAuD,EAAK,gBAAL,OAAA,SAAAvD,GAAkB,MAAM2F,EAAA,MAAa;AAEnD,kBAAQ,IAAI,6BAAS,EAAE,QAAAC,IAAQ,eAAAC,IAAe,OAAAC,IAAO;AAErD,gBAAMC,KAAO,SAAS,cAAc,MAAM;AAC1C,UAAAA,GAAK,YAAY,iBACjBA,GAAK,MAAM,kBAAkBT,MAAS,WACtCS,GAAK,cAAcF;AAEnB,gBAAMG,KAAW,SAAS,uBAAA;AAC1B,UAAIJ,MAAQI,GAAS,YAAY,SAAS,eAAeJ,EAAM,CAAC,GAChEI,GAAS,YAAYD,EAAI,GACrBD,MAAOE,GAAS,YAAY,SAAS,eAAeF,EAAK,CAAC,IAE9D7F,KAAAsD,EAAK,eAAL,QAAAtD,GAAiB,aAAa+F,IAAUzC,CAAAA,GACxC,QAAQ,IAAI,yCAAWsC,EAAa;AAAA,QACtC,CAAC;AAAA,MACH,CAAC;AAAA,IACH;AAGA,IAAA5D,EAAqB,UAAU,WAAW,MAAM;AAC9C,MAAA4C,EAAA;AAAA,IACF,GAAG,GAAG;AAAA,EACR,GAAG,CAACrB,CAAa,CAAC;AAGlB,SAAA1E,GAAU,MAAM;AAtgClB,QAAAc;AAugCI,QAAImC,GAAa;AACf,cAAQ,IAAI,oEAAoE;AAChF;AAAA,IACF;AAEA,UAAM9F,IAAU,OAAOuD,EAAK,WAAY,WAAWA,EAAK,YAAUI,IAAAJ,EAAK,YAAL,OAAA,SAAAI,EAAc,YAAW;AAE3F,QAAI,CAAC3D,KAAW,OAAOA,KAAY,UAAU;AAC3C,cAAQ,IAAI,0GAA0B;AACtC;AAAA,IACF;AAUA,QARA,QAAQ,IAAI,kEAA0B,GACtC,QAAQ,IAAI,wBAAwB+F,EAAY,OAAO,GACvD,QAAQ,IAAI,gBAAgBD,CAAW,GACvC,QAAQ,IAAI,kBAAkByB,CAAa,GAC3C,QAAQ,IAAI,qBAAqBb,CAAgB,GACjD,QAAQ,IAAI,iBAAiBnD,EAAK,OAAO,GACzC,QAAQ,IAAI,6BAASvD,CAAO,GAExB,CAAC+F,EAAY,SAAS;AACxB,cAAQ,IAAI,yEAAuB;AACnC;AAAA,IACF;AAUA,QAPKD,KACH0B,EAAA,GAME,CAAC1B,KAAeyB,EAAc,SAAS,GAAG;AAC5C,MAAAoB,EAAA;AACA;AAAA,IACF;AAEA,YAAQ,IAAI,wDAAW;AAAA,EACzB,GAAG,CAAC7C,GAAaY,GAAkBa,CAAa,CAAC,GAGjD1E,GAAU,MAAM;AAEd,QAAI,CAACiD;AACH,sBAAS,iBAAiB,WAAWiB,CAAmB,GACjD,MAAM;AACX,iBAAS,oBAAoB,WAAWA,CAAmB;AAAA,MAC7D;AAAA,EAEJ,GAAG,CAACA,GAAqBjB,CAAW,CAAC,GAGrCjD,GAAU,MAAM;AA5jClB,QAAAc;AA8jCI,UAAM3D,IAAU,OAAOuD,EAAK,WAAY,WAAWA,EAAK,YAAUI,IAAAJ,EAAK,YAAL,OAAA,SAAAI,EAAc,YAAW;AAE3F,QAAI,CAAC3D,KAAW,OAAOA,KAAY,UAAU;AAC3C,cAAQ,IAAI,sHAA4B;AACxC;AAAA,IACF;AAEA,YAAQ,IAAI,0CAAsB,GAClC,QAAQ,IAAI,gBAAgB8F,CAAW,GACvC,QAAQ,IAAI,6BAAS9F,EAAQ,UAAU,CAAC,GAGpC,OAAOA,KAAY,YACrB,QAAQ,IAAI,sCAAaA,EAAQ,UAAU,GAAG,GAAG,CAAC,GAClD,QAAQ,IAAI,sCAAaA,EAAQ,UAAUA,EAAQ,SAAS,GAAG,CAAC,MAEhE,QAAQ,IAAI,2DAAc,OAAOA,CAAO,GACxC,QAAQ,IAAI,uBAAQA,CAAO,IAG7B,QAAQ,IAAI,6BAASuH,CAAa,GAClC,QAAQ,IAAI,yCAAWb,CAAgB;AAAA,EACzC,GAAG,CAACa,GAAeb,GAAkBZ,CAAW,CAAC,GAGjDjD,GAAU,MAAM;AACd,QAAIiD,KAAeC,EAAY,SAAS;AAEtC,YAAMR,IAAQ,WAAW,MAAM;AA1lCrC,YAAA5B;AA2lCQ,cAAMqE,KAASrE,IAAAoC,EAAY,YAAZ,OAAA,SAAApC,EAAqB,iBAAiB,OAAA;AACrD,QAAIqE,KAAUA,EAAO,SAAS,MAC5B,QAAQ,IAAI,mFAAkBA,EAAO,MAAM,GAE3CA,EAAO,QAAQ,CAACH,GAAOO,MAAU;AAC/B,cAAIP,aAAiB,kBAAkB;AAErC,YAAAA,EAAM,MAAM,QAAQ,QACpBA,EAAM,MAAM,WAAW,QACvBA,EAAM,MAAM,cAAc;AAG1B,kBAAM5F,IAAY4F,EAAM,QAAQ,sBAAsB;AACtD,YAAI5F,KAAaA,aAAqB,gBACpCA,EAAU,MAAM,QAAQ,QACxBA,EAAU,MAAM,YAAY,SAG9B,QAAQ,IAAI,gBAAMmG,IAAQ,CAAC,uCAAS;AAAA,UACtC;AAAA,QACF,CAAC;AAAA,MAEL,GAAG,GAAG;AAEN,aAAO,MAAM,aAAa7C,CAAK;AAAA,IACjC;AAAA,EACF,GAAG,CAACO,GAAavC,EAAK,OAAO,CAAC,GAG9BV,GAAU,MACD,MAAM;AACX,IAAImD,EAAqB,WACvB,aAAaA,EAAqB,OAAO,GAEvCC,EAAiB,YACnBA,EAAiB,QAAQ,WAAA,GACzBA,EAAiB,UAAU;AAAA,EAE/B,GACC,CAAA,CAAE,GAGH,gBAAA9F,EAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,OAAO;AAAA,QACL,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,UAAU;AAAA;AAAA,MAAA;AAAA,MAEZ,WAAW,yCAAyC2F,IAAc,wBAAwB,EAAE;AAAA,IAAA;AAAA,IAE5F,gBAAA3F,EAAA,cAAC,eAAOkD,EAAyB;AAAA,IACjC,gBAAAlD,EAAA,cAAC,OAAA,EAAI,KAAK4F,EAAA,GACR,gBAAA5F,EAAA;AAAA,MAACuF;AAAA,MAAA;AAAA,QACC,YAAY;AAAA,UACV,MAAMC,GAAS;AAAA,UACf,UAAU,MAAM;AAlpC5B,gBAAAhC,GAAAC;AAopCc,mBAAI,OAAOL,EAAK,WAAY,WACnBA,EAAK,WACHI,IAAAJ,EAAK,YAAL,QAAAI,EAAc,OAEhBJ,EAAK,QAAQ,QACXK,IAAAL,EAAK,YAAL,QAAAK,EAAc,UAEhBL,EAAK,QAAQ,UAEf;AAAA,UACT,GAAA;AAAA,QAAG;AAAA,QAEL,MAAK;AAAA,QACL,UAAWuC,IAA6B,SAAfK;AAAA,QACzB,eAAgBL,IAAkC,SAApBQ;AAAA,QAC9B,kBAAmBR,IAAqC,SAAvBS;AAAA,QACjC,YAAYO;AAAA,QACZ,OAAO;AAAA,UACL,gBAAcjD,gBAAY,WAAZ,OAAA,SAAAF,EAAoB,UAApB,OAAA,SAAAC,EAA2B,WAA3B,kBAAmC,YAAW;AAAA,UAC5D,mBAAiBI,gBAAY,WAAZ,OAAA,SAAAF,EAAoB,UAApB,OAAA,SAAAC,EAA2B,WAA3B,kBAAmC,eAAc;AAAA,UAClE,aAAWO,gBAAY,WAAZ,OAAA,SAAAL,EAAoB,UAApB,OAAA,SAAAI,EAA2B,WAA3B,kBAAmC,SAAQ;AAAA,UACtD,eAAaI,gBAAY,WAAZ,OAAA,SAAAF,EAAoB,UAApB,OAAA,SAAAC,EAA2B,WAA3B,kBAAmC,WAAU;AAAA,UAC1D,cAAcsB,IAAc,QAAQ;AAAA,UACpC,SAASA,IAAc,QAAQ;AAAA,QAAA;AAAA,QAEjC,OAAO;AAAA,UACL,QAAQ;AAAA,UACR,QAAQ;AAAA,UACR,YAAY;AAAA,UACZ,WAAWA,IAAc,YAAY;AAAA,QAAA;AAAA,MACvC;AAAA,IAAA,CAEJ;AAAA,EAAA;AAGN,GAOMkE,KAID,CAAC,EAAE,UAAAC,GAAU,YAAAC,GAAY,kBAAAxD,IAAmB,CAAA,QAAS;AACxD,QAAMyD,IAAU3L,EAAuB,IAAI,GAGrC4L,IAAa,CAACC,MAA+D;AACjF,UAAMC,IAAQD,EAAG,MAAM,OAAO,EAAE,OAAO,CAAAE,MAAKA,EAAE,OAAO,SAAS,CAAC;AAE/D,QAAIC,IAAgB;AACpB,aAASvC,IAAI,GAAGA,IAAIqC,EAAM,SAAS,GAAGrC,KAAK;AACzC,YAAM/H,IAAIoK,EAAMrC,CAAC,EAAE,KAAA,GACbkB,IAAImB,EAAMrC,IAAI,CAAC,EAAE,KAAA;AACvB,UAAI/H,EAAE,WAAW,GAAG,KAAKA,EAAE,SAAS,GAAG,KAAKiJ,EAAE,QAAQ,YAAY,EAAE,EAAE,MAAM,QAAQ,GAAG;AACrF,QAAAqB,IAAgBvC;AAChB;AAAA,MACF;AAAA,IACF;AACA,QAAIuC,MAAkB,GAAI,QAAO;AAEjC,UAAMC,IADaH,EAAME,CAAa,EAEnC,MAAM,GAAG,EACT,MAAM,GAAG,EAAE,EACX,IAAI,CAAAE,MAAKA,EAAE,MAAM,GACdC,IAAY,CAAA;AAClB,aAAS1C,IAAIuC,IAAgB,GAAGvC,IAAIqC,EAAM,QAAQrC,KAAK;AACrD,YAAM,IAAIqC,EAAMrC,CAAC,EAAE,KAAA;AACnB,UAAI,CAAC,EAAE,WAAW,GAAG,KAAK,CAAC,EAAE,SAAS,GAAG,EAAG;AAC5C,MAAA0C,EAAU,KAAK,CAAC;AAAA,IAClB;AACA,UAAMC,IAAOD,EAAU;AAAA,MAAI,CAAAJ,MACzBA,EACG,MAAM,GAAG,EACT,MAAM,GAAG,EAAE,EACX,IAAI,CAAAG,MAAKA,EAAE,MAAM;AAAA,IAAA;AAEtB,WAAO,EAAE,SAASD,GAAQ,MAAAG,EAAA;AAAA,EAC5B,GAEM/C,IAAQ1H,EAAM,QAAQ,MAAMiK,EAAWH,CAAQ,GAAG,CAACA,CAAQ,CAAC;AA+DlE,SA5DApH,GAAU,MAAM;AACd,UAAMgI,IAAQ,MAAM;AAClB,UAAI;AACF,YAAI,CAACV,EAAQ,QAAS;AAGtB,cAAMnC,IAASmC,EAAQ,QAAQ,iBAAiB,OAAO;AAgBvD,YAfAnC,EAAO,QAAQ,CAAAH,MAAS;AAEtB,UADgB,MAAM,KAAKA,EAAM,IAAI,EAC7B,QAAQ,CAAAC,MAAO;AACrB,kBAAM,KAAKA,EAAI,KAAK,EAAE,QAAQ,CAAAC,MAAQ;AACpC,cAAIA,EAAK,aAAa,sBAAsB,MAAM,QAChDA,EAAK,MAAM,eAAe,YAAY,GACtCA,EAAK,MAAM,eAAe,kBAAkB,GAC5CA,EAAK,gBAAgB,sBAAsB,GAC3CA,EAAK,gBAAgB,OAAO;AAAA,YAEhC,CAAC;AAAA,UACH,CAAC;AAAA,QACH,CAAC,GAEG,CAACrB,EAAiB,UAClB,CAACsB,KAAUA,EAAO,WAAW,EAAG;AACpC,QAAAtB,EAAiB,QAAQ,CAAC3G,GAAYkI,MAAM;AAE1C,WADgBlI,EAAW,WAAW,CAAA,GAC9B,QAAQ,CAACoI,GAAQ2C,MAAQ;AAC/B,kBAAM,CAAChD,GAAKO,CAAG,IAAIF;AACnB,YAAAH,EAAO,QAAQ,CAAA+C,MAAW;AArwCtC,kBAAApH;AAwwCc,oBAAM6E,IADU,MAAM,KAAKuC,EAAQ,IAAI,EACjBjD,CAAG;AACzB,kBAAI,CAACU,EAAO;AACZ,oBAAMT,KAAOpE,IAAA6E,EAAM,UAAN,OAAA,SAAA7E,EAAc0E,CAAA;AAC3B,kBAAI,CAACN,EAAM;AACX,oBAAMsB,IAAQtJ,EAAW,SAAS;AAElC,cADgBgI,EAAK,aAAa,sBAAsB,MAAM,QAE5DA,EAAK,MAAM,YAAY,cAAcsB,GAAO,WAAW,GACvDtB,EAAK,MAAM,YAAY,oBAAoBsB,GAAO,WAAW,GAC7DtB,EAAK,aAAa,wBAAwB,GAAG,GACzChI,EAAW,YAASgI,EAAK,QAAQhI,EAAW,WAE9CkI,MAAM,KAAK6C,MAAQ,KACrB,WAAW,MAAM/C,EAAK,eAAe,EAAE,UAAU,UAAU,OAAO,SAAS,GAAG,EAAE;AAAA,YAEpF,CAAC;AAAA,UACH,CAAC;AAAA,QACH,CAAC;AAAA,MACH,SAAS3I,GAAG;AACV,gBAAQ,KAAK,mDAAmDA,CAAC;AAAA,MACnE;AAAA,IACF,GAEM4L,IAAK,sBAAsB,MAAM;AACrC,MAAAH,EAAA,GACAX,KAAcA,EAAA;AAAA,IAChB,CAAC;AACD,WAAO,MAAM,qBAAqBc,CAAE;AAAA,EACtC,GAAG,CAACf,GAAUvD,GAAkBwD,CAAU,CAAC,GAEtCrC,IAuBH,gBAAA1H,EAAA,cAAC,OAAA,EAAI,KAAKgK,GAAS,WAAU,sCAAA,GAC3B,gBAAAhK,EAAA,cAAC,SAAA,MAhBgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAgBI,GACrB,gBAAAA,EAAA,cAAC,SAAA,EAAM,WAAU,UAAA,GACf,gBAAAA,EAAA,cAAC,SAAA,MACC,gBAAAA,EAAA,cAAC,MAAA,MACE0H,EAAM,QAAQ,IAAI,CAACoD,GAAGhD,MACrB,gBAAA9H,EAAA,cAAC,MAAA,EAAG,KAAK8H,EAAA,GAAIgD,CAAE,CAChB,CACH,CACF,GACA,gBAAA9K,EAAA,cAAC,SAAA,MACE0H,EAAM,KAAK,IAAI,CAACqD,GAAGC,MAClB,gBAAAhL,EAAA,cAAC,MAAA,EAAG,KAAKgL,EAAA,GACND,EAAE,IAAI,CAACE,GAAGC,MACT,gBAAAlL,EAAA,cAAC,MAAA,EAAG,KAAKkL,EAAA,GAAKD,CAAE,CACjB,CACH,CACD,CACH,CACF,CACF,IAzCE,gBAAAjL,EAAA,cAAC,SAAI,KAAKgK,GAAS,OAAO,EAAE,SAAS,MAAA,EAAM,GAAG,4CAE9C;AAyCN,GAKMmB,KAAoB,CAAC/H,GAAWgI,MAAyB;AAx1C/D,MAAA5H,GAAAC;AAy1CE,UAAQ,IAAI,mCAAmC,GAC/C,QAAQ,IAAI,SAASL,CAAI,GACzB,QAAQ,IAAI,iBAAiBA,EAAK,OAAO;AAGzC,MAAIiI,IAAc;AAClB,SAAI,OAAOjI,EAAK,WAAY,WAC1BiI,IAAcjI,EAAK,WACVI,IAAAJ,EAAK,YAAL,QAAAI,EAAc,OAEvB6H,IAAcjI,EAAK,QAAQ,QAClBK,IAAAL,EAAK,YAAL,QAAAK,EAAc,YAEvB4H,IAAcjI,EAAK,QAAQ,UAE7B,QAAQ,IAAI,yDAA2BiI,CAAW,GAGhD,gBAAArL,EAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,OAAO;AAAA,QACL,QAAQ;AAAA,QACR,UAAU;AAAA,QACV,UAAU;AAAA,MAAA;AAAA,IACZ;AAAA,IAEA,gBAAAA,EAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,QAAQqL;AAAA,QACR,OAAO;AAAA,UACL,OAAO;AAAA,UACP,QAAQ;AAAA,UACR,QAAQ;AAAA,UACR,YAAY;AAAA,QAAA;AAAA,QAEd,OAAM;AAAA,QACN,SAAQ;AAAA,MAAA;AAAA,IAAA;AAAA,EACV;AAGN,GAKMC,KAAuB,CAAClI,GAAWgI,MAErC,gBAAApL,EAAA;AAAA,EAAC;AAAA,EAAA;AAAA,IACC,OAAO;AAAA,MACL,SAAS;AAAA,MACT,gBAAgB;AAAA,MAChB,YAAY;AAAA,MACZ,QAAQ;AAAA,MACR,OAAO;AAAA,IAAA;AAAA,EACT;AAAA,kCAEC,OAAA,MACC,gBAAAA,EAAA,cAAC,aAAI,kDAAQ,mCACZ,OAAA,EAAI,OAAO,EAAE,UAAU,QAAQ,WAAW,MAAA,KAAUoD,EAAK,YAAY,0BAAO,CAC/E;AAAA,GAYAmI,KAAkC,CAAC;AAAA,EACvC,MAAAnI;AAAA,EACA,gBAAAoI,IAAiB,CAAA;AAAA,EACjB,WAAAC,IAAY;AAAA,EACZ,aAAAhL,IAAc;AAAA,EACd,UAAAG;AAAA,EACA,OAAO8K;AAAA;AAAA,EACP,UAAAC,IAAW;AAAA;AAAA,EACX,YAAAC;AAAA,EACA,QAAA7K;AAAA,EACA,OAAA8K,IAAQ;AAAA,IACN,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,MAAM;AAAA,IACN,OAAO;AAAA,IACP,YAAY;AAAA,EAAA;AAAA,EAEd,kBAAAC;AAAA,EACA,WAAAC;AAAA,EACA,cAAAC;AACF,MAAM;AAl7CN,MAAAxI,GAAAC,GAAAC,GAAAC;AAo7CE,QAAMnC,KAAcT,uBAAQ,UAASb,IAG/B,CAACc,GAAWC,CAAY,IAAIzC,EAAS,EAAK,GAC1C,CAACyN,CAAa,IAAIzN,EAAiB,mCAAU,GAC7C,CAAC0C,GAAOC,CAAQ,IAAI3C,EAAwB,IAAI;AAEtD,UAAQ,IAAI,0CAAsB,GAClC,QAAQ,IAAI,iBAAiB4E,CAAI,GACjC,QAAQ,IAAI,yBAAyBA,KAAA,OAAA,SAAAA,EAAM,OAAO,GAClD,QAAQ,IAAI,mCAAkCI,IAAAJ,KAAA,OAAA,SAAAA,EAAM,YAAN,kBAAe,QAAQ,GACrE,QAAQ,IAAI,8CAAoC,SAAOK,IAAAL,KAAA,OAAA,SAAAA,EAAM,YAAN,kBAAe,SAAQ,GAC9E,QAAQ,IAAI,0DAAyCM,IAAAN,KAAA,OAAA,SAAAA,EAAM,YAAN,OAAA,SAAAM,EAAe,cAAa,IAAI,GACrF,QAAQ;AAAA,IACN;AAAA,MACAC,IAAAP,KAAA,OAAA,SAAAA,EAAM,YAAN,OAAA,SAAAO,EAAe,cAAa;AAAA,EAAA,GAE9B,QAAQ,IAAI,wBAAwBlD,CAAW,GAC/C,QAAQ,IAAI,kBAAkBiL,CAAS;AAGvC,QAAMQ,IAAc7N,EAAY,IAAI,GAC9B8N,IAAiB9N,EAAY,IAAI,GACjC+N,IAAiB/N,EAAe,CAAC;AACvC,EAAA+N,EAAe,WAAW,GAC1B,QAAQ,IAAI,2BAA2BA,EAAe,OAAO;AAG7D,QAAM9I,IAAWH,GAAeC,CAAI;AACpC,UAAQ,IAAI,8BAAoB,GAChC,QAAQ,IAAI,qDAAaE,CAAQ,GACjC,QAAQ,IAAI,6BAASF,CAAI;AAGzB,QAAMiJ,IAAgB,MAAM;AAt9C9B,QAAA7I;AAy9CI,YAFA,QAAQ,IAAI,uEAAgBF,CAAQ,GAE5BA,GAAA;AAAA,MACN,KAAK;AAAA,MACL,KAAK;AACH,uBAAQ;AAAA,UACN;AAAA,UACAA;AAAA,UACA,kBAAkBF,EAAK;AAAA,UACvB,iBAAiB3C;AAAA,QAAA,GAEZ8C;AAAA,UACLH;AAAA,UACA;AAAA,YACE,MAAAA;AAAA,YACA,gBAAAoI;AAAA,YACA,WAAAC;AAAA,YACA,aAAAhL;AAAA,YACA,OAAOiL;AAAA,YACP,YAAAE;AAAA,YACA,QAAA7K;AAAA,YACA,OAAA8K;AAAA,YACA,WAAAE;AAAA,YACA,cAAAC;AAAA,UAAA;AAAA,UAEF1I,MAAa;AAAA,UACb1C;AAAA,QAAA;AAAA,MAEJ,KAAK;AACH,uBAAQ,IAAI,sCAAQ,GACbqD,GAAmBb,GAAM;AAAA,UAG9B,OAAOsI;AAAA,UACP,UAAAC;AAAA,UAEA,QAAA5K;AAAA,QAIF,CAAC;AAAA,MACH,KAAK;AACH,uBAAQ,IAAI,sCAAQ,GACbiE,GAAkB5B,GAAM;AAAA,UAG7B,OAAOsI;AAAA,UAEP,QAAA3K;AAAA,QAIF,CAAC;AAAA,MACH,KAAK;AAAA,MACL,KAAK;AAEH,YADA,QAAQ,IAAI,qCAAiBuC,CAAQ,GACjCA,MAAa,kBAAkB;AACjC,gBAAM4G,IAAK,OAAO9G,EAAK,WAAY,WAAWA,EAAK,YAAUI,IAAAJ,EAAK,YAAL,OAAA,SAAAI,EAAc,YAAW,IAChF+C,KAAoBiF,KAAkB,CAAA,GAAI;AAAA,YAC9C,OAAQ,aAAavL,KAAQ,MAAM,QAASA,EAAa,OAAO;AAAA,UAAA;AAElE,iBAAO,gBAAAD,EAAA,cAAC6J,IAAA,EAAqB,UAAUK,GAAI,kBAAA3D,GAAoC;AAAA,QACjF;AACA,eACE,gBAAAvG,EAAA;AAAA,UAACyF;AAAA,UAAA;AAAA,YACC,MAAArC;AAAA,YACA,aAAa;AAAA,cACX,MAAAA;AAAA,cACA,gBAAAoI;AAAA,cACA,YAAAI;AAAA,cACA,QAAA7K;AAAA,cACA,OAAA8K;AAAA,cACA,WAAAE;AAAA,cACA,cAAAC;AAAA,YAAA;AAAA,YAEF,aAAa;AAAA,UAAA;AAAA,QAAA;AAAA,MAGnB,KAAK;AACH,uBAAQ,IAAI,8BAAU,GACfb,GAAkB/H,CAQxB;AAAA,MACH;AACE,uBAAQ,IAAI,kDAAU,GACfkI,GAAqBlI,CAQ3B;AAAA,IAAA;AAAA,EAEP;AAGA,SAAApD,EAAM,UAAU,MAAM;AACpB,UAAMsM,IAAWJ,EAAY,SACvBK,IAAcJ,EAAe,SAC7BK,IAAcF,MAAalJ,GAC3BqJ,IAAiBF,OAAiBnJ,IAAOA,EAAK,UAAU;AAC9D,YAAQ,IAAI,sCAAsC;AAAA,MAChD,aAAAoJ;AAAA,MACA,gBAAAC;AAAA,MACA,SAAS,CAAC,CAACrJ;AAAA,MACX,YAAY,CAAC,EAACA,KAAA,QAAAA,EAAM;AAAA,MACpB,iBAAiBpC;AAAA,IAAA,CAClB,GAEDkL,EAAY,UAAU9I,GACtB+I,EAAe,UAAU/I,IAAOA,EAAK,UAAU;AAAA,EACjD,GAAG,CAACA,KAAA,OAAA,SAAAA,EAAM,OAAO,CAAC,GAGlBpD,EAAM,UAAU,MAAM;AACpB,IAAIkB,KACFD,EAAa,EAAK;AAAA,EAEtB,GAAG,CAACC,CAAK,CAAC,GAGVlB,EAAM,UAAU,MAAM;AACpB,YAAQ,IAAI,yDAAqC,GACjD,QAAQ,IAAI,mBAAmBwL,CAAc,GAC7C,QAAQ,IAAI,iCAAsBA,KAAA,OAAA,SAAAA,EAAgB,WAAU,CAAC,GAC7D,QAAQ,IAAI,yCAAWlI,CAAQ;AAAA,EACjC,GAAG,CAACkI,GAAgBlI,CAAQ,CAAC,GAG3B,gBAAAtD,EAAA,cAAC+C,IAAA,EAAiB,QAAQvB,GAAa,WAAWwK,EAAA,GAC/ChL,IACC8K,KAAA,QAAAA,EAAkB,mBAChB,gBAAA9L,EAAA,cAAC8L,EAAiB,kBAAjB,EAAkC,QAAQG,GAAe,OAAOzK,EAAA,CAAa,IAE9E,gBAAAxB,EAAA,cAACgD,IAAA,EAAiB,QAAQxB,EAAA,GAAcyK,CAAc,IAEtD/K,IACF4K,KAAA,QAAAA,EAAkB,iBAChB,gBAAA9L,EAAA,cAAC8L,EAAiB,gBAAjB,EAAgC,OAAA5K,GAAc,OAAOM,EAAA,CAAa,IAEnE,gBAAAxB,EAAA,cAACiD,IAAA,EAAe,QAAQzB,EAAA,GACtB,gBAAAxB,EAAA,cAAC,OAAA,MAAI,0BAAI,mCACR,OAAA,EAAI,OAAO,EAAE,UAAU,QAAQ,WAAW,MAAA,EAAM,GAAIkB,CAAM,CAC7D,IAGFmL,GAEJ;AAEJ;ACrnDA;AAAA;AAAA;AAAA;AAAA;AAAA;AAOA,MAAMK,KAAc,CAACC,MAAWA,EAAO,QAAQ,sBAAsB,OAAO,EAAE,YAAW,GACnFC,KAAe,IAAIC,MAAYA,EAAQ,OAAO,CAACd,GAAW9D,GAAO6E,MAC9D,EAAQf,KAAcA,EAAU,KAAI,MAAO,MAAMe,EAAM,QAAQf,CAAS,MAAM9D,CACtF,EAAE,KAAK,GAAG,EAAE,KAAI;ACVjB;AAAA;AAAA;AAAA;AAAA;AAAA;AAOA,IAAI8E,KAAoB;AAAA,EACtB,OAAO;AAAA,EACP,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,aAAa;AAAA,EACb,eAAe;AAAA,EACf,gBAAgB;AAClB;ACjBA;AAAA;AAAA;AAAA;AAAA;AAAA;AAWA,MAAMC,KAAOC;AAAA,EACX,CAAC;AAAA,IACC,OAAA/D,IAAQ;AAAA,IACR,MAAAgE,IAAO;AAAA,IACP,aAAAC,IAAc;AAAA,IACd,qBAAAC;AAAA,IACA,WAAArB,IAAY;AAAA,IACZ,UAAAsB;AAAA,IACA,UAAAC;AAAA,IACA,GAAGC;AAAA,EACP,GAAKC,MACMC;AAAA,IACL;AAAA,IACA;AAAA,MACE,KAAAD;AAAA,MACA,GAAGT;AAAA,MACH,OAAOG;AAAA,MACP,QAAQA;AAAA,MACR,QAAQhE;AAAA,MACR,aAAakE,IAAsB,OAAOD,CAAW,IAAI,KAAK,OAAOD,CAAI,IAAIC;AAAA,MAC7E,WAAWP,GAAa,UAAUb,CAAS;AAAA,MAC3C,GAAGwB;AAAA,IACX;AAAA,IACM;AAAA,MACE,GAAGD,EAAS,IAAI,CAAC,CAACI,GAAKC,CAAK,MAAMF,GAAcC,GAAKC,CAAK,CAAC;AAAA,MAC3D,GAAG,MAAM,QAAQN,CAAQ,IAAIA,IAAW,CAACA,CAAQ;AAAA,IACzD;AAAA,EACA;AAEA;ACxCA;AAAA;AAAA;AAAA;AAAA;AAAA;AAWA,MAAMO,KAAmB,CAACC,GAAUP,MAAa;AAC/C,QAAMQ,IAAYb;AAAA,IAChB,CAAC,EAAE,WAAAlB,GAAW,GAAG1L,EAAK,GAAImN,MAAQC,GAAcT,IAAM;AAAA,MACpD,KAAAQ;AAAA,MACA,UAAAF;AAAA,MACA,WAAWV,GAAa,UAAUF,GAAYmB,CAAQ,CAAC,IAAI9B,CAAS;AAAA,MACpE,GAAG1L;AAAA,IACT,CAAK;AAAA,EACL;AACE,SAAAyN,EAAU,cAAc,GAAGD,CAAQ,IAC5BC;AACT;ACtBA;AAAA;AAAA;AAAA;AAAA;AAAA;AASA,MAAMC,KAAcH,GAAiB,eAAe;AAAA,EAClD,CAAC,QAAQ,EAAE,GAAG,kBAAkB,KAAK,SAAQ,CAAE;AACjD,CAAC;ACXD;AAAA;AAAA;AAAA;AAAA;AAAA;AASA,MAAMI,KAAeJ,GAAiB,gBAAgB;AAAA,EACpD,CAAC,QAAQ,EAAE,GAAG,iBAAiB,KAAK,SAAQ,CAAE;AAChD,CAAC;ACXD;AAAA;AAAA;AAAA;AAAA;AAAA;AASA,MAAMK,KAAWL,GAAiB,YAAY;AAAA,EAC5C,CAAC,QAAQ,EAAE,GAAG,6CAA6C,KAAK,SAAQ,CAAE;AAAA,EAC1E,CAAC,YAAY,EAAE,QAAQ,oBAAoB,KAAK,SAAQ,CAAE;AAAA,EAC1D,CAAC,QAAQ,EAAE,IAAI,MAAM,IAAI,MAAM,IAAI,MAAM,IAAI,KAAK,KAAK,SAAQ,CAAE;AACnE,CAAC;ACbD;AAAA;AAAA;AAAA;AAAA;AAAA;AASA,MAAMM,KAASN,GAAiB,UAAU;AAAA,EACxC;AAAA,IACE;AAAA,IACA;AAAA,MACE,GAAG;AAAA,MACH,KAAK;AAAA,IACX;AAAA,EACA;AAAA,EACE,CAAC,QAAQ,EAAE,GAAG,aAAa,KAAK,SAAQ,CAAE;AAC5C,CAAC;AClBD;AAAA;AAAA;AAAA;AAAA;AAAA;AASA,MAAMO,KAAYP,GAAiB,aAAa;AAAA,EAC9C,CAAC,QAAQ,EAAE,GAAG,qDAAqD,KAAK,SAAQ,CAAE;AAAA,EAClF,CAAC,QAAQ,EAAE,GAAG,YAAY,KAAK,SAAQ,CAAE;AAC3C,CAAC;ACZD;AAAA;AAAA;AAAA;AAAA;AAAA;AASA,MAAMQ,KAAWR,GAAiB,YAAY;AAAA,EAC5C,CAAC,QAAQ,EAAE,GAAG,qDAAqD,KAAK,SAAQ,CAAE;AAAA,EAClF,CAAC,QAAQ,EAAE,GAAG,cAAc,KAAK,SAAQ,CAAE;AAC7C,CAAC;ACZD;AAAA;AAAA;AAAA;AAAA;AAAA;AASA,MAAMS,KAAIT,GAAiB,KAAK;AAAA,EAC9B,CAAC,QAAQ,EAAE,GAAG,cAAc,KAAK,SAAQ,CAAE;AAAA,EAC3C,CAAC,QAAQ,EAAE,GAAG,cAAc,KAAK,SAAQ,CAAE;AAC7C,CAAC;ACZD;AAAA;AAAA;AAAA;AAAA;AAAA;AASA,MAAMU,KAASV,GAAiB,UAAU;AAAA,EACxC,CAAC,UAAU,EAAE,IAAI,MAAM,IAAI,MAAM,GAAG,KAAK,KAAK,UAAU;AAAA,EACxD,CAAC,QAAQ,EAAE,IAAI,MAAM,IAAI,SAAS,IAAI,MAAM,IAAI,SAAS,KAAK,SAAQ,CAAE;AAAA,EACxE,CAAC,QAAQ,EAAE,IAAI,MAAM,IAAI,MAAM,IAAI,KAAK,IAAI,MAAM,KAAK,SAAQ,CAAE;AAAA,EACjE,CAAC,QAAQ,EAAE,IAAI,KAAK,IAAI,MAAM,IAAI,MAAM,IAAI,MAAM,KAAK,SAAQ,CAAE;AACnE,CAAC;ACdD;AAAA;AAAA;AAAA;AAAA;AAAA;AASA,MAAMW,KAAUX,GAAiB,WAAW;AAAA,EAC1C,CAAC,UAAU,EAAE,IAAI,MAAM,IAAI,MAAM,GAAG,KAAK,KAAK,UAAU;AAAA,EACxD,CAAC,QAAQ,EAAE,IAAI,MAAM,IAAI,SAAS,IAAI,MAAM,IAAI,SAAS,KAAK,SAAQ,CAAE;AAAA,EACxE,CAAC,QAAQ,EAAE,IAAI,KAAK,IAAI,MAAM,IAAI,MAAM,IAAI,MAAM,KAAK,SAAQ,CAAE;AACnE,CAAC,GC2BKY,KAAkBpO,EAAO;AAAA;AAAA;AAAA;AAAA;AAAA,aAKlB,CAAAC,MAASA,EAAM,OAAO,MAAM,OAAO;AAAA,6BACnB,CAAAA,MAASA,EAAM,OAAO,OAAO,MAAM;AAAA,gBAChD,CAAAA,MAASA,EAAM,OAAO,OAAO,UAAU;AAAA;AAAA,GAIjDoO,KAAWrO,EAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAQlBsO,KAAWtO,EAAO;AAAA;AAAA;AAAA,WAGb,CAAAC,MAASA,EAAM,OAAO,OAAO,IAAI;AAAA;AAAA;AAAA;AAAA,GAMtCsO,KAAWvO,EAAO;AAAA;AAAA,WAEb,CAAAC,MAASA,EAAM,OAAO,OAAO,YAAY;AAAA;AAAA,GAI9CuO,KAAUxO,EAAO;AAAA;AAAA;AAAA;AAAA,GAMjByO,KAAazO,EAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAOP,CAAAC,MAASA,EAAM,OAAO,MAAM,MAAM;AAAA,gBACrC,CAAAA,MAASA,EAAM,UAAUA,EAAM,OAAO,OAAO,UAAU,OAAO,aAAa;AAAA,WAChF,CAAAA,MAASA,EAAM,UAAUA,EAAM,OAAO,OAAO,UAAUA,EAAM,OAAO,OAAO,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAWxE,CAAAA,MAASA,EAAM,OAAO,OAAO,UAAU,IAAI;AAAA,aAChD,CAAAA,MAASA,EAAM,OAAO,OAAO,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAS3CyO,KAAW1O,EAAO;AAAA;AAAA,WAEb,CAAAC,MAASA,EAAM,OAAO,OAAO,YAAY;AAAA;AAAA;AAAA,GAM9CH,KAAyB;AAAA,EAC7B,QAAQ;AAAA,IACN,SAAS;AAAA,IACT,WAAW;AAAA,IACX,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAO;AAAA,IACP,MAAM;AAAA,IACN,YAAY;AAAA,IACZ,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,oBAAoB;AAAA,IACpB,cAAc;AAAA,EAAA;AAAA,EAEhB,OAAO;AAAA,IACL,SAAS;AAAA,IACT,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,YAAY;AAAA,EAAA;AAEhB,GASM6O,KAAgC/O,EAAM,KAAK,CAAC;AAAA,EAChD,UAAAqD,IAAW;AAAA,EACX,aAAA5C,IAAc;AAAA,EACd,WAAAgL,IAAY;AAAA,EACZ,OAAAI,IAAQ;AAAA,IACN,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,MAAM;AAAA,IACN,OAAO;AAAA,IACP,YAAY;AAAA,IACZ,QAAQ;AAAA,EAAA;AAAA,EAEV,QAAA9K;AAAA,EACA,YAAAiO;AAAA,EACA,YAAAC;AAAA,EACA,UAAAC;AAAA,EACA,WAAAC;AAAA,EACA,oBAAAC;AAAA,EACA,YAAAC;AAAA,EACA,cAAAC;AAAA,EACA,eAAAC;AAAA,EACA,SAAAC;AAAA,EACA,OAAA1R,IAAQ;AAAA,EACR,cAAAC,IAAe;AAAA,EACf,WAAAgO;AACF,MAAM;AAEJ,QAAMvK,KAAcT,uBAAQ,UAASb;AAGrC,iBAAQ,IAAI,iDAA6BO,GAAa,cAAcgL,CAAS,GAG3E,gBAAAzL,EAAA,cAACwO,MAAgB,QAAQhN,GAAa,WAAAuK,KACpC,gBAAA/L,EAAA,cAACyO,IAAA,EAAS,QAAQjN,EAAA,GAChB,gBAAAxB,EAAA,cAAC0O,IAAA,EAAS,QAAQlN,EAAA,GACf6B,CACH,CACF,GAEA,gBAAArD,EAAA,cAAC4O,MAAQ,QAAQpN,EAAA,GAEdqK,EAAM,cACL,gBAAA7L,EAAA,cAAAA,EAAA,UAAA,MACE,gBAAAA,EAAA;AAAA,IAAC6O;AAAA,IAAA;AAAA,MACC,QAAQrN;AAAA,MACR,SAASwN;AAAA,MACT,UAAUvO,KAAe;AAAA,MACzB,OAAM;AAAA,IAAA;AAAA,IAEN,gBAAAT,EAAA,cAAC+N,IAAA,EAAY,MAAM,GAAA,CAAI;AAAA,EAAA,GAExBtC,IAAY,KACX,gBAAAzL,EAAA,cAAC2O,IAAA,EAAS,QAAQnN,EAAA,GACff,GAAY,OAAIgL,CACnB,GAEF,gBAAAzL,EAAA;AAAA,IAAC6O;AAAA,IAAA;AAAA,MACC,QAAQrN;AAAA,MACR,SAASyN;AAAA,MACT,UAAU,CAACxD,KAAahL,KAAegL;AAAA,MACvC,OAAM;AAAA,IAAA;AAAA,IAEN,gBAAAzL,EAAA,cAACgO,IAAA,EAAa,MAAM,GAAA,CAAI;AAAA,EAAA,CAE5B,GAIDnC,EAAM,QACL,gBAAA7L,EAAA,cAAAA,EAAA,UAAA,MACE,gBAAAA,EAAA;AAAA,IAAC6O;AAAA,IAAA;AAAA,MACC,QAAQrN;AAAA,MACR,SAAS2N;AAAA,MACT,UAAUrR,KAAS;AAAA,MACnB,OAAM;AAAA,IAAA;AAAA,IAEN,gBAAAkC,EAAA,cAACuO,IAAA,EAAQ,MAAM,GAAA,CAAI;AAAA,EAAA,GAErB,gBAAAvO,EAAA,cAAC8O,IAAA,EAAS,QAAQtN,EAAA,GACf,KAAK,MAAM1D,IAAQ,GAAG,GAAE,GAC3B,GACA,gBAAAkC,EAAA;AAAA,IAAC6O;AAAA,IAAA;AAAA,MACC,QAAQrN;AAAA,MACR,SAAS0N;AAAA,MACT,UAAUpR,KAAS;AAAA,MACnB,OAAM;AAAA,IAAA;AAAA,IAEN,gBAAAkC,EAAA,cAACsO,IAAA,EAAO,MAAM,GAAA,CAAI;AAAA,EAAA,CAEtB,GAIDzC,EAAM,cACL,gBAAA7L,EAAA;AAAA,IAAC6O;AAAA,IAAA;AAAA,MACC,QAAQrN;AAAA,MACR,SAASzD;AAAA,MACT,SAASqR;AAAA,MACT,OAAOrR,IAAe,6BAAS;AAAA,IAAA;AAAA,IAE/B,gBAAAiC,EAAA,cAACkO,IAAA,EAAO,MAAM,GAAA,CAAI;AAAA,EAAA,GAKrBrC,EAAM,YACL,gBAAA7L,EAAA;AAAA,IAAC6O;AAAA,IAAA;AAAA,MACC,QAAQrN;AAAA,MACR,SAAS6N;AAAA,MACT,OAAM;AAAA,IAAA;AAAA,IAEN,gBAAArP,EAAA,cAACiO,IAAA,EAAS,MAAM,GAAA,CAAI;AAAA,EAAA,GAKvBpC,EAAM,UACL,gBAAA7L,EAAA,cAAAA,EAAA,UAAA,MACE,gBAAAA,EAAA;AAAA,IAAC6O;AAAA,IAAA;AAAA,MACC,QAAQrN;AAAA,MACR,SAAS8N;AAAA,MACT,OAAM;AAAA,IAAA;AAAA,IAEN,gBAAAtP,EAAA,cAACmO,IAAA,EAAU,MAAM,GAAA,CAAI;AAAA,EAAA,GAEvB,gBAAAnO,EAAA;AAAA,IAAC6O;AAAA,IAAA;AAAA,MACC,QAAQrN;AAAA,MACR,SAAS+N;AAAA,MACT,OAAM;AAAA,IAAA;AAAA,IAEN,gBAAAvP,EAAA,cAACoO,IAAA,EAAS,MAAM,GAAA,CAAI;AAAA,EAAA,CAExB,GAIDvC,EAAM,SACL,gBAAA7L,EAAA;AAAA,IAAC6O;AAAA,IAAA;AAAA,MACC,QAAQrN;AAAA,MACR,SAASgO;AAAA,MACT,OAAM;AAAA,IAAA;AAAA,IAEN,gBAAAxP,EAAA,cAACqO,IAAA,EAAE,MAAM,GAAA,CAAI;AAAA,EAAA,CAGnB,CACF;AAEJ,CAAC,GChRKoB,KAA4B,MAAM;AAEtC,MAAIC,MAAyB;AAC3B,YAAQ,IAAI,qCAAiB;AAC7B;AAAA,EACF;AAGA,QAAMC,IACJ;AAAA;AAAA;AAAA;AAKF,gBAAQ,MAAMA,CAAQ,GAChB,IAAI,MAAMA,CAAQ;AAC1B,GASaxM,KAAiB,CAACE,GAAmBC,GAAmBzD,MAA4B;AAC/F,MAAI,CAACwD,KAAY,CAACC,KAAY,CAACzD,EAAS,QAAO;AAE/C,QAAM+P,IAAOvM,KAAY,IACnBwM,IAAOvM,KAAY;AAEzB,SAAIsM,EAAK,YAAA,EAAc,SAAS,MAAM,KAAKC,MAAS,UAAShQ,KAAA,OAAA,SAAAA,EAAS,UAAS,QACtE,QAEL+P,EAAK,YAAA,EAAc,MAAM,gCAAgC,KAAKC,MAAS,YAAWhQ,KAAA,OAAA,SAAAA,EAAS,UAAS,UAC/F,UAEL+P,EAAK,YAAA,EAAc,SAAS,KAAK,KAAKC,MAAS,eAAchQ,KAAA,OAAA,SAAAA,EAAS,UAAS,aAE7EgQ,MAAS,qBAAoBhQ,KAAA,OAAA,SAAAA,EAAS,UAAS,mBAC1C,mBAEF,aAEL+P,EAAK,YAAA,EAAc,MAAM,eAAe,KAAKC,MAAS,WAAUhQ,KAAA,OAAA,SAAAA,EAAS,UAAS,SAC7E,SAEL+P,EAAK,YAAA,EAAc,MAAM,iCAAiC,KAAKC,MAAS,WAAUhQ,KAAA,OAAA,SAAAA,EAAS,UAAS,SAC/F,SAGF;AACT,GAQaiQ,KAAe,OAAO1M,GAA4B2M,IAAwB,OAA6B;AAClH,UAAQ,IAAI,mCAAyB,GACrC,QAAQ,IAAI,6BAAS,EAAE,MAAM,OAAO3M,GAAM,SAAA2M,GAAS;AAEnD,MAAI;AAEF,IAAAN,GAAA;AAEA,QAAIjP;AAEJ,QAAI,OAAO4C,KAAS,UAAU;AAC5B,cAAQ,IAAI,6BAAcA,CAAI;AAE9B,YAAM4M,IAAcC,GAAS,YAAY;AAAA,QACvC,KAAK7M;AAAA,QACL,aAAa2M,EAAQ,QAAQ,EAAE,eAAiBA,EAAQ,UAAU;AAAA,MAAA,CACnE;AACD,cAAQ,IAAI,6DAAqB,GACjC,QAAQ,IAAI,yCAAWC,CAAW,GAClC,QAAQ,IAAI,yCAAW,OAAOA,CAAW,GACzC,QAAQ,IAAI,yCAAW,OAAO,oBAAoB,OAAO,eAAeA,CAAW,CAAC,CAAC,GACrF,QAAQ,IAAI,yCAAW,OAAO,KAAKA,CAAW,CAAC,GAE/CxP,IAAc,MAAMwP,EAAY,SAChC,QAAQ,IAAI,iDAAmB,GAC/B,QAAQ,IAAI,gCAAYxP,CAAW,GACnC,QAAQ,IAAI,gCAAY,OAAOA,CAAW,GAC1C,QAAQ,IAAI,gCAAY,OAAO,oBAAoB,OAAO,eAAeA,CAAW,CAAC,CAAC,GACtF,QAAQ,IAAI,gCAAY,OAAO,KAAKA,CAAW,CAAC;AAAA,IAClD,OAAO;AACL,cAAQ,IAAI,kCAAmB;AAE/B,YAAMwP,IAAcC,GAAS,YAAY;AAAA,QACvC,MAAA7M;AAAA,MAAA,CACD;AACD,cAAQ,IAAI,6DAAqB,GACjC,QAAQ,IAAI,yCAAW4M,CAAW,GAClC,QAAQ,IAAI,yCAAW,OAAOA,CAAW,GAEzCxP,IAAc,MAAMwP,EAAY,SAChC,QAAQ,IAAI,iDAAmB,GAC/B,QAAQ,IAAI,gCAAYxP,CAAW,GACnC,QAAQ,IAAI,gCAAY,OAAOA,CAAW;AAAA,IAC5C;AAEA,UAAM0P,IAAa1P,EAAY;AAC/B,YAAQ,IAAI,wDAAgB0P,CAAU,GACtC,QAAQ,IAAI,oBAAU1P,EAAY,YAAY,GAC9C,QAAQ,IAAI,gCAAYA,EAAY,UAAU;AAE9C,UAAM2P,IAAsB;AAAA,MAC1B,MAAM;AAAA,MACN,SAAS;AAAA,QACP,MAAM;AAAA,QACN,UAAU3P;AAAA,QACV,YAAA0P;AAAA,MAAA;AAAA,MAEF,UAAUH,EAAQ;AAAA,MAClB,UAAU;AAAA,MACV,YAAAG;AAAA,IAAA;AAGF,mBAAQ,IAAI,0DAAkB,GAC9B,QAAQ,IAAI,6BAASC,CAAM,GAC3B,QAAQ,IAAI,yCAAW,OAAOA,CAAM,GACpC,QAAQ,IAAI,yCAAW,OAAO,KAAKA,CAAM,CAAC,GAC1C,QAAQ,IAAI,6BAASA,EAAO,OAAO,GACnC,QAAQ,IAAI,6BAASA,EAAO,QAAQ,QAAQ,GAErCA;AAAA,EACL,SAASjP,GAAO;AAChB,YAAQ,MAAM,gCAAYA,CAAK,GAC/B,QAAQ,MAAM,6BAAS;AAAA,MACrB,SAASA,aAAiB,QAAQA,EAAM,UAAU;AAAA,MAClD,OAAOA,aAAiB,QAAQA,EAAM,QAAQ;AAAA,MAC9C,MAAMA,aAAiB,QAAQA,EAAM,OAAO;AAAA,MAC5C,KAAK,OAAOkC,KAAS,WAAWA,IAAO;AAAA,MACvC,SAAA2M;AAAA,IAAA,CACD;AAGD,QAAIK,IAAe;AACnB,WAAIlP,aAAiB,UACfA,EAAM,QAAQ,SAAS,+BAAgB,KAAKA,EAAM,QAAQ,SAAS,2BAAY,IAEjFkP,IAAelP,EAAM,UACZA,EAAM,QAAQ,SAAS,uBAAuB,IACvDkP,IAAe,yIACNlP,EAAM,QAAQ,SAAS,iBAAiB,IACjDkP,IAAe,iHACNlP,EAAM,QAAQ,SAAS,QAAQ,KAAKA,EAAM,QAAQ,SAAS,QAAQ,IAC5EkP,IAAe,2LAEfA,IAAe,gCAAYlP,EAAM,OAAO,KAIrC;AAAA,MACL,MAAM;AAAA,MACN,SAAS;AAAA,MACT,UAAU6O,EAAQ;AAAA,MAClB,UAAU;AAAA,MACV,OAAOK;AAAA,IAAA;AAAA,EAEX;AACJ,GAQaC,KAAiB,OAAOjN,GAA4B2M,IAAwB,OAA6B;AACpH,UAAQ,IAAI,qCAA2B,GACvC,QAAQ,IAAI,6BAAS,EAAE,MAAM,OAAO3M,GAAM,SAAA2M,GAAS;AAEnD,MAAI;AACF,QAAItL;AAEJ,QAAI,OAAOrB,KAAS;AAClB,cAAQ,IAAI,sCAAaA,CAAI,GAE7BqB,IAAWrB;AAAA,SACN;AACL,cAAQ,IAAI,2CAAkB;AAE9B,YAAMkN,IAAO,IAAI,KAAK,CAAClN,CAAI,CAAC;AAC5B,MAAAqB,IAAW,IAAI,gBAAgB6L,CAAI;AAAA,IACrC;AAGA,YAAQ,IAAI,+CAAY7L,CAAQ,GAChC,MAAM,IAAI,QAAc,CAAC8L,GAASC,MAAW;AAC3C,YAAMC,IAAM,IAAI,MAAA;AAEhB,MAAAA,EAAI,SAAS,MAAM;AACjB,gBAAQ,IAAI,+CAAYhM,CAAQ,GAChC,QAAQ,IAAI,6BAASgM,EAAI,OAAO,KAAKA,EAAI,MAAM,GAC/CF,EAAA;AAAA,MACF,GAEAE,EAAI,UAAU,MAAM;AAClB,gBAAQ,MAAM,+CAAYhM,CAAQ,GAClC+L,EAAO,IAAI,MAAM,sCAAQ,CAAC;AAAA,MAC5B;AAGA,YAAME,IAAU,WAAW,MAAM;AAC/B,QAAAF,EAAO,IAAI,MAAM,sCAAQ,CAAC;AAAA,MAC5B,GAAG,GAAK;AAER,MAAAC,EAAI,SAAS,MAAM;AACjB,qBAAaC,CAAO,GACpB,QAAQ,IAAI,+CAAYjM,CAAQ,GAChC,QAAQ,IAAI,6BAASgM,EAAI,OAAO,KAAKA,EAAI,MAAM,GAC/CF,EAAA;AAAA,MACF,GAEAE,EAAI,UAAU,MAAM;AAClB,qBAAaC,CAAO,GACpB,QAAQ,MAAM,+CAAYjM,CAAQ,GAClC+L,EAAO,IAAI,MAAM,sCAAQ,CAAC;AAAA,MAC5B,GAEAC,EAAI,MAAMhM;AAAA,IACZ,CAAC;AAED,UAAM0L,IAAsB;AAAA,MAC1B,MAAM;AAAA,MACN,SAAS;AAAA,QACP,MAAM;AAAA,QACN,KAAK1L;AAAA,MAAA;AAAA,MAEP,UAAUsL,EAAQ;AAAA,MAClB,UAAU;AAAA,IAAA;AAGZ,mBAAQ,IAAI,qCAA2B,GACvC,QAAQ,IAAI,WAAWI,CAAM,GAEtBA;AAAA,EACT,SAASjP,GAAO;AACd,mBAAQ,MAAM,yCAAWA,CAAK,GACvB;AAAA,MACL,MAAM;AAAA,MACN,SAAS;AAAA,MACT,UAAU6O,EAAQ;AAAA,MAClB,UAAU;AAAA,MACV,OAAO,yCAAW7O,aAAiB,QAAQA,EAAM,UAAU,0BAAM;AAAA,IAAA;AAAA,EAErE;AACF,GAQayP,KAAgB,OAAOvN,GAA4B2M,IAAwB,OAA6B;AACnH,MAAI;AACF,QAAI9K;AAEJ,QAAI,OAAO7B,KAAS,UAAU;AAE5B,YAAMwN,IAAW,MAAM,MAAMxN,GAAM;AAAA,QACjC,SAAS2M,EAAQ,QAAQ,EAAE,eAAiBA,EAAQ,UAAU;AAAA,MAAA,CAC/D;AACD,UAAI,CAACa,EAAS;AACZ,cAAM,IAAI,MAAM,QAAQA,EAAS,MAAM,KAAKA,EAAS,UAAU,EAAE;AAEnE,MAAA3L,IAAc,MAAM2L,EAAS,KAAA;AAAA,IAC/B;AAGE,MAAA3L,IADgB,IAAI,YAAY,OAAO,EACjB,OAAO7B,CAAI;AAGnC,WAAO;AAAA,MACL,MAAM;AAAA,MACN,SAAS;AAAA,QACP,MAAM;AAAA,QACN,MAAM6B;AAAA,MAAA;AAAA,MAER,UAAU8K,EAAQ;AAAA,MAClB,UAAU;AAAA,IAAA;AAAA,EAEd,SAAS7O,GAAO;AACd,WAAO;AAAA,MACL,MAAM;AAAA,MACN,SAAS;AAAA,MACT,UAAU6O,EAAQ;AAAA,MAClB,UAAU;AAAA,MACV,OAAO,yCAAW7O,aAAiB,QAAQA,EAAM,UAAU,0BAAM;AAAA,IAAA;AAAA,EAErE;AACF,GAQa2P,KAAoB,OAAOzN,GAA4B2M,IAAwB,OAA6B;AACvH,MAAI;AACF,QAAIe;AAEJ,QAAI,OAAO1N,KAAS,UAAU;AAE5B,YAAMwN,IAAW,MAAM,MAAMxN,GAAM;AAAA,QACjC,SAAS2M,EAAQ,QAAQ,EAAE,eAAiBA,EAAQ,UAAU;AAAA,MAAA,CAC/D;AACD,UAAI,CAACa,EAAS;AACZ,cAAM,IAAI,MAAM,QAAQA,EAAS,MAAM,KAAKA,EAAS,UAAU,EAAE;AAEnE,MAAAE,IAAkB,MAAMF,EAAS,KAAA;AAAA,IACnC;AAGE,MAAAE,IADgB,IAAI,YAAY,OAAO,EACb,OAAO1N,CAAI;AAGvC,WAAO;AAAA,MACL,MAAM;AAAA,MACN,SAAS;AAAA,QACP,MAAM;AAAA,QACN,MAAM0N;AAAA,MAAA;AAAA,MAER,UAAUf,EAAQ;AAAA,MAClB,UAAU;AAAA,IAAA;AAAA,EAEd,SAAS7O,GAAO;AACd,WAAO;AAAA,MACL,MAAM;AAAA,MACN,SAAS;AAAA,MACT,UAAU6O,EAAQ;AAAA,MAClB,UAAU;AAAA,MACV,OAAO,qCAAiB7O,aAAiB,QAAQA,EAAM,UAAU,0BAAM;AAAA,IAAA;AAAA,EAE3E;AACF,GAQa6P,KAAgB,OAAO3N,GAA4B2M,IAAwB,OAA6B;AACnH,UAAQ,IAAI,oCAA0B,GACtC,QAAQ,IAAI,6BAAS,EAAE,MAAM,OAAO3M,GAAM,SAAA2M,GAAS;AAEnD,MAAI;AACF,QAAI1E;AAEJ,QAAI,OAAOjI,KAAS,UAAU;AAC5B,cAAQ,IAAI,8BAAeA,CAAI;AAE/B,YAAMwN,IAAW,MAAM,MAAMxN,GAAM;AAAA,QACjC,SAAS2M,EAAQ,QAAQ,EAAE,eAAiBA,EAAQ,UAAU;AAAA,MAAA,CAC/D;AAGD,UAFA,QAAQ,IAAI,iCAAaa,EAAS,QAAQA,EAAS,UAAU,GAEzD,CAACA,EAAS;AACZ,cAAM,IAAI,MAAM,QAAQA,EAAS,MAAM,KAAKA,EAAS,UAAU,EAAE;AAEnE,MAAAvF,IAAc,MAAMuF,EAAS,KAAA,GAC7B,QAAQ,IAAI,iCAAavF,EAAY,MAAM,GAC3C,QAAQ,IAAI,0CAAiBA,EAAY,UAAU,GAAG,GAAG,CAAC;AAAA,IAC5D;AACE,cAAQ,IAAI,mCAAoB,GAGhCA,IADgB,IAAI,YAAY,OAAO,EACjB,OAAOjI,CAAI;AAGnC,UAAM+M,IAAsB;AAAA,MAC1B,MAAM;AAAA,MACN,SAAS;AAAA,QACP,MAAM;AAAA,QACN,MAAM9E;AAAA,MAAA;AAAA,MAER,UAAU0E,EAAQ;AAAA,MAClB,UAAU;AAAA,IAAA;AAGZ,mBAAQ,IAAI,oCAA0B,GACtC,QAAQ,IAAI,WAAWI,CAAM,GAC7B,QAAQ,IAAI,qCAA2BA,EAAO,QAAQ,KAAK,MAAM,GACjE,QAAQ,IAAI,8CAA+BA,EAAO,QAAQ,KAAK,UAAU,GAAG,GAAG,CAAC,GAEzEA;AAAA,EACT,SAASjP,GAAO;AACd,mBAAQ,MAAM,iCAAaA,CAAK,GACzB;AAAA,MACL,MAAM;AAAA,MACN,SAAS;AAAA,MACT,UAAU6O,EAAQ;AAAA,MAClB,UAAU;AAAA,MACV,OAAO,iCAAa7O,aAAiB,QAAQA,EAAM,UAAU,0BAAM;AAAA,IAAA;AAAA,EAEvE;AACF,GAQa8P,KAAY,OAAO5N,GAA4B2M,IAAwB,OAA6B;AAG/G,UAFiB5M,GAAe4M,EAAQ,UAAUA,EAAQ,QAAQ,GAE1D;AAAA,IACN,KAAK;AACH,aAAO,MAAMD,GAAa1M,GAAM2M,CAAO;AAAA,IACzC,KAAK;AACH,aAAO,MAAMM,GAAejN,GAAM2M,CAAO;AAAA,IAC3C,KAAK;AACH,aAAO,MAAMY,GAAcvN,GAAM2M,CAAO;AAAA,IAC1C,KAAK;AAAA,IACL,KAAK;AACH,aAAO,MAAMc,GAAkBzN,GAAM2M,CAAO;AAAA,IAC9C,KAAK;AACH,aAAO,MAAMgB,GAAc3N,GAAM2M,CAAO;AAAA,IAC1C;AACE,aAAO;AAAA,QACL,MAAM;AAAA,QACN,SAAS;AAAA,QACT,UAAUA,EAAQ;AAAA,QAClB,UAAUA,EAAQ;AAAA,QAClB,OAAO;AAAA,MAAA;AAAA,EACT;AAEN,GCxZMkB,KAAkB7Q,EAAO;AAAA;AAAA;AAAA;AAAA;AAAA,gBAKf,CAAAC,MAASA,EAAM,OAAO,OAAO,UAAU;AAAA,sBACjC,CAAAA,MAASA,EAAM,OAAO,OAAO,MAAM;AAAA,mBACtC,CAAAA,MAASA,EAAM,OAAO,MAAM,MAAM;AAAA;AAAA;AAAA,GAS/C6Q,KAGD,CAAC,EAAE,QAAAC,GAAQ,OAAAC,QAEZ,gBAAApR,EAAA;AAAA,EAAC;AAAA,EAAA;AAAA,IACC,OAAO;AAAA,MACL,SAAS;AAAA,MACT,eAAe;AAAA,MACf,YAAY;AAAA,MACZ,gBAAgB;AAAA,MAChB,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,YAAYoR,EAAM,OAAO;AAAA,IAAA;AAAA,EAC3B;AAAA,EAGA,gBAAApR,EAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,OAAO;AAAA,QACL,UAAU;AAAA,QACV,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,cAAc;AAAA,MAAA;AAAA,IAChB;AAAA,IAGA,gBAAAA,EAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,OAAO;AAAA,UACL,OAAO;AAAA,UACP,QAAQ;AAAA,UACR,YAAYoR,EAAM,OAAO;AAAA,UACzB,cAAc;AAAA,UACd,UAAU;AAAA,UACV,QAAQ;AAAA,QAAA;AAAA,MACV;AAAA,MAGA,gBAAApR,EAAA;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,OAAO;AAAA,YACL,UAAU;AAAA,YACV,KAAK;AAAA,YACL,OAAO;AAAA,YACP,OAAO;AAAA,YACP,QAAQ;AAAA,YACR,aAAa;AAAA,YACb,aAAa;AAAA,YACb,aAAa,eAAeoR,EAAM,OAAO,UAAU;AAAA,UAAA;AAAA,QACrD;AAAA,MAAA;AAAA,IACF;AAAA,IAIF,gBAAApR,EAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,OAAO;AAAA,UACL,UAAU;AAAA,UACV,KAAK;AAAA,UACL,MAAM;AAAA,UACN,WAAW;AAAA,UACX,OAAO;AAAA,UACP,QAAQ;AAAA,UACR,cAAc;AAAA,UACd,YAAYoR,EAAM,OAAO;AAAA,UACzB,WAAW;AAAA,QAAA;AAAA,MACb;AAAA,IAAA;AAAA,EACF;AAAA,EAIF,gBAAApR,EAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,OAAO;AAAA,QACL,UAAU;AAAA,QACV,YAAY;AAAA,QACZ,OAAOoR,EAAM,OAAO;AAAA,QACpB,cAAc;AAAA,QACd,WAAW;AAAA,MAAA;AAAA,IACb;AAAA,IAECD;AAAA,EAAA;AAAA,EAIH,gBAAAnR,EAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,OAAO;AAAA,QACL,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,YAAYoR,EAAM,OAAO;AAAA,QACzB,cAAc;AAAA,QACd,UAAU;AAAA,QACV,UAAU;AAAA,MAAA;AAAA,IACZ;AAAA,IAEA,gBAAApR,EAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,OAAO;AAAA,UACL,OAAO;AAAA,UACP,QAAQ;AAAA,UACR,YAAYoR,EAAM,OAAO;AAAA,UACzB,cAAc;AAAA,UACd,WAAW;AAAA,QAAA;AAAA,MACb;AAAA,IAAA;AAAA,EACF;AAAA,kCAID,SAAA,MAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,OAuBN;AAAA;AAKiBhR,EAAO;AAAA;AAAA;AAAA;AAAA;AAAA,WAKrB,CAAAC,MAASA,EAAM,OAAO,OAAO,YAAY;AAAA;AAAA;AAIpD,MAAM4C,KAAiB7C,EAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,WAMnB,CAAAC,MAASA,EAAM,OAAO,OAAO,KAAK;AAAA;AAAA;AAAA,GAMvCH,KAAyB;AAAA,EAC7B,QAAQ;AAAA,IACN,SAAS;AAAA,IACT,WAAW;AAAA,IACX,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAO;AAAA,IACP,MAAM;AAAA,IACN,YAAY;AAAA,IACZ,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,oBAAoB;AAAA,IACpB,cAAc;AAAA,EAAA;AAAA,EAEhB,OAAO;AAAA,IACL,SAAS;AAAA,IACT,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,YAAY;AAAA,EAAA;AAEhB,GASMmR,KAAoD,CAAC;AAAA,EACzD,SAAAC;AAAA,EACA,UAAAhO;AAAA,EACA,aAAAtF;AAAA,EACA,UAAAqF;AAAA,EACA,OAAAkO;AAAA,EACA,aAAAC,IAAc;AAAA,EACd,MAAApO;AAAA,EACA,YAAAwI,IAAa,MAAM;AAAA,EAAC;AAAA,EACpB,QAAA7K;AAAA,EACA,OAAA8K,IAAQ;AAAA,IACN,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,MAAM;AAAA,IACN,OAAO;AAAA,IACP,YAAY;AAAA,EAAA;AAAA,EAEd,kBAAAC;AAAA,EACA,WAAAC;AAAA,EACA,aAAA0F;AAAA,EACA,cAAAzF;AACF,MAAM;AAtRN,MAAAxI;AAwRE,QAAMhC,KAAcT,uBAAQ,UAASb,IAG/B,CAACc,GAAWC,CAAY,IAAIzC,EAAS,EAAI,GACzC,CAACyN,GAAeyF,CAAgB,IAAIlT,EAAiB,mCAAU,GAC/D,CAAC0C,GAAOC,CAAQ,IAAI3C,EAAwB,IAAI,GAChD,CAACmT,GAAaC,CAAc,IAAIpT,EAA6B,IAAI,GACjE,CAACiC,GAAaoR,CAAc,IAAIrT,EAASgT,CAAW,GACpD,CAAC1T,GAAO8C,CAAQ,IAAIpC,EAAS,CAAC,GAC9B,CAACmN,GAAUmG,CAAW,IAAItT,EAAS,CAAC,GACpC,CAACT,GAAcgU,CAAe,IAAIvT,EAAS,EAAK,GAMhDwT,IAAahT,EAAY,MAAM;AACnC,IAAAiC,EAAa,EAAI,GACjByQ,EAAiB,mCAAU,GAC3BvQ,EAAS,IAAI,GACbyQ,EAAe,IAAI,GACnBC,EAAeL,CAAW,GAC1BM,EAAY,CAAC,GACbC,EAAgB,EAAK;AAAA,EACvB,GAAG,CAACP,CAAW,CAAC,GAKVS,IAAWjT,EAAY,YAAY;AArT3C,QAAAwE,GAAAC;AA6TI,QAPA,QAAQ,IAAI,+BAAqB,GACjC,QAAQ,IAAI,6BAAS,EAAE,SAAA6N,GAAS,UAAAjO,GAAU,UAAAC,GAAU,MAAAF,GAAM,GAG1D4O,EAAA,GAGI5O,GAAM;AACR,MAAAnC,EAAa,EAAK,GAClBE,EAAS,IAAI,GACbyQ,EAAe;AAAA,QACb,MAAMxO,EAAK,YAAYE,KAAY;AAAA,QACnC,SAASF,EAAK;AAAA,QACd,UAAUA,EAAK,YAAYC;AAAA,QAC3B,UAAUD,EAAK,YAAYE;AAAA,QAC3B,YAAYF,EAAK,cAAc;AAAA,MAAA,CAChC;AACD;AAAA,IACF;AAEA,QAAI,CAACkO,GAAS;AACZ,MAAAnQ,EAAS,yCAAW,GACpBF,EAAa,EAAK;AAClB;AAAA,IACF;AAEA,QAAI;AACF,MAAAA,EAAa,EAAI,GACjBE,EAAS,IAAI;AAGb,YAAM+Q,IAAe/O,GAAeE,GAAUC,CAAQ;AACtD,MACEoO,EADEQ,MAAiB,UACF,sCACRA,MAAiB,QACT,yCACRA,MAAiB,cAAcA,MAAiB,mBACxC,8CAEA,mCANU;AAU7B,YAAM/B,IAAS,MAAMa,GAAUM,GAAS;AAAA,QACtC,UAAAjO;AAAA,QACA,UAAAC;AAAA,QACA,OAAAiO;AAAA,MAAA,CACD;AAED,cAAQ,IAAI,iDAAuC,GACnD,QAAQ,IAAI,WAAWpB,CAAM,GAC7B,QAAQ,IAAI,gBAAgBA,EAAO,IAAI,GACvC,QAAQ,IAAI,mBAAmBA,EAAO,OAAO,GAC7C,QAAQ,IAAI,0BAAyB3M,IAAA2M,EAAO,YAAP,OAAA,SAAA3M,EAAgB,IAAI,GACzD,QAAQ,IAAI,oBAAoB2M,EAAO,QAAQ,GAC/C,QAAQ,IAAI,oBAAoBA,EAAO,QAAQ,GAE3CA,EAAO,QACThP,EAASgP,EAAO,KAAK,KAGjBA,EAAO,SAAS,UAClBuB,EAAiB,sCAAQ,IAChBvB,EAAO,SAAS,QACzBuB,EAAiB,6BAAS,IACjBvB,EAAO,SAAS,cAAcA,EAAO,SAAS,mBACvDuB,EAAiB,kCAAc,IAE/BA,EAAiB,sCAAQ,GAG3B,QAAQ,IAAI,kCAAwB,GACpC,QAAQ,IAAI,gBAAgBvB,CAAM,GAClC,QAAQ,IAAI,wBAAwBA,EAAO,OAAO,GAClD,QAAQ,IAAI,kCAAiC1M,IAAA0M,EAAO,YAAP,kBAAgB,QAAQ,GACrEyB,EAAezB,CAAM;AAAA,IAEzB,SAASgC,GAAK;AACZ,MAAAhR,EAAS,yCAAWgR,aAAe,QAAQA,EAAI,UAAU,0BAAM,EAAE;AAAA,IACnE,UAAA;AACE,MAAAlR,EAAa,EAAK;AAAA,IACpB;AAAA,EACF,GAAG,CAACqQ,GAASjO,GAAUC,GAAUiO,GAAOnO,GAAM4O,CAAU,CAAC;AAGzD,EAAAtP,GAAU,MAAM;AACd,IAAAuP,EAAA;AAAA,EACF,GAAG,CAACA,CAAQ,CAAC;AAKb,QAAMG,IAAmBpT;AAAA,IACvB,CAAC4Q,GAAcxM,GAAYiP,MAAkB;AAE3C,cAAQzC,GAAA;AAAA,QACN,KAAK;AACH,UAAIxM,KAAA,QAAAA,EAAM,cACRyO,EAAezO,EAAK,UAAU;AAEhC;AAAA;AAAA;AAAA;AAAA;AAAA,QAMF;AAEE,UAAAwI,EAAWgE,GAAMxM,GAAMiP,CAAO;AAC9B;AAAA,MAAA;AAAA,IAEN;AAAA,IACA,CAACzG,CAAU;AAAA,EAAA,GAMP0G,IAAetT,EAAY,MAAM;AACrC,UAAMuT,IAAW,KAAK,IAAI,GAAGzU,IAAQ,GAAG;AACxC,IAAA8C,EAAS2R,CAAQ,GACjBH,EAAiB,eAAe,EAAE,OAAOG,EAAA,CAAU;AAAA,EACrD,GAAG,CAACzU,GAAOsU,CAAgB,CAAC,GAKtBI,IAAgBxT,EAAY,MAAM;AACtC,UAAMuT,IAAW,KAAK,IAAI,KAAKzU,IAAQ,GAAG;AAC1C,IAAA8C,EAAS2R,CAAQ,GACjBH,EAAiB,eAAe,EAAE,OAAOG,EAAA,CAAU;AAAA,EACrD,GAAG,CAACzU,GAAOsU,CAAgB,CAAC,GAKtBK,IAAiBzT,EAAY,MAAM;AACvC,QAAIyB,IAAc,GAAG;AACnB,YAAMiS,IAAUjS,IAAc;AAC9B,MAAAoR,EAAea,CAAO,GACtBN,EAAiB,eAAe,EAAE,MAAMM,EAAA,CAAS;AAAA,IACnD;AAAA,EACF,GAAG,CAACjS,GAAa2R,CAAgB,CAAC,GAK5BO,IAAiB3T,EAAY,MAAM;AACvC,UAAMkR,KAAayB,uBAAa,eAAc;AAC9C,QAAIzB,KAAczP,IAAcyP,GAAY;AAC1C,YAAMwC,IAAUjS,IAAc;AAC9B,MAAAoR,EAAea,CAAO,GACtBN,EAAiB,eAAe,EAAE,MAAMM,EAAA,CAAS;AAAA,IACnD;AAAA,EACF,GAAG,CAACjS,GAAakR,KAAA,OAAA,SAAAA,EAAa,YAAYS,CAAgB,CAAC,GAKrDQ,IAAyB5T,EAAY,MAAM;AAC/C,UAAM6T,IAAgB,CAAC9U;AACvB,IAAAgU,EAAgBc,CAAa,GAC7BT,EAAiB,qBAAqB,EAAE,cAAcS,EAAA,CAAe;AAAA,EACvE,GAAG,CAAC9U,GAAcqU,CAAgB,CAAC,GAK7BU,KAAiB9T,EAAY,MAAM;AACvC,IAAAoT,EAAiB,kBAAkB,EAAE,SAAAd,GAAS,UAAAjO,EAAA,CAAU;AAAA,EAC1D,GAAG,CAAC+O,GAAkBd,GAASjO,CAAQ,CAAC,GAKlC0P,IAAmB/T,EAAY,MAAM;AACzC,IAAA8S,EAAY,CAAAkB,OAASA,IAAO,MAAM,GAAG,GACrCZ,EAAiB,eAAe,EAAE,WAAWzG,IAAW,MAAM,KAAK;AAAA,EACrE,GAAG,CAACA,GAAUyG,CAAgB,CAAC,GAKzBa,IAAoBjU,EAAY,MAAM;AAC1C,IAAA8S,EAAY,CAAAkB,OAASA,IAAO,MAAM,GAAG,GACrCZ,EAAiB,gBAAgB,EAAE,WAAWzG,IAAW,MAAM,KAAK;AAAA,EACtE,GAAG,CAACA,GAAUyG,CAAgB,CAAC,GAKzBc,IAAclU,EAAY,MAAM;AACpC,IAAAoT,EAAiB,cAAc;AAAA,EACjC,GAAG,CAACA,CAAgB,CAAC,GAKfe,KAAkBnU,EAAY,CAACsE,GAAkB8P,MAAwC;AAC7F,UAAMC,IAAkB/P,MAAa,OAC/BgQ,IACJhQ,MAAa,UACbA,MAAa,cACbA,MAAa,oBACbA,MAAa;AAEf,WAAO;AAAA,MACL,GAAG8P;AAAA;AAAA,MAEH,MAAMA,EAAU,QAAQ,CAACE;AAAA;AAAA,MAEzB,YAAYF,EAAU,cAAcC;AAAA;AAAA,MAEpC,YACED,EAAU,eACT9P,MAAa,SAASA,MAAa,cAAcA,MAAa;AAAA;AAAA,MAEjE,QAAQ8P,EAAU,UAAU9P,MAAa;AAAA;AAAA,MAEzC,UAAU8P,EAAU;AAAA;AAAA,MAEpB,OAAOA,EAAU;AAAA,IAAA;AAAA,EAErB,GAAG,CAAA,CAAE;AAGL,MAAIpS,GAAW;AACb,UAAMuS,IAAeJ,GAAgB7P,KAAY,WAAW;AAAA,MAC1D,GAAGuI;AAAA,MACH,YAAY;AAAA,IAAA,CACb;AAED,WACE,gBAAA7L,EAAA,cAACiR,IAAA,EAAgB,QAAQzP,GAAa,WAAAuK,KAEpC,gBAAA/L,EAAA;AAAA,MAAC+O;AAAA,MAAA;AAAA,QACC,UAAU1L,KAAY;AAAA,QACtB,aAAa;AAAA,QACb,WAAW;AAAA,QACX,OAAOkQ;AAAA,QACP,QAAAxS;AAAA,QACA,YAAY,MAAM;AAAA,QAAC;AAAA,QACnB,YAAY,MAAM;AAAA,QAAC;AAAA,QACnB,UAAU,MAAM;AAAA,QAAC;AAAA,QACjB,WAAW,MAAM;AAAA,QAAC;AAAA,QAClB,oBAAoB,MAAM;AAAA,QAAC;AAAA,QAC3B,YAAY,MAAM;AAAA,QAAC;AAAA,QACnB,SAASmS;AAAA,QACT,OAAO;AAAA,QACP,cAAc;AAAA,QACd,WAAWzB;AAAA,MAAA;AAAA,IAAA,GAIZ3F,KAAA,QAAAA,EAAkB,mDAChBA,EAAiB,kBAAjB,EAAkC,QAAQG,GAAe,OAAOzK,EAAA,CAAa,IAE9E,gBAAAxB,EAAA,cAACkR,IAAA,EAAwB,QAAQjF,GAAe,OAAOzK,GAAa,CAExE;AAAA,EAEJ;AAGA,MAAIN,GAAO;AACT,UAAMsS,IAAaL,GAAgB7P,KAAY,WAAW;AAAA,MACxD,GAAGuI;AAAA,MACH,YAAY;AAAA,IAAA,CACb;AAED,WACE,gBAAA7L,EAAA,cAACiR,IAAA,EAAgB,QAAQzP,GAAa,WAAAuK,KAEpC,gBAAA/L,EAAA;AAAA,MAAC+O;AAAA,MAAA;AAAA,QACC,UAAU1L,KAAY;AAAA,QACtB,aAAa;AAAA,QACb,WAAW;AAAA,QACX,OAAOmQ;AAAA,QACP,QAAAzS;AAAA,QACA,YAAY,MAAM;AAAA,QAAC;AAAA,QACnB,YAAY,MAAM;AAAA,QAAC;AAAA,QACnB,UAAU,MAAM;AAAA,QAAC;AAAA,QACjB,WAAW,MAAM;AAAA,QAAC;AAAA,QAClB,oBAAoB,MAAM;AAAA,QAAC;AAAA,QAC3B,YAAY,MAAM;AAAA,QAAC;AAAA,QACnB,SAASmS;AAAA,QACT,OAAO;AAAA,QACP,cAAc;AAAA,QACd,WAAWzB;AAAA,MAAA;AAAA,IAAA,mCAIZxO,IAAA,EAAe,QAAQzB,KACtB,gBAAAxB,EAAA,cAAC,OAAA,MAAI,sCAAM,GACX,gBAAAA,EAAA,cAAC,SAAI,OAAO,EAAE,UAAU,QAAQ,WAAW,WAAUkB,CAAM,CAC7D,CACF;AAAA,EAEJ;AAGA,MAAI,CAACyQ,GAAa;AAChB,UAAM8B,IAAeN,GAAgB7P,KAAY,WAAW;AAAA,MAC1D,GAAGuI;AAAA,MACH,YAAY;AAAA,IAAA,CACb;AAED,WACE,gBAAA7L,EAAA,cAACiR,IAAA,EAAgB,QAAQzP,GAAa,WAAAuK,KAEpC,gBAAA/L,EAAA;AAAA,MAAC+O;AAAA,MAAA;AAAA,QACC,UAAU1L,KAAY;AAAA,QACtB,aAAa;AAAA,QACb,WAAW;AAAA,QACX,OAAOoQ;AAAA,QACP,QAAA1S;AAAA,QACA,YAAY,MAAM;AAAA,QAAC;AAAA,QACnB,YAAY,MAAM;AAAA,QAAC;AAAA,QACnB,UAAU,MAAM;AAAA,QAAC;AAAA,QACjB,WAAW,MAAM;AAAA,QAAC;AAAA,QAClB,oBAAoB,MAAM;AAAA,QAAC;AAAA,QAC3B,YAAY,MAAM;AAAA,QAAC;AAAA,QACnB,SAASmS;AAAA,QACT,OAAO;AAAA,QACP,cAAc;AAAA,QACd,WAAWzB;AAAA,MAAA;AAAA,IAAA,mCAIZxO,IAAA,EAAe,QAAQzB,KACtB,gBAAAxB,EAAA,cAAC,OAAA,MAAI,sCAAM,CACb,CACF;AAAA,EAEJ;AAGA,QAAM0T,IAAa;AAAA,IACjB,SAAS/B,EAAY;AAAA,IACrB,IAAKA,EAAY,YAAYtO,MAAa,EAAE,UAAUsO,EAAY,YAAYtO,EAAA;AAAA,IAC9E,IAAKsO,EAAY,YAAYrO,MAAa,EAAE,UAAUqO,EAAY,YAAYrO,EAAA;AAAA,IAC9E,GAAIqO,EAAY,cAAc,EAAE,YAAYA,EAAY,WAAA;AAAA,EAAW,GAI/DgC,IAAeR,GAAgBxB,EAAY,MAAM9F,CAAK;AAE5D,iBAAQ,IAAI,iCAAuB,GACnC,QAAQ,IAAI,eAAe6H,CAAU,GACrC,QAAQ,IAAI,uBAAuBA,EAAW,OAAO,GACrD,QAAQ,IAAI,iCAAgClQ,IAAAkQ,EAAW,YAAX,kBAAoB,QAAQ,GACxE,QAAQ,IAAI,6BAAS/B,EAAY,IAAI,GACrC,QAAQ,IAAI,yCAAWgC,CAAY,GACnC,QAAQ,IAAI,8CAAgB,GAC5B,QAAQ,IAAI,qBAAqB3V,CAAW,GAC5C,QAAQ,IAAI,8BAAmBA,KAAA,OAAA,SAAAA,EAAa,WAAU,CAAC,GAGrD,gBAAAgC,EAAA,cAACiR,IAAA,EAAgB,QAAQzP,GAAa,WAAAuK,KAEpC,gBAAA/L,EAAA;AAAA,IAAC+O;AAAA,IAAA;AAAA,MACC,UAAU2E,EAAW,YAAY/B,EAAY,YAAYtO,KAAY;AAAA,MACrE,aAAasO,EAAY,SAAS,QAAQlR,IAAc;AAAA,MACxD,WAAWkR,EAAY,SAAS,SAAQA,EAAY,cAAc;AAAA,MAClE,OAAOgC;AAAA,MACP,QAAA5S;AAAA,MACA,YAAY4Q,EAAY,SAAS,QAAQc,IAAiB,MAAM;AAAA,MAAC;AAAA,MACjE,YAAYd,EAAY,SAAS,QAAQgB,IAAiB,MAAM;AAAA,MAAC;AAAA,MACjE,UAAUgB,EAAa,OAAOrB,IAAe,MAAM;AAAA,MAAC;AAAA,MACpD,WAAWqB,EAAa,OAAOnB,IAAgB,MAAM;AAAA,MAAC;AAAA,MACtD,oBAAoBmB,EAAa,aAAaf,IAAyB,MAAM;AAAA,MAAC;AAAA,MAC9E,YAAYe,EAAa,WAAWb,KAAiB,MAAM;AAAA,MAAC;AAAA,MAC5D,cAAca,EAAa,SAASZ,IAAmB,MAAM;AAAA,MAAC;AAAA,MAC9D,eAAeY,EAAa,SAASV,IAAoB,MAAM;AAAA,MAAC;AAAA,MAChE,SAASC;AAAA,MACT,OAAApV;AAAA,MACA,cAAAC;AAAA,MACA,WAAW0T;AAAA,IAAA;AAAA,EAAA,GAIb,gBAAAzR,EAAA;AAAA,IAACuL;AAAA,IAAA;AAAA,MACC,MAAMmI;AAAA,MACN,gBAAgB1V,KAAe,CAAA;AAAA,MAC/B,WAAW2T,EAAY,SAAS,SAAQA,EAAY,cAAc;AAAA,MAClE,aAAaA,EAAY,SAAS,QAAQlR,IAAc;AAAA,MACxD,OAAA3C;AAAA,MACA,UAAA6N;AAAA,MACA,YAAYyG;AAAA,MACZ,QAAArR;AAAA,MACA,OAAO4S;AAAA,MACP,WAAW3H;AAAA,MACX,UAAApL;AAAA,IAAA;AAAA,EAAA,CAEJ;AAEJ,GC5pBa8O,KAAwB,MAC5B,CAAC,CAACO,GAAS,oBAAoB,WAG3B2D,KAAmB,MACvB3D,GAAS,oBAAoB,WAEzB4D,KAAoB,CAACC,IAAqB,gCAAgC;AACrF,MAAI;AACF,QAAI7D,GAAS,oBAAoB,WAAW;AAC1C,cAAQ,IAAI,wCAAoBA,GAAS,oBAAoB,SAAS;AACtE;AAAA,IACF;AACA,IAAAA,GAAS,oBAAoB,YAAY6D,GACzC,QAAQ,IAAI,wCAAoBA,CAAU;AAAA,EAC5C,SAAS5S,GAAO;AACd,YAAQ,MAAM,wCAAoBA,CAAK;AAAA,EACzC;AACF;","x_google_ignoreList":[3,4,5,6,7,8,9,10,11,12,13,14,15]}
|