@extend-ai/react-xlsx 0.18.1 → 0.20.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (72) hide show
  1. package/README.md +154 -6
  2. package/dist/chart-renderer-AAVZ34BF.cjs +5048 -0
  3. package/dist/chart-renderer-AAVZ34BF.cjs.map +1 -0
  4. package/dist/{chart-renderer-HQSQHDCB.js → chart-renderer-KGLAI4DN.js} +25 -20
  5. package/dist/chart-renderer-KGLAI4DN.js.map +1 -0
  6. package/dist/{chart-renderer-ZUWRNNZT.cjs → chart-renderer-NM5UVCTO.cjs} +44 -39
  7. package/dist/chart-renderer-NM5UVCTO.cjs.map +1 -0
  8. package/dist/chart-renderer-RXO7WP4Q.js +5047 -0
  9. package/dist/chart-renderer-RXO7WP4Q.js.map +1 -0
  10. package/dist/chunk-2YBG7XQ3.cjs +26981 -0
  11. package/dist/chunk-2YBG7XQ3.cjs.map +1 -0
  12. package/dist/chunk-3JTCYAUX.js +50 -0
  13. package/dist/{chunk-OZLJPZUX.js.map → chunk-3JTCYAUX.js.map} +1 -1
  14. package/dist/chunk-6K3NSKDJ.cjs +50 -0
  15. package/dist/chunk-6K3NSKDJ.cjs.map +1 -0
  16. package/dist/chunk-CJBI5F6V.cjs +816 -0
  17. package/dist/chunk-CJBI5F6V.cjs.map +1 -0
  18. package/dist/{chunk-WFQGZI2Z.cjs → chunk-MCFUTO4J.cjs} +12 -8
  19. package/dist/chunk-MCFUTO4J.cjs.map +1 -0
  20. package/dist/chunk-NBH72POD.js +816 -0
  21. package/dist/chunk-NBH72POD.js.map +1 -0
  22. package/dist/{chunk-E2VSYCP2.cjs → chunk-O3V2MCOC.cjs} +18 -2
  23. package/dist/chunk-O3V2MCOC.cjs.map +1 -0
  24. package/dist/chunk-QN3D3JS2.js +26978 -0
  25. package/dist/chunk-QN3D3JS2.js.map +1 -0
  26. package/dist/{chunk-FO6MIHX4.cjs → chunk-T5WZHPIN.cjs} +2 -2
  27. package/dist/{chunk-FO6MIHX4.cjs.map → chunk-T5WZHPIN.cjs.map} +1 -1
  28. package/dist/{chunk-BAAMDEDS.js → chunk-VXBNYHW5.js} +18 -2
  29. package/dist/{chunk-BAAMDEDS.js.map → chunk-VXBNYHW5.js.map} +1 -1
  30. package/dist/{chunk-OZLJPZUX.js → chunk-WSQDFXDW.js} +10 -6
  31. package/dist/chunk-WSQDFXDW.js.map +1 -0
  32. package/dist/index.cjs +600 -11270
  33. package/dist/index.cjs.map +1 -1
  34. package/dist/index.d.cts +5 -14
  35. package/dist/index.d.ts +5 -14
  36. package/dist/index.js +479 -11149
  37. package/dist/index.js.map +1 -1
  38. package/dist/internal-DrXSHYJZ.d.cts +1498 -0
  39. package/dist/internal-DrXSHYJZ.d.ts +1498 -0
  40. package/dist/internal.cjs +24 -0
  41. package/dist/internal.cjs.map +1 -0
  42. package/dist/internal.d.cts +3 -0
  43. package/dist/internal.d.ts +3 -0
  44. package/dist/internal.js +23 -0
  45. package/dist/internal.js.map +1 -0
  46. package/dist/{region-map-geography-5E5SVPGS.cjs → region-map-geography-6TGXBY3V.cjs} +2 -2
  47. package/dist/{region-map-geography-5E5SVPGS.cjs.map → region-map-geography-6TGXBY3V.cjs.map} +1 -1
  48. package/dist/{spreadsheet-font-assets-7QMV43XD.cjs → spreadsheet-font-assets-4AHYDTAQ.cjs} +2 -2
  49. package/dist/{spreadsheet-font-assets-7QMV43XD.cjs.map → spreadsheet-font-assets-4AHYDTAQ.cjs.map} +1 -1
  50. package/dist/{surface-regl-WVLW3SEA.cjs → surface-regl-5Z6IVOID.cjs} +18 -15
  51. package/dist/surface-regl-5Z6IVOID.cjs.map +1 -0
  52. package/dist/{surface-regl-NWR5ZZ5D.js → surface-regl-7CDGGVDG.js} +10 -7
  53. package/dist/surface-regl-7CDGGVDG.js.map +1 -0
  54. package/dist/surface-regl-AY7JZVYY.cjs +727 -0
  55. package/dist/surface-regl-AY7JZVYY.cjs.map +1 -0
  56. package/dist/surface-regl-TJUWTLAZ.js +726 -0
  57. package/dist/surface-regl-TJUWTLAZ.js.map +1 -0
  58. package/dist/vanilla.cjs +20 -0
  59. package/dist/vanilla.cjs.map +1 -0
  60. package/dist/vanilla.d.cts +9 -0
  61. package/dist/vanilla.d.ts +9 -0
  62. package/dist/vanilla.js +19 -0
  63. package/dist/vanilla.js.map +1 -0
  64. package/dist/xlsx-worker.js +2888 -34
  65. package/dist/xlsx-worker.js.map +1 -1
  66. package/package.json +23 -3
  67. package/dist/chart-renderer-HQSQHDCB.js.map +0 -1
  68. package/dist/chart-renderer-ZUWRNNZT.cjs.map +0 -1
  69. package/dist/chunk-E2VSYCP2.cjs.map +0 -1
  70. package/dist/chunk-WFQGZI2Z.cjs.map +0 -1
  71. package/dist/surface-regl-NWR5ZZ5D.js.map +0 -1
  72. package/dist/surface-regl-WVLW3SEA.cjs.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/xlsx-worker.ts","../src/builtin-chart-styles.ts","../src/charts.ts","../src/colors.ts","../src/cell-alignment.ts","../src/images.ts","../src/safe-calculate.ts","../src/wasm.ts"],"sourcesContent":["import type { Workbook } from \"@dukelib/sheets-wasm\";\nimport { strFromU8, unzipSync } from \"fflate\";\nimport { loadWorkbookChartAssets } from \"./charts\";\nimport { buildThemePaletteFromHex } from \"./colors\";\nimport { getCellGeneralAlignment } from \"./cell-alignment\";\nimport {\n collectWorkbookFormControls,\n parseWorkbookChartStyleAssets,\n parseWorkbookStructureAssets,\n resolveSheetColumnWidthPixels,\n resolveWorksheetDefaultColumnWidthPixels,\n resolveWorksheetDefaultRowHeightPixels,\n resolveWorksheetMergeMetadata\n} from \"./images\";\nimport type { WorkbookStructureAssets } from \"./images\";\nimport { safeCalculate } from \"./safe-calculate\";\nimport { getSheetsWasmModule, setWasmSource, type WorkerWasmSource } from \"./wasm\";\nimport type {\n XlsxChart,\n XlsxChartsheet,\n XlsxCellAddress,\n XlsxCellRange,\n XlsxDataValidation,\n XlsxFormControl,\n XlsxFreezePanes,\n XlsxResolvedCellStyle,\n XlsxSheetData,\n XlsxSheetVisibility,\n XlsxTable,\n XlsxTableStyleDefinition,\n XlsxThemePalette,\n XlsxWorkbookTab\n} from \"./types\";\n\nconst DEFAULT_ROW_HEIGHT = 24;\nconst DEFAULT_COL_WIDTH = 80;\nconst DEFAULT_ZOOM_SCALE = 100;\nconst FORMULA_COUNT_THRESHOLD = 1000;\nconst FAST_STRUCTURE_PARSE_THRESHOLD_BYTES = 5 * 1024 * 1024;\nconst MIN_ROW_HEIGHT_PX = 16;\n\ntype WorkerSheetState = Partial<NonNullable<WorkbookStructureAssets[\"sheetStatesByWorkbookSheetIndex\"][number]>>;\n\nfunction isLegacyXlsWorkbook(bytes: Uint8Array) {\n return bytes.byteLength >= 8\n && bytes[0] === 0xd0\n && bytes[1] === 0xcf\n && bytes[2] === 0x11\n && bytes[3] === 0xe0\n && bytes[4] === 0xa1\n && bytes[5] === 0xb1\n && bytes[6] === 0x1a\n && bytes[7] === 0xe1;\n}\n\nfunction shouldSkipXmlParsingForWorkbook(bytes: Uint8Array, skipXmlParsing = false) {\n return skipXmlParsing || isLegacyXlsWorkbook(bytes);\n}\n\nfunction normalizeWorksheetVisibility(value: unknown): XlsxSheetVisibility {\n return value === \"hidden\" || value === \"veryHidden\" ? value : \"visible\";\n}\n\ntype WorkerRequest =\n | {\n id: number;\n type: \"load\";\n payload: {\n buffer: ArrayBuffer;\n showHiddenSheets?: boolean;\n skipXmlParsing?: boolean;\n wasmSource?: WorkerWasmSource;\n };\n }\n | {\n id: number;\n type: \"parseCharts\";\n payload: {\n buffer: ArrayBuffer;\n showHiddenSheets?: boolean;\n skipXmlParsing?: boolean;\n wasmSource?: WorkerWasmSource;\n };\n }\n | {\n id: number;\n type: \"getCellSnapshot\";\n payload: {\n workbookSheetIndex: number;\n row: number;\n col: number;\n };\n }\n | {\n id: number;\n type: \"getRowsBatch\";\n payload: {\n workbookSheetIndex: number;\n startRow: number;\n rowCount: number;\n };\n };\n\ntype WorkerSuccessResponse = {\n id: number;\n success: true;\n result:\n | {\n chartsByWorkbookSheetIndex: XlsxChart[][];\n chartsheets: XlsxChartsheet[];\n tabs: XlsxWorkbookTab[];\n }\n | {\n chartsByWorkbookSheetIndex: XlsxChart[][];\n chartsheets: XlsxChartsheet[];\n formControlsByWorkbookSheetIndex: XlsxFormControl[][];\n sheets: XlsxSheetData[];\n tablesByWorkbookSheetIndex: XlsxTable[][];\n tabs: XlsxWorkbookTab[];\n }\n | {\n displayValue: string;\n formula: string;\n }\n | unknown[]\n | null;\n};\n\ntype WorkerErrorResponse = {\n id: number;\n success: false;\n error: string;\n};\n\ntype WorkerResponse = WorkerSuccessResponse | WorkerErrorResponse;\n\nlet workbook: Workbook | null = null;\nlet chartsByWorkbookSheetIndex: XlsxChart[][] = [];\nlet chartsheets: XlsxChartsheet[] = [];\nlet formControlsByWorkbookSheetIndex: XlsxFormControl[][] = [];\nlet sheets: XlsxSheetData[] = [];\nlet tablesByWorkbookSheetIndex: XlsxTable[][] = [];\nlet tabs: XlsxWorkbookTab[] = [];\n\nfunction canParseXmlInWorker() {\n return typeof DOMParser !== \"undefined\";\n}\n\nfunction decodeXmlAttribute(value: string) {\n return value\n .replace(/&quot;/g, \"\\\"\")\n .replace(/&apos;/g, \"'\")\n .replace(/&lt;/g, \"<\")\n .replace(/&gt;/g, \">\")\n .replace(/&amp;/g, \"&\");\n}\n\nfunction readXmlAttribute(tag: string, name: string) {\n const escapedName = name.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n const match = new RegExp(`(?:^|\\\\s)${escapedName}=\"([^\"]*)\"`).exec(tag);\n return match ? decodeXmlAttribute(match[1] ?? \"\") : null;\n}\n\nfunction readArchiveText(archive: Record<string, Uint8Array>, path: string) {\n const entry = archive[path];\n return entry ? strFromU8(entry) : \"\";\n}\n\nfunction normalizeWorkbookRelationshipTarget(target: string) {\n if (target.startsWith(\"/\")) {\n return target.replace(/^\\/+/, \"\");\n }\n\n return target.startsWith(\"xl/\")\n ? target\n : `xl/${target.replace(/^\\.?\\//, \"\")}`;\n}\n\nfunction parseWorkbookSheetPathsFromArchive(archive: Record<string, Uint8Array>) {\n const workbookXml = readArchiveText(archive, \"xl/workbook.xml\");\n const workbookRelationshipsXml = readArchiveText(archive, \"xl/_rels/workbook.xml.rels\");\n if (!workbookXml || !workbookRelationshipsXml) {\n return [] as string[];\n }\n\n const relationshipTargetById = new Map<string, string>();\n for (const match of workbookRelationshipsXml.matchAll(/<Relationship\\b[^>]*>/g)) {\n const tag = match[0];\n const id = readXmlAttribute(tag, \"Id\");\n const target = readXmlAttribute(tag, \"Target\");\n if (id && target) {\n relationshipTargetById.set(id, normalizeWorkbookRelationshipTarget(target));\n }\n }\n\n const paths: string[] = [];\n for (const match of workbookXml.matchAll(/<sheet\\b[^>]*>/g)) {\n const tag = match[0];\n const relationshipId = readXmlAttribute(tag, \"r:id\") ?? readXmlAttribute(tag, \"id\");\n const target = relationshipId ? relationshipTargetById.get(relationshipId) : null;\n if (target) {\n paths.push(target);\n }\n }\n\n return paths;\n}\n\nfunction parseWorkerSheetLayoutAssets(bytes: Uint8Array, sheetCount: number): Array<WorkerSheetState | null> {\n try {\n const archive = unzipSync(bytes);\n const workbookSheetPaths = parseWorkbookSheetPathsFromArchive(archive);\n const sheetPaths = workbookSheetPaths.length > 0\n ? workbookSheetPaths\n : Array.from({ length: sheetCount }, (_, index) => `xl/worksheets/sheet${index + 1}.xml`);\n\n return sheetPaths.slice(0, sheetCount).map((path) => {\n const xml = readArchiveText(archive, path);\n if (!xml) {\n return null;\n }\n\n const sheetFormatTag = /<(?:[\\w.-]+:)?sheetFormatPr\\b[^>]*>/.exec(xml)?.[0] ?? \"\";\n const defaultRowHeight = Number(readXmlAttribute(sheetFormatTag, \"defaultRowHeight\") ?? Number.NaN);\n const defaultColWidth = Number(readXmlAttribute(sheetFormatTag, \"defaultColWidth\")\n ?? readXmlAttribute(sheetFormatTag, \"baseColWidth\") ?? Number.NaN);\n const rowHeightOverridesPx: Record<number, number> = {};\n for (const match of xml.matchAll(/<row\\b[^>]*>/g)) {\n const tag = match[0];\n const rowNumber = Number(readXmlAttribute(tag, \"r\") ?? Number.NaN);\n const height = Number(readXmlAttribute(tag, \"ht\") ?? Number.NaN);\n const rowIndex = rowNumber - 1;\n if (rowIndex >= 0 && Number.isFinite(height)) {\n rowHeightOverridesPx[rowIndex] = Math.max(MIN_ROW_HEIGHT_PX, Math.round(height * 1.33));\n }\n }\n\n return {\n defaultRowHeightPx: Number.isFinite(defaultRowHeight) && defaultRowHeight > 0\n ? Math.max(MIN_ROW_HEIGHT_PX, Math.round(defaultRowHeight * 1.33))\n : undefined,\n defaultColWidthPx: Number.isFinite(defaultColWidth) && defaultColWidth > 0\n ? resolveSheetColumnWidthPixels(defaultColWidth)\n : undefined,\n rowHeightOverridesPx\n };\n });\n } catch {\n return [];\n }\n}\n\nfunction buildVisibleSheetIndexByWorkbookSheetIndex(nextWorkbook: Workbook, showHiddenSheets = false) {\n const mapping = new Map<number, number>();\n let visibleIndex = 0;\n for (let workbookSheetIndex = 0; workbookSheetIndex < nextWorkbook.sheetCount; workbookSheetIndex += 1) {\n const worksheet = nextWorkbook.getSheet(workbookSheetIndex);\n const visibility = normalizeWorksheetVisibility(worksheet.visibility);\n if (!showHiddenSheets && visibility !== \"visible\") {\n continue;\n }\n mapping.set(workbookSheetIndex, visibleIndex);\n visibleIndex += 1;\n }\n return mapping;\n}\n\nfunction normalizeRange(range: XlsxCellRange): XlsxCellRange {\n return {\n start: {\n col: Math.min(range.start.col, range.end.col),\n row: Math.min(range.start.row, range.end.row)\n },\n end: {\n col: Math.max(range.start.col, range.end.col),\n row: Math.max(range.start.row, range.end.row)\n }\n };\n}\n\nfunction parseA1CellReference(reference: string): XlsxCellAddress | null {\n const match = /^([A-Z]+)(\\d+)$/i.exec(reference.trim());\n if (!match) {\n return null;\n }\n\n const [, columnPart, rowPart] = match;\n let col = 0;\n for (const char of columnPart.toUpperCase()) {\n col = col * 26 + (char.charCodeAt(0) - 64);\n }\n\n return {\n col: col - 1,\n row: Number(rowPart) - 1\n };\n}\n\nfunction parseA1RangeReference(reference: string): XlsxCellRange | null {\n const [startRef, endRef = startRef] = reference.split(\":\");\n const start = parseA1CellReference(startRef ?? \"\");\n const end = parseA1CellReference(endRef ?? \"\");\n if (!start || !end) {\n return null;\n }\n\n return normalizeRange({ end, start });\n}\n\ntype ResolvedWorkbookReference = {\n range: XlsxCellRange;\n worksheet: ReturnType<Workbook[\"getSheet\"]>;\n};\n\nfunction resolveWorkbookReference(\n targetWorkbook: Workbook,\n defaultWorkbookSheetIndex: number,\n rawReference: string,\n resolvingNamedRange = false\n): ResolvedWorkbookReference | null {\n const reference = rawReference.trim().replace(/^=/, \"\");\n if (!reference) {\n return null;\n }\n\n let workbookSheetIndex = defaultWorkbookSheetIndex;\n let rangeReference = reference;\n const bangIndex = reference.lastIndexOf(\"!\");\n if (bangIndex >= 0) {\n let sheetName = reference.slice(0, bangIndex).trim();\n rangeReference = reference.slice(bangIndex + 1).trim();\n if (sheetName.startsWith(\"'\") && sheetName.endsWith(\"'\")) {\n sheetName = sheetName.slice(1, -1).replace(/''/g, \"'\");\n }\n const resolvedSheetIndex = targetWorkbook.sheetIndex(sheetName);\n if (resolvedSheetIndex === undefined) {\n return null;\n }\n workbookSheetIndex = resolvedSheetIndex;\n } else if (!resolvingNamedRange) {\n const namedRange = targetWorkbook.getNamedRange(reference);\n if (namedRange) {\n return resolveWorkbookReference(targetWorkbook, defaultWorkbookSheetIndex, namedRange, true);\n }\n }\n\n const range = parseA1RangeReference(rangeReference.replace(/\\$/g, \"\"));\n if (!range || workbookSheetIndex < 0 || workbookSheetIndex >= targetWorkbook.sheetCount) {\n return null;\n }\n\n try {\n return {\n range,\n worksheet: targetWorkbook.getSheet(workbookSheetIndex)\n };\n } catch {\n return null;\n }\n}\n\nfunction resolveFormControlItems(\n targetWorkbook: Workbook,\n workbookSheetIndex: number,\n control: XlsxFormControl\n) {\n if ((control.kind !== \"dropdown\" && control.kind !== \"listbox\") || !control.inputRange) {\n return [];\n }\n\n const source = resolveWorkbookReference(targetWorkbook, workbookSheetIndex, control.inputRange);\n if (!source) {\n return [];\n }\n\n const items: string[] = [];\n for (let row = source.range.start.row; row <= source.range.end.row; row += 1) {\n for (let col = source.range.start.col; col <= source.range.end.col; col += 1) {\n items.push(source.worksheet.getFormattedValueAt(row, col));\n }\n }\n return items;\n}\n\nfunction parseWorksheetFreezePanes(worksheet: ReturnType<Workbook[\"getSheet\"]>): XlsxFreezePanes | null {\n const rawFreezePanes = worksheet.freezePanes as Record<string, unknown> | null | undefined;\n const row = typeof rawFreezePanes?.row === \"number\" && rawFreezePanes.row >= 0 ? rawFreezePanes.row : null;\n const col = typeof rawFreezePanes?.col === \"number\" && rawFreezePanes.col >= 0 ? rawFreezePanes.col : null;\n if (row === null && col === null) {\n return null;\n }\n\n return {\n col: col ?? 0,\n row: row ?? 0\n };\n}\n\nfunction parseWorksheetDataValidations(worksheet: ReturnType<Workbook[\"getSheet\"]>): XlsxDataValidation[] {\n const rawDataValidations = Array.isArray(worksheet.dataValidations) ? worksheet.dataValidations : [];\n\n return rawDataValidations.flatMap((entry) => {\n if (!entry || typeof entry !== \"object\") {\n return [];\n }\n\n const validation = entry as Record<string, unknown>;\n const ranges = Array.isArray(validation.ranges)\n ? validation.ranges.flatMap((range) => {\n if (typeof range !== \"string\") {\n return [];\n }\n\n const parsedRange = parseA1RangeReference(range);\n return parsedRange ? [parsedRange] : [];\n })\n : [];\n const validationType = typeof validation.validationType === \"string\" ? validation.validationType : null;\n if (!validationType || ranges.length === 0) {\n return [];\n }\n\n return [{\n allowBlank: typeof validation.allowBlank === \"boolean\" ? validation.allowBlank : undefined,\n errorMessage: typeof validation.errorMessage === \"string\" ? validation.errorMessage : undefined,\n errorStyle: typeof validation.errorStyle === \"string\" ? validation.errorStyle : undefined,\n inputMessage: typeof validation.inputMessage === \"string\" ? validation.inputMessage : undefined,\n listSource: typeof validation.listSource === \"string\" ? validation.listSource : undefined,\n ranges,\n showDropdown: typeof validation.showDropdown === \"boolean\" ? validation.showDropdown : undefined,\n showErrorAlert: typeof validation.showErrorAlert === \"boolean\" ? validation.showErrorAlert : undefined,\n showInputMessage: typeof validation.showInputMessage === \"boolean\" ? validation.showInputMessage : undefined,\n validationType\n } satisfies XlsxDataValidation];\n });\n}\n\nfunction resolveWorksheetZoomScale(\n worksheet: ReturnType<Workbook[\"getSheet\"]>,\n sheetState?: { zoomScale?: number } | null\n) {\n const candidates = [\n sheetState?.zoomScale,\n typeof worksheet.zoomScale === \"number\" ? worksheet.zoomScale : undefined\n ];\n const value = candidates.find((entry): entry is number => typeof entry === \"number\" && Number.isFinite(entry) && entry > 0);\n return value ?? DEFAULT_ZOOM_SCALE;\n}\n\nfunction resolveSheetDisplayUsedRange(\n usedRange: [number, number, number, number],\n sheetState?: {\n maxContentCol?: number;\n maxContentRow?: number;\n maxHorizontalMergeEndCol?: number;\n maxVerticalMergeEndRow?: number;\n minContentCol?: number;\n minContentRow?: number;\n } | null\n): [number, number, number, number] {\n const [minRow, minCol, maxRow, maxCol] = usedRange;\n const maxContentRow = sheetState?.maxContentRow ?? -1;\n const maxContentCol = sheetState?.maxContentCol ?? -1;\n const maxVerticalMergeEndRow = sheetState?.maxVerticalMergeEndRow ?? -1;\n const maxHorizontalMergeEndCol = sheetState?.maxHorizontalMergeEndCol ?? -1;\n const maxMeaningfulRow = Math.max(maxContentRow, maxVerticalMergeEndRow);\n const maxMeaningfulCol = Math.max(maxContentCol, maxHorizontalMergeEndCol);\n\n if (maxMeaningfulRow < 0 && maxMeaningfulCol < 0) {\n return usedRange;\n }\n\n return [\n sheetState?.minContentRow !== undefined && sheetState.minContentRow >= 0 ? Math.min(minRow, sheetState.minContentRow) : minRow,\n sheetState?.minContentCol !== undefined && sheetState.minContentCol >= 0 ? Math.min(minCol, sheetState.minContentCol) : minCol,\n maxMeaningfulRow >= 0\n ? (maxContentRow >= 0 ? Math.min(maxRow, maxMeaningfulRow) : Math.max(maxRow, maxMeaningfulRow))\n : maxRow,\n maxMeaningfulCol >= 0\n ? (maxContentCol >= 0 ? Math.min(maxCol, maxMeaningfulCol) : Math.max(maxCol, maxMeaningfulCol))\n : maxCol\n ];\n}\n\nfunction buildSheetList(\n nextWorkbook: Workbook,\n themePalette: XlsxThemePalette,\n structureAssets?: WorkbookStructureAssets | null,\n sheetLayoutStates?: Array<WorkerSheetState | null>,\n showHiddenSheets = false\n) {\n const sheetsByWorkbookSheetIndex: XlsxSheetData[] = [];\n\n for (let index = 0; index < nextWorkbook.sheetCount; index += 1) {\n const worksheet = nextWorkbook.getSheet(index);\n const sheetState = structureAssets?.sheetStatesByWorkbookSheetIndex[index] ?? sheetLayoutStates?.[index] ?? null;\n const mergeMetadata = resolveWorksheetMergeMetadata(worksheet);\n const effectiveSheetState = {\n ...sheetState,\n ...mergeMetadata\n };\n const defaultColWidthPx = sheetState?.defaultColWidthPx ?? resolveWorksheetDefaultColumnWidthPixels(\n worksheet,\n sheetState?.columnWidthCharacterWidthPx,\n DEFAULT_COL_WIDTH\n );\n const defaultRowHeightPx = sheetState?.defaultRowHeightPx ?? resolveWorksheetDefaultRowHeightPixels(\n worksheet,\n DEFAULT_ROW_HEIGHT\n );\n const visibility = normalizeWorksheetVisibility(worksheet.visibility);\n if (!showHiddenSheets && visibility !== \"visible\") {\n continue;\n }\n\n const resolveColumnWidthPx = (col: number) => {\n const width = worksheet.getColumnWidth(col);\n if (width !== undefined && width !== null) {\n return resolveSheetColumnWidthPixels(width, sheetState?.columnWidthCharacterWidthPx);\n }\n\n return sheetState?.colWidthOverridesPx?.[col] ?? defaultColWidthPx;\n };\n\n const resolveRowHeightPx = (row: number) => {\n const height = worksheet.getRowHeight(row);\n if (height !== undefined && height !== null) {\n return Math.max(Math.round(height * 1.33), 16);\n }\n\n return sheetState?.rowHeightOverridesPx?.[row] ?? defaultRowHeightPx;\n };\n\n const usedRange = worksheet.usedRange() as [number, number, number, number] | null;\n if (!usedRange) {\n sheetsByWorkbookSheetIndex.push({\n autoFilterRanges: sheetState?.autoFilterRanges ?? [],\n cachedFormulaValues: sheetState?.cachedFormulaValues ?? {},\n columnWidthCharacterWidthPx: sheetState?.columnWidthCharacterWidthPx,\n colCount: 0,\n colStyleIds: sheetState?.colStyleIds ?? {},\n colWidthOverridesPx: sheetState?.colWidthOverridesPx ?? {},\n colWidths: [],\n conditionalFormatRules: sheetState?.conditionalFormatRules ?? [],\n dataValidations: parseWorksheetDataValidations(worksheet),\n defaultColWidthPx,\n defaultRowHeightPx,\n freezePanes: parseWorksheetFreezePanes(worksheet),\n hasHorizontalMerges: mergeMetadata.hasHorizontalMerges,\n hasVerticalMerges: mergeMetadata.hasVerticalMerges,\n maxHorizontalMergeEndCol: mergeMetadata.maxHorizontalMergeEndCol,\n maxVerticalMergeEndRow: mergeMetadata.maxVerticalMergeEndRow,\n mergedRanges: mergeMetadata.mergedRanges,\n hiddenCols: sheetState?.hiddenCols ?? [],\n hiddenRows: sheetState?.hiddenRows ?? [],\n minUsedCol: -1,\n minUsedRow: -1,\n maxUsedCol: -1,\n maxUsedRow: -1,\n name: worksheet.name,\n visibility,\n namedCellStyleByName: structureAssets?.namedCellStyleByName ?? {},\n rowCount: 0,\n rowHeightOverridesPx: sheetState?.rowHeightOverridesPx ?? {},\n rowHeights: [],\n rowStyleIds: sheetState?.rowStyleIds ?? {},\n cellStyleIds: sheetState?.cellStyleIds ?? {},\n showGridLines: sheetState?.showGridLines ?? true,\n sparklines: sheetState?.sparklines ?? [],\n styleById: structureAssets?.styleById ?? {},\n tableStyleByName: structureAssets?.tableStyleByName ?? {},\n themePalette,\n visibleCols: [],\n visibleRows: [],\n workbookSheetIndex: index,\n zoomScale: resolveWorksheetZoomScale(worksheet, sheetState)\n });\n continue;\n }\n\n const [minRow, minCol, maxRow, maxCol] = resolveSheetDisplayUsedRange(usedRange, effectiveSheetState);\n const visibleRows: number[] = [];\n const hiddenRows: number[] = [];\n for (let row = 0; row <= maxRow; row += 1) {\n if (worksheet.isRowHidden(row)) {\n hiddenRows.push(row);\n } else {\n visibleRows.push(row);\n }\n }\n\n const visibleCols: number[] = [];\n const hiddenCols: number[] = [];\n for (let col = 0; col <= maxCol; col += 1) {\n if (worksheet.isColumnHidden(col)) {\n hiddenCols.push(col);\n } else {\n visibleCols.push(col);\n }\n }\n\n sheetsByWorkbookSheetIndex.push({\n autoFilterRanges: sheetState?.autoFilterRanges ?? [],\n cachedFormulaValues: sheetState?.cachedFormulaValues ?? {},\n columnWidthCharacterWidthPx: sheetState?.columnWidthCharacterWidthPx,\n colCount: visibleCols.length,\n colStyleIds: sheetState?.colStyleIds ?? {},\n colWidthOverridesPx: sheetState?.colWidthOverridesPx ?? {},\n colWidths: visibleCols.map(resolveColumnWidthPx),\n conditionalFormatRules: sheetState?.conditionalFormatRules ?? [],\n dataValidations: parseWorksheetDataValidations(worksheet),\n defaultColWidthPx,\n defaultRowHeightPx,\n freezePanes: parseWorksheetFreezePanes(worksheet),\n hasHorizontalMerges: mergeMetadata.hasHorizontalMerges,\n hasVerticalMerges: mergeMetadata.hasVerticalMerges,\n maxHorizontalMergeEndCol: mergeMetadata.maxHorizontalMergeEndCol,\n maxVerticalMergeEndRow: mergeMetadata.maxVerticalMergeEndRow,\n mergedRanges: mergeMetadata.mergedRanges,\n hiddenCols,\n hiddenRows,\n minUsedCol: minCol,\n minUsedRow: minRow,\n maxUsedCol: maxCol,\n maxUsedRow: maxRow,\n name: worksheet.name,\n visibility,\n namedCellStyleByName: structureAssets?.namedCellStyleByName ?? {},\n rowCount: visibleRows.length,\n rowHeightOverridesPx: sheetState?.rowHeightOverridesPx ?? {},\n rowHeights: visibleRows.map(resolveRowHeightPx),\n rowStyleIds: sheetState?.rowStyleIds ?? {},\n cellStyleIds: sheetState?.cellStyleIds ?? {},\n showGridLines: sheetState?.showGridLines ?? true,\n sparklines: sheetState?.sparklines ?? [],\n styleById: structureAssets?.styleById ?? {},\n tableStyleByName: structureAssets?.tableStyleByName ?? {},\n themePalette,\n visibleCols,\n visibleRows,\n workbookSheetIndex: index,\n zoomScale: resolveWorksheetZoomScale(worksheet, sheetState)\n });\n }\n\n return sheetsByWorkbookSheetIndex;\n}\n\nfunction mapWorksheetTables(\n worksheet: ReturnType<Workbook[\"getSheet\"]> | null,\n autoFilterRanges: XlsxCellRange[] = []\n): XlsxTable[] {\n const rawTables = (worksheet?.tables ?? []) as Array<Record<string, unknown>>;\n const mappedTables = rawTables.flatMap((table, index) => {\n const rawColumns = Array.isArray(table.columns) ? table.columns : [];\n const rawName = typeof table.name === \"string\" ? table.name : `Table${index + 1}`;\n const rawDisplayName =\n typeof table.displayName === \"string\"\n ? table.displayName\n : typeof table.name === \"string\"\n ? table.name\n : `Table ${index + 1}`;\n const rawReference = typeof table.reference === \"string\" ? table.reference : \"\";\n const reference = rawReference;\n const parsedRange = parseA1RangeReference(reference);\n if (!parsedRange) {\n return [];\n }\n\n return [{\n columns: rawColumns.map((column, columnIndex) => ({\n id: typeof (column as { id?: unknown }).id === \"number\" ? ((column as { id?: number }).id ?? columnIndex + 1) : columnIndex + 1,\n index: columnIndex,\n name: typeof (column as { name?: unknown }).name === \"string\" ? ((column as { name?: string }).name ?? `Column ${columnIndex + 1}`) : `Column ${columnIndex + 1}`\n })),\n displayName: rawDisplayName,\n end: parsedRange.end,\n headerRowCount: resolveWorkbookTableCount(table.headerRowCount, 1),\n headerRowCellStyle: typeof table.headerRowCellStyle === \"string\" ? table.headerRowCellStyle : undefined,\n name: rawName,\n reference,\n start: parsedRange.start,\n styleInfo: table.styleInfo as XlsxTable[\"styleInfo\"] | undefined,\n totalsRowCount: resolveWorkbookTableCount(table.totalsRowCount, 0),\n totalsRowShown: resolveWorkbookTableBoolean(table.totalsRowShown)\n }];\n });\n\n const existingReferences = new Set(mappedTables.map((table) => table.reference));\n const mappedAutoFilterTables = autoFilterRanges.flatMap((range, index) => {\n const reference = `${cellAddressToA1(range.start)}:${cellAddressToA1(range.end)}`;\n if (existingReferences.has(reference)) {\n return [];\n }\n\n const columnCount = Math.max(0, range.end.col - range.start.col + 1);\n const columns = Array.from({ length: columnCount }, (_, columnIndex) => {\n const headerValue = worksheet\n ? decodeHtmlEntities(worksheet.getFormattedValueAt(range.start.row, range.start.col + columnIndex) ?? \"\")\n : \"\";\n return {\n id: columnIndex + 1,\n index: columnIndex,\n name: headerValue.trim().length > 0 ? headerValue : `Column ${columnIndex + 1}`\n };\n });\n\n return [{\n columns,\n displayName: `AutoFilter ${index + 1}`,\n end: range.end,\n headerRowCount: 1,\n name: `__autofilter_${index + 1}_${reference}`,\n reference,\n start: range.start,\n totalsRowCount: 0,\n totalsRowShown: false\n } satisfies XlsxTable];\n });\n\n return [...mappedTables, ...mappedAutoFilterTables];\n}\n\nfunction resolveWorkbookTableCount(value: unknown, fallback: number) {\n if (typeof value === \"number\" && Number.isFinite(value) && value >= 0) {\n return value;\n }\n\n if (typeof value === \"string\") {\n const parsed = Number.parseInt(value, 10);\n if (Number.isFinite(parsed) && parsed >= 0) {\n return parsed;\n }\n }\n\n return fallback;\n}\n\nfunction resolveWorkbookTableBoolean(value: unknown) {\n if (typeof value === \"boolean\") {\n return value;\n }\n\n if (typeof value === \"number\") {\n return value !== 0;\n }\n\n if (typeof value === \"string\") {\n const normalized = value.trim().toLowerCase();\n if (normalized === \"0\" || normalized === \"false\" || normalized === \"\") {\n return false;\n }\n if (normalized === \"1\" || normalized === \"true\") {\n return true;\n }\n }\n\n return false;\n}\n\nfunction decodeHtmlEntities(value: string): string {\n return value\n .replace(/&quot;/g, \"\\\"\")\n .replace(/&#34;/g, \"\\\"\")\n .replace(/&apos;/g, \"'\")\n .replace(/&#39;/g, \"'\")\n .replace(/&lt;/g, \"<\")\n .replace(/&gt;/g, \">\")\n .replace(/&amp;/g, \"&\");\n}\n\nfunction getCellDisplayValue(worksheet: ReturnType<Workbook[\"getSheet\"]>, row: number, col: number, activeSheet?: XlsxSheetData | null) {\n const formula = worksheet.getFormulaAt(row, col);\n const cachedFormulaValue = formula ? activeSheet?.cachedFormulaValues?.[cellAddressToA1({ row, col })] : undefined;\n const formatted = worksheet.getFormattedValueAt(row, col);\n if (formatted && !(formula && cachedFormulaValue !== undefined && formatted.startsWith(\"#\"))) {\n return decodeHtmlEntities(formatted);\n }\n\n const cellValue = worksheet.getCalculatedValueAt(row, col);\n if (formula && cachedFormulaValue !== undefined && cellValue.is_error) {\n return cachedFormulaValue;\n }\n if (cellValue.is_error) {\n return cellValue.asError() ?? \"\";\n }\n if (cellValue.is_empty) {\n return \"\";\n }\n\n return cellValue.toString();\n}\n\nfunction cellAddressToA1(cell: XlsxCellAddress) {\n let col = cell.col + 1;\n let label = \"\";\n while (col > 0) {\n const remainder = (col - 1) % 26;\n label = String.fromCharCode(65 + remainder) + label;\n col = Math.floor((col - 1) / 26);\n }\n return `${label}${cell.row + 1}`;\n}\n\nasync function loadWorkbook(buffer: ArrayBuffer, skipXmlParsing = false, showHiddenSheets = false) {\n const wasmModule = await getSheetsWasmModule();\n const bytes = new Uint8Array(buffer);\n const effectiveSkipXmlParsing = shouldSkipXmlParsingForWorkbook(bytes, skipXmlParsing);\n let activeWorkbook = wasmModule.Workbook.fromBytes(bytes);\n let totalFormulas = 0;\n for (let index = 0; index < activeWorkbook.sheetCount; index += 1) {\n totalFormulas += activeWorkbook.getSheet(index).formulaCount;\n }\n\n if (totalFormulas <= FORMULA_COUNT_THRESHOLD) {\n const result = safeCalculate(activeWorkbook, {\n reparse: () => wasmModule.Workbook.fromBytes(bytes)\n });\n activeWorkbook = result.workbook;\n }\n\n const nextWorkbook = activeWorkbook;\n const shouldUseFastStructureParse =\n bytes.byteLength >= FAST_STRUCTURE_PARSE_THRESHOLD_BYTES && totalFormulas <= FORMULA_COUNT_THRESHOLD;\n const structureAssets = effectiveSkipXmlParsing || shouldUseFastStructureParse || !canParseXmlInWorker()\n ? null\n : parseWorkbookStructureAssets(bytes, {\n includeCachedFormulaValues: true\n });\n // Workers have no DOMParser, so theme1.xml is not parsed there; the engine\n // reads the same palette.\n const themePalette = structureAssets?.themePalette ?? buildThemePaletteFromHex(nextWorkbook.themePalette);\n formControlsByWorkbookSheetIndex = collectWorkbookFormControls(\n nextWorkbook,\n themePalette\n ).map(\n (controls, workbookSheetIndex) => controls.map((control) => ({\n ...control,\n items: resolveFormControlItems(nextWorkbook, workbookSheetIndex, control)\n }))\n );\n const sheetLayoutStates = structureAssets ? undefined : parseWorkerSheetLayoutAssets(bytes, nextWorkbook.sheetCount);\n workbook = nextWorkbook;\n sheets = buildSheetList(nextWorkbook, themePalette, structureAssets, sheetLayoutStates, showHiddenSheets);\n tablesByWorkbookSheetIndex = Array.from({ length: nextWorkbook.sheetCount }, (_, workbookSheetIndex) =>\n mapWorksheetTables(\n nextWorkbook.getSheet(workbookSheetIndex),\n structureAssets?.sheetStatesByWorkbookSheetIndex[workbookSheetIndex]?.autoFilterRanges ?? []\n )\n );\n const visibleSheetIndexByWorkbookSheetIndex = new Map(sheets.map((sheet, index) => [sheet.workbookSheetIndex, index]));\n const hasCharts = Array.from({ length: nextWorkbook.sheetCount }, (_, workbookSheetIndex) => {\n const worksheet = nextWorkbook.getSheet(workbookSheetIndex);\n const hasClassicCharts = Array.isArray(worksheet.charts) && worksheet.charts.length > 0;\n const hasModernCharts = Array.isArray(worksheet.chartsEx) && worksheet.chartsEx.length > 0;\n return hasClassicCharts || hasModernCharts;\n }).some(Boolean);\n const chartStyleAssets = effectiveSkipXmlParsing || !hasCharts || !canParseXmlInWorker()\n ? null\n : parseWorkbookChartStyleAssets(bytes);\n const chartAssets = loadWorkbookChartAssets(\n nextWorkbook,\n chartStyleAssets,\n visibleSheetIndexByWorkbookSheetIndex,\n showHiddenSheets\n );\n chartsByWorkbookSheetIndex = chartAssets.chartsByWorkbookSheetIndex;\n chartsheets = chartAssets.chartsheets;\n tabs = chartAssets.tabs;\n return {\n chartsByWorkbookSheetIndex,\n chartsheets,\n formControlsByWorkbookSheetIndex,\n sheets,\n tablesByWorkbookSheetIndex,\n tabs\n };\n}\n\nasync function parseCharts(buffer: ArrayBuffer, skipXmlParsing = false, showHiddenSheets = false) {\n const wasmModule = await getSheetsWasmModule();\n const bytes = new Uint8Array(buffer);\n const effectiveSkipXmlParsing = shouldSkipXmlParsingForWorkbook(bytes, skipXmlParsing);\n let activeWorkbook = wasmModule.Workbook.fromBytes(bytes);\n let totalFormulas = 0;\n for (let index = 0; index < activeWorkbook.sheetCount; index += 1) {\n totalFormulas += activeWorkbook.getSheet(index).formulaCount;\n }\n if (totalFormulas <= FORMULA_COUNT_THRESHOLD) {\n const result = safeCalculate(activeWorkbook, {\n reparse: () => wasmModule.Workbook.fromBytes(bytes)\n });\n activeWorkbook = result.workbook;\n }\n\n const nextWorkbook = activeWorkbook;\n const visibleSheetIndexByWorkbookSheetIndex = buildVisibleSheetIndexByWorkbookSheetIndex(nextWorkbook, showHiddenSheets);\n const chartStyleAssets = effectiveSkipXmlParsing || !canParseXmlInWorker()\n ? null\n : parseWorkbookChartStyleAssets(bytes);\n const chartAssets = loadWorkbookChartAssets(\n nextWorkbook,\n chartStyleAssets,\n visibleSheetIndexByWorkbookSheetIndex,\n showHiddenSheets\n );\n return {\n chartsByWorkbookSheetIndex: chartAssets.chartsByWorkbookSheetIndex,\n chartsheets: chartAssets.chartsheets,\n tabs: chartAssets.tabs\n };\n}\n\nfunction respond(message: WorkerResponse) {\n self.postMessage(message);\n}\n\nasync function handleMessage(message: WorkerRequest) {\n switch (message.type) {\n case \"load\": {\n if (message.payload.wasmSource !== undefined) {\n setWasmSource(message.payload.wasmSource);\n }\n return loadWorkbook(message.payload.buffer, message.payload.skipXmlParsing, message.payload.showHiddenSheets);\n }\n case \"parseCharts\": {\n if (message.payload.wasmSource !== undefined) {\n setWasmSource(message.payload.wasmSource);\n }\n return parseCharts(message.payload.buffer, message.payload.skipXmlParsing, message.payload.showHiddenSheets);\n }\n case \"getCellSnapshot\": {\n if (!workbook) {\n return {\n displayValue: \"\",\n formula: \"\"\n };\n }\n\n const targetSheet = sheets.find((sheet) => sheet.workbookSheetIndex === message.payload.workbookSheetIndex) ?? null;\n const worksheet = workbook.getSheet(message.payload.workbookSheetIndex);\n return {\n displayValue: getCellDisplayValue(worksheet, message.payload.row, message.payload.col, targetSheet),\n formula: worksheet.getFormulaAt(message.payload.row, message.payload.col) ?? \"\"\n };\n }\n case \"getRowsBatch\": {\n if (!workbook) {\n return null;\n }\n\n const worksheet = workbook.getSheet(message.payload.workbookSheetIndex) as ReturnType<Workbook[\"getSheet\"]> & {\n getRowsBatch?: (startRow: number, maxRows: number, options?: unknown) => unknown;\n };\n if (typeof worksheet.getRowsBatch !== \"function\") {\n return null;\n }\n\n const rows = worksheet.getRowsBatch(message.payload.startRow, message.payload.rowCount, {\n includeFormulas: true,\n includeHyperlinks: true,\n includeMergeInfo: true,\n includeStyles: true,\n useFormattedValues: true\n }) as Array<{ index: number; cells: Array<{ col: number; isMergedSecondary?: boolean; generalAlignment?: string }> }> | null;\n for (const row of rows ?? []) {\n for (const cell of row.cells) {\n if (!cell.isMergedSecondary) {\n cell.generalAlignment = getCellGeneralAlignment(worksheet, row.index, cell.col);\n }\n }\n }\n return rows;\n }\n default:\n return null;\n }\n}\n\nself.addEventListener(\"message\", (event: MessageEvent<WorkerRequest>) => {\n const message = event.data;\n void handleMessage(message)\n .then((result) => {\n respond({\n id: message.id,\n result,\n success: true\n });\n })\n .catch((error: unknown) => {\n respond({\n error: error instanceof Error ? error.message : \"Worker request failed.\",\n id: message.id,\n success: false\n } satisfies WorkerErrorResponse);\n });\n});\n","export type BuiltinChartColorTransform = {\n type: \"tint\" | \"shade\";\n value: number;\n};\n\nexport type BuiltinChartColor = {\n themeIndex: number;\n transforms: BuiltinChartColorTransform[];\n};\n\nexport type BuiltinChartSurfaceStyle = {\n floor: { fill: BuiltinChartColor | null; line: BuiltinChartColor | null };\n wall: { fill: BuiltinChartColor | null; line: BuiltinChartColor | null };\n majorGridline: BuiltinChartColor;\n minorGridline: BuiltinChartColor;\n};\n\nfunction decodeSrgb(channel: number) {\n return channel <= 0.04045 ? channel / 12.92 : ((channel + 0.055) / 1.055) ** 2.4;\n}\n\nfunction encodeSrgb(channel: number) {\n return channel <= 0.0031308 ? channel * 12.92 : 1.055 * channel ** (1 / 2.4) - 0.055;\n}\n\nfunction quantizeLinear(channel: number) {\n return Math.round(channel * 100000) / 100000;\n}\n\n/** DrawingML tint and shade operate on linear RGB and retain the given fraction. */\nexport function resolveBuiltinChartColor(\n color: BuiltinChartColor | null | undefined,\n colorsByIndex: Readonly<Record<number, string | null | undefined>>\n): string | undefined {\n if (!color) return undefined;\n const hex = colorsByIndex[color.themeIndex]?.replace(/^#/, \"\");\n if (!hex || !/^[\\da-f]{6}$/i.test(hex)) return undefined;\n if (color.transforms.length === 0) return `#${hex.toLowerCase()}`;\n\n const channels = [0, 2, 4].map((offset) => Math.fround(quantizeLinear(decodeSrgb(Number.parseInt(hex.slice(offset, offset + 2), 16) / 255))));\n for (const transform of color.transforms) {\n const amount = Math.fround(Math.max(0, Math.min(1, transform.value)));\n for (let index = 0; index < channels.length; index += 1) {\n const channel = channels[index]!;\n channels[index] = transform.type === \"tint\"\n ? Math.fround(Math.fround(1 - amount) + Math.fround(amount * channel))\n : Math.fround(amount * channel);\n }\n }\n return `#${channels.map((channel) => Math.round(encodeSrgb(quantizeLinear(channel)) * 255).toString(16).padStart(2, \"0\")).join(\"\")}`;\n}\n\nconst GRAYSCALE_TINTS = [88, 55, 78, 92, 70, 30];\nconst DARK_GRAYSCALE_TINTS = [5, 55, 78, 15, 70, 30];\n\nfunction normalizeClassicStyle(styleId: number | undefined) {\n if (styleId === undefined || !Number.isInteger(styleId)) return undefined;\n if (styleId >= 1 && styleId <= 48) return styleId;\n if (styleId >= 101 && styleId <= 148) return styleId - 100;\n return undefined;\n}\n\nfunction themeColor(themeIndex: number, tint?: number): BuiltinChartColor {\n return {\n themeIndex,\n transforms: tint === undefined ? [] : [{ type: \"tint\", value: tint / 100 }]\n };\n}\n\nfunction appendBrightness(color: BuiltinChartColor, percent: number) {\n if (percent > 0) color.transforms.push({ type: \"tint\", value: (100 - percent) / 100 });\n if (percent < 0) color.transforms.push({ type: \"shade\", value: (100 + percent) / 100 });\n return color;\n}\n\n/** Returns defaults only; explicit colors and custom color styles take precedence. */\nexport function getBuiltinChartColor(\n styleId: number | undefined,\n index: number,\n count: number\n): BuiltinChartColor | undefined {\n const style = normalizeClassicStyle(styleId);\n if (style === undefined || !Number.isInteger(index) || index < 0 || !Number.isInteger(count) || count < 1) {\n return undefined;\n }\n\n const palette = style === 41 ? 9 : ((style - 1) % 8) + 1;\n const monochrome = palette >= 3 && palette <= 8;\n const color = monochrome\n ? themeColor(palette + 1)\n : palette === 2\n ? themeColor(4 + (index % 6))\n : themeColor(1, (palette === 9 ? DARK_GRAYSCALE_TINTS : GRAYSCALE_TINTS)[index % 6]);\n\n const numerator = 140 * (monochrome ? index + 1 : Math.floor(index / 6) + 1);\n const denominator = monochrome ? count + 1 : Math.floor(count / 6) + 2;\n const brightness = (Math.trunc(Math.fround(Math.fround(numerator) / Math.fround(denominator))) - 70) % 100;\n return appendBrightness(color, brightness);\n}\n\nexport function getBuiltinChartSurfaceStyle(styleId: number | undefined): BuiltinChartSurfaceStyle | undefined {\n const style = normalizeClassicStyle(styleId);\n if (style === undefined) return undefined;\n\n let fill: BuiltinChartColor | null = null;\n if (style === 33 || style === 34) fill = themeColor(1, 20);\n if (style >= 35 && style <= 40) fill = themeColor(style - 31, (styleId ?? 0) >= 100 ? 20 : undefined);\n if (style >= 41) fill = themeColor(1, 95);\n\n return {\n floor: { fill, line: style <= 40 ? themeColor(1, 75) : null },\n wall: { fill, line: null },\n majorGridline: themeColor(1, (styleId ?? 0) >= 100 ? 75 : undefined),\n minorGridline: themeColor(1, style >= 41 ? 90 : 50)\n };\n}\n\nexport function getBuiltinChartSurfaceLine(\n styleId: number | undefined,\n index: number,\n count: number\n): BuiltinChartColor | undefined {\n const style = normalizeClassicStyle(styleId);\n if (style === undefined || !Number.isInteger(index) || index < 0 || !Number.isInteger(count) || count < 1) {\n return undefined;\n }\n if (style >= 9 && style <= 16) return themeColor(2);\n if (styleId === 133) return themeColor(1, 92);\n if (style === 33 || (style >= 35 && style <= 40)) {\n return {\n themeIndex: style === 33 ? 1 : style - 31,\n transforms: [{ type: \"shade\", value: 0.5 }]\n };\n }\n return undefined;\n}\n","import { getBuiltinChartColor, getBuiltinChartSurfaceStyle, resolveBuiltinChartColor } from \"./builtin-chart-styles\";\nimport type { Workbook } from \"@dukelib/sheets-wasm\";\nimport { strFromU8, strToU8 } from \"fflate\";\nimport type { WorkbookImageAssets, WorkbookImageSheetOrigin } from \"./images\";\nimport type {\n XlsxChart,\n XlsxChartAxis,\n XlsxChartDataLabels,\n XlsxChartLegend,\n XlsxChartPointDataLabel,\n XlsxChartPointStyle,\n XlsxChartReference,\n XlsxChartSeries,\n XlsxChartTypeGroup,\n XlsxChartWall,\n XlsxChartsheet,\n XlsxImageAnchor,\n XlsxThemePalette,\n XlsxWorkbookTab\n} from \"./types\";\n\nconst CHART_NS = \"http://schemas.openxmlformats.org/drawingml/2006/chart\";\nconst DRAWINGML_NS = \"http://schemas.openxmlformats.org/drawingml/2006/main\";\nconst DRAWING_SPREADSHEET_NS = \"http://schemas.openxmlformats.org/drawingml/2006/spreadsheetDrawing\";\nconst PKG_REL_NS = \"http://schemas.openxmlformats.org/package/2006/relationships\";\nconst CHART_REL_TYPE = \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/chart\";\nconst CHART_EX_REL_TYPE = \"http://schemas.microsoft.com/office/2014/relationships/chartEx\";\nconst CHART_STYLE_REL_TYPE = \"http://schemas.microsoft.com/office/2011/relationships/chartStyle\";\nconst CHART_COLOR_STYLE_REL_TYPE = \"http://schemas.microsoft.com/office/2011/relationships/chartColorStyle\";\nconst SERIES_COLORS = [\n \"#4472c4\",\n \"#ed7d31\",\n \"#a5a5a5\",\n \"#ffc000\",\n \"#5b9bd5\",\n \"#70ad47\",\n \"#264478\",\n \"#9e480e\",\n \"#636363\",\n \"#997300\"\n];\n\nexport type ParsedChartSeriesFormula = {\n bubbleSizeFormula?: string;\n categoryFormula: string;\n nameFormula?: string;\n nameLiteral?: string;\n order: number;\n valueFormula: string;\n};\n\nfunction quoteSeriesFormulaString(value: string) {\n return `\"${value.replace(/\"/g, \"\\\"\\\"\")}\"`;\n}\n\nfunction unquoteSeriesFormulaString(value: string) {\n const trimmed = value.trim();\n if (trimmed.length < 2 || !trimmed.startsWith(\"\\\"\") || !trimmed.endsWith(\"\\\"\")) {\n return null;\n }\n\n return trimmed.slice(1, -1).replace(/\"\"/g, \"\\\"\");\n}\n\nfunction splitTopLevelSeriesArguments(value: string) {\n const args: string[] = [];\n let current = \"\";\n let doubleQuoted = false;\n let singleQuoted = false;\n let depth = 0;\n\n for (let index = 0; index < value.length; index += 1) {\n const char = value[index] ?? \"\";\n const next = value[index + 1] ?? \"\";\n\n if (doubleQuoted) {\n current += char;\n if (char === \"\\\"\" && next === \"\\\"\") {\n current += next;\n index += 1;\n } else if (char === \"\\\"\") {\n doubleQuoted = false;\n }\n continue;\n }\n\n if (singleQuoted) {\n current += char;\n if (char === \"'\" && next === \"'\") {\n current += next;\n index += 1;\n } else if (char === \"'\") {\n singleQuoted = false;\n }\n continue;\n }\n\n if (char === \"\\\"\") {\n doubleQuoted = true;\n current += char;\n continue;\n }\n\n if (char === \"'\") {\n singleQuoted = true;\n current += char;\n continue;\n }\n\n if (char === \"(\") {\n depth += 1;\n current += char;\n continue;\n }\n\n if (char === \")\") {\n depth = Math.max(0, depth - 1);\n current += char;\n continue;\n }\n\n if (char === \",\" && depth === 0) {\n args.push(current.trim());\n current = \"\";\n continue;\n }\n\n current += char;\n }\n\n args.push(current.trim());\n return args;\n}\n\nfunction readSeriesNameFormula(series: XlsxChartSeries) {\n const raw = series.raw && typeof series.raw === \"object\" ? series.raw as Record<string, unknown> : null;\n return typeof raw?.name === \"string\" && raw.name.length > 0 ? raw.name : null;\n}\n\nexport function buildChartSeriesFormula(chart: XlsxChart | null | undefined, seriesIndex: number) {\n const series = chart?.series[seriesIndex];\n if (!chart || !series) {\n return \"\";\n }\n\n const nameFormula = readSeriesNameFormula(series);\n const nameArgument = nameFormula ?? quoteSeriesFormulaString(series.name ?? `Series ${seriesIndex + 1}`);\n const categoryArgument = series.categoriesRef?.formula ?? \"\";\n const valueArgument = series.valuesRef?.formula ?? \"\";\n const orderArgument = String(seriesIndex + 1);\n const bubbleArgument = series.bubbleSizeRef?.formula;\n\n return [\n `=SERIES(${nameArgument}`,\n categoryArgument,\n valueArgument,\n orderArgument,\n ...(chart.chartType === \"Bubble\" || bubbleArgument ? [bubbleArgument ?? \"\"] : [])\n ].join(\",\") + \")\";\n}\n\nexport function parseChartSeriesFormula(formula: string, chart: XlsxChart | null | undefined): ParsedChartSeriesFormula | null {\n const trimmed = formula.trim();\n const withoutEquals = trimmed.startsWith(\"=\") ? trimmed.slice(1).trim() : trimmed;\n const match = /^SERIES\\s*\\(([\\s\\S]*)\\)$/i.exec(withoutEquals);\n if (!match) {\n return null;\n }\n\n const args = splitTopLevelSeriesArguments(match[1]);\n const isBubble = chart?.chartType === \"Bubble\";\n if (args.length < 4 || args.length > 5 || (isBubble && args.length !== 5)) {\n return null;\n }\n\n const [nameArg = \"\", categoryFormula = \"\", valueFormula = \"\", orderArg = \"\", bubbleSizeFormula] = args;\n if (!categoryFormula || !valueFormula) {\n return null;\n }\n\n const parsedOrder = Number(orderArg);\n if (!Number.isFinite(parsedOrder)) {\n return null;\n }\n\n const nameLiteral = unquoteSeriesFormulaString(nameArg);\n return {\n bubbleSizeFormula: bubbleSizeFormula && bubbleSizeFormula.length > 0 ? bubbleSizeFormula : undefined,\n categoryFormula,\n nameFormula: nameLiteral == null && nameArg.length > 0 ? nameArg : undefined,\n nameLiteral: nameLiteral ?? undefined,\n order: parsedOrder,\n valueFormula\n };\n}\n\nexport function applyChartSeriesFormula(\n chart: XlsxChart,\n seriesIndex: number,\n formula: string,\n workbook: Workbook | null\n) {\n const parsed = parseChartSeriesFormula(formula, chart);\n const currentSeries = chart.series[seriesIndex];\n if (!parsed || !currentSeries) {\n return null;\n }\n\n const categoriesRef: XlsxChartReference = {\n ...(currentSeries.categoriesRef ?? {}),\n formula: parsed.categoryFormula\n };\n const valuesRef: XlsxChartReference = {\n ...(currentSeries.valuesRef ?? {}),\n formula: parsed.valueFormula\n };\n const bubbleSizeRef: XlsxChartReference | null = chart.chartType === \"Bubble\" || parsed.bubbleSizeFormula\n ? {\n ...(currentSeries.bubbleSizeRef ?? {}),\n formula: parsed.bubbleSizeFormula\n }\n : currentSeries.bubbleSizeRef ?? null;\n const raw = {\n ...(currentSeries.raw ?? {})\n };\n if (parsed.nameFormula) {\n raw.name = parsed.nameFormula;\n } else {\n delete raw.name;\n }\n\n const nextSeries: XlsxChartSeries = {\n ...currentSeries,\n bubbleSizeRef,\n bubbleSizes: workbook && bubbleSizeRef?.formula\n ? resolveReferenceValues(workbook, chart.workbookSheetIndex, bubbleSizeRef, \"value\").map((value) => (\n typeof value === \"number\" && Number.isFinite(value) ? value : null\n ))\n : currentSeries.bubbleSizes,\n categories: workbook\n ? resolveReferenceValues(workbook, chart.workbookSheetIndex, categoriesRef, \"category\")\n : currentSeries.categories,\n categoriesRef,\n name: parsed.nameLiteral ?? (\n parsed.nameFormula && workbook\n ? resolveSeriesName(workbook, chart.workbookSheetIndex, parsed.nameFormula)\n : parsed.nameFormula ?? currentSeries.name\n ),\n raw,\n values: workbook\n ? resolveReferenceValues(workbook, chart.workbookSheetIndex, valuesRef, \"value\").map((value) => (\n typeof value === \"number\" && Number.isFinite(value) ? value : null\n ))\n : currentSeries.values,\n valuesRef\n };\n\n return {\n ...chart,\n series: chart.series.map((series, index) => index === seriesIndex ? nextSeries : series)\n };\n}\n\nfunction normalizeWorksheetVisibility(value: unknown): \"hidden\" | \"veryHidden\" | \"visible\" {\n return value === \"hidden\" || value === \"veryHidden\" ? value : \"visible\";\n}\nconst EMU_PER_PIXEL = 9525;\nconst THEME_COLOR_INDEX_BY_NAME: Record<string, number> = {\n accent1: 4,\n accent2: 5,\n accent3: 6,\n accent4: 7,\n accent5: 8,\n accent6: 9,\n dk1: 1,\n dk2: 3,\n folHlink: 11,\n hlink: 10,\n lt1: 0,\n lt2: 2,\n tx1: 1,\n tx2: 3,\n bg1: 0,\n bg2: 2\n};\nconst PRIMARY_CHART_TYPE_LOCAL_NAMES = [\n \"barChart\",\n \"lineChart\",\n \"line3DChart\",\n \"stockChart\",\n \"radarChart\",\n \"scatterChart\",\n \"pieChart\",\n \"pie3DChart\",\n \"doughnutChart\",\n \"areaChart\",\n \"area3DChart\",\n \"bar3DChart\",\n \"ofPieChart\",\n \"bubbleChart\",\n \"surfaceChart\",\n \"surface3DChart\"\n] as const;\n\nexport type WorkbookChartOrigin = {\n anchorIndex: number;\n anchor: XlsxImageAnchor | null;\n chartPath: string | null;\n chartKind: \"classic\" | \"modern\";\n drawingPath: string;\n workbookSheetIndex: number;\n};\n\nexport type WorkbookChartAssets = {\n chartOriginsById: Map<string, WorkbookChartOrigin>;\n chartsByWorkbookSheetIndex: XlsxChart[][];\n chartsheets: XlsxChartsheet[];\n tabs: XlsxWorkbookTab[];\n};\n\ntype ChartStyleAppearance = {\n axisLabelColor?: string;\n axisLineColor?: string;\n chartAreaBorderColor?: string;\n chartAreaFillColor?: string;\n chartAreaNoFill?: boolean;\n paletteOffset?: number;\n textColor?: string;\n titleColor?: string;\n};\n\nfunction clampUnitInterval(value: number) {\n return Math.max(0, Math.min(1, value));\n}\n\nfunction isElementNode(node: Node | ChildNode | null | undefined): node is Element {\n return node != null && node.nodeType === 1;\n}\n\nfunction normalizeHexColor(value: string) {\n const hex = value.replace(/^#/, \"\");\n if (hex.length === 8) {\n return `#${hex.slice(2).toLowerCase()}`;\n }\n if (hex.length === 6) {\n return `#${hex.toLowerCase()}`;\n }\n return null;\n}\n\nfunction resolveColorFromXmlFragment(fragment: string, themePalette?: XlsxThemePalette | null) {\n if (!fragment) {\n return undefined;\n }\n\n const srgbMatch = fragment.match(/<a:srgbClr\\b[^>]*\\bval=\"([0-9a-fA-F]{6,8})\"/i);\n if (srgbMatch?.[1]) {\n return normalizeHexColor(srgbMatch[1]) ?? undefined;\n }\n\n const schemeMatch = fragment.match(/<a:schemeClr\\b[^>]*\\bval=\"([^\"]+)\"[^>]*>([\\s\\S]*?)<\\/a:schemeClr>/i)\n ?? fragment.match(/<a:schemeClr\\b[^>]*\\bval=\"([^\"]+)\"[^>]*/i);\n if (!schemeMatch?.[1]) {\n return undefined;\n }\n\n const baseColor = resolveThemeColor(schemeMatch[1], themePalette);\n if (!baseColor) {\n return undefined;\n }\n\n const transforms = schemeMatch[2] ?? \"\";\n let lightnessModifier = 1;\n let lightnessOffset = 0;\n for (const match of transforms.matchAll(/<a:(lumMod|lumOff|tint|shade)\\b[^>]*\\bval=\"(-?\\d+(?:\\.\\d+)?)\"/gi)) {\n const transform = match[1]?.toLowerCase();\n const rawValue = Number(match[2] ?? Number.NaN);\n if (!transform || !Number.isFinite(rawValue)) {\n continue;\n }\n if (transform === \"lummod\") {\n lightnessModifier *= rawValue / 100000;\n } else if (transform === \"lumoff\") {\n lightnessOffset += rawValue / 100000;\n } else if (transform === \"tint\") {\n lightnessOffset += (1 - lightnessOffset) * (rawValue / 100000);\n } else if (transform === \"shade\") {\n lightnessModifier *= rawValue / 100000;\n }\n }\n\n return applyLightnessTransform(baseColor, lightnessModifier, lightnessOffset) ?? undefined;\n}\n\nfunction readHexColorFromXmlFragment(\n fragment: string,\n preferLine = false,\n themePalette?: XlsxThemePalette | null\n) {\n const source = preferLine\n ? fragment.match(/<a:ln\\b[\\s\\S]*?<\\/a:ln>/i)?.[0] ?? \"\"\n : fragment.match(/<a:solidFill\\b[\\s\\S]*?<\\/a:solidFill>/i)?.[0] ?? \"\";\n return resolveColorFromXmlFragment(source, themePalette);\n}\n\ntype FallbackSeriesStyle = {\n color?: string;\n lineColor?: string;\n};\n\nfunction parseFallbackSeriesStylesFromChartXml(\n chartXml: string,\n themePalette?: XlsxThemePalette | null\n): FallbackSeriesStyle[] {\n const seriesBlocks = chartXml.match(/<c:ser\\b[\\s\\S]*?<\\/c:ser>/gi) ?? [];\n if (seriesBlocks.length === 0) {\n return [];\n }\n\n return seriesBlocks.map((seriesBlock) => {\n const shapeBlock = seriesBlock.match(/<c:spPr\\b[\\s\\S]*?<\\/c:spPr>/i)?.[0] ?? \"\";\n return {\n color: readHexColorFromXmlFragment(shapeBlock, false, themePalette),\n lineColor: readHexColorFromXmlFragment(shapeBlock, true, themePalette)\n };\n });\n}\n\nfunction parseFallbackPointStylesFromChartXml(\n chartXml: string,\n themePalette?: XlsxThemePalette | null\n): XlsxChartPointStyle[][] {\n const chartDocument = parseXml(chartXml);\n if (chartDocument) {\n const parsedSeriesStyles = getLocalDescendants(chartDocument, \"ser\").map((seriesNode) => {\n const styles: XlsxChartPointStyle[] = [];\n for (const dataPointNode of getLocalChildren(seriesNode, \"dPt\")) {\n const indexValue = readChartNumericAttribute(dataPointNode, \"idx\");\n if (indexValue === undefined) {\n continue;\n }\n const shapeProperties = getFirstLocalChild(dataPointNode, \"spPr\");\n const lineStyle = resolveChartLineStyle(shapeProperties, themePalette);\n styles.push({\n color: resolveChartFillColor(shapeProperties, themePalette) ?? undefined,\n explosion: readChartNumericAttribute(dataPointNode, \"explosion\"),\n index: indexValue,\n lineColor: lineStyle.color ?? undefined\n });\n }\n return styles;\n });\n if (parsedSeriesStyles.some((styles) => styles.length > 0)) {\n return parsedSeriesStyles;\n }\n }\n\n const seriesBlocks = chartXml.match(/<c:ser\\b[\\s\\S]*?<\\/c:ser>/gi) ?? [];\n if (seriesBlocks.length === 0) {\n return [];\n }\n\n return seriesBlocks.map((seriesBlock) => {\n const pointBlocks = seriesBlock.match(/<c:dPt\\b[\\s\\S]*?<\\/c:dPt>/gi) ?? [];\n if (pointBlocks.length === 0) {\n return [];\n }\n\n const styles: XlsxChartPointStyle[] = [];\n for (const pointBlock of pointBlocks) {\n const indexMatch = pointBlock.match(/<c:idx\\b[^>]*\\bval=\"(-?\\d+)\"/i);\n const index = indexMatch?.[1] ? Number(indexMatch[1]) : Number.NaN;\n if (!Number.isFinite(index)) {\n continue;\n }\n const explosionMatch = pointBlock.match(/<c:explosion\\b[^>]*\\bval=\"(-?\\d+(?:\\.\\d+)?)\"/i);\n const explosionValue = explosionMatch?.[1] ? Number(explosionMatch[1]) : Number.NaN;\n styles.push({\n color: readHexColorFromXmlFragment(pointBlock, false, themePalette),\n explosion: Number.isFinite(explosionValue) ? explosionValue : undefined,\n index,\n lineColor: readHexColorFromXmlFragment(pointBlock, true, themePalette)\n });\n }\n\n return styles;\n });\n}\n\nfunction parseNumericPointCacheFromXmlFragment(fragment: string) {\n const pointMatches = Array.from(fragment.matchAll(/<c:pt\\b[^>]*\\bidx=\"(-?\\d+)\"[^>]*>[\\s\\S]*?<c:v>([^<]*)<\\/c:v>[\\s\\S]*?<\\/c:pt>/gi));\n if (pointMatches.length === 0) {\n return [];\n }\n\n const explicitPointCountMatch = fragment.match(/<c:ptCount\\b[^>]*\\bval=\"(\\d+)\"/i);\n const explicitPointCount = explicitPointCountMatch?.[1] ? Number(explicitPointCountMatch[1]) : Number.NaN;\n const maxIndex = pointMatches.reduce((max, match) => {\n const current = Number(match[1] ?? Number.NaN);\n return Number.isFinite(current) ? Math.max(max, current) : max;\n }, -1);\n const pointCount = Math.max(\n pointMatches.length,\n Number.isFinite(explicitPointCount) ? explicitPointCount : 0,\n maxIndex + 1\n );\n const values = Array.from({ length: pointCount }, () => null as number | null);\n\n for (const match of pointMatches) {\n const index = Number(match[1] ?? Number.NaN);\n const rawValue = (match[2] ?? \"\").trim();\n const numericValue = Number(rawValue);\n if (!Number.isFinite(index) || index < 0 || !Number.isFinite(numericValue)) {\n continue;\n }\n values[index] = numericValue;\n }\n\n return values;\n}\n\nfunction parseFallbackBubbleSizesFromChartXml(chartXml: string): Array<Array<number | null>> {\n const seriesBlocks = chartXml.match(/<c:ser\\b[\\s\\S]*?<\\/c:ser>/gi) ?? [];\n if (seriesBlocks.length === 0) {\n return [];\n }\n\n return seriesBlocks.map((seriesBlock) => {\n const bubbleSizeBlock = seriesBlock.match(/<c:bubbleSize\\b[\\s\\S]*?<\\/c:bubbleSize>/i)?.[0] ?? \"\";\n if (!bubbleSizeBlock) {\n return [];\n }\n\n return parseNumericPointCacheFromXmlFragment(bubbleSizeBlock);\n });\n}\n\nfunction findPrimaryChartTypeNode(plotAreaNode: Element | null) {\n if (!plotAreaNode) {\n return null;\n }\n\n for (const localName of PRIMARY_CHART_TYPE_LOCAL_NAMES) {\n const node = getLocalChildren(plotAreaNode, localName)[0];\n if (node) {\n return node;\n }\n }\n\n return null;\n}\n\nfunction resolveScatterChartType(scatterStyle: string | null | undefined) {\n switch (scatterStyle) {\n case \"line\":\n case \"lineMarker\":\n return \"ScatterLines\";\n case \"smooth\":\n case \"smoothMarker\":\n return \"ScatterSmooth\";\n default:\n return \"Scatter\";\n }\n}\n\nfunction parseHexColor(color: string): [number, number, number] | null {\n const normalized = normalizeHexColor(color);\n if (!normalized) {\n return null;\n }\n const match = /^#([0-9a-f]{6})$/.exec(normalized);\n if (!match) {\n return null;\n }\n return [\n Number.parseInt(match[1].slice(0, 2), 16),\n Number.parseInt(match[1].slice(2, 4), 16),\n Number.parseInt(match[1].slice(4, 6), 16)\n ];\n}\n\nfunction rgbToHsl(red: number, green: number, blue: number): [number, number, number] {\n const normalizedRed = red / 255;\n const normalizedGreen = green / 255;\n const normalizedBlue = blue / 255;\n const max = Math.max(normalizedRed, normalizedGreen, normalizedBlue);\n const min = Math.min(normalizedRed, normalizedGreen, normalizedBlue);\n const lightness = (max + min) / 2;\n\n if (max === min) {\n return [0, 0, lightness];\n }\n\n const delta = max - min;\n const saturation = lightness > 0.5 ? delta / (2 - max - min) : delta / (max + min);\n let hue = 0;\n\n switch (max) {\n case normalizedRed:\n hue = (normalizedGreen - normalizedBlue) / delta + (normalizedGreen < normalizedBlue ? 6 : 0);\n break;\n case normalizedGreen:\n hue = (normalizedBlue - normalizedRed) / delta + 2;\n break;\n default:\n hue = (normalizedRed - normalizedGreen) / delta + 4;\n break;\n }\n\n return [hue / 6, saturation, lightness];\n}\n\nfunction hueToRgb(p: number, q: number, t: number) {\n let nextT = t;\n if (nextT < 0) {\n nextT += 1;\n }\n if (nextT > 1) {\n nextT -= 1;\n }\n if (nextT < 1 / 6) {\n return p + (q - p) * 6 * nextT;\n }\n if (nextT < 1 / 2) {\n return q;\n }\n if (nextT < 2 / 3) {\n return p + (q - p) * (2 / 3 - nextT) * 6;\n }\n return p;\n}\n\nfunction hslToRgb(hue: number, saturation: number, lightness: number): [number, number, number] {\n if (saturation === 0) {\n const gray = Math.round(lightness * 255);\n return [gray, gray, gray];\n }\n\n const q = lightness < 0.5 ? lightness * (1 + saturation) : lightness + saturation - lightness * saturation;\n const p = 2 * lightness - q;\n\n return [\n Math.round(hueToRgb(p, q, hue + 1 / 3) * 255),\n Math.round(hueToRgb(p, q, hue) * 255),\n Math.round(hueToRgb(p, q, hue - 1 / 3) * 255)\n ];\n}\n\nfunction rgbToHex(red: number, green: number, blue: number) {\n return `#${[red, green, blue]\n .map((channel) => Math.max(0, Math.min(255, Math.round(channel))).toString(16).padStart(2, \"0\"))\n .join(\"\")}`;\n}\n\nfunction applyLightnessTransform(baseColor: string, modifier = 1, offset = 0) {\n const rgb = parseHexColor(baseColor);\n if (!rgb) {\n return normalizeHexColor(baseColor);\n }\n\n const [hue, saturation, lightness] = rgbToHsl(rgb[0], rgb[1], rgb[2]);\n const nextLightness = clampUnitInterval(lightness * modifier + offset);\n const [nextRed, nextGreen, nextBlue] = hslToRgb(hue, saturation, nextLightness);\n return rgbToHex(nextRed, nextGreen, nextBlue);\n}\n\nfunction resolveThemeColor(name: string | null, themePalette?: XlsxThemePalette | null) {\n if (!name) {\n return null;\n }\n const index = THEME_COLOR_INDEX_BY_NAME[name];\n return index === undefined ? null : themePalette?.colorsByIndex[index] ?? null;\n}\n\nfunction resolveThemeTypeface(typeface: string | null, themePalette?: XlsxThemePalette | null) {\n if (!typeface) {\n return null;\n }\n if (typeface === \"+mn-lt\" || typeface === \"+mn-ea\" || typeface === \"+mn-cs\") {\n return themePalette?.minorLatinFont ?? null;\n }\n if (typeface === \"+mj-lt\" || typeface === \"+mj-ea\" || typeface === \"+mj-cs\") {\n return themePalette?.majorLatinFont ?? null;\n }\n return typeface;\n}\n\nfunction readChartTextTypeface(textPropertiesNode: Element | null, themePalette?: XlsxThemePalette | null) {\n if (!textPropertiesNode) {\n return null;\n }\n const defaultRunProperties = getFirstLocalDescendant(textPropertiesNode, \"defRPr\")\n ?? getFirstLocalDescendant(textPropertiesNode, \"rPr\");\n if (!defaultRunProperties) {\n return null;\n }\n const typeface = getFirstLocalChild(defaultRunProperties, \"latin\")?.getAttribute(\"typeface\")\n ?? getFirstLocalChild(defaultRunProperties, \"ea\")?.getAttribute(\"typeface\")\n ?? getFirstLocalChild(defaultRunProperties, \"cs\")?.getAttribute(\"typeface\")\n ?? null;\n const resolved = resolveThemeTypeface(typeface, themePalette)?.trim() ?? \"\";\n return resolved.length > 0 ? resolved : null;\n}\n\nfunction resolveChartColorNode(node: Element | null, themePalette?: XlsxThemePalette | null): string | null {\n if (!node) {\n return null;\n }\n\n let baseColor: string | null = null;\n if (node.localName === \"srgbClr\") {\n baseColor = normalizeHexColor(`#${node.getAttribute(\"val\") ?? \"\"}`);\n } else if (node.localName === \"schemeClr\") {\n baseColor = resolveThemeColor(node.getAttribute(\"val\"), themePalette);\n } else if (node.localName === \"sysClr\") {\n baseColor = normalizeHexColor(`#${node.getAttribute(\"lastClr\") ?? \"\"}`);\n }\n\n if (!baseColor) {\n return null;\n }\n\n let lightnessModifier = 1;\n let lightnessOffset = 0;\n for (const transformNode of Array.from(node.childNodes).filter(isElementNode)) {\n const rawValue = Number(transformNode.getAttribute(\"val\") ?? Number.NaN);\n if (!Number.isFinite(rawValue)) {\n continue;\n }\n if (transformNode.localName === \"lumMod\") {\n lightnessModifier *= rawValue / 100000;\n } else if (transformNode.localName === \"lumOff\") {\n lightnessOffset += rawValue / 100000;\n } else if (transformNode.localName === \"tint\") {\n lightnessOffset += (1 - lightnessOffset) * (rawValue / 100000);\n } else if (transformNode.localName === \"shade\") {\n lightnessModifier *= rawValue / 100000;\n }\n }\n\n return applyLightnessTransform(baseColor, lightnessModifier, lightnessOffset);\n}\n\nfunction isChartColorElement(node: Element | null | undefined): node is Element {\n return Boolean(node && (node.localName === \"schemeClr\" || node.localName === \"srgbClr\" || node.localName === \"sysClr\"));\n}\n\nfunction findFirstChartColorElement(node: Element | null) {\n if (!node) {\n return null;\n }\n if (isChartColorElement(node)) {\n return node;\n }\n\n for (const localName of [\"srgbClr\", \"schemeClr\", \"sysClr\"]) {\n for (const candidate of getLocalDescendants(node, localName)) {\n if (isChartColorElement(candidate)) {\n return candidate;\n }\n }\n }\n\n return null;\n}\n\nfunction resolveChartFillColor(shapeNode: Element | null, themePalette?: XlsxThemePalette | null) {\n if (!shapeNode || getFirstLocalChild(shapeNode, \"noFill\")) {\n return null;\n }\n const solidFill = getFirstLocalChild(shapeNode, \"solidFill\");\n if (solidFill) {\n const colorNode = findFirstChartColorElement(Array.from(solidFill.childNodes).find(isElementNode) ?? null);\n return resolveChartColorNode(colorNode, themePalette);\n }\n\n const gradientFill = getFirstLocalChild(shapeNode, \"gradFill\");\n const gradientStops = gradientFill\n ? getLocalDescendants(gradientFill, \"gs\")\n .map((stopNode) => ({\n colorNode: Array.from(stopNode.childNodes).find(isElementNode) ?? null,\n position: Number(stopNode.getAttribute(\"pos\") ?? Number.NaN)\n }))\n .filter((stop) => Boolean(stop.colorNode))\n : [];\n if (gradientStops.length === 0) {\n return null;\n }\n\n gradientStops.sort((left, right) => {\n const leftPos = Number.isFinite(left.position) ? left.position : 0;\n const rightPos = Number.isFinite(right.position) ? right.position : 0;\n return leftPos - rightPos;\n });\n const midpointStop = gradientStops.find((stop) => Number.isFinite(stop.position) && stop.position >= 50000)\n ?? gradientStops[Math.floor(gradientStops.length / 2)]\n ?? gradientStops[0];\n return resolveChartColorNode(midpointStop.colorNode, themePalette);\n}\n\nfunction resolveChartLineStyle(shapeNode: Element | null, themePalette?: XlsxThemePalette | null) {\n const lineNode = shapeNode?.localName === \"ln\" ? shapeNode : (shapeNode ? getFirstLocalChild(shapeNode, \"ln\") : null);\n if (!lineNode) {\n return { color: null, hidden: false, widthPx: undefined };\n }\n if (getFirstLocalChild(lineNode, \"noFill\")) {\n return { color: null, hidden: true, widthPx: undefined };\n }\n\n const solidFill = getFirstLocalChild(lineNode, \"solidFill\");\n const colorNode = solidFill ? findFirstChartColorElement(Array.from(solidFill.childNodes).find(isElementNode) ?? null) : null;\n const widthValue = Number(lineNode.getAttribute(\"w\") ?? Number.NaN);\n return {\n color: resolveChartColorNode(colorNode, themePalette),\n hidden: false,\n widthPx: Number.isFinite(widthValue) ? Math.max(1, widthValue / EMU_PER_PIXEL) : undefined\n };\n}\n\nfunction normalizeLegend(raw: unknown): XlsxChartLegend | null {\n if (!raw || typeof raw !== \"object\") {\n return null;\n }\n const legend = raw as Record<string, unknown>;\n return {\n overlay: typeof legend.overlay === \"boolean\" ? legend.overlay : undefined,\n position: typeof legend.position === \"string\" ? legend.position : undefined,\n raw: legend\n };\n}\n\nfunction normalizeLegendPosition(position: string | undefined) {\n if (!position) {\n return undefined;\n }\n switch (position) {\n case \"bottom\":\n return \"b\";\n case \"left\":\n return \"l\";\n case \"right\":\n return \"r\";\n case \"top\":\n return \"t\";\n default:\n return position;\n }\n}\n\nfunction readChartNumericAttribute(parent: Element | null, localName: string) {\n const node = parent ? getFirstLocalChild(parent, localName) : null;\n const value = Number(node?.getAttribute(\"val\") ?? Number.NaN);\n return Number.isFinite(value) ? value : undefined;\n}\n\nfunction readChartBooleanAttribute(parent: Element | null, localName: string) {\n const node = parent ? getFirstLocalChild(parent, localName) : null;\n if (!node) {\n return undefined;\n }\n const rawValue = node.getAttribute(\"val\");\n if (rawValue == null) {\n return true;\n }\n if (rawValue === \"1\" || rawValue === \"true\") {\n return true;\n }\n if (rawValue === \"0\" || rawValue === \"false\") {\n return false;\n }\n return undefined;\n}\n\nfunction readChartLabelFontSizePt(textPropertiesNode: Element | null) {\n if (!textPropertiesNode) {\n return undefined;\n }\n const runPropertiesNode = getFirstLocalDescendant(textPropertiesNode, \"defRPr\")\n ?? getFirstLocalDescendant(textPropertiesNode, \"rPr\");\n const rawSize = Number(runPropertiesNode?.getAttribute(\"sz\") ?? Number.NaN);\n if (!Number.isFinite(rawSize) || rawSize <= 0) {\n return undefined;\n }\n return rawSize / 100;\n}\n\nfunction parseChartPointDataLabelsFromXml(labelsNode: Element): XlsxChartPointDataLabel[] {\n const fallbackFontSizePt = readChartLabelFontSizePt(getFirstLocalChild(labelsNode, \"txPr\"));\n const labels: XlsxChartPointDataLabel[] = [];\n for (const pointLabelNode of getLocalChildren(labelsNode, \"dLbl\")) {\n const index = readChartNumericAttribute(pointLabelNode, \"idx\");\n if (typeof index !== \"number\" || !Number.isFinite(index)) {\n continue;\n }\n\n const layoutNode = getFirstLocalChild(pointLabelNode, \"layout\");\n const manualLayoutNode = layoutNode ? getFirstLocalChild(layoutNode, \"manualLayout\") : null;\n labels.push({\n deleted: readChartBooleanAttribute(pointLabelNode, \"delete\"),\n fontSizePt: readChartLabelFontSizePt(getFirstLocalChild(pointLabelNode, \"txPr\")) ?? fallbackFontSizePt,\n index,\n showBubbleSize: readChartBooleanAttribute(pointLabelNode, \"showBubbleSize\"),\n showCategoryName: readChartBooleanAttribute(pointLabelNode, \"showCatName\"),\n showPercent: readChartBooleanAttribute(pointLabelNode, \"showPercent\"),\n showSeriesName: readChartBooleanAttribute(pointLabelNode, \"showSerName\"),\n showValue: readChartBooleanAttribute(pointLabelNode, \"showVal\"),\n x: readChartNumericAttribute(manualLayoutNode, \"x\"),\n y: readChartNumericAttribute(manualLayoutNode, \"y\")\n });\n }\n return labels;\n}\n\nfunction parseChartDataLabelsFromXml(labelsNode: Element | null): XlsxChartDataLabels | null {\n if (!labelsNode) {\n return null;\n }\n\n const pointLabels = parseChartPointDataLabelsFromXml(labelsNode);\n const labels: XlsxChartDataLabels = {\n pointLabels: pointLabels.length > 0 ? pointLabels : undefined,\n raw: {},\n showBubbleSize: readChartBooleanAttribute(labelsNode, \"showBubbleSize\"),\n showCategoryName: readChartBooleanAttribute(labelsNode, \"showCatName\"),\n showLegendKey: readChartBooleanAttribute(labelsNode, \"showLegendKey\"),\n showPercent: readChartBooleanAttribute(labelsNode, \"showPercent\"),\n showSeriesName: readChartBooleanAttribute(labelsNode, \"showSerName\"),\n showValue: readChartBooleanAttribute(labelsNode, \"showVal\")\n };\n const hasValue = (\n labels.showBubbleSize !== undefined\n || labels.showCategoryName !== undefined\n || labels.showLegendKey !== undefined\n || labels.showPercent !== undefined\n || (labels.pointLabels?.length ?? 0) > 0\n || labels.showSeriesName !== undefined\n || labels.showValue !== undefined\n );\n return hasValue ? labels : null;\n}\n\nfunction readChartRelationships(\n archive: Record<string, Uint8Array>,\n chartPath: string\n) {\n const relsPath = normalizeArchivePath(`${dirname(chartPath)}/_rels/${chartPath.split(\"/\").pop()}.rels`);\n const relsXml = readArchiveText(archive, relsPath);\n if (!relsXml) {\n return new Map<string, string>();\n }\n\n const relsDocument = parseXml(relsXml);\n if (!relsDocument) {\n return new Map<string, string>();\n }\n\n const relationships = new Map<string, string>();\n for (const relationshipNode of getLocalDescendants(relsDocument, \"Relationship\")) {\n const type = relationshipNode.getAttribute(\"Type\");\n const target = relationshipNode.getAttribute(\"Target\");\n if (!type || !target) {\n continue;\n }\n relationships.set(type, resolveRelationshipPath(relsPath, target));\n }\n\n return relationships;\n}\n\nfunction readChartColorPalette(\n archive: Record<string, Uint8Array>,\n colorStylePath: string | null | undefined,\n themePalette?: XlsxThemePalette | null\n) {\n const colorStyleXml = readArchiveText(archive, colorStylePath);\n if (!colorStyleXml) {\n return [];\n }\n\n const colorStyleDocument = parseXml(colorStyleXml);\n if (!colorStyleDocument?.documentElement) {\n return [];\n }\n\n return Array.from(colorStyleDocument.documentElement.childNodes)\n .filter((child): child is Element => isElementNode(child) && child.localName !== \"variation\")\n .map((child) => (\n resolveChartColorNode(child, themePalette)\n ?? resolveChartColorNode(findFirstChartColorElement(child), themePalette)\n ))\n .filter((color): color is string => typeof color === \"string\");\n}\n\nfunction readChartStyleAppearance(\n archive: Record<string, Uint8Array>,\n stylePath: string | null | undefined,\n themePalette?: XlsxThemePalette | null\n): ChartStyleAppearance {\n const styleXml = readArchiveText(archive, stylePath);\n if (!styleXml) {\n return {};\n }\n\n const styleDocument = parseXml(styleXml);\n if (!styleDocument) {\n return {};\n }\n\n const dataPointNode = getFirstLocalDescendant(styleDocument, \"dataPoint\");\n const fillRefNode = dataPointNode ? getFirstLocalChild(dataPointNode, \"fillRef\") : null;\n const index = Number(fillRefNode?.getAttribute(\"idx\") ?? Number.NaN);\n const chartAreaNode = getFirstLocalDescendant(styleDocument, \"chartArea\");\n const chartAreaShapeProperties = chartAreaNode ? getFirstLocalChild(chartAreaNode, \"spPr\") : null;\n const chartAreaFontRef = chartAreaNode ? getFirstLocalChild(chartAreaNode, \"fontRef\") : null;\n const chartAreaFontColor = chartAreaFontRef\n ? resolveChartColorNode(Array.from(chartAreaFontRef.childNodes).find(isElementNode) ?? null, themePalette)\n : null;\n const titleNode = getFirstLocalDescendant(styleDocument, \"title\");\n const titleFontRef = titleNode ? getFirstLocalChild(titleNode, \"fontRef\") : null;\n const titleColor = titleFontRef\n ? resolveChartColorNode(Array.from(titleFontRef.childNodes).find(isElementNode) ?? null, themePalette)\n : null;\n const axisStyleNode = getFirstLocalDescendant(styleDocument, \"categoryAxis\")\n ?? getFirstLocalDescendant(styleDocument, \"valueAxis\");\n const axisShapeProperties = axisStyleNode ? getFirstLocalChild(axisStyleNode, \"spPr\") : null;\n const axisFontRef = axisStyleNode ? getFirstLocalChild(axisStyleNode, \"fontRef\") : null;\n const chartAreaNoFill = chartAreaShapeProperties ? getFirstLocalChild(chartAreaShapeProperties, \"noFill\") != null : false;\n\n return {\n axisLabelColor: axisFontRef\n ? resolveChartColorNode(Array.from(axisFontRef.childNodes).find(isElementNode) ?? null, themePalette) ?? undefined\n : undefined,\n axisLineColor: resolveChartLineStyle(axisShapeProperties, themePalette).color ?? undefined,\n chartAreaBorderColor: resolveChartLineStyle(chartAreaShapeProperties, themePalette).color ?? undefined,\n chartAreaFillColor: resolveChartFillColor(chartAreaShapeProperties, themePalette) ?? undefined,\n chartAreaNoFill,\n paletteOffset: Number.isFinite(index) ? index : undefined,\n textColor: chartAreaFontColor ?? undefined,\n titleColor: titleColor ?? chartAreaFontColor ?? undefined\n };\n}\n\nfunction buildThemeSeriesPalette(themePalette?: XlsxThemePalette | null) {\n const themeColors = [4, 5, 6, 7, 8, 9]\n .map((index) => themePalette?.colorsByIndex[index] ?? null)\n .filter((color): color is string => Boolean(color));\n return themeColors.length > 0 ? themeColors : SERIES_COLORS;\n}\n\nfunction applyBuiltinSurfaceDefaults(chart: XlsxChart, themePalette?: XlsxThemePalette | null) {\n if (chart.chartType !== \"Surface\") {\n return;\n }\n\n const builtin = chart.raw?.hasCustomChartColorStyle !== true ? getBuiltinChartSurfaceStyle(chart.chartStyleId) : undefined;\n const colors = themePalette?.colorsByIndex ?? {};\n const wallFill = resolveBuiltinChartColor(builtin?.wall.fill, colors) ?? (chart.wireframe ? \"#d0d0d0\" : \"#d9d9df\");\n const floorFill = resolveBuiltinChartColor(builtin?.floor.fill, colors) ?? wallFill;\n const gridlineColor = resolveBuiltinChartColor(builtin?.majorGridline, colors);\n for (const axis of [chart.categoryAxis, chart.valueAxis, chart.seriesAxis]) {\n if (axis && !axis.majorGridlineColor) axis.majorGridlineColor = gridlineColor;\n }\n const wallLine = chart.wireframe ? \"#a6a6a6\" : \"#a8adb7\";\n const previousDefaults = chart.raw?.builtinSurfaceDefaults as Record<string, { fillColor?: string; lineColor?: string }> | undefined;\n const nextDefaults: Record<string, { fillColor?: string; lineColor?: string }> = {};\n for (const key of [\"floor\", \"sideWall\", \"backWall\"] as const) {\n const wall = chart[key] ?? {};\n const previous = previousDefaults?.[key];\n const fillIsDefault = wall.fillColor === undefined || wall.fillColor === previous?.fillColor;\n const lineIsDefault = wall.lineColor === undefined || wall.lineColor === previous?.lineColor;\n const fillColor = fillIsDefault ? (key === \"floor\" ? floorFill : wallFill) : wall.fillColor;\n const lineColor = lineIsDefault ? wallLine : wall.lineColor;\n chart[key] = { ...wall, fillColor, lineColor };\n nextDefaults[key] = {\n fillColor: fillIsDefault ? fillColor : undefined,\n lineColor: lineIsDefault ? lineColor : undefined\n };\n }\n chart.raw = { ...chart.raw, builtinSurfaceDefaults: nextDefaults };\n if (!chart.surfaceMaterial && chart.wireframe !== true) {\n chart.surfaceMaterial = \"matte\";\n }\n}\n\nfunction applyBuiltinChartDefaults(chart: XlsxChart, themePalette?: XlsxThemePalette | null) {\n const darkBuiltInStyle = typeof chart.chartStyleId === \"number\" && chart.chartStyleId >= 140 && chart.chartStyleId < 150;\n const textColor = themePalette?.colorsByIndex[1] ?? themePalette?.colorsByIndex[3] ?? null;\n const minorTypeface = themePalette?.minorLatinFont?.trim() || undefined;\n const derivedAxisColor = textColor ? applyLightnessTransform(textColor, 0.35, 0.55) : null;\n const derivedBorderColor = textColor\n ? applyLightnessTransform(textColor, chart.is3d ? 0.28 : 0.22, chart.is3d ? 0.6 : 0.7)\n : null;\n if (darkBuiltInStyle) {\n chart.chartAreaFillColor = chart.chartAreaFillColor ?? \"#1f1f1f\";\n chart.chartAreaBorderColor = chart.chartAreaBorderColor ?? \"#1f1f1f\";\n chart.textColor = chart.textColor ?? \"#f5f5f5\";\n chart.titleColor = chart.titleColor ?? \"#f5f5f5\";\n chart.axisLabelColor = chart.axisLabelColor ?? \"#d9d9d9\";\n chart.axisLineColor = chart.axisLineColor ?? \"#8c8c8c\";\n }\n chart.chartAreaBorderColor = chart.chartAreaBorderColor ?? derivedBorderColor ?? undefined;\n chart.textColor = chart.textColor ?? textColor ?? undefined;\n chart.titleColor = chart.titleColor ?? textColor ?? undefined;\n chart.axisLabelColor = chart.axisLabelColor ?? derivedAxisColor ?? textColor ?? undefined;\n chart.axisLineColor = chart.axisLineColor ?? derivedAxisColor ?? textColor ?? undefined;\n chart.fontFamily = chart.fontFamily ?? minorTypeface;\n chart.titleFontFamily = chart.titleFontFamily ?? chart.fontFamily ?? minorTypeface;\n\n const themeColors = themePalette?.colorsByIndex;\n const useBuiltin = chart.raw?.hasCustomChartColorStyle !== true && themeColors && getBuiltinChartColor(chart.chartStyleId, 0, 1) !== undefined;\n const colorCount = Math.max(1, chart.series.length, chart.typeGroups?.reduce((total, group) => total + group.series.length, 0) ?? 0);\n const seriesPalette = useBuiltin && chart.chartType !== \"Surface\"\n ? Array.from({ length: colorCount }, (_, index) => resolveBuiltinChartColor(getBuiltinChartColor(chart.chartStyleId, index, colorCount), themeColors) ?? SERIES_COLORS[index % SERIES_COLORS.length])\n : chart.chartColorPalette?.length ? chart.chartColorPalette : buildThemeSeriesPalette(themePalette);\n chart.chartColorPalette = seriesPalette;\n chart.raw = { ...chart.raw, builtinThemeColors: useBuiltin ? themeColors : undefined };\n\n const applySeriesDefaults = (series: XlsxChartSeries, index: number) => {\n const fallbackColor = seriesPalette[index % seriesPalette.length];\n const properties = series.shapeProperties ?? {};\n const previous = properties.builtinDefaultColors as Partial<Record<\"color\" | \"lineColor\" | \"markerColor\" | \"markerLineColor\", string>> | undefined;\n const generated: Partial<Record<\"color\" | \"lineColor\" | \"markerColor\" | \"markerLineColor\", string>> = {};\n const resolveColor = (key: keyof typeof generated, explicit: unknown, fallback: string | undefined) => {\n const value = series[key];\n if (!explicit && (value == null || value === previous?.[key] || ((key === \"color\" || key === \"lineColor\") && useBuiltin && chart.raw?.xmlChartType))) {\n generated[key] = fallback;\n return fallback;\n }\n return value ?? fallback;\n };\n const explicitFill = properties.xmlFillColor ?? properties.solidFillHex ?? properties.xmlFillHidden;\n const explicitLine = properties.xmlLineColor ?? properties.lineColorHex ?? properties.xmlLineHidden;\n const color = explicitFill\n ? series.color ?? series.lineColor ?? fallbackColor\n : explicitLine\n ? series.lineColor ?? series.color ?? fallbackColor\n : resolveColor(\"color\", false, fallbackColor);\n const lineColor = explicitLine\n ? series.lineColor ?? color\n : explicitFill\n ? color\n : resolveColor(\"lineColor\", false, color ?? fallbackColor);\n const markerColor = resolveColor(\"markerColor\", properties.xmlMarkerFillColor ?? properties.xmlMarkerFillHidden, color ?? lineColor ?? fallbackColor);\n const markerLineColor = resolveColor(\"markerLineColor\", properties.xmlMarkerLineColor ?? properties.xmlMarkerLineHidden, lineColor ?? color ?? fallbackColor);\n return {\n ...series,\n color,\n lineColor,\n markerColor,\n markerLineColor,\n shapeProperties: { ...properties, builtinDefaultColors: generated }\n };\n };\n chart.series = chart.series.map(applySeriesDefaults);\n let groupSeriesOffset = 0;\n chart.typeGroups = chart.typeGroups?.map((group) => {\n const series = group.series.map((entry, index) => applySeriesDefaults(entry, groupSeriesOffset + index));\n groupSeriesOffset += group.series.length;\n return { ...group, series };\n });\n applyBuiltinSurfaceDefaults(chart, themePalette);\n}\n\nfunction parseChartPointStyles(seriesNode: Element, themePalette?: XlsxThemePalette | null): XlsxChartPointStyle[] {\n const pointStyles: XlsxChartPointStyle[] = [];\n\n for (const dataPointNode of getLocalChildren(seriesNode, \"dPt\")) {\n const indexValue = readChartNumericAttribute(dataPointNode, \"idx\");\n if (indexValue === undefined) {\n continue;\n }\n const shapeProperties = getFirstLocalChild(dataPointNode, \"spPr\");\n const lineStyle = resolveChartLineStyle(shapeProperties, themePalette);\n pointStyles.push({\n color: resolveChartFillColor(shapeProperties, themePalette) ?? undefined,\n explosion: readChartNumericAttribute(dataPointNode, \"explosion\"),\n index: indexValue,\n lineColor: lineStyle.color ?? undefined\n });\n }\n\n return pointStyles;\n}\n\nfunction parseInvertNegativeStyle(seriesNode: Element, themePalette?: XlsxThemePalette | null) {\n const invertNode = getFirstLocalDescendant(seriesNode, \"invertSolidFillFmt\");\n const shapeProperties = invertNode ? getFirstLocalChild(invertNode, \"spPr\") : null;\n if (!shapeProperties) {\n return {\n color: undefined,\n lineColor: undefined\n };\n }\n\n const lineStyle = resolveChartLineStyle(shapeProperties, themePalette);\n return {\n color: resolveChartFillColor(shapeProperties, themePalette) ?? undefined,\n lineColor: lineStyle.color ?? undefined\n };\n}\n\nfunction parseChartCacheValues(\n parentNode: Element | null,\n cacheName: \"numCache\" | \"strCache\",\n mode: \"category\" | \"value\"\n): Array<number | string | null> | null {\n if (!parentNode) {\n return null;\n }\n\n const referenceNode = getFirstLocalChild(parentNode, \"numRef\")\n ?? getFirstLocalChild(parentNode, \"strRef\")\n ?? parentNode;\n const cacheNode = getFirstLocalChild(referenceNode, cacheName)\n ?? getFirstLocalChild(parentNode, cacheName === \"numCache\" ? \"numLit\" : \"strLit\");\n if (!cacheNode) {\n return null;\n }\n\n const pointCount = readChartNumericAttribute(cacheNode, \"ptCount\");\n const pointNodes = getLocalChildren(cacheNode, \"pt\")\n .map((pointNode) => {\n const rawIndex = Number(pointNode.getAttribute(\"idx\") ?? Number.NaN);\n return {\n index: Number.isFinite(rawIndex) ? rawIndex : 0,\n value: getFirstLocalChild(pointNode, \"v\")?.textContent ?? \"\"\n };\n })\n .sort((left, right) => left.index - right.index);\n\n if (pointNodes.length === 0) {\n return null;\n }\n\n const maxIndex = pointNodes.reduce((max, point) => Math.max(max, point.index), 0);\n const targetLength = Math.max(\n pointNodes.length,\n Number.isFinite(pointCount ?? Number.NaN) ? Number(pointCount) : 0,\n maxIndex + 1\n );\n const values = Array.from({ length: targetLength }, () => null as number | string | null);\n for (const point of pointNodes) {\n if (mode === \"value\") {\n values[point.index] = cellValueToNumber(point.value);\n } else {\n values[point.index] = point.value.length > 0 ? point.value : null;\n }\n }\n return values;\n}\n\nfunction parseChartMultiLevelCacheValues(\n parentNode: Element | null,\n mode: \"category\" | \"value\"\n): Array<number | string | null> | null {\n if (!parentNode) {\n return null;\n }\n\n const referenceNode = getFirstLocalChild(parentNode, \"multiLvlStrRef\") ?? parentNode;\n const cacheNode = getFirstLocalChild(referenceNode, \"multiLvlStrCache\");\n if (!cacheNode) {\n return null;\n }\n\n const levelNodes = getLocalChildren(cacheNode, \"lvl\");\n if (levelNodes.length === 0) {\n return null;\n }\n\n const pointCount = readChartNumericAttribute(cacheNode, \"ptCount\");\n const primaryLevelNode = mode === \"category\"\n ? levelNodes[levelNodes.length - 1] ?? levelNodes[0]\n : levelNodes[0];\n const pointNodes = getLocalChildren(primaryLevelNode, \"pt\")\n .map((pointNode) => {\n const rawIndex = Number(pointNode.getAttribute(\"idx\") ?? Number.NaN);\n return {\n index: Number.isFinite(rawIndex) ? rawIndex : 0,\n value: getFirstLocalChild(pointNode, \"v\")?.textContent ?? \"\"\n };\n })\n .sort((left, right) => left.index - right.index);\n\n if (pointNodes.length === 0) {\n return null;\n }\n\n const maxIndex = pointNodes.reduce((max, point) => Math.max(max, point.index), 0);\n const targetLength = Math.max(\n pointNodes.length,\n Number.isFinite(pointCount ?? Number.NaN) ? Number(pointCount) : 0,\n maxIndex + 1\n );\n const values = Array.from({ length: targetLength }, () => null as number | string | null);\n for (const point of pointNodes) {\n if (mode === \"value\") {\n values[point.index] = cellValueToNumber(point.value);\n continue;\n }\n values[point.index] = point.value.length > 0 ? point.value : null;\n }\n return values;\n}\n\nfunction applyChartSeriesStyleFromXml(chart: XlsxChart, chartTypeNode: Element, themePalette?: XlsxThemePalette | null) {\n const seriesNodes = getLocalChildren(chartTypeNode, \"ser\");\n chart.series = chart.series.map((series, index) => {\n const seriesNode = seriesNodes[index];\n if (!seriesNode) {\n return series;\n }\n\n const shapeProperties = getFirstLocalChild(seriesNode, \"spPr\");\n const markerNode = getFirstLocalChild(seriesNode, \"marker\");\n const markerShapeProperties = getFirstLocalChild(markerNode ?? chartTypeNode, \"spPr\");\n const lineStyle = resolveChartLineStyle(shapeProperties, themePalette);\n const markerLineStyle = resolveChartLineStyle(markerShapeProperties, themePalette);\n const fillColor = resolveChartFillColor(shapeProperties, themePalette);\n const markerSize = readChartNumericAttribute(markerNode, \"size\");\n const markerSymbolNode = markerNode ? getFirstLocalChild(markerNode, \"symbol\") : null;\n const markerSymbol = markerSymbolNode?.getAttribute(\"val\")\n ?? (markerNode\n || chart.chartType === \"Scatter\"\n || [\"marker\", \"lineMarker\", \"smoothMarker\"].includes(chart.scatterStyle ?? \"\")\n || readChartBooleanAttribute(chartTypeNode, \"marker\") === true\n ? \"auto\"\n : series.markerSymbol);\n const pointStyles = parseChartPointStyles(seriesNode, themePalette);\n const seriesExplosion = readChartNumericAttribute(seriesNode, \"explosion\");\n const invertNegativeStyle = parseInvertNegativeStyle(seriesNode, themePalette);\n const invertIfNegative = readChartBooleanAttribute(seriesNode, \"invertIfNegative\");\n const isScatterChart = (\n chart.chartType === \"Scatter\"\n || chart.chartType === \"ScatterLines\"\n || chart.chartType === \"ScatterSmooth\"\n || chart.chartType === \"Bubble\"\n );\n const cachedCategories = isScatterChart\n ? (\n parseChartCacheValues(getFirstLocalChild(seriesNode, \"xVal\"), \"numCache\", \"value\")\n ?? parseChartMultiLevelCacheValues(getFirstLocalChild(seriesNode, \"xVal\"), \"category\")\n )\n : (\n parseChartCacheValues(getFirstLocalChild(seriesNode, \"cat\"), \"strCache\", \"category\")\n ?? parseChartCacheValues(getFirstLocalChild(seriesNode, \"cat\"), \"numCache\", \"category\")\n ?? parseChartMultiLevelCacheValues(getFirstLocalChild(seriesNode, \"cat\"), \"category\")\n );\n const cachedValues = isScatterChart\n ? parseChartCacheValues(getFirstLocalChild(seriesNode, \"yVal\"), \"numCache\", \"value\")\n : parseChartCacheValues(getFirstLocalChild(seriesNode, \"val\"), \"numCache\", \"value\");\n const cachedBubbleSizes = chart.chartType === \"Bubble\"\n ? parseChartCacheValues(getFirstLocalChild(seriesNode, \"bubbleSize\"), \"numCache\", \"value\")\n : null;\n const existingShapeProperties = series.shapeProperties && typeof series.shapeProperties === \"object\"\n ? series.shapeProperties as Record<string, unknown>\n : null;\n const rawFillColor = typeof existingShapeProperties?.solidFillHex === \"string\"\n ? normalizeHexColor(existingShapeProperties.solidFillHex)\n : null;\n const rawLineColor = typeof existingShapeProperties?.lineColorHex === \"string\"\n ? normalizeHexColor(existingShapeProperties.lineColorHex)\n : null;\n const resolvedLineColor = lineStyle.hidden\n ? undefined\n : rawLineColor ?? lineStyle.color ?? rawFillColor ?? fillColor ?? series.lineColor ?? series.color;\n\n const hasCategoryReference = typeof series.categoriesRef?.formula === \"string\" && series.categoriesRef.formula.length > 0;\n const hasValueReference = typeof series.valuesRef?.formula === \"string\" && series.valuesRef.formula.length > 0;\n const hasBubbleSizeReference = typeof series.bubbleSizeRef?.formula === \"string\" && series.bubbleSizeRef.formula.length > 0;\n\n return {\n ...series,\n bubbleSizes: !hasBubbleSizeReference && cachedBubbleSizes\n ? cachedBubbleSizes.map((value) => (typeof value === \"number\" && Number.isFinite(value) ? value : null))\n : series.bubbleSizes,\n categories: !hasCategoryReference && cachedCategories ? cachedCategories : series.categories,\n color: rawFillColor ?? rawLineColor ?? fillColor ?? lineStyle.color ?? series.color,\n dataPointStyles: pointStyles.length > 0 ? pointStyles : series.dataPointStyles,\n lineColor: resolvedLineColor,\n lineWidthPx: lineStyle.hidden ? undefined : lineStyle.widthPx ?? series.lineWidthPx,\n markerColor: resolveChartFillColor(markerShapeProperties, themePalette)\n ?? rawFillColor\n ?? rawLineColor\n ?? fillColor\n ?? lineStyle.color\n ?? undefined,\n markerLineColor: markerLineStyle.color\n ?? rawLineColor\n ?? rawFillColor\n ?? lineStyle.color\n ?? fillColor\n ?? undefined,\n markerSize: markerSize ?? series.markerSize,\n markerSymbol,\n smooth: readChartBooleanAttribute(seriesNode, \"smooth\") ?? series.smooth,\n invertIfNegative: invertIfNegative ?? series.invertIfNegative,\n shapeProperties: {\n ...series.shapeProperties,\n xmlExplosion: seriesExplosion ?? undefined,\n xmlFillHidden: getFirstLocalChild(shapeProperties, \"noFill\") ? true : undefined,\n xmlFillColor: fillColor ?? undefined,\n xmlLineHidden: lineStyle.hidden ? true : undefined,\n xmlLineColor: lineStyle.color ?? undefined,\n xmlLineWidthPx: lineStyle.widthPx ?? undefined,\n xmlMarkerFillColor: resolveChartFillColor(markerShapeProperties, themePalette) ?? undefined,\n xmlMarkerFillHidden: getFirstLocalChild(markerShapeProperties, \"noFill\") ? true : undefined,\n xmlMarkerLineColor: markerLineStyle.color ?? undefined,\n xmlMarkerLineHidden: markerLineStyle.hidden ? true : undefined,\n xmlNegativeFillColor: invertNegativeStyle.color ?? undefined,\n xmlNegativeLineColor: invertNegativeStyle.lineColor ?? undefined\n },\n negativeColor: invertNegativeStyle.color ?? series.negativeColor,\n negativeLineColor: invertNegativeStyle.lineColor ?? series.negativeLineColor,\n values: !hasValueReference && cachedValues\n ? cachedValues.map((value) => (typeof value === \"number\" && Number.isFinite(value) ? value : null))\n : series.values\n };\n });\n}\n\nfunction applyChartStyleFromXml(\n chart: XlsxChart,\n chartPath: string | undefined,\n archive: Record<string, Uint8Array>,\n themePalette?: XlsxThemePalette | null\n) {\n const chartXml = readArchiveText(archive, chartPath);\n if (!chartXml) {\n return;\n }\n const relationships = chartPath ? readChartRelationships(archive, chartPath) : new Map<string, string>();\n const fallbackPointStylesBySeries = parseFallbackPointStylesFromChartXml(chartXml, themePalette);\n const fallbackSeriesStyles = parseFallbackSeriesStylesFromChartXml(chartXml, themePalette);\n const fallbackBubbleSizesBySeries = parseFallbackBubbleSizesFromChartXml(chartXml);\n const applyFallbackSeriesStyles = () => {\n if (fallbackBubbleSizesBySeries.length > 0) {\n chart.series = chart.series.map((series, seriesIndex) => {\n const fallbackBubbleSizes = fallbackBubbleSizesBySeries[seriesIndex] ?? [];\n if (fallbackBubbleSizes.length === 0) {\n return series;\n }\n\n const currentNumericPointCount = (series.bubbleSizes ?? []).filter(\n (value): value is number => typeof value === \"number\" && Number.isFinite(value)\n ).length;\n const fallbackNumericPointCount = fallbackBubbleSizes.filter(\n (value): value is number => typeof value === \"number\" && Number.isFinite(value)\n ).length;\n\n if (currentNumericPointCount >= fallbackNumericPointCount) {\n return series;\n }\n\n return {\n ...series,\n bubbleSizes: fallbackBubbleSizes\n };\n });\n }\n\n if (fallbackPointStylesBySeries.length > 0) {\n chart.series = chart.series.map((series, seriesIndex) => {\n const fallbackPointStyles = fallbackPointStylesBySeries[seriesIndex] ?? [];\n if (fallbackPointStyles.length === 0) {\n return series;\n }\n\n const existingByIndex = new Map((series.dataPointStyles ?? []).map((entry) => [entry.index, entry]));\n for (const fallbackStyle of fallbackPointStyles) {\n const existing = existingByIndex.get(fallbackStyle.index);\n existingByIndex.set(fallbackStyle.index, {\n color: existing?.color ?? fallbackStyle.color,\n explosion: existing?.explosion ?? fallbackStyle.explosion,\n index: fallbackStyle.index,\n lineColor: existing?.lineColor ?? fallbackStyle.lineColor\n });\n }\n\n return {\n ...series,\n dataPointStyles: Array.from(existingByIndex.values()).sort((left, right) => left.index - right.index)\n };\n });\n }\n\n if (fallbackSeriesStyles.length > 0) {\n chart.series = chart.series.map((series, seriesIndex) => {\n const fallbackStyle = fallbackSeriesStyles[seriesIndex];\n if (!fallbackStyle) {\n return series;\n }\n const fallbackColor = fallbackStyle.color ?? fallbackStyle.lineColor;\n return {\n ...series,\n color: series.color ?? fallbackColor,\n lineColor: series.lineColor ?? fallbackStyle.lineColor ?? fallbackColor,\n markerColor: series.markerColor ?? fallbackColor ?? series.color,\n markerLineColor: series.markerLineColor ?? fallbackStyle.lineColor ?? fallbackColor ?? series.lineColor\n };\n });\n }\n };\n const applyRelationshipStyles = () => {\n chart.chartColorPalette = readChartColorPalette(archive, relationships.get(CHART_COLOR_STYLE_REL_TYPE), themePalette);\n chart.raw = { ...chart.raw, hasCustomChartColorStyle: Boolean(chart.chartColorPalette?.length) };\n const styleAppearance = readChartStyleAppearance(\n archive,\n relationships.get(CHART_STYLE_REL_TYPE),\n themePalette\n );\n chart.axisLabelColor = styleAppearance.axisLabelColor ?? chart.axisLabelColor;\n chart.axisLineColor = styleAppearance.axisLineColor ?? chart.axisLineColor;\n chart.chartAreaBorderColor = styleAppearance.chartAreaBorderColor ?? chart.chartAreaBorderColor;\n chart.chartAreaFillColor = styleAppearance.chartAreaFillColor ?? chart.chartAreaFillColor;\n chart.chartColorPaletteOffset = styleAppearance.paletteOffset ?? chart.chartColorPaletteOffset;\n chart.textColor = styleAppearance.textColor ?? chart.textColor;\n chart.titleColor = styleAppearance.titleColor ?? chart.titleColor;\n return styleAppearance;\n };\n const applyModernChartExStyles = () => {\n const modernPlotAreaNode = chartDocument?.documentElement\n ? getFirstLocalDescendant(chartDocument.documentElement, \"plotArea\")\n : null;\n if (!modernPlotAreaNode) {\n return;\n }\n\n const parseModernBinning = (seriesNode: Element) => {\n const layoutPrNode = getFirstLocalChild(seriesNode, \"layoutPr\");\n const binningNode = layoutPrNode ? getFirstLocalChild(layoutPrNode, \"binning\") : null;\n if (!binningNode) {\n return null;\n }\n const binning: Record<string, unknown> = {};\n for (const attribute of Array.from(binningNode.attributes)) {\n const rawValue = attribute.value;\n const numeric = Number(rawValue);\n binning[attribute.localName || attribute.name] = Number.isFinite(numeric) && rawValue.trim() !== \"\"\n ? numeric\n : rawValue;\n }\n return Object.keys(binning).length > 0 ? binning : {};\n };\n\n const plotAreaShapeProperties = getFirstLocalChild(modernPlotAreaNode, \"spPr\");\n if (plotAreaShapeProperties) {\n const plotAreaFillColor = resolveChartFillColor(plotAreaShapeProperties, themePalette);\n const plotAreaLineStyle = resolveChartLineStyle(plotAreaShapeProperties, themePalette);\n if (plotAreaFillColor) {\n chart.chartAreaFillColor = chart.chartAreaFillColor ?? plotAreaFillColor;\n }\n if (plotAreaLineStyle.color) {\n chart.chartAreaBorderColor = chart.chartAreaBorderColor ?? plotAreaLineStyle.color;\n }\n }\n\n const modernSeriesNodes = getLocalDescendants(modernPlotAreaNode, \"series\");\n if (modernSeriesNodes.length === 0) {\n return;\n }\n\n chart.series = chart.series.map((series, seriesIndex) => {\n const modernSeriesNode = modernSeriesNodes[seriesIndex] ?? null;\n if (!modernSeriesNode) {\n return series;\n }\n const valueColorsNode = getFirstLocalChild(modernSeriesNode, \"valueColors\");\n const valueColors = valueColorsNode\n ? Array.from(valueColorsNode.childNodes)\n .filter((node): node is Element => node.nodeType === Node.ELEMENT_NODE)\n .map((node) => resolveChartColorNode(findFirstChartColorElement(node) ?? node, themePalette))\n .filter((value): value is string => typeof value === \"string\" && value.length > 0)\n : [];\n const nextRaw = valueColors.length > 0\n ? {\n ...(series.raw && typeof series.raw === \"object\" ? series.raw as Record<string, unknown> : {}),\n valueColors\n }\n : series.raw;\n const seriesShapeProperties = getFirstLocalChild(modernSeriesNode, \"spPr\");\n if (!seriesShapeProperties) {\n return nextRaw === series.raw\n ? series\n : {\n ...series,\n raw: nextRaw\n };\n }\n const fillColor = resolveChartFillColor(seriesShapeProperties, themePalette);\n const lineStyle = resolveChartLineStyle(seriesShapeProperties, themePalette);\n const fallbackColor = fillColor ?? lineStyle.color ?? undefined;\n return {\n ...series,\n color: series.color ?? fallbackColor,\n lineColor: series.lineColor ?? lineStyle.color ?? fillColor ?? fallbackColor,\n lineWidthPx: series.lineWidthPx ?? (typeof lineStyle.widthPx === \"number\" ? lineStyle.widthPx : undefined),\n markerColor: series.markerColor ?? fallbackColor ?? series.color,\n markerLineColor: series.markerLineColor ?? lineStyle.color ?? fallbackColor ?? series.lineColor,\n raw: nextRaw\n };\n });\n\n const seriesLayouts = modernSeriesNodes.map((node) => node.getAttribute(\"layoutId\") ?? node.getAttribute(\"layout\"));\n const clusteredColumnIndex = seriesLayouts.findIndex((layout) => layout === \"clusteredColumn\");\n if (clusteredColumnIndex >= 0) {\n const clusteredNode = modernSeriesNodes[clusteredColumnIndex] ?? null;\n const parsedBinning = clusteredNode ? parseModernBinning(clusteredNode) : null;\n if (parsedBinning) {\n const syntheticRawSeries: Record<string, unknown> = {\n layoutId: \"clusteredColumn\",\n layoutPr: {\n binning: parsedBinning\n }\n };\n const hasParetoLine = seriesLayouts.includes(\"paretoLine\");\n const replaceColumnSeries = (series: XlsxChartSeries | null | undefined) => (\n series ? buildChartExHistogramSeries(series, syntheticRawSeries, hasParetoLine) : null\n );\n\n if (chart.typeGroups && chart.typeGroups.length > 0) {\n const nextTypeGroups = chart.typeGroups.map((group) => ({ ...group, series: [...group.series] }));\n const columnGroupIndex = nextTypeGroups.findIndex((group) => group.chartType === \"ColumnClustered\");\n if (columnGroupIndex >= 0) {\n const originalColumnSeries = nextTypeGroups[columnGroupIndex]?.series[0] ?? null;\n const binnedColumnSeries = replaceColumnSeries(originalColumnSeries);\n if (binnedColumnSeries) {\n nextTypeGroups[columnGroupIndex].series = [binnedColumnSeries];\n const lineGroupIndex = nextTypeGroups.findIndex((group) => group.chartType === \"Line\");\n if (lineGroupIndex >= 0 && nextTypeGroups[lineGroupIndex]?.series[0]) {\n const originalLineSeries = nextTypeGroups[lineGroupIndex].series[0];\n const recomputedLine = buildChartExParetoLineSeries(\n binnedColumnSeries,\n {\n text: originalLineSeries.name,\n ...(originalLineSeries.raw && typeof originalLineSeries.raw === \"object\"\n ? originalLineSeries.raw as Record<string, unknown>\n : {})\n },\n 0\n );\n nextTypeGroups[lineGroupIndex].series = [\n {\n ...originalLineSeries,\n categories: recomputedLine.categories,\n categoriesRef: recomputedLine.categoriesRef,\n raw: recomputedLine.raw,\n values: recomputedLine.values\n }\n ];\n chart.series = [binnedColumnSeries, nextTypeGroups[lineGroupIndex].series[0]];\n } else {\n chart.series = [binnedColumnSeries];\n }\n chart.typeGroups = nextTypeGroups;\n }\n } else if (chart.series[0]) {\n const binnedSeries = replaceColumnSeries(chart.series[0]);\n if (binnedSeries) {\n chart.series = [binnedSeries];\n }\n }\n } else if (chart.series[0]) {\n const binnedSeries = replaceColumnSeries(chart.series[0]);\n if (binnedSeries) {\n chart.series = [binnedSeries];\n }\n }\n }\n }\n };\n\n const chartDocument = parseXml(chartXml);\n const chartNode = chartDocument ? getFirstLocalDescendant(chartDocument, \"chart\") : null;\n const plotAreaNode = chartNode ? getFirstLocalChild(chartNode, \"plotArea\") : null;\n const styleIdNode = chartDocument?.documentElement ? getFirstLocalDescendant(chartDocument.documentElement, \"style\") : null;\n const chartTypeNode = findPrimaryChartTypeNode(plotAreaNode);\n\n if (!chartNode || !chartTypeNode) {\n applyRelationshipStyles();\n const fallbackStyleId = readChartNumericAttribute(styleIdNode, \"style\");\n if (typeof fallbackStyleId === \"number\" && Number.isFinite(fallbackStyleId)) {\n chart.chartStyleId = fallbackStyleId;\n }\n applyModernChartExStyles();\n applyFallbackSeriesStyles();\n applyBuiltinChartDefaults(chart, themePalette);\n return;\n }\n const plotArea = plotAreaNode;\n if (!plotArea) {\n applyRelationshipStyles();\n applyFallbackSeriesStyles();\n applyBuiltinChartDefaults(chart, themePalette);\n return;\n }\n\n switch (chartTypeNode.localName) {\n case \"barChart\":\n case \"bar3DChart\": {\n const grouping = getFirstLocalChild(chartTypeNode, \"grouping\")?.getAttribute(\"val\");\n const barDir = getFirstLocalChild(chartTypeNode, \"barDir\")?.getAttribute(\"val\");\n const isHorizontalBar = barDir === \"bar\";\n chart.is3d = chartTypeNode.localName === \"bar3DChart\" ? true : chart.is3d;\n if (grouping === \"percentStacked\") {\n chart.chartType = isHorizontalBar ? \"BarPercentStacked\" : \"ColumnPercentStacked\";\n } else if (grouping === \"stacked\") {\n chart.chartType = isHorizontalBar ? \"BarStacked\" : \"ColumnStacked\";\n } else {\n chart.chartType = isHorizontalBar ? \"BarClustered\" : \"ColumnClustered\";\n }\n break;\n }\n case \"areaChart\":\n case \"area3DChart\": {\n const grouping = getFirstLocalChild(chartTypeNode, \"grouping\")?.getAttribute(\"val\");\n chart.is3d = chartTypeNode.localName === \"area3DChart\" ? true : chart.is3d;\n if (grouping === \"stacked\") {\n chart.chartType = \"AreaStacked\";\n } else if (grouping === \"percentStacked\") {\n chart.chartType = \"AreaPercentStacked\";\n } else {\n chart.chartType = \"Area\";\n }\n break;\n }\n case \"lineChart\":\n case \"line3DChart\": {\n const grouping = getFirstLocalChild(chartTypeNode, \"grouping\")?.getAttribute(\"val\");\n chart.is3d = chartTypeNode.localName === \"line3DChart\" ? true : chart.is3d;\n if (grouping === \"stacked\") {\n chart.chartType = \"LineStacked\";\n } else if (grouping === \"percentStacked\") {\n chart.chartType = \"LinePercentStacked\";\n } else {\n chart.chartType = \"Line\";\n }\n break;\n }\n case \"pieChart\":\n chart.chartType = \"Pie\";\n break;\n case \"pie3DChart\":\n chart.chartType = \"Pie3D\";\n chart.is3d = true;\n break;\n case \"doughnutChart\":\n chart.chartType = \"Doughnut\";\n break;\n case \"ofPieChart\":\n chart.chartType = \"BarOfPie\";\n break;\n case \"scatterChart\":\n chart.chartType = resolveScatterChartType(getFirstLocalChild(chartTypeNode, \"scatterStyle\")?.getAttribute(\"val\"));\n break;\n case \"radarChart\":\n chart.chartType = \"Radar\";\n break;\n case \"surfaceChart\":\n chart.chartType = \"Surface\";\n chart.is3d = false;\n break;\n case \"surface3DChart\":\n chart.chartType = \"Surface\";\n chart.is3d = true;\n break;\n case \"stockChart\":\n chart.chartType = \"Stock\";\n break;\n case \"bubbleChart\":\n chart.chartType = \"Bubble\";\n break;\n default:\n break;\n }\n\n const legendNode = getFirstLocalChild(chartNode, \"legend\");\n const legendPosition = legendNode ? getFirstLocalChild(legendNode, \"legendPos\")?.getAttribute(\"val\") ?? undefined : undefined;\n const legendOverlay = legendNode ? getFirstLocalChild(legendNode, \"overlay\")?.getAttribute(\"val\") : undefined;\n\n chart.legend = legendNode ? {\n overlay: legendOverlay === \"1\",\n position: normalizeLegendPosition(legendPosition),\n raw: chart.legend?.raw\n } : chart.legend;\n const plotVisibleOnly = readChartBooleanAttribute(chartNode, \"plotVisOnly\");\n if (plotVisibleOnly !== undefined) {\n chart.plotVisibleOnly = plotVisibleOnly;\n }\n chart.displayBlanksAs = getFirstLocalChild(chartNode, \"dispBlanksAs\")?.getAttribute(\"val\") ?? chart.displayBlanksAs;\n const styleId = Number(styleIdNode?.getAttribute(\"val\") ?? Number.NaN);\n chart.chartStyleId = Number.isFinite(styleId) ? styleId : chart.chartStyleId;\n chart.firstSliceAngle = readChartNumericAttribute(chartTypeNode, \"firstSliceAng\") ?? chart.firstSliceAngle;\n chart.gapWidth = readChartNumericAttribute(chartTypeNode, \"gapWidth\") ?? chart.gapWidth;\n chart.overlap = readChartNumericAttribute(chartTypeNode, \"overlap\") ?? chart.overlap;\n chart.bubbleScale = readChartNumericAttribute(chartTypeNode, \"bubbleScale\") ?? chart.bubbleScale;\n chart.varyColors = readChartBooleanAttribute(chartTypeNode, \"varyColors\") ?? chart.varyColors;\n const bubble3dNode = getFirstLocalChild(chartTypeNode, \"bubble3D\");\n chart.bubble3d = bubble3dNode\n ? bubble3dNode.getAttribute(\"val\") !== \"0\"\n : chart.bubble3d;\n chart.holeSize = readChartNumericAttribute(chartTypeNode, \"holeSize\") ?? chart.holeSize;\n chart.radarStyle = getFirstLocalChild(chartTypeNode, \"radarStyle\")?.getAttribute(\"val\") ?? chart.radarStyle;\n chart.scatterStyle = getFirstLocalChild(chartTypeNode, \"scatterStyle\")?.getAttribute(\"val\") ?? chart.scatterStyle;\n chart.shape3d = getFirstLocalChild(chartTypeNode, \"shape\")?.getAttribute(\"val\") ?? chart.shape3d;\n const wireframeNode = getFirstLocalChild(chartTypeNode, \"wireframe\");\n chart.wireframe = wireframeNode\n ? wireframeNode.getAttribute(\"val\") !== \"0\"\n : chart.wireframe;\n const chartTypeDataLabels = parseChartDataLabelsFromXml(getFirstLocalChild(chartTypeNode, \"dLbls\"));\n const firstSeriesNode = getLocalChildren(chartTypeNode, \"ser\")[0] ?? null;\n const seriesDataLabels = parseChartDataLabelsFromXml(getFirstLocalChild(firstSeriesNode, \"dLbls\"));\n chart.dataLabels = chartTypeDataLabels ?? seriesDataLabels ?? chart.dataLabels;\n const seriesSp3dNode = firstSeriesNode ? getFirstLocalDescendant(firstSeriesNode, \"sp3d\") : null;\n chart.surfaceMaterial = seriesSp3dNode?.getAttribute(\"prstMaterial\") ?? chart.surfaceMaterial;\n const bandFormatsNode = getLocalChildren(chartTypeNode, \"bandFmts\")[0] ?? null;\n const bandFormatNodes = bandFormatsNode ? getLocalChildren(bandFormatsNode, \"bandFmt\") : [];\n const bandFormatColors: Record<number, string> = Object.create(null);\n const bandFormatLineColors: Record<number, string> = Object.create(null);\n const bandFormatLineWidths: Record<number, number> = Object.create(null);\n for (const bandFormatNode of bandFormatNodes) {\n const index = readChartNumericAttribute(bandFormatNode, \"idx\");\n if (index == null || !Number.isInteger(index) || index < 0 || index > 0xffffffff) {\n continue;\n }\n const shapeProperties = getFirstLocalChild(bandFormatNode, \"spPr\");\n const fillColor = getFirstLocalChild(shapeProperties, \"noFill\") ? \"transparent\" : resolveChartFillColor(shapeProperties, themePalette);\n const lineStyle = resolveChartLineStyle(shapeProperties, themePalette);\n const lineColor = lineStyle.hidden ? \"transparent\" : lineStyle.color;\n const lineWidth = Number(getFirstLocalChild(shapeProperties, \"ln\")?.getAttribute(\"w\") ?? Number.NaN);\n if (fillColor) bandFormatColors[index] = fillColor;\n if (lineColor) bandFormatLineColors[index] = lineColor;\n if (Number.isFinite(lineWidth) && lineWidth >= 0) bandFormatLineWidths[index] = lineWidth / EMU_PER_PIXEL;\n }\n\n chart.raw = {\n ...(chart.raw ?? {}),\n bandFormatColors: Object.keys(bandFormatColors).length > 0 ? bandFormatColors : undefined,\n bandFormatLineColors: Object.keys(bandFormatLineColors).length > 0 ? bandFormatLineColors : undefined,\n bandFormatLineWidths: Object.keys(bandFormatLineWidths).length > 0 ? bandFormatLineWidths : undefined,\n date1904: readChartBooleanAttribute(chartDocument?.documentElement ?? null, \"date1904\"),\n titleOverlay: readChartBooleanAttribute(getFirstLocalChild(chartNode, \"title\"), \"overlay\"),\n bubble3d: chart.bubble3d,\n grouping: getFirstLocalChild(chartTypeNode, \"grouping\")?.getAttribute(\"val\") ?? undefined,\n ofPieType: getFirstLocalChild(chartTypeNode, \"ofPieType\")?.getAttribute(\"val\") ?? undefined,\n shape: getFirstLocalChild(chartTypeNode, \"shape\")?.getAttribute(\"val\") ?? undefined,\n secondPieSize: readChartNumericAttribute(chartTypeNode, \"secondPieSize\"),\n scatterStyle: chart.scatterStyle,\n splitPos: readChartNumericAttribute(chartTypeNode, \"splitPos\"),\n splitType: getFirstLocalChild(chartTypeNode, \"splitType\")?.getAttribute(\"val\") ?? undefined,\n xmlChartType: chartTypeNode.localName\n };\n const view3dNode = getFirstLocalDescendant(chartNode, \"view3D\");\n if (view3dNode) {\n chart.view3d = {\n depthPercent: readChartNumericAttribute(view3dNode, \"depthPercent\"),\n heightPercent: readChartNumericAttribute(view3dNode, \"hPercent\"),\n perspective: readChartNumericAttribute(view3dNode, \"perspective\"),\n rAngAx: getFirstLocalChild(view3dNode, \"rAngAx\")?.getAttribute(\"val\") === \"1\",\n rotX: readChartNumericAttribute(view3dNode, \"rotX\"),\n rotY: readChartNumericAttribute(view3dNode, \"rotY\")\n };\n }\n for (const key of [\"floor\", \"sideWall\", \"backWall\"] as const) {\n const wall = readChartWallFromXml(getFirstLocalChild(chartNode, key), themePalette);\n if (wall) {\n chart[key] = wall;\n const defaults = chart.raw?.builtinSurfaceDefaults as Record<string, unknown> | undefined;\n if (defaults) chart.raw = { ...chart.raw, builtinSurfaceDefaults: { ...defaults, [key]: undefined } };\n }\n }\n\n const styleAppearance = applyRelationshipStyles();\n const chartTextTypeface = readChartTextTypeface(getFirstLocalChild(chartNode, \"txPr\"), themePalette);\n const titleTypeface = readChartTextTypeface(getFirstLocalDescendant(chartNode, \"title\"), themePalette);\n chart.fontFamily = chartTextTypeface ?? chart.fontFamily;\n chart.titleFontFamily = titleTypeface ?? chart.titleFontFamily ?? chart.fontFamily;\n\n const chartAreaShapeProperties = chartDocument?.documentElement\n ? getFirstLocalChild(chartDocument.documentElement, \"spPr\")\n : null;\n const plotAreaShapeProperties = getFirstLocalChild(plotArea, \"spPr\");\n const chartAreaNoFill = chartAreaShapeProperties ? getFirstLocalChild(chartAreaShapeProperties, \"noFill\") != null : false;\n const plotAreaNoFill = plotAreaShapeProperties ? getFirstLocalChild(plotAreaShapeProperties, \"noFill\") != null : false;\n chart.raw = {\n ...(chart.raw ?? {}),\n chartAreaNoFill: styleAppearance.chartAreaNoFill === true || chartAreaNoFill,\n plotAreaNoFill,\n plotAreaFillColor: resolveChartFillColor(plotAreaShapeProperties, themePalette) ?? undefined,\n plotAreaLineColor: resolveChartLineStyle(plotAreaShapeProperties, themePalette).color ?? undefined\n };\n if (chartAreaShapeProperties) {\n const chartAreaFillColor = resolveChartFillColor(chartAreaShapeProperties, themePalette);\n if (chartAreaFillColor) {\n chart.chartAreaFillColor = chartAreaFillColor;\n } else if (getFirstLocalChild(chartAreaShapeProperties, \"noFill\")) {\n chart.chartAreaFillColor = \"transparent\";\n }\n const chartAreaLineStyle = resolveChartLineStyle(chartAreaShapeProperties, themePalette);\n if (chartAreaLineStyle.hidden) {\n chart.chartAreaBorderColor = \"transparent\";\n } else if (chartAreaLineStyle.color) {\n chart.chartAreaBorderColor = chartAreaLineStyle.color;\n }\n }\n if (!chart.chartAreaFillColor && (styleAppearance.chartAreaNoFill === true || plotAreaNoFill)) {\n chart.chartAreaFillColor = \"transparent\";\n }\n const categoryAxisNodes = [\n ...getLocalChildren(plotArea, \"catAx\"),\n ...getLocalChildren(plotArea, \"dateAx\")\n ];\n const valueAxisNodes = getLocalChildren(plotArea, \"valAx\");\n const seriesAxisNode = getLocalChildren(plotArea, \"serAx\")[0] ?? null;\n const isScatterLikeChart = (\n chart.chartType === \"Scatter\"\n || chart.chartType === \"ScatterLines\"\n || chart.chartType === \"ScatterSmooth\"\n || chart.chartType === \"Bubble\"\n );\n let categoryAxisNode = categoryAxisNodes[0] ?? null;\n let valueAxisNode = valueAxisNodes[0] ?? null;\n if (!categoryAxisNode && isScatterLikeChart && valueAxisNodes.length >= 2) {\n categoryAxisNode = valueAxisNodes.find((axisNode) => {\n const position = getFirstLocalChild(axisNode, \"axPos\")?.getAttribute(\"val\");\n return position === \"b\" || position === \"t\";\n }) ?? valueAxisNodes[0];\n valueAxisNode = valueAxisNodes.find((axisNode) => {\n const position = getFirstLocalChild(axisNode, \"axPos\")?.getAttribute(\"val\");\n return position === \"l\" || position === \"r\";\n }) ?? valueAxisNodes[1] ?? valueAxisNodes[0];\n }\n chart.categoryAxis = mergeChartAxis(chart.categoryAxis, readChartAxisFromXml(categoryAxisNode, themePalette));\n chart.valueAxis = mergeChartAxis(chart.valueAxis, readChartAxisFromXml(valueAxisNode, themePalette));\n chart.seriesAxis = mergeChartAxis(chart.seriesAxis, readChartAxisFromXml(seriesAxisNode, themePalette));\n chart.axes = chart.axes.length > 0\n ? chart.axes.map((axis, index) => (\n index === 0 && categoryAxisNode\n ? { ...axis, ...readChartAxisFromXml(categoryAxisNode, themePalette) }\n : index === 1 && valueAxisNode\n ? { ...axis, ...readChartAxisFromXml(valueAxisNode, themePalette) }\n : axis\n ))\n : chart.axes;\n if (seriesAxisNode) {\n const seriesAxis = readChartAxisFromXml(seriesAxisNode, themePalette);\n if (seriesAxis && !chart.axes.some((axis) => axis.id != null && axis.id === seriesAxis.id)) {\n chart.axes = [...chart.axes, seriesAxis as XlsxChartAxis];\n }\n }\n\n applyChartSeriesStyleFromXml(chart, chartTypeNode, themePalette);\n applyFallbackSeriesStyles();\n applyBuiltinChartDefaults(chart, themePalette);\n}\n\nfunction normalizeArchivePath(path: string) {\n return path.replace(/^\\/+/, \"\").replace(/\\\\/g, \"/\");\n}\n\nfunction dirname(path: string) {\n const normalized = normalizeArchivePath(path);\n const index = normalized.lastIndexOf(\"/\");\n return index >= 0 ? normalized.slice(0, index) : \"\";\n}\n\nfunction resolveRelationshipPath(basePath: string, target: string) {\n if (!target) {\n return \"\";\n }\n\n const normalizedTarget = target.replace(/\\\\/g, \"/\");\n if (normalizedTarget.startsWith(\"/\")) {\n return normalizeArchivePath(normalizedTarget);\n }\n const normalizedBasePath = normalizeArchivePath(basePath);\n let baseDirectory = dirname(normalizedBasePath);\n if (normalizedBasePath.endsWith(\".rels\")) {\n const relsMarker = \"/_rels/\";\n const relsMarkerIndex = normalizedBasePath.lastIndexOf(relsMarker);\n if (relsMarkerIndex >= 0) {\n const ownerPrefix = normalizedBasePath.slice(0, relsMarkerIndex);\n const relFileName = normalizedBasePath.slice(relsMarkerIndex + relsMarker.length);\n const ownerFileName = relFileName.endsWith(\".rels\")\n ? relFileName.slice(0, -\".rels\".length)\n : relFileName;\n baseDirectory = dirname(`${ownerPrefix}/${ownerFileName}`);\n }\n }\n\n const segments = [...baseDirectory.split(\"/\").filter(Boolean), ...normalizedTarget.split(\"/\").filter(Boolean)];\n const resolved: string[] = [];\n for (const segment of segments) {\n if (segment === \".\") {\n continue;\n }\n if (segment === \"..\") {\n resolved.pop();\n continue;\n }\n resolved.push(segment);\n }\n\n return resolved.join(\"/\");\n}\n\nfunction readArchiveText(archive: Record<string, Uint8Array>, path: string | null | undefined) {\n if (!path) {\n return null;\n }\n\n const entry = archive[normalizeArchivePath(path)];\n return entry ? strFromU8(entry) : null;\n}\n\nfunction parseXml(xml: string) {\n if (typeof DOMParser === \"undefined\") {\n return null;\n }\n\n try {\n return new DOMParser().parseFromString(xml, \"application/xml\");\n } catch {\n return null;\n }\n}\n\nfunction serializeXml(document: XMLDocument) {\n return new XMLSerializer().serializeToString(document);\n}\n\nfunction getLocalChildren(parent: ParentNode | null | undefined, localName: string) {\n return Array.from(parent?.childNodes ?? []).filter(\n (node): node is Element => node.nodeType === Node.ELEMENT_NODE && (node as Element).localName === localName\n );\n}\n\nfunction removeLocalChildren(parent: ParentNode, localName: string) {\n getLocalChildren(parent, localName).forEach((node) => node.parentNode?.removeChild(node));\n}\n\nfunction getLocalDescendants(parent: ParentNode | null | undefined, localName: string) {\n return Array.from((parent as Element | Document | null | undefined)?.getElementsByTagName(\"*\") ?? []).filter(\n (node) => node.localName === localName\n );\n}\n\nfunction getFirstLocalChild(parent: ParentNode | null | undefined, localName: string) {\n return getLocalChildren(parent, localName)[0] ?? null;\n}\n\nfunction getFirstLocalDescendant(parent: ParentNode | null | undefined, localName: string) {\n return getLocalDescendants(parent, localName)[0] ?? null;\n}\n\nfunction ensureChild(parent: Element, localName: string, namespace = parent.namespaceURI ?? CHART_NS, prefix = \"c\") {\n const existing = getFirstLocalChild(parent, localName);\n if (existing) {\n return existing;\n }\n\n const document = parent.ownerDocument;\n const node = document.createElementNS(namespace, `${prefix}:${localName}`);\n parent.appendChild(node);\n return node;\n}\n\nfunction setLeafValue(parent: Element, localName: string, value: string, namespace = parent.namespaceURI ?? CHART_NS, prefix = \"c\") {\n const node = ensureChild(parent, localName, namespace, prefix);\n node.textContent = value;\n return node;\n}\n\nfunction setBooleanValue(parent: Element, localName: string, value: boolean) {\n const node = ensureChild(parent, localName);\n node.setAttribute(\"val\", value ? \"1\" : \"0\");\n return node;\n}\n\nfunction setNumericValue(parent: Element, localName: string, value: number) {\n const node = ensureChild(parent, localName);\n node.setAttribute(\"val\", String(Math.round(value)));\n return node;\n}\n\nfunction unquoteSheetName(value: string) {\n const trimmed = value.trim();\n if (trimmed.startsWith(\"'\") && trimmed.endsWith(\"'\")) {\n return trimmed.slice(1, -1).replace(/''/g, \"'\");\n }\n return trimmed;\n}\n\nfunction splitSheetReference(reference: string) {\n let bangIndex = -1;\n let quoted = false;\n for (let index = 0; index < reference.length; index += 1) {\n const char = reference[index];\n if (char === \"'\") {\n quoted = !quoted;\n } else if (char === \"!\" && !quoted) {\n bangIndex = index;\n break;\n }\n }\n\n if (bangIndex < 0) {\n return null;\n }\n\n return {\n range: reference.slice(bangIndex + 1),\n sheetName: unquoteSheetName(reference.slice(0, bangIndex))\n };\n}\n\nfunction parseA1Cell(reference: string) {\n const match = /^\\$?([A-Z]+)\\$?(\\d+)$/i.exec(reference.trim());\n if (!match) {\n return null;\n }\n\n let col = 0;\n for (const char of match[1].toUpperCase()) {\n col = col * 26 + (char.charCodeAt(0) - 64);\n }\n\n return {\n col: col - 1,\n row: Number(match[2]) - 1\n };\n}\n\nfunction parseA1Range(reference: string) {\n const [startRef, endRef = startRef] = reference.split(\":\");\n const start = parseA1Cell(startRef ?? \"\");\n const end = parseA1Cell(endRef ?? \"\");\n if (!start || !end) {\n return null;\n }\n\n return {\n end: {\n col: Math.max(start.col, end.col),\n row: Math.max(start.row, end.row)\n },\n start: {\n col: Math.min(start.col, end.col),\n row: Math.min(start.row, end.row)\n }\n };\n}\n\nfunction formatA1Column(col: number) {\n let current = col + 1;\n let label = \"\";\n while (current > 0) {\n const remainder = (current - 1) % 26;\n label = String.fromCharCode(65 + remainder) + label;\n current = Math.floor((current - 1) / 26);\n }\n return label;\n}\n\nfunction buildA1RangeFormula(sheetName: string, start: { col: number; row: number }, end: { col: number; row: number }) {\n const escapedSheetName = sheetName.replace(/'/g, \"''\");\n return `'${escapedSheetName}'!$${formatA1Column(start.col)}$${start.row + 1}:$${formatA1Column(end.col)}$${end.row + 1}`;\n}\n\nfunction resolveReferenceSheet(workbook: Workbook, fallbackSheetIndex: number, formula?: string | null) {\n if (!formula) {\n return {\n range: null,\n sheet: workbook.getSheet(fallbackSheetIndex),\n sheetName: workbook.getSheet(fallbackSheetIndex)?.name ?? \"\"\n };\n }\n\n const trimmedFormula = formula.trim();\n if (trimmedFormula.length > 0 && !trimmedFormula.includes(\"!\")) {\n try {\n const namedRange = workbook.getNamedRange(trimmedFormula);\n if (typeof namedRange === \"string\" && namedRange.length > 0 && namedRange !== trimmedFormula) {\n return resolveReferenceSheet(workbook, fallbackSheetIndex, namedRange);\n }\n } catch {\n // Fall back to direct A1 parsing when the workbook has no matching name.\n }\n }\n\n const split = splitSheetReference(trimmedFormula);\n if (!split) {\n return {\n range: parseA1Range(trimmedFormula),\n sheet: workbook.getSheet(fallbackSheetIndex),\n sheetName: workbook.getSheet(fallbackSheetIndex)?.name ?? \"\"\n };\n }\n\n try {\n return {\n range: parseA1Range(split.range),\n sheet: workbook.getSheetByName(split.sheetName),\n sheetName: split.sheetName\n };\n } catch {\n return {\n range: parseA1Range(split.range),\n sheet: workbook.getSheet(fallbackSheetIndex),\n sheetName: workbook.getSheet(fallbackSheetIndex)?.name ?? \"\"\n };\n }\n}\n\nfunction resolveChartReferenceLabel(\n workbook: Workbook,\n fallbackSheetIndex: number,\n reference: XlsxChartReference | null | undefined,\n fallbackLabel: string\n) {\n if (!reference?.formula) {\n return fallbackLabel;\n }\n\n const resolved = resolveReferenceSheet(workbook, fallbackSheetIndex, reference.formula);\n if (!resolved.sheet || !resolved.range) {\n return fallbackLabel;\n }\n\n const { start } = resolved.range;\n if (start.row > 0) {\n const headerDisplay = cellValueToDisplay(\n typeof resolved.sheet.getFormattedValueAt === \"function\"\n ? resolved.sheet.getFormattedValueAt(start.row - 1, start.col)\n : null\n );\n if (headerDisplay.length > 0) {\n return headerDisplay;\n }\n }\n\n const firstDisplay = cellValueToDisplay(\n typeof resolved.sheet.getFormattedValueAt === \"function\"\n ? resolved.sheet.getFormattedValueAt(start.row, start.col)\n : null\n );\n return firstDisplay.length > 0 ? firstDisplay : fallbackLabel;\n}\n\nfunction resolveReferenceRowPaths(\n workbook: Workbook,\n fallbackSheetIndex: number,\n reference: XlsxChartReference | null | undefined\n) {\n if (!reference?.formula) {\n return [] as string[][];\n }\n\n const resolved = resolveReferenceSheet(workbook, fallbackSheetIndex, reference.formula);\n if (!resolved.sheet || !resolved.range) {\n return [];\n }\n\n const rows: string[][] = [];\n for (let row = resolved.range.start.row; row <= resolved.range.end.row; row += 1) {\n const parts: string[] = [];\n for (let col = resolved.range.start.col; col <= resolved.range.end.col; col += 1) {\n const calculated = typeof resolved.sheet.getCalculatedValueAt === \"function\"\n ? resolved.sheet.getCalculatedValueAt(row, col)\n : null;\n const formatted = typeof resolved.sheet.getFormattedValueAt === \"function\"\n ? resolved.sheet.getFormattedValueAt(row, col)\n : calculated;\n const display = cellValueToDisplay(formatted ?? calculated);\n const numeric = cellValueToNumber(calculated ?? formatted);\n const label = display.length > 0 ? display : (numeric != null ? String(numeric) : \"\");\n if (label.length > 0) {\n parts.push(label);\n }\n }\n rows.push(parts);\n }\n return rows;\n}\n\nfunction normalizeChartExLegend(raw: unknown): XlsxChartLegend | null {\n if (!raw || typeof raw !== \"object\") {\n return null;\n }\n\n const legend = raw as Record<string, unknown>;\n const position = typeof legend.position === \"string\"\n ? normalizeLegendPosition(String(legend.position))\n : undefined;\n return {\n overlay: typeof legend.overlay === \"boolean\" ? legend.overlay : undefined,\n position,\n raw: legend\n };\n}\n\nfunction humanizeChartExLayoutLabel(layout: string | undefined) {\n if (!layout) {\n return undefined;\n }\n return layout\n .replace(/([a-z0-9])([A-Z])/g, \"$1 $2\")\n .replace(/[-_]+/g, \" \")\n .trim()\n .replace(/\\b\\w/g, (match) => match.toUpperCase());\n}\n\nfunction normalizeChartExAxis(raw: unknown): XlsxChartAxis | null {\n if (!raw || typeof raw !== \"object\") {\n return null;\n }\n\n const axis = raw as Record<string, unknown>;\n const scaling = axis.scaling && typeof axis.scaling === \"object\"\n ? axis.scaling as Record<string, unknown>\n : null;\n const numberFormat = axis.numberFormat && typeof axis.numberFormat === \"object\"\n ? axis.numberFormat as Record<string, unknown>\n : null;\n\n return {\n delete: typeof axis.hidden === \"boolean\" ? axis.hidden : undefined,\n id: typeof axis.id === \"number\" && Number.isFinite(axis.id) ? axis.id : undefined,\n crossId: typeof axis.crossId === \"number\" && Number.isFinite(axis.crossId) ? axis.crossId : undefined,\n majorGridlines: axis.majorGridlines != null ? true : undefined,\n majorUnit: typeof scaling?.majorUnit === \"number\" ? scaling.majorUnit : undefined,\n max: typeof scaling?.max === \"number\" ? scaling.max : undefined,\n min: typeof scaling?.min === \"number\" ? scaling.min : undefined,\n minorGridlines: axis.minorGridlines != null ? true : undefined,\n minorUnit: typeof scaling?.minorUnit === \"number\" ? scaling.minorUnit : undefined,\n numberFormat: numberFormat\n ? {\n formatCode: typeof numberFormat.formatCode === \"string\" ? numberFormat.formatCode : undefined,\n sourceLinked: typeof numberFormat.sourceLinked === \"boolean\" ? numberFormat.sourceLinked : undefined\n }\n : undefined,\n raw: axis,\n position: typeof axis.position === \"string\" ? axis.position : undefined,\n tickLabelSkip: typeof axis.tickLabelSkip === \"number\" ? axis.tickLabelSkip : undefined,\n tickMarkSkip: typeof axis.tickMarkSkip === \"number\" ? axis.tickMarkSkip : undefined\n };\n}\n\nfunction resolveChartExLayoutChartType(layout: string | undefined) {\n switch (layout) {\n case \"boxWhisker\":\n return \"BoxWhisker\";\n case \"clusteredColumn\":\n return \"ColumnClustered\";\n case \"funnel\":\n return \"Funnel\";\n case \"paretoLine\":\n return \"Line\";\n case \"regionMap\":\n return \"RegionMap\";\n case \"sunburst\":\n return \"Sunburst\";\n case \"treemap\":\n return \"Treemap\";\n case \"waterfall\":\n return \"Waterfall\";\n default:\n return layout ? `Unsupported(cx:${layout})` : \"ColumnClustered\";\n }\n}\n\nfunction resolveChartExSeriesLayout(raw: unknown) {\n if (!raw || typeof raw !== \"object\") {\n return undefined;\n }\n const record = raw as Record<string, unknown>;\n return typeof record.layout === \"string\"\n ? record.layout\n : typeof record.layoutId === \"string\"\n ? record.layoutId\n : undefined;\n}\n\nfunction resolveChartExSeriesAxisIds(raw: unknown) {\n if (!raw || typeof raw !== \"object\") {\n return [];\n }\n const record = raw as Record<string, unknown>;\n if (Array.isArray(record.axisIds)) {\n return record.axisIds.filter((value): value is number => typeof value === \"number\" && Number.isFinite(value));\n }\n if (Array.isArray(record.axisId)) {\n return record.axisId.flatMap((value) => {\n if (typeof value === \"number\" && Number.isFinite(value)) {\n return [value];\n }\n if (value && typeof value === \"object\" && typeof (value as { val?: unknown }).val === \"number\") {\n return [(value as { val: number }).val];\n }\n return [];\n });\n }\n if (typeof record.axisId === \"number\" && Number.isFinite(record.axisId)) {\n return [record.axisId];\n }\n return [];\n}\n\nfunction niceHistogramStep(value: number) {\n if (!Number.isFinite(value) || value <= 0) {\n return 1;\n }\n const exponent = Math.floor(Math.log10(value));\n const scale = 10 ** exponent;\n const normalized = value / scale;\n if (normalized <= 1) {\n return scale;\n }\n if (normalized <= 2) {\n return scale * 2;\n }\n if (normalized <= 5) {\n return scale * 5;\n }\n return scale * 10;\n}\n\nfunction formatHistogramBinLabel(lower: number, upper: number, index: number, closedRight: boolean) {\n const leftBracket = closedRight\n ? (index === 0 ? \"[\" : \"(\")\n : \"[\";\n const rightBracket = closedRight ? \"]\" : \")\";\n return `${leftBracket}${Number(lower.toFixed(6))},${Number(upper.toFixed(6))}${rightBracket}`;\n}\n\ntype ChartExHistogramBin = {\n count: number;\n label: string;\n lower: number;\n upper: number;\n};\n\nfunction buildChartExHistogramBins(values: number[], rawSeries: unknown, sortByFrequency: boolean) {\n if (values.length === 0) {\n return [] as ChartExHistogramBin[];\n }\n\n const rawRecord = rawSeries && typeof rawSeries === \"object\" ? rawSeries as Record<string, unknown> : null;\n const layoutProperties = rawRecord?.layoutProperties && typeof rawRecord.layoutProperties === \"object\"\n ? rawRecord.layoutProperties as Record<string, unknown>\n : null;\n const rawBinning = layoutProperties?.binning && typeof layoutProperties.binning === \"object\"\n ? layoutProperties.binning as Record<string, unknown>\n : null;\n const minValue = Math.min(...values);\n const maxValue = Math.max(...values);\n const explicitWidth = typeof rawBinning?.binSize === \"number\" && Number.isFinite(rawBinning.binSize) && rawBinning.binSize > 0\n ? rawBinning.binSize\n : undefined;\n const explicitCount = typeof rawBinning?.binCount === \"number\" && Number.isFinite(rawBinning.binCount) && rawBinning.binCount > 0\n ? rawBinning.binCount\n : typeof rawBinning?.count === \"number\" && Number.isFinite(rawBinning.count) && rawBinning.count > 0\n ? rawBinning.count\n : undefined;\n const closedRight = rawBinning?.intervalClosed === \"r\" || rawBinning?.intervalClosed === \"right\";\n const mean = values.reduce((sum, value) => sum + value, 0) / values.length;\n const variance = values.reduce((sum, value) => sum + ((value - mean) ** 2), 0) / Math.max(1, values.length);\n const standardDeviation = Math.sqrt(Math.max(0, variance));\n const allIntegers = values.every((value) => Math.abs(value - Math.round(value)) < 1e-9);\n const scottWidth = standardDeviation > 0\n ? (3.49 * standardDeviation) / Math.cbrt(values.length)\n : undefined;\n const fallbackWidth = explicitCount != null\n ? (maxValue - minValue) / Math.max(1, explicitCount)\n : scottWidth ?? ((maxValue - minValue) / Math.max(1, Math.ceil(Math.log2(values.length) + 1)));\n const roughWidth = explicitWidth\n ?? (allIntegers\n ? Math.max(1, Math.ceil(Math.max(fallbackWidth, 1e-6)))\n : niceHistogramStep(Math.max(fallbackWidth, 1e-6)));\n const binWidth = Math.max(roughWidth, 1e-6);\n const start = explicitWidth != null || explicitCount != null\n ? Math.floor(minValue / binWidth) * binWidth\n : minValue;\n const end = Math.max(start + binWidth, start + Math.ceil((maxValue - start) / binWidth) * binWidth);\n const binCount = Math.max(1, Math.ceil((end - start) / binWidth));\n const bins = Array.from({ length: binCount }, (_, index) => {\n const lower = start + binWidth * index;\n const upper = lower + binWidth;\n return {\n count: 0,\n label: formatHistogramBinLabel(lower, upper, index, closedRight),\n lower,\n upper\n } satisfies ChartExHistogramBin;\n });\n\n values.forEach((value) => {\n if (!Number.isFinite(value)) {\n return;\n }\n const offset = (value - start) / binWidth;\n let binIndex = Math.floor(offset);\n if (closedRight && Math.abs(offset - Math.round(offset)) < 1e-9 && value > start) {\n binIndex -= 1;\n }\n if (value >= end) {\n binIndex = bins.length - 1;\n }\n if (value <= start) {\n binIndex = 0;\n }\n const target = bins[Math.max(0, Math.min(bins.length - 1, binIndex))];\n if (target) {\n target.count += 1;\n }\n });\n\n if (sortByFrequency) {\n bins.sort((left, right) => (\n right.count - left.count\n || left.lower - right.lower\n ));\n }\n return bins;\n}\n\nfunction buildChartExHistogramSeries(\n series: XlsxChartSeries,\n rawSeries: unknown,\n sortByFrequency: boolean\n) {\n const layout = resolveChartExSeriesLayout(rawSeries);\n const rawRecord = rawSeries && typeof rawSeries === \"object\" ? rawSeries as Record<string, unknown> : null;\n const hasBinning = Boolean(\n layout === \"clusteredColumn\"\n && rawRecord?.layoutProperties\n && typeof rawRecord.layoutProperties === \"object\"\n && (rawRecord.layoutProperties as Record<string, unknown>).binning != null\n );\n if (!hasBinning) {\n return series;\n }\n\n const numericValues = series.values.filter((value): value is number => typeof value === \"number\" && Number.isFinite(value));\n if (numericValues.length === 0) {\n return series;\n }\n\n const bins = buildChartExHistogramBins(numericValues, rawSeries, sortByFrequency);\n if (bins.length === 0) {\n return series;\n }\n\n return {\n ...series,\n categories: bins.map((bin) => bin.label),\n categoriesRef: null,\n raw: {\n ...series.raw,\n chartExHistogramBins: bins,\n chartExSourceValues: numericValues\n },\n values: bins.map((bin) => bin.count)\n };\n}\n\nfunction buildChartExParetoLineSeries(series: XlsxChartSeries, sourceRaw: unknown, index: number) {\n const counts = series.values.map((value) => (\n typeof value === \"number\" && Number.isFinite(value) ? value : 0\n ));\n const total = counts.reduce((sum, value) => sum + value, 0);\n let running = 0;\n const cumulative = counts.map((value) => {\n running += value;\n return total > 0 ? (running / total) * 100 : 0;\n });\n return {\n ...series,\n color: undefined,\n lineColor: undefined,\n markerColor: undefined,\n markerLineColor: undefined,\n markerSize: 7,\n markerSymbol: \"circle\",\n name: typeof (sourceRaw as { text?: unknown } | null)?.text === \"string\"\n ? (sourceRaw as { text: string }).text\n : \"Pareto\",\n raw: {\n ...(series.raw ?? {}),\n chartExLayout: \"paretoLine\",\n source: sourceRaw && typeof sourceRaw === \"object\" ? sourceRaw as Record<string, unknown> : undefined\n },\n values: cumulative\n };\n}\n\nfunction resolveChartExTextFormula(raw: unknown) {\n if (typeof raw === \"string\" && raw.length > 0) {\n return raw;\n }\n if (!raw || typeof raw !== \"object\") {\n return undefined;\n }\n const record = raw as Record<string, unknown>;\n if (typeof record.formula === \"string\" && record.formula.length > 0) {\n return record.formula;\n }\n if (typeof record.text === \"string\" && record.text.length > 0) {\n return record.text;\n }\n if (typeof record.value === \"string\" && record.value.length > 0) {\n return record.value;\n }\n return undefined;\n}\n\nfunction resolveChartExTitleText(raw: unknown) {\n if (typeof raw === \"string\" && raw.length > 0) {\n return raw;\n }\n if (!raw || typeof raw !== \"object\") {\n return undefined;\n }\n const record = raw as Record<string, unknown>;\n if (typeof record.text === \"string\" && record.text.length > 0) {\n return record.text;\n }\n const nestedText = record.text && typeof record.text === \"object\"\n ? resolveChartExTextFormula(record.text)\n : undefined;\n if (nestedText) {\n return nestedText;\n }\n return typeof record.value === \"string\" && record.value.length > 0 ? record.value : undefined;\n}\n\nfunction resolveChartExFallbackCategoryReference(\n workbook: Workbook,\n fallbackSheetIndex: number,\n valueFormula: string | undefined\n) {\n if (!valueFormula) {\n return null;\n }\n\n const resolved = resolveReferenceSheet(workbook, fallbackSheetIndex, valueFormula);\n if (!resolved.sheet || !resolved.range || resolved.range.start.col <= 0) {\n return null;\n }\n\n return normalizeChartReference({\n formula: buildA1RangeFormula(\n resolved.sheetName,\n {\n col: resolved.range.start.col - 1,\n row: resolved.range.start.row\n },\n {\n col: resolved.range.start.col - 1,\n row: resolved.range.end.row\n }\n )\n });\n}\n\nfunction normalizeChartExSeries(\n workbook: Workbook,\n workbookSheetIndex: number,\n chartId: string,\n raw: unknown,\n dataById: Map<number, Record<string, unknown>>,\n index: number,\n chartType?: XlsxChart[\"chartType\"]\n): XlsxChartSeries {\n const series = raw && typeof raw === \"object\" ? raw as Record<string, unknown> : {};\n const dataId = typeof series.dataId === \"number\" ? series.dataId : null;\n const dataEntry = dataId != null ? dataById.get(dataId) ?? null : null;\n const dimensions = Array.isArray(dataEntry?.dimensions)\n ? dataEntry.dimensions.filter((value): value is Record<string, unknown> => Boolean(value && typeof value === \"object\"))\n : [];\n const categoryDimension = dimensions.find((dimension) => dimension.dimType === \"cat\")\n ?? dimensions.find((dimension) => dimension.dimType === \"name\")\n ?? null;\n const valueDimension = dimensions.find((dimension) => (\n dimension.dimType === \"val\"\n || dimension.dimType === \"y\"\n || dimension.dimType === \"colorVal\"\n || dimension.dimType === \"size\"\n ))\n ?? dimensions.find((dimension) => dimension !== categoryDimension)\n ?? categoryDimension;\n const categoryDimensionFormula = typeof categoryDimension?.formula === \"string\" ? categoryDimension.formula : undefined;\n const valueDimensionFormula = typeof valueDimension?.formula === \"string\" ? valueDimension.formula : undefined;\n const fallbackCategoryRef = (\n (chartType === \"Sunburst\" || chartType === \"Treemap\")\n && !categoryDimension\n && typeof valueDimensionFormula === \"string\"\n )\n ? resolveChartExFallbackCategoryReference(workbook, workbookSheetIndex, valueDimensionFormula)\n : null;\n const categoriesRef = categoryDimension\n ? normalizeChartReference({\n formula: categoryDimensionFormula\n })\n : fallbackCategoryRef;\n const valuesRef = valueDimension\n ? normalizeChartReference({\n formula: valueDimensionFormula\n })\n : null;\n const isCategoricalMap = chartType === \"RegionMap\" && valueDimension?.dimType === \"colorStr\";\n const resolvedValueCells = resolveReferenceValues(workbook, workbookSheetIndex, valuesRef, isCategoricalMap ? \"category\" : \"value\");\n const values = resolvedValueCells.map((value) => (\n typeof value === \"number\" && Number.isFinite(value) ? value : null\n ));\n const colorStrings = isCategoricalMap\n ? resolvedValueCells.map((value) => {\n if (typeof value === \"string\") {\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : null;\n }\n if (typeof value === \"number\" && Number.isFinite(value)) {\n return String(value);\n }\n return null;\n })\n : [];\n const categoryRows = chartType === \"RegionMap\"\n ? resolveReferenceRowPaths(workbook, workbookSheetIndex, categoriesRef)\n : [];\n const categories = categoryRows.length === resolvedValueCells.length && categoryRows.length > 0\n ? categoryRows.map((parts) => parts[0] ?? \"\")\n : resolveReferenceValues(workbook, workbookSheetIndex, categoriesRef, \"category\");\n const hierarchyCategories = (\n chartType === \"Sunburst\" || chartType === \"Treemap\"\n )\n ? resolveReferenceRowPaths(workbook, workbookSheetIndex, categoriesRef)\n : [];\n const seriesTextFormula = resolveChartExTextFormula(series.text);\n const shapeProperties = series.shapeProperties && typeof series.shapeProperties === \"object\"\n ? series.shapeProperties as Record<string, unknown>\n : undefined;\n const rawFillColor = typeof shapeProperties?.solidFillHex === \"string\"\n ? normalizeHexColor(shapeProperties.solidFillHex)\n : null;\n const rawLineColor = typeof shapeProperties?.lineColorHex === \"string\"\n ? normalizeHexColor(shapeProperties.lineColorHex)\n : null;\n\n return {\n bubbleSizeRef: null,\n bubbleSizes: [],\n categories,\n categoriesRef,\n color: rawFillColor ?? undefined,\n dataPoints: Array.isArray(series.dataPoints) ? series.dataPoints : [],\n dataPointStyles: undefined,\n formatIdx: typeof series.formatIdx === \"number\" ? series.formatIdx : undefined,\n hidden: typeof series.hidden === \"boolean\" ? series.hidden : undefined,\n id: `${chartId}-series-${index}`,\n invertIfNegative: undefined,\n lineColor: rawLineColor ?? rawFillColor ?? undefined,\n lineWidthPx: typeof shapeProperties?.lineWidth === \"number\"\n ? Math.max(1, Number(shapeProperties.lineWidth) / EMU_PER_PIXEL)\n : undefined,\n marker: undefined,\n markerColor: rawFillColor ?? undefined,\n markerLineColor: rawLineColor ?? rawFillColor ?? undefined,\n markerSize: undefined,\n markerSymbol: undefined,\n name: typeof series.text === \"string\"\n ? series.text\n : seriesTextFormula\n ? resolveSeriesName(workbook, workbookSheetIndex, seriesTextFormula)\n : resolveChartReferenceLabel(workbook, workbookSheetIndex, valuesRef, `Series ${index + 1}`),\n negativeColor: undefined,\n negativeLineColor: undefined,\n raw: {\n ...series,\n chartExColorStrings: colorStrings,\n chartExHierarchyCategories: hierarchyCategories,\n data: dataEntry,\n dimType: typeof valueDimension?.dimType === \"string\" ? valueDimension.dimType : undefined\n },\n shapeProperties,\n smooth: undefined,\n values,\n valuesRef\n };\n}\n\nfunction collapseChartExPointSeries(chartType: XlsxChart[\"chartType\"], series: XlsxChartSeries[]) {\n if (chartType !== \"Funnel\" && chartType !== \"Waterfall\") {\n if (\n (chartType === \"Sunburst\" || chartType === \"Treemap\")\n && series.length > 1\n && series.every((entry) => {\n const raw = entry.raw && typeof entry.raw === \"object\" ? entry.raw as Record<string, unknown> : null;\n return raw?.dimType === \"size\";\n })\n ) {\n const primarySeries = series.find((entry) => entry.hidden !== true) ?? series[0] ?? null;\n if (!primarySeries) {\n return series;\n }\n return [\n {\n ...primarySeries,\n dataPoints: [],\n hidden: false\n }\n ];\n }\n return series;\n }\n\n const primarySeries = series.find((entry) => entry.hidden !== true) ?? series[0] ?? null;\n if (!primarySeries) {\n return series;\n }\n\n return [\n {\n ...primarySeries,\n categories: [],\n categoriesRef: null,\n dataPoints: [],\n hidden: false\n }\n ];\n}\n\nfunction normalizeChartExChart(\n workbook: Workbook,\n workbookSheetIndex: number,\n visibleSheetIndex: number,\n raw: unknown,\n index: number,\n themePalette?: XlsxThemePalette | null\n): XlsxChart {\n const drawing = raw && typeof raw === \"object\" ? raw as Record<string, unknown> : {};\n const chart = drawing.chartEx && typeof drawing.chartEx === \"object\"\n ? drawing.chartEx as Record<string, unknown>\n : {};\n const plotArea = chart.plotArea && typeof chart.plotArea === \"object\"\n ? chart.plotArea as Record<string, unknown>\n : {};\n const rawSeries = Array.isArray(plotArea.series) ? plotArea.series : [];\n const seriesLayouts = rawSeries.map(resolveChartExSeriesLayout);\n const dataEntries = Array.isArray(chart.data) ? chart.data : [];\n const dataById = new Map<number, Record<string, unknown>>();\n dataEntries.forEach((entry) => {\n if (!entry || typeof entry !== \"object\") {\n return;\n }\n const record = entry as Record<string, unknown>;\n if (typeof record.id === \"number\") {\n dataById.set(record.id, record);\n }\n });\n const axes = Array.isArray(plotArea.axes)\n ? plotArea.axes.map(normalizeChartExAxis).filter((value): value is XlsxChartAxis => Boolean(value))\n : [];\n const primaryLayout = typeof chart.layout === \"string\"\n ? chart.layout\n : seriesLayouts.find((value): value is string => typeof value === \"string\" && value.length > 0);\n const fallbackTitle = humanizeChartExLayoutLabel(primaryLayout);\n const chartTitle = resolveChartExTitleText(chart.title) ?? (chart.title != null ? \"Chart Title\" : fallbackTitle);\n const chartType = resolveChartExLayoutChartType(primaryLayout);\n const normalizedSeries = rawSeries.map((entry, seriesIndex) => (\n normalizeChartExSeries(workbook, workbookSheetIndex, `chart-ex-${workbookSheetIndex}-${index}`, entry, dataById, seriesIndex, chartType)\n ));\n const clusteredColumnSeriesIndex = seriesLayouts.findIndex((layout) => layout === \"clusteredColumn\");\n const hasParetoLine = seriesLayouts.includes(\"paretoLine\");\n const clusteredColumnAxisIds = clusteredColumnSeriesIndex >= 0\n ? resolveChartExSeriesAxisIds(rawSeries[clusteredColumnSeriesIndex])\n : [];\n const paretoLineSeriesIndex = seriesLayouts.findIndex((layout) => layout === \"paretoLine\");\n const paretoLineAxisIds = paretoLineSeriesIndex >= 0\n ? resolveChartExSeriesAxisIds(rawSeries[paretoLineSeriesIndex])\n : [];\n const primaryHistogramSeries = clusteredColumnSeriesIndex >= 0\n ? buildChartExHistogramSeries(normalizedSeries[clusteredColumnSeriesIndex] ?? normalizedSeries[0], rawSeries[clusteredColumnSeriesIndex], hasParetoLine)\n : null;\n const synthesizedParetoSeries = (\n hasParetoLine\n && primaryHistogramSeries\n && primaryHistogramSeries.values.length > 0\n )\n ? buildChartExParetoLineSeries(primaryHistogramSeries, rawSeries[paretoLineSeriesIndex], paretoLineSeriesIndex)\n : null;\n const resolvedSeries = synthesizedParetoSeries\n ? [primaryHistogramSeries!, synthesizedParetoSeries]\n : primaryHistogramSeries\n ? [\n primaryHistogramSeries,\n ...normalizedSeries.filter((_, seriesIndex) => seriesIndex !== clusteredColumnSeriesIndex)\n ]\n : collapseChartExPointSeries(chartType, normalizedSeries);\n const resolvedChartType = primaryHistogramSeries ? \"ColumnClustered\" : chartType;\n const resolvedGapWidth = primaryHistogramSeries ? 0 : undefined;\n const typeGroups = synthesizedParetoSeries\n ? [\n {\n axisIds: clusteredColumnAxisIds,\n chartType: \"ColumnClustered\",\n gapWidth: 0,\n raw: {\n gapWidth: 0,\n layout: \"clusteredColumn\"\n },\n series: [primaryHistogramSeries!]\n },\n {\n axisIds: paretoLineAxisIds,\n chartType: \"Line\",\n raw: {\n layout: \"paretoLine\"\n },\n series: [synthesizedParetoSeries]\n }\n ]\n : [];\n const normalizedChart: XlsxChart = {\n anchor: normalizeChartAnchor(drawing.anchor),\n autoTitleDeleted: undefined,\n axes,\n axisLabelColor: undefined,\n axisLineColor: undefined,\n categoryAxis: axes[0] ?? null,\n chartAreaBorderColor: undefined,\n chartAreaFillColor: undefined,\n chartColorPalette: undefined,\n chartColorPaletteOffset: undefined,\n chartExLayout: primaryLayout,\n chartPath: undefined,\n chartStyleId: undefined,\n chartType: resolvedChartType,\n dataLabels: rawSeries.length > 0 && rawSeries[0] && typeof rawSeries[0] === \"object\"\n ? normalizeChartDataLabels((rawSeries[0] as Record<string, unknown>).dataLabels)\n : null,\n displayBlanksAs: undefined,\n editable: true,\n firstSliceAngle: undefined,\n fontFamily: undefined,\n gapWidth: resolvedGapWidth,\n holeSize: undefined,\n id: `chart-ex-${workbookSheetIndex}-${index}`,\n is3d: undefined,\n legend: normalizeChartExLegend(chart.legend),\n name: typeof drawing.name === \"string\" ? drawing.name : chartTitle,\n overlap: undefined,\n plotVisibleOnly: undefined,\n raw: chart,\n radarStyle: undefined,\n scatterStyle: undefined,\n roundedCorners: undefined,\n shape3d: undefined,\n seriesAxis: null,\n series: resolvedSeries,\n sheetIndex: visibleSheetIndex,\n showDlblsOverMax: undefined,\n sideWall: null,\n backWall: null,\n bubbleScale: undefined,\n bubble3d: undefined,\n floor: null,\n surfaceMaterial: undefined,\n textColor: undefined,\n title: chartTitle,\n titleColor: undefined,\n titleFontFamily: undefined,\n typeGroups,\n valueAxis: axes.find((axis) => axis.numberFormat || axis.majorGridlines) ?? axes[1] ?? null,\n varyColors: typeof chart.valueColors === \"boolean\" ? chart.valueColors : undefined,\n view3d: undefined,\n wireframe: undefined,\n workbookSheetIndex,\n zIndex: Array.isArray(drawing.drawingPath) && typeof drawing.drawingPath[0] === \"number\"\n ? drawing.drawingPath[0] + 1\n : index + 1\n };\n\n applyBuiltinChartDefaults(normalizedChart, themePalette);\n return normalizedChart;\n}\n\nfunction cellValueToNumber(value: unknown) {\n if (typeof value === \"number\" && Number.isFinite(value)) {\n return value;\n }\n if (value && typeof value === \"object\") {\n if ((value as { is_empty?: boolean }).is_empty) {\n return null;\n }\n const candidates: unknown[] = [];\n if (typeof (value as { asNumber?: () => unknown }).asNumber === \"function\") {\n candidates.push((value as { asNumber: () => unknown }).asNumber());\n }\n if (typeof (value as { toJs?: () => unknown }).toJs === \"function\") {\n candidates.push((value as { toJs: () => unknown }).toJs());\n }\n if (typeof (value as { asText?: () => unknown }).asText === \"function\") {\n candidates.push((value as { asText: () => unknown }).asText());\n }\n if (typeof (value as { toString?: () => unknown }).toString === \"function\") {\n candidates.push((value as { toString: () => unknown }).toString());\n }\n\n for (const candidate of candidates) {\n if (typeof candidate === \"number\" && Number.isFinite(candidate)) {\n return candidate;\n }\n if (typeof candidate === \"string\") {\n const parsed = Number(candidate.replace(/,/g, \"\"));\n if (Number.isFinite(parsed)) {\n return parsed;\n }\n }\n }\n }\n if (typeof value === \"string\") {\n const parsed = Number(value.replace(/,/g, \"\"));\n return Number.isFinite(parsed) ? parsed : null;\n }\n return null;\n}\n\nfunction cellValueToDisplay(value: unknown) {\n if (value === null || value === undefined) {\n return \"\";\n }\n if (typeof value === \"string\") {\n return value;\n }\n if (typeof value === \"number\" || typeof value === \"boolean\") {\n return String(value);\n }\n if (value && typeof value === \"object\") {\n if ((value as { is_empty?: boolean }).is_empty) {\n return \"\";\n }\n const candidates: unknown[] = [];\n if (typeof (value as { asText?: () => unknown }).asText === \"function\") {\n candidates.push((value as { asText: () => unknown }).asText());\n }\n if (typeof (value as { toJs?: () => unknown }).toJs === \"function\") {\n candidates.push((value as { toJs: () => unknown }).toJs());\n }\n if (typeof (value as { toString?: () => unknown }).toString === \"function\") {\n candidates.push((value as { toString: () => unknown }).toString());\n }\n\n for (const candidate of candidates) {\n if (candidate === null || candidate === undefined) {\n continue;\n }\n if (typeof candidate === \"string\") {\n return candidate;\n }\n return String(candidate);\n }\n }\n return String(value);\n}\n\nfunction resolveReferenceValues(\n workbook: Workbook,\n fallbackSheetIndex: number,\n reference: XlsxChartReference | null | undefined,\n mode: \"category\" | \"value\"\n): Array<number | string | null> {\n if (!reference?.formula) {\n return reference?.values ?? [];\n }\n\n const resolved = resolveReferenceSheet(workbook, fallbackSheetIndex, reference.formula);\n if (!resolved.sheet || !resolved.range) {\n return reference.values ?? [];\n }\n\n const values: Array<number | string | null> = [];\n for (let row = resolved.range.start.row; row <= resolved.range.end.row; row += 1) {\n for (let col = resolved.range.start.col; col <= resolved.range.end.col; col += 1) {\n const calculated = typeof resolved.sheet.getCalculatedValueAt === \"function\"\n ? resolved.sheet.getCalculatedValueAt(row, col)\n : null;\n const formatted = typeof resolved.sheet.getFormattedValueAt === \"function\"\n ? resolved.sheet.getFormattedValueAt(row, col)\n : calculated;\n if (mode === \"value\") {\n values.push(cellValueToNumber(calculated ?? formatted));\n } else {\n const display = cellValueToDisplay(formatted ?? calculated);\n const numeric = cellValueToNumber(calculated ?? formatted);\n values.push(display.length > 0 ? display : (numeric !== null ? numeric : null));\n }\n }\n }\n\n return values;\n}\n\nfunction resolveSeriesName(workbook: Workbook, fallbackSheetIndex: number, rawName: unknown) {\n if (typeof rawName !== \"string\" || !rawName) {\n return undefined;\n }\n\n const resolved = resolveReferenceSheet(workbook, fallbackSheetIndex, rawName);\n if (!resolved.sheet || !resolved.range) {\n return rawName;\n }\n\n const value = typeof resolved.sheet.getFormattedValueAt === \"function\"\n ? resolved.sheet.getFormattedValueAt(resolved.range.start.row, resolved.range.start.col)\n : null;\n const display = cellValueToDisplay(value);\n return display || rawName;\n}\n\nfunction normalizeChartReference(raw: unknown): XlsxChartReference | null {\n if (!raw || typeof raw !== \"object\") {\n return null;\n }\n\n const record = raw as Record<string, unknown>;\n const values = Array.isArray(record.numbers)\n ? record.numbers\n : Array.isArray(record.strings)\n ? record.strings\n : undefined;\n return {\n formula: typeof record.formula === \"string\" ? record.formula : undefined,\n refType: typeof record.refType === \"string\" ? record.refType : undefined,\n values: values as Array<number | string | null> | undefined\n };\n}\n\nfunction normalizeChartAxis(raw: unknown): XlsxChartAxis | null {\n if (!raw || typeof raw !== \"object\") {\n return null;\n }\n\n const rawAxis = raw as Record<string, unknown>;\n const axis = rawAxis.axis && typeof rawAxis.axis === \"object\"\n ? rawAxis.axis as Record<string, unknown>\n : rawAxis;\n const numberFormat = axis.numberFormat && typeof axis.numberFormat === \"object\"\n ? axis.numberFormat as Record<string, unknown>\n : null;\n\n return {\n crossId: typeof rawAxis.crossId === \"number\" && Number.isFinite(rawAxis.crossId) ? rawAxis.crossId : undefined,\n crosses: typeof axis.crosses === \"string\" ? axis.crosses : undefined,\n crossBetween: typeof axis.crossBetween === \"string\" ? axis.crossBetween : undefined,\n delete: typeof axis.delete === \"boolean\" ? axis.delete : undefined,\n id: typeof rawAxis.id === \"number\" && Number.isFinite(rawAxis.id) ? rawAxis.id : undefined,\n labelPosition: typeof axis.labelPosition === \"string\" ? axis.labelPosition : undefined,\n logBase: typeof axis.logBase === \"number\" ? axis.logBase : undefined,\n orientation: typeof axis.orientation === \"string\" ? axis.orientation : undefined,\n majorUnit: typeof axis.majorUnit === \"number\" ? axis.majorUnit : undefined,\n max: typeof axis.maximum === \"number\" ? axis.maximum : undefined,\n min: typeof axis.minimum === \"number\" ? axis.minimum : undefined,\n majorGridlines: typeof axis.majorGridlines === \"boolean\" ? axis.majorGridlines : undefined,\n majorTickMark: typeof axis.majorTickMark === \"string\" ? axis.majorTickMark : undefined,\n minorUnit: typeof axis.minorUnit === \"number\" ? axis.minorUnit : undefined,\n minorGridlines: typeof axis.minorGridlines === \"boolean\" ? axis.minorGridlines : undefined,\n minorTickMark: typeof axis.minorTickMark === \"string\" ? axis.minorTickMark : undefined,\n numberFormat: numberFormat ? {\n formatCode: typeof numberFormat.formatCode === \"string\" ? numberFormat.formatCode : undefined,\n sourceLinked: typeof numberFormat.sourceLinked === \"boolean\" ? numberFormat.sourceLinked : undefined\n } : undefined,\n position: typeof axis.position === \"string\" ? axis.position : undefined,\n raw: axis,\n shapeProperties: axis.shapeProperties && typeof axis.shapeProperties === \"object\"\n ? axis.shapeProperties as Record<string, unknown>\n : undefined,\n tickLabelSkip: typeof axis.tickLabelSkip === \"number\" && Number.isFinite(axis.tickLabelSkip) ? axis.tickLabelSkip : undefined,\n tickMarkSkip: typeof axis.tickMarkSkip === \"number\" && Number.isFinite(axis.tickMarkSkip) ? axis.tickMarkSkip : undefined\n };\n}\n\nfunction mergeChartAxis(target: XlsxChartAxis | null | undefined, patch: Partial<XlsxChartAxis> | null | undefined) {\n if (!patch) {\n return target ?? null;\n }\n return {\n ...(target ?? {}),\n ...patch\n };\n}\n\nfunction readChartAxisFromXml(axisNode: Element | null, themePalette?: XlsxThemePalette | null): Partial<XlsxChartAxis> | null {\n if (!axisNode) {\n return null;\n }\n\n const numFmt = getFirstLocalChild(axisNode, \"numFmt\");\n const scalingNode = getFirstLocalChild(axisNode, \"scaling\");\n return {\n crossId: readChartNumericAttribute(axisNode, \"crossAx\"),\n crosses: getFirstLocalChild(axisNode, \"crosses\")?.getAttribute(\"val\") ?? undefined,\n crossBetween: getFirstLocalChild(axisNode, \"crossBetween\")?.getAttribute(\"val\") ?? undefined,\n delete: getFirstLocalChild(axisNode, \"delete\")?.getAttribute(\"val\") === \"1\"\n ? true\n : getFirstLocalChild(axisNode, \"delete\")?.getAttribute(\"val\") === \"0\"\n ? false\n : undefined,\n id: readChartNumericAttribute(axisNode, \"axId\"),\n labelPosition: getFirstLocalChild(axisNode, \"tickLblPos\")?.getAttribute(\"val\") ?? undefined,\n logBase: readChartNumericAttribute(getFirstLocalChild(axisNode, \"scaling\"), \"logBase\"),\n orientation: getFirstLocalChild(scalingNode ?? axisNode, \"orientation\")?.getAttribute(\"val\") ?? undefined,\n majorGridlines: Boolean(getFirstLocalChild(axisNode, \"majorGridlines\")),\n majorGridlineColor: (() => {\n const style = resolveChartLineStyle(getFirstLocalChild(getFirstLocalChild(axisNode, \"majorGridlines\"), \"spPr\"), themePalette);\n return style.hidden ? \"transparent\" : style.color ?? undefined;\n })(),\n majorTickMark: getFirstLocalChild(axisNode, \"majorTickMark\")?.getAttribute(\"val\") ?? undefined,\n majorUnit: readChartNumericAttribute(axisNode, \"majorUnit\"),\n max: readChartNumericAttribute(scalingNode, \"max\"),\n min: readChartNumericAttribute(scalingNode, \"min\"),\n minorGridlines: Boolean(getFirstLocalChild(axisNode, \"minorGridlines\")),\n minorTickMark: getFirstLocalChild(axisNode, \"minorTickMark\")?.getAttribute(\"val\") ?? undefined,\n minorUnit: readChartNumericAttribute(axisNode, \"minorUnit\"),\n numberFormat: numFmt\n ? {\n formatCode: numFmt.getAttribute(\"formatCode\") ?? undefined,\n sourceLinked: numFmt.getAttribute(\"sourceLinked\") === \"1\"\n ? true\n : numFmt.getAttribute(\"sourceLinked\") === \"0\"\n ? false\n : undefined\n }\n : undefined,\n position: getFirstLocalChild(axisNode, \"axPos\")?.getAttribute(\"val\") ?? undefined,\n tickLabelSkip: readChartNumericAttribute(axisNode, \"tickLblSkip\"),\n tickMarkSkip: readChartNumericAttribute(axisNode, \"tickMarkSkip\")\n };\n}\n\nfunction readChartWallFromXml(wallNode: Element | null, themePalette?: XlsxThemePalette | null): XlsxChartWall | null {\n if (!wallNode) {\n return null;\n }\n const shapeProperties = getFirstLocalChild(wallNode, \"spPr\");\n const lineStyle = resolveChartLineStyle(shapeProperties, themePalette);\n return {\n fillColor: resolveChartFillColor(shapeProperties, themePalette) ?? undefined,\n hidden: shapeProperties ? getFirstLocalChild(shapeProperties, \"noFill\") != null : undefined,\n lineColor: lineStyle.color ?? undefined,\n thickness: readChartNumericAttribute(wallNode, \"thickness\")\n };\n}\n\nfunction normalizeChartDataLabels(raw: unknown): XlsxChartDataLabels | null {\n if (!raw || typeof raw !== \"object\") {\n return null;\n }\n\n const labels = raw as Record<string, unknown>;\n const pointLabels = Array.isArray(labels.pointLabels)\n ? (() => {\n const normalized: XlsxChartPointDataLabel[] = [];\n for (const entry of labels.pointLabels) {\n if (!entry || typeof entry !== \"object\") {\n continue;\n }\n const point = entry as Record<string, unknown>;\n const index = typeof point.index === \"number\" && Number.isFinite(point.index)\n ? point.index\n : null;\n if (index == null) {\n continue;\n }\n\n const nextPoint: XlsxChartPointDataLabel = { index };\n if (typeof point.deleted === \"boolean\") {\n nextPoint.deleted = point.deleted;\n }\n if (typeof point.fontSizePt === \"number\" && Number.isFinite(point.fontSizePt)) {\n nextPoint.fontSizePt = point.fontSizePt;\n }\n if (typeof point.showBubbleSize === \"boolean\") {\n nextPoint.showBubbleSize = point.showBubbleSize;\n }\n if (typeof point.showCategoryName === \"boolean\") {\n nextPoint.showCategoryName = point.showCategoryName;\n }\n if (typeof point.showPercent === \"boolean\") {\n nextPoint.showPercent = point.showPercent;\n }\n if (typeof point.showSeriesName === \"boolean\") {\n nextPoint.showSeriesName = point.showSeriesName;\n }\n if (typeof point.showValue === \"boolean\") {\n nextPoint.showValue = point.showValue;\n }\n if (typeof point.x === \"number\" && Number.isFinite(point.x)) {\n nextPoint.x = point.x;\n }\n if (typeof point.y === \"number\" && Number.isFinite(point.y)) {\n nextPoint.y = point.y;\n }\n normalized.push(nextPoint);\n }\n return normalized;\n })()\n : undefined;\n return {\n pointLabels: pointLabels && pointLabels.length > 0 ? pointLabels : undefined,\n raw: labels,\n showBubbleSize: typeof labels.showBubbleSize === \"boolean\" ? labels.showBubbleSize : undefined,\n showCategoryName: typeof (labels.showCategoryName ?? labels.visibilityCategoryName) === \"boolean\"\n ? Boolean(labels.showCategoryName ?? labels.visibilityCategoryName)\n : undefined,\n showLegendKey: typeof labels.showLegendKey === \"boolean\" ? labels.showLegendKey : undefined,\n showPercent: typeof labels.showPercent === \"boolean\" ? labels.showPercent : undefined,\n showSeriesName: typeof (labels.showSeriesName ?? labels.visibilitySeriesName) === \"boolean\"\n ? Boolean(labels.showSeriesName ?? labels.visibilitySeriesName)\n : undefined,\n showValue: typeof (labels.showValue ?? labels.visibilityValue) === \"boolean\"\n ? Boolean(labels.showValue ?? labels.visibilityValue)\n : undefined\n };\n}\n\nfunction normalizeChartAnchor(raw: unknown): XlsxImageAnchor {\n if (!raw || typeof raw !== \"object\") {\n return {\n kind: \"two-cell\",\n from: { col: 0, colOffsetEmu: 0, row: 0, rowOffsetEmu: 0 },\n to: { col: 8, colOffsetEmu: 0, row: 15, rowOffsetEmu: 0 }\n };\n }\n\n const anchor = raw as Record<string, unknown>;\n const from = anchor.from && typeof anchor.from === \"object\"\n ? anchor.from as Record<string, unknown>\n : null;\n\n if (anchor.type === \"oneCell\") {\n return {\n from: {\n col: typeof from?.col === \"number\" ? from.col : 0,\n colOffsetEmu: typeof from?.colOffsetEmu === \"number\" ? from.colOffsetEmu : 0,\n row: typeof from?.row === \"number\" ? from.row : 0,\n rowOffsetEmu: typeof from?.rowOffsetEmu === \"number\" ? from.rowOffsetEmu : 0\n },\n kind: \"one-cell\",\n sizeEmu: {\n cx: typeof anchor.widthEmu === \"number\" ? anchor.widthEmu : 0,\n cy: typeof anchor.heightEmu === \"number\" ? anchor.heightEmu : 0\n }\n };\n }\n\n if (anchor.type === \"absolute\") {\n return {\n kind: \"absolute\",\n positionEmu: {\n x: typeof anchor.xEmu === \"number\" ? anchor.xEmu : 0,\n y: typeof anchor.yEmu === \"number\" ? anchor.yEmu : 0\n },\n sizeEmu: {\n cx: typeof anchor.widthEmu === \"number\" ? anchor.widthEmu : 0,\n cy: typeof anchor.heightEmu === \"number\" ? anchor.heightEmu : 0\n }\n };\n }\n\n const to = anchor.to && typeof anchor.to === \"object\"\n ? anchor.to as Record<string, unknown>\n : null;\n const fromColValue = from?.col;\n const fromColOffsetValue = from?.colOffsetEmu;\n const fromRowValue = from?.row;\n const fromRowOffsetValue = from?.rowOffsetEmu;\n const toColValue = to?.col;\n const toColOffsetValue = to?.colOffsetEmu;\n const toRowValue = to?.row;\n const toRowOffsetValue = to?.rowOffsetEmu;\n const fromCol = typeof fromColValue === \"number\" ? fromColValue : 0;\n const fromColOffsetEmu = typeof fromColOffsetValue === \"number\" ? fromColOffsetValue : 0;\n const fromRow = typeof fromRowValue === \"number\" ? fromRowValue : 0;\n const fromRowOffsetEmu = typeof fromRowOffsetValue === \"number\" ? fromRowOffsetValue : 0;\n const rawToCol = typeof toColValue === \"number\" ? toColValue : 0;\n const rawToColOffsetEmu = typeof toColOffsetValue === \"number\" ? toColOffsetValue : 0;\n const rawToRow = typeof toRowValue === \"number\" ? toRowValue : 0;\n const rawToRowOffsetEmu = typeof toRowOffsetValue === \"number\" ? toRowOffsetValue : 0;\n return {\n kind: \"two-cell\",\n from: {\n col: fromCol,\n colOffsetEmu: fromColOffsetEmu,\n row: fromRow,\n rowOffsetEmu: fromRowOffsetEmu\n },\n to: {\n col: rawToCol,\n colOffsetEmu: rawToColOffsetEmu,\n row: rawToRow,\n rowOffsetEmu: rawToRowOffsetEmu\n }\n };\n}\n\nfunction parseMarkerNode(node: Element | null) {\n if (!node) {\n return null;\n }\n\n const col = Number(getFirstLocalChild(node, \"col\")?.textContent ?? Number.NaN);\n const row = Number(getFirstLocalChild(node, \"row\")?.textContent ?? Number.NaN);\n const colOffsetEmu = Number(getFirstLocalChild(node, \"colOff\")?.textContent ?? 0);\n const rowOffsetEmu = Number(getFirstLocalChild(node, \"rowOff\")?.textContent ?? 0);\n\n if (!Number.isFinite(col) || !Number.isFinite(row)) {\n return null;\n }\n\n return {\n col: Math.max(0, Math.round(col)),\n colOffsetEmu: Number.isFinite(colOffsetEmu) ? Math.max(0, Math.round(colOffsetEmu)) : 0,\n row: Math.max(0, Math.round(row)),\n rowOffsetEmu: Number.isFinite(rowOffsetEmu) ? Math.max(0, Math.round(rowOffsetEmu)) : 0\n };\n}\n\nfunction parseChartAnchorNode(anchorNode: Element): XlsxImageAnchor | null {\n if (anchorNode.localName === \"twoCellAnchor\") {\n const from = parseMarkerNode(getFirstLocalChild(anchorNode, \"from\"));\n const to = parseMarkerNode(getFirstLocalChild(anchorNode, \"to\"));\n return from && to ? { from, kind: \"two-cell\", to } : null;\n }\n\n if (anchorNode.localName === \"oneCellAnchor\") {\n const from = parseMarkerNode(getFirstLocalChild(anchorNode, \"from\"));\n const ext = getFirstLocalChild(anchorNode, \"ext\");\n const cx = Number(ext?.getAttribute(\"cx\") ?? Number.NaN);\n const cy = Number(ext?.getAttribute(\"cy\") ?? Number.NaN);\n return from && Number.isFinite(cx) && Number.isFinite(cy)\n ? {\n from,\n kind: \"one-cell\",\n sizeEmu: {\n cx: Math.max(0, Math.round(cx)),\n cy: Math.max(0, Math.round(cy))\n }\n }\n : null;\n }\n\n const pos = getFirstLocalChild(anchorNode, \"pos\");\n const ext = getFirstLocalChild(anchorNode, \"ext\");\n const x = Number(pos?.getAttribute(\"x\") ?? Number.NaN);\n const y = Number(pos?.getAttribute(\"y\") ?? Number.NaN);\n const cx = Number(ext?.getAttribute(\"cx\") ?? Number.NaN);\n const cy = Number(ext?.getAttribute(\"cy\") ?? Number.NaN);\n return Number.isFinite(x) && Number.isFinite(y) && Number.isFinite(cx) && Number.isFinite(cy)\n ? {\n kind: \"absolute\",\n positionEmu: {\n x: Math.round(x),\n y: Math.round(y)\n },\n sizeEmu: {\n cx: Math.max(0, Math.round(cx)),\n cy: Math.max(0, Math.round(cy))\n }\n }\n : null;\n}\n\nfunction isCollapsedChartAnchor(anchor: XlsxImageAnchor) {\n if (anchor.kind !== \"two-cell\") {\n return false;\n }\n\n const collapsedWidth = anchor.to.col < anchor.from.col\n || (anchor.to.col === anchor.from.col && anchor.to.colOffsetEmu <= anchor.from.colOffsetEmu);\n const collapsedHeight = anchor.to.row < anchor.from.row\n || (anchor.to.row === anchor.from.row && anchor.to.rowOffsetEmu <= anchor.from.rowOffsetEmu);\n return collapsedWidth || collapsedHeight;\n}\n\nfunction normalizeChartSeries(\n workbook: Workbook,\n workbookSheetIndex: number,\n chartId: string,\n raw: unknown,\n index: number\n): XlsxChartSeries {\n const series = raw && typeof raw === \"object\" ? raw as Record<string, unknown> : {};\n const categoriesRef = normalizeChartReference(series.categories);\n const valuesRef = normalizeChartReference(series.values);\n const shapeProperties = series.shapeProperties && typeof series.shapeProperties === \"object\"\n ? series.shapeProperties as Record<string, unknown>\n : undefined;\n const rawFillColor = typeof shapeProperties?.solidFillHex === \"string\"\n ? normalizeHexColor(shapeProperties.solidFillHex)\n : null;\n const rawLineColor = typeof shapeProperties?.lineColorHex === \"string\"\n ? normalizeHexColor(shapeProperties.lineColorHex)\n : null;\n const bubbleSizeRef = normalizeChartReference(series.bubbleSize ?? series.bubbleSizes ?? series.bubbles);\n\n return {\n bubbleSizeRef,\n bubbleSizes: resolveReferenceValues(workbook, workbookSheetIndex, bubbleSizeRef, \"value\").map((value) => (\n typeof value === \"number\" && Number.isFinite(value) ? value : null\n )),\n categories: resolveReferenceValues(workbook, workbookSheetIndex, categoriesRef, \"category\"),\n categoriesRef,\n color: rawFillColor ?? undefined,\n dataPoints: Array.isArray(series.dataPoints) ? series.dataPoints : [],\n dataPointStyles: undefined,\n id: `${chartId}-series-${index}`,\n invertIfNegative: typeof series.invertIfNegative === \"boolean\" ? series.invertIfNegative : undefined,\n lineColor: rawLineColor ?? rawFillColor ?? undefined,\n lineWidthPx: typeof shapeProperties?.lineWidth === \"number\"\n ? Math.max(1, Number(shapeProperties.lineWidth) / EMU_PER_PIXEL)\n : undefined,\n marker: series.marker && typeof series.marker === \"object\" ? series.marker as Record<string, unknown> : undefined,\n markerColor: undefined,\n markerLineColor: undefined,\n markerSize: series.marker && typeof series.marker === \"object\" && typeof (series.marker as Record<string, unknown>).size === \"number\"\n ? Number((series.marker as Record<string, unknown>).size)\n : undefined,\n markerSymbol: series.marker && typeof series.marker === \"object\" && typeof (series.marker as Record<string, unknown>).symbol === \"string\"\n ? String((series.marker as Record<string, unknown>).symbol)\n : undefined,\n name: resolveSeriesName(workbook, workbookSheetIndex, series.name),\n negativeColor: undefined,\n negativeLineColor: undefined,\n raw: series,\n shapeProperties,\n smooth: typeof series.smooth === \"boolean\" ? series.smooth : undefined,\n values: resolveReferenceValues(workbook, workbookSheetIndex, valuesRef, \"value\").map((value) => (\n typeof value === \"number\" && Number.isFinite(value) ? value : null\n )),\n valuesRef\n };\n}\n\nfunction normalizeChartTypeGroup(\n workbook: Workbook,\n workbookSheetIndex: number,\n chartId: string,\n raw: unknown,\n index: number\n): XlsxChartTypeGroup | null {\n if (!raw || typeof raw !== \"object\") {\n return null;\n }\n\n const group = raw as Record<string, unknown>;\n const rawSeries = Array.isArray(group.series) ? group.series : [];\n return {\n axisIds: Array.isArray(group.axisIds)\n ? group.axisIds.filter((value): value is number => typeof value === \"number\" && Number.isFinite(value))\n : undefined,\n chartType: typeof group.chartType === \"string\" ? group.chartType : \"ColumnClustered\",\n dataLabels: normalizeChartDataLabels(group.dataLabels),\n gapWidth: typeof group.gapWidth === \"number\" && Number.isFinite(group.gapWidth) ? group.gapWidth : undefined,\n is3d: typeof group.is3D === \"boolean\" ? group.is3D : undefined,\n overlap: typeof group.overlap === \"number\" && Number.isFinite(group.overlap) ? group.overlap : undefined,\n raw: group,\n series: rawSeries.map((entry, seriesIndex) => (\n normalizeChartSeries(workbook, workbookSheetIndex, `${chartId}-group-${index}`, entry, seriesIndex)\n )),\n varyColors: typeof group.varyColors === \"boolean\" ? group.varyColors : undefined\n };\n}\n\nfunction normalizeChartsheet(raw: unknown, index: number): XlsxChartsheet {\n const chartsheet = raw && typeof raw === \"object\" ? raw as Record<string, unknown> : {};\n return {\n chartIds: Array.isArray(chartsheet.chartIds) ? chartsheet.chartIds.filter((value): value is string => typeof value === \"string\") : [],\n chartPath: typeof chartsheet.chartPath === \"string\" ? chartsheet.chartPath : undefined,\n id: `chartsheet-${index}`,\n index,\n name: typeof chartsheet.name === \"string\" ? chartsheet.name : `Chart ${index + 1}`,\n raw: chartsheet,\n workbookSheetIndex: typeof chartsheet.workbookSheetIndex === \"number\" ? chartsheet.workbookSheetIndex : undefined\n };\n}\n\nfunction buildTabs(\n workbook: Workbook,\n chartsheets: XlsxChartsheet[],\n visibleSheetIndexByWorkbookSheetIndex: Map<number, number>,\n showHiddenSheets = false\n): XlsxWorkbookTab[] {\n const rawOrder = Array.isArray(workbook.sheetOrder) ? workbook.sheetOrder as Array<Record<string, unknown>> : [];\n if (rawOrder.length === 0) {\n return workbook.sheetNames.flatMap((name, index) => {\n const worksheet = workbook.getSheet(index);\n const visibility = normalizeWorksheetVisibility(worksheet.visibility);\n if (!showHiddenSheets && visibility !== \"visible\") {\n return [];\n }\n\n return [{\n id: `sheet-${index}`,\n index,\n kind: \"sheet\" as const,\n name,\n sheetIndex: visibleSheetIndexByWorkbookSheetIndex.get(index) ?? index,\n visibility,\n workbookSheetIndex: index\n }];\n });\n }\n\n return rawOrder.flatMap<XlsxWorkbookTab>((entry, index) => {\n const slotType = typeof entry.slotType === \"string\" ? entry.slotType : \"worksheet\";\n const slotIndex = typeof entry.index === \"number\" ? entry.index : index;\n if (slotType === \"chartsheet\") {\n const chartsheet = chartsheets[slotIndex];\n return chartsheet ? [{\n chartsheetIndex: slotIndex,\n id: `chartsheet-${slotIndex}`,\n index,\n kind: \"chartsheet\" as const,\n name: chartsheet.name\n }] : [];\n }\n\n const worksheet = workbook.getSheet(slotIndex);\n const visibility = normalizeWorksheetVisibility(worksheet.visibility);\n if (!showHiddenSheets && visibility !== \"visible\") {\n return [];\n }\n\n return [{\n id: `sheet-${slotIndex}`,\n index,\n kind: \"sheet\" as const,\n name: worksheet.name,\n sheetIndex: visibleSheetIndexByWorkbookSheetIndex.get(slotIndex) ?? slotIndex,\n visibility,\n workbookSheetIndex: slotIndex\n }];\n });\n}\n\nfunction collectChartOriginsForSheet(\n archive: Record<string, Uint8Array>,\n origin: WorkbookImageSheetOrigin | null\n) {\n if (!origin) {\n return [] as WorkbookChartOrigin[];\n }\n\n const chartOrigins: WorkbookChartOrigin[] = [];\n\n for (const attachment of origin.attachments) {\n const drawingXml = readArchiveText(archive, attachment.drawingPath);\n const relsXml = readArchiveText(archive, attachment.drawingRelsPath);\n if (!drawingXml || !relsXml) {\n continue;\n }\n\n const drawingDocument = parseXml(drawingXml);\n const relsDocument = parseXml(relsXml);\n if (!drawingDocument || !relsDocument) {\n continue;\n }\n\n const relationships = new Map<string, { target: string; type: string | null }>();\n for (const node of getLocalDescendants(relsDocument, \"Relationship\")) {\n const id = node.getAttribute(\"Id\");\n const target = node.getAttribute(\"Target\");\n const type = node.getAttribute(\"Type\");\n if (id && target) {\n relationships.set(id, {\n target: resolveRelationshipPath(attachment.drawingRelsPath ?? attachment.drawingPath, target),\n type\n });\n }\n }\n\n const anchorNodes = Array.from(drawingDocument.documentElement.childNodes).filter(\n (node): node is Element => (\n node.nodeType === Node.ELEMENT_NODE\n && (\n (node as Element).localName === \"twoCellAnchor\"\n || (node as Element).localName === \"oneCellAnchor\"\n || (node as Element).localName === \"absoluteAnchor\"\n )\n )\n );\n\n let chartAnchorIndex = 0;\n for (const anchorNode of anchorNodes) {\n const graphicFrame = getFirstLocalDescendant(anchorNode, \"graphicFrame\");\n const chartNode = graphicFrame ? getFirstLocalDescendant(graphicFrame, \"chart\") : null;\n const relationshipId = chartNode?.getAttributeNS(\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\", \"id\")\n ?? chartNode?.getAttribute(\"r:id\")\n ?? chartNode?.getAttribute(\"id\");\n if (!relationshipId) {\n continue;\n }\n const relationship = relationships.get(relationshipId);\n if (!relationship || (relationship.type !== CHART_REL_TYPE && relationship.type !== CHART_EX_REL_TYPE)) {\n continue;\n }\n\n chartOrigins.push({\n anchorIndex: chartAnchorIndex,\n anchor: parseChartAnchorNode(anchorNode),\n chartKind: relationship.type === CHART_EX_REL_TYPE ? \"modern\" : \"classic\",\n chartPath: relationship.target,\n drawingPath: attachment.drawingPath,\n workbookSheetIndex: origin.workbookSheetIndex\n });\n chartAnchorIndex += 1;\n }\n }\n\n return chartOrigins;\n}\n\nfunction applyChartOrigins(\n chartsByWorkbookSheetIndex: XlsxChart[][],\n chartOriginsById: Map<string, WorkbookChartOrigin>,\n archive: Record<string, Uint8Array>,\n sheetOrigins: Array<WorkbookImageSheetOrigin | null>\n) {\n for (let workbookSheetIndex = 0; workbookSheetIndex < chartsByWorkbookSheetIndex.length; workbookSheetIndex += 1) {\n const charts = chartsByWorkbookSheetIndex[workbookSheetIndex] ?? [];\n const origins = collectChartOriginsForSheet(archive, sheetOrigins[workbookSheetIndex] ?? null);\n const originsByKind = {\n classic: origins.filter((origin) => origin.chartKind === \"classic\"),\n modern: origins.filter((origin) => origin.chartKind === \"modern\")\n };\n const chartIndexByKind = {\n classic: 0,\n modern: 0\n };\n\n charts.forEach((chart) => {\n const chartKind = chart.id.startsWith(\"chart-ex-\") ? \"modern\" : \"classic\";\n const origin = originsByKind[chartKind][chartIndexByKind[chartKind]];\n chartIndexByKind[chartKind] += 1;\n if (!origin) {\n return;\n }\n if (origin.anchor && isCollapsedChartAnchor(chart.anchor)) {\n chart.anchor = origin.anchor;\n } else if (origin.anchor && chart.anchor.kind === \"two-cell\" && chart.anchor.from.col === 0 && chart.anchor.from.row === 0) {\n chart.anchor = origin.anchor;\n }\n chart.chartPath = origin.chartPath ?? undefined;\n chartOriginsById.set(chart.id, origin);\n });\n }\n}\n\nexport function hydrateWorkbookChartStyles(\n chartsByWorkbookSheetIndex: XlsxChart[][],\n imageAssets: Pick<WorkbookImageAssets, \"archive\" | \"sheetOrigins\" | \"themePalette\">\n) {\n const chartOriginsById = new Map<string, WorkbookChartOrigin>();\n applyChartOrigins(chartsByWorkbookSheetIndex, chartOriginsById, imageAssets.archive, imageAssets.sheetOrigins);\n for (const charts of chartsByWorkbookSheetIndex) {\n for (const chart of charts) {\n applyChartStyleFromXml(chart, chart.chartPath, imageAssets.archive, imageAssets.themePalette);\n applyBuiltinChartDefaults(chart, imageAssets.themePalette);\n }\n }\n return chartOriginsById;\n}\n\nexport function loadWorkbookChartAssets(\n workbook: Workbook,\n imageAssets: Pick<WorkbookImageAssets, \"archive\" | \"sheetOrigins\" | \"themePalette\"> | null,\n visibleSheetIndexByWorkbookSheetIndex: Map<number, number>,\n showHiddenSheets = false\n): WorkbookChartAssets {\n const excludedChartIds = new Set<string>();\n const chartsByWorkbookSheetIndex = Array.from({ length: workbook.sheetCount }, (_, workbookSheetIndex) => {\n const worksheet = workbook.getSheet(workbookSheetIndex);\n const rawCharts = worksheet.charts;\n const rawChartsEx = worksheet.chartsEx;\n const visibleSheetIndex = visibleSheetIndexByWorkbookSheetIndex.get(workbookSheetIndex) ?? workbookSheetIndex;\n\n const classicCharts = rawCharts.map((rawChart, chartIndex) => {\n const chartId = `chart-${workbookSheetIndex}-${chartIndex}`;\n if (rawChart.hidden || !rawChart.anchor) {\n excludedChartIds.add(chartId);\n }\n const drawing = rawChart && typeof rawChart === \"object\" ? rawChart as unknown as Record<string, unknown> : {};\n const chart = drawing.chart && typeof drawing.chart === \"object\"\n ? drawing.chart as Record<string, unknown>\n : {};\n const rawView3d = chart.view3D && typeof chart.view3D === \"object\"\n ? chart.view3D as Record<string, unknown>\n : null;\n const rawSeries = Array.isArray(chart.series) ? chart.series : [];\n const chartLevelDataLabels = normalizeChartDataLabels(chart.dataLabels);\n const firstSeriesDataLabels = rawSeries.length > 0 && rawSeries[0] && typeof rawSeries[0] === \"object\"\n ? normalizeChartDataLabels((rawSeries[0] as Record<string, unknown>).dataLabels)\n : null;\n return {\n anchor: normalizeChartAnchor(drawing.anchor),\n autoTitleDeleted: typeof chart.autoTitleDeleted === \"boolean\" ? chart.autoTitleDeleted : undefined,\n axes: Array.isArray(chart.axes) ? chart.axes.map(normalizeChartAxis).filter((value): value is XlsxChartAxis => Boolean(value)) : [],\n axisLabelColor: undefined,\n axisLineColor: undefined,\n categoryAxis: normalizeChartAxis(chart.categoryAxis),\n chartAreaBorderColor: undefined,\n chartAreaFillColor: undefined,\n chartColorPalette: undefined,\n chartColorPaletteOffset: undefined,\n chartPath: undefined,\n chartStyleId: undefined,\n chartType: typeof chart.chartType === \"string\" ? chart.chartType : \"ColumnClustered\",\n dataLabels: chartLevelDataLabels ?? firstSeriesDataLabels,\n displayBlanksAs: typeof chart.displayBlanksAs === \"string\" ? chart.displayBlanksAs : undefined,\n editable: true,\n firstSliceAngle: typeof chart.firstSliceAngle === \"number\" ? chart.firstSliceAngle : undefined,\n fontFamily: undefined,\n gapWidth: typeof chart.gapWidth === \"number\" ? chart.gapWidth : undefined,\n holeSize: typeof chart.holeSize === \"number\" ? chart.holeSize : undefined,\n id: chartId,\n is3d: typeof chart.is3D === \"boolean\" ? chart.is3D : undefined,\n legend: normalizeLegend(chart.legend)\n ? {\n ...normalizeLegend(chart.legend),\n position: normalizeLegendPosition(normalizeLegend(chart.legend)?.position)\n }\n : null,\n name: typeof drawing.name === \"string\" ? drawing.name : undefined,\n overlap: typeof chart.overlap === \"number\" ? chart.overlap : undefined,\n plotVisibleOnly: typeof chart.plotVisibleOnly === \"boolean\" ? chart.plotVisibleOnly : undefined,\n raw: chart,\n radarStyle: typeof chart.radarStyle === \"string\" ? chart.radarStyle : undefined,\n scatterStyle: typeof chart.scatterStyle === \"string\" ? chart.scatterStyle : undefined,\n roundedCorners: typeof chart.roundedCorners === \"boolean\" ? chart.roundedCorners : undefined,\n shape3d: typeof chart.shape === \"string\"\n ? chart.shape\n : typeof chart.shape3d === \"string\"\n ? chart.shape3d\n : undefined,\n seriesAxis: null,\n series: rawSeries.map((entry, seriesIndex) => normalizeChartSeries(workbook, workbookSheetIndex, chartId, entry, seriesIndex)),\n sheetIndex: visibleSheetIndex,\n showDlblsOverMax: typeof chart.showDlblsOverMax === \"boolean\" ? chart.showDlblsOverMax : undefined,\n sideWall: null,\n backWall: null,\n bubbleScale: typeof chart.bubbleScale === \"number\" ? chart.bubbleScale : undefined,\n bubble3d: typeof chart.bubble3d === \"boolean\" ? chart.bubble3d : undefined,\n floor: null,\n surfaceMaterial: undefined,\n textColor: undefined,\n title: typeof chart.title === \"string\" ? chart.title : undefined,\n titleColor: undefined,\n titleFontFamily: undefined,\n typeGroups: Array.isArray(chart.typeGroups)\n ? chart.typeGroups\n .map((entry, groupIndex) => normalizeChartTypeGroup(workbook, workbookSheetIndex, chartId, entry, groupIndex))\n .filter((value): value is XlsxChartTypeGroup => value != null)\n : [],\n valueAxis: normalizeChartAxis(chart.valueAxis),\n varyColors: typeof chart.varyColors === \"boolean\" ? chart.varyColors : undefined,\n view3d: rawView3d\n ? {\n depthPercent: typeof rawView3d.depthPercent === \"number\" ? rawView3d.depthPercent : undefined,\n heightPercent: typeof rawView3d.heightPercent === \"number\" ? rawView3d.heightPercent : undefined,\n perspective: typeof rawView3d.perspective === \"number\" ? rawView3d.perspective : undefined,\n rAngAx: typeof rawView3d.rAngAx === \"boolean\"\n ? rawView3d.rAngAx\n : typeof rawView3d.rightAngleAxes === \"boolean\"\n ? rawView3d.rightAngleAxes\n : undefined,\n rotX: typeof rawView3d.rotX === \"number\"\n ? rawView3d.rotX\n : typeof rawView3d.rotateX === \"number\"\n ? rawView3d.rotateX\n : undefined,\n rotY: typeof rawView3d.rotY === \"number\"\n ? rawView3d.rotY\n : typeof rawView3d.rotateY === \"number\"\n ? rawView3d.rotateY\n : undefined\n }\n : undefined,\n wireframe: typeof chart.wireframe === \"boolean\" ? chart.wireframe : undefined,\n workbookSheetIndex,\n zIndex: Array.isArray(drawing.drawingPath) && typeof drawing.drawingPath[0] === \"number\"\n ? drawing.drawingPath[0] + 1\n : chartIndex + 1\n } satisfies XlsxChart;\n });\n\n const modernCharts = rawChartsEx.map((rawChartEx, chartExIndex) => {\n const chartId = `chart-ex-${workbookSheetIndex}-${chartExIndex}`;\n if (rawChartEx.hidden || !rawChartEx.anchor) {\n excludedChartIds.add(chartId);\n }\n return normalizeChartExChart(\n workbook,\n workbookSheetIndex,\n visibleSheetIndex,\n rawChartEx,\n chartExIndex,\n imageAssets?.themePalette ?? null\n );\n });\n\n return [...classicCharts, ...modernCharts];\n });\n\n const chartsheets = Array.isArray(workbook.chartsheets)\n ? workbook.chartsheets.map((entry, index) => normalizeChartsheet(entry, index))\n : [];\n const tabs = buildTabs(workbook, chartsheets, visibleSheetIndexByWorkbookSheetIndex, showHiddenSheets);\n const chartOriginsById = imageAssets\n ? hydrateWorkbookChartStyles(chartsByWorkbookSheetIndex, imageAssets)\n : new Map<string, WorkbookChartOrigin>();\n\n if (imageAssets) {\n for (let index = 0; index < chartsByWorkbookSheetIndex.length; index += 1) {\n chartsByWorkbookSheetIndex[index] = (chartsByWorkbookSheetIndex[index] ?? [])\n .filter((chart) => !excludedChartIds.has(chart.id));\n }\n for (const id of excludedChartIds) {\n chartOriginsById.delete(id);\n }\n } else {\n for (let index = 0; index < chartsByWorkbookSheetIndex.length; index += 1) {\n chartsByWorkbookSheetIndex[index] = (chartsByWorkbookSheetIndex[index] ?? [])\n .filter((chart) => !excludedChartIds.has(chart.id));\n }\n for (const charts of chartsByWorkbookSheetIndex) {\n for (const chart of charts) {\n applyBuiltinChartDefaults(chart, null);\n }\n }\n }\n\n return {\n chartOriginsById,\n chartsByWorkbookSheetIndex,\n chartsheets,\n tabs\n };\n}\n\nfunction getChartAnchorNodes(drawingDocument: XMLDocument) {\n return Array.from(drawingDocument.documentElement.childNodes).filter(\n (node): node is Element => (\n node.nodeType === Node.ELEMENT_NODE\n && (\n (node as Element).localName === \"twoCellAnchor\"\n || (node as Element).localName === \"oneCellAnchor\"\n || (node as Element).localName === \"absoluteAnchor\"\n )\n )\n )\n .filter((anchorNode) => {\n const graphicFrame = getFirstLocalChild(anchorNode, \"graphicFrame\");\n return Boolean(graphicFrame && getFirstLocalDescendant(graphicFrame, \"chart\"));\n });\n}\n\nfunction updateMarkerNode(markerNode: Element | null, marker: { col: number; colOffsetEmu: number; row: number; rowOffsetEmu: number }) {\n if (!markerNode) {\n return;\n }\n\n setLeafValue(markerNode, \"col\", String(Math.max(0, Math.round(marker.col))));\n setLeafValue(markerNode, \"colOff\", String(Math.max(0, Math.round(marker.colOffsetEmu))));\n setLeafValue(markerNode, \"row\", String(Math.max(0, Math.round(marker.row))));\n setLeafValue(markerNode, \"rowOff\", String(Math.max(0, Math.round(marker.rowOffsetEmu))));\n}\n\nfunction updateAnchorNode(anchorNode: Element, anchor: XlsxImageAnchor) {\n if (anchor.kind === \"two-cell\") {\n updateMarkerNode(getFirstLocalChild(anchorNode, \"from\"), anchor.from);\n updateMarkerNode(getFirstLocalChild(anchorNode, \"to\"), anchor.to);\n return;\n }\n\n if (anchor.kind === \"one-cell\") {\n updateMarkerNode(getFirstLocalChild(anchorNode, \"from\"), anchor.from);\n const ext = getFirstLocalChild(anchorNode, \"ext\");\n if (ext) {\n ext.setAttribute(\"cx\", String(Math.max(0, Math.round(anchor.sizeEmu.cx))));\n ext.setAttribute(\"cy\", String(Math.max(0, Math.round(anchor.sizeEmu.cy))));\n }\n return;\n }\n\n const pos = getFirstLocalChild(anchorNode, \"pos\");\n if (pos) {\n pos.setAttribute(\"x\", String(Math.max(0, Math.round(anchor.positionEmu.x))));\n pos.setAttribute(\"y\", String(Math.max(0, Math.round(anchor.positionEmu.y))));\n }\n const ext = getFirstLocalChild(anchorNode, \"ext\");\n if (ext) {\n ext.setAttribute(\"cx\", String(Math.max(0, Math.round(anchor.sizeEmu.cx))));\n ext.setAttribute(\"cy\", String(Math.max(0, Math.round(anchor.sizeEmu.cy))));\n }\n}\n\nfunction setChartTitle(chartNode: Element, value: string | undefined) {\n const existing = getFirstLocalChild(chartNode, \"title\");\n if (!value) {\n existing?.remove();\n return;\n }\n\n const titleNode = existing ?? chartNode.insertBefore(\n chartNode.ownerDocument.createElementNS(CHART_NS, \"c:title\"),\n chartNode.firstChild\n );\n while (titleNode.firstChild) {\n titleNode.removeChild(titleNode.firstChild);\n }\n const tx = titleNode.ownerDocument.createElementNS(CHART_NS, \"c:tx\");\n const rich = titleNode.ownerDocument.createElementNS(CHART_NS, \"c:rich\");\n const bodyPr = titleNode.ownerDocument.createElementNS(DRAWINGML_NS, \"a:bodyPr\");\n const lstStyle = titleNode.ownerDocument.createElementNS(DRAWINGML_NS, \"a:lstStyle\");\n const p = titleNode.ownerDocument.createElementNS(DRAWINGML_NS, \"a:p\");\n const r = titleNode.ownerDocument.createElementNS(DRAWINGML_NS, \"a:r\");\n const t = titleNode.ownerDocument.createElementNS(DRAWINGML_NS, \"a:t\");\n t.textContent = value;\n r.appendChild(t);\n p.appendChild(r);\n rich.append(bodyPr, lstStyle, p);\n tx.appendChild(rich);\n titleNode.appendChild(tx);\n}\n\nfunction setRefFormula(parent: Element, refNodeName: string, formula: string | undefined) {\n if (!formula) {\n removeLocalChildren(parent, refNodeName);\n return;\n }\n\n const refNode = ensureChild(parent, refNodeName);\n setLeafValue(refNode, \"f\", formula);\n}\n\nfunction setSeriesText(seriesNode: Element, series: XlsxChartSeries) {\n const raw = series.raw && typeof series.raw === \"object\" ? series.raw as Record<string, unknown> : null;\n const nameFormula = typeof raw?.name === \"string\" && raw.name.length > 0 ? raw.name : undefined;\n if (!nameFormula && series.name === undefined) {\n return;\n }\n\n const tx = ensureChild(seriesNode, \"tx\");\n removeLocalChildren(tx, \"strRef\");\n removeLocalChildren(tx, \"v\");\n if (nameFormula) {\n const strRef = ensureChild(tx, \"strRef\");\n setLeafValue(strRef, \"f\", nameFormula);\n return;\n }\n\n setLeafValue(tx, \"v\", series.name ?? \"\");\n}\n\nfunction updateSeriesNodes(plotAreaNode: Element, chart: Partial<XlsxChart>) {\n if (!chart.series) {\n return;\n }\n\n const seriesNodes = getLocalDescendants(plotAreaNode, \"ser\");\n chart.series.forEach((series, index) => {\n const seriesNode = seriesNodes[index];\n if (!seriesNode) {\n return;\n }\n\n setSeriesText(seriesNode, series);\n if (series.categoriesRef?.formula) {\n const target = getFirstLocalChild(seriesNode, \"xVal\")\n ?? getFirstLocalChild(seriesNode, \"cat\")\n ?? (\n chart.chartType === \"Scatter\" || chart.chartType === \"ScatterLines\" || chart.chartType === \"ScatterSmooth\" || chart.chartType === \"Bubble\"\n ? ensureChild(seriesNode, \"xVal\")\n : ensureChild(seriesNode, \"cat\")\n );\n const categoryRefName = target.localName === \"xVal\" || getFirstLocalChild(target, \"numRef\") ? \"numRef\" : \"strRef\";\n setRefFormula(target, categoryRefName, series.categoriesRef.formula);\n }\n if (series.valuesRef?.formula) {\n const target = getFirstLocalChild(seriesNode, \"yVal\")\n ?? getFirstLocalChild(seriesNode, \"val\")\n ?? (\n chart.chartType === \"Scatter\" || chart.chartType === \"ScatterLines\" || chart.chartType === \"ScatterSmooth\" || chart.chartType === \"Bubble\"\n ? ensureChild(seriesNode, \"yVal\")\n : ensureChild(seriesNode, \"val\")\n );\n setRefFormula(target, \"numRef\", series.valuesRef.formula);\n }\n if (series.bubbleSizeRef) {\n const target = getFirstLocalChild(seriesNode, \"bubbleSize\") ?? ensureChild(seriesNode, \"bubbleSize\");\n setRefFormula(target, \"numRef\", series.bubbleSizeRef.formula);\n }\n if (series.invertIfNegative !== undefined) {\n setBooleanValue(seriesNode, \"invertIfNegative\", series.invertIfNegative);\n }\n if (series.smooth !== undefined) {\n setBooleanValue(seriesNode, \"smooth\", series.smooth);\n }\n });\n}\n\nfunction updateAxisNode(axisNode: Element | null, axis: XlsxChartAxis | null | undefined) {\n if (!axisNode || !axis) {\n return;\n }\n\n if (axis.position) {\n setLeafValue(ensureChild(axisNode, \"axPos\"), \"val\", axis.position);\n getFirstLocalChild(axisNode, \"axPos\")?.setAttribute(\"val\", axis.position);\n }\n if (axis.majorGridlines !== undefined) {\n const gridlines = getFirstLocalChild(axisNode, \"majorGridlines\");\n if (axis.majorGridlines && !gridlines) {\n axisNode.appendChild(axisNode.ownerDocument.createElementNS(CHART_NS, \"c:majorGridlines\"));\n } else if (!axis.majorGridlines) {\n gridlines?.remove();\n }\n }\n if (axis.minorGridlines !== undefined) {\n const gridlines = getFirstLocalChild(axisNode, \"minorGridlines\");\n if (axis.minorGridlines && !gridlines) {\n axisNode.appendChild(axisNode.ownerDocument.createElementNS(CHART_NS, \"c:minorGridlines\"));\n } else if (!axis.minorGridlines) {\n gridlines?.remove();\n }\n }\n if (axis.majorTickMark) {\n getFirstLocalChild(axisNode, \"majorTickMark\")?.setAttribute(\"val\", axis.majorTickMark)\n ?? setBooleanValue(axisNode, \"majorTickMark\", false).setAttribute(\"val\", axis.majorTickMark);\n }\n if (axis.minorTickMark) {\n getFirstLocalChild(axisNode, \"minorTickMark\")?.setAttribute(\"val\", axis.minorTickMark)\n ?? setBooleanValue(axisNode, \"minorTickMark\", false).setAttribute(\"val\", axis.minorTickMark);\n }\n if (axis.labelPosition) {\n getFirstLocalChild(axisNode, \"tickLblPos\")?.setAttribute(\"val\", axis.labelPosition)\n ?? setBooleanValue(axisNode, \"tickLblPos\", false).setAttribute(\"val\", axis.labelPosition);\n }\n if (axis.crosses) {\n getFirstLocalChild(axisNode, \"crosses\")?.setAttribute(\"val\", axis.crosses)\n ?? setBooleanValue(axisNode, \"crosses\", false).setAttribute(\"val\", axis.crosses);\n }\n if (axis.crossBetween) {\n getFirstLocalChild(axisNode, \"crossBetween\")?.setAttribute(\"val\", axis.crossBetween)\n ?? setBooleanValue(axisNode, \"crossBetween\", false).setAttribute(\"val\", axis.crossBetween);\n }\n if (axis.delete !== undefined) {\n setBooleanValue(axisNode, \"delete\", axis.delete);\n }\n if (axis.numberFormat?.formatCode) {\n const numFmt = ensureChild(axisNode, \"numFmt\");\n numFmt.setAttribute(\"formatCode\", axis.numberFormat.formatCode);\n if (axis.numberFormat.sourceLinked !== undefined) {\n numFmt.setAttribute(\"sourceLinked\", axis.numberFormat.sourceLinked ? \"1\" : \"0\");\n }\n }\n}\n\nfunction updateDataLabels(chartTypeNode: Element, labels: XlsxChartDataLabels | null | undefined) {\n if (!labels) {\n return;\n }\n\n const labelsNode = ensureChild(chartTypeNode, \"dLbls\");\n if (labels.showLegendKey !== undefined) {\n setBooleanValue(labelsNode, \"showLegendKey\", labels.showLegendKey);\n }\n if (labels.showValue !== undefined) {\n setBooleanValue(labelsNode, \"showVal\", labels.showValue);\n }\n if (labels.showCategoryName !== undefined) {\n setBooleanValue(labelsNode, \"showCatName\", labels.showCategoryName);\n }\n if (labels.showSeriesName !== undefined) {\n setBooleanValue(labelsNode, \"showSerName\", labels.showSeriesName);\n }\n if (labels.showPercent !== undefined) {\n setBooleanValue(labelsNode, \"showPercent\", labels.showPercent);\n }\n if (labels.showBubbleSize !== undefined) {\n setBooleanValue(labelsNode, \"showBubbleSize\", labels.showBubbleSize);\n }\n}\n\nexport function updateWorkbookChartAnchor(\n imageAssets: Pick<WorkbookImageAssets, \"archive\" | \"dirtyArchivePaths\">,\n chartAssets: WorkbookChartAssets,\n chartId: string,\n anchor: XlsxImageAnchor\n) {\n const origin = chartAssets.chartOriginsById.get(chartId);\n if (!origin) {\n return false;\n }\n\n const drawingXml = readArchiveText(imageAssets.archive, origin.drawingPath);\n if (!drawingXml) {\n return false;\n }\n\n const drawingDocument = parseXml(drawingXml);\n if (!drawingDocument) {\n return false;\n }\n\n const anchorNode = getChartAnchorNodes(drawingDocument)[origin.anchorIndex];\n if (!anchorNode) {\n return false;\n }\n\n updateAnchorNode(anchorNode, anchor);\n imageAssets.archive[normalizeArchivePath(origin.drawingPath)] = strToU8(serializeXml(drawingDocument));\n imageAssets.dirtyArchivePaths.add(normalizeArchivePath(origin.drawingPath));\n return true;\n}\n\nexport function updateWorkbookChartDefinition(\n imageAssets: Pick<WorkbookImageAssets, \"archive\" | \"dirtyArchivePaths\">,\n chartAssets: WorkbookChartAssets,\n chartId: string,\n patch: Partial<XlsxChart>\n) {\n const origin = chartAssets.chartOriginsById.get(chartId);\n if (!origin?.chartPath) {\n return false;\n }\n\n const chartXml = readArchiveText(imageAssets.archive, origin.chartPath);\n if (!chartXml) {\n return false;\n }\n\n const chartDocument = parseXml(chartXml);\n if (!chartDocument) {\n return false;\n }\n\n const chartNode = getFirstLocalDescendant(chartDocument, \"chart\");\n const plotAreaNode = chartNode ? getFirstLocalChild(chartNode, \"plotArea\") : null;\n const chartTypeNode = findPrimaryChartTypeNode(plotAreaNode);\n if (!chartNode || !plotAreaNode || !chartTypeNode) {\n return false;\n }\n\n if (patch.title !== undefined) {\n setChartTitle(chartNode, patch.title);\n }\n if (patch.displayBlanksAs) {\n const node = ensureChild(chartNode, \"dispBlanksAs\");\n node.setAttribute(\"val\", patch.displayBlanksAs);\n }\n if (patch.roundedCorners !== undefined) {\n setBooleanValue(chartNode, \"roundedCorners\", patch.roundedCorners);\n }\n if (patch.showDlblsOverMax !== undefined) {\n setBooleanValue(chartNode, \"showDLblsOverMax\", patch.showDlblsOverMax);\n }\n if (patch.varyColors !== undefined) {\n setBooleanValue(chartTypeNode, \"varyColors\", patch.varyColors);\n }\n if (patch.gapWidth !== undefined) {\n setNumericValue(chartTypeNode, \"gapWidth\", patch.gapWidth);\n }\n if (patch.overlap !== undefined) {\n const overlapNode = ensureChild(chartTypeNode, \"overlap\");\n overlapNode.setAttribute(\"val\", String(Math.round(patch.overlap)));\n }\n if (patch.dataLabels) {\n updateDataLabels(chartTypeNode, patch.dataLabels);\n }\n updateSeriesNodes(plotAreaNode, patch);\n updateAxisNode(\n getLocalChildren(plotAreaNode, \"catAx\")[0]\n ?? getLocalChildren(plotAreaNode, \"dateAx\")[0]\n ?? getLocalChildren(plotAreaNode, \"serAx\")[0]\n ?? null,\n patch.categoryAxis\n );\n updateAxisNode(getLocalChildren(plotAreaNode, \"valAx\")[0] ?? null, patch.valueAxis);\n\n imageAssets.archive[normalizeArchivePath(origin.chartPath)] = strToU8(serializeXml(chartDocument));\n imageAssets.dirtyArchivePaths.add(normalizeArchivePath(origin.chartPath));\n return true;\n}\n","import type { XlsxThemePalette } from \"./types\";\n\nfunction normalizeHexColor(value: string) {\n const hex = value.replace(/^#/, \"\");\n if (hex.length === 8) {\n return `#${hex.slice(2).toLowerCase()}`;\n }\n if (hex.length === 6) {\n return `#${hex.toLowerCase()}`;\n }\n return null;\n}\n\nfunction parseHexColor(color: string): [number, number, number] | null {\n const normalized = normalizeHexColor(color);\n const match = normalized ? /^#([0-9a-f]{6})$/.exec(normalized) : null;\n if (!match) {\n return null;\n }\n\n const hex = match[1];\n return [\n Number.parseInt(hex.slice(0, 2), 16),\n Number.parseInt(hex.slice(2, 4), 16),\n Number.parseInt(hex.slice(4, 6), 16)\n ];\n}\n\nfunction rgbToHsl(red: number, green: number, blue: number): [number, number, number] {\n const normalizedRed = red / 255;\n const normalizedGreen = green / 255;\n const normalizedBlue = blue / 255;\n const max = Math.max(normalizedRed, normalizedGreen, normalizedBlue);\n const min = Math.min(normalizedRed, normalizedGreen, normalizedBlue);\n const lightness = (max + min) / 2;\n\n if (max === min) {\n return [0, 0, lightness];\n }\n\n const delta = max - min;\n const saturation = lightness > 0.5 ? delta / (2 - max - min) : delta / (max + min);\n let hue = 0;\n\n switch (max) {\n case normalizedRed:\n hue = (normalizedGreen - normalizedBlue) / delta + (normalizedGreen < normalizedBlue ? 6 : 0);\n break;\n case normalizedGreen:\n hue = (normalizedBlue - normalizedRed) / delta + 2;\n break;\n default:\n hue = (normalizedRed - normalizedGreen) / delta + 4;\n break;\n }\n\n return [hue / 6, saturation, lightness];\n}\n\nfunction hueToRgb(p: number, q: number, t: number) {\n let nextT = t;\n if (nextT < 0) {\n nextT += 1;\n }\n if (nextT > 1) {\n nextT -= 1;\n }\n if (nextT < 1 / 6) {\n return p + (q - p) * 6 * nextT;\n }\n if (nextT < 1 / 2) {\n return q;\n }\n if (nextT < 2 / 3) {\n return p + (q - p) * (2 / 3 - nextT) * 6;\n }\n return p;\n}\n\nfunction hslToRgb(hue: number, saturation: number, lightness: number): [number, number, number] {\n if (saturation === 0) {\n const gray = Math.round(lightness * 255);\n return [gray, gray, gray];\n }\n\n const q = lightness < 0.5 ? lightness * (1 + saturation) : lightness + saturation - lightness * saturation;\n const p = 2 * lightness - q;\n\n return [\n Math.round(hueToRgb(p, q, hue + 1 / 3) * 255),\n Math.round(hueToRgb(p, q, hue) * 255),\n Math.round(hueToRgb(p, q, hue - 1 / 3) * 255)\n ];\n}\n\nfunction rgbToHex(red: number, green: number, blue: number) {\n return `#${[red, green, blue]\n .map((channel) => Math.max(0, Math.min(255, channel)).toString(16).padStart(2, \"0\"))\n .join(\"\")}`;\n}\n\nfunction applyExcelTint(baseColor: string, tint: number) {\n const rgb = parseHexColor(baseColor);\n if (!rgb || !Number.isFinite(tint) || tint === 0) {\n return normalizeHexColor(baseColor);\n }\n\n const [hue, saturation, lightness] = rgbToHsl(rgb[0], rgb[1], rgb[2]);\n const nextLightness = tint < 0\n ? lightness * (1 + tint)\n : lightness * (1 - tint) + tint;\n const [nextRed, nextGreen, nextBlue] = hslToRgb(hue, saturation, Math.max(0, Math.min(1, nextLightness)));\n return rgbToHex(nextRed, nextGreen, nextBlue);\n}\n\nexport function buildThemePaletteFromHex(hexColors: readonly string[]): XlsxThemePalette {\n const colorsByIndex: Record<number, string> = {};\n hexColors.forEach((hex, index) => {\n const color = normalizeHexColor(hex);\n if (color) {\n colorsByIndex[index] = color;\n }\n });\n return { colorsByIndex };\n}\n\nexport function resolveWorkbookColor(\n color: Record<string, unknown> | undefined,\n themePalette?: XlsxThemePalette | null\n): string | null {\n if (!color) {\n return null;\n }\n\n const directHex = [\"hex\", \"rgb\", \"argb\"]\n .map((key) => color[key])\n .find((value): value is string => typeof value === \"string\" && value.trim().length > 0);\n if (directHex) {\n return normalizeHexColor(directHex);\n }\n\n const themeValue = color.theme ?? color.themeIndex;\n const numericTheme = typeof themeValue === \"number\"\n ? themeValue\n : typeof themeValue === \"string\" && themeValue.trim().length > 0\n ? Number(themeValue)\n : Number.NaN;\n const themeColor = Number.isFinite(numericTheme) ? themePalette?.colorsByIndex[numericTheme] ?? null : null;\n if (!themeColor) {\n return null;\n }\n\n const tintValue = color.tint;\n const tint = typeof tintValue === \"number\"\n ? tintValue\n : typeof tintValue === \"string\" && tintValue.trim().length > 0\n ? Number(tintValue)\n : Number.NaN;\n\n return Number.isFinite(tint) ? applyExcelTint(themeColor, tint) : themeColor;\n}\n\nexport function resolveWorkbookFillColor(\n fill: Record<string, unknown> | undefined,\n themePalette?: XlsxThemePalette | null\n): string | null {\n if (!fill) {\n return null;\n }\n\n if (fill.fillType === \"solid\") {\n return resolveWorkbookColor(\n (fill.color as Record<string, unknown> | undefined)\n ?? (fill.foreground as Record<string, unknown> | undefined)\n ?? (fill.background as Record<string, unknown> | undefined),\n themePalette\n );\n }\n\n if (fill.fillType === \"pattern\") {\n return resolveWorkbookColor(\n (fill.foreground as Record<string, unknown> | undefined)\n ?? (fill.color as Record<string, unknown> | undefined)\n ?? (fill.background as Record<string, unknown> | undefined),\n themePalette\n );\n }\n\n return null;\n}\n\nexport function resolveWorkbookFillStyle(\n fill: Record<string, unknown> | undefined,\n themePalette?: XlsxThemePalette | null\n) {\n if (!fill) {\n return {\n backgroundColor: null,\n backgroundImage: null\n };\n }\n\n if (fill.fillType === \"gradient\") {\n const rawStops = Array.isArray(fill.stops) ? fill.stops as Array<Record<string, unknown>> : [];\n const stops = rawStops\n .map((stop) => ({\n color: resolveWorkbookColor(stop.color as Record<string, unknown> | undefined, themePalette),\n position: typeof stop.position === \"number\" ? stop.position : Number(stop.position)\n }))\n .filter((stop): stop is { color: string; position: number } => Boolean(stop.color) && Number.isFinite(stop.position))\n .sort((left, right) => left.position - right.position);\n if (stops.length > 0) {\n const gradientType = typeof fill.gradientType === \"string\" ? fill.gradientType : \"linear\";\n if (gradientType === \"path\") {\n const backgroundColor = stops[stops.length - 1]?.color ?? null;\n return {\n backgroundColor,\n backgroundImage: `radial-gradient(circle at center, ${stops.map((stop) => `${stop.color} ${Math.max(0, Math.min(100, stop.position * 100))}%`).join(\", \")})`\n };\n }\n\n const degree = typeof fill.degree === \"number\" ? fill.degree : Number(fill.degree ?? 0);\n const cssAngle = Number.isFinite(degree) ? 90 - degree : 90;\n return {\n backgroundColor: stops[stops.length - 1]?.color ?? null,\n backgroundImage: `linear-gradient(${cssAngle}deg, ${stops.map((stop) => `${stop.color} ${Math.max(0, Math.min(100, stop.position * 100))}%`).join(\", \")})`\n };\n }\n }\n\n return {\n backgroundColor: resolveWorkbookFillColor(fill, themePalette),\n backgroundImage: null\n };\n}\n","import type { Worksheet } from \"@dukelib/sheets-wasm\";\n\nexport type CellGeneralAlignment = \"left\" | \"center\" | \"right\";\n\nexport function getCellGeneralAlignment(worksheet: Worksheet, row: number, col: number): CellGeneralAlignment {\n const value = worksheet.getCalculatedValueAt(row, col);\n try {\n if (value.is_number) return \"right\";\n if (value.is_boolean || value.is_error) return \"center\";\n return \"left\";\n } finally {\n value.free();\n }\n}\n","import type {\n DrawingAnchor as DukeDrawingAnchor,\n DrawingColor as DukeDrawingColor,\n DrawingRunFont as DukeDrawingRunFont,\n DrawingText as DukeDrawingText,\n FormControlDrawing as DukeFormControlDrawing,\n FormControlKind as DukeFormControlKind,\n Workbook\n} from \"@dukelib/sheets-wasm\";\nimport { strFromU8, strToU8, unzipSync, zipSync } from \"fflate\";\nimport { resolveWorkbookColor } from \"./colors\";\nimport type {\n XlsxCellAddress,\n XlsxConditionalDataBarRule,\n XlsxConditionalFormatIcon,\n XlsxConditionalFormatRule,\n XlsxConditionalFormatValueObject,\n XlsxConditionalIconSetRule,\n XlsxCellRange,\n XlsxCellStyleColorInput,\n XlsxFormControl,\n XlsxFormControlCaption,\n XlsxImage,\n XlsxImageAnchor,\n XlsxImageRect,\n XlsxImageResizeHandlePosition,\n XlsxResolvedCellStyle,\n XlsxShape,\n XlsxSparkline,\n XlsxTableStyleDefinition,\n XlsxThemePalette\n} from \"./types\";\n\nconst REL_NS = \"http://schemas.openxmlformats.org/officeDocument/2006/relationships\";\nconst PKG_REL_NS = \"http://schemas.openxmlformats.org/package/2006/relationships\";\nconst SPREADSHEET_NS = \"http://schemas.openxmlformats.org/spreadsheetml/2006/main\";\nconst CONTENT_TYPES_NS = \"http://schemas.openxmlformats.org/package/2006/content-types\";\nconst DRAWING_REL_TYPE = \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/drawing\";\nconst IMAGE_REL_TYPE = \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/image\";\nconst HYPERLINK_REL_TYPE = \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink\";\nconst DRAWING_CONTENT_TYPE = \"application/vnd.openxmlformats-officedocument.drawing+xml\";\nconst EMU_PER_PIXEL = 9525;\nconst MIN_COL_WIDTH_PX = 30;\nconst MIN_ROW_HEIGHT_PX = 16;\nconst DEFAULT_COL_WIDTH_EMU = 64 * EMU_PER_PIXEL;\nconst DEFAULT_ROW_HEIGHT_EMU = 20 * EMU_PER_PIXEL;\nconst DEFAULT_COLUMN_CHARACTER_WIDTH_PX = 7;\nconst columnCharacterWidthCache = new Map<string, number>();\ntype DukeWorksheet = ReturnType<Workbook[\"getSheet\"]>;\n\nfunction resolveDeviceGridlineThicknessPx() {\n if (typeof window === \"undefined\") {\n return 1;\n }\n\n const devicePixelRatio = window.devicePixelRatio;\n if (!Number.isFinite(devicePixelRatio) || devicePixelRatio <= 0) {\n return 1;\n }\n\n return 1 / devicePixelRatio;\n}\n\nfunction measureColumnCharacterWidthPx(fontFamily?: string | null, fontSizePt?: number | null) {\n const normalizedFamily = typeof fontFamily === \"string\" && fontFamily.trim().length > 0\n ? fontFamily.trim()\n : \"Calibri\";\n const normalizedSizePt = typeof fontSizePt === \"number\" && Number.isFinite(fontSizePt) && fontSizePt > 0\n ? fontSizePt\n : 11;\n const cacheKey = `${normalizedFamily}|${normalizedSizePt}`;\n const cached = columnCharacterWidthCache.get(cacheKey);\n if (cached !== undefined) {\n return cached;\n }\n\n const fontSizePx = normalizedSizePt * (96 / 72);\n const family = JSON.stringify(normalizedFamily);\n const fallback = normalizedFamily.toLowerCase() === \"calibri\" || normalizedFamily.toLowerCase() === \"carlito\"\n ? ', \"Carlito\", \"React XLSX Carlito\"'\n : \"\";\n const font = `${fontSizePx}px ${family}${fallback}`;\n let width = DEFAULT_COLUMN_CHARACTER_WIDTH_PX;\n\n try {\n const context = typeof document !== \"undefined\"\n ? document.createElement(\"canvas\").getContext(\"2d\")\n : typeof OffscreenCanvas !== \"undefined\"\n ? new OffscreenCanvas(32, 32).getContext(\"2d\")\n : null;\n if (context) {\n context.font = font;\n width = Math.max(1, context.measureText(\"0\").width);\n }\n } catch {\n width = DEFAULT_COLUMN_CHARACTER_WIDTH_PX;\n }\n\n columnCharacterWidthCache.set(cacheKey, width);\n return width;\n}\n\nfunction sheetColumnWidthToPixels(width: number, columnCharacterWidthPx = DEFAULT_COLUMN_CHARACTER_WIDTH_PX) {\n if (!Number.isFinite(width) || width <= 0) {\n return MIN_COL_WIDTH_PX;\n }\n\n const digitWidth = Math.max(1, columnCharacterWidthPx);\n const pixels = width < 1\n ? Math.floor(width * (digitWidth + 5) + 0.5)\n : Math.floor(((256 * width + Math.floor(128 / digitWidth)) / 256) * digitWidth);\n return Math.max(MIN_COL_WIDTH_PX, pixels);\n}\n\nexport function resolveWorksheetDefaultColumnWidthPixels(\n worksheet: DukeWorksheet,\n columnCharacterWidthPx = DEFAULT_COLUMN_CHARACTER_WIDTH_PX,\n fallbackPx = sheetColumnWidthToPixels(8.43, columnCharacterWidthPx)\n) {\n const width = typeof worksheet.defaultColumnWidth === \"number\" ? worksheet.defaultColumnWidth : Number.NaN;\n return Number.isFinite(width) && width > 0\n ? sheetColumnWidthToPixels(width, columnCharacterWidthPx)\n : fallbackPx;\n}\n\nexport function resolveWorksheetDefaultRowHeightPixels(\n worksheet: DukeWorksheet,\n fallbackPx = Math.max(MIN_ROW_HEIGHT_PX, Math.round(15 * 1.33))\n) {\n const height = typeof worksheet.defaultRowHeight === \"number\" ? worksheet.defaultRowHeight : Number.NaN;\n return Number.isFinite(height) && height > 0\n ? Math.max(MIN_ROW_HEIGHT_PX, Math.round(height * 1.33))\n : fallbackPx;\n}\n\nexport function resolveWorksheetHiddenRows(worksheet: DukeWorksheet, maxRow: number) {\n if (!Number.isFinite(maxRow) || maxRow < 0 || typeof worksheet.isRowHidden !== \"function\") {\n return [] as number[];\n }\n\n const hiddenRows: number[] = [];\n for (let row = 0; row <= maxRow; row += 1) {\n if (worksheet.isRowHidden(row)) {\n hiddenRows.push(row);\n }\n }\n return hiddenRows;\n}\n\nexport function resolveWorksheetHiddenCols(worksheet: DukeWorksheet, maxCol: number) {\n if (!Number.isFinite(maxCol) || maxCol < 0 || typeof worksheet.isColumnHidden !== \"function\") {\n return [] as number[];\n }\n\n const hiddenCols: number[] = [];\n for (let col = 0; col <= maxCol; col += 1) {\n if (worksheet.isColumnHidden(col)) {\n hiddenCols.push(col);\n }\n }\n return hiddenCols;\n}\n\nexport function resolveWorksheetMergeMetadata(worksheet: DukeWorksheet) {\n const mergeMetadata = {\n hasHorizontalMerges: false,\n hasVerticalMerges: false,\n maxHorizontalMergeEndCol: -1,\n maxVerticalMergeEndRow: -1,\n mergedRanges: [] as XlsxCellRange[]\n };\n const mergedRegions = Array.isArray(worksheet.mergedRegions) ? worksheet.mergedRegions : [];\n\n for (const rawRegion of mergedRegions) {\n let range: XlsxCellRange | null = null;\n if (typeof rawRegion === \"string\") {\n range = parseA1RangeReference(rawRegion);\n } else if (rawRegion && typeof rawRegion === \"object\") {\n const region = rawRegion as Record<string, unknown>;\n const startRow = typeof region.startRow === \"number\" ? region.startRow : Number.NaN;\n const startCol = typeof region.startCol === \"number\" ? region.startCol : Number.NaN;\n const endRow = typeof region.endRow === \"number\" ? region.endRow : Number.NaN;\n const endCol = typeof region.endCol === \"number\" ? region.endCol : Number.NaN;\n if ([startRow, startCol, endRow, endCol].every((value) => Number.isFinite(value) && value >= 0)) {\n range = {\n end: {\n col: Math.max(startCol, endCol),\n row: Math.max(startRow, endRow)\n },\n start: {\n col: Math.min(startCol, endCol),\n row: Math.min(startRow, endRow)\n }\n };\n } else if (typeof region.range === \"string\") {\n range = parseA1RangeReference(region.range);\n }\n }\n\n if (!range) {\n continue;\n }\n\n mergeMetadata.mergedRanges.push(range);\n if (range.end.col > range.start.col) {\n mergeMetadata.hasHorizontalMerges = true;\n mergeMetadata.maxHorizontalMergeEndCol = Math.max(mergeMetadata.maxHorizontalMergeEndCol, range.end.col);\n }\n if (range.end.row > range.start.row) {\n mergeMetadata.hasVerticalMerges = true;\n mergeMetadata.maxVerticalMergeEndRow = Math.max(mergeMetadata.maxVerticalMergeEndRow, range.end.row);\n }\n }\n\n return mergeMetadata;\n}\n\ntype ArchiveEntries = Record<string, Uint8Array>;\n\ntype ContentTypesState = {\n defaultEntries: Map<string, string>;\n overrideEntries: Map<string, string>;\n};\n\ntype RelationshipRecord = {\n id: string;\n target: string;\n targetMode: string | null;\n type: string;\n};\n\ntype WorkbookSheetInfo = {\n name: string;\n path: string;\n};\n\ntype WorkbookSheetState = {\n cellStyleIds: Record<string, number>;\n autoFilterRanges: XlsxCellRange[];\n cachedFormulaValues: Record<string, string>;\n columnWidthCharacterWidthPx?: number;\n colWidthOverridesPx: Record<number, number>;\n colStyleIds: Record<number, number>;\n conditionalFormatRules: XlsxConditionalFormatRule[];\n defaultColWidthPx: number;\n defaultRowHeightPx: number;\n hasHorizontalMerges: boolean;\n hasVerticalMerges: boolean;\n maxHorizontalMergeEndCol: number;\n maxVerticalMergeEndRow: number;\n maxContentCol: number;\n maxContentRow: number;\n minContentCol: number;\n minContentRow: number;\n hiddenCols: number[];\n hiddenRows: number[];\n rowHeightOverridesPx: Record<number, number>;\n rowStyleIds: Record<number, number>;\n showGridLines: boolean;\n sparklines: XlsxSparkline[];\n zoomScale: number;\n};\n\ntype ParseWorkbookStructureOptions = {\n includeCachedFormulaValues?: boolean;\n themePalette?: XlsxThemePalette | null;\n};\n\ntype ThemeState = {\n colors: Map<string, string>;\n majorLatinFont: string | null;\n minorLatinFont: string | null;\n};\n\ntype DrawingColor = {\n color: string;\n opacity: number;\n};\n\ntype DrawingRectEmu = {\n cx: number;\n cy: number;\n x: number;\n y: number;\n};\n\ntype ShapeVectorPath = {\n path: string;\n viewBox: {\n height: number;\n width: number;\n };\n};\n\ntype GroupTransform = {\n chCx: number;\n chCy: number;\n chX: number;\n chY: number;\n cx: number;\n cy: number;\n scaleX: number;\n scaleY: number;\n x: number;\n y: number;\n};\n\ntype XlsxImageAttachment = {\n drawingPath: string;\n drawingRelsPath: string | null;\n mediaPaths: string[];\n};\n\ntype WorkbookImageOrigin = {\n anchorIndex: number;\n drawingPath: string;\n picturePath: number[];\n workbookSheetIndex: number;\n};\n\nexport type WorkbookImageSheetOrigin = {\n attachments: XlsxImageAttachment[];\n workbookSheetIndex: number;\n};\n\nexport type WorkbookTableMetadata = {\n displayName?: string;\n headerRowCount?: number;\n headerRowCellStyle?: string;\n name?: string;\n reference?: string;\n totalsRowCount?: number;\n totalsRowShown?: boolean;\n};\n\nexport type WorkbookImageAssets = {\n archive: ArchiveEntries;\n dirtyArchivePaths: Set<string>;\n formControlsByWorkbookSheetIndex: XlsxFormControl[][];\n imageOriginsById: Map<string, WorkbookImageOrigin>;\n imagesByWorkbookSheetIndex: XlsxImage[][];\n namedCellStyleByName: Record<string, XlsxResolvedCellStyle>;\n objectUrls: string[];\n shapesByWorkbookSheetIndex: XlsxShape[][];\n sheetStatesByWorkbookSheetIndex: Array<WorkbookSheetState | null>;\n sheetOrigins: Array<WorkbookImageSheetOrigin | null>;\n styleById: Record<number, XlsxResolvedCellStyle>;\n tableMetadataByWorkbookSheetIndex: WorkbookTableMetadata[][];\n tableStyleByName: Record<string, XlsxTableStyleDefinition>;\n themePalette: XlsxThemePalette;\n};\n\nexport type WorkbookStructureAssets = Pick<\n WorkbookImageAssets,\n | \"namedCellStyleByName\"\n | \"sheetStatesByWorkbookSheetIndex\"\n | \"styleById\"\n | \"tableMetadataByWorkbookSheetIndex\"\n | \"tableStyleByName\"\n | \"themePalette\"\n>;\n\nexport type WorkbookChartStyleAssets = Pick<\n WorkbookImageAssets,\n | \"archive\"\n | \"sheetOrigins\"\n | \"themePalette\"\n>;\n\nfunction buildThemePalette(theme: ThemeState): XlsxThemePalette {\n const themeOrder = [\"lt1\", \"dk1\", \"lt2\", \"dk2\", \"accent1\", \"accent2\", \"accent3\", \"accent4\", \"accent5\", \"accent6\", \"hlink\", \"folHlink\"];\n const colorsByIndex: Record<number, string> = {};\n\n themeOrder.forEach((key, index) => {\n const color = theme.colors.get(key);\n if (color) {\n colorsByIndex[index] = color;\n }\n });\n\n return {\n colorsByIndex,\n majorLatinFont: theme.majorLatinFont ?? undefined,\n minorLatinFont: theme.minorLatinFont ?? undefined\n };\n}\n\nfunction cloneBytes(bytes: Uint8Array) {\n const nextBytes = new Uint8Array(bytes.byteLength);\n nextBytes.set(bytes);\n return nextBytes;\n}\n\nfunction normalizeArchivePath(path: string) {\n return path.replace(/\\\\/g, \"/\").replace(/^\\/+/, \"\");\n}\n\nfunction joinArchivePath(...parts: string[]) {\n return normalizeArchivePath(parts.join(\"/\"));\n}\n\nfunction dirname(path: string) {\n const normalized = normalizeArchivePath(path);\n const lastSlash = normalized.lastIndexOf(\"/\");\n return lastSlash >= 0 ? normalized.slice(0, lastSlash) : \"\";\n}\n\nfunction resolveArchiveTarget(baseDocumentPath: string, target: string) {\n if (!target) {\n return normalizeArchivePath(baseDocumentPath);\n }\n\n if (target.startsWith(\"#\")) {\n return target;\n }\n\n if (target.startsWith(\"/\")) {\n return normalizeArchivePath(target);\n }\n\n const baseParts = dirname(baseDocumentPath).split(\"/\").filter(Boolean);\n for (const segment of target.split(\"/\")) {\n if (!segment || segment === \".\") {\n continue;\n }\n if (segment === \"..\") {\n baseParts.pop();\n continue;\n }\n baseParts.push(segment);\n }\n\n return normalizeArchivePath(baseParts.join(\"/\"));\n}\n\nfunction relativeArchivePath(fromDocumentPath: string, toPath: string) {\n const fromParts = dirname(fromDocumentPath).split(\"/\").filter(Boolean);\n const toParts = normalizeArchivePath(toPath).split(\"/\").filter(Boolean);\n let shared = 0;\n while (shared < fromParts.length && shared < toParts.length && fromParts[shared] === toParts[shared]) {\n shared += 1;\n }\n\n const upSegments = fromParts.slice(shared).map(() => \"..\");\n const downSegments = toParts.slice(shared);\n return [...upSegments, ...downSegments].join(\"/\") || \".\";\n}\n\nfunction relsPathForDocument(documentPath: string) {\n const baseName = documentPath.split(\"/\").pop();\n const parentDir = dirname(documentPath);\n return joinArchivePath(parentDir, \"_rels\", `${baseName}.rels`);\n}\n\nfunction parseXml(xml: string) {\n const parser = new DOMParser();\n const document = parser.parseFromString(xml, \"application/xml\");\n if (document.querySelector(\"parsererror\")) {\n return null;\n }\n return document;\n}\n\nfunction serializeXml(document: XMLDocument) {\n return new XMLSerializer().serializeToString(document);\n}\n\nfunction readArchiveText(archive: ArchiveEntries, path: string) {\n const entry = archive[path];\n return entry ? strFromU8(entry) : null;\n}\n\nfunction parseColumnReference(reference: string) {\n let value = 0;\n for (const character of reference.toUpperCase()) {\n if (character < \"A\" || character > \"Z\") {\n return null;\n }\n value = value * 26 + (character.charCodeAt(0) - 64);\n }\n return value > 0 ? value - 1 : null;\n}\n\nfunction parseA1CellReference(reference: string) {\n const match = /^\\$?([A-Za-z]+)\\$?(\\d+)$/.exec(reference.trim());\n if (!match) {\n return null;\n }\n\n const col = parseColumnReference(match[1] ?? \"\");\n const row = Number(match[2] ?? Number.NaN) - 1;\n if (col === null || !Number.isFinite(row) || row < 0) {\n return null;\n }\n\n return { col, row };\n}\n\nfunction parseA1RangeReference(reference: string) {\n const [startRef, endRef] = reference.split(\":\");\n const start = parseA1CellReference(startRef ?? \"\");\n const end = parseA1CellReference(endRef ?? startRef ?? \"\");\n return start && end ? { end, start } : null;\n}\n\nfunction stripSheetNameFromFormulaReference(reference: string) {\n const trimmed = reference.trim();\n const bangIndex = trimmed.lastIndexOf(\"!\");\n return bangIndex >= 0 ? trimmed.slice(bangIndex + 1) : trimmed;\n}\n\nfunction parseFormulaCellReference(reference: string) {\n const normalized = stripSheetNameFromFormulaReference(reference).split(/\\s+/)[0] ?? \"\";\n return parseA1CellReference(normalized);\n}\n\nfunction parseFormulaRangeReference(reference: string) {\n return parseA1RangeReference(stripSheetNameFromFormulaReference(reference));\n}\n\nfunction isElementNode(node: Node | null | undefined): node is Element {\n return Boolean(node && node.nodeType === 1);\n}\n\nfunction getLocalElements(parent: Document | Element, localName: string) {\n return Array.from(parent.getElementsByTagName(\"*\")).filter((node): node is Element => isElementNode(node) && node.localName === localName);\n}\n\nfunction getChildElements(parent: Element, localName: string) {\n return Array.from(parent.childNodes).filter((node): node is Element => isElementNode(node) && node.localName === localName);\n}\n\nfunction getFirstChild(parent: Element, localName: string) {\n return getChildElements(parent, localName)[0] ?? null;\n}\n\nfunction getFirstDescendant(parent: Document | Element, localName: string) {\n return getLocalElements(parent, localName)[0] ?? null;\n}\n\nfunction readFeaturePropertyBagCheckboxComplements(archive: ArchiveEntries) {\n const xml = readArchiveText(archive, \"xl/featurePropertyBag/featurePropertyBag.xml\");\n if (!xml) {\n return new Set<number>();\n }\n\n const document = parseXml(xml);\n if (!document?.documentElement) {\n return new Set<number>();\n }\n\n const bagNodes = getChildElements(document.documentElement, \"bag\");\n const bagTypeById = bagNodes.map((node) => node.getAttribute(\"type\") ?? \"\");\n const checkboxComplementIndices = new Set<number>();\n\n const xfComplementsBag = bagNodes.find((node) => node.getAttribute(\"type\") === \"XFComplements\") ?? null;\n const mappedBagIds = xfComplementsBag\n ? getLocalElements(xfComplementsBag, \"bagId\")\n .map((node) => Number(node.textContent ?? Number.NaN))\n .filter((value) => Number.isFinite(value))\n : [];\n\n mappedBagIds.forEach((bagId, complementIndex) => {\n const xfComplementBag = bagNodes[bagId];\n if (!xfComplementBag || bagTypeById[bagId] !== \"XFComplement\") {\n return;\n }\n\n const xfControlsBagId = getLocalElements(xfComplementBag, \"bagId\")\n .map((node) => Number(node.textContent ?? Number.NaN))\n .find((value) => Number.isFinite(value));\n if (xfControlsBagId === undefined) {\n return;\n }\n\n const xfControlsBag = bagNodes[xfControlsBagId];\n if (!xfControlsBag || bagTypeById[xfControlsBagId] !== \"XFControls\") {\n return;\n }\n\n const cellControlBagId = getLocalElements(xfControlsBag, \"bagId\")\n .map((node) => Number(node.textContent ?? Number.NaN))\n .find((value) => Number.isFinite(value));\n if (cellControlBagId === undefined) {\n return;\n }\n\n if (bagTypeById[cellControlBagId] === \"Checkbox\") {\n checkboxComplementIndices.add(complementIndex);\n }\n });\n\n return checkboxComplementIndices;\n}\n\nfunction getRelationshipId(element: Element) {\n return element.getAttributeNS(REL_NS, \"id\") ?? element.getAttribute(\"r:id\") ?? element.getAttribute(\"id\");\n}\n\nfunction getEmbeddedRelationshipId(element: Element) {\n return element.getAttributeNS(REL_NS, \"embed\") ?? element.getAttribute(\"r:embed\") ?? element.getAttribute(\"embed\");\n}\n\nfunction setChildText(parent: Element, localName: string, value: string) {\n const child = getFirstChild(parent, localName);\n if (child) {\n child.textContent = value;\n }\n}\n\nfunction updateMarkerElement(element: Element | null, marker: { col: number; colOffsetEmu: number; row: number; rowOffsetEmu: number }) {\n if (!element) {\n return;\n }\n\n setChildText(element, \"col\", String(Math.max(0, marker.col)));\n setChildText(element, \"colOff\", String(Math.max(0, Math.round(marker.colOffsetEmu))));\n setChildText(element, \"row\", String(Math.max(0, marker.row)));\n setChildText(element, \"rowOff\", String(Math.max(0, Math.round(marker.rowOffsetEmu))));\n}\n\nfunction parseContentTypes(archive: ArchiveEntries): ContentTypesState {\n const xml = readArchiveText(archive, \"[Content_Types].xml\");\n const defaultEntries = new Map<string, string>();\n const overrideEntries = new Map<string, string>();\n if (!xml) {\n return { defaultEntries, overrideEntries };\n }\n\n const document = parseXml(xml);\n if (!document) {\n return { defaultEntries, overrideEntries };\n }\n\n for (const defaultNode of getLocalElements(document, \"Default\")) {\n const extension = defaultNode.getAttribute(\"Extension\");\n const contentType = defaultNode.getAttribute(\"ContentType\");\n if (extension && contentType) {\n defaultEntries.set(extension.toLowerCase(), contentType);\n }\n }\n\n for (const overrideNode of getLocalElements(document, \"Override\")) {\n const partName = overrideNode.getAttribute(\"PartName\");\n const contentType = overrideNode.getAttribute(\"ContentType\");\n if (partName && contentType) {\n overrideEntries.set(normalizeArchivePath(partName), contentType);\n }\n }\n\n return { defaultEntries, overrideEntries };\n}\n\nfunction resolveContentType(contentTypes: ContentTypesState, path: string) {\n const normalized = normalizeArchivePath(path);\n const override = contentTypes.overrideEntries.get(normalized);\n if (override) {\n return override;\n }\n\n const extension = normalized.split(\".\").pop()?.toLowerCase();\n if (!extension) {\n return \"application/octet-stream\";\n }\n\n return contentTypes.defaultEntries.get(extension) ?? \"application/octet-stream\";\n}\n\nfunction parseRelationships(archive: ArchiveEntries, relsPath: string, baseDocumentPath: string) {\n const xml = readArchiveText(archive, relsPath);\n const relationships = new Map<string, RelationshipRecord>();\n if (!xml) {\n return relationships;\n }\n\n const document = parseXml(xml);\n if (!document) {\n return relationships;\n }\n\n for (const relationshipNode of getLocalElements(document, \"Relationship\")) {\n const id = relationshipNode.getAttribute(\"Id\");\n const target = relationshipNode.getAttribute(\"Target\");\n const type = relationshipNode.getAttribute(\"Type\");\n if (!id || !target || !type) {\n continue;\n }\n\n relationships.set(id, {\n id,\n target: resolveArchiveTarget(baseDocumentPath, target),\n targetMode: relationshipNode.getAttribute(\"TargetMode\"),\n type\n });\n }\n\n return relationships;\n}\n\nfunction parseWorkbookSheets(archive: ArchiveEntries) {\n const workbookXml = readArchiveText(archive, \"xl/workbook.xml\");\n if (!workbookXml) {\n return [];\n }\n\n const workbookDocument = parseXml(workbookXml);\n if (!workbookDocument) {\n return [];\n }\n\n const workbookRelationships = parseRelationships(archive, \"xl/_rels/workbook.xml.rels\", \"xl/workbook.xml\");\n const sheets: WorkbookSheetInfo[] = [];\n\n for (const sheetNode of getLocalElements(workbookDocument, \"sheet\")) {\n const relationshipId = getRelationshipId(sheetNode);\n if (!relationshipId) {\n continue;\n }\n\n const relationship = workbookRelationships.get(relationshipId);\n if (!relationship) {\n continue;\n }\n\n sheets.push({\n name: sheetNode.getAttribute(\"name\") ?? `Sheet ${sheets.length + 1}`,\n path: relationship.target\n });\n }\n\n return sheets;\n}\n\nfunction parseWorkbookTheme(archive: ArchiveEntries): ThemeState {\n const defaultTheme: ThemeState = {\n colors: new Map([\n [\"accent1\", \"#5b9bd5\"],\n [\"accent2\", \"#ed7d31\"],\n [\"accent3\", \"#a5a5a5\"],\n [\"accent4\", \"#ffc000\"],\n [\"accent5\", \"#4472c4\"],\n [\"accent6\", \"#70ad47\"],\n [\"bg1\", \"#ffffff\"],\n [\"bg2\", \"#e7e6e6\"],\n [\"dk1\", \"#000000\"],\n [\"dk2\", \"#6e747a\"],\n [\"folHlink\", \"#993366\"],\n [\"hlink\", \"#085296\"],\n [\"lt1\", \"#ffffff\"],\n [\"lt2\", \"#e7e6e6\"],\n [\"tx1\", \"#000000\"],\n [\"tx2\", \"#6e747a\"]\n ]),\n majorLatinFont: null,\n minorLatinFont: null\n };\n\n const themeXml = readArchiveText(archive, \"xl/theme/theme1.xml\");\n if (!themeXml) {\n return defaultTheme;\n }\n\n const themeDocument = parseXml(themeXml);\n if (!themeDocument) {\n return defaultTheme;\n }\n\n const colors = new Map(defaultTheme.colors);\n const colorSchemeNode = getLocalElements(themeDocument, \"clrScheme\")[0] ?? null;\n if (colorSchemeNode) {\n for (const colorNode of Array.from(colorSchemeNode.childNodes).filter(isElementNode)) {\n const key = colorNode.localName;\n const srgbNode = getFirstChild(colorNode, \"srgbClr\");\n const sysNode = getFirstChild(colorNode, \"sysClr\");\n const hex = srgbNode?.getAttribute(\"val\") ?? sysNode?.getAttribute(\"lastClr\");\n if (hex) {\n colors.set(key, normalizeHexColor(hex));\n }\n }\n }\n\n const fontSchemeNode = getLocalElements(themeDocument, \"fontScheme\")[0] ?? null;\n const majorLatinFont = getFirstChild(getFirstChild(fontSchemeNode, \"majorFont\"), \"latin\")?.getAttribute(\"typeface\") ?? null;\n const minorLatinFont = getFirstChild(getFirstChild(fontSchemeNode, \"minorFont\"), \"latin\")?.getAttribute(\"typeface\") ?? null;\n\n colors.set(\"bg1\", colors.get(\"lt1\") ?? defaultTheme.colors.get(\"bg1\") ?? \"#ffffff\");\n colors.set(\"tx1\", colors.get(\"dk1\") ?? defaultTheme.colors.get(\"tx1\") ?? \"#000000\");\n colors.set(\"bg2\", colors.get(\"lt2\") ?? defaultTheme.colors.get(\"bg2\") ?? \"#e7e6e6\");\n colors.set(\"tx2\", colors.get(\"dk2\") ?? defaultTheme.colors.get(\"tx2\") ?? \"#6e747a\");\n\n return {\n colors,\n majorLatinFont,\n minorLatinFont\n };\n}\n\nfunction parseSpreadsheetColor(node: Element | null) {\n if (!node) {\n return undefined;\n }\n\n const color: Record<string, unknown> = {};\n const rgb = node.getAttribute(\"rgb\");\n const theme = node.getAttribute(\"theme\");\n const tint = node.getAttribute(\"tint\");\n const indexed = node.getAttribute(\"indexed\");\n if (rgb) {\n color.rgb = normalizeHexColor(rgb);\n }\n if (theme !== null) {\n color.theme = Number(theme);\n }\n if (tint !== null) {\n color.tint = Number(tint);\n }\n if (indexed !== null) {\n color.indexed = Number(indexed);\n }\n\n return Object.keys(color).length > 0 ? color : undefined;\n}\n\nfunction hasEnabledSpreadsheetFlag(node: Element | null) {\n if (!node) {\n return false;\n }\n\n const value = node.getAttribute(\"val\");\n return value === null || (value !== \"0\" && value !== \"false\");\n}\n\nfunction parseSheetSparklines(\n document: XMLDocument,\n themePalette?: XlsxThemePalette | null\n) {\n const sparklines: XlsxSparkline[] = [];\n\n for (const groupNode of getLocalElements(document, \"sparklineGroup\")) {\n const rawType = groupNode.getAttribute(\"type\");\n const sparklineType: XlsxSparkline[\"type\"] = rawType === \"column\"\n ? \"column\"\n : rawType === \"stacked\"\n ? \"winLoss\"\n : \"line\";\n\n const markersNode = getFirstChild(groupNode, \"markers\");\n const negativeNode = getFirstChild(groupNode, \"negative\");\n const colorSeries = resolveWorkbookColor(parseSpreadsheetColor(getFirstChild(groupNode, \"colorSeries\")), themePalette);\n const colorNegative = resolveWorkbookColor(parseSpreadsheetColor(getFirstChild(groupNode, \"colorNegative\")), themePalette);\n const colorMarkers = resolveWorkbookColor(parseSpreadsheetColor(getFirstChild(groupNode, \"colorMarkers\")), themePalette);\n const colorFirst = resolveWorkbookColor(parseSpreadsheetColor(getFirstChild(groupNode, \"colorFirst\")), themePalette);\n const colorLast = resolveWorkbookColor(parseSpreadsheetColor(getFirstChild(groupNode, \"colorLast\")), themePalette);\n const colorHigh = resolveWorkbookColor(parseSpreadsheetColor(getFirstChild(groupNode, \"colorHigh\")), themePalette);\n const colorLow = resolveWorkbookColor(parseSpreadsheetColor(getFirstChild(groupNode, \"colorLow\")), themePalette);\n const sparklineCollectionNode = getFirstChild(groupNode, \"sparklines\");\n if (!sparklineCollectionNode) {\n continue;\n }\n\n for (const sparklineNode of getChildElements(sparklineCollectionNode, \"sparkline\")) {\n const formula = getFirstChild(sparklineNode, \"f\")?.textContent ?? \"\";\n const targetReference = getFirstChild(sparklineNode, \"sqref\")?.textContent ?? \"\";\n const range = parseFormulaRangeReference(formula);\n const target = parseFormulaCellReference(targetReference);\n if (!range || !target) {\n continue;\n }\n\n sparklines.push({\n color: colorSeries ?? undefined,\n firstColor: colorFirst ?? undefined,\n highColor: colorHigh ?? undefined,\n lastColor: colorLast ?? undefined,\n lowColor: colorLow ?? undefined,\n markerColor: colorMarkers ?? undefined,\n markers: hasEnabledSpreadsheetFlag(markersNode),\n negative: hasEnabledSpreadsheetFlag(negativeNode),\n negativeColor: colorNegative ?? undefined,\n range,\n target,\n type: sparklineType\n });\n }\n }\n\n return sparklines;\n}\n\nfunction parseSpreadsheetFont(node: Element | null): XlsxResolvedCellStyle[\"font\"] {\n if (!node) {\n return undefined;\n }\n\n const font: Record<string, unknown> = {};\n for (const [tag, property] of [[\"b\", \"bold\"], [\"i\", \"italic\"], [\"strike\", \"strikethrough\"]]) {\n const flag = getFirstChild(node, tag);\n if (flag) {\n font[property] = hasEnabledSpreadsheetFlag(flag);\n }\n }\n const size = getFirstChild(node, \"sz\")?.getAttribute(\"val\");\n const name = getFirstChild(node, \"name\")?.getAttribute(\"val\");\n const family = getFirstChild(node, \"family\")?.getAttribute(\"val\");\n const scheme = getFirstChild(node, \"scheme\")?.getAttribute(\"val\");\n const charset = getFirstChild(node, \"charset\")?.getAttribute(\"val\");\n const verticalAlign = getFirstChild(node, \"vertAlign\")?.getAttribute(\"val\");\n const color = parseSpreadsheetColor(getFirstChild(node, \"color\"));\n if (getFirstChild(node, \"u\")) {\n font.underline = getFirstChild(node, \"u\")?.getAttribute(\"val\") ?? \"single\";\n }\n if (size !== null && size !== undefined) {\n font.size = Number(size);\n }\n if (name) {\n font.name = name;\n }\n if (family !== null && family !== undefined) {\n font.family = Number(family);\n }\n if (scheme) {\n font.scheme = scheme;\n }\n if (charset !== null && charset !== undefined) {\n font.charset = Number(charset);\n }\n if (verticalAlign) {\n font.verticalAlign = verticalAlign;\n }\n if (hasEnabledSpreadsheetFlag(getFirstChild(node, \"shadow\"))) {\n font.shadow = true;\n }\n if (hasEnabledSpreadsheetFlag(getFirstChild(node, \"outline\"))) {\n font.outline = true;\n }\n if (hasEnabledSpreadsheetFlag(getFirstChild(node, \"condense\"))) {\n font.condense = true;\n }\n if (hasEnabledSpreadsheetFlag(getFirstChild(node, \"extend\"))) {\n font.extend = true;\n }\n if (color) {\n font.color = color;\n }\n\n return Object.keys(font).length > 0 ? font : undefined;\n}\n\nfunction parseSpreadsheetFill(node: Element | null): XlsxResolvedCellStyle[\"fill\"] {\n if (!node) {\n return undefined;\n }\n\n const gradientFill = getFirstChild(node, \"gradientFill\");\n if (gradientFill) {\n const stops = Array.from(gradientFill.childNodes)\n .filter(isElementNode)\n .filter((child) => child.localName === \"stop\")\n .map((stopNode) => ({\n color: parseSpreadsheetColor(Array.from(stopNode.childNodes).find(isElementNode) ?? null),\n position: Number(stopNode.getAttribute(\"position\") ?? Number.NaN)\n }))\n .filter((stop) => stop.color && Number.isFinite(stop.position));\n if (stops.length > 0) {\n return {\n degree: Number(gradientFill.getAttribute(\"degree\") ?? 0),\n fillType: \"gradient\",\n gradientType: gradientFill.getAttribute(\"type\") ?? \"linear\",\n stops\n };\n }\n }\n\n const patternFill = getFirstChild(node, \"patternFill\");\n if (!patternFill) {\n return undefined;\n }\n\n const patternType = patternFill.getAttribute(\"patternType\") ?? \"none\";\n const foreground = parseSpreadsheetColor(getFirstChild(patternFill, \"fgColor\"));\n const background = parseSpreadsheetColor(getFirstChild(patternFill, \"bgColor\"));\n const solidColor = foreground ?? background;\n if (patternType === \"solid\" && solidColor) {\n return {\n color: solidColor,\n fillType: \"solid\"\n };\n }\n // Differential table styles sometimes omit patternType and only set bgColor.\n // Preserve those fills so header/table overrides are not dropped during import.\n if ((patternType === \"none\" || patternType === \"gray125\") && (foreground || background)) {\n return {\n background,\n fillType: \"pattern\",\n foreground,\n patternType\n };\n }\n if (patternType !== \"none\" && patternType !== \"gray125\" && (foreground || background)) {\n return {\n background,\n fillType: \"pattern\",\n foreground,\n patternType\n };\n }\n\n return undefined;\n}\n\nfunction parseSpreadsheetBorderEdge(node: Element | null) {\n if (!node) {\n return undefined;\n }\n\n const style = node.getAttribute(\"style\");\n const color = parseSpreadsheetColor(getFirstChild(node, \"color\"));\n if (!style || style === \"none\") {\n return undefined;\n }\n\n return {\n color,\n style\n };\n}\n\nfunction parseSpreadsheetBorder(node: Element | null): XlsxResolvedCellStyle[\"border\"] {\n if (!node) {\n return undefined;\n }\n\n const border: Record<string, Record<string, unknown>> = {};\n ([\"top\", \"right\", \"bottom\", \"left\", \"horizontal\", \"vertical\"] as const).forEach((edge) => {\n const parsedEdge = parseSpreadsheetBorderEdge(getFirstChild(node, edge));\n if (parsedEdge) {\n border[edge] = parsedEdge;\n }\n });\n\n return Object.keys(border).length > 0 ? border : undefined;\n}\n\nfunction parseSpreadsheetAlignment(node: Element | null): XlsxResolvedCellStyle[\"alignment\"] {\n if (!node) {\n return undefined;\n }\n\n const alignment: Record<string, unknown> = {};\n const horizontal = node.getAttribute(\"horizontal\");\n const vertical = node.getAttribute(\"vertical\");\n const wrapText = node.getAttribute(\"wrapText\");\n const indent = node.getAttribute(\"indent\");\n const shrinkToFit = node.getAttribute(\"shrinkToFit\");\n const textRotation = node.getAttribute(\"textRotation\");\n if (horizontal) {\n alignment.horizontal = horizontal;\n }\n if (vertical) {\n alignment.vertical = vertical;\n }\n if (wrapText !== null) {\n alignment.wrapText = wrapText === \"1\";\n }\n if (shrinkToFit !== null) {\n alignment.shrinkToFit = shrinkToFit === \"1\";\n }\n if (indent !== null) {\n alignment.indent = Number(indent);\n }\n if (textRotation !== null) {\n const parsedRotation = Number(textRotation);\n if (Number.isFinite(parsedRotation)) {\n alignment.rotation = parsedRotation;\n }\n }\n\n return Object.keys(alignment).length > 0 ? alignment : undefined;\n}\n\nfunction parseDifferentialStyle(node: Element | null): XlsxResolvedCellStyle {\n if (!node) {\n return {};\n }\n\n const style: XlsxResolvedCellStyle = {};\n const font = parseSpreadsheetFont(getFirstChild(node, \"font\"));\n const fill = parseSpreadsheetFill(getFirstChild(node, \"fill\"));\n const border = parseSpreadsheetBorder(getFirstChild(node, \"border\"));\n const alignment = parseSpreadsheetAlignment(getFirstChild(node, \"alignment\"));\n\n if (font) {\n style.font = font;\n }\n if (fill) {\n style.fill = fill;\n }\n if (border) {\n style.border = border;\n }\n if (alignment) {\n style.alignment = alignment;\n }\n\n return style;\n}\n\nfunction parseResolvedXfStyle(\n xfNode: Element,\n fonts: Array<XlsxResolvedCellStyle[\"font\"]>,\n fills: Array<XlsxResolvedCellStyle[\"fill\"]>,\n borders: Array<XlsxResolvedCellStyle[\"border\"]>,\n checkboxComplementIndices?: Set<number>\n) {\n const style: XlsxResolvedCellStyle = {};\n const fontId = Number(xfNode.getAttribute(\"fontId\") ?? Number.NaN);\n const fillId = Number(xfNode.getAttribute(\"fillId\") ?? Number.NaN);\n const borderId = Number(xfNode.getAttribute(\"borderId\") ?? Number.NaN);\n const alignment = parseSpreadsheetAlignment(getFirstChild(xfNode, \"alignment\"));\n\n if (Number.isFinite(fontId) && fonts[fontId]) {\n style.font = fonts[fontId];\n }\n if (Number.isFinite(fillId) && fills[fillId]) {\n style.fill = fills[fillId];\n }\n if (Number.isFinite(borderId) && borders[borderId]) {\n style.border = borders[borderId];\n }\n if (alignment) {\n style.alignment = alignment;\n }\n const xfComplementNode = getFirstDescendant(xfNode, \"xfComplement\");\n const xfComplementIndex = Number(xfComplementNode?.getAttribute(\"i\") ?? Number.NaN);\n if (Number.isFinite(xfComplementIndex) && checkboxComplementIndices?.has(xfComplementIndex)) {\n style.cellControl = { kind: \"checkbox\" };\n }\n\n return style;\n}\n\nfunction parseWorkbookStyles(archive: ArchiveEntries) {\n const xml = readArchiveText(archive, \"xl/styles.xml\");\n if (!xml) {\n return {\n differentialStyles: [] as XlsxResolvedCellStyle[],\n defaultFont: null,\n namedCellStyleByName: {},\n styleById: {},\n tableStyleByName: {}\n };\n }\n\n const document = parseXml(xml);\n if (!document) {\n return {\n differentialStyles: [] as XlsxResolvedCellStyle[],\n defaultFont: null,\n namedCellStyleByName: {},\n styleById: {},\n tableStyleByName: {}\n };\n }\n\n const fontsNode = getFirstDescendant(document, \"fonts\");\n const fillsNode = getFirstDescendant(document, \"fills\");\n const bordersNode = getFirstDescendant(document, \"borders\");\n const cellStyleXfsNode = getFirstDescendant(document, \"cellStyleXfs\");\n const cellStylesNode = getFirstDescendant(document, \"cellStyles\");\n const cellXfsNode = getFirstDescendant(document, \"cellXfs\");\n const dxfsNode = getFirstDescendant(document, \"dxfs\");\n const tableStylesNode = getFirstDescendant(document, \"tableStyles\");\n if (!cellXfsNode) {\n return {\n differentialStyles: [] as XlsxResolvedCellStyle[],\n defaultFont: null,\n namedCellStyleByName: {},\n styleById: {},\n tableStyleByName: {}\n };\n }\n\n const checkboxComplementIndices = readFeaturePropertyBagCheckboxComplements(archive);\n const fonts = getChildElements(fontsNode ?? document.documentElement, \"font\").map((node) => parseSpreadsheetFont(node));\n const fills = getChildElements(fillsNode ?? document.documentElement, \"fill\").map((node) => parseSpreadsheetFill(node));\n const borders = getChildElements(bordersNode ?? document.documentElement, \"border\").map((node) => parseSpreadsheetBorder(node));\n const differentialStyles = getChildElements(dxfsNode ?? document.documentElement, \"dxf\").map((node) => parseDifferentialStyle(node));\n const cellStyleXfs = getChildElements(cellStyleXfsNode ?? document.documentElement, \"xf\").map(\n (node) => parseResolvedXfStyle(node, fonts, fills, borders, checkboxComplementIndices)\n );\n const namedCellStyleByName: Record<string, XlsxResolvedCellStyle> = {};\n const styleById: Record<number, XlsxResolvedCellStyle> = {};\n const tableStyleByName: Record<string, XlsxTableStyleDefinition> = {};\n\n getChildElements(cellXfsNode, \"xf\").forEach((xfNode, index) => {\n const style = parseResolvedXfStyle(xfNode, fonts, fills, borders, checkboxComplementIndices);\n const overrides: XlsxResolvedCellStyle = {};\n for (const component of [\"font\", \"fill\", \"border\"] as const) {\n if (Number(xfNode.getAttribute(`${component}Id`) ?? 0) > 0\n && xfNode.getAttribute(`apply${component[0].toUpperCase()}${component.slice(1)}`) !== \"0\") {\n Object.assign(overrides, { [component]: style[component] });\n }\n }\n styleById[index] = { ...style, tableStyleOverrides: overrides };\n });\n\n getChildElements(cellStylesNode ?? document.documentElement, \"cellStyle\").forEach((cellStyleNode) => {\n const name = cellStyleNode.getAttribute(\"name\");\n const xfId = Number(cellStyleNode.getAttribute(\"xfId\") ?? Number.NaN);\n if (!name || !Number.isFinite(xfId)) {\n return;\n }\n\n const resolvedStyle = cellStyleXfs[xfId];\n if (resolvedStyle) {\n namedCellStyleByName[name] = resolvedStyle;\n }\n });\n\n getChildElements(tableStylesNode ?? document.documentElement, \"tableStyle\").forEach((tableStyleNode) => {\n const name = tableStyleNode.getAttribute(\"name\");\n if (!name) {\n return;\n }\n\n const elements: XlsxTableStyleDefinition = {};\n getChildElements(tableStyleNode, \"tableStyleElement\").forEach((elementNode) => {\n const type = elementNode.getAttribute(\"type\");\n const dxfId = Number(elementNode.getAttribute(\"dxfId\") ?? Number.NaN);\n if (!type || !Number.isFinite(dxfId)) {\n return;\n }\n\n const differentialStyle = differentialStyles[dxfId];\n if (differentialStyle) {\n elements[type] = differentialStyle;\n }\n });\n tableStyleByName[name] = elements;\n });\n\n const normalFont = (namedCellStyleByName.Normal?.font ?? styleById[0]?.font ?? fonts[0]) as Record<string, unknown> | undefined;\n const defaultFont = normalFont ? {\n family: typeof normalFont.name === \"string\" ? normalFont.name : undefined,\n sizePt: typeof normalFont.size === \"number\" ? normalFont.size : undefined\n } : null;\n\n return {\n differentialStyles,\n defaultFont,\n namedCellStyleByName,\n styleById,\n tableStyleByName\n };\n}\n\nfunction parseSqrefRanges(sqref: string | null | undefined): XlsxCellRange[] {\n if (!sqref) {\n return [];\n }\n\n return sqref\n .trim()\n .split(/\\s+/)\n .flatMap((reference) => {\n const range = parseA1RangeReference(reference);\n return range ? [range] : [];\n });\n}\n\nfunction parseConditionalFormatValueObject(node: Element | null): XlsxConditionalFormatValueObject | null {\n if (!node) {\n return null;\n }\n\n const type = node.getAttribute(\"type\");\n if (!type) {\n return null;\n }\n\n const rawValue = node.getAttribute(\"val\") ?? getFirstChild(node, \"f\")?.textContent ?? undefined;\n const numericValue = rawValue !== undefined ? Number(rawValue) : Number.NaN;\n return {\n type,\n value: Number.isFinite(numericValue) ? numericValue : undefined\n };\n}\n\nfunction parseSpreadsheetBooleanAttribute(node: Element | null, name: string) {\n if (!node) {\n return undefined;\n }\n\n const value = node.getAttribute(name);\n if (value === null) {\n return undefined;\n }\n\n return value !== \"0\" && value !== \"false\";\n}\n\nfunction parseStandardConditionalFormatRule(\n cfRuleNode: Element,\n ranges: XlsxCellRange[],\n differentialStyles: XlsxResolvedCellStyle[] = []\n): (XlsxConditionalFormatRule & { id?: string }) | null {\n const type = cfRuleNode.getAttribute(\"type\");\n const rawPriority = Number(cfRuleNode.getAttribute(\"priority\") ?? Number.NaN);\n const priority = Number.isFinite(rawPriority) ? rawPriority : Number.MAX_SAFE_INTEGER;\n const formulas = getChildElements(cfRuleNode, \"formula\")\n .map((formulaNode) => (formulaNode.textContent ?? \"\").trim())\n .filter((formula) => formula.length > 0);\n\n if (type === \"colorScale\") {\n const colorScaleNode = getFirstChild(cfRuleNode, \"colorScale\");\n if (!colorScaleNode) {\n return null;\n }\n\n const cfvos = getChildElements(colorScaleNode, \"cfvo\")\n .map((node) => parseConditionalFormatValueObject(node))\n .filter((value): value is XlsxConditionalFormatValueObject => Boolean(value));\n const colors = getChildElements(colorScaleNode, \"color\")\n .map((node) => parseSpreadsheetColor(node))\n .filter((value): value is Record<string, unknown> => Boolean(value));\n if (cfvos.length === 0 || colors.length === 0) {\n return null;\n }\n\n return {\n cfvos,\n colors,\n kind: \"colorScale\",\n priority,\n ranges\n };\n }\n\n if (type === \"dataBar\") {\n const dataBarNode = getFirstChild(cfRuleNode, \"dataBar\");\n if (!dataBarNode) {\n return null;\n }\n\n const cfvos = getChildElements(dataBarNode, \"cfvo\")\n .map((node) => parseConditionalFormatValueObject(node))\n .filter((value): value is XlsxConditionalFormatValueObject => Boolean(value));\n if (cfvos.length === 0) {\n return null;\n }\n\n const extId = getFirstDescendant(cfRuleNode, \"id\")?.textContent?.trim() || undefined;\n return {\n cfvos,\n color: parseSpreadsheetColor(getFirstChild(dataBarNode, \"color\")),\n kind: \"dataBar\",\n priority,\n ranges,\n id: extId\n };\n }\n\n if (type === \"iconSet\") {\n const iconSetNode = getFirstChild(cfRuleNode, \"iconSet\");\n if (!iconSetNode) {\n return null;\n }\n\n const iconSetName = iconSetNode.getAttribute(\"iconSet\");\n const cfvos = getChildElements(iconSetNode, \"cfvo\")\n .map((node) => parseConditionalFormatValueObject(node))\n .filter((value): value is XlsxConditionalFormatValueObject => Boolean(value));\n if (!iconSetName || cfvos.length === 0) {\n return null;\n }\n\n return {\n cfvos,\n icons: cfvos.map((_, index) => ({\n iconId: index,\n iconSet: iconSetName\n })),\n kind: \"iconSet\",\n priority,\n ranges,\n reverse: parseSpreadsheetBooleanAttribute(iconSetNode, \"reverse\"),\n showValue: parseSpreadsheetBooleanAttribute(iconSetNode, \"showValue\")\n };\n }\n\n const rawDxfId = Number(cfRuleNode.getAttribute(\"dxfId\") ?? Number.NaN);\n if (!type || !Number.isFinite(rawDxfId)) {\n return null;\n }\n\n const style = differentialStyles[rawDxfId];\n if (!style) {\n return null;\n }\n\n const rawRank = Number(cfRuleNode.getAttribute(\"rank\") ?? Number.NaN);\n const rawStdDev = Number(cfRuleNode.getAttribute(\"stdDev\") ?? Number.NaN);\n return {\n aboveAverage: parseSpreadsheetBooleanAttribute(cfRuleNode, \"aboveAverage\"),\n bottom: parseSpreadsheetBooleanAttribute(cfRuleNode, \"bottom\"),\n equalAverage: parseSpreadsheetBooleanAttribute(cfRuleNode, \"equalAverage\"),\n formulas,\n kind: \"styled\",\n operator: cfRuleNode.getAttribute(\"operator\") ?? undefined,\n percent: parseSpreadsheetBooleanAttribute(cfRuleNode, \"percent\"),\n priority,\n rank: Number.isFinite(rawRank) ? rawRank : undefined,\n ranges,\n ruleType: type,\n stdDev: Number.isFinite(rawStdDev) ? rawStdDev : undefined,\n stopIfTrue: parseSpreadsheetBooleanAttribute(cfRuleNode, \"stopIfTrue\"),\n style,\n text: cfRuleNode.getAttribute(\"text\") ?? undefined,\n timePeriod: cfRuleNode.getAttribute(\"timePeriod\") ?? undefined\n };\n}\n\nfunction parseExtendedConditionalFormatRule(\n cfRuleNode: Element,\n ranges: XlsxCellRange[]\n): (XlsxConditionalFormatRule & { id?: string }) | null {\n const type = cfRuleNode.getAttribute(\"type\");\n const ruleId = cfRuleNode.getAttribute(\"id\") ?? undefined;\n const rawPriority = Number(cfRuleNode.getAttribute(\"priority\") ?? Number.NaN);\n const priority = Number.isFinite(rawPriority) ? rawPriority : Number.MAX_SAFE_INTEGER;\n\n if (type === \"dataBar\") {\n const dataBarNode = getFirstChild(cfRuleNode, \"dataBar\");\n if (!dataBarNode) {\n return null;\n }\n\n const cfvos = getChildElements(dataBarNode, \"cfvo\")\n .map((node) => parseConditionalFormatValueObject(node))\n .filter((value): value is XlsxConditionalFormatValueObject => Boolean(value));\n if (cfvos.length === 0) {\n return null;\n }\n\n return {\n axisColor: parseSpreadsheetColor(getFirstChild(dataBarNode, \"axisColor\")),\n border: parseSpreadsheetBooleanAttribute(dataBarNode, \"border\"),\n borderColor: parseSpreadsheetColor(getFirstChild(dataBarNode, \"borderColor\")),\n cfvos,\n color: parseSpreadsheetColor(getFirstChild(dataBarNode, \"fillColor\")),\n gradient: parseSpreadsheetBooleanAttribute(dataBarNode, \"gradient\"),\n kind: \"dataBar\",\n maxLength: Number(dataBarNode.getAttribute(\"maxLength\") ?? Number.NaN),\n minLength: Number(dataBarNode.getAttribute(\"minLength\") ?? Number.NaN),\n negativeBarBorderColorSameAsPositive: parseSpreadsheetBooleanAttribute(dataBarNode, \"negativeBarBorderColorSameAsPositive\"),\n negativeBorderColor: parseSpreadsheetColor(getFirstChild(dataBarNode, \"negativeBorderColor\")),\n negativeFillColor: parseSpreadsheetColor(getFirstChild(dataBarNode, \"negativeFillColor\")),\n priority,\n ranges,\n showValue: parseSpreadsheetBooleanAttribute(dataBarNode, \"showValue\"),\n id: ruleId\n };\n }\n\n if (type === \"iconSet\") {\n const iconSetNode = getFirstChild(cfRuleNode, \"iconSet\");\n if (!iconSetNode) {\n return null;\n }\n\n const cfvos = getChildElements(iconSetNode, \"cfvo\")\n .map((node) => parseConditionalFormatValueObject(node))\n .filter((value): value is XlsxConditionalFormatValueObject => Boolean(value));\n const icons = getChildElements(iconSetNode, \"cfIcon\")\n .map((iconNode) => {\n const iconSet = iconNode.getAttribute(\"iconSet\");\n const rawIconId = Number(iconNode.getAttribute(\"iconId\") ?? Number.NaN);\n if (!iconSet || !Number.isFinite(rawIconId)) {\n return null;\n }\n\n return {\n iconId: rawIconId,\n iconSet\n } satisfies XlsxConditionalFormatIcon;\n })\n .filter((icon): icon is XlsxConditionalFormatIcon => Boolean(icon));\n\n if (cfvos.length === 0 || icons.length === 0) {\n return null;\n }\n\n return {\n cfvos,\n icons,\n kind: \"iconSet\",\n priority,\n ranges,\n reverse: parseSpreadsheetBooleanAttribute(iconSetNode, \"reverse\"),\n showValue: parseSpreadsheetBooleanAttribute(iconSetNode, \"showValue\"),\n id: ruleId\n };\n }\n\n return null;\n}\n\nfunction mergeConditionalFormatRule(\n baseRule: XlsxConditionalFormatRule & { id?: string },\n extendedRule: XlsxConditionalFormatRule & { id?: string }\n) {\n if (baseRule.kind !== extendedRule.kind) {\n return baseRule;\n }\n\n if (baseRule.kind === \"colorScale\" && extendedRule.kind === \"colorScale\") {\n return {\n ...baseRule,\n ...extendedRule,\n cfvos: extendedRule.cfvos.length > 0 ? extendedRule.cfvos : baseRule.cfvos,\n colors: extendedRule.colors.length > 0 ? extendedRule.colors : baseRule.colors,\n priority: Number.isFinite(extendedRule.priority) ? extendedRule.priority : baseRule.priority,\n ranges: extendedRule.ranges.length > 0 ? extendedRule.ranges : baseRule.ranges\n };\n }\n\n if (baseRule.kind === \"dataBar\" && extendedRule.kind === \"dataBar\") {\n const merged: XlsxConditionalDataBarRule & { id?: string } = {\n ...baseRule,\n ...extendedRule,\n axisColor: extendedRule.axisColor ?? baseRule.axisColor,\n border: extendedRule.border ?? baseRule.border,\n cfvos: extendedRule.cfvos.length > 0 ? extendedRule.cfvos : baseRule.cfvos,\n color: extendedRule.color ?? baseRule.color,\n negativeBarBorderColorSameAsPositive: extendedRule.negativeBarBorderColorSameAsPositive ?? baseRule.negativeBarBorderColorSameAsPositive,\n negativeBorderColor: extendedRule.negativeBorderColor ?? baseRule.negativeBorderColor,\n negativeFillColor: extendedRule.negativeFillColor ?? baseRule.negativeFillColor,\n priority: Number.isFinite(extendedRule.priority) ? extendedRule.priority : baseRule.priority,\n ranges: extendedRule.ranges.length > 0 ? extendedRule.ranges : baseRule.ranges\n };\n return merged;\n }\n\n if (baseRule.kind === \"iconSet\" && extendedRule.kind === \"iconSet\") {\n const merged: XlsxConditionalIconSetRule & { id?: string } = {\n ...baseRule,\n ...extendedRule,\n cfvos: extendedRule.cfvos.length > 0 ? extendedRule.cfvos : baseRule.cfvos,\n icons: extendedRule.icons.length > 0 ? extendedRule.icons : baseRule.icons,\n priority: Number.isFinite(extendedRule.priority) ? extendedRule.priority : baseRule.priority,\n ranges: extendedRule.ranges.length > 0 ? extendedRule.ranges : baseRule.ranges\n };\n return merged;\n }\n\n return baseRule;\n}\n\nfunction parseConditionalFormatRules(document: Document, differentialStyles: XlsxResolvedCellStyle[] = []) {\n const standardRules: Array<XlsxConditionalFormatRule & { id?: string }> = [];\n const extendedRules: Array<XlsxConditionalFormatRule & { id?: string }> = [];\n\n getLocalElements(document, \"conditionalFormatting\").forEach((conditionalFormattingNode) => {\n const isExtended = conditionalFormattingNode.namespaceURI !== SPREADSHEET_NS;\n const ranges = isExtended\n ? parseSqrefRanges(getFirstChild(conditionalFormattingNode, \"sqref\")?.textContent ?? \"\")\n : parseSqrefRanges(conditionalFormattingNode.getAttribute(\"sqref\"));\n\n getChildElements(conditionalFormattingNode, \"cfRule\").forEach((cfRuleNode) => {\n const parsedRule = isExtended\n ? parseExtendedConditionalFormatRule(cfRuleNode, ranges)\n : parseStandardConditionalFormatRule(cfRuleNode, ranges, differentialStyles);\n if (parsedRule) {\n if (isExtended) {\n extendedRules.push(parsedRule);\n } else {\n standardRules.push(parsedRule);\n }\n }\n });\n });\n\n const mergedRules: XlsxConditionalFormatRule[] = [];\n const usedExtendedRuleIds = new Set<string>();\n const extendedRulesById = new Map(\n extendedRules\n .filter((rule) => typeof rule.id === \"string\" && rule.id.length > 0)\n .map((rule) => [rule.id as string, rule])\n );\n\n standardRules.forEach((rule) => {\n const matchingExtendedRule = rule.id ? extendedRulesById.get(rule.id) : undefined;\n if (matchingExtendedRule) {\n usedExtendedRuleIds.add(rule.id as string);\n mergedRules.push(mergeConditionalFormatRule(rule, matchingExtendedRule));\n return;\n }\n\n mergedRules.push(rule);\n });\n\n extendedRules.forEach((rule) => {\n if (rule.id && usedExtendedRuleIds.has(rule.id)) {\n return;\n }\n\n mergedRules.push(rule);\n });\n\n return mergedRules\n .map((rule) => {\n const nextRule = { ...rule } as XlsxConditionalFormatRule & { id?: string };\n delete nextRule.id;\n return nextRule;\n })\n .filter((rule) => rule.ranges.length > 0)\n .sort((left, right) => left.priority - right.priority);\n}\n\nfunction parseSheetState(\n archive: ArchiveEntries,\n path: string,\n options?: ParseWorkbookStructureOptions & {\n differentialStyles?: XlsxResolvedCellStyle[];\n defaultFont?: {\n family?: string;\n sizePt?: number;\n } | null;\n }\n): WorkbookSheetState | null {\n const xml = readArchiveText(archive, path);\n if (!xml) {\n return null;\n }\n\n const document = parseXml(xml);\n if (!document) {\n return null;\n }\n\n const includeCachedFormulaValues = options?.includeCachedFormulaValues ?? true;\n const autoFilterRanges = parseSqrefRanges(getLocalElements(document, \"autoFilter\")[0]?.getAttribute(\"ref\"));\n const cachedFormulaValues: Record<string, string> = {};\n const conditionalFormatRules = parseConditionalFormatRules(document, options?.differentialStyles ?? []);\n const sparklines = parseSheetSparklines(document, options?.themePalette);\n const sheetFormatNode = getLocalElements(document, \"sheetFormatPr\")[0] ?? null;\n const sheetViewNode = getLocalElements(document, \"sheetView\")[0] ?? null;\n const rowHeightOverridesPx: Record<number, number> = {};\n const colWidthOverridesPx: Record<number, number> = {};\n const rowStyleIds: Record<number, number> = {};\n const cellStyleIds: Record<string, number> = {};\n const colStyleIds: Record<number, number> = {};\n let minContentCol = Number.POSITIVE_INFINITY;\n let minContentRow = Number.POSITIVE_INFINITY;\n let maxContentCol = -1;\n let maxContentRow = -1;\n const columnWidthCharacterWidthPx = measureColumnCharacterWidthPx(\n options?.defaultFont?.family,\n options?.defaultFont?.sizePt\n );\n\n const defaultRowHeight = Number(sheetFormatNode?.getAttribute(\"defaultRowHeight\") ?? 15);\n const defaultColWidth = Number(\n sheetFormatNode?.getAttribute(\"defaultColWidth\")\n ?? sheetFormatNode?.getAttribute(\"baseColWidth\")\n ?? 8.43\n );\n const rawZoomScale = Number(\n sheetViewNode?.getAttribute(\"zoomScale\")\n ?? sheetViewNode?.getAttribute(\"zoomScaleNormal\")\n ?? Number.NaN\n );\n const zoomScale = Number.isFinite(rawZoomScale) && rawZoomScale > 0\n ? rawZoomScale\n : 100;\n const trackContentCell = (cellRef: string | null) => {\n if (!cellRef) {\n return;\n }\n\n const cell = parseA1CellReference(cellRef);\n if (!cell) {\n return;\n }\n\n minContentCol = Math.min(minContentCol, cell.col);\n minContentRow = Math.min(minContentRow, cell.row);\n maxContentCol = Math.max(maxContentCol, cell.col);\n maxContentRow = Math.max(maxContentRow, cell.row);\n };\n const isMeaningfulCellNode = (cellNode: Element) => {\n if (getFirstChild(cellNode, \"f\") || getFirstChild(cellNode, \"is\")) {\n return true;\n }\n\n const valueNode = getFirstChild(cellNode, \"v\");\n return Boolean(valueNode && (valueNode.textContent ?? \"\").length > 0);\n };\n\n getLocalElements(document, \"row\").forEach((rowNode) => {\n const rowIndex = Number(rowNode.getAttribute(\"r\") ?? 0) - 1;\n const height = Number(rowNode.getAttribute(\"ht\") ?? Number.NaN);\n const styleId = Number(rowNode.getAttribute(\"s\") ?? Number.NaN);\n if (rowIndex >= 0 && Number.isFinite(height)) {\n rowHeightOverridesPx[rowIndex] = Math.max(MIN_ROW_HEIGHT_PX, Math.round(height * 1.33));\n }\n if (rowIndex >= 0 && Number.isFinite(styleId)) {\n rowStyleIds[rowIndex] = styleId;\n }\n\n getChildElements(rowNode, \"c\").forEach((cellNode) => {\n const cellRef = cellNode.getAttribute(\"r\");\n const cellStyleId = Number(cellNode.getAttribute(\"s\") ?? Number.NaN);\n if (cellRef && Number.isFinite(cellStyleId)) {\n cellStyleIds[cellRef] = cellStyleId;\n }\n if (isMeaningfulCellNode(cellNode)) {\n trackContentCell(cellRef);\n }\n\n if (includeCachedFormulaValues) {\n const formulaNode = getFirstChild(cellNode, \"f\");\n const valueNode = getFirstChild(cellNode, \"v\");\n if (formulaNode && valueNode && cellRef) {\n cachedFormulaValues[cellRef] = valueNode.textContent ?? \"\";\n }\n }\n });\n });\n\n const maxMetadataCol = Math.max(maxContentCol, 0) + 256;\n getLocalElements(document, \"col\").forEach((colNode) => {\n const min = Number(colNode.getAttribute(\"min\") ?? 0) - 1;\n const max = Number(colNode.getAttribute(\"max\") ?? 0) - 1;\n const width = Number(colNode.getAttribute(\"width\") ?? Number.NaN);\n const styleId = Number(colNode.getAttribute(\"style\") ?? Number.NaN);\n if (!Number.isFinite(width)) {\n if (!Number.isFinite(styleId)) {\n return;\n }\n }\n\n for (let col = min; col <= Math.min(max, maxMetadataCol); col += 1) {\n if (col >= 0) {\n if (Number.isFinite(width)) {\n const widthPx = sheetColumnWidthToPixels(width, columnWidthCharacterWidthPx);\n colWidthOverridesPx[col] = widthPx;\n }\n if (Number.isFinite(styleId)) {\n colStyleIds[col] = styleId;\n }\n }\n }\n });\n\n return {\n autoFilterRanges,\n cachedFormulaValues,\n cellStyleIds,\n columnWidthCharacterWidthPx,\n colWidthOverridesPx,\n colStyleIds,\n conditionalFormatRules,\n defaultColWidthPx: sheetColumnWidthToPixels(defaultColWidth, columnWidthCharacterWidthPx),\n defaultRowHeightPx: Math.max(MIN_ROW_HEIGHT_PX, Math.round(defaultRowHeight * 1.33)),\n hasHorizontalMerges: false,\n hasVerticalMerges: false,\n maxHorizontalMergeEndCol: -1,\n maxVerticalMergeEndRow: -1,\n maxContentCol,\n maxContentRow,\n minContentCol: Number.isFinite(minContentCol) ? minContentCol : -1,\n minContentRow: Number.isFinite(minContentRow) ? minContentRow : -1,\n hiddenCols: [],\n hiddenRows: [],\n rowHeightOverridesPx,\n rowStyleIds,\n showGridLines: (sheetViewNode?.getAttribute(\"showGridLines\") ?? \"1\") !== \"0\",\n sparklines,\n zoomScale\n };\n}\n\nfunction clampChannel(value: number) {\n return Math.max(0, Math.min(255, Math.round(value)));\n}\n\nfunction normalizeHexColor(value: string) {\n const hex = value.replace(/^#/, \"\");\n if (hex.length === 8) {\n return `#${hex.slice(2).toLowerCase()}`;\n }\n if (hex.length === 6) {\n return `#${hex.toLowerCase()}`;\n }\n return \"#000000\";\n}\n\nfunction hexToRgb(hex: string) {\n const normalized = normalizeHexColor(hex);\n return {\n b: Number.parseInt(normalized.slice(5, 7), 16),\n g: Number.parseInt(normalized.slice(3, 5), 16),\n r: Number.parseInt(normalized.slice(1, 3), 16)\n };\n}\n\nfunction rgbToHex(red: number, green: number, blue: number) {\n return `#${[red, green, blue]\n .map((value) => clampChannel(value).toString(16).padStart(2, \"0\"))\n .join(\"\")}`;\n}\n\nfunction applyDrawingColorTransforms(\n baseColor: string,\n transformNodes: Element[]\n): DrawingColor {\n let { r, g, b } = hexToRgb(baseColor);\n let opacity = 1;\n let lumMod = 1;\n let lumOff = 0;\n\n transformNodes.forEach((node) => {\n const rawValue = Number(node.getAttribute(\"val\") ?? 0);\n const value = Number.isFinite(rawValue) ? rawValue / 100000 : 0;\n switch (node.localName) {\n case \"alpha\":\n opacity *= value;\n break;\n case \"lumMod\":\n lumMod *= value;\n break;\n case \"lumOff\":\n lumOff += value;\n break;\n case \"shade\":\n r *= value;\n g *= value;\n b *= value;\n break;\n case \"tint\":\n r = r + (255 - r) * value;\n g = g + (255 - g) * value;\n b = b + (255 - b) * value;\n break;\n default:\n break;\n }\n });\n\n if (lumMod !== 1 || lumOff !== 0) {\n r = r * lumMod + 255 * lumOff;\n g = g * lumMod + 255 * lumOff;\n b = b * lumMod + 255 * lumOff;\n }\n\n return {\n color: rgbToHex(r, g, b),\n opacity: Math.max(0, Math.min(1, opacity))\n };\n}\n\nfunction resolveThemeColorName(theme: ThemeState, name: string | null) {\n if (!name) {\n return null;\n }\n\n const aliases: Record<string, string> = {\n bg1: \"bg1\",\n bg2: \"bg2\",\n tx1: \"tx1\",\n tx2: \"tx2\"\n };\n const key = aliases[name] ?? name;\n return theme.colors.get(key) ?? null;\n}\n\nfunction resolveColorValue(colorNode: Element | null, theme: ThemeState): DrawingColor | null {\n if (!colorNode) {\n return null;\n }\n\n let baseColor: string | null = null;\n if (colorNode.localName === \"srgbClr\") {\n baseColor = normalizeHexColor(colorNode.getAttribute(\"val\") ?? \"\");\n } else if (colorNode.localName === \"schemeClr\") {\n baseColor = resolveThemeColorName(theme, colorNode.getAttribute(\"val\"));\n } else if (colorNode.localName === \"scrgbClr\") {\n const r = Number(colorNode.getAttribute(\"r\") ?? 0) * 255 / 100000;\n const g = Number(colorNode.getAttribute(\"g\") ?? 0) * 255 / 100000;\n const b = Number(colorNode.getAttribute(\"b\") ?? 0) * 255 / 100000;\n baseColor = rgbToHex(r, g, b);\n } else if (colorNode.localName === \"sysClr\") {\n baseColor = normalizeHexColor(colorNode.getAttribute(\"lastClr\") ?? \"\");\n }\n\n if (!baseColor) {\n return null;\n }\n\n return applyDrawingColorTransforms(baseColor, Array.from(colorNode.childNodes).filter(isElementNode));\n}\n\nfunction resolveFillColor(fillParent: Element | null, theme: ThemeState): DrawingColor | null {\n if (!fillParent) {\n return null;\n }\n\n const solidFillNode = getFirstChild(fillParent, \"solidFill\");\n if (!solidFillNode) {\n return null;\n }\n\n return resolveColorValue(Array.from(solidFillNode.childNodes).filter(isElementNode)[0] ?? null, theme);\n}\n\nfunction resolveTextTypeface(typeface: string | null, theme: ThemeState) {\n if (!typeface) {\n return undefined;\n }\n\n if (typeface === \"+mn-lt\" || typeface === \"+mn-ea\" || typeface === \"+mn-cs\") {\n return theme.minorLatinFont ?? undefined;\n }\n if (typeface === \"+mj-lt\" || typeface === \"+mj-ea\" || typeface === \"+mj-cs\") {\n return theme.majorLatinFont ?? undefined;\n }\n\n return typeface;\n}\n\nfunction isThemeTypeface(typeface: string | null | undefined) {\n return Boolean(typeface && typeface.startsWith(\"+\"));\n}\n\nfunction resolvePreferredTextTypeface(node: Element | null, theme: ThemeState) {\n if (!node) {\n return undefined;\n }\n\n const latin = getFirstChild(node, \"latin\")?.getAttribute(\"typeface\") ?? null;\n const eastAsian = getFirstChild(node, \"ea\")?.getAttribute(\"typeface\") ?? null;\n const complexScript = getFirstChild(node, \"cs\")?.getAttribute(\"typeface\") ?? null;\n const candidates = [latin, eastAsian, complexScript];\n const explicit = candidates.find((candidate) => candidate && !isThemeTypeface(candidate));\n if (explicit) {\n return explicit;\n }\n\n return resolveTextTypeface(candidates.find(Boolean) ?? null, theme);\n}\n\ntype ShapeTextStyle = {\n bold?: boolean;\n color?: string;\n fontFamily?: string;\n fontSizePt?: number;\n italic?: boolean;\n underline?: boolean;\n};\n\nfunction parseShapeTextStyle(node: Element | null, theme: ThemeState, fallbackColor?: DrawingColor | null): ShapeTextStyle {\n if (!node) {\n return {\n color: fallbackColor?.color\n };\n }\n\n const fillColor = resolveFillColor(node, theme) ?? fallbackColor ?? null;\n const underlineValue = node.getAttribute(\"u\");\n return {\n bold: node.getAttribute(\"b\") === \"1\" || undefined,\n color: fillColor?.color,\n fontFamily: resolvePreferredTextTypeface(node, theme),\n fontSizePt: node.getAttribute(\"sz\") ? Number(node.getAttribute(\"sz\")) / 100 : undefined,\n italic: node.getAttribute(\"i\") === \"1\" || undefined,\n underline: underlineValue && underlineValue !== \"none\" ? true : undefined\n };\n}\n\nfunction mergeShapeTextStyles(...styles: Array<ShapeTextStyle | undefined>): ShapeTextStyle {\n return styles.reduce<ShapeTextStyle>((acc, style) => {\n if (!style) {\n return acc;\n }\n return {\n bold: style.bold ?? acc.bold,\n color: style.color ?? acc.color,\n fontFamily: style.fontFamily ?? acc.fontFamily,\n fontSizePt: style.fontSizePt ?? acc.fontSizePt,\n italic: style.italic ?? acc.italic,\n underline: style.underline ?? acc.underline\n };\n }, {});\n}\n\nfunction parseMarker(node: Element | null) {\n if (!node) {\n return null;\n }\n\n const col = Number(getFirstChild(node, \"col\")?.textContent ?? 0);\n const row = Number(getFirstChild(node, \"row\")?.textContent ?? 0);\n const colOffsetEmu = Number(getFirstChild(node, \"colOff\")?.textContent ?? 0);\n const rowOffsetEmu = Number(getFirstChild(node, \"rowOff\")?.textContent ?? 0);\n\n return {\n col,\n colOffsetEmu,\n row,\n rowOffsetEmu\n };\n}\n\nexport function dukeDrawingAnchorToXlsxAnchor(anchor: DukeDrawingAnchor): XlsxImageAnchor {\n if (anchor.type === \"absolute\") {\n return {\n kind: \"absolute\",\n positionEmu: { x: anchor.xEmu, y: anchor.yEmu },\n sizeEmu: { cx: anchor.widthEmu, cy: anchor.heightEmu }\n };\n }\n\n const from = {\n col: anchor.from.col,\n colOffsetEmu: anchor.from.colOffsetEmu ?? 0,\n row: anchor.from.row,\n rowOffsetEmu: anchor.from.rowOffsetEmu ?? 0\n };\n if (anchor.type === \"oneCell\") {\n return {\n from,\n kind: \"one-cell\",\n sizeEmu: { cx: anchor.widthEmu, cy: anchor.heightEmu }\n };\n }\n\n return {\n from,\n kind: \"two-cell\",\n to: {\n col: anchor.to.col,\n colOffsetEmu: anchor.to.colOffsetEmu ?? 0,\n row: anchor.to.row,\n rowOffsetEmu: anchor.to.rowOffsetEmu ?? 0\n }\n };\n}\n\nexport function xlsxAnchorToDukeDrawingAnchor(\n anchor: XlsxImageAnchor,\n editAs?: \"twoCell\" | \"oneCell\" | \"absolute\"\n): DukeDrawingAnchor {\n if (anchor.kind === \"absolute\") {\n return {\n heightEmu: anchor.sizeEmu.cy,\n type: \"absolute\",\n widthEmu: anchor.sizeEmu.cx,\n xEmu: anchor.positionEmu.x,\n yEmu: anchor.positionEmu.y\n };\n }\n\n const from = {\n col: anchor.from.col,\n colOffsetEmu: anchor.from.colOffsetEmu,\n row: anchor.from.row,\n rowOffsetEmu: anchor.from.rowOffsetEmu\n };\n if (anchor.kind === \"one-cell\") {\n return {\n from,\n heightEmu: anchor.sizeEmu.cy,\n type: \"oneCell\",\n widthEmu: anchor.sizeEmu.cx\n };\n }\n\n return {\n editAs,\n from,\n to: {\n col: anchor.to.col,\n colOffsetEmu: anchor.to.colOffsetEmu,\n row: anchor.to.row,\n rowOffsetEmu: anchor.to.rowOffsetEmu\n },\n type: \"twoCell\"\n };\n}\n\nfunction mapDukeDrawingColor(color: DukeDrawingColor | undefined): XlsxCellStyleColorInput | undefined {\n if (!color) {\n return undefined;\n }\n switch (color.colorType) {\n case \"auto\":\n return { colorType: \"auto\" };\n case \"rgb\":\n return { b: color.b, colorType: \"rgb\", g: color.g, r: color.r };\n case \"argb\":\n return { a: color.a, b: color.b, colorType: \"argb\", g: color.g, r: color.r };\n case \"theme\":\n return { colorType: \"theme\", themeIndex: color.index, tint: color.tint };\n case \"indexed\":\n return { colorType: \"indexed\", paletteIndex: color.index };\n }\n}\n\nfunction mapDukeDrawingFont(font: DukeDrawingRunFont | undefined) {\n if (!font) {\n return undefined;\n }\n return {\n bold: font.bold,\n charset: font.charset,\n color: mapDukeDrawingColor(font.color),\n family: font.family,\n italic: font.italic,\n name: font.name,\n scheme: font.scheme,\n size: font.size,\n strikethrough: font.strikethrough,\n underline: font.underline,\n verticalAlign: font.verticalAlign\n };\n}\n\nfunction mapDukeDrawingText(text: DukeDrawingText): XlsxFormControlCaption {\n return {\n horizontalAlignment: text.horizontalAlignment,\n runs: text.runs.map((run) => ({ font: mapDukeDrawingFont(run.font), text: run.text })),\n verticalAlignment: text.verticalAlignment\n };\n}\n\nfunction resolveDukeDrawingColor(color: DukeDrawingColor | undefined, themePalette?: XlsxThemePalette | null) {\n if (!color) {\n return undefined;\n }\n switch (color.colorType) {\n case \"rgb\":\n return resolveWorkbookColor({ rgb: [color.r, color.g, color.b].map((value) => value.toString(16).padStart(2, \"0\")).join(\"\") }) ?? undefined;\n case \"argb\":\n return resolveWorkbookColor({ argb: [color.a, color.r, color.g, color.b].map((value) => value.toString(16).padStart(2, \"0\")).join(\"\") }) ?? undefined;\n case \"theme\":\n return resolveWorkbookColor({ theme: color.index, tint: color.tint }, themePalette) ?? undefined;\n default:\n return undefined;\n }\n}\n\nfunction resolveDukeDrawingText(\n text: DukeDrawingText,\n themePalette?: XlsxThemePalette | null\n) {\n const caption = mapDukeDrawingText(text);\n const label = normalizeControlLabel(text.runs.map((run) => run.text).join(\"\"));\n const firstStyledRun = text.runs.find((run) => run.font)?.font;\n const horizontalAlignment = text.horizontalAlignment;\n return {\n caption,\n fontFamily: firstStyledRun?.name,\n fontSizePt: firstStyledRun?.size,\n label,\n textAlign: horizontalAlignment === \"left\" || horizontalAlignment === \"center\" || horizontalAlignment === \"right\"\n ? horizontalAlignment\n : undefined,\n textColor: resolveDukeDrawingColor(firstStyledRun?.color, themePalette)\n };\n}\n\nfunction mapDukeFormControlKind(\n kind: DukeFormControlKind,\n themePalette?: XlsxThemePalette | null\n): Pick<XlsxFormControl, \"kind\"> & Partial<XlsxFormControl> {\n switch (kind.kind) {\n case \"button\":\n return { ...resolveDukeDrawingText(kind.caption, themePalette), kind: \"button\" };\n case \"checkbox\":\n return {\n ...resolveDukeDrawingText(kind.caption, themePalette),\n checked: kind.state === \"checked\",\n kind: \"checkbox\",\n linkedCell: kind.cellLink,\n no3D: kind.no3D,\n state: kind.state\n };\n case \"optionButton\":\n return {\n ...resolveDukeDrawingText(kind.caption, themePalette),\n checked: kind.state === \"checked\",\n firstInGroup: kind.firstInGroup,\n kind: \"radio\",\n linkedCell: kind.cellLink,\n no3D: kind.no3D,\n state: kind.state\n };\n case \"label\":\n return { ...resolveDukeDrawingText(kind.caption, themePalette), kind: \"label\" };\n case \"groupBox\":\n return {\n ...resolveDukeDrawingText(kind.caption, themePalette),\n kind: \"group-box\",\n no3D: kind.no3D\n };\n case \"listBox\":\n return {\n inputRange: kind.inputRange,\n kind: \"listbox\",\n linkedCell: kind.cellLink,\n no3D: kind.no3D,\n selected: [...kind.selected],\n selection: kind.selection\n };\n case \"dropdown\":\n return {\n inputRange: kind.inputRange,\n kind: \"dropdown\",\n lines: kind.lines,\n linkedCell: kind.cellLink,\n no3D: kind.no3D,\n selected: kind.selected\n };\n case \"scrollbar\":\n return {\n horizontal: kind.horizontal,\n increment: kind.increment,\n kind: \"scrollbar\",\n linkedCell: kind.cellLink,\n max: kind.max,\n min: kind.min,\n page: kind.page,\n value: kind.value\n };\n case \"spinner\":\n return {\n increment: kind.increment,\n kind: \"spinner\",\n linkedCell: kind.cellLink,\n max: kind.max,\n min: kind.min,\n value: kind.value\n };\n case \"unknown\":\n return {\n ...resolveDukeDrawingText(kind.caption, themePalette),\n kind: kind.objectType.toLowerCase() === \"editbox\" ? \"editbox\" : \"unknown\",\n legacyObjectType: kind.legacyObjectType,\n objectType: kind.objectType\n };\n }\n}\n\nfunction mapDukeFormControl(\n control: DukeFormControlDrawing & { anchor: DukeDrawingAnchor },\n controlIndex: number,\n workbookSheetIndex: number,\n themePalette?: XlsxThemePalette | null\n): XlsxFormControl {\n return {\n altText: control.altText,\n anchor: dukeDrawingAnchorToXlsxAnchor(control.anchor),\n controlIndex,\n editAs: control.anchor.type === \"twoCell\" ? control.anchor.editAs : undefined,\n hidden: control.hidden,\n id: `form-control-${workbookSheetIndex}-${controlIndex}`,\n locked: control.locked,\n macroName: control.formControl.macroName,\n name: control.name,\n printable: control.printable,\n rawClientData: control.formControl.rawClientData,\n rawObj: control.formControl.rawObj,\n rawProperties: control.formControl.rawProperties,\n sheetIndex: workbookSheetIndex,\n title: control.title,\n workbookSheetIndex,\n zIndex: (control.drawingPath[0] ?? controlIndex) + 1,\n ...mapDukeFormControlKind(control.formControl.kind, themePalette)\n };\n}\n\nexport function collectWorkbookFormControls(\n workbook: Workbook,\n themePalette?: XlsxThemePalette | null\n): XlsxFormControl[][] {\n return Array.from({ length: workbook.sheetCount }, (_, workbookSheetIndex) => {\n try {\n const controls = workbook.getSheet(workbookSheetIndex).formControls;\n return Array.isArray(controls)\n ? controls.flatMap((control, controlIndex) => control.anchor\n ? [mapDukeFormControl(control, controlIndex, workbookSheetIndex, themePalette)]\n : [])\n : [];\n } catch {\n return [];\n }\n });\n}\n\nfunction normalizeControlLabel(label: string | null | undefined) {\n if (!label) {\n return undefined;\n }\n\n const normalized = label\n .replace(/\\u00a0/g, \" \")\n .replace(/\\s+/g, \" \")\n .trim();\n return normalized.length > 0 ? normalized : undefined;\n}\n\nfunction parseAnchor(anchorNode: Element) {\n if (anchorNode.localName === \"anchor\") {\n const from = parseMarker(getFirstChild(anchorNode, \"from\"));\n const to = parseMarker(getFirstChild(anchorNode, \"to\"));\n return from && to ? { from, kind: \"two-cell\" as const, to } : null;\n }\n\n if (anchorNode.localName === \"twoCellAnchor\") {\n const from = parseMarker(getFirstChild(anchorNode, \"from\"));\n const to = parseMarker(getFirstChild(anchorNode, \"to\"));\n return from && to ? { from, kind: \"two-cell\" as const, to } : null;\n }\n\n if (anchorNode.localName === \"oneCellAnchor\") {\n const from = parseMarker(getFirstChild(anchorNode, \"from\"));\n const extNode = getFirstChild(anchorNode, \"ext\");\n return from && extNode\n ? {\n from,\n kind: \"one-cell\" as const,\n sizeEmu: {\n cx: Number(extNode.getAttribute(\"cx\") ?? 0),\n cy: Number(extNode.getAttribute(\"cy\") ?? 0)\n }\n }\n : null;\n }\n\n const positionNode = getFirstChild(anchorNode, \"pos\");\n const extNode = getFirstChild(anchorNode, \"ext\");\n return positionNode && extNode\n ? {\n kind: \"absolute\" as const,\n positionEmu: {\n x: Number(positionNode.getAttribute(\"x\") ?? 0),\n y: Number(positionNode.getAttribute(\"y\") ?? 0)\n },\n sizeEmu: {\n cx: Number(extNode.getAttribute(\"cx\") ?? 0),\n cy: Number(extNode.getAttribute(\"cy\") ?? 0)\n }\n }\n : null;\n}\n\nfunction anchorToRect(anchor: XlsxImage[\"anchor\"]): DrawingRectEmu {\n if (anchor.kind === \"absolute\") {\n return {\n cx: anchor.sizeEmu.cx,\n cy: anchor.sizeEmu.cy,\n x: anchor.positionEmu.x,\n y: anchor.positionEmu.y\n };\n }\n\n if (anchor.kind === \"one-cell\") {\n return {\n cx: anchor.sizeEmu.cx,\n cy: anchor.sizeEmu.cy,\n x: anchor.from.colOffsetEmu,\n y: anchor.from.rowOffsetEmu\n };\n }\n\n return {\n cx: Math.max(0, (anchor.to.col - anchor.from.col) * DEFAULT_COL_WIDTH_EMU + anchor.to.colOffsetEmu - anchor.from.colOffsetEmu),\n cy: Math.max(0, (anchor.to.row - anchor.from.row) * DEFAULT_ROW_HEIGHT_EMU + anchor.to.rowOffsetEmu - anchor.from.rowOffsetEmu),\n x: anchor.from.colOffsetEmu,\n y: anchor.from.rowOffsetEmu\n };\n}\n\nfunction resolveSheetColumnWidthPx(sheetState: WorkbookSheetState | null, col: number) {\n if (col < 0) {\n return 0;\n }\n return sheetState?.colWidthOverridesPx[col] ?? sheetState?.defaultColWidthPx ?? emuToPixels(DEFAULT_COL_WIDTH_EMU);\n}\n\nfunction resolveSheetRowHeightPx(sheetState: WorkbookSheetState | null, row: number) {\n if (row < 0) {\n return 0;\n }\n return sheetState?.rowHeightOverridesPx[row] ?? sheetState?.defaultRowHeightPx ?? emuToPixels(DEFAULT_ROW_HEIGHT_EMU);\n}\n\nfunction sumSheetColumnWidthsEmu(sheetState: WorkbookSheetState | null, beforeCol: number) {\n let total = 0;\n for (let col = 0; col < beforeCol; col += 1) {\n total += pixelsToEmu(resolveSheetColumnWidthPx(sheetState, col));\n }\n return total;\n}\n\nfunction sumSheetRowHeightsEmu(sheetState: WorkbookSheetState | null, beforeRow: number) {\n let total = 0;\n for (let row = 0; row < beforeRow; row += 1) {\n total += pixelsToEmu(resolveSheetRowHeightPx(sheetState, row));\n }\n return total;\n}\n\nfunction anchorToAbsoluteRect(anchor: XlsxImage[\"anchor\"], sheetState: WorkbookSheetState | null): DrawingRectEmu {\n if (anchor.kind === \"absolute\") {\n return anchorToRect(anchor);\n }\n\n if (anchor.kind === \"one-cell\") {\n return {\n cx: anchor.sizeEmu.cx,\n cy: anchor.sizeEmu.cy,\n x: sumSheetColumnWidthsEmu(sheetState, anchor.from.col) + anchor.from.colOffsetEmu,\n y: sumSheetRowHeightsEmu(sheetState, anchor.from.row) + anchor.from.rowOffsetEmu\n };\n }\n\n const left = sumSheetColumnWidthsEmu(sheetState, anchor.from.col) + anchor.from.colOffsetEmu;\n const top = sumSheetRowHeightsEmu(sheetState, anchor.from.row) + anchor.from.rowOffsetEmu;\n const right = sumSheetColumnWidthsEmu(sheetState, anchor.to.col) + anchor.to.colOffsetEmu;\n const bottom = sumSheetRowHeightsEmu(sheetState, anchor.to.row) + anchor.to.rowOffsetEmu;\n\n return {\n cx: Math.max(0, right - left),\n cy: Math.max(0, bottom - top),\n x: left,\n y: top\n };\n}\n\nfunction rectToAbsoluteAnchor(rect: DrawingRectEmu): XlsxImage[\"anchor\"] {\n return {\n kind: \"absolute\",\n positionEmu: {\n x: rect.x,\n y: rect.y\n },\n sizeEmu: {\n cx: rect.cx,\n cy: rect.cy\n }\n };\n}\n\nfunction parseTransformRect(xfrmNode: Element | null) {\n if (!xfrmNode) {\n return null;\n }\n\n const offNode = getFirstChild(xfrmNode, \"off\");\n const extNode = getFirstChild(xfrmNode, \"ext\");\n if (!offNode || !extNode) {\n return null;\n }\n\n return {\n cx: Number(extNode.getAttribute(\"cx\") ?? 0),\n cy: Number(extNode.getAttribute(\"cy\") ?? 0),\n flipH: xfrmNode.getAttribute(\"flipH\") === \"1\",\n flipV: xfrmNode.getAttribute(\"flipV\") === \"1\",\n rot: Number(xfrmNode.getAttribute(\"rot\") ?? 0) / 60000,\n x: Number(offNode.getAttribute(\"x\") ?? 0),\n y: Number(offNode.getAttribute(\"y\") ?? 0)\n };\n}\n\nfunction applyGroupTransform(rect: DrawingRectEmu, group: GroupTransform): DrawingRectEmu {\n return {\n cx: rect.cx * group.scaleX,\n cy: rect.cy * group.scaleY,\n x: group.x + (rect.x - group.chX) * group.scaleX,\n y: group.y + (rect.y - group.chY) * group.scaleY\n };\n}\n\nfunction parseGroupTransform(\n groupNode: Element,\n parentGroup: GroupTransform | null,\n fallbackAnchor: XlsxImage[\"anchor\"],\n sheetState: WorkbookSheetState | null\n) {\n const xfrmNode = getFirstDescendant(getFirstChild(groupNode, \"grpSpPr\") ?? groupNode, \"xfrm\");\n const anchorRect = anchorToAbsoluteRect(fallbackAnchor, sheetState);\n const rect = parseTransformRect(xfrmNode) ?? anchorRect;\n const rootRectMatchesAnchorOrigin = Math.abs(rect.x - anchorRect.x) <= EMU_PER_PIXEL\n && Math.abs(rect.y - anchorRect.y) <= EMU_PER_PIXEL;\n const chOffNode = getFirstChild(xfrmNode ?? groupNode, \"chOff\");\n const chExtNode = getFirstChild(xfrmNode ?? groupNode, \"chExt\");\n const rootScaleX = rect.cx !== 0 ? anchorRect.cx / rect.cx : 1;\n const rootScaleY = rect.cy !== 0 ? anchorRect.cy / rect.cy : 1;\n const useRectFrameForRoot = !parentGroup && (\n rootScaleX < 0.85\n || rootScaleX > 1.15\n || rootScaleY < 0.85\n || rootScaleY > 1.15\n );\n const absoluteRect = parentGroup\n ? applyGroupTransform(rect, parentGroup)\n : rootRectMatchesAnchorOrigin\n ? rect\n : anchorRect;\n const childRectX = parentGroup\n ? Number(chOffNode?.getAttribute(\"x\") ?? 0)\n : useRectFrameForRoot\n ? rect.x\n : Number(chOffNode?.getAttribute(\"x\") ?? 0);\n const childRectY = parentGroup\n ? Number(chOffNode?.getAttribute(\"y\") ?? 0)\n : useRectFrameForRoot\n ? rect.y\n : Number(chOffNode?.getAttribute(\"y\") ?? 0);\n const childRectCx = parentGroup\n ? Number(chExtNode?.getAttribute(\"cx\") ?? rect.cx)\n : useRectFrameForRoot\n ? rect.cx\n : Number(chExtNode?.getAttribute(\"cx\") ?? rect.cx);\n const childRectCy = parentGroup\n ? Number(chExtNode?.getAttribute(\"cy\") ?? rect.cy)\n : useRectFrameForRoot\n ? rect.cy\n : Number(chExtNode?.getAttribute(\"cy\") ?? rect.cy);\n return {\n chCx: childRectCx,\n chCy: childRectCy,\n chX: childRectX,\n chY: childRectY,\n cx: absoluteRect.cx,\n cy: absoluteRect.cy,\n scaleX: childRectCx !== 0 ? absoluteRect.cx / childRectCx : (parentGroup?.scaleX ?? 1),\n scaleY: childRectCy !== 0 ? absoluteRect.cy / childRectCy : (parentGroup?.scaleY ?? 1),\n x: absoluteRect.x,\n y: absoluteRect.y\n };\n}\n\nfunction anchorFromNodeOrFallback(\n node: Element,\n fallbackAnchor: XlsxImage[\"anchor\"],\n parentGroup: GroupTransform | null\n) {\n const xfrmNode = getFirstDescendant(node, \"xfrm\");\n const rect = parseTransformRect(xfrmNode);\n if (rect) {\n const scaleX = parentGroup?.scaleX ?? 1;\n const scaleY = parentGroup?.scaleY ?? 1;\n return {\n anchor: parentGroup ? rectToAbsoluteAnchor(applyGroupTransform(rect, parentGroup)) : fallbackAnchor,\n flipH: rect.flipH,\n flipV: rect.flipV,\n rotationDeg: rect.rot,\n scaleX,\n scaleY\n };\n }\n\n return {\n anchor: fallbackAnchor,\n flipH: false,\n flipV: false,\n rotationDeg: 0,\n scaleX: parentGroup?.scaleX ?? 1,\n scaleY: parentGroup?.scaleY ?? 1\n };\n}\n\nfunction mapParagraphAlign(value: string | null | undefined): XlsxShape[\"paragraphs\"][number][\"align\"] | undefined {\n switch (value) {\n case \"ctr\":\n return \"center\";\n case \"just\":\n return \"justify\";\n case \"r\":\n return \"right\";\n case \"l\":\n return \"left\";\n default:\n return undefined;\n }\n}\n\nfunction mapVerticalAnchor(value: string | null | undefined): \"bottom\" | \"middle\" | \"top\" {\n switch (value) {\n case \"b\":\n return \"bottom\";\n case \"ctr\":\n return \"middle\";\n default:\n return \"top\";\n }\n}\n\nfunction createImageAnchorNodes(document: XMLDocument) {\n return document.documentElement\n ? Array.from(document.documentElement.childNodes).filter(\n (node): node is Element =>\n isElementNode(node) &&\n (node.localName === \"twoCellAnchor\" || node.localName === \"oneCellAnchor\" || node.localName === \"absoluteAnchor\")\n )\n : [];\n}\n\nfunction createImageSource(bytes: Uint8Array, mimeType: string, objectUrls: string[]) {\n if (typeof URL !== \"undefined\" && typeof Blob !== \"undefined\") {\n const objectUrl = URL.createObjectURL(new Blob([cloneBytes(bytes)], { type: mimeType }));\n objectUrls.push(objectUrl);\n return objectUrl;\n }\n\n let binary = \"\";\n for (const value of bytes) {\n binary += String.fromCharCode(value);\n }\n const base64 = typeof btoa === \"function\" ? btoa(binary) : \"\";\n return `data:${mimeType};base64,${base64}`;\n}\n\nfunction isStrokeOnlyGeometry(geometry: string) {\n return geometry === \"line\" || geometry === \"arc\" || geometry === \"leftBrace\";\n}\n\nfunction parseShapeStroke(node: Element, styleNode: Element | null, theme: ThemeState): XlsxShape[\"stroke\"] | undefined {\n const lineNode = getFirstDescendant(node, \"ln\");\n const lineRefNode = styleNode ? getFirstChild(styleNode, \"lnRef\") : null;\n if (!lineNode && !lineRefNode) {\n return undefined;\n }\n\n if (lineNode && getFirstChild(lineNode, \"noFill\")) {\n return { none: true };\n }\n\n const color = resolveFillColor(lineNode, theme)\n ?? resolveColorValue(Array.from(lineRefNode?.childNodes ?? []).filter(isElementNode)[0] ?? null, theme);\n const widthEmu = Number(lineNode?.getAttribute(\"w\") ?? 0);\n return {\n color: color?.color,\n dash: getFirstChild(lineNode ?? node, \"prstDash\")?.getAttribute(\"val\") ?? undefined,\n headEndType: getFirstChild(lineNode ?? node, \"headEnd\")?.getAttribute(\"type\") ?? undefined,\n none: false,\n opacity: color?.opacity,\n tailEndType: getFirstChild(lineNode ?? node, \"tailEnd\")?.getAttribute(\"type\") ?? undefined,\n widthPx: widthEmu > 0 ? emuToPixels(widthEmu) : undefined\n };\n}\n\nfunction parseShapeFill(\n node: Element,\n styleNode: Element | null,\n theme: ThemeState,\n geometry: string\n): XlsxShape[\"fill\"] | undefined {\n const shapePropsNode = getFirstChild(node, \"spPr\") ?? node;\n const noFillNode = getFirstChild(shapePropsNode, \"noFill\");\n if (noFillNode) {\n return { none: true };\n }\n\n if (isStrokeOnlyGeometry(geometry)) {\n return { none: true };\n }\n\n const fillRefNode = styleNode ? getFirstChild(styleNode, \"fillRef\") : null;\n const fillColor = resolveFillColor(shapePropsNode, theme)\n ?? resolveColorValue(Array.from(fillRefNode?.childNodes ?? []).filter(isElementNode)[0] ?? null, theme);\n if (!fillColor) {\n return undefined;\n }\n\n return {\n color: fillColor.color,\n none: false,\n opacity: fillColor.opacity\n };\n}\n\nfunction parsePointNode(pointNode: Element | null) {\n if (!pointNode) {\n return null;\n }\n\n const x = Number(pointNode.getAttribute(\"x\") ?? Number.NaN);\n const y = Number(pointNode.getAttribute(\"y\") ?? Number.NaN);\n return Number.isFinite(x) && Number.isFinite(y) ? { x, y } : null;\n}\n\nfunction parseCustomGeometryPath(shapeNode: Element): ShapeVectorPath | undefined {\n const pathNode = getFirstDescendant(shapeNode, \"path\");\n if (!pathNode) {\n return undefined;\n }\n\n const width = Number(pathNode.getAttribute(\"w\") ?? Number.NaN);\n const height = Number(pathNode.getAttribute(\"h\") ?? Number.NaN);\n if (!Number.isFinite(width) || !Number.isFinite(height) || width <= 0 || height <= 0) {\n return undefined;\n }\n\n const commands: string[] = [];\n let lastPoint: { x: number; y: number } | null = null;\n for (const child of Array.from(pathNode.childNodes).filter(isElementNode)) {\n if (child.localName === \"moveTo\") {\n const point = parsePointNode(getFirstChild(child, \"pt\"));\n if (point) {\n commands.push(`M ${point.x} ${point.y}`);\n lastPoint = point;\n }\n continue;\n }\n\n if (child.localName === \"lnTo\") {\n const point = parsePointNode(getFirstChild(child, \"pt\"));\n if (point && (!lastPoint || point.x !== lastPoint.x || point.y !== lastPoint.y)) {\n commands.push(`L ${point.x} ${point.y}`);\n lastPoint = point;\n }\n continue;\n }\n\n if (child.localName === \"cubicBezTo\") {\n const points = getChildElements(child, \"pt\").map(parsePointNode).filter((point): point is { x: number; y: number } => point !== null);\n if (points.length === 3) {\n commands.push(`C ${points[0].x} ${points[0].y} ${points[1].x} ${points[1].y} ${points[2].x} ${points[2].y}`);\n lastPoint = points[2];\n }\n continue;\n }\n\n if (child.localName === \"close\") {\n commands.push(\"Z\");\n lastPoint = null;\n }\n }\n\n if (commands.length === 0) {\n return undefined;\n }\n\n return {\n path: commands.join(\" \"),\n viewBox: {\n height,\n width\n }\n };\n}\n\nfunction parseShapeGeometryAdjustments(shapeNode: Element) {\n const presetGeometry = getFirstDescendant(shapeNode, \"prstGeom\");\n if (!presetGeometry) {\n return undefined;\n }\n\n const adjustments: Record<string, number> = {};\n getChildElements(getFirstChild(presetGeometry, \"avLst\"), \"gd\").forEach((adjustmentNode) => {\n const name = adjustmentNode.getAttribute(\"name\");\n const formula = adjustmentNode.getAttribute(\"fmla\") ?? \"\";\n const match = formula.match(/^val\\s+(-?\\d+(?:\\.\\d+)?)$/);\n if (!name || !match) {\n return;\n }\n\n const value = Number.parseFloat(match[1] ?? \"\");\n if (Number.isFinite(value)) {\n adjustments[name] = value;\n }\n });\n\n return Object.keys(adjustments).length > 0 ? adjustments : undefined;\n}\n\nfunction parseShapeParagraphs(\n shapeNode: Element,\n styleNode: Element | null,\n theme: ThemeState\n): XlsxShape[\"paragraphs\"] {\n const txBodyNode = getFirstChild(shapeNode, \"txBody\");\n if (!txBodyNode) {\n return [];\n }\n\n const defaultFontRef = styleNode ? getFirstChild(styleNode, \"fontRef\") : null;\n const defaultFontColor = resolveColorValue(Array.from(defaultFontRef?.childNodes ?? []).filter(isElementNode)[0] ?? null, theme);\n const listStyleNode = getFirstChild(txBodyNode, \"lstStyle\");\n const paragraphs: XlsxShape[\"paragraphs\"] = [];\n\n getChildElements(txBodyNode, \"p\").forEach((paragraphNode) => {\n const paragraphProps = getFirstChild(paragraphNode, \"pPr\");\n const paragraphLevel = Number(paragraphProps?.getAttribute(\"lvl\") ?? 0);\n const listLevelProps = getFirstChild(listStyleNode ?? txBodyNode, `lvl${paragraphLevel + 1}pPr`);\n const inheritedStyle = mergeShapeTextStyles(\n parseShapeTextStyle(getFirstChild(listLevelProps ?? txBodyNode, \"defRPr\"), theme, defaultFontColor),\n parseShapeTextStyle(getFirstChild(paragraphProps ?? paragraphNode, \"defRPr\"), theme, defaultFontColor)\n );\n const runs: XlsxShape[\"paragraphs\"][number][\"runs\"] = [];\n let sawRenderableChild = false;\n\n Array.from(paragraphNode.childNodes).filter(isElementNode).forEach((child) => {\n if (child.localName === \"br\") {\n sawRenderableChild = true;\n runs.push({ text: \"\\n\" });\n return;\n }\n if (child.localName !== \"r\") {\n return;\n }\n\n sawRenderableChild = true;\n const text = getFirstChild(child, \"t\")?.textContent ?? \"\";\n const runProps = getFirstChild(child, \"rPr\");\n const runStyle = mergeShapeTextStyles(\n inheritedStyle,\n parseShapeTextStyle(runProps, theme, defaultFontColor)\n );\n\n runs.push({\n bold: runStyle.bold,\n color: runStyle.color,\n fontFamily: runStyle.fontFamily,\n fontSizePt: runStyle.fontSizePt,\n italic: runStyle.italic,\n text,\n underline: runStyle.underline\n });\n });\n\n if (runs.length === 0) {\n if (!sawRenderableChild && !getFirstChild(paragraphNode, \"endParaRPr\")) {\n return;\n }\n\n runs.push({\n bold: inheritedStyle.bold,\n color: inheritedStyle.color,\n fontFamily: inheritedStyle.fontFamily,\n fontSizePt: inheritedStyle.fontSizePt,\n italic: inheritedStyle.italic,\n text: \" \",\n underline: inheritedStyle.underline\n });\n }\n\n paragraphs.push({\n align: mapParagraphAlign(paragraphProps?.getAttribute(\"algn\")),\n runs\n });\n });\n\n return paragraphs;\n}\n\nfunction parseTextBox(shapeNode: Element): XlsxShape[\"textBox\"] | undefined {\n const txBodyNode = getFirstChild(shapeNode, \"txBody\");\n if (!txBodyNode) {\n return undefined;\n }\n\n const bodyProps = getFirstChild(txBodyNode, \"bodyPr\");\n const leftInset = emuToPixels(Number(bodyProps?.getAttribute(\"lIns\") ?? 91440));\n const rightInset = emuToPixels(Number(bodyProps?.getAttribute(\"rIns\") ?? 91440));\n const topInset = emuToPixels(Number(bodyProps?.getAttribute(\"tIns\") ?? 45720));\n const bottomInset = emuToPixels(Number(bodyProps?.getAttribute(\"bIns\") ?? 45720));\n\n return {\n horizontalAlign: bodyProps?.getAttribute(\"anchorCtr\") === \"1\" ? \"center\" : \"left\",\n insetPx: {\n bottom: bottomInset,\n left: leftInset,\n right: rightInset,\n top: topInset\n },\n verticalAlign: mapVerticalAnchor(bodyProps?.getAttribute(\"anchor\"))\n };\n}\n\nfunction getHyperlinkTarget(\n node: Element | null,\n drawingRelationships: Map<string, RelationshipRecord>\n) {\n const hyperlinkNode = node ? getFirstDescendant(node, \"hlinkClick\") : null;\n const hyperlinkTargetNode = hyperlinkNode ?? node;\n const hyperlinkId = hyperlinkTargetNode ? getRelationshipId(hyperlinkTargetNode) : null;\n return hyperlinkId ? drawingRelationships.get(hyperlinkId)?.target ?? undefined : undefined;\n}\n\nfunction parsePictureNode(\n pictureNode: Element,\n fallbackAnchor: XlsxImage[\"anchor\"],\n drawingRelationships: Map<string, RelationshipRecord>,\n archive: ArchiveEntries,\n contentTypes: ContentTypesState,\n objectUrls: string[],\n workbookSheetIndex: number,\n imageId: string,\n zIndex: number,\n parentGroup: GroupTransform | null\n) {\n const blipNode = getFirstDescendant(pictureNode, \"blip\");\n const svgBlipNode = blipNode ? getFirstDescendant(blipNode, \"svgBlip\") : null;\n const embedId = (svgBlipNode ? getEmbeddedRelationshipId(svgBlipNode) : null) ?? (blipNode ? getEmbeddedRelationshipId(blipNode) : null);\n if (!embedId) {\n return null;\n }\n\n const mediaRelationship = drawingRelationships.get(embedId);\n if (!mediaRelationship || mediaRelationship.type !== IMAGE_REL_TYPE) {\n return null;\n }\n\n const mediaBytes = archive[mediaRelationship.target];\n if (!mediaBytes) {\n return null;\n }\n\n const nonVisualProps = getFirstDescendant(pictureNode, \"cNvPr\");\n const transform = anchorFromNodeOrFallback(pictureNode, fallbackAnchor, parentGroup);\n return {\n image: {\n anchor: transform.anchor,\n description: nonVisualProps?.getAttribute(\"descr\") ?? undefined,\n hyperlink: getHyperlinkTarget(nonVisualProps ?? pictureNode, drawingRelationships),\n id: imageId,\n mediaPath: mediaRelationship.target,\n mimeType: resolveContentType(contentTypes, mediaRelationship.target),\n name: nonVisualProps?.getAttribute(\"name\") ?? undefined,\n sheetIndex: workbookSheetIndex,\n src: createImageSource(mediaBytes, resolveContentType(contentTypes, mediaRelationship.target), objectUrls),\n workbookSheetIndex,\n zIndex\n } satisfies XlsxImage,\n mediaPath: mediaRelationship.target\n };\n}\n\nfunction parseShapeNode(\n shapeNode: Element,\n fallbackAnchor: XlsxImage[\"anchor\"],\n drawingRelationships: Map<string, RelationshipRecord>,\n theme: ThemeState,\n workbookSheetIndex: number,\n shapeId: string,\n zIndex: number,\n parentGroup: GroupTransform | null\n) {\n const nonVisualProps = getFirstDescendant(shapeNode, \"cNvPr\");\n const styleNode = getFirstChild(shapeNode, \"style\");\n const transform = anchorFromNodeOrFallback(shapeNode, fallbackAnchor, parentGroup);\n const geometry = getFirstDescendant(shapeNode, \"prstGeom\")?.getAttribute(\"prst\")\n ?? (getFirstDescendant(shapeNode, \"custGeom\") ? \"custom\" : \"rect\");\n const customPath = geometry === \"custom\" ? parseCustomGeometryPath(shapeNode) : undefined;\n const geometryAdjustments = parseShapeGeometryAdjustments(shapeNode);\n return {\n anchor: transform.anchor,\n description: nonVisualProps?.getAttribute(\"descr\") ?? undefined,\n fill: parseShapeFill(shapeNode, styleNode, theme, geometry),\n flipH: transform.flipH,\n flipV: transform.flipV,\n geometry,\n geometryAdjustments,\n hidden: nonVisualProps?.getAttribute(\"hidden\") === \"1\" || undefined,\n hyperlink: getHyperlinkTarget(nonVisualProps ?? shapeNode, drawingRelationships),\n id: shapeId,\n name: nonVisualProps?.getAttribute(\"name\") ?? undefined,\n paragraphs: parseShapeParagraphs(shapeNode, styleNode, theme),\n rotationDeg: transform.rotationDeg,\n scaleX: transform.scaleX,\n scaleY: transform.scaleY,\n sheetIndex: workbookSheetIndex,\n svgPath: customPath?.path,\n svgViewBox: customPath?.viewBox,\n stroke: parseShapeStroke(shapeNode, styleNode, theme),\n textBox: parseTextBox(shapeNode),\n workbookSheetIndex,\n zIndex\n } satisfies XlsxShape;\n}\n\nfunction parseAnchorContents(\n anchorNode: Element,\n fallbackAnchor: XlsxImage[\"anchor\"],\n drawingRelationships: Map<string, RelationshipRecord>,\n archive: ArchiveEntries,\n contentTypes: ContentTypesState,\n objectUrls: string[],\n workbookSheetIndex: number,\n theme: ThemeState,\n ids: { image: number; shape: number; z: number },\n imageOriginsById: Map<string, WorkbookImageOrigin>,\n anchorIndex: number,\n sheetState: WorkbookSheetState | null,\n drawingPath: string,\n parentGroup: GroupTransform | null = null,\n picturePath: number[] = []\n) {\n const images: XlsxImage[] = [];\n const shapes: XlsxShape[] = [];\n const mediaPaths = new Set<string>();\n\n Array.from(anchorNode.childNodes).filter(isElementNode).forEach((child, childIndex) => {\n if (child.localName === \"pic\") {\n const imageId = `sheet-${workbookSheetIndex}-${ids.image}`;\n const parsed = parsePictureNode(\n child,\n fallbackAnchor,\n drawingRelationships,\n archive,\n contentTypes,\n objectUrls,\n workbookSheetIndex,\n imageId,\n ids.z++,\n parentGroup\n );\n ids.image += 1;\n if (parsed) {\n images.push(parsed.image);\n mediaPaths.add(parsed.mediaPath);\n imageOriginsById.set(imageId, {\n anchorIndex,\n drawingPath,\n picturePath: [...picturePath, childIndex],\n workbookSheetIndex\n });\n }\n return;\n }\n\n if (child.localName === \"sp\") {\n shapes.push(parseShapeNode(\n child,\n fallbackAnchor,\n drawingRelationships,\n theme,\n workbookSheetIndex,\n `shape-${workbookSheetIndex}-${ids.shape++}`,\n ids.z++,\n parentGroup\n ));\n return;\n }\n\n if (child.localName === \"cxnSp\") {\n shapes.push(parseShapeNode(\n child,\n fallbackAnchor,\n drawingRelationships,\n theme,\n workbookSheetIndex,\n `shape-${workbookSheetIndex}-${ids.shape++}`,\n ids.z++,\n parentGroup\n ));\n return;\n }\n\n if (child.localName !== \"grpSp\") {\n return;\n }\n\n const nextGroup = parseGroupTransform(\n child,\n parentGroup,\n fallbackAnchor,\n sheetState\n );\n const groupFallbackAnchor = rectToAbsoluteAnchor({\n cx: nextGroup.cx,\n cy: nextGroup.cy,\n x: nextGroup.x,\n y: nextGroup.y\n });\n const parsedGroup = parseAnchorContents(\n child,\n groupFallbackAnchor,\n drawingRelationships,\n archive,\n contentTypes,\n objectUrls,\n workbookSheetIndex,\n theme,\n ids,\n imageOriginsById,\n anchorIndex,\n sheetState,\n drawingPath,\n nextGroup,\n [...picturePath, childIndex]\n );\n parsedGroup.images.forEach((image) => images.push(image));\n parsedGroup.shapes.forEach((shape) => shapes.push(shape));\n parsedGroup.mediaPaths.forEach((path) => mediaPaths.add(path));\n });\n\n return {\n images,\n mediaPaths,\n shapes\n };\n}\n\nfunction parseDrawingObjects(\n archive: ArchiveEntries,\n contentTypes: ContentTypesState,\n drawingPath: string,\n objectUrls: string[],\n workbookSheetIndex: number,\n zIndexBase: number,\n theme: ThemeState,\n sheetState: WorkbookSheetState | null,\n imageOriginsById: Map<string, WorkbookImageOrigin>\n) {\n const drawingXml = readArchiveText(archive, drawingPath);\n if (!drawingXml) {\n return {\n images: [] as XlsxImage[],\n mediaPaths: [] as string[],\n shapes: [] as XlsxShape[]\n };\n }\n\n const drawingDocument = parseXml(drawingXml);\n if (!drawingDocument) {\n return {\n images: [] as XlsxImage[],\n mediaPaths: [] as string[],\n shapes: [] as XlsxShape[]\n };\n }\n\n const drawingRelationships = parseRelationships(archive, relsPathForDocument(drawingPath), drawingPath);\n const images: XlsxImage[] = [];\n const shapes: XlsxShape[] = [];\n const mediaPaths = new Set<string>();\n const anchorNodes = createImageAnchorNodes(drawingDocument);\n const ids = {\n image: zIndexBase,\n shape: zIndexBase,\n z: zIndexBase\n };\n\n anchorNodes.forEach((anchorNode, anchorIndex) => {\n const anchor = parseAnchor(anchorNode);\n if (!anchor) {\n return;\n }\n\n const parsed = parseAnchorContents(\n anchorNode,\n anchor,\n drawingRelationships,\n archive,\n contentTypes,\n objectUrls,\n workbookSheetIndex,\n theme,\n ids,\n imageOriginsById,\n anchorIndex,\n sheetState,\n drawingPath\n );\n parsed.images.forEach((image) => images.push(image));\n parsed.shapes.forEach((shape) => shapes.push(shape));\n parsed.mediaPaths.forEach((path) => mediaPaths.add(path));\n });\n\n return {\n images,\n mediaPaths: [...mediaPaths],\n shapes\n };\n}\n\nexport function refreshWorkbookFormControls(\n workbook: Workbook,\n _currentControlsByWorkbookSheetIndex: XlsxFormControl[][],\n themePalette?: XlsxThemePalette | null\n) {\n return collectWorkbookFormControls(workbook, themePalette);\n}\n\nexport function revokeWorkbookImageAssets(assets: WorkbookImageAssets | null) {\n if (!assets) {\n return;\n }\n\n for (const objectUrl of assets.objectUrls) {\n if (objectUrl.startsWith(\"blob:\")) {\n URL.revokeObjectURL(objectUrl);\n }\n }\n}\n\nfunction parseWorkbookStructureAssetsFromArchive(\n archive: ArchiveEntries,\n options?: ParseWorkbookStructureOptions\n): WorkbookStructureAssets & {\n contentTypes: ContentTypesState;\n theme: ThemeState;\n workbookSheets: WorkbookSheetInfo[];\n} {\n const contentTypes = parseContentTypes(archive);\n const workbookSheets = parseWorkbookSheets(archive);\n const theme = parseWorkbookTheme(archive);\n const themePalette = buildThemePalette(theme);\n const { defaultFont, differentialStyles, namedCellStyleByName, styleById, tableStyleByName } = parseWorkbookStyles(archive);\n return {\n contentTypes,\n namedCellStyleByName,\n sheetStatesByWorkbookSheetIndex: workbookSheets.map((sheet) => parseSheetState(archive, sheet.path, {\n ...options,\n differentialStyles,\n defaultFont,\n themePalette\n })),\n styleById,\n tableMetadataByWorkbookSheetIndex: workbookSheets.map(() => [] as WorkbookTableMetadata[]),\n tableStyleByName,\n theme,\n themePalette,\n workbookSheets\n };\n}\n\nexport function parseWorkbookStructureAssets(\n bytes: Uint8Array,\n options?: ParseWorkbookStructureOptions\n): WorkbookStructureAssets {\n const archive = unzipSync(bytes);\n const {\n namedCellStyleByName,\n sheetStatesByWorkbookSheetIndex,\n styleById,\n tableMetadataByWorkbookSheetIndex,\n tableStyleByName,\n themePalette\n } = parseWorkbookStructureAssetsFromArchive(archive, options);\n\n return {\n namedCellStyleByName,\n sheetStatesByWorkbookSheetIndex,\n styleById,\n tableMetadataByWorkbookSheetIndex,\n tableStyleByName,\n themePalette\n };\n}\n\nexport function parseWorkbookChartStyleAssets(bytes: Uint8Array): WorkbookChartStyleAssets {\n const archive = unzipSync(bytes);\n const {\n themePalette,\n workbookSheets\n } = parseWorkbookStructureAssetsFromArchive(archive);\n const sheetOrigins: Array<WorkbookImageSheetOrigin | null> = [];\n\n workbookSheets.forEach((sheet, workbookSheetIndex) => {\n const sheetRelationships = parseRelationships(archive, relsPathForDocument(sheet.path), sheet.path);\n const attachments: XlsxImageAttachment[] = [];\n\n for (const relationship of sheetRelationships.values()) {\n if (relationship.type !== DRAWING_REL_TYPE) {\n continue;\n }\n\n const drawingPath = relationship.target;\n const drawingRelsPath = relsPathForDocument(drawingPath);\n attachments.push({\n drawingPath,\n drawingRelsPath: archive[drawingRelsPath] ? drawingRelsPath : null,\n mediaPaths: []\n });\n }\n\n sheetOrigins[workbookSheetIndex] = attachments.length > 0\n ? {\n attachments,\n workbookSheetIndex\n }\n : null;\n });\n\n return {\n archive,\n sheetOrigins,\n themePalette\n };\n}\n\nexport function parseWorkbookImageAssets(\n bytes: Uint8Array,\n workbook?: Workbook\n): WorkbookImageAssets {\n const archive = unzipSync(bytes);\n const {\n contentTypes,\n namedCellStyleByName,\n sheetStatesByWorkbookSheetIndex,\n styleById,\n tableMetadataByWorkbookSheetIndex,\n tableStyleByName,\n theme,\n themePalette,\n workbookSheets\n } = parseWorkbookStructureAssetsFromArchive(archive);\n const objectUrls: string[] = [];\n const formControlsByWorkbookSheetIndex: XlsxFormControl[][] = [];\n const imagesByWorkbookSheetIndex: XlsxImage[][] = [];\n const shapesByWorkbookSheetIndex: XlsxShape[][] = [];\n const sheetOrigins: Array<WorkbookImageSheetOrigin | null> = [];\n const imageOriginsById = new Map<string, WorkbookImageOrigin>();\n const formControls = workbook\n ? collectWorkbookFormControls(workbook, themePalette)\n : [];\n\n workbookSheets.forEach((sheet, workbookSheetIndex) => {\n const sheetRelationships = parseRelationships(archive, relsPathForDocument(sheet.path), sheet.path);\n const attachments: XlsxImageAttachment[] = [];\n const imageList: XlsxImage[] = [];\n const shapeList: XlsxShape[] = [];\n let zIndexBase = 1;\n\n for (const relationship of sheetRelationships.values()) {\n if (relationship.type !== DRAWING_REL_TYPE) {\n continue;\n }\n\n const drawingPath = relationship.target;\n const drawingRelsPath = relsPathForDocument(drawingPath);\n const drawingImages = parseDrawingObjects(\n archive,\n contentTypes,\n drawingPath,\n objectUrls,\n workbookSheetIndex,\n zIndexBase,\n theme,\n sheetStatesByWorkbookSheetIndex[workbookSheetIndex] ?? null,\n imageOriginsById\n );\n imageList.push(...drawingImages.images);\n shapeList.push(...drawingImages.shapes);\n zIndexBase += drawingImages.images.length + drawingImages.shapes.length + 10;\n attachments.push({\n drawingPath,\n drawingRelsPath: archive[drawingRelsPath] ? drawingRelsPath : null,\n mediaPaths: drawingImages.mediaPaths\n });\n }\n\n const visibleShapeList = shapeList.filter((shape) => !shape.hidden);\n formControlsByWorkbookSheetIndex[workbookSheetIndex] = formControls[workbookSheetIndex] ?? [];\n imagesByWorkbookSheetIndex[workbookSheetIndex] = imageList;\n shapesByWorkbookSheetIndex[workbookSheetIndex] = visibleShapeList;\n sheetOrigins[workbookSheetIndex] = attachments.length > 0\n ? {\n attachments,\n workbookSheetIndex\n }\n : null;\n });\n\n return {\n archive,\n dirtyArchivePaths: new Set(),\n formControlsByWorkbookSheetIndex,\n imageOriginsById,\n imagesByWorkbookSheetIndex,\n namedCellStyleByName,\n objectUrls,\n shapesByWorkbookSheetIndex,\n sheetOrigins,\n sheetStatesByWorkbookSheetIndex,\n styleById,\n tableMetadataByWorkbookSheetIndex,\n tableStyleByName,\n themePalette\n };\n}\n\nfunction updateAnchorNode(anchorNode: Element, anchor: XlsxImage[\"anchor\"]) {\n if (anchor.kind === \"two-cell\") {\n updateMarkerElement(getFirstChild(anchorNode, \"from\"), anchor.from);\n updateMarkerElement(getFirstChild(anchorNode, \"to\"), anchor.to);\n return;\n }\n\n if (anchor.kind === \"one-cell\") {\n updateMarkerElement(getFirstChild(anchorNode, \"from\"), anchor.from);\n const extNode = getFirstChild(anchorNode, \"ext\");\n if (extNode) {\n extNode.setAttribute(\"cx\", String(Math.max(0, Math.round(anchor.sizeEmu.cx))));\n extNode.setAttribute(\"cy\", String(Math.max(0, Math.round(anchor.sizeEmu.cy))));\n }\n return;\n }\n\n const positionNode = getFirstChild(anchorNode, \"pos\");\n if (positionNode) {\n positionNode.setAttribute(\"x\", String(Math.max(0, Math.round(anchor.positionEmu.x))));\n positionNode.setAttribute(\"y\", String(Math.max(0, Math.round(anchor.positionEmu.y))));\n }\n const extNode = getFirstChild(anchorNode, \"ext\");\n if (extNode) {\n extNode.setAttribute(\"cx\", String(Math.max(0, Math.round(anchor.sizeEmu.cx))));\n extNode.setAttribute(\"cy\", String(Math.max(0, Math.round(anchor.sizeEmu.cy))));\n }\n}\n\nexport function updateWorkbookImageAnchor(\n assets: WorkbookImageAssets,\n imageId: string,\n anchor: XlsxImage[\"anchor\"]\n) {\n const origin = assets.imageOriginsById.get(imageId);\n if (!origin) {\n return false;\n }\n\n const attachments = assets.sheetOrigins[origin.workbookSheetIndex]?.attachments ?? [];\n for (const attachment of attachments) {\n if (attachment.drawingPath !== origin.drawingPath) {\n continue;\n }\n const drawingXml = readArchiveText(assets.archive, attachment.drawingPath);\n if (!drawingXml) {\n continue;\n }\n\n const drawingDocument = parseXml(drawingXml);\n if (!drawingDocument) {\n continue;\n }\n\n const anchorNodes = createImageAnchorNodes(drawingDocument);\n const anchorNode = anchorNodes[origin.anchorIndex];\n if (!anchorNode) {\n continue;\n }\n\n let pictureNode = anchorNode;\n let parentGroup: GroupTransform | null = null;\n let groupAnchor = parseAnchor(anchorNode);\n for (const childIndex of origin.picturePath) {\n const child = Array.from(pictureNode.childNodes).filter(isElementNode)[childIndex];\n if (!child || !groupAnchor) {\n break;\n }\n pictureNode = child;\n if (child.localName === \"grpSp\") {\n parentGroup = parseGroupTransform(\n child,\n parentGroup,\n groupAnchor,\n assets.sheetStatesByWorkbookSheetIndex[origin.workbookSheetIndex] ?? null\n );\n groupAnchor = rectToAbsoluteAnchor(parentGroup);\n }\n }\n if (pictureNode.localName !== \"pic\") {\n continue;\n }\n\n if (parentGroup) {\n const transform = getFirstDescendant(pictureNode, \"xfrm\");\n const off = transform ? getFirstChild(transform, \"off\") : null;\n const ext = transform ? getFirstChild(transform, \"ext\") : null;\n if (anchor.kind !== \"absolute\" || !off || !ext || !parentGroup.scaleX || !parentGroup.scaleY) {\n continue;\n }\n off.setAttribute(\"x\", String(Math.round(parentGroup.chX + (anchor.positionEmu.x - parentGroup.x) / parentGroup.scaleX)));\n off.setAttribute(\"y\", String(Math.round(parentGroup.chY + (anchor.positionEmu.y - parentGroup.y) / parentGroup.scaleY)));\n ext.setAttribute(\"cx\", String(Math.max(0, Math.round(anchor.sizeEmu.cx / parentGroup.scaleX))));\n ext.setAttribute(\"cy\", String(Math.max(0, Math.round(anchor.sizeEmu.cy / parentGroup.scaleY))));\n } else {\n updateAnchorNode(anchorNode, anchor);\n }\n assets.archive[attachment.drawingPath] = strToU8(serializeXml(drawingDocument));\n assets.dirtyArchivePaths.add(normalizeArchivePath(attachment.drawingPath));\n const imageList = assets.imagesByWorkbookSheetIndex[origin.workbookSheetIndex] ?? [];\n const imageIndex = imageList.findIndex((image) => image.id === imageId);\n if (imageIndex >= 0) {\n imageList[imageIndex] = {\n ...imageList[imageIndex],\n anchor\n };\n }\n return true;\n }\n\n return false;\n}\n\nfunction ensureRelationshipsDocument(archive: ArchiveEntries, relsPath: string) {\n const existing = readArchiveText(archive, relsPath);\n if (existing) {\n const parsed = parseXml(existing);\n if (parsed) {\n return parsed;\n }\n }\n\n return parseXml(\n `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?><Relationships xmlns=\"${PKG_REL_NS}\"></Relationships>`\n );\n}\n\nfunction ensureContentTypesDocument(archive: ArchiveEntries) {\n const existing = readArchiveText(archive, \"[Content_Types].xml\");\n if (existing) {\n const parsed = parseXml(existing);\n if (parsed) {\n return parsed;\n }\n }\n\n return parseXml(\n `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?><Types xmlns=\"${CONTENT_TYPES_NS}\"></Types>`\n );\n}\n\nfunction mergeContentTypeForPath(\n targetDocument: XMLDocument,\n originalDocument: XMLDocument | null,\n partPath: string\n) {\n const normalizedPartName = `/${normalizeArchivePath(partPath)}`;\n const targetRoot = targetDocument.documentElement;\n if (!targetRoot) {\n return;\n }\n\n const existingOverride = getLocalElements(targetDocument, \"Override\").find(\n (node) => node.getAttribute(\"PartName\") === normalizedPartName\n );\n if (!existingOverride && originalDocument) {\n const sourceOverride = getLocalElements(originalDocument, \"Override\").find(\n (node) => node.getAttribute(\"PartName\") === normalizedPartName\n );\n if (sourceOverride) {\n targetRoot.appendChild(sourceOverride.cloneNode(true));\n return;\n }\n }\n\n const extension = normalizedPartName.split(\".\").pop()?.toLowerCase();\n if (!extension) {\n return;\n }\n\n const existingDefault = getLocalElements(targetDocument, \"Default\").find(\n (node) => (node.getAttribute(\"Extension\") ?? \"\").toLowerCase() === extension\n );\n if (existingDefault) {\n return;\n }\n\n if (originalDocument) {\n const sourceDefault = getLocalElements(originalDocument, \"Default\").find(\n (node) => (node.getAttribute(\"Extension\") ?? \"\").toLowerCase() === extension\n );\n if (sourceDefault) {\n targetRoot.appendChild(sourceDefault.cloneNode(true));\n return;\n }\n }\n\n if (extension === \"xml\") {\n const defaultNode = targetDocument.createElementNS(CONTENT_TYPES_NS, \"Default\");\n defaultNode.setAttribute(\"Extension\", extension);\n defaultNode.setAttribute(\"ContentType\", \"application/xml\");\n targetRoot.appendChild(defaultNode);\n return;\n }\n\n if (extension === \"rels\") {\n const defaultNode = targetDocument.createElementNS(CONTENT_TYPES_NS, \"Default\");\n defaultNode.setAttribute(\"Extension\", extension);\n defaultNode.setAttribute(\"ContentType\", \"application/vnd.openxmlformats-package.relationships+xml\");\n targetRoot.appendChild(defaultNode);\n }\n}\n\nfunction removeDrawingReferences(sheetDocument: XMLDocument, relDocument: XMLDocument) {\n getLocalElements(sheetDocument, \"drawing\").forEach((node) => node.remove());\n getLocalElements(relDocument, \"Relationship\")\n .filter((node) => node.getAttribute(\"Type\") === DRAWING_REL_TYPE)\n .forEach((node) => node.remove());\n}\n\nfunction nextRelationshipId(relDocument: XMLDocument) {\n const existingIds = new Set(\n getLocalElements(relDocument, \"Relationship\")\n .map((node) => node.getAttribute(\"Id\"))\n .filter((value): value is string => Boolean(value))\n );\n\n let index = 1;\n while (existingIds.has(`rIdReactXlsxImage${index}`)) {\n index += 1;\n }\n\n return `rIdReactXlsxImage${index}`;\n}\n\nfunction appendSheetDrawingReference(\n sheetDocument: XMLDocument,\n relationshipId: string\n) {\n const worksheet = sheetDocument.documentElement;\n if (!worksheet) {\n return;\n }\n\n const drawingNode = sheetDocument.createElementNS(SPREADSHEET_NS, \"drawing\");\n drawingNode.setAttributeNS(REL_NS, \"r:id\", relationshipId);\n\n const successorNames = new Set([\n \"legacyDrawing\",\n \"legacyDrawingHF\",\n \"picture\",\n \"oleObjects\",\n \"controls\",\n \"webPublishItems\",\n \"tableParts\",\n \"extLst\"\n ]);\n const successor = Array.from(worksheet.childNodes).find((node) => (\n isElementNode(node) && node.namespaceURI === SPREADSHEET_NS && successorNames.has(node.localName)\n ));\n worksheet.insertBefore(drawingNode, successor ?? null);\n}\n\nexport function mergeWorkbookImageAssets(\n savedBytes: Uint8Array,\n sourceAssets: WorkbookImageAssets | null,\n sheetOrigins: Array<WorkbookImageSheetOrigin | null>\n) {\n if (!sourceAssets) {\n return cloneBytes(savedBytes);\n }\n\n try {\n const archive = unzipSync(savedBytes);\n const workbookSheets = parseWorkbookSheets(archive);\n const originalContentTypesDocument = parseXml(readArchiveText(sourceAssets.archive, \"[Content_Types].xml\") ?? \"\");\n const targetContentTypesDocument = ensureContentTypesDocument(archive);\n if (!targetContentTypesDocument) {\n return cloneBytes(savedBytes);\n }\n\n const copiedParts = new Set<string>();\n const copyDrawingPart = (path: string) => {\n const normalizedPath = normalizeArchivePath(path);\n const bytes = sourceAssets.archive[normalizedPath];\n if (!bytes || copiedParts.has(normalizedPath)) {\n return;\n }\n copiedParts.add(normalizedPath);\n archive[normalizedPath] = cloneBytes(bytes);\n mergeContentTypeForPath(targetContentTypesDocument, originalContentTypesDocument, normalizedPath);\n\n const relsPath = relsPathForDocument(normalizedPath);\n const relsBytes = sourceAssets.archive[relsPath];\n if (!relsBytes) {\n return;\n }\n archive[relsPath] = cloneBytes(relsBytes);\n mergeContentTypeForPath(targetContentTypesDocument, originalContentTypesDocument, relsPath);\n for (const relationship of parseRelationships(sourceAssets.archive, relsPath, normalizedPath).values()) {\n if (relationship.targetMode !== \"External\" && !relationship.type.endsWith(\"/hyperlink\")) {\n copyDrawingPart(relationship.target);\n }\n }\n };\n\n sheetOrigins.forEach((origin, workbookSheetIndex) => {\n if (!origin?.attachments.length) {\n return;\n }\n\n const currentSheet = workbookSheets[workbookSheetIndex];\n if (!currentSheet) {\n return;\n }\n\n const sheetXml = readArchiveText(archive, currentSheet.path);\n if (!sheetXml) {\n return;\n }\n\n const sheetDocument = parseXml(sheetXml);\n const relsPath = relsPathForDocument(currentSheet.path);\n const relDocument = ensureRelationshipsDocument(archive, relsPath);\n if (!sheetDocument || !relDocument) {\n return;\n }\n\n removeDrawingReferences(sheetDocument, relDocument);\n\n origin.attachments.forEach((attachment) => {\n const drawingBytes = sourceAssets.archive[attachment.drawingPath];\n if (!drawingBytes) {\n return;\n }\n\n copyDrawingPart(attachment.drawingPath);\n\n const relationshipId = nextRelationshipId(relDocument);\n const relationshipNode = relDocument.createElementNS(PKG_REL_NS, \"Relationship\");\n relationshipNode.setAttribute(\"Id\", relationshipId);\n relationshipNode.setAttribute(\"Type\", DRAWING_REL_TYPE);\n relationshipNode.setAttribute(\"Target\", relativeArchivePath(currentSheet.path, attachment.drawingPath));\n relDocument.documentElement?.appendChild(relationshipNode);\n appendSheetDrawingReference(sheetDocument, relationshipId);\n });\n\n archive[currentSheet.path] = strToU8(serializeXml(sheetDocument));\n archive[relsPath] = strToU8(serializeXml(relDocument));\n mergeContentTypeForPath(targetContentTypesDocument, originalContentTypesDocument, relsPath);\n });\n\n for (const dirtyPath of sourceAssets.dirtyArchivePaths) {\n const bytes = sourceAssets.archive[dirtyPath];\n if (!bytes) {\n continue;\n }\n archive[dirtyPath] = cloneBytes(bytes);\n mergeContentTypeForPath(targetContentTypesDocument, originalContentTypesDocument, dirtyPath);\n }\n\n const hasDrawingOverride = getLocalElements(targetContentTypesDocument, \"Override\").some(\n (node) => node.getAttribute(\"ContentType\") === DRAWING_CONTENT_TYPE\n );\n if (!hasDrawingOverride) {\n for (const path of Object.keys(archive)) {\n if (path.startsWith(\"xl/drawings/\") && path.endsWith(\".xml\")) {\n mergeContentTypeForPath(targetContentTypesDocument, originalContentTypesDocument, path);\n }\n }\n }\n\n archive[\"[Content_Types].xml\"] = strToU8(serializeXml(targetContentTypesDocument));\n return zipSync(archive, { level: 6 });\n } catch {\n return cloneBytes(savedBytes);\n }\n}\n\nexport function emuToPixels(value: number) {\n return value / EMU_PER_PIXEL;\n}\n\nexport function pixelsToEmu(value: number) {\n return value * EMU_PER_PIXEL;\n}\n\nexport function pxToSheetColumnWidth(widthPx: number) {\n return (Math.max(widthPx, MIN_COL_WIDTH_PX) - 5) / 7;\n}\n\nexport function resolveSheetColumnWidthPixels(width: number, columnWidthCharacterWidthPx?: number) {\n return sheetColumnWidthToPixels(width, columnWidthCharacterWidthPx);\n}\n\nexport function resolveSheetRowHeightPixels(height: number) {\n return Math.max(Math.round(height * 1.33), MIN_ROW_HEIGHT_PX);\n}\n\nexport function resolveRenderedSheetAxisPixels(sizePx: number, showGridLines = true) {\n return Math.max(0, sizePx) + (showGridLines ? resolveDeviceGridlineThicknessPx() : 0);\n}\n\nexport function resolveContentSheetAxisPixels(sizePx: number, showGridLines = true) {\n return Math.max(0, sizePx - (showGridLines ? resolveDeviceGridlineThicknessPx() : 0));\n}\n\nfunction markerFromOffset(offsetPx: number, getSizePx: (index: number) => number) {\n let remaining = Math.max(0, offsetPx);\n let index = 0;\n while (remaining > 0) {\n const size = Math.max(0, getSizePx(index));\n if (remaining < size) {\n break;\n }\n remaining -= size;\n index += 1;\n }\n\n return {\n index,\n offsetPx: remaining\n };\n}\n\nexport function rectToImageAnchor(\n rect: XlsxImageRect,\n currentAnchor: XlsxImage[\"anchor\"],\n options: {\n contentOffsetLeft: number;\n contentOffsetTop: number;\n getColumnWidthPx: (col: number) => number;\n getRowHeightPx: (row: number) => number;\n }\n): XlsxImage[\"anchor\"] {\n const contentLeft = Math.max(0, rect.left - options.contentOffsetLeft);\n const contentTop = Math.max(0, rect.top - options.contentOffsetTop);\n const contentRight = Math.max(contentLeft + 1, rect.left + rect.width - options.contentOffsetLeft);\n const contentBottom = Math.max(contentTop + 1, rect.top + rect.height - options.contentOffsetTop);\n\n if (currentAnchor.kind === \"absolute\") {\n return {\n kind: \"absolute\",\n positionEmu: {\n x: pixelsToEmu(contentLeft),\n y: pixelsToEmu(contentTop)\n },\n sizeEmu: {\n cx: pixelsToEmu(rect.width),\n cy: pixelsToEmu(rect.height)\n }\n };\n }\n\n const fromCol = markerFromOffset(contentLeft, options.getColumnWidthPx);\n const fromRow = markerFromOffset(contentTop, options.getRowHeightPx);\n if (currentAnchor.kind === \"one-cell\") {\n return {\n from: {\n col: fromCol.index,\n colOffsetEmu: pixelsToEmu(fromCol.offsetPx),\n row: fromRow.index,\n rowOffsetEmu: pixelsToEmu(fromRow.offsetPx)\n },\n kind: \"one-cell\",\n sizeEmu: {\n cx: pixelsToEmu(rect.width),\n cy: pixelsToEmu(rect.height)\n }\n };\n }\n\n const toCol = markerFromOffset(contentRight, options.getColumnWidthPx);\n const toRow = markerFromOffset(contentBottom, options.getRowHeightPx);\n return {\n from: {\n col: fromCol.index,\n colOffsetEmu: pixelsToEmu(fromCol.offsetPx),\n row: fromRow.index,\n rowOffsetEmu: pixelsToEmu(fromRow.offsetPx)\n },\n kind: \"two-cell\",\n to: {\n col: toCol.index,\n colOffsetEmu: pixelsToEmu(toCol.offsetPx),\n row: toRow.index,\n rowOffsetEmu: pixelsToEmu(toRow.offsetPx)\n }\n };\n}\n\nexport function resizeImageRect(\n rect: XlsxImageRect,\n handle: XlsxImageResizeHandlePosition,\n deltaX: number,\n deltaY: number,\n minimumSize = 16\n) {\n let left = rect.left;\n let top = rect.top;\n let width = rect.width;\n let height = rect.height;\n\n if (handle.includes(\"w\")) {\n left += deltaX;\n width -= deltaX;\n }\n if (handle.includes(\"e\")) {\n width += deltaX;\n }\n if (handle.includes(\"n\")) {\n top += deltaY;\n height -= deltaY;\n }\n if (handle.includes(\"s\")) {\n height += deltaY;\n }\n\n if (width < minimumSize) {\n if (handle.includes(\"w\")) {\n left -= minimumSize - width;\n }\n width = minimumSize;\n }\n if (height < minimumSize) {\n if (handle.includes(\"n\")) {\n top -= minimumSize - height;\n }\n height = minimumSize;\n }\n\n return { height, left, top, width };\n}\n","import type { Workbook } from \"@dukelib/sheets-wasm\";\n\nconst SHEET_REF_REGEX = /'((?:[^']|'')+)'!|([A-Za-z_\\u0080-\\uFFFF][\\w.\\u0080-\\uFFFF]*)!/g;\n\ntype FormulaCell = { formula?: string | null; row?: number; col?: number };\n\ntype CellPosition = { sheetIdx: number; row: number; col: number };\n\nfunction collectReferencedSheetNames(workbook: Workbook): Set<string> {\n const referenced = new Set<string>();\n for (let sheetIdx = 0; sheetIdx < workbook.sheetCount; sheetIdx += 1) {\n let sheet;\n try {\n sheet = workbook.getSheet(sheetIdx);\n } catch {\n continue;\n }\n const cells = sheet.formulaCells as FormulaCell[] | null | undefined;\n if (!Array.isArray(cells)) {\n continue;\n }\n for (const cell of cells) {\n const formula = cell?.formula;\n if (!formula) {\n continue;\n }\n SHEET_REF_REGEX.lastIndex = 0;\n let match: RegExpExecArray | null;\n while ((match = SHEET_REF_REGEX.exec(formula)) !== null) {\n const raw = match[1] ?? match[2];\n if (!raw) {\n continue;\n }\n referenced.add(raw.replace(/''/g, \"'\"));\n }\n }\n }\n return referenced;\n}\n\nfunction hasUnresolvedSheetReferences(workbook: Workbook): boolean {\n let names: string[];\n try {\n names = workbook.sheetNames;\n } catch {\n return false;\n }\n const known = new Set(names);\n const referenced = collectReferencedSheetNames(workbook);\n for (const name of referenced) {\n if (!known.has(name)) {\n return true;\n }\n }\n return false;\n}\n\nfunction collectFormulaCellsWithSavedValues(workbook: Workbook): CellPosition[] {\n const positions: CellPosition[] = [];\n for (let sheetIdx = 0; sheetIdx < workbook.sheetCount; sheetIdx += 1) {\n let sheet;\n try {\n sheet = workbook.getSheet(sheetIdx);\n } catch {\n continue;\n }\n const cells = sheet.formulaCells as FormulaCell[] | null | undefined;\n if (!Array.isArray(cells)) {\n continue;\n }\n for (const cell of cells) {\n if (typeof cell?.row !== \"number\" || typeof cell?.col !== \"number\") {\n continue;\n }\n let saved;\n try {\n saved = sheet.getCalculatedValueAt(cell.row, cell.col);\n } catch {\n continue;\n }\n if (!saved.is_empty && !saved.is_error) {\n positions.push({ sheetIdx, row: cell.row, col: cell.col });\n }\n }\n }\n return positions;\n}\n\nfunction anyBecameError(workbook: Workbook, positions: CellPosition[]): boolean {\n return positions.some(({ sheetIdx, row, col }) => {\n try {\n return workbook.getSheet(sheetIdx).getCalculatedValueAt(row, col).is_error;\n } catch {\n return false;\n }\n });\n}\n\nexport type SafeCalculateSkipReason = \"unresolved-sheet-refs\" | \"calculate-trapped\" | \"calculate-regressed\";\n\nexport type SafeCalculateResult = {\n workbook: Workbook;\n calculated: boolean;\n skipReason: SafeCalculateSkipReason | null;\n};\n\nexport type SafeCalculateOptions = {\n reparse?: () => Workbook;\n};\n\n// Pre-scans for formulas referencing missing sheets (which cause the Rust\n// engine to panic into a wasm `unreachable` trap that poisons the Workbook\n// instance). On trap, `reparse` is used to return a fresh usable instance.\n//\n// Also falls back to the saved values when calculating turns a formula that\n// had a saved value into an error — e.g. a reference to a name defined as a\n// formula (`Total = SUM(A1:A3)`), which the engine evaluates to #VALUE! —\n// instead of showing errors the file never had.\nexport function safeCalculate(workbook: Workbook, options: SafeCalculateOptions = {}): SafeCalculateResult {\n if (hasUnresolvedSheetReferences(workbook)) {\n return { workbook, calculated: false, skipReason: \"unresolved-sheet-refs\" };\n }\n const withSavedValues = options.reparse ? collectFormulaCellsWithSavedValues(workbook) : [];\n try {\n workbook.calculate();\n } catch (err) {\n console.warn(\"[react-xlsx] workbook.calculate() trapped; falling back to cached formula values\", err);\n if (options.reparse) {\n try {\n return { workbook: options.reparse(), calculated: false, skipReason: \"calculate-trapped\" };\n } catch (reparseErr) {\n console.warn(\"[react-xlsx] workbook reparse after calculate trap failed\", reparseErr);\n }\n }\n return { workbook, calculated: false, skipReason: \"calculate-trapped\" };\n }\n if (options.reparse && anyBecameError(workbook, withSavedValues)) {\n try {\n return { workbook: options.reparse(), calculated: false, skipReason: \"calculate-regressed\" };\n } catch (reparseErr) {\n console.warn(\"[react-xlsx] workbook reparse after calculate regression failed\", reparseErr);\n }\n }\n return { workbook, calculated: true, skipReason: null };\n}\n\nexport function tryRecalculate(workbook: Workbook): { calculated: boolean; error: unknown } {\n try {\n workbook.calculate();\n return { calculated: true, error: null };\n } catch (err) {\n console.warn(\"[react-xlsx] workbook.calculate() trapped during recalculation\", err);\n return { calculated: false, error: err };\n }\n}\n","let wasmModulePromise: Promise<typeof import(\"@dukelib/sheets-wasm\")> | null = null;\n\nexport type XlsxWasmSource =\n | string\n | URL\n | Request\n | Response\n | BufferSource\n | WebAssembly.Module;\n\nexport type WorkerWasmSource = string | ArrayBuffer | WebAssembly.Module;\n\nlet hasConfiguredWasmSource = false;\nlet configuredWasmSource: XlsxWasmSource | undefined;\nlet configuredWorkerWasmSource: WorkerWasmSource | undefined;\n\nfunction bufferSourceToArrayBuffer(source: ArrayBuffer | ArrayBufferView<ArrayBufferLike>): ArrayBuffer {\n if (source instanceof ArrayBuffer) {\n return source.slice(0);\n }\n\n const bytes = new Uint8Array(source.buffer, source.byteOffset, source.byteLength);\n const copy = new Uint8Array(bytes);\n return copy.buffer;\n}\n\nfunction sourceToWorkerSource(source: XlsxWasmSource): WorkerWasmSource | undefined {\n if (typeof source === \"string\") {\n return source;\n }\n if (typeof URL !== \"undefined\" && source instanceof URL) {\n return source.href;\n }\n if (typeof Request !== \"undefined\" && source instanceof Request) {\n return source.url;\n }\n if (source instanceof ArrayBuffer || ArrayBuffer.isView(source)) {\n return bufferSourceToArrayBuffer(source);\n }\n if (typeof WebAssembly !== \"undefined\" && source instanceof WebAssembly.Module) {\n return source;\n }\n\n return undefined;\n}\n\nexport function setWasmSource(source: XlsxWasmSource): void {\n hasConfiguredWasmSource = true;\n configuredWasmSource = source;\n configuredWorkerWasmSource = sourceToWorkerSource(source);\n}\n\nexport function initWasm(source?: XlsxWasmSource) {\n if (source !== undefined) {\n setWasmSource(source);\n }\n\n return getSheetsWasmModule();\n}\n\nexport function canUseConfiguredWasmSourceInWorker(): boolean {\n return !hasConfiguredWasmSource || configuredWorkerWasmSource !== undefined;\n}\n\nexport function getConfiguredWorkerWasmSource(): WorkerWasmSource | undefined {\n return configuredWorkerWasmSource;\n}\n\nexport function getSheetsWasmModule() {\n if (!wasmModulePromise) {\n wasmModulePromise = import(\"@dukelib/sheets-wasm\").then(async (mod) => {\n if (configuredWasmSource !== undefined) {\n await mod.default({ module_or_path: configuredWasmSource });\n } else {\n await mod.default();\n }\n return mod;\n });\n }\n\n return wasmModulePromise;\n}\n"],"mappings":"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","names":["strFromU8","unzipSync","styleAppearance","plotAreaShapeProperties","workbook","primarySeries","ext","cx","cy","chartsheets","chartsByWorkbookSheetIndex","tabs","normalizeHexColor","parseHexColor","rgbToHsl","hueToRgb","hslToRgb","rgbToHex","themeColor","strFromU8","strToU8","EMU_PER_PIXEL","normalizeArchivePath","dirname","dirname","parseXml","document","readArchiveText","strFromU8","isElementNode","document","parseXml","readArchiveText","document","parseXml","normalizeArchivePath","readArchiveText","document","parseXml","sheets","isElementNode","normalizeHexColor","normalizeHexColor","workbook","workbook","MIN_ROW_HEIGHT_PX","normalizeWorksheetVisibility","readArchiveText","strFromU8","unzipSync","parseA1CellReference","parseA1RangeReference"]}
1
+ {"version":3,"sources":["../../../node_modules/.pnpm/@dukelib+sheets-wasm@0.1.23/node_modules/@dukelib/sheets-wasm/duke_sheets_wasm.js","../../../node_modules/.pnpm/fflate@0.8.3/node_modules/fflate/esm/browser.js","../src/builtin-chart-styles.ts","../src/charts.ts","../src/colors.ts","../src/cell-alignment.ts","../src/images.ts","../src/safe-calculate.ts","../src/wasm.ts","../src/xlsx-worker.ts"],"sourcesContent":["/* @ts-self-types=\"./duke_sheets_wasm.d.ts\" */\n\nexport class CellValue {\n static __wrap(ptr) {\n ptr = ptr >>> 0;\n const obj = Object.create(CellValue.prototype);\n obj.__wbg_ptr = ptr;\n CellValueFinalization.register(obj, obj.__wbg_ptr, obj);\n return obj;\n }\n __destroy_into_raw() {\n const ptr = this.__wbg_ptr;\n this.__wbg_ptr = 0;\n CellValueFinalization.unregister(this);\n return ptr;\n }\n free() {\n const ptr = this.__destroy_into_raw();\n wasm.__wbg_cellvalue_free(ptr, 0);\n }\n /**\n * @returns {boolean | undefined}\n */\n asBoolean() {\n const ret = wasm.cellvalue_asBoolean(this.__wbg_ptr);\n return ret === 0xFFFFFF ? undefined : ret !== 0;\n }\n /**\n * @returns {string | undefined}\n */\n asError() {\n const ret = wasm.cellvalue_asError(this.__wbg_ptr);\n let v1;\n if (ret[0] !== 0) {\n v1 = getStringFromWasm0(ret[0], ret[1]).slice();\n wasm.__wbindgen_free(ret[0], ret[1] * 1, 1);\n }\n return v1;\n }\n /**\n * @returns {number | undefined}\n */\n asNumber() {\n const ret = wasm.cellvalue_asNumber(this.__wbg_ptr);\n return ret[0] === 0 ? undefined : ret[1];\n }\n /**\n * @returns {string | undefined}\n */\n asText() {\n const ret = wasm.cellvalue_asText(this.__wbg_ptr);\n let v1;\n if (ret[0] !== 0) {\n v1 = getStringFromWasm0(ret[0], ret[1]).slice();\n wasm.__wbindgen_free(ret[0], ret[1] * 1, 1);\n }\n return v1;\n }\n /**\n * @returns {boolean}\n */\n get is_boolean() {\n const ret = wasm.cellvalue_is_boolean(this.__wbg_ptr);\n return ret !== 0;\n }\n /**\n * @returns {boolean}\n */\n get is_empty() {\n const ret = wasm.cellvalue_is_empty(this.__wbg_ptr);\n return ret !== 0;\n }\n /**\n * @returns {boolean}\n */\n get is_error() {\n const ret = wasm.cellvalue_is_error(this.__wbg_ptr);\n return ret !== 0;\n }\n /**\n * @returns {boolean}\n */\n get is_number() {\n const ret = wasm.cellvalue_is_number(this.__wbg_ptr);\n return ret !== 0;\n }\n /**\n * @returns {boolean}\n */\n get is_text() {\n const ret = wasm.cellvalue_is_text(this.__wbg_ptr);\n return ret !== 0;\n }\n /**\n * @returns {any}\n */\n toJs() {\n const ret = wasm.cellvalue_toJs(this.__wbg_ptr);\n return ret;\n }\n /**\n * @returns {string}\n */\n toString() {\n let deferred1_0;\n let deferred1_1;\n try {\n const ret = wasm.cellvalue_toString(this.__wbg_ptr);\n deferred1_0 = ret[0];\n deferred1_1 = ret[1];\n return getStringFromWasm0(ret[0], ret[1]);\n } finally {\n wasm.__wbindgen_free(deferred1_0, deferred1_1, 1);\n }\n }\n}\nif (Symbol.dispose) CellValue.prototype[Symbol.dispose] = CellValue.prototype.free;\n\nexport class Workbook {\n static __wrap(ptr) {\n ptr = ptr >>> 0;\n const obj = Object.create(Workbook.prototype);\n obj.__wbg_ptr = ptr;\n WorkbookFinalization.register(obj, obj.__wbg_ptr, obj);\n return obj;\n }\n __destroy_into_raw() {\n const ptr = this.__wbg_ptr;\n this.__wbg_ptr = 0;\n WorkbookFinalization.unregister(this);\n return ptr;\n }\n free() {\n const ptr = this.__destroy_into_raw();\n wasm.__wbg_workbook_free(ptr, 0);\n }\n /**\n * @returns {number}\n */\n get activeSheet() {\n const ret = wasm.workbook_activeSheet(this.__wbg_ptr);\n if (ret[2]) {\n throw takeFromExternrefTable0(ret[1]);\n }\n return ret[0] >>> 0;\n }\n /**\n * @param {string} name\n * @returns {number}\n */\n addSheet(name) {\n const ptr0 = passStringToWasm0(name, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);\n const len0 = WASM_VECTOR_LEN;\n const ret = wasm.workbook_addSheet(this.__wbg_ptr, ptr0, len0);\n if (ret[2]) {\n throw takeFromExternrefTable0(ret[1]);\n }\n return ret[0] >>> 0;\n }\n /**\n * @param {any | null} [options]\n * @returns {any}\n */\n calculate(options) {\n const ret = wasm.workbook_calculate(this.__wbg_ptr, isLikeNone(options) ? 0 : addToExternrefTable0(options));\n if (ret[2]) {\n throw takeFromExternrefTable0(ret[1]);\n }\n return takeFromExternrefTable0(ret[0]);\n }\n /**\n * @returns {number}\n */\n get chartsheetCount() {\n const ret = wasm.workbook_chartsheetCount(this.__wbg_ptr);\n if (ret[2]) {\n throw takeFromExternrefTable0(ret[1]);\n }\n return ret[0] >>> 0;\n }\n /**\n * @returns {any}\n */\n get chartsheets() {\n const ret = wasm.workbook_chartsheets(this.__wbg_ptr);\n if (ret[2]) {\n throw takeFromExternrefTable0(ret[1]);\n }\n return takeFromExternrefTable0(ret[0]);\n }\n /**\n * @param {string} name\n * @param {string} refers_to\n */\n defineName(name, refers_to) {\n const ptr0 = passStringToWasm0(name, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);\n const len0 = WASM_VECTOR_LEN;\n const ptr1 = passStringToWasm0(refers_to, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);\n const len1 = WASM_VECTOR_LEN;\n const ret = wasm.workbook_defineName(this.__wbg_ptr, ptr0, len0, ptr1, len1);\n if (ret[1]) {\n throw takeFromExternrefTable0(ret[0]);\n }\n }\n /**\n * Load a workbook from bytes, auto-detecting the format (XLSX or XLS).\n * @param {Uint8Array} data\n * @returns {Workbook}\n */\n static fromBytes(data) {\n const ptr0 = passArray8ToWasm0(data, wasm.__wbindgen_malloc);\n const len0 = WASM_VECTOR_LEN;\n const ret = wasm.workbook_fromBytes(ptr0, len0);\n if (ret[2]) {\n throw takeFromExternrefTable0(ret[1]);\n }\n return Workbook.__wrap(ret[0]);\n }\n /**\n * Load a password-protected workbook from bytes, auto-detecting\n * the format (XLSX or XLS). `skipIntegrityCheck` skips the HMAC\n * integrity check on Agile-encrypted files (matches Office\n * behaviour); defaults to false.\n * @param {Uint8Array} data\n * @param {string} password\n * @param {boolean | null} [skip_integrity_check]\n * @returns {Workbook}\n */\n static fromBytesWithPassword(data, password, skip_integrity_check) {\n const ptr0 = passArray8ToWasm0(data, wasm.__wbindgen_malloc);\n const len0 = WASM_VECTOR_LEN;\n const ptr1 = passStringToWasm0(password, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);\n const len1 = WASM_VECTOR_LEN;\n const ret = wasm.workbook_fromBytesWithPassword(ptr0, len0, ptr1, len1, isLikeNone(skip_integrity_check) ? 0xFFFFFF : skip_integrity_check ? 1 : 0);\n if (ret[2]) {\n throw takeFromExternrefTable0(ret[1]);\n }\n return Workbook.__wrap(ret[0]);\n }\n /**\n * @param {string} csv\n * @returns {Workbook}\n */\n static fromCsvString(csv) {\n const ptr0 = passStringToWasm0(csv, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);\n const len0 = WASM_VECTOR_LEN;\n const ret = wasm.workbook_fromCsvString(ptr0, len0);\n if (ret[2]) {\n throw takeFromExternrefTable0(ret[1]);\n }\n return Workbook.__wrap(ret[0]);\n }\n /**\n * @param {string} name\n * @returns {string | undefined}\n */\n getNamedRange(name) {\n const ptr0 = passStringToWasm0(name, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);\n const len0 = WASM_VECTOR_LEN;\n const ret = wasm.workbook_getNamedRange(this.__wbg_ptr, ptr0, len0);\n if (ret[3]) {\n throw takeFromExternrefTable0(ret[2]);\n }\n let v2;\n if (ret[0] !== 0) {\n v2 = getStringFromWasm0(ret[0], ret[1]).slice();\n wasm.__wbindgen_free(ret[0], ret[1] * 1, 1);\n }\n return v2;\n }\n /**\n * @param {number} index\n * @returns {Worksheet}\n */\n getSheet(index) {\n const ret = wasm.workbook_getSheet(this.__wbg_ptr, index);\n if (ret[2]) {\n throw takeFromExternrefTable0(ret[1]);\n }\n return Worksheet.__wrap(ret[0]);\n }\n /**\n * @param {string} name\n * @returns {Worksheet}\n */\n getSheetByName(name) {\n const ptr0 = passStringToWasm0(name, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);\n const len0 = WASM_VECTOR_LEN;\n const ret = wasm.workbook_getSheetByName(this.__wbg_ptr, ptr0, len0);\n if (ret[2]) {\n throw takeFromExternrefTable0(ret[1]);\n }\n return Worksheet.__wrap(ret[0]);\n }\n /**\n * @returns {boolean}\n */\n get isEmpty() {\n const ret = wasm.workbook_isEmpty(this.__wbg_ptr);\n if (ret[2]) {\n throw takeFromExternrefTable0(ret[1]);\n }\n return ret[0] !== 0;\n }\n /**\n * @param {string} csv\n * @returns {Workbook}\n */\n static loadCsvString(csv) {\n const ptr0 = passStringToWasm0(csv, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);\n const len0 = WASM_VECTOR_LEN;\n const ret = wasm.workbook_loadCsvString(ptr0, len0);\n if (ret[2]) {\n throw takeFromExternrefTable0(ret[1]);\n }\n return Workbook.__wrap(ret[0]);\n }\n /**\n * @returns {any}\n */\n get namedRanges() {\n const ret = wasm.workbook_namedRanges(this.__wbg_ptr);\n if (ret[2]) {\n throw takeFromExternrefTable0(ret[1]);\n }\n return takeFromExternrefTable0(ret[0]);\n }\n constructor() {\n const ret = wasm.workbook_new();\n this.__wbg_ptr = ret >>> 0;\n WorkbookFinalization.register(this, this.__wbg_ptr, this);\n return this;\n }\n /**\n * @param {number} index\n */\n removeSheet(index) {\n const ret = wasm.workbook_removeSheet(this.__wbg_ptr, index);\n if (ret[1]) {\n throw takeFromExternrefTable0(ret[0]);\n }\n }\n /**\n * Resolve a drawing color to display RGB (`RRGGBB` hex) against\n * this workbook's theme palette. `auto` has no fixed RGB and\n * resolves to `null`.\n * @param {any} color\n * @returns {string | undefined}\n */\n resolveColor(color) {\n const ret = wasm.workbook_resolveColor(this.__wbg_ptr, color);\n if (ret[3]) {\n throw takeFromExternrefTable0(ret[2]);\n }\n let v1;\n if (ret[0] !== 0) {\n v1 = getStringFromWasm0(ret[0], ret[1]).slice();\n wasm.__wbindgen_free(ret[0], ret[1] * 1, 1);\n }\n return v1;\n }\n /**\n * Save the first sheet as a CSV string, with form-control state\n * synchronized into linked cells in the output.\n * @returns {string}\n */\n saveCsvString() {\n let deferred2_0;\n let deferred2_1;\n try {\n const ret = wasm.workbook_saveCsvString(this.__wbg_ptr);\n var ptr1 = ret[0];\n var len1 = ret[1];\n if (ret[3]) {\n ptr1 = 0; len1 = 0;\n throw takeFromExternrefTable0(ret[2]);\n }\n deferred2_0 = ptr1;\n deferred2_1 = len1;\n return getStringFromWasm0(ptr1, len1);\n } finally {\n wasm.__wbindgen_free(deferred2_0, deferred2_1, 1);\n }\n }\n /**\n * Save the workbook as encrypted XLS bytes after synchronizing\n * form-control state into linked cells. `profile` selects\n * the FilePass variant; `null` defaults to RC4 CryptoAPI 128.\n * Valid values: `\"rc4-cryptoapi\"`, `\"rc4-legacy\"`, `\"xor\"`.\n * `keyBits` controls RC4 CryptoAPI key size (40 or 128). XOR is\n * not certified to interoperate with modern Excel.\n * @param {string} password\n * @param {string | null} [profile]\n * @param {number | null} [key_bits]\n * @returns {Uint8Array}\n */\n saveXlsBytesEncrypted(password, profile, key_bits) {\n const ptr0 = passStringToWasm0(password, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);\n const len0 = WASM_VECTOR_LEN;\n var ptr1 = isLikeNone(profile) ? 0 : passStringToWasm0(profile, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);\n var len1 = WASM_VECTOR_LEN;\n const ret = wasm.workbook_saveXlsBytesEncrypted(this.__wbg_ptr, ptr0, len0, ptr1, len1, isLikeNone(key_bits) ? 0x100000001 : (key_bits) >>> 0);\n if (ret[3]) {\n throw takeFromExternrefTable0(ret[2]);\n }\n var v3 = getArrayU8FromWasm0(ret[0], ret[1]).slice();\n wasm.__wbindgen_free(ret[0], ret[1] * 1, 1);\n return v3;\n }\n /**\n * Save XLSB bytes with form-control state synchronized into linked cells,\n * replacing existing values and formulas in the output.\n * @returns {Uint8Array}\n */\n saveXlsbBytes() {\n const ret = wasm.workbook_saveXlsbBytes(this.__wbg_ptr);\n if (ret[3]) {\n throw takeFromExternrefTable0(ret[2]);\n }\n var v1 = getArrayU8FromWasm0(ret[0], ret[1]).slice();\n wasm.__wbindgen_free(ret[0], ret[1] * 1, 1);\n return v1;\n }\n /**\n * Save XLSX bytes with form-control state synchronized into linked cells,\n * replacing existing values and formulas in the output.\n * @returns {Uint8Array}\n */\n saveXlsxBytes() {\n const ret = wasm.workbook_saveXlsxBytes(this.__wbg_ptr);\n if (ret[3]) {\n throw takeFromExternrefTable0(ret[2]);\n }\n var v1 = getArrayU8FromWasm0(ret[0], ret[1]).slice();\n wasm.__wbindgen_free(ret[0], ret[1] * 1, 1);\n return v1;\n }\n /**\n * Save the workbook as encrypted XLSX bytes after synchronizing\n * form-control state into linked cells. `profile` selects\n * the encryption variant; passing `null`/`undefined` uses the\n * Agile-256 default. Valid values: `\"agile\"`, `\"standard\"`.\n * `keyBits` and `spinCount` override the defaults where the\n * profile supports them.\n * @param {string} password\n * @param {string | null} [profile]\n * @param {number | null} [key_bits]\n * @param {number | null} [spin_count]\n * @returns {Uint8Array}\n */\n saveXlsxBytesEncrypted(password, profile, key_bits, spin_count) {\n const ptr0 = passStringToWasm0(password, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);\n const len0 = WASM_VECTOR_LEN;\n var ptr1 = isLikeNone(profile) ? 0 : passStringToWasm0(profile, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);\n var len1 = WASM_VECTOR_LEN;\n const ret = wasm.workbook_saveXlsxBytesEncrypted(this.__wbg_ptr, ptr0, len0, ptr1, len1, isLikeNone(key_bits) ? 0x100000001 : (key_bits) >>> 0, isLikeNone(spin_count) ? 0x100000001 : (spin_count) >>> 0);\n if (ret[3]) {\n throw takeFromExternrefTable0(ret[2]);\n }\n var v3 = getArrayU8FromWasm0(ret[0], ret[1]).slice();\n wasm.__wbindgen_free(ret[0], ret[1] * 1, 1);\n return v3;\n }\n /**\n * @param {any} protection\n */\n setWorkbookProtection(protection) {\n const ret = wasm.workbook_setWorkbookProtection(this.__wbg_ptr, protection);\n if (ret[1]) {\n throw takeFromExternrefTable0(ret[0]);\n }\n }\n /**\n * @returns {any}\n */\n get settings() {\n const ret = wasm.workbook_settings(this.__wbg_ptr);\n if (ret[2]) {\n throw takeFromExternrefTable0(ret[1]);\n }\n return takeFromExternrefTable0(ret[0]);\n }\n /**\n * @returns {number}\n */\n get sheetCount() {\n const ret = wasm.workbook_sheetCount(this.__wbg_ptr);\n if (ret[2]) {\n throw takeFromExternrefTable0(ret[1]);\n }\n return ret[0] >>> 0;\n }\n /**\n * @param {string} name\n * @returns {number | undefined}\n */\n sheetIndex(name) {\n const ptr0 = passStringToWasm0(name, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);\n const len0 = WASM_VECTOR_LEN;\n const ret = wasm.workbook_sheetIndex(this.__wbg_ptr, ptr0, len0);\n if (ret[2]) {\n throw takeFromExternrefTable0(ret[1]);\n }\n return ret[0] === 0x100000001 ? undefined : ret[0];\n }\n /**\n * @returns {string[]}\n */\n get sheetNames() {\n const ret = wasm.workbook_sheetNames(this.__wbg_ptr);\n if (ret[3]) {\n throw takeFromExternrefTable0(ret[2]);\n }\n var v1 = getArrayJsValueFromWasm0(ret[0], ret[1]).slice();\n wasm.__wbindgen_free(ret[0], ret[1] * 4, 4);\n return v1;\n }\n /**\n * @returns {any}\n */\n get sheetOrder() {\n const ret = wasm.workbook_sheetOrder(this.__wbg_ptr);\n if (ret[2]) {\n throw takeFromExternrefTable0(ret[1]);\n }\n return takeFromExternrefTable0(ret[0]);\n }\n /**\n * Project all form-control state into linked cells.\n * @returns {number}\n */\n syncFormControls() {\n const ret = wasm.workbook_syncFormControls(this.__wbg_ptr);\n return ret >>> 0;\n }\n /**\n * Drive controls from formula-backed linked cells.\n * @returns {number}\n */\n syncFormControlsFromLinkedCells() {\n const ret = wasm.workbook_syncFormControlsFromLinkedCells(this.__wbg_ptr);\n return ret >>> 0;\n }\n /**\n * The workbook theme's 12 clrScheme colors as `RRGGBB` hex, in\n * theme-index order (background 1, text 1, background 2, text 2,\n * accent 1-6, hyperlink, followed hyperlink). The Office default\n * palette when the file carries no theme.\n * @returns {string[]}\n */\n get themePalette() {\n const ret = wasm.workbook_themePalette(this.__wbg_ptr);\n var v1 = getArrayJsValueFromWasm0(ret[0], ret[1]).slice();\n wasm.__wbindgen_free(ret[0], ret[1] * 4, 4);\n return v1;\n }\n /**\n * @returns {number}\n */\n get totalSheetCount() {\n const ret = wasm.workbook_totalSheetCount(this.__wbg_ptr);\n if (ret[2]) {\n throw takeFromExternrefTable0(ret[1]);\n }\n return ret[0] >>> 0;\n }\n /**\n * @returns {any}\n */\n get workbookProtection() {\n const ret = wasm.workbook_workbookProtection(this.__wbg_ptr);\n if (ret[2]) {\n throw takeFromExternrefTable0(ret[1]);\n }\n return takeFromExternrefTable0(ret[0]);\n }\n}\nif (Symbol.dispose) Workbook.prototype[Symbol.dispose] = Workbook.prototype.free;\n\nexport class Worksheet {\n static __wrap(ptr) {\n ptr = ptr >>> 0;\n const obj = Object.create(Worksheet.prototype);\n obj.__wbg_ptr = ptr;\n WorksheetFinalization.register(obj, obj.__wbg_ptr, obj);\n return obj;\n }\n __destroy_into_raw() {\n const ptr = this.__wbg_ptr;\n this.__wbg_ptr = 0;\n WorksheetFinalization.unregister(this);\n return ptr;\n }\n free() {\n const ptr = this.__destroy_into_raw();\n wasm.__wbg_worksheet_free(ptr, 0);\n }\n /**\n * Append a top-level drawing and return its z-order index.\n * @param {any} input\n * @returns {number}\n */\n addDrawing(input) {\n const ret = wasm.worksheet_addDrawing(this.__wbg_ptr, input);\n if (ret[2]) {\n throw takeFromExternrefTable0(ret[1]);\n }\n return ret[0] >>> 0;\n }\n /**\n * @returns {any}\n */\n get autoFilter() {\n const ret = wasm.worksheet_autoFilter(this.__wbg_ptr);\n if (ret[2]) {\n throw takeFromExternrefTable0(ret[1]);\n }\n return takeFromExternrefTable0(ret[0]);\n }\n /**\n * @returns {number}\n */\n get cellCount() {\n const ret = wasm.worksheet_cellCount(this.__wbg_ptr);\n if (ret[2]) {\n throw takeFromExternrefTable0(ret[1]);\n }\n return ret[0] >>> 0;\n }\n /**\n * @returns {number}\n */\n get chartCount() {\n const ret = wasm.worksheet_chartCount(this.__wbg_ptr);\n if (ret[2]) {\n throw takeFromExternrefTable0(ret[1]);\n }\n return ret[0] >>> 0;\n }\n /**\n * @returns {number}\n */\n get chartExCount() {\n const ret = wasm.worksheet_chartExCount(this.__wbg_ptr);\n if (ret[2]) {\n throw takeFromExternrefTable0(ret[1]);\n }\n return ret[0] >>> 0;\n }\n /**\n * All standard charts in depth-first drawing order.\n * @returns {any}\n */\n get charts() {\n const ret = wasm.worksheet_charts(this.__wbg_ptr);\n if (ret[2]) {\n throw takeFromExternrefTable0(ret[1]);\n }\n return takeFromExternrefTable0(ret[0]);\n }\n /**\n * All ChartEx charts in depth-first drawing order.\n * @returns {any}\n */\n get chartsEx() {\n const ret = wasm.worksheet_chartsEx(this.__wbg_ptr);\n if (ret[2]) {\n throw takeFromExternrefTable0(ret[1]);\n }\n return takeFromExternrefTable0(ret[0]);\n }\n /**\n * @returns {any}\n */\n get colBreaks() {\n const ret = wasm.worksheet_colBreaks(this.__wbg_ptr);\n if (ret[2]) {\n throw takeFromExternrefTable0(ret[1]);\n }\n return takeFromExternrefTable0(ret[0]);\n }\n /**\n * @returns {string[]}\n */\n get commentAuthors() {\n const ret = wasm.worksheet_commentAuthors(this.__wbg_ptr);\n if (ret[3]) {\n throw takeFromExternrefTable0(ret[2]);\n }\n var v1 = getArrayJsValueFromWasm0(ret[0], ret[1]).slice();\n wasm.__wbindgen_free(ret[0], ret[1] * 4, 4);\n return v1;\n }\n /**\n * @returns {number}\n */\n get commentCount() {\n const ret = wasm.worksheet_commentCount(this.__wbg_ptr);\n if (ret[2]) {\n throw takeFromExternrefTable0(ret[1]);\n }\n return ret[0] >>> 0;\n }\n /**\n * @returns {any}\n */\n get comments() {\n const ret = wasm.worksheet_comments(this.__wbg_ptr);\n if (ret[2]) {\n throw takeFromExternrefTable0(ret[1]);\n }\n return takeFromExternrefTable0(ret[0]);\n }\n /**\n * @returns {number}\n */\n get conditionalFormatCount() {\n const ret = wasm.worksheet_conditionalFormatCount(this.__wbg_ptr);\n if (ret[2]) {\n throw takeFromExternrefTable0(ret[1]);\n }\n return ret[0] >>> 0;\n }\n /**\n * @returns {any}\n */\n get conditionalFormats() {\n const ret = wasm.worksheet_conditionalFormats(this.__wbg_ptr);\n if (ret[2]) {\n throw takeFromExternrefTable0(ret[1]);\n }\n return takeFromExternrefTable0(ret[0]);\n }\n /**\n * @returns {number}\n */\n get dataValidationCount() {\n const ret = wasm.worksheet_dataValidationCount(this.__wbg_ptr);\n if (ret[2]) {\n throw takeFromExternrefTable0(ret[1]);\n }\n return ret[0] >>> 0;\n }\n /**\n * @returns {any}\n */\n get dataValidations() {\n const ret = wasm.worksheet_dataValidations(this.__wbg_ptr);\n if (ret[2]) {\n throw takeFromExternrefTable0(ret[1]);\n }\n return takeFromExternrefTable0(ret[0]);\n }\n /**\n * @returns {boolean}\n */\n get date1904() {\n const ret = wasm.worksheet_date1904(this.__wbg_ptr);\n if (ret[2]) {\n throw takeFromExternrefTable0(ret[1]);\n }\n return ret[0] !== 0;\n }\n /**\n * @returns {number}\n */\n get defaultColumnWidth() {\n const ret = wasm.worksheet_defaultColumnWidth(this.__wbg_ptr);\n if (ret[2]) {\n throw takeFromExternrefTable0(ret[1]);\n }\n return ret[0];\n }\n /**\n * @returns {number}\n */\n get defaultRowHeight() {\n const ret = wasm.worksheet_defaultRowHeight(this.__wbg_ptr);\n if (ret[2]) {\n throw takeFromExternrefTable0(ret[1]);\n }\n return ret[0];\n }\n /**\n * Return image bytes for an image drawing without copying them into metadata getters.\n * @param {any} path\n * @returns {Uint8Array}\n */\n drawingImageData(path) {\n const ret = wasm.worksheet_drawingImageData(this.__wbg_ptr, path);\n if (ret[3]) {\n throw takeFromExternrefTable0(ret[2]);\n }\n var v1 = getArrayU8FromWasm0(ret[0], ret[1]).slice();\n wasm.__wbindgen_free(ret[0], ret[1] * 1, 1);\n return v1;\n }\n /**\n * Return an image drawing's SVG companion bytes, when present.\n * @param {any} path\n * @returns {Uint8Array | undefined}\n */\n drawingSvgData(path) {\n const ret = wasm.worksheet_drawingSvgData(this.__wbg_ptr, path);\n if (ret[3]) {\n throw takeFromExternrefTable0(ret[2]);\n }\n let v1;\n if (ret[0] !== 0) {\n v1 = getArrayU8FromWasm0(ret[0], ret[1]).slice();\n wasm.__wbindgen_free(ret[0], ret[1] * 1, 1);\n }\n return v1;\n }\n /**\n * The recursive drawing tree in top-level z-order.\n * @returns {any}\n */\n get drawings() {\n const ret = wasm.worksheet_drawings(this.__wbg_ptr);\n if (ret[2]) {\n throw takeFromExternrefTable0(ret[1]);\n }\n return takeFromExternrefTable0(ret[0]);\n }\n /**\n * @returns {number}\n */\n get formControlCount() {\n const ret = wasm.worksheet_formControlCount(this.__wbg_ptr);\n if (ret[2]) {\n throw takeFromExternrefTable0(ret[1]);\n }\n return ret[0] >>> 0;\n }\n /**\n * All form controls in depth-first drawing order.\n * @returns {any}\n */\n get formControls() {\n const ret = wasm.worksheet_formControls(this.__wbg_ptr);\n if (ret[2]) {\n throw takeFromExternrefTable0(ret[1]);\n }\n return takeFromExternrefTable0(ret[0]);\n }\n /**\n * @returns {any}\n */\n get formulaCells() {\n const ret = wasm.worksheet_formulaCells(this.__wbg_ptr);\n if (ret[2]) {\n throw takeFromExternrefTable0(ret[1]);\n }\n return takeFromExternrefTable0(ret[0]);\n }\n /**\n * Get the number of formula cells in this worksheet.\n * @returns {number}\n */\n get formulaCount() {\n const ret = wasm.worksheet_formulaCount(this.__wbg_ptr);\n if (ret[2]) {\n throw takeFromExternrefTable0(ret[1]);\n }\n return ret[0] >>> 0;\n }\n /**\n * @returns {any}\n */\n get freezePanes() {\n const ret = wasm.worksheet_freezePanes(this.__wbg_ptr);\n if (ret[2]) {\n throw takeFromExternrefTable0(ret[1]);\n }\n return takeFromExternrefTable0(ret[0]);\n }\n /**\n * @param {string} address\n * @returns {CellValue}\n */\n getCalculatedValue(address) {\n const ptr0 = passStringToWasm0(address, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);\n const len0 = WASM_VECTOR_LEN;\n const ret = wasm.worksheet_getCalculatedValue(this.__wbg_ptr, ptr0, len0);\n if (ret[2]) {\n throw takeFromExternrefTable0(ret[1]);\n }\n return CellValue.__wrap(ret[0]);\n }\n /**\n * @param {number} row\n * @param {number} col\n * @returns {CellValue}\n */\n getCalculatedValueAt(row, col) {\n const ret = wasm.worksheet_getCalculatedValueAt(this.__wbg_ptr, row, col);\n if (ret[2]) {\n throw takeFromExternrefTable0(ret[1]);\n }\n return CellValue.__wrap(ret[0]);\n }\n /**\n * @param {string} address\n * @returns {CellValue}\n */\n getCell(address) {\n const ptr0 = passStringToWasm0(address, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);\n const len0 = WASM_VECTOR_LEN;\n const ret = wasm.worksheet_getCell(this.__wbg_ptr, ptr0, len0);\n if (ret[2]) {\n throw takeFromExternrefTable0(ret[1]);\n }\n return CellValue.__wrap(ret[0]);\n }\n /**\n * @param {number} row\n * @param {number} col\n * @returns {CellValue}\n */\n getCellAt(row, col) {\n const ret = wasm.worksheet_getCellAt(this.__wbg_ptr, row, col);\n if (ret[2]) {\n throw takeFromExternrefTable0(ret[1]);\n }\n return CellValue.__wrap(ret[0]);\n }\n /**\n * @param {string} address\n * @returns {any}\n */\n getCellStyle(address) {\n const ptr0 = passStringToWasm0(address, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);\n const len0 = WASM_VECTOR_LEN;\n const ret = wasm.worksheet_getCellStyle(this.__wbg_ptr, ptr0, len0);\n if (ret[2]) {\n throw takeFromExternrefTable0(ret[1]);\n }\n return takeFromExternrefTable0(ret[0]);\n }\n /**\n * @param {number} row\n * @param {number} col\n * @returns {any}\n */\n getCellStyleAt(row, col) {\n const ret = wasm.worksheet_getCellStyleAt(this.__wbg_ptr, row, col);\n if (ret[2]) {\n throw takeFromExternrefTable0(ret[1]);\n }\n return takeFromExternrefTable0(ret[0]);\n }\n /**\n * @param {number} col\n * @returns {number}\n */\n getColumnOutlineLevel(col) {\n const ret = wasm.worksheet_getColumnOutlineLevel(this.__wbg_ptr, col);\n if (ret[2]) {\n throw takeFromExternrefTable0(ret[1]);\n }\n return ret[0] >>> 0;\n }\n /**\n * @param {number} col\n * @returns {number | undefined}\n */\n getColumnWidth(col) {\n const ret = wasm.worksheet_getColumnWidth(this.__wbg_ptr, col);\n if (ret[3]) {\n throw takeFromExternrefTable0(ret[2]);\n }\n return ret[0] === 0 ? undefined : ret[1];\n }\n /**\n * @param {string} address\n * @returns {any}\n */\n getComment(address) {\n const ptr0 = passStringToWasm0(address, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);\n const len0 = WASM_VECTOR_LEN;\n const ret = wasm.worksheet_getComment(this.__wbg_ptr, ptr0, len0);\n if (ret[2]) {\n throw takeFromExternrefTable0(ret[1]);\n }\n return takeFromExternrefTable0(ret[0]);\n }\n /**\n * @param {number} row\n * @param {number} col\n * @returns {any}\n */\n getCommentAt(row, col) {\n const ret = wasm.worksheet_getCommentAt(this.__wbg_ptr, row, col);\n if (ret[2]) {\n throw takeFromExternrefTable0(ret[1]);\n }\n return takeFromExternrefTable0(ret[0]);\n }\n /**\n * @param {string} address\n * @returns {string}\n */\n getFormattedValue(address) {\n let deferred3_0;\n let deferred3_1;\n try {\n const ptr0 = passStringToWasm0(address, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);\n const len0 = WASM_VECTOR_LEN;\n const ret = wasm.worksheet_getFormattedValue(this.__wbg_ptr, ptr0, len0);\n var ptr2 = ret[0];\n var len2 = ret[1];\n if (ret[3]) {\n ptr2 = 0; len2 = 0;\n throw takeFromExternrefTable0(ret[2]);\n }\n deferred3_0 = ptr2;\n deferred3_1 = len2;\n return getStringFromWasm0(ptr2, len2);\n } finally {\n wasm.__wbindgen_free(deferred3_0, deferred3_1, 1);\n }\n }\n /**\n * @param {number} row\n * @param {number} col\n * @returns {string}\n */\n getFormattedValueAt(row, col) {\n let deferred2_0;\n let deferred2_1;\n try {\n const ret = wasm.worksheet_getFormattedValueAt(this.__wbg_ptr, row, col);\n var ptr1 = ret[0];\n var len1 = ret[1];\n if (ret[3]) {\n ptr1 = 0; len1 = 0;\n throw takeFromExternrefTable0(ret[2]);\n }\n deferred2_0 = ptr1;\n deferred2_1 = len1;\n return getStringFromWasm0(ptr1, len1);\n } finally {\n wasm.__wbindgen_free(deferred2_0, deferred2_1, 1);\n }\n }\n /**\n * @param {number} row\n * @param {number} col\n * @returns {string | undefined}\n */\n getFormulaAt(row, col) {\n const ret = wasm.worksheet_getFormulaAt(this.__wbg_ptr, row, col);\n if (ret[3]) {\n throw takeFromExternrefTable0(ret[2]);\n }\n let v1;\n if (ret[0] !== 0) {\n v1 = getStringFromWasm0(ret[0], ret[1]).slice();\n wasm.__wbindgen_free(ret[0], ret[1] * 1, 1);\n }\n return v1;\n }\n /**\n * @param {string} address\n * @returns {any}\n */\n getHyperlink(address) {\n const ptr0 = passStringToWasm0(address, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);\n const len0 = WASM_VECTOR_LEN;\n const ret = wasm.worksheet_getHyperlink(this.__wbg_ptr, ptr0, len0);\n if (ret[2]) {\n throw takeFromExternrefTable0(ret[1]);\n }\n return takeFromExternrefTable0(ret[0]);\n }\n /**\n * @param {number} row\n * @param {number} col\n * @returns {any}\n */\n getHyperlinkAt(row, col) {\n const ret = wasm.worksheet_getHyperlinkAt(this.__wbg_ptr, row, col);\n if (ret[2]) {\n throw takeFromExternrefTable0(ret[1]);\n }\n return takeFromExternrefTable0(ret[0]);\n }\n /**\n * @param {number} row\n * @param {number} col\n * @returns {any}\n */\n getImageAt(row, col) {\n const ret = wasm.worksheet_getImageAt(this.__wbg_ptr, row, col);\n if (ret[2]) {\n throw takeFromExternrefTable0(ret[1]);\n }\n return takeFromExternrefTable0(ret[0]);\n }\n /**\n * @param {number} row\n * @param {number} col\n * @returns {any}\n */\n getMergeSpan(row, col) {\n const ret = wasm.worksheet_getMergeSpan(this.__wbg_ptr, row, col);\n if (ret[2]) {\n throw takeFromExternrefTable0(ret[1]);\n }\n return takeFromExternrefTable0(ret[0]);\n }\n /**\n * @param {number} row\n * @returns {number | undefined}\n */\n getRowHeight(row) {\n const ret = wasm.worksheet_getRowHeight(this.__wbg_ptr, row);\n if (ret[3]) {\n throw takeFromExternrefTable0(ret[2]);\n }\n return ret[0] === 0 ? undefined : ret[1];\n }\n /**\n * @param {number} row\n * @returns {number}\n */\n getRowOutlineLevel(row) {\n const ret = wasm.worksheet_getRowOutlineLevel(this.__wbg_ptr, row);\n if (ret[2]) {\n throw takeFromExternrefTable0(ret[1]);\n }\n return ret[0] >>> 0;\n }\n /**\n * @param {number} start_row\n * @param {number} max_rows\n * @param {any} options\n * @returns {any}\n */\n getRowsBatch(start_row, max_rows, options) {\n const ret = wasm.worksheet_getRowsBatch(this.__wbg_ptr, start_row, max_rows, options);\n if (ret[2]) {\n throw takeFromExternrefTable0(ret[1]);\n }\n return takeFromExternrefTable0(ret[0]);\n }\n /**\n * @param {number} row\n * @param {number} col\n * @returns {any}\n */\n getSpillSource(row, col) {\n const ret = wasm.worksheet_getSpillSource(this.__wbg_ptr, row, col);\n if (ret[2]) {\n throw takeFromExternrefTable0(ret[1]);\n }\n return takeFromExternrefTable0(ret[0]);\n }\n /**\n * @param {string} name\n * @returns {any}\n */\n getTableByName(name) {\n const ptr0 = passStringToWasm0(name, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);\n const len0 = WASM_VECTOR_LEN;\n const ret = wasm.worksheet_getTableByName(this.__wbg_ptr, ptr0, len0);\n if (ret[2]) {\n throw takeFromExternrefTable0(ret[1]);\n }\n return takeFromExternrefTable0(ret[0]);\n }\n /**\n * @param {string} address\n * @returns {boolean}\n */\n hasComment(address) {\n const ptr0 = passStringToWasm0(address, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);\n const len0 = WASM_VECTOR_LEN;\n const ret = wasm.worksheet_hasComment(this.__wbg_ptr, ptr0, len0);\n if (ret[2]) {\n throw takeFromExternrefTable0(ret[1]);\n }\n return ret[0] !== 0;\n }\n /**\n * @param {number} row\n * @param {number} col\n * @returns {boolean}\n */\n hasCommentAt(row, col) {\n const ret = wasm.worksheet_hasCommentAt(this.__wbg_ptr, row, col);\n if (ret[2]) {\n throw takeFromExternrefTable0(ret[1]);\n }\n return ret[0] !== 0;\n }\n /**\n * @returns {number}\n */\n get hyperlinkCount() {\n const ret = wasm.worksheet_hyperlinkCount(this.__wbg_ptr);\n if (ret[2]) {\n throw takeFromExternrefTable0(ret[1]);\n }\n return ret[0] >>> 0;\n }\n /**\n * @returns {any}\n */\n get hyperlinks() {\n const ret = wasm.worksheet_hyperlinks(this.__wbg_ptr);\n if (ret[2]) {\n throw takeFromExternrefTable0(ret[1]);\n }\n return takeFromExternrefTable0(ret[0]);\n }\n /**\n * @returns {number}\n */\n get imageCount() {\n const ret = wasm.worksheet_imageCount(this.__wbg_ptr);\n if (ret[2]) {\n throw takeFromExternrefTable0(ret[1]);\n }\n return ret[0] >>> 0;\n }\n /**\n * All embedded images in depth-first drawing order, without image bytes.\n * @returns {any}\n */\n get images() {\n const ret = wasm.worksheet_images(this.__wbg_ptr);\n if (ret[2]) {\n throw takeFromExternrefTable0(ret[1]);\n }\n return takeFromExternrefTable0(ret[0]);\n }\n /**\n * Insert a top-level drawing at a z-order index.\n * @param {number} index\n * @param {any} input\n */\n insertDrawing(index, input) {\n const ret = wasm.worksheet_insertDrawing(this.__wbg_ptr, index, input);\n if (ret[1]) {\n throw takeFromExternrefTable0(ret[0]);\n }\n }\n /**\n * @param {number} col\n * @returns {boolean}\n */\n isColumnCollapsed(col) {\n const ret = wasm.worksheet_isColumnCollapsed(this.__wbg_ptr, col);\n if (ret[2]) {\n throw takeFromExternrefTable0(ret[1]);\n }\n return ret[0] !== 0;\n }\n /**\n * @param {number} col\n * @returns {boolean}\n */\n isColumnHidden(col) {\n const ret = wasm.worksheet_isColumnHidden(this.__wbg_ptr, col);\n if (ret[2]) {\n throw takeFromExternrefTable0(ret[1]);\n }\n return ret[0] !== 0;\n }\n /**\n * @returns {boolean}\n */\n get isEmpty() {\n const ret = wasm.worksheet_isEmpty(this.__wbg_ptr);\n if (ret[2]) {\n throw takeFromExternrefTable0(ret[1]);\n }\n return ret[0] !== 0;\n }\n /**\n * @param {number} row\n * @param {number} col\n * @returns {boolean}\n */\n isMergedSecondary(row, col) {\n const ret = wasm.worksheet_isMergedSecondary(this.__wbg_ptr, row, col);\n if (ret[2]) {\n throw takeFromExternrefTable0(ret[1]);\n }\n return ret[0] !== 0;\n }\n /**\n * @param {number} row\n * @returns {boolean}\n */\n isRowCollapsed(row) {\n const ret = wasm.worksheet_isRowCollapsed(this.__wbg_ptr, row);\n if (ret[2]) {\n throw takeFromExternrefTable0(ret[1]);\n }\n return ret[0] !== 0;\n }\n /**\n * @param {number} row\n * @returns {boolean}\n */\n isRowHidden(row) {\n const ret = wasm.worksheet_isRowHidden(this.__wbg_ptr, row);\n if (ret[2]) {\n throw takeFromExternrefTable0(ret[1]);\n }\n return ret[0] !== 0;\n }\n /**\n * @returns {boolean}\n */\n get isSelected() {\n const ret = wasm.worksheet_isSelected(this.__wbg_ptr);\n if (ret[2]) {\n throw takeFromExternrefTable0(ret[1]);\n }\n return ret[0] !== 0;\n }\n /**\n * @param {number} row\n * @param {number} col\n * @returns {boolean}\n */\n isSpillSource(row, col) {\n const ret = wasm.worksheet_isSpillSource(this.__wbg_ptr, row, col);\n if (ret[2]) {\n throw takeFromExternrefTable0(ret[1]);\n }\n return ret[0] !== 0;\n }\n /**\n * @param {number} row\n * @param {number} col\n * @returns {boolean}\n */\n isSpillTarget(row, col) {\n const ret = wasm.worksheet_isSpillTarget(this.__wbg_ptr, row, col);\n if (ret[2]) {\n throw takeFromExternrefTable0(ret[1]);\n }\n return ret[0] !== 0;\n }\n /**\n * @param {string} range_str\n */\n mergeCells(range_str) {\n const ptr0 = passStringToWasm0(range_str, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);\n const len0 = WASM_VECTOR_LEN;\n const ret = wasm.worksheet_mergeCells(this.__wbg_ptr, ptr0, len0);\n if (ret[1]) {\n throw takeFromExternrefTable0(ret[0]);\n }\n }\n /**\n * @returns {any}\n */\n get mergedRegions() {\n const ret = wasm.worksheet_mergedRegions(this.__wbg_ptr);\n if (ret[2]) {\n throw takeFromExternrefTable0(ret[1]);\n }\n return takeFromExternrefTable0(ret[0]);\n }\n /**\n * Move a top-level drawing to another z-order index.\n * @param {number} from\n * @param {number} to\n */\n moveDrawing(from, to) {\n const ret = wasm.worksheet_moveDrawing(this.__wbg_ptr, from, to);\n if (ret[1]) {\n throw takeFromExternrefTable0(ret[0]);\n }\n }\n /**\n * @returns {string}\n */\n get name() {\n let deferred2_0;\n let deferred2_1;\n try {\n const ret = wasm.worksheet_name(this.__wbg_ptr);\n var ptr1 = ret[0];\n var len1 = ret[1];\n if (ret[3]) {\n ptr1 = 0; len1 = 0;\n throw takeFromExternrefTable0(ret[2]);\n }\n deferred2_0 = ptr1;\n deferred2_1 = len1;\n return getStringFromWasm0(ptr1, len1);\n } finally {\n wasm.__wbindgen_free(deferred2_0, deferred2_1, 1);\n }\n }\n /**\n * @returns {any}\n */\n get pageSetup() {\n const ret = wasm.worksheet_pageSetup(this.__wbg_ptr);\n if (ret[2]) {\n throw takeFromExternrefTable0(ret[1]);\n }\n return takeFromExternrefTable0(ret[0]);\n }\n /**\n * @returns {string | undefined}\n */\n get printArea() {\n const ret = wasm.worksheet_printArea(this.__wbg_ptr);\n if (ret[3]) {\n throw takeFromExternrefTable0(ret[2]);\n }\n let v1;\n if (ret[0] !== 0) {\n v1 = getStringFromWasm0(ret[0], ret[1]).slice();\n wasm.__wbindgen_free(ret[0], ret[1] * 1, 1);\n }\n return v1;\n }\n /**\n * @returns {any}\n */\n get protectedRanges() {\n const ret = wasm.worksheet_protectedRanges(this.__wbg_ptr);\n if (ret[2]) {\n throw takeFromExternrefTable0(ret[1]);\n }\n return takeFromExternrefTable0(ret[0]);\n }\n /**\n * @returns {any}\n */\n get protection() {\n const ret = wasm.worksheet_protection(this.__wbg_ptr);\n if (ret[2]) {\n throw takeFromExternrefTable0(ret[1]);\n }\n return takeFromExternrefTable0(ret[0]);\n }\n /**\n * Remove a top-level drawing or nested group child.\n * @param {any} path\n */\n removeDrawing(path) {\n const ret = wasm.worksheet_removeDrawing(this.__wbg_ptr, path);\n if (ret[1]) {\n throw takeFromExternrefTable0(ret[0]);\n }\n }\n /**\n * @returns {Uint32Array | undefined}\n */\n get repeatCols() {\n const ret = wasm.worksheet_repeatCols(this.__wbg_ptr);\n if (ret[3]) {\n throw takeFromExternrefTable0(ret[2]);\n }\n let v1;\n if (ret[0] !== 0) {\n v1 = getArrayU32FromWasm0(ret[0], ret[1]).slice();\n wasm.__wbindgen_free(ret[0], ret[1] * 4, 4);\n }\n return v1;\n }\n /**\n * @returns {Uint32Array | undefined}\n */\n get repeatRows() {\n const ret = wasm.worksheet_repeatRows(this.__wbg_ptr);\n if (ret[3]) {\n throw takeFromExternrefTable0(ret[2]);\n }\n let v1;\n if (ret[0] !== 0) {\n v1 = getArrayU32FromWasm0(ret[0], ret[1]).slice();\n wasm.__wbindgen_free(ret[0], ret[1] * 4, 4);\n }\n return v1;\n }\n /**\n * @returns {any}\n */\n get rowBreaks() {\n const ret = wasm.worksheet_rowBreaks(this.__wbg_ptr);\n if (ret[2]) {\n throw takeFromExternrefTable0(ret[1]);\n }\n return takeFromExternrefTable0(ret[0]);\n }\n /**\n * @returns {any}\n */\n get selections() {\n const ret = wasm.worksheet_selections(this.__wbg_ptr);\n if (ret[2]) {\n throw takeFromExternrefTable0(ret[1]);\n }\n return takeFromExternrefTable0(ret[0]);\n }\n /**\n * @param {string} address\n * @param {any} value\n */\n setCell(address, value) {\n const ptr0 = passStringToWasm0(address, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);\n const len0 = WASM_VECTOR_LEN;\n const ret = wasm.worksheet_setCell(this.__wbg_ptr, ptr0, len0, value);\n if (ret[1]) {\n throw takeFromExternrefTable0(ret[0]);\n }\n }\n /**\n * @param {string} address\n * @param {any} style\n */\n setCellStyle(address, style) {\n const ptr0 = passStringToWasm0(address, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);\n const len0 = WASM_VECTOR_LEN;\n const ret = wasm.worksheet_setCellStyle(this.__wbg_ptr, ptr0, len0, style);\n if (ret[1]) {\n throw takeFromExternrefTable0(ret[0]);\n }\n }\n /**\n * @param {number} row\n * @param {number} col\n * @param {any} style\n */\n setCellStyleAt(row, col, style) {\n const ret = wasm.worksheet_setCellStyleAt(this.__wbg_ptr, row, col, style);\n if (ret[1]) {\n throw takeFromExternrefTable0(ret[0]);\n }\n }\n /**\n * @param {number} col\n * @param {number} width\n */\n setColumnWidth(col, width) {\n const ret = wasm.worksheet_setColumnWidth(this.__wbg_ptr, col, width);\n if (ret[1]) {\n throw takeFromExternrefTable0(ret[0]);\n }\n }\n /**\n * Replace a top-level drawing or nested group child.\n * @param {any} path\n * @param {any} input\n */\n setDrawing(path, input) {\n const ret = wasm.worksheet_setDrawing(this.__wbg_ptr, path, input);\n if (ret[1]) {\n throw takeFromExternrefTable0(ret[0]);\n }\n }\n /**\n * Apply Excel checkbox/radio semantics and synchronize linked cells immediately.\n * @param {any} path\n * @param {string} state\n * @returns {any}\n */\n setFormControlCheckState(path, state) {\n const ptr0 = passStringToWasm0(state, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);\n const len0 = WASM_VECTOR_LEN;\n const ret = wasm.worksheet_setFormControlCheckState(this.__wbg_ptr, path, ptr0, len0);\n if (ret[2]) {\n throw takeFromExternrefTable0(ret[1]);\n }\n return takeFromExternrefTable0(ret[0]);\n }\n /**\n * @param {string} address\n * @param {string} formula\n */\n setFormula(address, formula) {\n const ptr0 = passStringToWasm0(address, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);\n const len0 = WASM_VECTOR_LEN;\n const ptr1 = passStringToWasm0(formula, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);\n const len1 = WASM_VECTOR_LEN;\n const ret = wasm.worksheet_setFormula(this.__wbg_ptr, ptr0, len0, ptr1, len1);\n if (ret[1]) {\n throw takeFromExternrefTable0(ret[0]);\n }\n }\n /**\n * @param {any} ranges\n */\n setProtectedRanges(ranges) {\n const ret = wasm.worksheet_setProtectedRanges(this.__wbg_ptr, ranges);\n if (ret[1]) {\n throw takeFromExternrefTable0(ret[0]);\n }\n }\n /**\n * @param {any} protection\n */\n setProtection(protection) {\n const ret = wasm.worksheet_setProtection(this.__wbg_ptr, protection);\n if (ret[1]) {\n throw takeFromExternrefTable0(ret[0]);\n }\n }\n /**\n * @param {string} range_str\n * @param {any} style\n */\n setRangeStyle(range_str, style) {\n const ptr0 = passStringToWasm0(range_str, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);\n const len0 = WASM_VECTOR_LEN;\n const ret = wasm.worksheet_setRangeStyle(this.__wbg_ptr, ptr0, len0, style);\n if (ret[1]) {\n throw takeFromExternrefTable0(ret[0]);\n }\n }\n /**\n * @param {number} row\n * @param {number} height\n */\n setRowHeight(row, height) {\n const ret = wasm.worksheet_setRowHeight(this.__wbg_ptr, row, height);\n if (ret[1]) {\n throw takeFromExternrefTable0(ret[0]);\n }\n }\n /**\n * @returns {any}\n */\n get splitPanes() {\n const ret = wasm.worksheet_splitPanes(this.__wbg_ptr);\n if (ret[2]) {\n throw takeFromExternrefTable0(ret[1]);\n }\n return takeFromExternrefTable0(ret[0]);\n }\n /**\n * @returns {any}\n */\n get tabColor() {\n const ret = wasm.worksheet_tabColor(this.__wbg_ptr);\n if (ret[2]) {\n throw takeFromExternrefTable0(ret[1]);\n }\n return takeFromExternrefTable0(ret[0]);\n }\n /**\n * @returns {number}\n */\n get tableCount() {\n const ret = wasm.worksheet_tableCount(this.__wbg_ptr);\n if (ret[2]) {\n throw takeFromExternrefTable0(ret[1]);\n }\n return ret[0] >>> 0;\n }\n /**\n * @returns {any}\n */\n get tables() {\n const ret = wasm.worksheet_tables(this.__wbg_ptr);\n if (ret[2]) {\n throw takeFromExternrefTable0(ret[1]);\n }\n return takeFromExternrefTable0(ret[0]);\n }\n /**\n * @param {string} range_str\n * @returns {boolean}\n */\n unmergeCells(range_str) {\n const ptr0 = passStringToWasm0(range_str, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);\n const len0 = WASM_VECTOR_LEN;\n const ret = wasm.worksheet_unmergeCells(this.__wbg_ptr, ptr0, len0);\n if (ret[2]) {\n throw takeFromExternrefTable0(ret[1]);\n }\n return ret[0] !== 0;\n }\n /**\n * @returns {any}\n */\n usedRange() {\n const ret = wasm.worksheet_usedRange(this.__wbg_ptr);\n if (ret[2]) {\n throw takeFromExternrefTable0(ret[1]);\n }\n return takeFromExternrefTable0(ret[0]);\n }\n /**\n * @returns {string}\n */\n get visibility() {\n let deferred2_0;\n let deferred2_1;\n try {\n const ret = wasm.worksheet_visibility(this.__wbg_ptr);\n var ptr1 = ret[0];\n var len1 = ret[1];\n if (ret[3]) {\n ptr1 = 0; len1 = 0;\n throw takeFromExternrefTable0(ret[2]);\n }\n deferred2_0 = ptr1;\n deferred2_1 = len1;\n return getStringFromWasm0(ptr1, len1);\n } finally {\n wasm.__wbindgen_free(deferred2_0, deferred2_1, 1);\n }\n }\n /**\n * @returns {number | undefined}\n */\n get zoomScale() {\n const ret = wasm.worksheet_zoomScale(this.__wbg_ptr);\n if (ret[2]) {\n throw takeFromExternrefTable0(ret[1]);\n }\n return ret[0] === 0x100000001 ? undefined : ret[0];\n }\n}\nif (Symbol.dispose) Worksheet.prototype[Symbol.dispose] = Worksheet.prototype.free;\n\nexport function init() {\n wasm.init();\n}\n\nfunction __wbg_get_imports() {\n const import0 = {\n __proto__: null,\n __wbg_Error_8c4e43fe74559d73: function(arg0, arg1) {\n const ret = Error(getStringFromWasm0(arg0, arg1));\n return ret;\n },\n __wbg_Number_04624de7d0e8332d: function(arg0) {\n const ret = Number(arg0);\n return ret;\n },\n __wbg_String_8f0eb39a4a4c2f66: function(arg0, arg1) {\n const ret = String(arg1);\n const ptr1 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);\n const len1 = WASM_VECTOR_LEN;\n getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true);\n getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true);\n },\n __wbg___wbindgen_bigint_get_as_i64_8fcf4ce7f1ca72a2: function(arg0, arg1) {\n const v = arg1;\n const ret = typeof(v) === 'bigint' ? v : undefined;\n getDataViewMemory0().setBigInt64(arg0 + 8 * 1, isLikeNone(ret) ? BigInt(0) : ret, true);\n getDataViewMemory0().setInt32(arg0 + 4 * 0, !isLikeNone(ret), true);\n },\n __wbg___wbindgen_boolean_get_bbbb1c18aa2f5e25: function(arg0) {\n const v = arg0;\n const ret = typeof(v) === 'boolean' ? v : undefined;\n return isLikeNone(ret) ? 0xFFFFFF : ret ? 1 : 0;\n },\n __wbg___wbindgen_debug_string_0bc8482c6e3508ae: function(arg0, arg1) {\n const ret = debugString(arg1);\n const ptr1 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);\n const len1 = WASM_VECTOR_LEN;\n getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true);\n getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true);\n },\n __wbg___wbindgen_in_47fa6863be6f2f25: function(arg0, arg1) {\n const ret = arg0 in arg1;\n return ret;\n },\n __wbg___wbindgen_is_bigint_31b12575b56f32fc: function(arg0) {\n const ret = typeof(arg0) === 'bigint';\n return ret;\n },\n __wbg___wbindgen_is_function_0095a73b8b156f76: function(arg0) {\n const ret = typeof(arg0) === 'function';\n return ret;\n },\n __wbg___wbindgen_is_null_ac34f5003991759a: function(arg0) {\n const ret = arg0 === null;\n return ret;\n },\n __wbg___wbindgen_is_object_5ae8e5880f2c1fbd: function(arg0) {\n const val = arg0;\n const ret = typeof(val) === 'object' && val !== null;\n return ret;\n },\n __wbg___wbindgen_is_string_cd444516edc5b180: function(arg0) {\n const ret = typeof(arg0) === 'string';\n return ret;\n },\n __wbg___wbindgen_is_undefined_9e4d92534c42d778: function(arg0) {\n const ret = arg0 === undefined;\n return ret;\n },\n __wbg___wbindgen_jsval_eq_11888390b0186270: function(arg0, arg1) {\n const ret = arg0 === arg1;\n return ret;\n },\n __wbg___wbindgen_jsval_loose_eq_9dd77d8cd6671811: function(arg0, arg1) {\n const ret = arg0 == arg1;\n return ret;\n },\n __wbg___wbindgen_number_get_8ff4255516ccad3e: function(arg0, arg1) {\n const obj = arg1;\n const ret = typeof(obj) === 'number' ? obj : undefined;\n getDataViewMemory0().setFloat64(arg0 + 8 * 1, isLikeNone(ret) ? 0 : ret, true);\n getDataViewMemory0().setInt32(arg0 + 4 * 0, !isLikeNone(ret), true);\n },\n __wbg___wbindgen_string_get_72fb696202c56729: function(arg0, arg1) {\n const obj = arg1;\n const ret = typeof(obj) === 'string' ? obj : undefined;\n var ptr1 = isLikeNone(ret) ? 0 : passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);\n var len1 = WASM_VECTOR_LEN;\n getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true);\n getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true);\n },\n __wbg___wbindgen_throw_be289d5034ed271b: function(arg0, arg1) {\n throw new Error(getStringFromWasm0(arg0, arg1));\n },\n __wbg_call_389efe28435a9388: function() { return handleError(function (arg0, arg1) {\n const ret = arg0.call(arg1);\n return ret;\n }, arguments); },\n __wbg_call_4708e0c13bdc8e95: function() { return handleError(function (arg0, arg1, arg2) {\n const ret = arg0.call(arg1, arg2);\n return ret;\n }, arguments); },\n __wbg_call_812d25f1510c13c8: function() { return handleError(function (arg0, arg1, arg2, arg3) {\n const ret = arg0.call(arg1, arg2, arg3);\n return ret;\n }, arguments); },\n __wbg_call_e8c868596c950cf6: function() { return handleError(function (arg0, arg1, arg2, arg3, arg4) {\n const ret = arg0.call(arg1, arg2, arg3, arg4);\n return ret;\n }, arguments); },\n __wbg_crypto_86f2631e91b51511: function(arg0) {\n const ret = arg0.crypto;\n return ret;\n },\n __wbg_done_57b39ecd9addfe81: function(arg0) {\n const ret = arg0.done;\n return ret;\n },\n __wbg_entries_58c7934c745daac7: function(arg0) {\n const ret = Object.entries(arg0);\n return ret;\n },\n __wbg_getRandomValues_1c61fac11405ffdc: function() { return handleError(function (arg0, arg1) {\n globalThis.crypto.getRandomValues(getArrayU8FromWasm0(arg0, arg1));\n }, arguments); },\n __wbg_getRandomValues_b3f15fcbfabb0f8b: function() { return handleError(function (arg0, arg1) {\n arg0.getRandomValues(arg1);\n }, arguments); },\n __wbg_getTime_1e3cd1391c5c3995: function(arg0) {\n const ret = arg0.getTime();\n return ret;\n },\n __wbg_getTimezoneOffset_81776d10a4ec18a8: function(arg0) {\n const ret = arg0.getTimezoneOffset();\n return ret;\n },\n __wbg_get_9b94d73e6221f75c: function(arg0, arg1) {\n const ret = arg0[arg1 >>> 0];\n return ret;\n },\n __wbg_get_b3ed3ad4be2bc8ac: function() { return handleError(function (arg0, arg1) {\n const ret = Reflect.get(arg0, arg1);\n return ret;\n }, arguments); },\n __wbg_get_with_ref_key_1dc361bd10053bfe: function(arg0, arg1) {\n const ret = arg0[arg1];\n return ret;\n },\n __wbg_instanceof_ArrayBuffer_c367199e2fa2aa04: function(arg0) {\n let result;\n try {\n result = arg0 instanceof ArrayBuffer;\n } catch (_) {\n result = false;\n }\n const ret = result;\n return ret;\n },\n __wbg_instanceof_Map_53af74335dec57f4: function(arg0) {\n let result;\n try {\n result = arg0 instanceof Map;\n } catch (_) {\n result = false;\n }\n const ret = result;\n return ret;\n },\n __wbg_instanceof_Uint8Array_9b9075935c74707c: function(arg0) {\n let result;\n try {\n result = arg0 instanceof Uint8Array;\n } catch (_) {\n result = false;\n }\n const ret = result;\n return ret;\n },\n __wbg_isArray_d314bb98fcf08331: function(arg0) {\n const ret = Array.isArray(arg0);\n return ret;\n },\n __wbg_isSafeInteger_bfbc7332a9768d2a: function(arg0) {\n const ret = Number.isSafeInteger(arg0);\n return ret;\n },\n __wbg_iterator_6ff6560ca1568e55: function() {\n const ret = Symbol.iterator;\n return ret;\n },\n __wbg_length_32ed9a279acd054c: function(arg0) {\n const ret = arg0.length;\n return ret;\n },\n __wbg_length_35a7bace40f36eac: function(arg0) {\n const ret = arg0.length;\n return ret;\n },\n __wbg_msCrypto_d562bbe83e0d4b91: function(arg0) {\n const ret = arg0.msCrypto;\n return ret;\n },\n __wbg_new_0_73afc35eb544e539: function() {\n const ret = new Date();\n return ret;\n },\n __wbg_new_245cd5c49157e602: function(arg0) {\n const ret = new Date(arg0);\n return ret;\n },\n __wbg_new_361308b2356cecd0: function() {\n const ret = new Object();\n return ret;\n },\n __wbg_new_3eb36ae241fe6f44: function() {\n const ret = new Array();\n return ret;\n },\n __wbg_new_dca287b076112a51: function() {\n const ret = new Map();\n return ret;\n },\n __wbg_new_dd2b680c8bf6ae29: function(arg0) {\n const ret = new Uint8Array(arg0);\n return ret;\n },\n __wbg_new_no_args_1c7c842f08d00ebb: function(arg0, arg1) {\n const ret = new Function(getStringFromWasm0(arg0, arg1));\n return ret;\n },\n __wbg_new_with_length_a2c39cbe88fd8ff1: function(arg0) {\n const ret = new Uint8Array(arg0 >>> 0);\n return ret;\n },\n __wbg_next_3482f54c49e8af19: function() { return handleError(function (arg0) {\n const ret = arg0.next();\n return ret;\n }, arguments); },\n __wbg_next_418f80d8f5303233: function(arg0) {\n const ret = arg0.next;\n return ret;\n },\n __wbg_node_e1f24f89a7336c2e: function(arg0) {\n const ret = arg0.node;\n return ret;\n },\n __wbg_process_3975fd6c72f520aa: function(arg0) {\n const ret = arg0.process;\n return ret;\n },\n __wbg_prototypesetcall_bdcdcc5842e4d77d: function(arg0, arg1, arg2) {\n Uint8Array.prototype.set.call(getArrayU8FromWasm0(arg0, arg1), arg2);\n },\n __wbg_push_8ffdcb2063340ba5: function(arg0, arg1) {\n const ret = arg0.push(arg1);\n return ret;\n },\n __wbg_randomFillSync_f8c153b79f285817: function() { return handleError(function (arg0, arg1) {\n arg0.randomFillSync(arg1);\n }, arguments); },\n __wbg_require_b74f47fc2d022fd6: function() { return handleError(function () {\n const ret = module.require;\n return ret;\n }, arguments); },\n __wbg_set_1eb0999cf5d27fc8: function(arg0, arg1, arg2) {\n const ret = arg0.set(arg1, arg2);\n return ret;\n },\n __wbg_set_3f1d0b984ed272ed: function(arg0, arg1, arg2) {\n arg0[arg1] = arg2;\n },\n __wbg_set_f43e577aea94465b: function(arg0, arg1, arg2) {\n arg0[arg1 >>> 0] = arg2;\n },\n __wbg_static_accessor_GLOBAL_12837167ad935116: function() {\n const ret = typeof global === 'undefined' ? null : global;\n return isLikeNone(ret) ? 0 : addToExternrefTable0(ret);\n },\n __wbg_static_accessor_GLOBAL_THIS_e628e89ab3b1c95f: function() {\n const ret = typeof globalThis === 'undefined' ? null : globalThis;\n return isLikeNone(ret) ? 0 : addToExternrefTable0(ret);\n },\n __wbg_static_accessor_SELF_a621d3dfbb60d0ce: function() {\n const ret = typeof self === 'undefined' ? null : self;\n return isLikeNone(ret) ? 0 : addToExternrefTable0(ret);\n },\n __wbg_static_accessor_WINDOW_f8727f0cf888e0bd: function() {\n const ret = typeof window === 'undefined' ? null : window;\n return isLikeNone(ret) ? 0 : addToExternrefTable0(ret);\n },\n __wbg_subarray_a96e1fef17ed23cb: function(arg0, arg1, arg2) {\n const ret = arg0.subarray(arg1 >>> 0, arg2 >>> 0);\n return ret;\n },\n __wbg_value_0546255b415e96c1: function(arg0) {\n const ret = arg0.value;\n return ret;\n },\n __wbg_versions_4e31226f5e8dc909: function(arg0) {\n const ret = arg0.versions;\n return ret;\n },\n __wbindgen_cast_0000000000000001: function(arg0) {\n // Cast intrinsic for `F64 -> Externref`.\n const ret = arg0;\n return ret;\n },\n __wbindgen_cast_0000000000000002: function(arg0) {\n // Cast intrinsic for `I64 -> Externref`.\n const ret = arg0;\n return ret;\n },\n __wbindgen_cast_0000000000000003: function(arg0, arg1) {\n // Cast intrinsic for `Ref(Slice(U8)) -> NamedExternref(\"Uint8Array\")`.\n const ret = getArrayU8FromWasm0(arg0, arg1);\n return ret;\n },\n __wbindgen_cast_0000000000000004: function(arg0, arg1) {\n // Cast intrinsic for `Ref(String) -> Externref`.\n const ret = getStringFromWasm0(arg0, arg1);\n return ret;\n },\n __wbindgen_cast_0000000000000005: function(arg0) {\n // Cast intrinsic for `U64 -> Externref`.\n const ret = BigInt.asUintN(64, arg0);\n return ret;\n },\n __wbindgen_init_externref_table: function() {\n const table = wasm.__wbindgen_externrefs;\n const offset = table.grow(4);\n table.set(0, undefined);\n table.set(offset + 0, undefined);\n table.set(offset + 1, null);\n table.set(offset + 2, true);\n table.set(offset + 3, false);\n },\n __wbindgen_object_is_undefined: function(arg0) {\n const ret = arg0 === undefined;\n return ret;\n },\n };\n return {\n __proto__: null,\n \"./duke_sheets_wasm_bg.js\": import0,\n };\n}\n\nconst CellValueFinalization = (typeof FinalizationRegistry === 'undefined')\n ? { register: () => {}, unregister: () => {} }\n : new FinalizationRegistry(ptr => wasm.__wbg_cellvalue_free(ptr >>> 0, 1));\nconst WorkbookFinalization = (typeof FinalizationRegistry === 'undefined')\n ? { register: () => {}, unregister: () => {} }\n : new FinalizationRegistry(ptr => wasm.__wbg_workbook_free(ptr >>> 0, 1));\nconst WorksheetFinalization = (typeof FinalizationRegistry === 'undefined')\n ? { register: () => {}, unregister: () => {} }\n : new FinalizationRegistry(ptr => wasm.__wbg_worksheet_free(ptr >>> 0, 1));\n\nfunction addToExternrefTable0(obj) {\n const idx = wasm.__externref_table_alloc();\n wasm.__wbindgen_externrefs.set(idx, obj);\n return idx;\n}\n\nfunction debugString(val) {\n // primitive types\n const type = typeof val;\n if (type == 'number' || type == 'boolean' || val == null) {\n return `${val}`;\n }\n if (type == 'string') {\n return `\"${val}\"`;\n }\n if (type == 'symbol') {\n const description = val.description;\n if (description == null) {\n return 'Symbol';\n } else {\n return `Symbol(${description})`;\n }\n }\n if (type == 'function') {\n const name = val.name;\n if (typeof name == 'string' && name.length > 0) {\n return `Function(${name})`;\n } else {\n return 'Function';\n }\n }\n // objects\n if (Array.isArray(val)) {\n const length = val.length;\n let debug = '[';\n if (length > 0) {\n debug += debugString(val[0]);\n }\n for(let i = 1; i < length; i++) {\n debug += ', ' + debugString(val[i]);\n }\n debug += ']';\n return debug;\n }\n // Test for built-in\n const builtInMatches = /\\[object ([^\\]]+)\\]/.exec(toString.call(val));\n let className;\n if (builtInMatches && builtInMatches.length > 1) {\n className = builtInMatches[1];\n } else {\n // Failed to match the standard '[object ClassName]'\n return toString.call(val);\n }\n if (className == 'Object') {\n // we're a user defined class or Object\n // JSON.stringify avoids problems with cycles, and is generally much\n // easier than looping through ownProperties of `val`.\n try {\n return 'Object(' + JSON.stringify(val) + ')';\n } catch (_) {\n return 'Object';\n }\n }\n // errors\n if (val instanceof Error) {\n return `${val.name}: ${val.message}\\n${val.stack}`;\n }\n // TODO we could test for more things here, like `Set`s and `Map`s.\n return className;\n}\n\nfunction getArrayJsValueFromWasm0(ptr, len) {\n ptr = ptr >>> 0;\n const mem = getDataViewMemory0();\n const result = [];\n for (let i = ptr; i < ptr + 4 * len; i += 4) {\n result.push(wasm.__wbindgen_externrefs.get(mem.getUint32(i, true)));\n }\n wasm.__externref_drop_slice(ptr, len);\n return result;\n}\n\nfunction getArrayU32FromWasm0(ptr, len) {\n ptr = ptr >>> 0;\n return getUint32ArrayMemory0().subarray(ptr / 4, ptr / 4 + len);\n}\n\nfunction getArrayU8FromWasm0(ptr, len) {\n ptr = ptr >>> 0;\n return getUint8ArrayMemory0().subarray(ptr / 1, ptr / 1 + len);\n}\n\nlet cachedDataViewMemory0 = null;\nfunction getDataViewMemory0() {\n if (cachedDataViewMemory0 === null || cachedDataViewMemory0.buffer.detached === true || (cachedDataViewMemory0.buffer.detached === undefined && cachedDataViewMemory0.buffer !== wasm.memory.buffer)) {\n cachedDataViewMemory0 = new DataView(wasm.memory.buffer);\n }\n return cachedDataViewMemory0;\n}\n\nfunction getStringFromWasm0(ptr, len) {\n ptr = ptr >>> 0;\n return decodeText(ptr, len);\n}\n\nlet cachedUint32ArrayMemory0 = null;\nfunction getUint32ArrayMemory0() {\n if (cachedUint32ArrayMemory0 === null || cachedUint32ArrayMemory0.byteLength === 0) {\n cachedUint32ArrayMemory0 = new Uint32Array(wasm.memory.buffer);\n }\n return cachedUint32ArrayMemory0;\n}\n\nlet cachedUint8ArrayMemory0 = null;\nfunction getUint8ArrayMemory0() {\n if (cachedUint8ArrayMemory0 === null || cachedUint8ArrayMemory0.byteLength === 0) {\n cachedUint8ArrayMemory0 = new Uint8Array(wasm.memory.buffer);\n }\n return cachedUint8ArrayMemory0;\n}\n\nfunction handleError(f, args) {\n try {\n return f.apply(this, args);\n } catch (e) {\n const idx = addToExternrefTable0(e);\n wasm.__wbindgen_exn_store(idx);\n }\n}\n\nfunction isLikeNone(x) {\n return x === undefined || x === null;\n}\n\nfunction passArray8ToWasm0(arg, malloc) {\n const ptr = malloc(arg.length * 1, 1) >>> 0;\n getUint8ArrayMemory0().set(arg, ptr / 1);\n WASM_VECTOR_LEN = arg.length;\n return ptr;\n}\n\nfunction passStringToWasm0(arg, malloc, realloc) {\n if (realloc === undefined) {\n const buf = cachedTextEncoder.encode(arg);\n const ptr = malloc(buf.length, 1) >>> 0;\n getUint8ArrayMemory0().subarray(ptr, ptr + buf.length).set(buf);\n WASM_VECTOR_LEN = buf.length;\n return ptr;\n }\n\n let len = arg.length;\n let ptr = malloc(len, 1) >>> 0;\n\n const mem = getUint8ArrayMemory0();\n\n let offset = 0;\n\n for (; offset < len; offset++) {\n const code = arg.charCodeAt(offset);\n if (code > 0x7F) break;\n mem[ptr + offset] = code;\n }\n if (offset !== len) {\n if (offset !== 0) {\n arg = arg.slice(offset);\n }\n ptr = realloc(ptr, len, len = offset + arg.length * 3, 1) >>> 0;\n const view = getUint8ArrayMemory0().subarray(ptr + offset, ptr + len);\n const ret = cachedTextEncoder.encodeInto(arg, view);\n\n offset += ret.written;\n ptr = realloc(ptr, len, offset, 1) >>> 0;\n }\n\n WASM_VECTOR_LEN = offset;\n return ptr;\n}\n\nfunction takeFromExternrefTable0(idx) {\n const value = wasm.__wbindgen_externrefs.get(idx);\n wasm.__externref_table_dealloc(idx);\n return value;\n}\n\nlet cachedTextDecoder = new TextDecoder('utf-8', { ignoreBOM: true, fatal: true });\ncachedTextDecoder.decode();\nconst MAX_SAFARI_DECODE_BYTES = 2146435072;\nlet numBytesDecoded = 0;\nfunction decodeText(ptr, len) {\n numBytesDecoded += len;\n if (numBytesDecoded >= MAX_SAFARI_DECODE_BYTES) {\n cachedTextDecoder = new TextDecoder('utf-8', { ignoreBOM: true, fatal: true });\n cachedTextDecoder.decode();\n numBytesDecoded = len;\n }\n return cachedTextDecoder.decode(getUint8ArrayMemory0().subarray(ptr, ptr + len));\n}\n\nconst cachedTextEncoder = new TextEncoder();\n\nif (!('encodeInto' in cachedTextEncoder)) {\n cachedTextEncoder.encodeInto = function (arg, view) {\n const buf = cachedTextEncoder.encode(arg);\n view.set(buf);\n return {\n read: arg.length,\n written: buf.length\n };\n };\n}\n\nlet WASM_VECTOR_LEN = 0;\n\nlet wasmModule, wasm;\nfunction __wbg_finalize_init(instance, module) {\n wasm = instance.exports;\n wasmModule = module;\n cachedDataViewMemory0 = null;\n cachedUint32ArrayMemory0 = null;\n cachedUint8ArrayMemory0 = null;\n wasm.__wbindgen_start();\n return wasm;\n}\n\nasync function __wbg_load(module, imports) {\n if (typeof Response === 'function' && module instanceof Response) {\n if (typeof WebAssembly.instantiateStreaming === 'function') {\n try {\n return await WebAssembly.instantiateStreaming(module, imports);\n } catch (e) {\n const validResponse = module.ok && expectedResponseType(module.type);\n\n if (validResponse && module.headers.get('Content-Type') !== 'application/wasm') {\n console.warn(\"`WebAssembly.instantiateStreaming` failed because your server does not serve Wasm with `application/wasm` MIME type. Falling back to `WebAssembly.instantiate` which is slower. Original error:\\n\", e);\n\n } else { throw e; }\n }\n }\n\n const bytes = await module.arrayBuffer();\n return await WebAssembly.instantiate(bytes, imports);\n } else {\n const instance = await WebAssembly.instantiate(module, imports);\n\n if (instance instanceof WebAssembly.Instance) {\n return { instance, module };\n } else {\n return instance;\n }\n }\n\n function expectedResponseType(type) {\n switch (type) {\n case 'basic': case 'cors': case 'default': return true;\n }\n return false;\n }\n}\n\nfunction initSync(module) {\n if (wasm !== undefined) return wasm;\n\n\n if (module !== undefined) {\n if (Object.getPrototypeOf(module) === Object.prototype) {\n ({module} = module)\n } else {\n console.warn('using deprecated parameters for `initSync()`; pass a single object instead')\n }\n }\n\n const imports = __wbg_get_imports();\n if (!(module instanceof WebAssembly.Module)) {\n module = new WebAssembly.Module(module);\n }\n const instance = new WebAssembly.Instance(module, imports);\n return __wbg_finalize_init(instance, module);\n}\n\nasync function __wbg_init(module_or_path) {\n if (wasm !== undefined) return wasm;\n\n\n if (module_or_path !== undefined) {\n if (Object.getPrototypeOf(module_or_path) === Object.prototype) {\n ({module_or_path} = module_or_path)\n } else {\n console.warn('using deprecated parameters for the initialization function; pass a single object instead')\n }\n }\n\n if (module_or_path === undefined) {\n module_or_path = new URL('duke_sheets_wasm_bg.wasm', import.meta.url);\n }\n const imports = __wbg_get_imports();\n\n if (typeof module_or_path === 'string' || (typeof Request === 'function' && module_or_path instanceof Request) || (typeof URL === 'function' && module_or_path instanceof URL)) {\n module_or_path = fetch(module_or_path);\n }\n\n const { instance, module } = await __wbg_load(await module_or_path, imports);\n\n return __wbg_finalize_init(instance, module);\n}\n\nexport { initSync, __wbg_init as default };\n","// DEFLATE is a complex format; to read this code, you should probably check the RFC first:\n// https://tools.ietf.org/html/rfc1951\n// You may also wish to take a look at the guide I made about this program:\n// https://gist.github.com/101arrowz/253f31eb5abc3d9275ab943003ffecad\n// Some of the following code is similar to that of UZIP.js:\n// https://github.com/photopea/UZIP.js\n// However, the vast majority of the codebase has diverged from UZIP.js to increase performance and reduce bundle size.\n// Sometimes 0 will appear where -1 would be more appropriate. This is because using a uint\n// is better for memory in most engines (I *think*).\nvar ch2 = {};\nvar wk = (function (c, id, msg, transfer, cb) {\n var w = new Worker(ch2[id] || (ch2[id] = URL.createObjectURL(new Blob([\n c + ';addEventListener(\"error\",function(e){e=e.error;postMessage({$e$:[e.message,e.code,e.stack]})})'\n ], { type: 'text/javascript' }))));\n w.onmessage = function (e) {\n var d = e.data, ed = d.$e$;\n if (ed) {\n var err = new Error(ed[0]);\n err['code'] = ed[1];\n err.stack = ed[2];\n cb(err, null);\n }\n else\n cb(null, d);\n };\n w.postMessage(msg, transfer);\n return w;\n});\n\n// aliases for shorter compressed code (most minifers don't do this)\nvar u8 = Uint8Array, u16 = Uint16Array, i32 = Int32Array;\n// fixed length extra bits\nvar fleb = new u8([0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0, /* unused */ 0, 0, /* impossible */ 0]);\n// fixed distance extra bits\nvar fdeb = new u8([0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, /* unused */ 0, 0]);\n// code length index map\nvar clim = new u8([16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15]);\n// get base, reverse index map from extra bits\nvar freb = function (eb, start) {\n var b = new u16(31);\n for (var i = 0; i < 31; ++i) {\n b[i] = start += 1 << eb[i - 1];\n }\n // numbers here are at max 18 bits\n var r = new i32(b[30]);\n for (var i = 1; i < 30; ++i) {\n for (var j = b[i]; j < b[i + 1]; ++j) {\n r[j] = ((j - b[i]) << 5) | i;\n }\n }\n return { b: b, r: r };\n};\nvar _a = freb(fleb, 2), fl = _a.b, revfl = _a.r;\n// we can ignore the fact that the other numbers are wrong; they never happen anyway\nfl[28] = 258, revfl[258] = 28;\nvar _b = freb(fdeb, 0), fd = _b.b, revfd = _b.r;\n// map of value to reverse (assuming 16 bits)\nvar rev = new u16(32768);\nfor (var i = 0; i < 32768; ++i) {\n // reverse table algorithm from SO\n var x = ((i & 0xAAAA) >> 1) | ((i & 0x5555) << 1);\n x = ((x & 0xCCCC) >> 2) | ((x & 0x3333) << 2);\n x = ((x & 0xF0F0) >> 4) | ((x & 0x0F0F) << 4);\n rev[i] = (((x & 0xFF00) >> 8) | ((x & 0x00FF) << 8)) >> 1;\n}\n// create huffman tree from u8 \"map\": index -> code length for code index\n// mb (max bits) must be at most 15\n// TODO: optimize/split up?\nvar hMap = (function (cd, mb, r) {\n var s = cd.length;\n // index\n var i = 0;\n // u16 \"map\": index -> # of codes with bit length = index\n var l = new u16(mb);\n // length of cd must be 288 (total # of codes)\n for (; i < s; ++i) {\n if (cd[i])\n ++l[cd[i] - 1];\n }\n // u16 \"map\": index -> minimum code for bit length = index\n var le = new u16(mb);\n for (i = 1; i < mb; ++i) {\n le[i] = (le[i - 1] + l[i - 1]) << 1;\n }\n var co;\n if (r) {\n // u16 \"map\": index -> number of actual bits, symbol for code\n co = new u16(1 << mb);\n // bits to remove for reverser\n var rvb = 15 - mb;\n for (i = 0; i < s; ++i) {\n // ignore 0 lengths\n if (cd[i]) {\n // num encoding both symbol and bits read\n var sv = (i << 4) | cd[i];\n // free bits\n var r_1 = mb - cd[i];\n // start value\n var v = le[cd[i] - 1]++ << r_1;\n // m is end value\n for (var m = v | ((1 << r_1) - 1); v <= m; ++v) {\n // every 16 bit value starting with the code yields the same result\n co[rev[v] >> rvb] = sv;\n }\n }\n }\n }\n else {\n co = new u16(s);\n for (i = 0; i < s; ++i) {\n if (cd[i]) {\n co[i] = rev[le[cd[i] - 1]++] >> (15 - cd[i]);\n }\n }\n }\n return co;\n});\n// fixed length tree\nvar flt = new u8(288);\nfor (var i = 0; i < 144; ++i)\n flt[i] = 8;\nfor (var i = 144; i < 256; ++i)\n flt[i] = 9;\nfor (var i = 256; i < 280; ++i)\n flt[i] = 7;\nfor (var i = 280; i < 288; ++i)\n flt[i] = 8;\n// fixed distance tree\nvar fdt = new u8(32);\nfor (var i = 0; i < 32; ++i)\n fdt[i] = 5;\n// fixed length map\nvar flm = /*#__PURE__*/ hMap(flt, 9, 0), flrm = /*#__PURE__*/ hMap(flt, 9, 1);\n// fixed distance map\nvar fdm = /*#__PURE__*/ hMap(fdt, 5, 0), fdrm = /*#__PURE__*/ hMap(fdt, 5, 1);\n// find max of array\nvar max = function (a) {\n var m = a[0];\n for (var i = 1; i < a.length; ++i) {\n if (a[i] > m)\n m = a[i];\n }\n return m;\n};\n// read d, starting at bit p and mask with m\nvar bits = function (d, p, m) {\n var o = (p / 8) | 0;\n return ((d[o] | (d[o + 1] << 8)) >> (p & 7)) & m;\n};\n// read d, starting at bit p continuing for at least 16 bits\nvar bits16 = function (d, p) {\n var o = (p / 8) | 0;\n return ((d[o] | (d[o + 1] << 8) | (d[o + 2] << 16)) >> (p & 7));\n};\n// get end of byte\nvar shft = function (p) { return ((p + 7) / 8) | 0; };\n// typed array slice - allows garbage collector to free original reference,\n// while being more compatible than .slice\nvar slc = function (v, s, e) {\n if (s == null || s < 0)\n s = 0;\n if (e == null || e > v.length)\n e = v.length;\n // can't use .constructor in case user-supplied\n return new u8(v.subarray(s, e));\n};\n/**\n * Codes for errors generated within this library\n */\nexport var FlateErrorCode = {\n UnexpectedEOF: 0,\n InvalidBlockType: 1,\n InvalidLengthLiteral: 2,\n InvalidDistance: 3,\n StreamFinished: 4,\n NoStreamHandler: 5,\n InvalidHeader: 6,\n NoCallback: 7,\n InvalidUTF8: 8,\n ExtraFieldTooLong: 9,\n InvalidDate: 10,\n FilenameTooLong: 11,\n StreamFinishing: 12,\n InvalidZipData: 13,\n UnknownCompressionMethod: 14\n};\n// error codes\nvar ec = [\n 'unexpected EOF',\n 'invalid block type',\n 'invalid length/literal',\n 'invalid distance',\n 'stream finished',\n 'no stream handler',\n , // determined by compression function\n 'no callback',\n 'invalid UTF-8 data',\n 'extra field too long',\n 'date not in range 1980-2099',\n 'filename too long',\n 'stream finishing',\n 'invalid zip data'\n // determined by unknown compression method\n];\n;\nvar err = function (ind, msg, nt) {\n var e = new Error(msg || ec[ind]);\n e.code = ind;\n if (Error.captureStackTrace)\n Error.captureStackTrace(e, err);\n if (!nt)\n throw e;\n return e;\n};\n// expands raw DEFLATE data\nvar inflt = function (dat, st, buf, dict) {\n // source length dict length\n var sl = dat.length, dl = dict ? dict.length : 0;\n if (!sl || st.f && !st.l)\n return buf || new u8(0);\n var noBuf = !buf;\n // have to estimate size\n var resize = noBuf || st.i != 2;\n // no state\n var noSt = st.i;\n // Assumes roughly 33% compression ratio average\n if (noBuf)\n buf = new u8(sl * 3);\n // ensure buffer can fit at least l elements\n var cbuf = function (l) {\n var bl = buf.length;\n // need to increase size to fit\n if (l > bl) {\n // Double or set to necessary, whichever is greater\n var nbuf = new u8(Math.max(bl * 2, l));\n nbuf.set(buf);\n buf = nbuf;\n }\n };\n // last chunk bitpos bytes\n var final = st.f || 0, pos = st.p || 0, bt = st.b || 0, lm = st.l, dm = st.d, lbt = st.m, dbt = st.n;\n // total bits\n var tbts = sl * 8;\n do {\n if (!lm) {\n // BFINAL - this is only 1 when last chunk is next\n final = bits(dat, pos, 1);\n // type: 0 = no compression, 1 = fixed huffman, 2 = dynamic huffman\n var type = bits(dat, pos + 1, 3);\n pos += 3;\n if (!type) {\n // go to end of byte boundary\n var s = shft(pos) + 4, l = dat[s - 4] | (dat[s - 3] << 8), t = s + l;\n if (t > sl) {\n if (noSt)\n err(0);\n break;\n }\n // ensure size\n if (resize)\n cbuf(bt + l);\n // Copy over uncompressed data\n buf.set(dat.subarray(s, t), bt);\n // Get new bitpos, update byte count\n st.b = bt += l, st.p = pos = t * 8, st.f = final;\n continue;\n }\n else if (type == 1)\n lm = flrm, dm = fdrm, lbt = 9, dbt = 5;\n else if (type == 2) {\n // literal lengths\n var hLit = bits(dat, pos, 31) + 257, hcLen = bits(dat, pos + 10, 15) + 4;\n var tl = hLit + bits(dat, pos + 5, 31) + 1;\n pos += 14;\n // length+distance tree\n var ldt = new u8(tl);\n // code length tree\n var clt = new u8(19);\n for (var i = 0; i < hcLen; ++i) {\n // use index map to get real code\n clt[clim[i]] = bits(dat, pos + i * 3, 7);\n }\n pos += hcLen * 3;\n // code lengths bits\n var clb = max(clt), clbmsk = (1 << clb) - 1;\n // code lengths map\n var clm = hMap(clt, clb, 1);\n for (var i = 0; i < tl;) {\n var r = clm[bits(dat, pos, clbmsk)];\n // bits read\n pos += r & 15;\n // symbol\n var s = r >> 4;\n // code length to copy\n if (s < 16) {\n ldt[i++] = s;\n }\n else {\n // copy count\n var c = 0, n = 0;\n if (s == 16)\n n = 3 + bits(dat, pos, 3), pos += 2, c = ldt[i - 1];\n else if (s == 17)\n n = 3 + bits(dat, pos, 7), pos += 3;\n else if (s == 18)\n n = 11 + bits(dat, pos, 127), pos += 7;\n while (n--)\n ldt[i++] = c;\n }\n }\n // length tree distance tree\n var lt = ldt.subarray(0, hLit), dt = ldt.subarray(hLit);\n // max length bits\n lbt = max(lt);\n // max dist bits\n dbt = max(dt);\n lm = hMap(lt, lbt, 1);\n dm = hMap(dt, dbt, 1);\n }\n else\n err(1);\n if (pos > tbts) {\n if (noSt)\n err(0);\n break;\n }\n }\n // Make sure the buffer can hold this + the largest possible addition\n // Maximum chunk size (practically, theoretically infinite) is 2^17\n if (resize)\n cbuf(bt + 131072);\n var lms = (1 << lbt) - 1, dms = (1 << dbt) - 1;\n var lpos = pos;\n for (;; lpos = pos) {\n // bits read, code\n var c = lm[bits16(dat, pos) & lms], sym = c >> 4;\n pos += c & 15;\n if (pos > tbts) {\n if (noSt)\n err(0);\n break;\n }\n if (!c)\n err(2);\n if (sym < 256)\n buf[bt++] = sym;\n else if (sym == 256) {\n lpos = pos, lm = null;\n break;\n }\n else {\n var add = sym - 254;\n // no extra bits needed if less\n if (sym > 264) {\n // index\n var i = sym - 257, b = fleb[i];\n add = bits(dat, pos, (1 << b) - 1) + fl[i];\n pos += b;\n }\n // dist\n var d = dm[bits16(dat, pos) & dms], dsym = d >> 4;\n if (!d)\n err(3);\n pos += d & 15;\n var dt = fd[dsym];\n if (dsym > 3) {\n var b = fdeb[dsym];\n dt += bits16(dat, pos) & (1 << b) - 1, pos += b;\n }\n if (pos > tbts) {\n if (noSt)\n err(0);\n break;\n }\n if (resize)\n cbuf(bt + 131072);\n var end = bt + add;\n if (bt < dt) {\n var shift = dl - dt, dend = Math.min(dt, end);\n if (shift + bt < 0)\n err(3);\n for (; bt < dend; ++bt)\n buf[bt] = dict[shift + bt];\n }\n for (; bt < end; ++bt)\n buf[bt] = buf[bt - dt];\n }\n }\n st.l = lm, st.p = lpos, st.b = bt, st.f = final;\n if (lm)\n final = 1, st.m = lbt, st.d = dm, st.n = dbt;\n } while (!final);\n // don't reallocate for streams or user buffers\n return bt != buf.length && noBuf ? slc(buf, 0, bt) : buf.subarray(0, bt);\n};\n// starting at p, write the minimum number of bits that can hold v to d\nvar wbits = function (d, p, v) {\n v <<= p & 7;\n var o = (p / 8) | 0;\n d[o] |= v;\n d[o + 1] |= v >> 8;\n};\n// starting at p, write the minimum number of bits (>8) that can hold v to d\nvar wbits16 = function (d, p, v) {\n v <<= p & 7;\n var o = (p / 8) | 0;\n d[o] |= v;\n d[o + 1] |= v >> 8;\n d[o + 2] |= v >> 16;\n};\n// creates code lengths from a frequency table\nvar hTree = function (d, mb) {\n // Need extra info to make a tree\n var t = [];\n for (var i = 0; i < d.length; ++i) {\n if (d[i])\n t.push({ s: i, f: d[i] });\n }\n var s = t.length;\n var t2 = t.slice();\n if (!s)\n return { t: et, l: 0 };\n if (s == 1) {\n var v = new u8(t[0].s + 1);\n v[t[0].s] = 1;\n return { t: v, l: 1 };\n }\n t.sort(function (a, b) { return a.f - b.f; });\n // after i2 reaches last ind, will be stopped\n // freq must be greater than largest possible number of symbols\n t.push({ s: -1, f: 25001 });\n var l = t[0], r = t[1], i0 = 0, i1 = 1, i2 = 2;\n t[0] = { s: -1, f: l.f + r.f, l: l, r: r };\n // efficient algorithm from UZIP.js\n // i0 is lookbehind, i2 is lookahead - after processing two low-freq\n // symbols that combined have high freq, will start processing i2 (high-freq,\n // non-composite) symbols instead\n // see https://reddit.com/r/photopea/comments/ikekht/uzipjs_questions/\n while (i1 != s - 1) {\n l = t[t[i0].f < t[i2].f ? i0++ : i2++];\n r = t[i0 != i1 && t[i0].f < t[i2].f ? i0++ : i2++];\n t[i1++] = { s: -1, f: l.f + r.f, l: l, r: r };\n }\n var maxSym = t2[0].s;\n for (var i = 1; i < s; ++i) {\n if (t2[i].s > maxSym)\n maxSym = t2[i].s;\n }\n // code lengths\n var tr = new u16(maxSym + 1);\n // max bits in tree\n var mbt = ln(t[i1 - 1], tr, 0);\n if (mbt > mb) {\n // more algorithms from UZIP.js\n // TODO: find out how this code works (debt)\n // ind debt\n var i = 0, dt = 0;\n // left cost\n var lft = mbt - mb, cst = 1 << lft;\n t2.sort(function (a, b) { return tr[b.s] - tr[a.s] || a.f - b.f; });\n for (; i < s; ++i) {\n var i2_1 = t2[i].s;\n if (tr[i2_1] > mb) {\n dt += cst - (1 << (mbt - tr[i2_1]));\n tr[i2_1] = mb;\n }\n else\n break;\n }\n dt >>= lft;\n while (dt > 0) {\n var i2_2 = t2[i].s;\n if (tr[i2_2] < mb)\n dt -= 1 << (mb - tr[i2_2]++ - 1);\n else\n ++i;\n }\n for (; i >= 0 && dt; --i) {\n var i2_3 = t2[i].s;\n if (tr[i2_3] == mb) {\n --tr[i2_3];\n ++dt;\n }\n }\n mbt = mb;\n }\n return { t: new u8(tr), l: mbt };\n};\n// get the max length and assign length codes\nvar ln = function (n, l, d) {\n return n.s == -1\n ? Math.max(ln(n.l, l, d + 1), ln(n.r, l, d + 1))\n : (l[n.s] = d);\n};\n// length codes generation\nvar lc = function (c) {\n var s = c.length;\n // Note that the semicolon was intentional\n while (s && !c[--s])\n ;\n var cl = new u16(++s);\n // ind num streak\n var cli = 0, cln = c[0], cls = 1;\n var w = function (v) { cl[cli++] = v; };\n for (var i = 1; i <= s; ++i) {\n if (c[i] == cln && i != s)\n ++cls;\n else {\n if (!cln && cls > 2) {\n for (; cls > 138; cls -= 138)\n w(32754);\n if (cls > 2) {\n w(cls > 10 ? ((cls - 11) << 5) | 28690 : ((cls - 3) << 5) | 12305);\n cls = 0;\n }\n }\n else if (cls > 3) {\n w(cln), --cls;\n for (; cls > 6; cls -= 6)\n w(8304);\n if (cls > 2)\n w(((cls - 3) << 5) | 8208), cls = 0;\n }\n while (cls--)\n w(cln);\n cls = 1;\n cln = c[i];\n }\n }\n return { c: cl.subarray(0, cli), n: s };\n};\n// calculate the length of output from tree, code lengths\nvar clen = function (cf, cl) {\n var l = 0;\n for (var i = 0; i < cl.length; ++i)\n l += cf[i] * cl[i];\n return l;\n};\n// writes a fixed block\n// returns the new bit pos\nvar wfblk = function (out, pos, dat) {\n // no need to write 00 as type: TypedArray defaults to 0\n var s = dat.length;\n var o = shft(pos + 2);\n out[o] = s & 255;\n out[o + 1] = s >> 8;\n out[o + 2] = out[o] ^ 255;\n out[o + 3] = out[o + 1] ^ 255;\n for (var i = 0; i < s; ++i)\n out[o + i + 4] = dat[i];\n return (o + 4 + s) * 8;\n};\n// writes a block\nvar wblk = function (dat, out, final, syms, lf, df, eb, li, bs, bl, p) {\n wbits(out, p++, final);\n ++lf[256];\n var _a = hTree(lf, 15), dlt = _a.t, mlb = _a.l;\n var _b = hTree(df, 15), ddt = _b.t, mdb = _b.l;\n var _c = lc(dlt), lclt = _c.c, nlc = _c.n;\n var _d = lc(ddt), lcdt = _d.c, ndc = _d.n;\n var lcfreq = new u16(19);\n for (var i = 0; i < lclt.length; ++i)\n ++lcfreq[lclt[i] & 31];\n for (var i = 0; i < lcdt.length; ++i)\n ++lcfreq[lcdt[i] & 31];\n var _e = hTree(lcfreq, 7), lct = _e.t, mlcb = _e.l;\n var nlcc = 19;\n for (; nlcc > 4 && !lct[clim[nlcc - 1]]; --nlcc)\n ;\n var flen = (bl + 5) << 3;\n var ftlen = clen(lf, flt) + clen(df, fdt) + eb;\n var dtlen = clen(lf, dlt) + clen(df, ddt) + eb + 14 + 3 * nlcc + clen(lcfreq, lct) + 2 * lcfreq[16] + 3 * lcfreq[17] + 7 * lcfreq[18];\n if (bs >= 0 && flen <= ftlen && flen <= dtlen)\n return wfblk(out, p, dat.subarray(bs, bs + bl));\n var lm, ll, dm, dl;\n wbits(out, p, 1 + (dtlen < ftlen)), p += 2;\n if (dtlen < ftlen) {\n lm = hMap(dlt, mlb, 0), ll = dlt, dm = hMap(ddt, mdb, 0), dl = ddt;\n var llm = hMap(lct, mlcb, 0);\n wbits(out, p, nlc - 257);\n wbits(out, p + 5, ndc - 1);\n wbits(out, p + 10, nlcc - 4);\n p += 14;\n for (var i = 0; i < nlcc; ++i)\n wbits(out, p + 3 * i, lct[clim[i]]);\n p += 3 * nlcc;\n var lcts = [lclt, lcdt];\n for (var it = 0; it < 2; ++it) {\n var clct = lcts[it];\n for (var i = 0; i < clct.length; ++i) {\n var len = clct[i] & 31;\n wbits(out, p, llm[len]), p += lct[len];\n if (len > 15)\n wbits(out, p, (clct[i] >> 5) & 127), p += clct[i] >> 12;\n }\n }\n }\n else {\n lm = flm, ll = flt, dm = fdm, dl = fdt;\n }\n for (var i = 0; i < li; ++i) {\n var sym = syms[i];\n if (sym > 255) {\n var len = (sym >> 18) & 31;\n wbits16(out, p, lm[len + 257]), p += ll[len + 257];\n if (len > 7)\n wbits(out, p, (sym >> 23) & 31), p += fleb[len];\n var dst = sym & 31;\n wbits16(out, p, dm[dst]), p += dl[dst];\n if (dst > 3)\n wbits16(out, p, (sym >> 5) & 8191), p += fdeb[dst];\n }\n else {\n wbits16(out, p, lm[sym]), p += ll[sym];\n }\n }\n wbits16(out, p, lm[256]);\n return p + ll[256];\n};\n// deflate options (nice << 13) | chain\nvar deo = /*#__PURE__*/ new i32([65540, 131080, 131088, 131104, 262176, 1048704, 1048832, 2114560, 2117632]);\n// empty\nvar et = /*#__PURE__*/ new u8(0);\n// compresses data into a raw DEFLATE buffer\nvar dflt = function (dat, lvl, plvl, pre, post, st) {\n var s = st.z || dat.length;\n var o = new u8(pre + s + 5 * (1 + Math.ceil(s / 7000)) + post);\n // writing to this writes to the output buffer\n var w = o.subarray(pre, o.length - post);\n var lst = st.l;\n var pos = (st.r || 0) & 7;\n if (lvl) {\n if (pos)\n w[0] = st.r >> 3;\n var opt = deo[lvl - 1];\n var n = opt >> 13, c = opt & 8191;\n var msk_1 = (1 << plvl) - 1;\n // prev 2-byte val map curr 2-byte val map\n var prev = st.p || new u16(32768), head = st.h || new u16(msk_1 + 1);\n var bs1_1 = Math.ceil(plvl / 3), bs2_1 = 2 * bs1_1;\n var hsh = function (i) { return (dat[i] ^ (dat[i + 1] << bs1_1) ^ (dat[i + 2] << bs2_1)) & msk_1; };\n // 24576 is an arbitrary number of maximum symbols per block\n // 424 buffer for last block\n var syms = new i32(25000);\n // length/literal freq distance freq\n var lf = new u16(288), df = new u16(32);\n // l/lcnt exbits index l/lind waitdx blkpos\n var lc_1 = 0, eb = 0, i = st.i || 0, li = 0, wi = st.w || 0, bs = 0;\n for (; i + 2 < s; ++i) {\n // hash value\n var hv = hsh(i);\n // index mod 32768 previous index mod\n var imod = i & 32767, pimod = head[hv];\n prev[imod] = pimod;\n head[hv] = imod;\n // We always should modify head and prev, but only add symbols if\n // this data is not yet processed (\"wait\" for wait index)\n if (wi <= i) {\n // bytes remaining\n var rem = s - i;\n if ((lc_1 > 7000 || li > 24576) && (rem > 423 || !lst)) {\n pos = wblk(dat, w, 0, syms, lf, df, eb, li, bs, i - bs, pos);\n li = lc_1 = eb = 0, bs = i;\n for (var j = 0; j < 286; ++j)\n lf[j] = 0;\n for (var j = 0; j < 30; ++j)\n df[j] = 0;\n }\n // len dist chain\n var l = 2, d = 0, ch_1 = c, dif = imod - pimod & 32767;\n if (rem > 2 && hv == hsh(i - dif)) {\n var maxn = Math.min(n, rem) - 1;\n var maxd = Math.min(32767, i);\n // max possible length\n // not capped at dif because decompressors implement \"rolling\" index population\n var ml = Math.min(258, rem);\n while (dif <= maxd && --ch_1 && imod != pimod) {\n if (dat[i + l] == dat[i + l - dif]) {\n var nl = 0;\n for (; nl < ml && dat[i + nl] == dat[i + nl - dif]; ++nl)\n ;\n if (nl > l) {\n l = nl, d = dif;\n // break out early when we reach \"nice\" (we are satisfied enough)\n if (nl > maxn)\n break;\n // now, find the rarest 2-byte sequence within this\n // length of literals and search for that instead.\n // Much faster than just using the start\n var mmd = Math.min(dif, nl - 2);\n var md = 0;\n for (var j = 0; j < mmd; ++j) {\n var ti = i - dif + j & 32767;\n var pti = prev[ti];\n var cd = ti - pti & 32767;\n if (cd > md)\n md = cd, pimod = ti;\n }\n }\n }\n // check the previous match\n imod = pimod, pimod = prev[imod];\n dif += imod - pimod & 32767;\n }\n }\n // d will be nonzero only when a match was found\n if (d) {\n // store both dist and len data in one int32\n // Make sure this is recognized as a len/dist with 28th bit (2^28)\n syms[li++] = 268435456 | (revfl[l] << 18) | revfd[d];\n var lin = revfl[l] & 31, din = revfd[d] & 31;\n eb += fleb[lin] + fdeb[din];\n ++lf[257 + lin];\n ++df[din];\n wi = i + l;\n ++lc_1;\n }\n else {\n syms[li++] = dat[i];\n ++lf[dat[i]];\n }\n }\n }\n for (i = Math.max(i, wi); i < s; ++i) {\n syms[li++] = dat[i];\n ++lf[dat[i]];\n }\n pos = wblk(dat, w, lst, syms, lf, df, eb, li, bs, i - bs, pos);\n if (!lst) {\n st.r = (pos & 7) | w[(pos / 8) | 0] << 3;\n // shft(pos) now 1 less if pos & 7 != 0\n pos -= 7;\n st.h = head, st.p = prev, st.i = i, st.w = wi;\n }\n }\n else {\n for (var i = st.w || 0; i < s + lst; i += 65535) {\n // end\n var e = i + 65535;\n if (e >= s) {\n // write final block\n w[(pos / 8) | 0] = lst;\n e = s;\n }\n pos = wfblk(w, pos + 1, dat.subarray(i, e));\n }\n st.i = s;\n }\n return slc(o, 0, pre + shft(pos) + post);\n};\n// CRC32 table\nvar crct = /*#__PURE__*/ (function () {\n var t = new Int32Array(256);\n for (var i = 0; i < 256; ++i) {\n var c = i, k = 9;\n while (--k)\n c = ((c & 1) && -306674912) ^ (c >>> 1);\n t[i] = c;\n }\n return t;\n})();\n// CRC32\nvar crc = function () {\n var c = -1;\n return {\n p: function (d) {\n // closures have awful performance\n var cr = c;\n for (var i = 0; i < d.length; ++i)\n cr = crct[(cr & 255) ^ d[i]] ^ (cr >>> 8);\n c = cr;\n },\n d: function () { return ~c; }\n };\n};\n// Adler32\nvar adler = function () {\n var a = 1, b = 0;\n return {\n p: function (d) {\n // closures have awful performance\n var n = a, m = b;\n var l = d.length | 0;\n for (var i = 0; i != l;) {\n var e = Math.min(i + 2655, l);\n for (; i < e; ++i)\n m += n += d[i];\n n = (n & 65535) + 15 * (n >> 16), m = (m & 65535) + 15 * (m >> 16);\n }\n a = n, b = m;\n },\n d: function () {\n a %= 65521, b %= 65521;\n return (a & 255) << 24 | (a & 0xFF00) << 8 | (b & 255) << 8 | (b >> 8);\n }\n };\n};\n;\n// deflate with opts\nvar dopt = function (dat, opt, pre, post, st) {\n if (!st) {\n st = { l: 1 };\n if (opt.dictionary) {\n var dict = opt.dictionary.subarray(-32768);\n var newDat = new u8(dict.length + dat.length);\n newDat.set(dict);\n newDat.set(dat, dict.length);\n dat = newDat;\n st.w = dict.length;\n }\n }\n return dflt(dat, opt.level == null ? 6 : opt.level, opt.mem == null ? (st.l ? Math.ceil(Math.max(8, Math.min(13, Math.log(dat.length))) * 1.5) : 20) : (12 + opt.mem), pre, post, st);\n};\n// Walmart object spread\nvar mrg = function (a, b) {\n var o = {};\n for (var k in a)\n o[k] = a[k];\n for (var k in b)\n o[k] = b[k];\n return o;\n};\n// worker clone\n// This is possibly the craziest part of the entire codebase, despite how simple it may seem.\n// The only parameter to this function is a closure that returns an array of variables outside of the function scope.\n// We're going to try to figure out the variable names used in the closure as strings because that is crucial for workerization.\n// We will return an object mapping of true variable name to value (basically, the current scope as a JS object).\n// The reason we can't just use the original variable names is minifiers mangling the toplevel scope.\n// This took me three weeks to figure out how to do.\nvar wcln = function (fn, fnStr, td) {\n var dt = fn();\n var st = fn.toString();\n var ks = st.slice(st.indexOf('[') + 1, st.lastIndexOf(']')).replace(/\\s+/g, '').split(',');\n for (var i = 0; i < dt.length; ++i) {\n var v = dt[i], k = ks[i];\n if (typeof v == 'function') {\n fnStr += ';' + k + '=';\n var st_1 = v.toString();\n if (v.prototype) {\n // for global objects\n if (st_1.indexOf('[native code]') != -1) {\n var spInd = st_1.indexOf(' ', 8) + 1;\n fnStr += st_1.slice(spInd, st_1.indexOf('(', spInd));\n }\n else {\n fnStr += st_1;\n for (var t in v.prototype)\n fnStr += ';' + k + '.prototype.' + t + '=' + v.prototype[t].toString();\n }\n }\n else\n fnStr += st_1;\n }\n else\n td[k] = v;\n }\n return fnStr;\n};\nvar ch = [];\n// clone bufs\nvar cbfs = function (v) {\n var tl = [];\n for (var k in v) {\n if (v[k].buffer) {\n tl.push((v[k] = new v[k].constructor(v[k])).buffer);\n }\n }\n return tl;\n};\n// use a worker to execute code\nvar wrkr = function (fns, init, id, cb) {\n if (!ch[id]) {\n var fnStr = '', td_1 = {}, m = fns.length - 1;\n for (var i = 0; i < m; ++i)\n fnStr = wcln(fns[i], fnStr, td_1);\n ch[id] = { c: wcln(fns[m], fnStr, td_1), e: td_1 };\n }\n var td = mrg({}, ch[id].e);\n return wk(ch[id].c + ';onmessage=function(e){for(var k in e.data)self[k]=e.data[k];onmessage=' + init.toString() + '}', id, td, cbfs(td), cb);\n};\n// base async inflate fn\nvar bInflt = function () { return [u8, u16, i32, fleb, fdeb, clim, fl, fd, flrm, fdrm, rev, ec, hMap, max, bits, bits16, shft, slc, err, inflt, inflateSync, pbf, gopt]; };\nvar bDflt = function () { return [u8, u16, i32, fleb, fdeb, clim, revfl, revfd, flm, flt, fdm, fdt, rev, deo, et, hMap, wbits, wbits16, hTree, ln, lc, clen, wfblk, wblk, shft, slc, dflt, dopt, deflateSync, pbf]; };\n// gzip extra\nvar gze = function () { return [gzh, gzhl, wbytes, crc, crct]; };\n// gunzip extra\nvar guze = function () { return [gzs, gzl]; };\n// zlib extra\nvar zle = function () { return [zlh, wbytes, adler]; };\n// unzlib extra\nvar zule = function () { return [zls]; };\n// post buf\nvar pbf = function (msg) { return postMessage(msg, [msg.buffer]); };\n// get opts\nvar gopt = function (o) { return o && {\n out: o.size && new u8(o.size),\n dictionary: o.dictionary\n}; };\n// async helper\nvar cbify = function (dat, opts, fns, init, id, cb) {\n var w = wrkr(fns, init, id, function (err, dat) {\n w.terminate();\n cb(err, dat);\n });\n w.postMessage([dat, opts], opts.consume ? [dat.buffer] : []);\n return function () { w.terminate(); };\n};\n// auto stream\nvar astrm = function (strm) {\n strm.ondata = function (dat, final) { return postMessage([dat, final], [dat.buffer]); };\n return function (ev) {\n if (ev.data[0]) {\n strm.push(ev.data[0], ev.data[1]);\n postMessage([ev.data[0].length]);\n }\n else\n strm.flush(ev.data[1]);\n };\n};\n// async stream attach\nvar astrmify = function (fns, strm, opts, init, id, flush, ext) {\n var t;\n var w = wrkr(fns, init, id, function (err, dat) {\n if (err)\n w.terminate(), strm.ondata.call(strm, err);\n else if (!Array.isArray(dat))\n ext(dat);\n else if (dat.length == 1) {\n strm.queuedSize -= dat[0];\n if (strm.ondrain)\n strm.ondrain(dat[0]);\n }\n else {\n if (dat[1])\n w.terminate();\n strm.ondata.call(strm, err, dat[0], dat[1]);\n }\n });\n w.postMessage(opts);\n strm.queuedSize = 0;\n strm.push = function (d, f) {\n if (!strm.ondata)\n err(5);\n if (t)\n strm.ondata(err(4, 0, 1), null, !!f);\n strm.queuedSize += d.length;\n // can fail for cross-realm Uint8Array, but ok - only a small performance penalty\n w.postMessage([d, t = f], d.buffer instanceof ArrayBuffer ? [d.buffer] : []);\n };\n strm.terminate = function () { w.terminate(); };\n if (flush) {\n strm.flush = function (sync) { w.postMessage([0, sync]); };\n }\n};\n// read 2 bytes\nvar b2 = function (d, b) { return d[b] | (d[b + 1] << 8); };\n// read 4 bytes\nvar b4 = function (d, b) { return (d[b] | (d[b + 1] << 8) | (d[b + 2] << 16) | (d[b + 3] << 24)) >>> 0; };\n// read 8 bytes\nvar b8 = function (d, b) { return b4(d, b) + (b4(d, b + 4) * 4294967296); };\n// write bytes\nvar wbytes = function (d, b, v) {\n for (; v; ++b)\n d[b] = v, v >>>= 8;\n};\n// gzip header\nvar gzh = function (c, o) {\n var fn = o.filename;\n c[0] = 31, c[1] = 139, c[2] = 8, c[8] = o.level < 2 ? 4 : o.level == 9 ? 2 : 0, c[9] = 3; // assume Unix\n if (o.mtime != 0)\n wbytes(c, 4, Math.floor(new Date(o.mtime || Date.now()) / 1000));\n if (fn) {\n c[3] = 8;\n for (var i = 0; i <= fn.length; ++i)\n c[i + 10] = fn.charCodeAt(i);\n }\n};\n// gzip footer: -8 to -4 = CRC, -4 to -0 is length\n// gzip start\nvar gzs = function (d) {\n if (d[0] != 31 || d[1] != 139 || d[2] != 8)\n err(6, 'invalid gzip data');\n var flg = d[3];\n var st = 10;\n if (flg & 4)\n st += (d[10] | d[11] << 8) + 2;\n for (var zs = (flg >> 3 & 1) + (flg >> 4 & 1); zs > 0; zs -= !d[st++])\n ;\n return st + (flg & 2);\n};\n// gzip length\nvar gzl = function (d) {\n var l = d.length;\n return (d[l - 4] | d[l - 3] << 8 | d[l - 2] << 16 | d[l - 1] << 24) >>> 0;\n};\n// gzip header length\nvar gzhl = function (o) { return 10 + (o.filename ? o.filename.length + 1 : 0); };\n// zlib header\nvar zlh = function (c, o) {\n var lv = o.level, fl = lv == 0 ? 0 : lv < 6 ? 1 : lv == 9 ? 3 : 2;\n c[0] = 120, c[1] = (fl << 6) | (o.dictionary && 32);\n c[1] |= 31 - ((c[0] << 8) | c[1]) % 31;\n if (o.dictionary) {\n var h = adler();\n h.p(o.dictionary);\n wbytes(c, 2, h.d());\n }\n};\n// zlib start\nvar zls = function (d, dict) {\n if ((d[0] & 15) != 8 || (d[0] >> 4) > 7 || ((d[0] << 8 | d[1]) % 31))\n err(6, 'invalid zlib data');\n if ((d[1] >> 5 & 1) == +!dict)\n err(6, 'invalid zlib data: ' + (d[1] & 32 ? 'need' : 'unexpected') + ' dictionary');\n return (d[1] >> 3 & 4) + 2;\n};\nfunction StrmOpt(opts, cb) {\n if (typeof opts == 'function')\n cb = opts, opts = {};\n this.ondata = cb;\n return opts;\n}\n/**\n * Streaming DEFLATE compression\n */\nvar Deflate = /*#__PURE__*/ (function () {\n function Deflate(opts, cb) {\n if (typeof opts == 'function')\n cb = opts, opts = {};\n this.ondata = cb;\n this.o = opts || {};\n this.s = { l: 0, i: 32768, w: 32768, z: 32768 };\n // Buffer length must always be 0 mod 32768 for index calculations to be correct when modifying head and prev\n // 98304 = 32768 (lookback) + 65536 (common chunk size)\n this.b = new u8(98304);\n if (this.o.dictionary) {\n var dict = this.o.dictionary.subarray(-32768);\n this.b.set(dict, 32768 - dict.length);\n this.s.i = 32768 - dict.length;\n }\n }\n Deflate.prototype.p = function (c, f) {\n this.ondata(dopt(c, this.o, 0, 0, this.s), f);\n };\n /**\n * Pushes a chunk to be deflated\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Deflate.prototype.push = function (chunk, final) {\n if (!this.ondata)\n err(5);\n if (this.s.l)\n err(4);\n var endLen = chunk.length + this.s.z;\n if (endLen > this.b.length) {\n if (endLen > 2 * this.b.length - 32768) {\n var newBuf = new u8(endLen & -32768);\n newBuf.set(this.b.subarray(0, this.s.z));\n this.b = newBuf;\n }\n var split = this.b.length - this.s.z;\n this.b.set(chunk.subarray(0, split), this.s.z);\n this.s.z = this.b.length;\n this.p(this.b, false);\n this.b.set(this.b.subarray(-32768));\n this.b.set(chunk.subarray(split), 32768);\n this.s.z = chunk.length - split + 32768;\n this.s.i = 32766, this.s.w = 32768;\n }\n else {\n this.b.set(chunk, this.s.z);\n this.s.z += chunk.length;\n }\n this.s.l = final & 1;\n if (this.s.z > this.s.w + 8191 || final) {\n this.p(this.b, final || false);\n this.s.w = this.s.i, this.s.i -= 2;\n }\n if (final) {\n // cleanup unneeded buffers/state to reduce memory usage\n this.s = this.o = {};\n this.b = et;\n }\n };\n /**\n * Flushes buffered uncompressed data. Useful to immediately retrieve the\n * deflated output for small inputs.\n * @param sync Whether to flush to a byte boundary. A sync flush takes 4-5\n * extra bytes, but guarantees all pushed data is immediately\n * decompressible. A separate DEFLATE stream may be concatenated\n * with the current output after a sync flush.\n */\n Deflate.prototype.flush = function (sync) {\n if (!this.ondata)\n err(5);\n if (this.s.l)\n err(4);\n this.p(this.b, false);\n this.s.w = this.s.i, this.s.i -= 2;\n // could technically skip writing the type-0 block for (this.s.r & 7) == 0,\n // but the deterministic trailer (00 00 FF FF) is useful in some situations\n if (sync) {\n var c = new u8(6);\n c[0] = this.s.r >> 3;\n // write empty, non-final type-0 block\n var ep = wfblk(c, this.s.r, et);\n this.s.r = 0;\n this.ondata(c.subarray(0, ep >> 3), false);\n }\n };\n return Deflate;\n}());\nexport { Deflate };\n/**\n * Asynchronous streaming DEFLATE compression\n */\nvar AsyncDeflate = /*#__PURE__*/ (function () {\n function AsyncDeflate(opts, cb) {\n astrmify([\n bDflt,\n function () { return [astrm, Deflate]; }\n ], this, StrmOpt.call(this, opts, cb), function (ev) {\n var strm = new Deflate(ev.data);\n onmessage = astrm(strm);\n }, 6, 1);\n }\n return AsyncDeflate;\n}());\nexport { AsyncDeflate };\nexport function deflate(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n return cbify(data, opts, [\n bDflt,\n ], function (ev) { return pbf(deflateSync(ev.data[0], ev.data[1])); }, 0, cb);\n}\n/**\n * Compresses data with DEFLATE without any wrapper\n * @param data The data to compress\n * @param opts The compression options\n * @returns The deflated version of the data\n */\nexport function deflateSync(data, opts) {\n return dopt(data, opts || {}, 0, 0);\n}\n/**\n * Streaming DEFLATE decompression\n */\nvar Inflate = /*#__PURE__*/ (function () {\n function Inflate(opts, cb) {\n // no StrmOpt here to avoid adding to workerizer\n if (typeof opts == 'function')\n cb = opts, opts = {};\n this.ondata = cb;\n var dict = opts && opts.dictionary && opts.dictionary.subarray(-32768);\n this.s = { i: 0, b: dict ? dict.length : 0 };\n this.o = new u8(32768);\n this.p = new u8(0);\n if (dict)\n this.o.set(dict);\n }\n Inflate.prototype.e = function (c) {\n if (!this.ondata)\n err(5);\n if (this.d)\n err(4);\n if (!this.p.length)\n this.p = c;\n else if (c.length) {\n var n = new u8(this.p.length + c.length);\n n.set(this.p), n.set(c, this.p.length), this.p = n;\n }\n };\n Inflate.prototype.c = function (final) {\n this.s.i = +(this.d = final || false);\n var bts = this.s.b;\n var dt = inflt(this.p, this.s, this.o);\n this.ondata(slc(dt, bts, this.s.b), this.d);\n this.o = slc(dt, this.s.b - 32768), this.s.b = this.o.length;\n this.p = slc(this.p, (this.s.p / 8) | 0), this.s.p &= 7;\n };\n /**\n * Pushes a chunk to be inflated\n * @param chunk The chunk to push\n * @param final Whether this is the final chunk\n */\n Inflate.prototype.push = function (chunk, final) {\n this.e(chunk), this.c(final);\n };\n return Inflate;\n}());\nexport { Inflate };\n/**\n * Asynchronous streaming DEFLATE decompression\n */\nvar AsyncInflate = /*#__PURE__*/ (function () {\n function AsyncInflate(opts, cb) {\n astrmify([\n bInflt,\n function () { return [astrm, Inflate]; }\n ], this, StrmOpt.call(this, opts, cb), function (ev) {\n var strm = new Inflate(ev.data);\n onmessage = astrm(strm);\n }, 7, 0);\n }\n return AsyncInflate;\n}());\nexport { AsyncInflate };\nexport function inflate(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n return cbify(data, opts, [\n bInflt\n ], function (ev) { return pbf(inflateSync(ev.data[0], gopt(ev.data[1]))); }, 1, cb);\n}\nexport function inflateSync(data, opts) {\n return inflt(data, { i: 2 }, opts && opts.out, opts && opts.dictionary);\n}\n// before you yell at me for not just using extends, my reason is that TS inheritance is hard to workerize.\n/**\n * Streaming GZIP compression\n */\nvar Gzip = /*#__PURE__*/ (function () {\n function Gzip(opts, cb) {\n this.c = crc();\n this.l = 0;\n this.v = 1;\n Deflate.call(this, opts, cb);\n }\n /**\n * Pushes a chunk to be GZIPped\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Gzip.prototype.push = function (chunk, final) {\n this.c.p(chunk);\n this.l += chunk.length;\n Deflate.prototype.push.call(this, chunk, final);\n };\n Gzip.prototype.p = function (c, f) {\n var raw = dopt(c, this.o, this.v && gzhl(this.o), f && 8, this.s);\n if (this.v)\n gzh(raw, this.o), this.v = 0;\n if (f)\n wbytes(raw, raw.length - 8, this.c.d()), wbytes(raw, raw.length - 4, this.l);\n this.ondata(raw, f);\n };\n /**\n * Flushes buffered uncompressed data. Useful to immediately retrieve the\n * GZIPped output for small inputs.\n * @param sync Whether to flush to a byte boundary. A sync flush takes 4-5\n * extra bytes, but guarantees all pushed data is immediately\n * decompressible.\n */\n Gzip.prototype.flush = function (sync) {\n Deflate.prototype.flush.call(this, sync);\n };\n return Gzip;\n}());\nexport { Gzip };\n/**\n * Asynchronous streaming GZIP compression\n */\nvar AsyncGzip = /*#__PURE__*/ (function () {\n function AsyncGzip(opts, cb) {\n astrmify([\n bDflt,\n gze,\n function () { return [astrm, Deflate, Gzip]; }\n ], this, StrmOpt.call(this, opts, cb), function (ev) {\n var strm = new Gzip(ev.data);\n onmessage = astrm(strm);\n }, 8, 1);\n }\n return AsyncGzip;\n}());\nexport { AsyncGzip };\nexport function gzip(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n return cbify(data, opts, [\n bDflt,\n gze,\n function () { return [gzipSync]; }\n ], function (ev) { return pbf(gzipSync(ev.data[0], ev.data[1])); }, 2, cb);\n}\n/**\n * Compresses data with GZIP\n * @param data The data to compress\n * @param opts The compression options\n * @returns The gzipped version of the data\n */\nexport function gzipSync(data, opts) {\n if (!opts)\n opts = {};\n var c = crc(), l = data.length;\n c.p(data);\n var d = dopt(data, opts, gzhl(opts), 8), s = d.length;\n return gzh(d, opts), wbytes(d, s - 8, c.d()), wbytes(d, s - 4, l), d;\n}\n/**\n * Streaming single or multi-member GZIP decompression\n */\nvar Gunzip = /*#__PURE__*/ (function () {\n function Gunzip(opts, cb) {\n this.v = 1;\n this.r = 0;\n Inflate.call(this, opts, cb);\n }\n /**\n * Pushes a chunk to be GUNZIPped\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Gunzip.prototype.push = function (chunk, final) {\n Inflate.prototype.e.call(this, chunk);\n this.r += chunk.length;\n if (this.v) {\n var p = this.p.subarray(this.v - 1);\n var s = p.length > 3 ? gzs(p) : 4;\n if (s > p.length) {\n if (!final)\n return;\n }\n else if (this.v > 1 && this.onmember) {\n this.onmember(this.r - p.length);\n }\n this.p = p.subarray(s), this.v = 0;\n }\n // necessary to prevent TS from using the closure value\n // This allows for workerization to function correctly\n Inflate.prototype.c.call(this, 0);\n // process concatenated GZIP\n if (this.s.f && !this.s.l) {\n this.v = shft(this.s.p) + 9;\n this.s = { i: 0 };\n this.o = new u8(0);\n this.push(new u8(0), final);\n }\n else if (final) {\n Inflate.prototype.c.call(this, final);\n }\n };\n return Gunzip;\n}());\nexport { Gunzip };\n/**\n * Asynchronous streaming single or multi-member GZIP decompression\n */\nvar AsyncGunzip = /*#__PURE__*/ (function () {\n function AsyncGunzip(opts, cb) {\n var _this = this;\n astrmify([\n bInflt,\n guze,\n function () { return [astrm, Inflate, Gunzip]; }\n ], this, StrmOpt.call(this, opts, cb), function (ev) {\n var strm = new Gunzip(ev.data);\n strm.onmember = function (offset) { return postMessage(offset); };\n onmessage = astrm(strm);\n }, 9, 0, function (offset) { return _this.onmember && _this.onmember(offset); });\n }\n return AsyncGunzip;\n}());\nexport { AsyncGunzip };\nexport function gunzip(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n return cbify(data, opts, [\n bInflt,\n guze,\n function () { return [gunzipSync]; }\n ], function (ev) { return pbf(gunzipSync(ev.data[0], ev.data[1])); }, 3, cb);\n}\nexport function gunzipSync(data, opts) {\n var st = gzs(data);\n if (st + 8 > data.length)\n err(6, 'invalid gzip data');\n return inflt(data.subarray(st, -8), { i: 2 }, opts && opts.out || new u8(gzl(data)), opts && opts.dictionary);\n}\n/**\n * Streaming Zlib compression\n */\nvar Zlib = /*#__PURE__*/ (function () {\n function Zlib(opts, cb) {\n this.c = adler();\n this.v = 1;\n Deflate.call(this, opts, cb);\n }\n /**\n * Pushes a chunk to be zlibbed\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Zlib.prototype.push = function (chunk, final) {\n this.c.p(chunk);\n Deflate.prototype.push.call(this, chunk, final);\n };\n Zlib.prototype.p = function (c, f) {\n var raw = dopt(c, this.o, this.v && (this.o.dictionary ? 6 : 2), f && 4, this.s);\n if (this.v)\n zlh(raw, this.o), this.v = 0;\n if (f)\n wbytes(raw, raw.length - 4, this.c.d());\n this.ondata(raw, f);\n };\n /**\n * Flushes buffered uncompressed data. Useful to immediately retrieve the\n * zlibbed output for small inputs.\n * @param sync Whether to flush to a byte boundary. A sync flush takes 4-5\n * extra bytes, but guarantees all pushed data is immediately\n * decompressible.\n */\n Zlib.prototype.flush = function (sync) {\n Deflate.prototype.flush.call(this, sync);\n };\n return Zlib;\n}());\nexport { Zlib };\n/**\n * Asynchronous streaming Zlib compression\n */\nvar AsyncZlib = /*#__PURE__*/ (function () {\n function AsyncZlib(opts, cb) {\n astrmify([\n bDflt,\n zle,\n function () { return [astrm, Deflate, Zlib]; }\n ], this, StrmOpt.call(this, opts, cb), function (ev) {\n var strm = new Zlib(ev.data);\n onmessage = astrm(strm);\n }, 10, 1);\n }\n return AsyncZlib;\n}());\nexport { AsyncZlib };\nexport function zlib(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n return cbify(data, opts, [\n bDflt,\n zle,\n function () { return [zlibSync]; }\n ], function (ev) { return pbf(zlibSync(ev.data[0], ev.data[1])); }, 4, cb);\n}\n/**\n * Compress data with Zlib\n * @param data The data to compress\n * @param opts The compression options\n * @returns The zlib-compressed version of the data\n */\nexport function zlibSync(data, opts) {\n if (!opts)\n opts = {};\n var a = adler();\n a.p(data);\n var d = dopt(data, opts, opts.dictionary ? 6 : 2, 4);\n return zlh(d, opts), wbytes(d, d.length - 4, a.d()), d;\n}\n/**\n * Streaming Zlib decompression\n */\nvar Unzlib = /*#__PURE__*/ (function () {\n function Unzlib(opts, cb) {\n Inflate.call(this, opts, cb);\n this.v = opts && opts.dictionary ? 2 : 1;\n }\n /**\n * Pushes a chunk to be unzlibbed\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Unzlib.prototype.push = function (chunk, final) {\n Inflate.prototype.e.call(this, chunk);\n if (this.v) {\n if (this.p.length < 6 && !final)\n return;\n this.p = this.p.subarray(zls(this.p, this.v - 1)), this.v = 0;\n }\n if (final) {\n if (this.p.length < 4)\n err(6, 'invalid zlib data');\n this.p = this.p.subarray(0, -4);\n }\n // necessary to prevent TS from using the closure value\n // This allows for workerization to function correctly\n Inflate.prototype.c.call(this, final);\n };\n return Unzlib;\n}());\nexport { Unzlib };\n/**\n * Asynchronous streaming Zlib decompression\n */\nvar AsyncUnzlib = /*#__PURE__*/ (function () {\n function AsyncUnzlib(opts, cb) {\n astrmify([\n bInflt,\n zule,\n function () { return [astrm, Inflate, Unzlib]; }\n ], this, StrmOpt.call(this, opts, cb), function (ev) {\n var strm = new Unzlib(ev.data);\n onmessage = astrm(strm);\n }, 11, 0);\n }\n return AsyncUnzlib;\n}());\nexport { AsyncUnzlib };\nexport function unzlib(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n return cbify(data, opts, [\n bInflt,\n zule,\n function () { return [unzlibSync]; }\n ], function (ev) { return pbf(unzlibSync(ev.data[0], gopt(ev.data[1]))); }, 5, cb);\n}\nexport function unzlibSync(data, opts) {\n return inflt(data.subarray(zls(data, opts && opts.dictionary), -4), { i: 2 }, opts && opts.out, opts && opts.dictionary);\n}\n// Default algorithm for compression (used because having a known output size allows faster decompression)\nexport { gzip as compress, AsyncGzip as AsyncCompress };\nexport { gzipSync as compressSync, Gzip as Compress };\n/**\n * Streaming GZIP, Zlib, or raw DEFLATE decompression\n */\nvar Decompress = /*#__PURE__*/ (function () {\n function Decompress(opts, cb) {\n this.o = StrmOpt.call(this, opts, cb) || {};\n this.G = Gunzip;\n this.I = Inflate;\n this.Z = Unzlib;\n }\n // init substream\n // overriden by AsyncDecompress\n Decompress.prototype.i = function () {\n var _this = this;\n this.s.ondata = function (dat, final) {\n _this.ondata(dat, final);\n };\n };\n /**\n * Pushes a chunk to be decompressed\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Decompress.prototype.push = function (chunk, final) {\n if (!this.ondata)\n err(5);\n if (!this.s) {\n if (this.p && this.p.length) {\n var n = new u8(this.p.length + chunk.length);\n n.set(this.p), n.set(chunk, this.p.length);\n }\n else\n this.p = chunk;\n if (this.p.length > 2) {\n this.s = (this.p[0] == 31 && this.p[1] == 139 && this.p[2] == 8)\n ? new this.G(this.o)\n : ((this.p[0] & 15) != 8 || (this.p[0] >> 4) > 7 || ((this.p[0] << 8 | this.p[1]) % 31))\n ? new this.I(this.o)\n : new this.Z(this.o);\n this.i();\n this.s.push(this.p, final);\n this.p = null;\n }\n }\n else\n this.s.push(chunk, final);\n };\n return Decompress;\n}());\nexport { Decompress };\n/**\n * Asynchronous streaming GZIP, Zlib, or raw DEFLATE decompression\n */\nvar AsyncDecompress = /*#__PURE__*/ (function () {\n function AsyncDecompress(opts, cb) {\n Decompress.call(this, opts, cb);\n this.queuedSize = 0;\n this.G = AsyncGunzip;\n this.I = AsyncInflate;\n this.Z = AsyncUnzlib;\n }\n AsyncDecompress.prototype.i = function () {\n var _this = this;\n this.s.ondata = function (err, dat, final) {\n _this.ondata(err, dat, final);\n };\n this.s.ondrain = function (size) {\n _this.queuedSize -= size;\n if (_this.ondrain)\n _this.ondrain(size);\n };\n };\n /**\n * Pushes a chunk to be decompressed\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n AsyncDecompress.prototype.push = function (chunk, final) {\n this.queuedSize += chunk.length;\n Decompress.prototype.push.call(this, chunk, final);\n };\n return AsyncDecompress;\n}());\nexport { AsyncDecompress };\nexport function decompress(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n return (data[0] == 31 && data[1] == 139 && data[2] == 8)\n ? gunzip(data, opts, cb)\n : ((data[0] & 15) != 8 || (data[0] >> 4) > 7 || ((data[0] << 8 | data[1]) % 31))\n ? inflate(data, opts, cb)\n : unzlib(data, opts, cb);\n}\n/**\n * Expands compressed GZIP, Zlib, or raw DEFLATE data, automatically detecting the format\n * @param data The data to decompress\n * @param opts The decompression options\n * @returns The decompressed version of the data\n */\nexport function decompressSync(data, opts) {\n return (data[0] == 31 && data[1] == 139 && data[2] == 8)\n ? gunzipSync(data, opts)\n : ((data[0] & 15) != 8 || (data[0] >> 4) > 7 || ((data[0] << 8 | data[1]) % 31))\n ? inflateSync(data, opts)\n : unzlibSync(data, opts);\n}\n// flatten a directory structure\nvar fltn = function (d, p, t, o) {\n for (var k in d) {\n var val = d[k], n = p + k, op = o;\n if (Array.isArray(val))\n op = mrg(o, val[1]), val = val[0];\n if (ArrayBuffer.isView(val))\n t[n] = [val, op];\n else {\n t[n += '/'] = [new u8(0), op];\n fltn(val, n, t, o);\n }\n }\n};\n// text encoder\nvar te = typeof TextEncoder != 'undefined' && /*#__PURE__*/ new TextEncoder();\n// text decoder\nvar td = typeof TextDecoder != 'undefined' && /*#__PURE__*/ new TextDecoder();\n// text decoder stream\nvar tds = 0;\ntry {\n td.decode(et, { stream: true });\n tds = 1;\n}\ncatch (e) { }\n// decode UTF8\nvar dutf8 = function (d) {\n for (var r = '', i = 0;;) {\n var c = d[i++];\n var eb = (c > 127) + (c > 223) + (c > 239);\n if (i + eb > d.length)\n return { s: r, r: slc(d, i - 1) };\n if (!eb)\n r += String.fromCharCode(c);\n else if (eb == 3) {\n c = ((c & 15) << 18 | (d[i++] & 63) << 12 | (d[i++] & 63) << 6 | (d[i++] & 63)) - 65536,\n r += String.fromCharCode(55296 | (c >> 10), 56320 | (c & 1023));\n }\n else if (eb & 1)\n r += String.fromCharCode((c & 31) << 6 | (d[i++] & 63));\n else\n r += String.fromCharCode((c & 15) << 12 | (d[i++] & 63) << 6 | (d[i++] & 63));\n }\n};\n/**\n * Streaming UTF-8 decoding\n */\nvar DecodeUTF8 = /*#__PURE__*/ (function () {\n /**\n * Creates a UTF-8 decoding stream\n * @param cb The callback to call whenever data is decoded\n */\n function DecodeUTF8(cb) {\n this.ondata = cb;\n if (tds)\n this.t = new TextDecoder();\n else\n this.p = et;\n }\n /**\n * Pushes a chunk to be decoded from UTF-8 binary\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n DecodeUTF8.prototype.push = function (chunk, final) {\n if (!this.ondata)\n err(5);\n final = !!final;\n if (this.t) {\n this.ondata(this.t.decode(chunk, { stream: true }), final);\n if (final) {\n if (this.t.decode().length)\n err(8);\n this.t = null;\n }\n return;\n }\n if (!this.p)\n err(4);\n var dat = new u8(this.p.length + chunk.length);\n dat.set(this.p);\n dat.set(chunk, this.p.length);\n var _a = dutf8(dat), s = _a.s, r = _a.r;\n if (final) {\n if (r.length)\n err(8);\n this.p = null;\n }\n else\n this.p = r;\n this.ondata(s, final);\n };\n return DecodeUTF8;\n}());\nexport { DecodeUTF8 };\n/**\n * Streaming UTF-8 encoding\n */\nvar EncodeUTF8 = /*#__PURE__*/ (function () {\n /**\n * Creates a UTF-8 decoding stream\n * @param cb The callback to call whenever data is encoded\n */\n function EncodeUTF8(cb) {\n this.ondata = cb;\n }\n /**\n * Pushes a chunk to be encoded to UTF-8\n * @param chunk The string data to push\n * @param final Whether this is the last chunk\n */\n EncodeUTF8.prototype.push = function (chunk, final) {\n if (!this.ondata)\n err(5);\n if (this.d)\n err(4);\n this.ondata(strToU8(chunk), this.d = final || false);\n };\n return EncodeUTF8;\n}());\nexport { EncodeUTF8 };\n/**\n * Converts a string into a Uint8Array for use with compression/decompression methods\n * @param str The string to encode\n * @param latin1 Whether or not to interpret the data as Latin-1. This should\n * not need to be true unless decoding a binary string.\n * @returns The string encoded in UTF-8/Latin-1 binary\n */\nexport function strToU8(str, latin1) {\n if (latin1) {\n var ar_1 = new u8(str.length);\n for (var i = 0; i < str.length; ++i)\n ar_1[i] = str.charCodeAt(i);\n return ar_1;\n }\n if (te)\n return te.encode(str);\n var l = str.length;\n var ar = new u8(str.length + (str.length >> 1));\n var ai = 0;\n var w = function (v) { ar[ai++] = v; };\n for (var i = 0; i < l; ++i) {\n if (ai + 5 > ar.length) {\n var n = new u8(ai + 8 + ((l - i) << 1));\n n.set(ar);\n ar = n;\n }\n var c = str.charCodeAt(i);\n if (c < 128 || latin1)\n w(c);\n else if (c < 2048)\n w(192 | (c >> 6)), w(128 | (c & 63));\n else if (c > 55295 && c < 57344)\n c = 65536 + (c & 1023 << 10) | (str.charCodeAt(++i) & 1023),\n w(240 | (c >> 18)), w(128 | ((c >> 12) & 63)), w(128 | ((c >> 6) & 63)), w(128 | (c & 63));\n else\n w(224 | (c >> 12)), w(128 | ((c >> 6) & 63)), w(128 | (c & 63));\n }\n return slc(ar, 0, ai);\n}\n/**\n * Converts a Uint8Array to a string\n * @param dat The data to decode to string\n * @param latin1 Whether or not to interpret the data as Latin-1. This should\n * not need to be true unless encoding to binary string.\n * @returns The original UTF-8/Latin-1 string\n */\nexport function strFromU8(dat, latin1) {\n if (latin1) {\n var r = '';\n for (var i = 0; i < dat.length; i += 16384)\n r += String.fromCharCode.apply(null, dat.subarray(i, i + 16384));\n return r;\n }\n else if (td) {\n return td.decode(dat);\n }\n else {\n var _a = dutf8(dat), s = _a.s, r = _a.r;\n if (r.length)\n err(8);\n return s;\n }\n}\n;\n// deflate bit flag\nvar dbf = function (l) { return l == 1 ? 3 : l < 6 ? 2 : l == 9 ? 1 : 0; };\n// skip local zip header\nvar slzh = function (d, b) { return b + 30 + b2(d, b + 26) + b2(d, b + 28); };\n// read zip header\nvar zh = function (d, b, z) {\n var fnl = b2(d, b + 28), efl = b2(d, b + 30), fn = strFromU8(d.subarray(b + 46, b + 46 + fnl), !(b2(d, b + 8) & 2048)), es = b + 46 + fnl;\n var _a = z64hs(d, es, efl, z, b4(d, b + 20), b4(d, b + 24), b4(d, b + 42)), sc = _a[0], su = _a[1], off = _a[2];\n return [b2(d, b + 10), sc, su, fn, es + efl + b2(d, b + 32), off];\n};\n// read zip64 header sizes\nvar z64hs = function (d, b, l, z, sc, su, off) {\n var nsc = sc == 4294967295, nsu = su == 4294967295, noff = off == 4294967295, e = b + l;\n var nf = nsc + nsu + noff;\n if (z && nf) {\n for (; b + 4 < e; b += 4 + b2(d, b + 2)) {\n if (b2(d, b) == 1) {\n return [\n nsc ? b8(d, b + 4 + 8 * nsu) : sc,\n nsu ? b8(d, b + 4) : su,\n noff ? b8(d, b + 4 + 8 * (nsu + nsc)) : off,\n 1\n ];\n }\n }\n // z == 2 for unknown whether or not zip64\n if (z < 2)\n err(13);\n }\n return [sc, su, off, 0];\n};\n// extra field length\nvar exfl = function (ex) {\n var le = 0;\n if (ex) {\n for (var k in ex) {\n var l = ex[k].length;\n if (l > 65535)\n err(9);\n le += l + 4;\n }\n }\n return le;\n};\n// write zip header\nvar wzh = function (d, b, f, fn, u, c, ce, co) {\n var fl = fn.length, ex = f.extra, col = co && co.length;\n var exl = exfl(ex);\n wbytes(d, b, ce != null ? 0x2014B50 : 0x4034B50), b += 4;\n if (ce != null)\n d[b++] = 20, d[b++] = f.os;\n d[b] = 20, b += 2; // spec compliance? what's that?\n d[b++] = (f.flag << 1) | (c < 0 && 8), d[b++] = u && 8;\n d[b++] = f.compression & 255, d[b++] = f.compression >> 8;\n var dt = new Date(f.mtime == null ? Date.now() : f.mtime), y = dt.getFullYear() - 1980;\n if (y < 0 || y > 119)\n err(10);\n wbytes(d, b, (y << 25) | ((dt.getMonth() + 1) << 21) | (dt.getDate() << 16) | (dt.getHours() << 11) | (dt.getMinutes() << 5) | (dt.getSeconds() >> 1)), b += 4;\n if (c != -1) {\n wbytes(d, b, f.crc);\n wbytes(d, b + 4, c < 0 ? -c - 2 : c);\n wbytes(d, b + 8, f.size);\n }\n wbytes(d, b + 12, fl);\n wbytes(d, b + 14, exl), b += 16;\n if (ce != null) {\n wbytes(d, b, col);\n wbytes(d, b + 6, f.attrs);\n wbytes(d, b + 10, ce), b += 14;\n }\n d.set(fn, b);\n b += fl;\n if (exl) {\n for (var k in ex) {\n var exf = ex[k], l = exf.length;\n wbytes(d, b, +k);\n wbytes(d, b + 2, l);\n d.set(exf, b + 4), b += 4 + l;\n }\n }\n if (col)\n d.set(co, b), b += col;\n return b;\n};\n// write zip footer (end of central directory)\nvar wzf = function (o, b, c, d, e) {\n wbytes(o, b, 0x6054B50); // skip disk\n wbytes(o, b + 8, c);\n wbytes(o, b + 10, c);\n wbytes(o, b + 12, d);\n wbytes(o, b + 16, e);\n};\n/**\n * A pass-through stream to keep data uncompressed in a ZIP archive.\n */\nvar ZipPassThrough = /*#__PURE__*/ (function () {\n /**\n * Creates a pass-through stream that can be added to ZIP archives\n * @param filename The filename to associate with this data stream\n */\n function ZipPassThrough(filename) {\n this.filename = filename;\n this.c = crc();\n this.size = 0;\n this.compression = 0;\n }\n /**\n * Processes a chunk and pushes to the output stream. You can override this\n * method in a subclass for custom behavior, but by default this passes\n * the data through. You must call this.ondata(err, chunk, final) at some\n * point in this method.\n * @param chunk The chunk to process\n * @param final Whether this is the last chunk\n */\n ZipPassThrough.prototype.process = function (chunk, final) {\n this.ondata(null, chunk, final);\n };\n /**\n * Pushes a chunk to be added. If you are subclassing this with a custom\n * compression algorithm, note that you must push data from the source\n * file only, pre-compression.\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n ZipPassThrough.prototype.push = function (chunk, final) {\n if (!this.ondata)\n err(5);\n this.c.p(chunk);\n this.size += chunk.length;\n if (final)\n this.crc = this.c.d();\n // we shouldn't really do this cast, but properly handling ArrayBufferLike\n // makes the API unergonomic with Buffer\n this.process(chunk, final || false);\n };\n return ZipPassThrough;\n}());\nexport { ZipPassThrough };\n// I don't extend because TypeScript extension adds 1kB of runtime bloat\n/**\n * Streaming DEFLATE compression for ZIP archives. Prefer using AsyncZipDeflate\n * for better performance\n */\nvar ZipDeflate = /*#__PURE__*/ (function () {\n /**\n * Creates a DEFLATE stream that can be added to ZIP archives\n * @param filename The filename to associate with this data stream\n * @param opts The compression options\n */\n function ZipDeflate(filename, opts) {\n var _this = this;\n if (!opts)\n opts = {};\n ZipPassThrough.call(this, filename);\n this.d = new Deflate(opts, function (dat, final) {\n _this.ondata(null, dat, final);\n });\n this.compression = 8;\n this.flag = dbf(opts.level);\n }\n ZipDeflate.prototype.process = function (chunk, final) {\n try {\n this.d.push(chunk, final);\n }\n catch (e) {\n this.ondata(e, null, final);\n }\n };\n /**\n * Pushes a chunk to be deflated\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n ZipDeflate.prototype.push = function (chunk, final) {\n ZipPassThrough.prototype.push.call(this, chunk, final);\n };\n return ZipDeflate;\n}());\nexport { ZipDeflate };\n/**\n * Asynchronous streaming DEFLATE compression for ZIP archives\n */\nvar AsyncZipDeflate = /*#__PURE__*/ (function () {\n /**\n * Creates an asynchronous DEFLATE stream that can be added to ZIP archives\n * @param filename The filename to associate with this data stream\n * @param opts The compression options\n */\n function AsyncZipDeflate(filename, opts) {\n var _this = this;\n if (!opts)\n opts = {};\n ZipPassThrough.call(this, filename);\n this.d = new AsyncDeflate(opts, function (err, dat, final) {\n _this.ondata(err, dat, final);\n });\n this.compression = 8;\n this.flag = dbf(opts.level);\n this.terminate = this.d.terminate;\n }\n AsyncZipDeflate.prototype.process = function (chunk, final) {\n this.d.push(chunk, final);\n };\n /**\n * Pushes a chunk to be deflated\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n AsyncZipDeflate.prototype.push = function (chunk, final) {\n ZipPassThrough.prototype.push.call(this, chunk, final);\n };\n return AsyncZipDeflate;\n}());\nexport { AsyncZipDeflate };\n// TODO: Better tree shaking\n/**\n * A zippable archive to which files can incrementally be added\n */\nvar Zip = /*#__PURE__*/ (function () {\n /**\n * Creates an empty ZIP archive to which files can be added\n * @param cb The callback to call whenever data for the generated ZIP archive\n * is available\n */\n function Zip(cb) {\n this.ondata = cb;\n this.u = [];\n this.d = 1;\n }\n /**\n * Adds a file to the ZIP archive\n * @param file The file stream to add\n */\n Zip.prototype.add = function (file) {\n var _this = this;\n if (!this.ondata)\n err(5);\n // finishing or finished\n if (this.d & 2)\n this.ondata(err(4 + (this.d & 1) * 8, 0, 1), null, false);\n else {\n var f = strToU8(file.filename), fl_1 = f.length;\n var com = file.comment, o = com && strToU8(com);\n var u = fl_1 != file.filename.length || (o && (com.length != o.length));\n var hl_1 = fl_1 + exfl(file.extra) + 30;\n if (fl_1 > 65535)\n this.ondata(err(11, 0, 1), null, false);\n var header = new u8(hl_1);\n wzh(header, 0, file, f, u, -1);\n var chks_1 = [header];\n var pAll_1 = function () {\n for (var _i = 0, chks_2 = chks_1; _i < chks_2.length; _i++) {\n var chk = chks_2[_i];\n _this.ondata(null, chk, false);\n }\n chks_1 = [];\n };\n var tr_1 = this.d;\n this.d = 0;\n var ind_1 = this.u.length;\n var uf_1 = mrg(file, {\n f: f,\n u: u,\n o: o,\n t: function () {\n if (file.terminate)\n file.terminate();\n },\n r: function () {\n pAll_1();\n if (tr_1) {\n var nxt = _this.u[ind_1 + 1];\n if (nxt)\n nxt.r();\n else\n _this.d = 1;\n }\n tr_1 = 1;\n }\n });\n var cl_1 = 0;\n file.ondata = function (err, dat, final) {\n if (err) {\n _this.ondata(err, dat, final);\n _this.terminate();\n }\n else {\n cl_1 += dat.length;\n chks_1.push(dat);\n if (final) {\n var dd = new u8(16);\n wbytes(dd, 0, 0x8074B50);\n wbytes(dd, 4, file.crc);\n wbytes(dd, 8, cl_1);\n wbytes(dd, 12, file.size);\n chks_1.push(dd);\n uf_1.c = cl_1, uf_1.b = hl_1 + cl_1 + 16, uf_1.crc = file.crc, uf_1.size = file.size;\n if (tr_1)\n uf_1.r();\n tr_1 = 1;\n }\n else if (tr_1)\n pAll_1();\n }\n };\n this.u.push(uf_1);\n }\n };\n /**\n * Ends the process of adding files and prepares to emit the final chunks.\n * This *must* be called after adding all desired files for the resulting\n * ZIP file to work properly.\n */\n Zip.prototype.end = function () {\n var _this = this;\n if (this.d & 2) {\n this.ondata(err(4 + (this.d & 1) * 8, 0, 1), null, true);\n return;\n }\n if (this.d)\n this.e();\n else\n this.u.push({\n r: function () {\n if (!(_this.d & 1))\n return;\n _this.u.splice(-1, 1);\n _this.e();\n },\n t: function () { }\n });\n this.d = 3;\n };\n Zip.prototype.e = function () {\n var bt = 0, l = 0, tl = 0;\n for (var _i = 0, _a = this.u; _i < _a.length; _i++) {\n var f = _a[_i];\n tl += 46 + f.f.length + exfl(f.extra) + (f.o ? f.o.length : 0);\n }\n var out = new u8(tl + 22);\n for (var _b = 0, _c = this.u; _b < _c.length; _b++) {\n var f = _c[_b];\n wzh(out, bt, f, f.f, f.u, -f.c - 2, l, f.o);\n bt += 46 + f.f.length + exfl(f.extra) + (f.o ? f.o.length : 0), l += f.b;\n }\n wzf(out, bt, this.u.length, tl, l);\n this.ondata(null, out, true);\n this.d = 2;\n };\n /**\n * A method to terminate any internal workers used by the stream. Subsequent\n * calls to add() will fail.\n */\n Zip.prototype.terminate = function () {\n for (var _i = 0, _a = this.u; _i < _a.length; _i++) {\n var f = _a[_i];\n f.t();\n }\n this.d = 2;\n };\n return Zip;\n}());\nexport { Zip };\nexport function zip(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n var r = {};\n fltn(data, '', r, opts);\n var k = Object.keys(r);\n var lft = k.length, o = 0, tot = 0;\n var slft = lft, files = new Array(lft);\n var term = [];\n var tAll = function () {\n for (var i = 0; i < term.length; ++i)\n term[i]();\n };\n var cbd = function (a, b) {\n mt(function () { cb(a, b); });\n };\n mt(function () { cbd = cb; });\n var cbf = function () {\n var out = new u8(tot + 22), oe = o, cdl = tot - o;\n tot = 0;\n for (var i = 0; i < slft; ++i) {\n var f = files[i];\n try {\n var l = f.c.length;\n wzh(out, tot, f, f.f, f.u, l);\n var badd = 30 + f.f.length + exfl(f.extra);\n var loc = tot + badd;\n out.set(f.c, loc);\n wzh(out, o, f, f.f, f.u, l, tot, f.m), o += 16 + badd + (f.m ? f.m.length : 0), tot = loc + l;\n }\n catch (e) {\n return cbd(e, null);\n }\n }\n wzf(out, o, files.length, cdl, oe);\n cbd(null, out);\n };\n if (!lft)\n cbf();\n var _loop_1 = function (i) {\n var fn = k[i];\n var _a = r[fn], file = _a[0], p = _a[1];\n var c = crc(), size = file.length;\n c.p(file);\n var f = strToU8(fn), s = f.length;\n var com = p.comment, m = com && strToU8(com), ms = m && m.length;\n var exl = exfl(p.extra);\n var compression = p.level == 0 ? 0 : 8;\n var cbl = function (e, d) {\n if (e) {\n tAll();\n cbd(e, null);\n }\n else {\n var l = d.length;\n files[i] = mrg(p, {\n size: size,\n crc: c.d(),\n c: d,\n f: f,\n m: m,\n u: s != fn.length || (m && (com.length != ms)),\n compression: compression\n });\n o += 30 + s + exl + l;\n tot += 76 + 2 * (s + exl) + (ms || 0) + l;\n if (!--lft)\n cbf();\n }\n };\n if (s > 65535)\n cbl(err(11, 0, 1), null);\n if (!compression)\n cbl(null, file);\n else if (size < 160000) {\n try {\n cbl(null, deflateSync(file, p));\n }\n catch (e) {\n cbl(e, null);\n }\n }\n else\n term.push(deflate(file, p, cbl));\n };\n // Cannot use lft because it can decrease\n for (var i = 0; i < slft; ++i) {\n _loop_1(i);\n }\n return tAll;\n}\n/**\n * Synchronously creates a ZIP file. Prefer using `zip` for better performance\n * with more than one file.\n * @param data The directory structure for the ZIP archive\n * @param opts The main options, merged with per-file options\n * @returns The generated ZIP archive\n */\nexport function zipSync(data, opts) {\n if (!opts)\n opts = {};\n var r = {};\n var files = [];\n fltn(data, '', r, opts);\n var o = 0;\n var tot = 0;\n for (var fn in r) {\n var _a = r[fn], file = _a[0], p = _a[1];\n var compression = p.level == 0 ? 0 : 8;\n var f = strToU8(fn), s = f.length;\n var com = p.comment, m = com && strToU8(com), ms = m && m.length;\n var exl = exfl(p.extra);\n if (s > 65535)\n err(11);\n var d = compression ? deflateSync(file, p) : file, l = d.length;\n var c = crc();\n c.p(file);\n files.push(mrg(p, {\n size: file.length,\n crc: c.d(),\n c: d,\n f: f,\n m: m,\n u: s != fn.length || (m && (com.length != ms)),\n o: o,\n compression: compression\n }));\n o += 30 + s + exl + l;\n tot += 76 + 2 * (s + exl) + (ms || 0) + l;\n }\n var out = new u8(tot + 22), oe = o, cdl = tot - o;\n for (var i = 0; i < files.length; ++i) {\n var f = files[i];\n wzh(out, f.o, f, f.f, f.u, f.c.length);\n var badd = 30 + f.f.length + exfl(f.extra);\n out.set(f.c, f.o + badd);\n wzh(out, o, f, f.f, f.u, f.c.length, f.o, f.m), o += 16 + badd + (f.m ? f.m.length : 0);\n }\n wzf(out, o, files.length, cdl, oe);\n return out;\n}\n/**\n * Streaming pass-through decompression for ZIP archives\n */\nvar UnzipPassThrough = /*#__PURE__*/ (function () {\n function UnzipPassThrough() {\n }\n UnzipPassThrough.prototype.push = function (chunk, final) {\n // same as ZipPassThrough: cast to retain Buffer ergonomics\n this.ondata(null, chunk, final);\n };\n UnzipPassThrough.compression = 0;\n return UnzipPassThrough;\n}());\nexport { UnzipPassThrough };\n/**\n * Streaming DEFLATE decompression for ZIP archives. Prefer AsyncZipInflate for\n * better performance.\n */\nvar UnzipInflate = /*#__PURE__*/ (function () {\n /**\n * Creates a DEFLATE decompression that can be used in ZIP archives\n */\n function UnzipInflate() {\n var _this = this;\n this.i = new Inflate(function (dat, final) {\n _this.ondata(null, dat, final);\n });\n }\n UnzipInflate.prototype.push = function (chunk, final) {\n try {\n this.i.push(chunk, final);\n }\n catch (e) {\n this.ondata(e, null, final);\n }\n };\n UnzipInflate.compression = 8;\n return UnzipInflate;\n}());\nexport { UnzipInflate };\n/**\n * Asynchronous streaming DEFLATE decompression for ZIP archives\n */\nvar AsyncUnzipInflate = /*#__PURE__*/ (function () {\n /**\n * Creates a DEFLATE decompression that can be used in ZIP archives\n */\n function AsyncUnzipInflate(_, sz) {\n var _this = this;\n if (sz < 320000) {\n this.i = new Inflate(function (dat, final) {\n _this.ondata(null, dat, final);\n });\n }\n else {\n this.i = new AsyncInflate(function (err, dat, final) {\n _this.ondata(err, dat, final);\n });\n this.terminate = this.i.terminate;\n }\n }\n AsyncUnzipInflate.prototype.push = function (chunk, final) {\n if (this.i.terminate)\n chunk = slc(chunk, 0);\n this.i.push(chunk, final);\n };\n AsyncUnzipInflate.compression = 8;\n return AsyncUnzipInflate;\n}());\nexport { AsyncUnzipInflate };\n/**\n * A ZIP archive decompression stream that emits files as they are discovered\n */\nvar Unzip = /*#__PURE__*/ (function () {\n /**\n * Creates a ZIP decompression stream\n * @param cb The callback to call whenever a file in the ZIP archive is found\n */\n function Unzip(cb) {\n this.onfile = cb;\n this.k = [];\n this.o = {\n 0: UnzipPassThrough\n };\n this.p = et;\n }\n /**\n * Pushes a chunk to be unzipped\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Unzip.prototype.push = function (chunk, final) {\n var _this = this;\n if (!this.onfile)\n err(5);\n if (!this.p)\n err(4);\n if (this.c > 0) {\n var len = Math.min(this.c, chunk.length);\n var toAdd = chunk.subarray(0, len);\n this.c -= len;\n if (this.d)\n this.d.push(toAdd, !this.c);\n else\n this.k[0].push(toAdd);\n chunk = chunk.subarray(len);\n if (chunk.length)\n return this.push(chunk, final);\n }\n else {\n var f = 0, i = 0, is = void 0, buf = void 0;\n if (!this.p.length)\n buf = chunk;\n else if (!chunk.length)\n buf = this.p;\n else {\n buf = new u8(this.p.length + chunk.length);\n buf.set(this.p), buf.set(chunk, this.p.length);\n }\n var l = buf.length, oc = this.c, add = oc && this.d;\n var _loop_2 = function () {\n var sig = b4(buf, i);\n if (sig == 0x4034B50) {\n f = 1, is = i;\n this_1.d = null;\n this_1.c = 0;\n var bf = b2(buf, i + 6), cmp_1 = b2(buf, i + 8), u = bf & 2048, dd = bf & 8, fnl = b2(buf, i + 26), es = b2(buf, i + 28);\n if (l > i + 30 + fnl + es) {\n var chks_3 = [];\n this_1.k.unshift(chks_3);\n f = 2;\n var lsc = b4(buf, i + 18), lsu = b4(buf, i + 22);\n var fn_1 = strFromU8(buf.subarray(i + 30, i += 30 + fnl), !u);\n var _a = z64hs(buf, i, es, 2, lsc, lsu, 0), sc_1 = _a[0], su_1 = _a[1], z64 = _a[3];\n if (dd)\n sc_1 = -1 - z64;\n i += es;\n this_1.c = sc_1;\n var d_1;\n var file_1 = {\n name: fn_1,\n compression: cmp_1,\n start: function () {\n if (!file_1.ondata)\n err(5);\n if (!sc_1)\n file_1.ondata(null, et, true);\n else {\n var ctr = _this.o[cmp_1];\n if (!ctr)\n file_1.ondata(err(14, 'unknown compression type ' + cmp_1, 1), null, false);\n d_1 = sc_1 < 0 ? new ctr(fn_1) : new ctr(fn_1, sc_1, su_1);\n d_1.ondata = function (err, dat, final) { file_1.ondata(err, dat, final); };\n for (var _i = 0, chks_4 = chks_3; _i < chks_4.length; _i++) {\n var dat = chks_4[_i];\n d_1.push(dat, false);\n }\n if (_this.k[0] == chks_3 && _this.c)\n _this.d = d_1;\n else\n d_1.push(et, true);\n }\n },\n terminate: function () {\n if (d_1 && d_1.terminate)\n d_1.terminate();\n }\n };\n if (sc_1 >= 0)\n file_1.size = sc_1, file_1.originalSize = su_1;\n this_1.onfile(file_1);\n }\n return \"break\";\n }\n else if (oc) {\n if (sig == 0x8074B50) {\n is = i += 12 + (oc == -2 && 8), f = 3, this_1.c = 0;\n return \"break\";\n }\n else if (sig == 0x2014B50) {\n is = i -= 4, f = 3, this_1.c = 0;\n return \"break\";\n }\n }\n };\n var this_1 = this;\n for (; i < l - 4; ++i) {\n var state_1 = _loop_2();\n if (state_1 === \"break\")\n break;\n }\n this.p = et;\n if (oc < 0) {\n var dat = f ? buf.subarray(0, is - 12 - (oc == -2 && 8) - (b4(buf, is - 16) == 0x8074B50 && 4)) : buf.subarray(0, i);\n if (add)\n add.push(dat, !!f);\n else\n this.k[+(f == 2)].push(dat);\n }\n if (f & 2)\n return this.push(buf.subarray(i), final);\n this.p = buf.subarray(i);\n }\n if (final) {\n if (this.c)\n err(13);\n this.p = null;\n }\n };\n /**\n * Registers a decoder with the stream, allowing for files compressed with\n * the compression type provided to be expanded correctly\n * @param decoder The decoder constructor\n */\n Unzip.prototype.register = function (decoder) {\n this.o[decoder.compression] = decoder;\n };\n return Unzip;\n}());\nexport { Unzip };\nvar mt = typeof queueMicrotask == 'function' ? queueMicrotask : typeof setTimeout == 'function' ? setTimeout : function (fn) { fn(); };\nexport function unzip(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n var term = [];\n var tAll = function () {\n for (var i = 0; i < term.length; ++i)\n term[i]();\n };\n var files = {};\n var cbd = function (a, b) {\n mt(function () { cb(a, b); });\n };\n mt(function () { cbd = cb; });\n var e = data.length - 22;\n for (; b4(data, e) != 0x6054B50; --e) {\n if (!e || data.length - e > 65558) {\n cbd(err(13, 0, 1), null);\n return tAll;\n }\n }\n ;\n var lft = b2(data, e + 8);\n if (lft) {\n var c = lft;\n var o = b4(data, e + 16);\n var z = b4(data, e - 20) == 0x7064B50;\n if (z) {\n var ze = b4(data, e - 12);\n z = b4(data, ze) == 0x6064B50;\n if (z) {\n c = lft = b4(data, ze + 32);\n o = b4(data, ze + 48);\n }\n }\n var fltr = opts && opts.filter;\n var _loop_3 = function (i) {\n var _a = zh(data, o, z), c_1 = _a[0], sc = _a[1], su = _a[2], fn = _a[3], no = _a[4], off = _a[5], b = slzh(data, off);\n o = no;\n var cbl = function (e, d) {\n if (e) {\n tAll();\n cbd(e, null);\n }\n else {\n if (d)\n files[fn] = d;\n if (!--lft)\n cbd(null, files);\n }\n };\n if (!fltr || fltr({\n name: fn,\n size: sc,\n originalSize: su,\n compression: c_1\n })) {\n if (!c_1)\n cbl(null, slc(data, b, b + sc));\n else if (c_1 == 8) {\n var infl = data.subarray(b, b + sc);\n // Synchronously decompress under 512KB, or barely-compressed data\n if (su < 524288 || sc > 0.8 * su) {\n try {\n cbl(null, inflateSync(infl, { out: new u8(su) }));\n }\n catch (e) {\n cbl(e, null);\n }\n }\n else\n term.push(inflate(infl, { size: su }, cbl));\n }\n else\n cbl(err(14, 'unknown compression type ' + c_1, 1), null);\n }\n else\n cbl(null, null);\n };\n for (var i = 0; i < c; ++i) {\n _loop_3(i);\n }\n }\n else\n cbd(null, {});\n return tAll;\n}\n/**\n * Synchronously decompresses a ZIP archive. Prefer using `unzip` for better\n * performance with more than one file.\n * @param data The raw compressed ZIP file\n * @param opts The ZIP extraction options\n * @returns The decompressed files\n */\nexport function unzipSync(data, opts) {\n var files = {};\n var e = data.length - 22;\n for (; b4(data, e) != 0x6054B50; --e) {\n if (!e || data.length - e > 65558)\n err(13);\n }\n ;\n var c = b2(data, e + 8);\n if (!c)\n return {};\n var o = b4(data, e + 16);\n var z = b4(data, e - 20) == 0x7064B50;\n if (z) {\n var ze = b4(data, e - 12);\n z = b4(data, ze) == 0x6064B50;\n if (z) {\n c = b4(data, ze + 32);\n o = b4(data, ze + 48);\n }\n }\n var fltr = opts && opts.filter;\n for (var i = 0; i < c; ++i) {\n var _a = zh(data, o, z), c_2 = _a[0], sc = _a[1], su = _a[2], fn = _a[3], no = _a[4], off = _a[5], b = slzh(data, off);\n o = no;\n if (!fltr || fltr({\n name: fn,\n size: sc,\n originalSize: su,\n compression: c_2\n })) {\n if (!c_2)\n files[fn] = slc(data, b, b + sc);\n else if (c_2 == 8)\n files[fn] = inflateSync(data.subarray(b, b + sc), { out: new u8(su) });\n else\n err(14, 'unknown compression type ' + c_2);\n }\n }\n return files;\n}\n","export type BuiltinChartColorTransform = {\n type: \"tint\" | \"shade\";\n value: number;\n};\n\nexport type BuiltinChartColor = {\n themeIndex: number;\n transforms: BuiltinChartColorTransform[];\n};\n\nexport type BuiltinChartSurfaceStyle = {\n floor: { fill: BuiltinChartColor | null; line: BuiltinChartColor | null };\n wall: { fill: BuiltinChartColor | null; line: BuiltinChartColor | null };\n majorGridline: BuiltinChartColor;\n minorGridline: BuiltinChartColor;\n};\n\nfunction decodeSrgb(channel: number) {\n return channel <= 0.04045 ? channel / 12.92 : ((channel + 0.055) / 1.055) ** 2.4;\n}\n\nfunction encodeSrgb(channel: number) {\n return channel <= 0.0031308 ? channel * 12.92 : 1.055 * channel ** (1 / 2.4) - 0.055;\n}\n\nfunction quantizeLinear(channel: number) {\n return Math.round(channel * 100000) / 100000;\n}\n\n/** DrawingML tint and shade operate on linear RGB and retain the given fraction. */\nexport function resolveBuiltinChartColor(\n color: BuiltinChartColor | null | undefined,\n colorsByIndex: Readonly<Record<number, string | null | undefined>>\n): string | undefined {\n if (!color) return undefined;\n const hex = colorsByIndex[color.themeIndex]?.replace(/^#/, \"\");\n if (!hex || !/^[\\da-f]{6}$/i.test(hex)) return undefined;\n if (color.transforms.length === 0) return `#${hex.toLowerCase()}`;\n\n const channels = [0, 2, 4].map((offset) => Math.fround(quantizeLinear(decodeSrgb(Number.parseInt(hex.slice(offset, offset + 2), 16) / 255))));\n for (const transform of color.transforms) {\n const amount = Math.fround(Math.max(0, Math.min(1, transform.value)));\n for (let index = 0; index < channels.length; index += 1) {\n const channel = channels[index]!;\n channels[index] = transform.type === \"tint\"\n ? Math.fround(Math.fround(1 - amount) + Math.fround(amount * channel))\n : Math.fround(amount * channel);\n }\n }\n return `#${channels.map((channel) => Math.round(encodeSrgb(quantizeLinear(channel)) * 255).toString(16).padStart(2, \"0\")).join(\"\")}`;\n}\n\nconst GRAYSCALE_TINTS = [88, 55, 78, 92, 70, 30];\nconst DARK_GRAYSCALE_TINTS = [5, 55, 78, 15, 70, 30];\n\nfunction normalizeClassicStyle(styleId: number | undefined) {\n if (styleId === undefined || !Number.isInteger(styleId)) return undefined;\n if (styleId >= 1 && styleId <= 48) return styleId;\n if (styleId >= 101 && styleId <= 148) return styleId - 100;\n return undefined;\n}\n\nfunction themeColor(themeIndex: number, tint?: number): BuiltinChartColor {\n return {\n themeIndex,\n transforms: tint === undefined ? [] : [{ type: \"tint\", value: tint / 100 }]\n };\n}\n\nfunction appendBrightness(color: BuiltinChartColor, percent: number) {\n if (percent > 0) color.transforms.push({ type: \"tint\", value: (100 - percent) / 100 });\n if (percent < 0) color.transforms.push({ type: \"shade\", value: (100 + percent) / 100 });\n return color;\n}\n\n/** Returns defaults only; explicit colors and custom color styles take precedence. */\nexport function getBuiltinChartColor(\n styleId: number | undefined,\n index: number,\n count: number\n): BuiltinChartColor | undefined {\n const style = normalizeClassicStyle(styleId);\n if (style === undefined || !Number.isInteger(index) || index < 0 || !Number.isInteger(count) || count < 1) {\n return undefined;\n }\n\n const palette = style === 41 ? 9 : ((style - 1) % 8) + 1;\n const monochrome = palette >= 3 && palette <= 8;\n const color = monochrome\n ? themeColor(palette + 1)\n : palette === 2\n ? themeColor(4 + (index % 6))\n : themeColor(1, (palette === 9 ? DARK_GRAYSCALE_TINTS : GRAYSCALE_TINTS)[index % 6]);\n\n const numerator = 140 * (monochrome ? index + 1 : Math.floor(index / 6) + 1);\n const denominator = monochrome ? count + 1 : Math.floor(count / 6) + 2;\n const brightness = (Math.trunc(Math.fround(Math.fround(numerator) / Math.fround(denominator))) - 70) % 100;\n return appendBrightness(color, brightness);\n}\n\nexport function getBuiltinChartSurfaceStyle(styleId: number | undefined): BuiltinChartSurfaceStyle | undefined {\n const style = normalizeClassicStyle(styleId);\n if (style === undefined) return undefined;\n\n let fill: BuiltinChartColor | null = null;\n if (style === 33 || style === 34) fill = themeColor(1, 20);\n if (style >= 35 && style <= 40) fill = themeColor(style - 31, (styleId ?? 0) >= 100 ? 20 : undefined);\n if (style >= 41) fill = themeColor(1, 95);\n\n return {\n floor: { fill, line: style <= 40 ? themeColor(1, 75) : null },\n wall: { fill, line: null },\n majorGridline: themeColor(1, (styleId ?? 0) >= 100 ? 75 : undefined),\n minorGridline: themeColor(1, style >= 41 ? 90 : 50)\n };\n}\n\nexport function getBuiltinChartSurfaceLine(\n styleId: number | undefined,\n index: number,\n count: number\n): BuiltinChartColor | undefined {\n const style = normalizeClassicStyle(styleId);\n if (style === undefined || !Number.isInteger(index) || index < 0 || !Number.isInteger(count) || count < 1) {\n return undefined;\n }\n if (style >= 9 && style <= 16) return themeColor(2);\n if (styleId === 133) return themeColor(1, 92);\n if (style === 33 || (style >= 35 && style <= 40)) {\n return {\n themeIndex: style === 33 ? 1 : style - 31,\n transforms: [{ type: \"shade\", value: 0.5 }]\n };\n }\n return undefined;\n}\n","import { getBuiltinChartColor, getBuiltinChartSurfaceStyle, resolveBuiltinChartColor } from \"./builtin-chart-styles\";\nimport type { Workbook } from \"@dukelib/sheets-wasm\";\nimport { strFromU8, strToU8 } from \"fflate\";\nimport type { WorkbookImageAssets, WorkbookImageSheetOrigin } from \"./images\";\nimport type {\n XlsxChart,\n XlsxChartAxis,\n XlsxChartDataLabels,\n XlsxChartLegend,\n XlsxChartPointDataLabel,\n XlsxChartPointStyle,\n XlsxChartReference,\n XlsxChartSeries,\n XlsxChartTypeGroup,\n XlsxChartWall,\n XlsxChartsheet,\n XlsxImageAnchor,\n XlsxThemePalette,\n XlsxWorkbookTab\n} from \"./types\";\n\nconst CHART_NS = \"http://schemas.openxmlformats.org/drawingml/2006/chart\";\nconst DRAWINGML_NS = \"http://schemas.openxmlformats.org/drawingml/2006/main\";\nconst DRAWING_SPREADSHEET_NS = \"http://schemas.openxmlformats.org/drawingml/2006/spreadsheetDrawing\";\nconst PKG_REL_NS = \"http://schemas.openxmlformats.org/package/2006/relationships\";\nconst CHART_REL_TYPE = \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/chart\";\nconst CHART_EX_REL_TYPE = \"http://schemas.microsoft.com/office/2014/relationships/chartEx\";\nconst CHART_STYLE_REL_TYPE = \"http://schemas.microsoft.com/office/2011/relationships/chartStyle\";\nconst CHART_COLOR_STYLE_REL_TYPE = \"http://schemas.microsoft.com/office/2011/relationships/chartColorStyle\";\nconst SERIES_COLORS = [\n \"#4472c4\",\n \"#ed7d31\",\n \"#a5a5a5\",\n \"#ffc000\",\n \"#5b9bd5\",\n \"#70ad47\",\n \"#264478\",\n \"#9e480e\",\n \"#636363\",\n \"#997300\"\n];\n\nexport type ParsedChartSeriesFormula = {\n bubbleSizeFormula?: string;\n categoryFormula: string;\n nameFormula?: string;\n nameLiteral?: string;\n order: number;\n valueFormula: string;\n};\n\nfunction quoteSeriesFormulaString(value: string) {\n return `\"${value.replace(/\"/g, \"\\\"\\\"\")}\"`;\n}\n\nfunction unquoteSeriesFormulaString(value: string) {\n const trimmed = value.trim();\n if (trimmed.length < 2 || !trimmed.startsWith(\"\\\"\") || !trimmed.endsWith(\"\\\"\")) {\n return null;\n }\n\n return trimmed.slice(1, -1).replace(/\"\"/g, \"\\\"\");\n}\n\nfunction splitTopLevelSeriesArguments(value: string) {\n const args: string[] = [];\n let current = \"\";\n let doubleQuoted = false;\n let singleQuoted = false;\n let depth = 0;\n\n for (let index = 0; index < value.length; index += 1) {\n const char = value[index] ?? \"\";\n const next = value[index + 1] ?? \"\";\n\n if (doubleQuoted) {\n current += char;\n if (char === \"\\\"\" && next === \"\\\"\") {\n current += next;\n index += 1;\n } else if (char === \"\\\"\") {\n doubleQuoted = false;\n }\n continue;\n }\n\n if (singleQuoted) {\n current += char;\n if (char === \"'\" && next === \"'\") {\n current += next;\n index += 1;\n } else if (char === \"'\") {\n singleQuoted = false;\n }\n continue;\n }\n\n if (char === \"\\\"\") {\n doubleQuoted = true;\n current += char;\n continue;\n }\n\n if (char === \"'\") {\n singleQuoted = true;\n current += char;\n continue;\n }\n\n if (char === \"(\") {\n depth += 1;\n current += char;\n continue;\n }\n\n if (char === \")\") {\n depth = Math.max(0, depth - 1);\n current += char;\n continue;\n }\n\n if (char === \",\" && depth === 0) {\n args.push(current.trim());\n current = \"\";\n continue;\n }\n\n current += char;\n }\n\n args.push(current.trim());\n return args;\n}\n\nfunction readSeriesNameFormula(series: XlsxChartSeries) {\n const raw = series.raw && typeof series.raw === \"object\" ? series.raw as Record<string, unknown> : null;\n return typeof raw?.name === \"string\" && raw.name.length > 0 ? raw.name : null;\n}\n\nexport function buildChartSeriesFormula(chart: XlsxChart | null | undefined, seriesIndex: number) {\n const series = chart?.series[seriesIndex];\n if (!chart || !series) {\n return \"\";\n }\n\n const nameFormula = readSeriesNameFormula(series);\n const nameArgument = nameFormula ?? quoteSeriesFormulaString(series.name ?? `Series ${seriesIndex + 1}`);\n const categoryArgument = series.categoriesRef?.formula ?? \"\";\n const valueArgument = series.valuesRef?.formula ?? \"\";\n const orderArgument = String(seriesIndex + 1);\n const bubbleArgument = series.bubbleSizeRef?.formula;\n\n return [\n `=SERIES(${nameArgument}`,\n categoryArgument,\n valueArgument,\n orderArgument,\n ...(chart.chartType === \"Bubble\" || bubbleArgument ? [bubbleArgument ?? \"\"] : [])\n ].join(\",\") + \")\";\n}\n\nexport function parseChartSeriesFormula(formula: string, chart: XlsxChart | null | undefined): ParsedChartSeriesFormula | null {\n const trimmed = formula.trim();\n const withoutEquals = trimmed.startsWith(\"=\") ? trimmed.slice(1).trim() : trimmed;\n const match = /^SERIES\\s*\\(([\\s\\S]*)\\)$/i.exec(withoutEquals);\n if (!match) {\n return null;\n }\n\n const args = splitTopLevelSeriesArguments(match[1]);\n const isBubble = chart?.chartType === \"Bubble\";\n if (args.length < 4 || args.length > 5 || (isBubble && args.length !== 5)) {\n return null;\n }\n\n const [nameArg = \"\", categoryFormula = \"\", valueFormula = \"\", orderArg = \"\", bubbleSizeFormula] = args;\n if (!categoryFormula || !valueFormula) {\n return null;\n }\n\n const parsedOrder = Number(orderArg);\n if (!Number.isFinite(parsedOrder)) {\n return null;\n }\n\n const nameLiteral = unquoteSeriesFormulaString(nameArg);\n return {\n bubbleSizeFormula: bubbleSizeFormula && bubbleSizeFormula.length > 0 ? bubbleSizeFormula : undefined,\n categoryFormula,\n nameFormula: nameLiteral == null && nameArg.length > 0 ? nameArg : undefined,\n nameLiteral: nameLiteral ?? undefined,\n order: parsedOrder,\n valueFormula\n };\n}\n\nexport function applyChartSeriesFormula(\n chart: XlsxChart,\n seriesIndex: number,\n formula: string,\n workbook: Workbook | null\n) {\n const parsed = parseChartSeriesFormula(formula, chart);\n const currentSeries = chart.series[seriesIndex];\n if (!parsed || !currentSeries) {\n return null;\n }\n\n const categoriesRef: XlsxChartReference = {\n ...(currentSeries.categoriesRef ?? {}),\n formula: parsed.categoryFormula\n };\n const valuesRef: XlsxChartReference = {\n ...(currentSeries.valuesRef ?? {}),\n formula: parsed.valueFormula\n };\n const bubbleSizeRef: XlsxChartReference | null = chart.chartType === \"Bubble\" || parsed.bubbleSizeFormula\n ? {\n ...(currentSeries.bubbleSizeRef ?? {}),\n formula: parsed.bubbleSizeFormula\n }\n : currentSeries.bubbleSizeRef ?? null;\n const raw = {\n ...(currentSeries.raw ?? {})\n };\n if (parsed.nameFormula) {\n raw.name = parsed.nameFormula;\n } else {\n delete raw.name;\n }\n\n const nextSeries: XlsxChartSeries = {\n ...currentSeries,\n bubbleSizeRef,\n bubbleSizes: workbook && bubbleSizeRef?.formula\n ? resolveReferenceValues(workbook, chart.workbookSheetIndex, bubbleSizeRef, \"value\").map((value) => (\n typeof value === \"number\" && Number.isFinite(value) ? value : null\n ))\n : currentSeries.bubbleSizes,\n categories: workbook\n ? resolveReferenceValues(workbook, chart.workbookSheetIndex, categoriesRef, \"category\")\n : currentSeries.categories,\n categoriesRef,\n name: parsed.nameLiteral ?? (\n parsed.nameFormula && workbook\n ? resolveSeriesName(workbook, chart.workbookSheetIndex, parsed.nameFormula)\n : parsed.nameFormula ?? currentSeries.name\n ),\n raw,\n values: workbook\n ? resolveReferenceValues(workbook, chart.workbookSheetIndex, valuesRef, \"value\").map((value) => (\n typeof value === \"number\" && Number.isFinite(value) ? value : null\n ))\n : currentSeries.values,\n valuesRef\n };\n\n return {\n ...chart,\n series: chart.series.map((series, index) => index === seriesIndex ? nextSeries : series)\n };\n}\n\nfunction normalizeWorksheetVisibility(value: unknown): \"hidden\" | \"veryHidden\" | \"visible\" {\n return value === \"hidden\" || value === \"veryHidden\" ? value : \"visible\";\n}\nconst EMU_PER_PIXEL = 9525;\nconst THEME_COLOR_INDEX_BY_NAME: Record<string, number> = {\n accent1: 4,\n accent2: 5,\n accent3: 6,\n accent4: 7,\n accent5: 8,\n accent6: 9,\n dk1: 1,\n dk2: 3,\n folHlink: 11,\n hlink: 10,\n lt1: 0,\n lt2: 2,\n tx1: 1,\n tx2: 3,\n bg1: 0,\n bg2: 2\n};\nconst PRIMARY_CHART_TYPE_LOCAL_NAMES = [\n \"barChart\",\n \"lineChart\",\n \"line3DChart\",\n \"stockChart\",\n \"radarChart\",\n \"scatterChart\",\n \"pieChart\",\n \"pie3DChart\",\n \"doughnutChart\",\n \"areaChart\",\n \"area3DChart\",\n \"bar3DChart\",\n \"ofPieChart\",\n \"bubbleChart\",\n \"surfaceChart\",\n \"surface3DChart\"\n] as const;\n\nexport type WorkbookChartOrigin = {\n anchorIndex: number;\n anchor: XlsxImageAnchor | null;\n chartPath: string | null;\n chartKind: \"classic\" | \"modern\";\n drawingPath: string;\n workbookSheetIndex: number;\n};\n\nexport type WorkbookChartAssets = {\n chartOriginsById: Map<string, WorkbookChartOrigin>;\n chartsByWorkbookSheetIndex: XlsxChart[][];\n chartsheets: XlsxChartsheet[];\n tabs: XlsxWorkbookTab[];\n};\n\ntype ChartStyleAppearance = {\n axisLabelColor?: string;\n axisLineColor?: string;\n chartAreaBorderColor?: string;\n chartAreaFillColor?: string;\n chartAreaNoFill?: boolean;\n paletteOffset?: number;\n textColor?: string;\n titleColor?: string;\n};\n\nfunction clampUnitInterval(value: number) {\n return Math.max(0, Math.min(1, value));\n}\n\nfunction isElementNode(node: Node | ChildNode | null | undefined): node is Element {\n return node != null && node.nodeType === 1;\n}\n\nfunction normalizeHexColor(value: string) {\n const hex = value.replace(/^#/, \"\");\n if (hex.length === 8) {\n return `#${hex.slice(2).toLowerCase()}`;\n }\n if (hex.length === 6) {\n return `#${hex.toLowerCase()}`;\n }\n return null;\n}\n\nfunction resolveColorFromXmlFragment(fragment: string, themePalette?: XlsxThemePalette | null) {\n if (!fragment) {\n return undefined;\n }\n\n const srgbMatch = fragment.match(/<a:srgbClr\\b[^>]*\\bval=\"([0-9a-fA-F]{6,8})\"/i);\n if (srgbMatch?.[1]) {\n return normalizeHexColor(srgbMatch[1]) ?? undefined;\n }\n\n const schemeMatch = fragment.match(/<a:schemeClr\\b[^>]*\\bval=\"([^\"]+)\"[^>]*>([\\s\\S]*?)<\\/a:schemeClr>/i)\n ?? fragment.match(/<a:schemeClr\\b[^>]*\\bval=\"([^\"]+)\"[^>]*/i);\n if (!schemeMatch?.[1]) {\n return undefined;\n }\n\n const baseColor = resolveThemeColor(schemeMatch[1], themePalette);\n if (!baseColor) {\n return undefined;\n }\n\n const transforms = schemeMatch[2] ?? \"\";\n let lightnessModifier = 1;\n let lightnessOffset = 0;\n for (const match of transforms.matchAll(/<a:(lumMod|lumOff|tint|shade)\\b[^>]*\\bval=\"(-?\\d+(?:\\.\\d+)?)\"/gi)) {\n const transform = match[1]?.toLowerCase();\n const rawValue = Number(match[2] ?? Number.NaN);\n if (!transform || !Number.isFinite(rawValue)) {\n continue;\n }\n if (transform === \"lummod\") {\n lightnessModifier *= rawValue / 100000;\n } else if (transform === \"lumoff\") {\n lightnessOffset += rawValue / 100000;\n } else if (transform === \"tint\") {\n lightnessOffset += (1 - lightnessOffset) * (rawValue / 100000);\n } else if (transform === \"shade\") {\n lightnessModifier *= rawValue / 100000;\n }\n }\n\n return applyLightnessTransform(baseColor, lightnessModifier, lightnessOffset) ?? undefined;\n}\n\nfunction readHexColorFromXmlFragment(\n fragment: string,\n preferLine = false,\n themePalette?: XlsxThemePalette | null\n) {\n const source = preferLine\n ? fragment.match(/<a:ln\\b[\\s\\S]*?<\\/a:ln>/i)?.[0] ?? \"\"\n : fragment.match(/<a:solidFill\\b[\\s\\S]*?<\\/a:solidFill>/i)?.[0] ?? \"\";\n return resolveColorFromXmlFragment(source, themePalette);\n}\n\ntype FallbackSeriesStyle = {\n color?: string;\n lineColor?: string;\n};\n\nfunction parseFallbackSeriesStylesFromChartXml(\n chartXml: string,\n themePalette?: XlsxThemePalette | null\n): FallbackSeriesStyle[] {\n const seriesBlocks = chartXml.match(/<c:ser\\b[\\s\\S]*?<\\/c:ser>/gi) ?? [];\n if (seriesBlocks.length === 0) {\n return [];\n }\n\n return seriesBlocks.map((seriesBlock) => {\n const shapeBlock = seriesBlock.match(/<c:spPr\\b[\\s\\S]*?<\\/c:spPr>/i)?.[0] ?? \"\";\n return {\n color: readHexColorFromXmlFragment(shapeBlock, false, themePalette),\n lineColor: readHexColorFromXmlFragment(shapeBlock, true, themePalette)\n };\n });\n}\n\nfunction parseFallbackPointStylesFromChartXml(\n chartXml: string,\n themePalette?: XlsxThemePalette | null\n): XlsxChartPointStyle[][] {\n const chartDocument = parseXml(chartXml);\n if (chartDocument) {\n const parsedSeriesStyles = getLocalDescendants(chartDocument, \"ser\").map((seriesNode) => {\n const styles: XlsxChartPointStyle[] = [];\n for (const dataPointNode of getLocalChildren(seriesNode, \"dPt\")) {\n const indexValue = readChartNumericAttribute(dataPointNode, \"idx\");\n if (indexValue === undefined) {\n continue;\n }\n const shapeProperties = getFirstLocalChild(dataPointNode, \"spPr\");\n const lineStyle = resolveChartLineStyle(shapeProperties, themePalette);\n styles.push({\n color: resolveChartFillColor(shapeProperties, themePalette) ?? undefined,\n explosion: readChartNumericAttribute(dataPointNode, \"explosion\"),\n index: indexValue,\n lineColor: lineStyle.color ?? undefined\n });\n }\n return styles;\n });\n if (parsedSeriesStyles.some((styles) => styles.length > 0)) {\n return parsedSeriesStyles;\n }\n }\n\n const seriesBlocks = chartXml.match(/<c:ser\\b[\\s\\S]*?<\\/c:ser>/gi) ?? [];\n if (seriesBlocks.length === 0) {\n return [];\n }\n\n return seriesBlocks.map((seriesBlock) => {\n const pointBlocks = seriesBlock.match(/<c:dPt\\b[\\s\\S]*?<\\/c:dPt>/gi) ?? [];\n if (pointBlocks.length === 0) {\n return [];\n }\n\n const styles: XlsxChartPointStyle[] = [];\n for (const pointBlock of pointBlocks) {\n const indexMatch = pointBlock.match(/<c:idx\\b[^>]*\\bval=\"(-?\\d+)\"/i);\n const index = indexMatch?.[1] ? Number(indexMatch[1]) : Number.NaN;\n if (!Number.isFinite(index)) {\n continue;\n }\n const explosionMatch = pointBlock.match(/<c:explosion\\b[^>]*\\bval=\"(-?\\d+(?:\\.\\d+)?)\"/i);\n const explosionValue = explosionMatch?.[1] ? Number(explosionMatch[1]) : Number.NaN;\n styles.push({\n color: readHexColorFromXmlFragment(pointBlock, false, themePalette),\n explosion: Number.isFinite(explosionValue) ? explosionValue : undefined,\n index,\n lineColor: readHexColorFromXmlFragment(pointBlock, true, themePalette)\n });\n }\n\n return styles;\n });\n}\n\nfunction parseNumericPointCacheFromXmlFragment(fragment: string) {\n const pointMatches = Array.from(fragment.matchAll(/<c:pt\\b[^>]*\\bidx=\"(-?\\d+)\"[^>]*>[\\s\\S]*?<c:v>([^<]*)<\\/c:v>[\\s\\S]*?<\\/c:pt>/gi));\n if (pointMatches.length === 0) {\n return [];\n }\n\n const explicitPointCountMatch = fragment.match(/<c:ptCount\\b[^>]*\\bval=\"(\\d+)\"/i);\n const explicitPointCount = explicitPointCountMatch?.[1] ? Number(explicitPointCountMatch[1]) : Number.NaN;\n const maxIndex = pointMatches.reduce((max, match) => {\n const current = Number(match[1] ?? Number.NaN);\n return Number.isFinite(current) ? Math.max(max, current) : max;\n }, -1);\n const pointCount = Math.max(\n pointMatches.length,\n Number.isFinite(explicitPointCount) ? explicitPointCount : 0,\n maxIndex + 1\n );\n const values = Array.from({ length: pointCount }, () => null as number | null);\n\n for (const match of pointMatches) {\n const index = Number(match[1] ?? Number.NaN);\n const rawValue = (match[2] ?? \"\").trim();\n const numericValue = Number(rawValue);\n if (!Number.isFinite(index) || index < 0 || !Number.isFinite(numericValue)) {\n continue;\n }\n values[index] = numericValue;\n }\n\n return values;\n}\n\nfunction parseFallbackBubbleSizesFromChartXml(chartXml: string): Array<Array<number | null>> {\n const seriesBlocks = chartXml.match(/<c:ser\\b[\\s\\S]*?<\\/c:ser>/gi) ?? [];\n if (seriesBlocks.length === 0) {\n return [];\n }\n\n return seriesBlocks.map((seriesBlock) => {\n const bubbleSizeBlock = seriesBlock.match(/<c:bubbleSize\\b[\\s\\S]*?<\\/c:bubbleSize>/i)?.[0] ?? \"\";\n if (!bubbleSizeBlock) {\n return [];\n }\n\n return parseNumericPointCacheFromXmlFragment(bubbleSizeBlock);\n });\n}\n\nfunction findPrimaryChartTypeNode(plotAreaNode: Element | null) {\n if (!plotAreaNode) {\n return null;\n }\n\n for (const localName of PRIMARY_CHART_TYPE_LOCAL_NAMES) {\n const node = getLocalChildren(plotAreaNode, localName)[0];\n if (node) {\n return node;\n }\n }\n\n return null;\n}\n\nfunction resolveScatterChartType(scatterStyle: string | null | undefined) {\n switch (scatterStyle) {\n case \"line\":\n case \"lineMarker\":\n return \"ScatterLines\";\n case \"smooth\":\n case \"smoothMarker\":\n return \"ScatterSmooth\";\n default:\n return \"Scatter\";\n }\n}\n\nfunction parseHexColor(color: string): [number, number, number] | null {\n const normalized = normalizeHexColor(color);\n if (!normalized) {\n return null;\n }\n const match = /^#([0-9a-f]{6})$/.exec(normalized);\n if (!match) {\n return null;\n }\n return [\n Number.parseInt(match[1].slice(0, 2), 16),\n Number.parseInt(match[1].slice(2, 4), 16),\n Number.parseInt(match[1].slice(4, 6), 16)\n ];\n}\n\nfunction rgbToHsl(red: number, green: number, blue: number): [number, number, number] {\n const normalizedRed = red / 255;\n const normalizedGreen = green / 255;\n const normalizedBlue = blue / 255;\n const max = Math.max(normalizedRed, normalizedGreen, normalizedBlue);\n const min = Math.min(normalizedRed, normalizedGreen, normalizedBlue);\n const lightness = (max + min) / 2;\n\n if (max === min) {\n return [0, 0, lightness];\n }\n\n const delta = max - min;\n const saturation = lightness > 0.5 ? delta / (2 - max - min) : delta / (max + min);\n let hue = 0;\n\n switch (max) {\n case normalizedRed:\n hue = (normalizedGreen - normalizedBlue) / delta + (normalizedGreen < normalizedBlue ? 6 : 0);\n break;\n case normalizedGreen:\n hue = (normalizedBlue - normalizedRed) / delta + 2;\n break;\n default:\n hue = (normalizedRed - normalizedGreen) / delta + 4;\n break;\n }\n\n return [hue / 6, saturation, lightness];\n}\n\nfunction hueToRgb(p: number, q: number, t: number) {\n let nextT = t;\n if (nextT < 0) {\n nextT += 1;\n }\n if (nextT > 1) {\n nextT -= 1;\n }\n if (nextT < 1 / 6) {\n return p + (q - p) * 6 * nextT;\n }\n if (nextT < 1 / 2) {\n return q;\n }\n if (nextT < 2 / 3) {\n return p + (q - p) * (2 / 3 - nextT) * 6;\n }\n return p;\n}\n\nfunction hslToRgb(hue: number, saturation: number, lightness: number): [number, number, number] {\n if (saturation === 0) {\n const gray = Math.round(lightness * 255);\n return [gray, gray, gray];\n }\n\n const q = lightness < 0.5 ? lightness * (1 + saturation) : lightness + saturation - lightness * saturation;\n const p = 2 * lightness - q;\n\n return [\n Math.round(hueToRgb(p, q, hue + 1 / 3) * 255),\n Math.round(hueToRgb(p, q, hue) * 255),\n Math.round(hueToRgb(p, q, hue - 1 / 3) * 255)\n ];\n}\n\nfunction rgbToHex(red: number, green: number, blue: number) {\n return `#${[red, green, blue]\n .map((channel) => Math.max(0, Math.min(255, Math.round(channel))).toString(16).padStart(2, \"0\"))\n .join(\"\")}`;\n}\n\nfunction applyLightnessTransform(baseColor: string, modifier = 1, offset = 0) {\n const rgb = parseHexColor(baseColor);\n if (!rgb) {\n return normalizeHexColor(baseColor);\n }\n\n const [hue, saturation, lightness] = rgbToHsl(rgb[0], rgb[1], rgb[2]);\n const nextLightness = clampUnitInterval(lightness * modifier + offset);\n const [nextRed, nextGreen, nextBlue] = hslToRgb(hue, saturation, nextLightness);\n return rgbToHex(nextRed, nextGreen, nextBlue);\n}\n\nfunction resolveThemeColor(name: string | null, themePalette?: XlsxThemePalette | null) {\n if (!name) {\n return null;\n }\n const index = THEME_COLOR_INDEX_BY_NAME[name];\n return index === undefined ? null : themePalette?.colorsByIndex[index] ?? null;\n}\n\nfunction resolveThemeTypeface(typeface: string | null, themePalette?: XlsxThemePalette | null) {\n if (!typeface) {\n return null;\n }\n if (typeface === \"+mn-lt\" || typeface === \"+mn-ea\" || typeface === \"+mn-cs\") {\n return themePalette?.minorLatinFont ?? null;\n }\n if (typeface === \"+mj-lt\" || typeface === \"+mj-ea\" || typeface === \"+mj-cs\") {\n return themePalette?.majorLatinFont ?? null;\n }\n return typeface;\n}\n\nfunction readChartTextTypeface(textPropertiesNode: Element | null, themePalette?: XlsxThemePalette | null) {\n if (!textPropertiesNode) {\n return null;\n }\n const defaultRunProperties = getFirstLocalDescendant(textPropertiesNode, \"defRPr\")\n ?? getFirstLocalDescendant(textPropertiesNode, \"rPr\");\n if (!defaultRunProperties) {\n return null;\n }\n const typeface = getFirstLocalChild(defaultRunProperties, \"latin\")?.getAttribute(\"typeface\")\n ?? getFirstLocalChild(defaultRunProperties, \"ea\")?.getAttribute(\"typeface\")\n ?? getFirstLocalChild(defaultRunProperties, \"cs\")?.getAttribute(\"typeface\")\n ?? null;\n const resolved = resolveThemeTypeface(typeface, themePalette)?.trim() ?? \"\";\n return resolved.length > 0 ? resolved : null;\n}\n\nfunction resolveChartColorNode(node: Element | null, themePalette?: XlsxThemePalette | null): string | null {\n if (!node) {\n return null;\n }\n\n let baseColor: string | null = null;\n if (node.localName === \"srgbClr\") {\n baseColor = normalizeHexColor(`#${node.getAttribute(\"val\") ?? \"\"}`);\n } else if (node.localName === \"schemeClr\") {\n baseColor = resolveThemeColor(node.getAttribute(\"val\"), themePalette);\n } else if (node.localName === \"sysClr\") {\n baseColor = normalizeHexColor(`#${node.getAttribute(\"lastClr\") ?? \"\"}`);\n }\n\n if (!baseColor) {\n return null;\n }\n\n let lightnessModifier = 1;\n let lightnessOffset = 0;\n for (const transformNode of Array.from(node.childNodes).filter(isElementNode)) {\n const rawValue = Number(transformNode.getAttribute(\"val\") ?? Number.NaN);\n if (!Number.isFinite(rawValue)) {\n continue;\n }\n if (transformNode.localName === \"lumMod\") {\n lightnessModifier *= rawValue / 100000;\n } else if (transformNode.localName === \"lumOff\") {\n lightnessOffset += rawValue / 100000;\n } else if (transformNode.localName === \"tint\") {\n lightnessOffset += (1 - lightnessOffset) * (rawValue / 100000);\n } else if (transformNode.localName === \"shade\") {\n lightnessModifier *= rawValue / 100000;\n }\n }\n\n return applyLightnessTransform(baseColor, lightnessModifier, lightnessOffset);\n}\n\nfunction isChartColorElement(node: Element | null | undefined): node is Element {\n return Boolean(node && (node.localName === \"schemeClr\" || node.localName === \"srgbClr\" || node.localName === \"sysClr\"));\n}\n\nfunction findFirstChartColorElement(node: Element | null) {\n if (!node) {\n return null;\n }\n if (isChartColorElement(node)) {\n return node;\n }\n\n for (const localName of [\"srgbClr\", \"schemeClr\", \"sysClr\"]) {\n for (const candidate of getLocalDescendants(node, localName)) {\n if (isChartColorElement(candidate)) {\n return candidate;\n }\n }\n }\n\n return null;\n}\n\nfunction resolveChartFillColor(shapeNode: Element | null, themePalette?: XlsxThemePalette | null) {\n if (!shapeNode || getFirstLocalChild(shapeNode, \"noFill\")) {\n return null;\n }\n const solidFill = getFirstLocalChild(shapeNode, \"solidFill\");\n if (solidFill) {\n const colorNode = findFirstChartColorElement(Array.from(solidFill.childNodes).find(isElementNode) ?? null);\n return resolveChartColorNode(colorNode, themePalette);\n }\n\n const gradientFill = getFirstLocalChild(shapeNode, \"gradFill\");\n const gradientStops = gradientFill\n ? getLocalDescendants(gradientFill, \"gs\")\n .map((stopNode) => ({\n colorNode: Array.from(stopNode.childNodes).find(isElementNode) ?? null,\n position: Number(stopNode.getAttribute(\"pos\") ?? Number.NaN)\n }))\n .filter((stop) => Boolean(stop.colorNode))\n : [];\n if (gradientStops.length === 0) {\n return null;\n }\n\n gradientStops.sort((left, right) => {\n const leftPos = Number.isFinite(left.position) ? left.position : 0;\n const rightPos = Number.isFinite(right.position) ? right.position : 0;\n return leftPos - rightPos;\n });\n const midpointStop = gradientStops.find((stop) => Number.isFinite(stop.position) && stop.position >= 50000)\n ?? gradientStops[Math.floor(gradientStops.length / 2)]\n ?? gradientStops[0];\n return resolveChartColorNode(midpointStop.colorNode, themePalette);\n}\n\nfunction resolveChartLineStyle(shapeNode: Element | null, themePalette?: XlsxThemePalette | null) {\n const lineNode = shapeNode?.localName === \"ln\" ? shapeNode : (shapeNode ? getFirstLocalChild(shapeNode, \"ln\") : null);\n if (!lineNode) {\n return { color: null, hidden: false, widthPx: undefined };\n }\n if (getFirstLocalChild(lineNode, \"noFill\")) {\n return { color: null, hidden: true, widthPx: undefined };\n }\n\n const solidFill = getFirstLocalChild(lineNode, \"solidFill\");\n const colorNode = solidFill ? findFirstChartColorElement(Array.from(solidFill.childNodes).find(isElementNode) ?? null) : null;\n const widthValue = Number(lineNode.getAttribute(\"w\") ?? Number.NaN);\n return {\n color: resolveChartColorNode(colorNode, themePalette),\n hidden: false,\n widthPx: Number.isFinite(widthValue) ? Math.max(1, widthValue / EMU_PER_PIXEL) : undefined\n };\n}\n\nfunction normalizeLegend(raw: unknown): XlsxChartLegend | null {\n if (!raw || typeof raw !== \"object\") {\n return null;\n }\n const legend = raw as Record<string, unknown>;\n return {\n overlay: typeof legend.overlay === \"boolean\" ? legend.overlay : undefined,\n position: typeof legend.position === \"string\" ? legend.position : undefined,\n raw: legend\n };\n}\n\nfunction normalizeLegendPosition(position: string | undefined) {\n if (!position) {\n return undefined;\n }\n switch (position) {\n case \"bottom\":\n return \"b\";\n case \"left\":\n return \"l\";\n case \"right\":\n return \"r\";\n case \"top\":\n return \"t\";\n default:\n return position;\n }\n}\n\nfunction readChartNumericAttribute(parent: Element | null, localName: string) {\n const node = parent ? getFirstLocalChild(parent, localName) : null;\n const value = Number(node?.getAttribute(\"val\") ?? Number.NaN);\n return Number.isFinite(value) ? value : undefined;\n}\n\nfunction readChartBooleanAttribute(parent: Element | null, localName: string) {\n const node = parent ? getFirstLocalChild(parent, localName) : null;\n if (!node) {\n return undefined;\n }\n const rawValue = node.getAttribute(\"val\");\n if (rawValue == null) {\n return true;\n }\n if (rawValue === \"1\" || rawValue === \"true\") {\n return true;\n }\n if (rawValue === \"0\" || rawValue === \"false\") {\n return false;\n }\n return undefined;\n}\n\nfunction readChartLabelFontSizePt(textPropertiesNode: Element | null) {\n if (!textPropertiesNode) {\n return undefined;\n }\n const runPropertiesNode = getFirstLocalDescendant(textPropertiesNode, \"defRPr\")\n ?? getFirstLocalDescendant(textPropertiesNode, \"rPr\");\n const rawSize = Number(runPropertiesNode?.getAttribute(\"sz\") ?? Number.NaN);\n if (!Number.isFinite(rawSize) || rawSize <= 0) {\n return undefined;\n }\n return rawSize / 100;\n}\n\nfunction parseChartPointDataLabelsFromXml(labelsNode: Element): XlsxChartPointDataLabel[] {\n const fallbackFontSizePt = readChartLabelFontSizePt(getFirstLocalChild(labelsNode, \"txPr\"));\n const labels: XlsxChartPointDataLabel[] = [];\n for (const pointLabelNode of getLocalChildren(labelsNode, \"dLbl\")) {\n const index = readChartNumericAttribute(pointLabelNode, \"idx\");\n if (typeof index !== \"number\" || !Number.isFinite(index)) {\n continue;\n }\n\n const layoutNode = getFirstLocalChild(pointLabelNode, \"layout\");\n const manualLayoutNode = layoutNode ? getFirstLocalChild(layoutNode, \"manualLayout\") : null;\n labels.push({\n deleted: readChartBooleanAttribute(pointLabelNode, \"delete\"),\n fontSizePt: readChartLabelFontSizePt(getFirstLocalChild(pointLabelNode, \"txPr\")) ?? fallbackFontSizePt,\n index,\n showBubbleSize: readChartBooleanAttribute(pointLabelNode, \"showBubbleSize\"),\n showCategoryName: readChartBooleanAttribute(pointLabelNode, \"showCatName\"),\n showPercent: readChartBooleanAttribute(pointLabelNode, \"showPercent\"),\n showSeriesName: readChartBooleanAttribute(pointLabelNode, \"showSerName\"),\n showValue: readChartBooleanAttribute(pointLabelNode, \"showVal\"),\n x: readChartNumericAttribute(manualLayoutNode, \"x\"),\n y: readChartNumericAttribute(manualLayoutNode, \"y\")\n });\n }\n return labels;\n}\n\nfunction parseChartDataLabelsFromXml(labelsNode: Element | null): XlsxChartDataLabels | null {\n if (!labelsNode) {\n return null;\n }\n\n const pointLabels = parseChartPointDataLabelsFromXml(labelsNode);\n const labels: XlsxChartDataLabels = {\n pointLabels: pointLabels.length > 0 ? pointLabels : undefined,\n raw: {},\n showBubbleSize: readChartBooleanAttribute(labelsNode, \"showBubbleSize\"),\n showCategoryName: readChartBooleanAttribute(labelsNode, \"showCatName\"),\n showLegendKey: readChartBooleanAttribute(labelsNode, \"showLegendKey\"),\n showPercent: readChartBooleanAttribute(labelsNode, \"showPercent\"),\n showSeriesName: readChartBooleanAttribute(labelsNode, \"showSerName\"),\n showValue: readChartBooleanAttribute(labelsNode, \"showVal\")\n };\n const hasValue = (\n labels.showBubbleSize !== undefined\n || labels.showCategoryName !== undefined\n || labels.showLegendKey !== undefined\n || labels.showPercent !== undefined\n || (labels.pointLabels?.length ?? 0) > 0\n || labels.showSeriesName !== undefined\n || labels.showValue !== undefined\n );\n return hasValue ? labels : null;\n}\n\nfunction readChartRelationships(\n archive: Record<string, Uint8Array>,\n chartPath: string\n) {\n const relsPath = normalizeArchivePath(`${dirname(chartPath)}/_rels/${chartPath.split(\"/\").pop()}.rels`);\n const relsXml = readArchiveText(archive, relsPath);\n if (!relsXml) {\n return new Map<string, string>();\n }\n\n const relsDocument = parseXml(relsXml);\n if (!relsDocument) {\n return new Map<string, string>();\n }\n\n const relationships = new Map<string, string>();\n for (const relationshipNode of getLocalDescendants(relsDocument, \"Relationship\")) {\n const type = relationshipNode.getAttribute(\"Type\");\n const target = relationshipNode.getAttribute(\"Target\");\n if (!type || !target) {\n continue;\n }\n relationships.set(type, resolveRelationshipPath(relsPath, target));\n }\n\n return relationships;\n}\n\nfunction readChartColorPalette(\n archive: Record<string, Uint8Array>,\n colorStylePath: string | null | undefined,\n themePalette?: XlsxThemePalette | null\n) {\n const colorStyleXml = readArchiveText(archive, colorStylePath);\n if (!colorStyleXml) {\n return [];\n }\n\n const colorStyleDocument = parseXml(colorStyleXml);\n if (!colorStyleDocument?.documentElement) {\n return [];\n }\n\n return Array.from(colorStyleDocument.documentElement.childNodes)\n .filter((child): child is Element => isElementNode(child) && child.localName !== \"variation\")\n .map((child) => (\n resolveChartColorNode(child, themePalette)\n ?? resolveChartColorNode(findFirstChartColorElement(child), themePalette)\n ))\n .filter((color): color is string => typeof color === \"string\");\n}\n\nfunction readChartStyleAppearance(\n archive: Record<string, Uint8Array>,\n stylePath: string | null | undefined,\n themePalette?: XlsxThemePalette | null\n): ChartStyleAppearance {\n const styleXml = readArchiveText(archive, stylePath);\n if (!styleXml) {\n return {};\n }\n\n const styleDocument = parseXml(styleXml);\n if (!styleDocument) {\n return {};\n }\n\n const dataPointNode = getFirstLocalDescendant(styleDocument, \"dataPoint\");\n const fillRefNode = dataPointNode ? getFirstLocalChild(dataPointNode, \"fillRef\") : null;\n const index = Number(fillRefNode?.getAttribute(\"idx\") ?? Number.NaN);\n const chartAreaNode = getFirstLocalDescendant(styleDocument, \"chartArea\");\n const chartAreaShapeProperties = chartAreaNode ? getFirstLocalChild(chartAreaNode, \"spPr\") : null;\n const chartAreaFontRef = chartAreaNode ? getFirstLocalChild(chartAreaNode, \"fontRef\") : null;\n const chartAreaFontColor = chartAreaFontRef\n ? resolveChartColorNode(Array.from(chartAreaFontRef.childNodes).find(isElementNode) ?? null, themePalette)\n : null;\n const titleNode = getFirstLocalDescendant(styleDocument, \"title\");\n const titleFontRef = titleNode ? getFirstLocalChild(titleNode, \"fontRef\") : null;\n const titleColor = titleFontRef\n ? resolveChartColorNode(Array.from(titleFontRef.childNodes).find(isElementNode) ?? null, themePalette)\n : null;\n const axisStyleNode = getFirstLocalDescendant(styleDocument, \"categoryAxis\")\n ?? getFirstLocalDescendant(styleDocument, \"valueAxis\");\n const axisShapeProperties = axisStyleNode ? getFirstLocalChild(axisStyleNode, \"spPr\") : null;\n const axisFontRef = axisStyleNode ? getFirstLocalChild(axisStyleNode, \"fontRef\") : null;\n const chartAreaNoFill = chartAreaShapeProperties ? getFirstLocalChild(chartAreaShapeProperties, \"noFill\") != null : false;\n\n return {\n axisLabelColor: axisFontRef\n ? resolveChartColorNode(Array.from(axisFontRef.childNodes).find(isElementNode) ?? null, themePalette) ?? undefined\n : undefined,\n axisLineColor: resolveChartLineStyle(axisShapeProperties, themePalette).color ?? undefined,\n chartAreaBorderColor: resolveChartLineStyle(chartAreaShapeProperties, themePalette).color ?? undefined,\n chartAreaFillColor: resolveChartFillColor(chartAreaShapeProperties, themePalette) ?? undefined,\n chartAreaNoFill,\n paletteOffset: Number.isFinite(index) ? index : undefined,\n textColor: chartAreaFontColor ?? undefined,\n titleColor: titleColor ?? chartAreaFontColor ?? undefined\n };\n}\n\nfunction buildThemeSeriesPalette(themePalette?: XlsxThemePalette | null) {\n const themeColors = [4, 5, 6, 7, 8, 9]\n .map((index) => themePalette?.colorsByIndex[index] ?? null)\n .filter((color): color is string => Boolean(color));\n return themeColors.length > 0 ? themeColors : SERIES_COLORS;\n}\n\nfunction applyBuiltinSurfaceDefaults(chart: XlsxChart, themePalette?: XlsxThemePalette | null) {\n if (chart.chartType !== \"Surface\") {\n return;\n }\n\n const builtin = chart.raw?.hasCustomChartColorStyle !== true ? getBuiltinChartSurfaceStyle(chart.chartStyleId) : undefined;\n const colors = themePalette?.colorsByIndex ?? {};\n const wallFill = resolveBuiltinChartColor(builtin?.wall.fill, colors) ?? (chart.wireframe ? \"#d0d0d0\" : \"#d9d9df\");\n const floorFill = resolveBuiltinChartColor(builtin?.floor.fill, colors) ?? wallFill;\n const gridlineColor = resolveBuiltinChartColor(builtin?.majorGridline, colors);\n for (const axis of [chart.categoryAxis, chart.valueAxis, chart.seriesAxis]) {\n if (axis && !axis.majorGridlineColor) axis.majorGridlineColor = gridlineColor;\n }\n const wallLine = chart.wireframe ? \"#a6a6a6\" : \"#a8adb7\";\n const previousDefaults = chart.raw?.builtinSurfaceDefaults as Record<string, { fillColor?: string; lineColor?: string }> | undefined;\n const nextDefaults: Record<string, { fillColor?: string; lineColor?: string }> = {};\n for (const key of [\"floor\", \"sideWall\", \"backWall\"] as const) {\n const wall = chart[key] ?? {};\n const previous = previousDefaults?.[key];\n const fillIsDefault = wall.fillColor === undefined || wall.fillColor === previous?.fillColor;\n const lineIsDefault = wall.lineColor === undefined || wall.lineColor === previous?.lineColor;\n const fillColor = fillIsDefault ? (key === \"floor\" ? floorFill : wallFill) : wall.fillColor;\n const lineColor = lineIsDefault ? wallLine : wall.lineColor;\n chart[key] = { ...wall, fillColor, lineColor };\n nextDefaults[key] = {\n fillColor: fillIsDefault ? fillColor : undefined,\n lineColor: lineIsDefault ? lineColor : undefined\n };\n }\n chart.raw = { ...chart.raw, builtinSurfaceDefaults: nextDefaults };\n if (!chart.surfaceMaterial && chart.wireframe !== true) {\n chart.surfaceMaterial = \"matte\";\n }\n}\n\nfunction applyBuiltinChartDefaults(chart: XlsxChart, themePalette?: XlsxThemePalette | null) {\n const darkBuiltInStyle = typeof chart.chartStyleId === \"number\" && chart.chartStyleId >= 140 && chart.chartStyleId < 150;\n const textColor = themePalette?.colorsByIndex[1] ?? themePalette?.colorsByIndex[3] ?? null;\n const minorTypeface = themePalette?.minorLatinFont?.trim() || undefined;\n const derivedAxisColor = textColor ? applyLightnessTransform(textColor, 0.35, 0.55) : null;\n const derivedBorderColor = textColor\n ? applyLightnessTransform(textColor, chart.is3d ? 0.28 : 0.22, chart.is3d ? 0.6 : 0.7)\n : null;\n if (darkBuiltInStyle) {\n chart.chartAreaFillColor = chart.chartAreaFillColor ?? \"#1f1f1f\";\n chart.chartAreaBorderColor = chart.chartAreaBorderColor ?? \"#1f1f1f\";\n chart.textColor = chart.textColor ?? \"#f5f5f5\";\n chart.titleColor = chart.titleColor ?? \"#f5f5f5\";\n chart.axisLabelColor = chart.axisLabelColor ?? \"#d9d9d9\";\n chart.axisLineColor = chart.axisLineColor ?? \"#8c8c8c\";\n }\n chart.chartAreaBorderColor = chart.chartAreaBorderColor ?? derivedBorderColor ?? undefined;\n chart.textColor = chart.textColor ?? textColor ?? undefined;\n chart.titleColor = chart.titleColor ?? textColor ?? undefined;\n chart.axisLabelColor = chart.axisLabelColor ?? derivedAxisColor ?? textColor ?? undefined;\n chart.axisLineColor = chart.axisLineColor ?? derivedAxisColor ?? textColor ?? undefined;\n chart.fontFamily = chart.fontFamily ?? minorTypeface;\n chart.titleFontFamily = chart.titleFontFamily ?? chart.fontFamily ?? minorTypeface;\n\n const themeColors = themePalette?.colorsByIndex;\n const useBuiltin = chart.raw?.hasCustomChartColorStyle !== true && themeColors && getBuiltinChartColor(chart.chartStyleId, 0, 1) !== undefined;\n const colorCount = Math.max(1, chart.series.length, chart.typeGroups?.reduce((total, group) => total + group.series.length, 0) ?? 0);\n const seriesPalette = useBuiltin && chart.chartType !== \"Surface\"\n ? Array.from({ length: colorCount }, (_, index) => resolveBuiltinChartColor(getBuiltinChartColor(chart.chartStyleId, index, colorCount), themeColors) ?? SERIES_COLORS[index % SERIES_COLORS.length])\n : chart.chartColorPalette?.length ? chart.chartColorPalette : buildThemeSeriesPalette(themePalette);\n chart.chartColorPalette = seriesPalette;\n chart.raw = { ...chart.raw, builtinThemeColors: useBuiltin ? themeColors : undefined };\n\n const applySeriesDefaults = (series: XlsxChartSeries, index: number) => {\n const fallbackColor = seriesPalette[index % seriesPalette.length];\n const properties = series.shapeProperties ?? {};\n const previous = properties.builtinDefaultColors as Partial<Record<\"color\" | \"lineColor\" | \"markerColor\" | \"markerLineColor\", string>> | undefined;\n const generated: Partial<Record<\"color\" | \"lineColor\" | \"markerColor\" | \"markerLineColor\", string>> = {};\n const resolveColor = (key: keyof typeof generated, explicit: unknown, fallback: string | undefined) => {\n const value = series[key];\n if (!explicit && (value == null || value === previous?.[key] || ((key === \"color\" || key === \"lineColor\") && useBuiltin && chart.raw?.xmlChartType))) {\n generated[key] = fallback;\n return fallback;\n }\n return value ?? fallback;\n };\n const explicitFill = properties.xmlFillColor ?? properties.solidFillHex ?? properties.xmlFillHidden;\n const explicitLine = properties.xmlLineColor ?? properties.lineColorHex ?? properties.xmlLineHidden;\n const color = explicitFill\n ? series.color ?? series.lineColor ?? fallbackColor\n : explicitLine\n ? series.lineColor ?? series.color ?? fallbackColor\n : resolveColor(\"color\", false, fallbackColor);\n const lineColor = explicitLine\n ? series.lineColor ?? color\n : explicitFill\n ? color\n : resolveColor(\"lineColor\", false, color ?? fallbackColor);\n const markerColor = resolveColor(\"markerColor\", properties.xmlMarkerFillColor ?? properties.xmlMarkerFillHidden, color ?? lineColor ?? fallbackColor);\n const markerLineColor = resolveColor(\"markerLineColor\", properties.xmlMarkerLineColor ?? properties.xmlMarkerLineHidden, lineColor ?? color ?? fallbackColor);\n return {\n ...series,\n color,\n lineColor,\n markerColor,\n markerLineColor,\n shapeProperties: { ...properties, builtinDefaultColors: generated }\n };\n };\n chart.series = chart.series.map(applySeriesDefaults);\n let groupSeriesOffset = 0;\n chart.typeGroups = chart.typeGroups?.map((group) => {\n const series = group.series.map((entry, index) => applySeriesDefaults(entry, groupSeriesOffset + index));\n groupSeriesOffset += group.series.length;\n return { ...group, series };\n });\n applyBuiltinSurfaceDefaults(chart, themePalette);\n}\n\nfunction parseChartPointStyles(seriesNode: Element, themePalette?: XlsxThemePalette | null): XlsxChartPointStyle[] {\n const pointStyles: XlsxChartPointStyle[] = [];\n\n for (const dataPointNode of getLocalChildren(seriesNode, \"dPt\")) {\n const indexValue = readChartNumericAttribute(dataPointNode, \"idx\");\n if (indexValue === undefined) {\n continue;\n }\n const shapeProperties = getFirstLocalChild(dataPointNode, \"spPr\");\n const lineStyle = resolveChartLineStyle(shapeProperties, themePalette);\n pointStyles.push({\n color: resolveChartFillColor(shapeProperties, themePalette) ?? undefined,\n explosion: readChartNumericAttribute(dataPointNode, \"explosion\"),\n index: indexValue,\n lineColor: lineStyle.color ?? undefined\n });\n }\n\n return pointStyles;\n}\n\nfunction parseInvertNegativeStyle(seriesNode: Element, themePalette?: XlsxThemePalette | null) {\n const invertNode = getFirstLocalDescendant(seriesNode, \"invertSolidFillFmt\");\n const shapeProperties = invertNode ? getFirstLocalChild(invertNode, \"spPr\") : null;\n if (!shapeProperties) {\n return {\n color: undefined,\n lineColor: undefined\n };\n }\n\n const lineStyle = resolveChartLineStyle(shapeProperties, themePalette);\n return {\n color: resolveChartFillColor(shapeProperties, themePalette) ?? undefined,\n lineColor: lineStyle.color ?? undefined\n };\n}\n\nfunction parseChartCacheValues(\n parentNode: Element | null,\n cacheName: \"numCache\" | \"strCache\",\n mode: \"category\" | \"value\"\n): Array<number | string | null> | null {\n if (!parentNode) {\n return null;\n }\n\n const referenceNode = getFirstLocalChild(parentNode, \"numRef\")\n ?? getFirstLocalChild(parentNode, \"strRef\")\n ?? parentNode;\n const cacheNode = getFirstLocalChild(referenceNode, cacheName)\n ?? getFirstLocalChild(parentNode, cacheName === \"numCache\" ? \"numLit\" : \"strLit\");\n if (!cacheNode) {\n return null;\n }\n\n const pointCount = readChartNumericAttribute(cacheNode, \"ptCount\");\n const pointNodes = getLocalChildren(cacheNode, \"pt\")\n .map((pointNode) => {\n const rawIndex = Number(pointNode.getAttribute(\"idx\") ?? Number.NaN);\n return {\n index: Number.isFinite(rawIndex) ? rawIndex : 0,\n value: getFirstLocalChild(pointNode, \"v\")?.textContent ?? \"\"\n };\n })\n .sort((left, right) => left.index - right.index);\n\n if (pointNodes.length === 0) {\n return null;\n }\n\n const maxIndex = pointNodes.reduce((max, point) => Math.max(max, point.index), 0);\n const targetLength = Math.max(\n pointNodes.length,\n Number.isFinite(pointCount ?? Number.NaN) ? Number(pointCount) : 0,\n maxIndex + 1\n );\n const values = Array.from({ length: targetLength }, () => null as number | string | null);\n for (const point of pointNodes) {\n if (mode === \"value\") {\n values[point.index] = cellValueToNumber(point.value);\n } else {\n values[point.index] = point.value.length > 0 ? point.value : null;\n }\n }\n return values;\n}\n\nfunction parseChartMultiLevelCacheValues(\n parentNode: Element | null,\n mode: \"category\" | \"value\"\n): Array<number | string | null> | null {\n if (!parentNode) {\n return null;\n }\n\n const referenceNode = getFirstLocalChild(parentNode, \"multiLvlStrRef\") ?? parentNode;\n const cacheNode = getFirstLocalChild(referenceNode, \"multiLvlStrCache\");\n if (!cacheNode) {\n return null;\n }\n\n const levelNodes = getLocalChildren(cacheNode, \"lvl\");\n if (levelNodes.length === 0) {\n return null;\n }\n\n const pointCount = readChartNumericAttribute(cacheNode, \"ptCount\");\n const primaryLevelNode = mode === \"category\"\n ? levelNodes[levelNodes.length - 1] ?? levelNodes[0]\n : levelNodes[0];\n const pointNodes = getLocalChildren(primaryLevelNode, \"pt\")\n .map((pointNode) => {\n const rawIndex = Number(pointNode.getAttribute(\"idx\") ?? Number.NaN);\n return {\n index: Number.isFinite(rawIndex) ? rawIndex : 0,\n value: getFirstLocalChild(pointNode, \"v\")?.textContent ?? \"\"\n };\n })\n .sort((left, right) => left.index - right.index);\n\n if (pointNodes.length === 0) {\n return null;\n }\n\n const maxIndex = pointNodes.reduce((max, point) => Math.max(max, point.index), 0);\n const targetLength = Math.max(\n pointNodes.length,\n Number.isFinite(pointCount ?? Number.NaN) ? Number(pointCount) : 0,\n maxIndex + 1\n );\n const values = Array.from({ length: targetLength }, () => null as number | string | null);\n for (const point of pointNodes) {\n if (mode === \"value\") {\n values[point.index] = cellValueToNumber(point.value);\n continue;\n }\n values[point.index] = point.value.length > 0 ? point.value : null;\n }\n return values;\n}\n\nfunction applyChartSeriesStyleFromXml(chart: XlsxChart, chartTypeNode: Element, themePalette?: XlsxThemePalette | null) {\n const seriesNodes = getLocalChildren(chartTypeNode, \"ser\");\n chart.series = chart.series.map((series, index) => {\n const seriesNode = seriesNodes[index];\n if (!seriesNode) {\n return series;\n }\n\n const shapeProperties = getFirstLocalChild(seriesNode, \"spPr\");\n const markerNode = getFirstLocalChild(seriesNode, \"marker\");\n const markerShapeProperties = getFirstLocalChild(markerNode ?? chartTypeNode, \"spPr\");\n const lineStyle = resolveChartLineStyle(shapeProperties, themePalette);\n const markerLineStyle = resolveChartLineStyle(markerShapeProperties, themePalette);\n const fillColor = resolveChartFillColor(shapeProperties, themePalette);\n const markerSize = readChartNumericAttribute(markerNode, \"size\");\n const markerSymbolNode = markerNode ? getFirstLocalChild(markerNode, \"symbol\") : null;\n const markerSymbol = markerSymbolNode?.getAttribute(\"val\")\n ?? (markerNode\n || chart.chartType === \"Scatter\"\n || [\"marker\", \"lineMarker\", \"smoothMarker\"].includes(chart.scatterStyle ?? \"\")\n || readChartBooleanAttribute(chartTypeNode, \"marker\") === true\n ? \"auto\"\n : series.markerSymbol);\n const pointStyles = parseChartPointStyles(seriesNode, themePalette);\n const seriesExplosion = readChartNumericAttribute(seriesNode, \"explosion\");\n const invertNegativeStyle = parseInvertNegativeStyle(seriesNode, themePalette);\n const invertIfNegative = readChartBooleanAttribute(seriesNode, \"invertIfNegative\");\n const isScatterChart = (\n chart.chartType === \"Scatter\"\n || chart.chartType === \"ScatterLines\"\n || chart.chartType === \"ScatterSmooth\"\n || chart.chartType === \"Bubble\"\n );\n const cachedCategories = isScatterChart\n ? (\n parseChartCacheValues(getFirstLocalChild(seriesNode, \"xVal\"), \"numCache\", \"value\")\n ?? parseChartMultiLevelCacheValues(getFirstLocalChild(seriesNode, \"xVal\"), \"category\")\n )\n : (\n parseChartCacheValues(getFirstLocalChild(seriesNode, \"cat\"), \"strCache\", \"category\")\n ?? parseChartCacheValues(getFirstLocalChild(seriesNode, \"cat\"), \"numCache\", \"category\")\n ?? parseChartMultiLevelCacheValues(getFirstLocalChild(seriesNode, \"cat\"), \"category\")\n );\n const cachedValues = isScatterChart\n ? parseChartCacheValues(getFirstLocalChild(seriesNode, \"yVal\"), \"numCache\", \"value\")\n : parseChartCacheValues(getFirstLocalChild(seriesNode, \"val\"), \"numCache\", \"value\");\n const cachedBubbleSizes = chart.chartType === \"Bubble\"\n ? parseChartCacheValues(getFirstLocalChild(seriesNode, \"bubbleSize\"), \"numCache\", \"value\")\n : null;\n const existingShapeProperties = series.shapeProperties && typeof series.shapeProperties === \"object\"\n ? series.shapeProperties as Record<string, unknown>\n : null;\n const rawFillColor = typeof existingShapeProperties?.solidFillHex === \"string\"\n ? normalizeHexColor(existingShapeProperties.solidFillHex)\n : null;\n const rawLineColor = typeof existingShapeProperties?.lineColorHex === \"string\"\n ? normalizeHexColor(existingShapeProperties.lineColorHex)\n : null;\n const resolvedLineColor = lineStyle.hidden\n ? undefined\n : rawLineColor ?? lineStyle.color ?? rawFillColor ?? fillColor ?? series.lineColor ?? series.color;\n\n const hasCategoryReference = typeof series.categoriesRef?.formula === \"string\" && series.categoriesRef.formula.length > 0;\n const hasValueReference = typeof series.valuesRef?.formula === \"string\" && series.valuesRef.formula.length > 0;\n const hasBubbleSizeReference = typeof series.bubbleSizeRef?.formula === \"string\" && series.bubbleSizeRef.formula.length > 0;\n\n return {\n ...series,\n bubbleSizes: !hasBubbleSizeReference && cachedBubbleSizes\n ? cachedBubbleSizes.map((value) => (typeof value === \"number\" && Number.isFinite(value) ? value : null))\n : series.bubbleSizes,\n categories: !hasCategoryReference && cachedCategories ? cachedCategories : series.categories,\n color: rawFillColor ?? rawLineColor ?? fillColor ?? lineStyle.color ?? series.color,\n dataPointStyles: pointStyles.length > 0 ? pointStyles : series.dataPointStyles,\n lineColor: resolvedLineColor,\n lineWidthPx: lineStyle.hidden ? undefined : lineStyle.widthPx ?? series.lineWidthPx,\n markerColor: resolveChartFillColor(markerShapeProperties, themePalette)\n ?? rawFillColor\n ?? rawLineColor\n ?? fillColor\n ?? lineStyle.color\n ?? undefined,\n markerLineColor: markerLineStyle.color\n ?? rawLineColor\n ?? rawFillColor\n ?? lineStyle.color\n ?? fillColor\n ?? undefined,\n markerSize: markerSize ?? series.markerSize,\n markerSymbol,\n smooth: readChartBooleanAttribute(seriesNode, \"smooth\") ?? series.smooth,\n invertIfNegative: invertIfNegative ?? series.invertIfNegative,\n shapeProperties: {\n ...series.shapeProperties,\n xmlExplosion: seriesExplosion ?? undefined,\n xmlFillHidden: getFirstLocalChild(shapeProperties, \"noFill\") ? true : undefined,\n xmlFillColor: fillColor ?? undefined,\n xmlLineHidden: lineStyle.hidden ? true : undefined,\n xmlLineColor: lineStyle.color ?? undefined,\n xmlLineWidthPx: lineStyle.widthPx ?? undefined,\n xmlMarkerFillColor: resolveChartFillColor(markerShapeProperties, themePalette) ?? undefined,\n xmlMarkerFillHidden: getFirstLocalChild(markerShapeProperties, \"noFill\") ? true : undefined,\n xmlMarkerLineColor: markerLineStyle.color ?? undefined,\n xmlMarkerLineHidden: markerLineStyle.hidden ? true : undefined,\n xmlNegativeFillColor: invertNegativeStyle.color ?? undefined,\n xmlNegativeLineColor: invertNegativeStyle.lineColor ?? undefined\n },\n negativeColor: invertNegativeStyle.color ?? series.negativeColor,\n negativeLineColor: invertNegativeStyle.lineColor ?? series.negativeLineColor,\n values: !hasValueReference && cachedValues\n ? cachedValues.map((value) => (typeof value === \"number\" && Number.isFinite(value) ? value : null))\n : series.values\n };\n });\n}\n\nfunction applyChartStyleFromXml(\n chart: XlsxChart,\n chartPath: string | undefined,\n archive: Record<string, Uint8Array>,\n themePalette?: XlsxThemePalette | null\n) {\n const chartXml = readArchiveText(archive, chartPath);\n if (!chartXml) {\n return;\n }\n const relationships = chartPath ? readChartRelationships(archive, chartPath) : new Map<string, string>();\n const fallbackPointStylesBySeries = parseFallbackPointStylesFromChartXml(chartXml, themePalette);\n const fallbackSeriesStyles = parseFallbackSeriesStylesFromChartXml(chartXml, themePalette);\n const fallbackBubbleSizesBySeries = parseFallbackBubbleSizesFromChartXml(chartXml);\n const applyFallbackSeriesStyles = () => {\n if (fallbackBubbleSizesBySeries.length > 0) {\n chart.series = chart.series.map((series, seriesIndex) => {\n const fallbackBubbleSizes = fallbackBubbleSizesBySeries[seriesIndex] ?? [];\n if (fallbackBubbleSizes.length === 0) {\n return series;\n }\n\n const currentNumericPointCount = (series.bubbleSizes ?? []).filter(\n (value): value is number => typeof value === \"number\" && Number.isFinite(value)\n ).length;\n const fallbackNumericPointCount = fallbackBubbleSizes.filter(\n (value): value is number => typeof value === \"number\" && Number.isFinite(value)\n ).length;\n\n if (currentNumericPointCount >= fallbackNumericPointCount) {\n return series;\n }\n\n return {\n ...series,\n bubbleSizes: fallbackBubbleSizes\n };\n });\n }\n\n if (fallbackPointStylesBySeries.length > 0) {\n chart.series = chart.series.map((series, seriesIndex) => {\n const fallbackPointStyles = fallbackPointStylesBySeries[seriesIndex] ?? [];\n if (fallbackPointStyles.length === 0) {\n return series;\n }\n\n const existingByIndex = new Map((series.dataPointStyles ?? []).map((entry) => [entry.index, entry]));\n for (const fallbackStyle of fallbackPointStyles) {\n const existing = existingByIndex.get(fallbackStyle.index);\n existingByIndex.set(fallbackStyle.index, {\n color: existing?.color ?? fallbackStyle.color,\n explosion: existing?.explosion ?? fallbackStyle.explosion,\n index: fallbackStyle.index,\n lineColor: existing?.lineColor ?? fallbackStyle.lineColor\n });\n }\n\n return {\n ...series,\n dataPointStyles: Array.from(existingByIndex.values()).sort((left, right) => left.index - right.index)\n };\n });\n }\n\n if (fallbackSeriesStyles.length > 0) {\n chart.series = chart.series.map((series, seriesIndex) => {\n const fallbackStyle = fallbackSeriesStyles[seriesIndex];\n if (!fallbackStyle) {\n return series;\n }\n const fallbackColor = fallbackStyle.color ?? fallbackStyle.lineColor;\n return {\n ...series,\n color: series.color ?? fallbackColor,\n lineColor: series.lineColor ?? fallbackStyle.lineColor ?? fallbackColor,\n markerColor: series.markerColor ?? fallbackColor ?? series.color,\n markerLineColor: series.markerLineColor ?? fallbackStyle.lineColor ?? fallbackColor ?? series.lineColor\n };\n });\n }\n };\n const applyRelationshipStyles = () => {\n chart.chartColorPalette = readChartColorPalette(archive, relationships.get(CHART_COLOR_STYLE_REL_TYPE), themePalette);\n chart.raw = { ...chart.raw, hasCustomChartColorStyle: Boolean(chart.chartColorPalette?.length) };\n const styleAppearance = readChartStyleAppearance(\n archive,\n relationships.get(CHART_STYLE_REL_TYPE),\n themePalette\n );\n chart.axisLabelColor = styleAppearance.axisLabelColor ?? chart.axisLabelColor;\n chart.axisLineColor = styleAppearance.axisLineColor ?? chart.axisLineColor;\n chart.chartAreaBorderColor = styleAppearance.chartAreaBorderColor ?? chart.chartAreaBorderColor;\n chart.chartAreaFillColor = styleAppearance.chartAreaFillColor ?? chart.chartAreaFillColor;\n chart.chartColorPaletteOffset = styleAppearance.paletteOffset ?? chart.chartColorPaletteOffset;\n chart.textColor = styleAppearance.textColor ?? chart.textColor;\n chart.titleColor = styleAppearance.titleColor ?? chart.titleColor;\n return styleAppearance;\n };\n const applyModernChartExStyles = () => {\n const modernPlotAreaNode = chartDocument?.documentElement\n ? getFirstLocalDescendant(chartDocument.documentElement, \"plotArea\")\n : null;\n if (!modernPlotAreaNode) {\n return;\n }\n\n const parseModernBinning = (seriesNode: Element) => {\n const layoutPrNode = getFirstLocalChild(seriesNode, \"layoutPr\");\n const binningNode = layoutPrNode ? getFirstLocalChild(layoutPrNode, \"binning\") : null;\n if (!binningNode) {\n return null;\n }\n const binning: Record<string, unknown> = {};\n for (const attribute of Array.from(binningNode.attributes)) {\n const rawValue = attribute.value;\n const numeric = Number(rawValue);\n binning[attribute.localName || attribute.name] = Number.isFinite(numeric) && rawValue.trim() !== \"\"\n ? numeric\n : rawValue;\n }\n return Object.keys(binning).length > 0 ? binning : {};\n };\n\n const plotAreaShapeProperties = getFirstLocalChild(modernPlotAreaNode, \"spPr\");\n if (plotAreaShapeProperties) {\n const plotAreaFillColor = resolveChartFillColor(plotAreaShapeProperties, themePalette);\n const plotAreaLineStyle = resolveChartLineStyle(plotAreaShapeProperties, themePalette);\n if (plotAreaFillColor) {\n chart.chartAreaFillColor = chart.chartAreaFillColor ?? plotAreaFillColor;\n }\n if (plotAreaLineStyle.color) {\n chart.chartAreaBorderColor = chart.chartAreaBorderColor ?? plotAreaLineStyle.color;\n }\n }\n\n const modernSeriesNodes = getLocalDescendants(modernPlotAreaNode, \"series\");\n if (modernSeriesNodes.length === 0) {\n return;\n }\n\n chart.series = chart.series.map((series, seriesIndex) => {\n const modernSeriesNode = modernSeriesNodes[seriesIndex] ?? null;\n if (!modernSeriesNode) {\n return series;\n }\n const valueColorsNode = getFirstLocalChild(modernSeriesNode, \"valueColors\");\n const valueColors = valueColorsNode\n ? Array.from(valueColorsNode.childNodes)\n .filter((node): node is Element => node.nodeType === Node.ELEMENT_NODE)\n .map((node) => resolveChartColorNode(findFirstChartColorElement(node) ?? node, themePalette))\n .filter((value): value is string => typeof value === \"string\" && value.length > 0)\n : [];\n const nextRaw = valueColors.length > 0\n ? {\n ...(series.raw && typeof series.raw === \"object\" ? series.raw as Record<string, unknown> : {}),\n valueColors\n }\n : series.raw;\n const seriesShapeProperties = getFirstLocalChild(modernSeriesNode, \"spPr\");\n if (!seriesShapeProperties) {\n return nextRaw === series.raw\n ? series\n : {\n ...series,\n raw: nextRaw\n };\n }\n const fillColor = resolveChartFillColor(seriesShapeProperties, themePalette);\n const lineStyle = resolveChartLineStyle(seriesShapeProperties, themePalette);\n const fallbackColor = fillColor ?? lineStyle.color ?? undefined;\n return {\n ...series,\n color: series.color ?? fallbackColor,\n lineColor: series.lineColor ?? lineStyle.color ?? fillColor ?? fallbackColor,\n lineWidthPx: series.lineWidthPx ?? (typeof lineStyle.widthPx === \"number\" ? lineStyle.widthPx : undefined),\n markerColor: series.markerColor ?? fallbackColor ?? series.color,\n markerLineColor: series.markerLineColor ?? lineStyle.color ?? fallbackColor ?? series.lineColor,\n raw: nextRaw\n };\n });\n\n const seriesLayouts = modernSeriesNodes.map((node) => node.getAttribute(\"layoutId\") ?? node.getAttribute(\"layout\"));\n const clusteredColumnIndex = seriesLayouts.findIndex((layout) => layout === \"clusteredColumn\");\n if (clusteredColumnIndex >= 0) {\n const clusteredNode = modernSeriesNodes[clusteredColumnIndex] ?? null;\n const parsedBinning = clusteredNode ? parseModernBinning(clusteredNode) : null;\n if (parsedBinning) {\n const syntheticRawSeries: Record<string, unknown> = {\n layoutId: \"clusteredColumn\",\n layoutPr: {\n binning: parsedBinning\n }\n };\n const hasParetoLine = seriesLayouts.includes(\"paretoLine\");\n const replaceColumnSeries = (series: XlsxChartSeries | null | undefined) => (\n series ? buildChartExHistogramSeries(series, syntheticRawSeries, hasParetoLine) : null\n );\n\n if (chart.typeGroups && chart.typeGroups.length > 0) {\n const nextTypeGroups = chart.typeGroups.map((group) => ({ ...group, series: [...group.series] }));\n const columnGroupIndex = nextTypeGroups.findIndex((group) => group.chartType === \"ColumnClustered\");\n if (columnGroupIndex >= 0) {\n const originalColumnSeries = nextTypeGroups[columnGroupIndex]?.series[0] ?? null;\n const binnedColumnSeries = replaceColumnSeries(originalColumnSeries);\n if (binnedColumnSeries) {\n nextTypeGroups[columnGroupIndex].series = [binnedColumnSeries];\n const lineGroupIndex = nextTypeGroups.findIndex((group) => group.chartType === \"Line\");\n if (lineGroupIndex >= 0 && nextTypeGroups[lineGroupIndex]?.series[0]) {\n const originalLineSeries = nextTypeGroups[lineGroupIndex].series[0];\n const recomputedLine = buildChartExParetoLineSeries(\n binnedColumnSeries,\n {\n text: originalLineSeries.name,\n ...(originalLineSeries.raw && typeof originalLineSeries.raw === \"object\"\n ? originalLineSeries.raw as Record<string, unknown>\n : {})\n },\n 0\n );\n nextTypeGroups[lineGroupIndex].series = [\n {\n ...originalLineSeries,\n categories: recomputedLine.categories,\n categoriesRef: recomputedLine.categoriesRef,\n raw: recomputedLine.raw,\n values: recomputedLine.values\n }\n ];\n chart.series = [binnedColumnSeries, nextTypeGroups[lineGroupIndex].series[0]];\n } else {\n chart.series = [binnedColumnSeries];\n }\n chart.typeGroups = nextTypeGroups;\n }\n } else if (chart.series[0]) {\n const binnedSeries = replaceColumnSeries(chart.series[0]);\n if (binnedSeries) {\n chart.series = [binnedSeries];\n }\n }\n } else if (chart.series[0]) {\n const binnedSeries = replaceColumnSeries(chart.series[0]);\n if (binnedSeries) {\n chart.series = [binnedSeries];\n }\n }\n }\n }\n };\n\n const chartDocument = parseXml(chartXml);\n const chartNode = chartDocument ? getFirstLocalDescendant(chartDocument, \"chart\") : null;\n const plotAreaNode = chartNode ? getFirstLocalChild(chartNode, \"plotArea\") : null;\n const styleIdNode = chartDocument?.documentElement ? getFirstLocalDescendant(chartDocument.documentElement, \"style\") : null;\n const chartTypeNode = findPrimaryChartTypeNode(plotAreaNode);\n\n if (!chartNode || !chartTypeNode) {\n applyRelationshipStyles();\n const fallbackStyleId = readChartNumericAttribute(styleIdNode, \"style\");\n if (typeof fallbackStyleId === \"number\" && Number.isFinite(fallbackStyleId)) {\n chart.chartStyleId = fallbackStyleId;\n }\n applyModernChartExStyles();\n applyFallbackSeriesStyles();\n applyBuiltinChartDefaults(chart, themePalette);\n return;\n }\n const plotArea = plotAreaNode;\n if (!plotArea) {\n applyRelationshipStyles();\n applyFallbackSeriesStyles();\n applyBuiltinChartDefaults(chart, themePalette);\n return;\n }\n\n switch (chartTypeNode.localName) {\n case \"barChart\":\n case \"bar3DChart\": {\n const grouping = getFirstLocalChild(chartTypeNode, \"grouping\")?.getAttribute(\"val\");\n const barDir = getFirstLocalChild(chartTypeNode, \"barDir\")?.getAttribute(\"val\");\n const isHorizontalBar = barDir === \"bar\";\n chart.is3d = chartTypeNode.localName === \"bar3DChart\" ? true : chart.is3d;\n if (grouping === \"percentStacked\") {\n chart.chartType = isHorizontalBar ? \"BarPercentStacked\" : \"ColumnPercentStacked\";\n } else if (grouping === \"stacked\") {\n chart.chartType = isHorizontalBar ? \"BarStacked\" : \"ColumnStacked\";\n } else {\n chart.chartType = isHorizontalBar ? \"BarClustered\" : \"ColumnClustered\";\n }\n break;\n }\n case \"areaChart\":\n case \"area3DChart\": {\n const grouping = getFirstLocalChild(chartTypeNode, \"grouping\")?.getAttribute(\"val\");\n chart.is3d = chartTypeNode.localName === \"area3DChart\" ? true : chart.is3d;\n if (grouping === \"stacked\") {\n chart.chartType = \"AreaStacked\";\n } else if (grouping === \"percentStacked\") {\n chart.chartType = \"AreaPercentStacked\";\n } else {\n chart.chartType = \"Area\";\n }\n break;\n }\n case \"lineChart\":\n case \"line3DChart\": {\n const grouping = getFirstLocalChild(chartTypeNode, \"grouping\")?.getAttribute(\"val\");\n chart.is3d = chartTypeNode.localName === \"line3DChart\" ? true : chart.is3d;\n if (grouping === \"stacked\") {\n chart.chartType = \"LineStacked\";\n } else if (grouping === \"percentStacked\") {\n chart.chartType = \"LinePercentStacked\";\n } else {\n chart.chartType = \"Line\";\n }\n break;\n }\n case \"pieChart\":\n chart.chartType = \"Pie\";\n break;\n case \"pie3DChart\":\n chart.chartType = \"Pie3D\";\n chart.is3d = true;\n break;\n case \"doughnutChart\":\n chart.chartType = \"Doughnut\";\n break;\n case \"ofPieChart\":\n chart.chartType = \"BarOfPie\";\n break;\n case \"scatterChart\":\n chart.chartType = resolveScatterChartType(getFirstLocalChild(chartTypeNode, \"scatterStyle\")?.getAttribute(\"val\"));\n break;\n case \"radarChart\":\n chart.chartType = \"Radar\";\n break;\n case \"surfaceChart\":\n chart.chartType = \"Surface\";\n chart.is3d = false;\n break;\n case \"surface3DChart\":\n chart.chartType = \"Surface\";\n chart.is3d = true;\n break;\n case \"stockChart\":\n chart.chartType = \"Stock\";\n break;\n case \"bubbleChart\":\n chart.chartType = \"Bubble\";\n break;\n default:\n break;\n }\n\n const legendNode = getFirstLocalChild(chartNode, \"legend\");\n const legendPosition = legendNode ? getFirstLocalChild(legendNode, \"legendPos\")?.getAttribute(\"val\") ?? undefined : undefined;\n const legendOverlay = legendNode ? getFirstLocalChild(legendNode, \"overlay\")?.getAttribute(\"val\") : undefined;\n\n chart.legend = legendNode ? {\n overlay: legendOverlay === \"1\",\n position: normalizeLegendPosition(legendPosition),\n raw: chart.legend?.raw\n } : chart.legend;\n const plotVisibleOnly = readChartBooleanAttribute(chartNode, \"plotVisOnly\");\n if (plotVisibleOnly !== undefined) {\n chart.plotVisibleOnly = plotVisibleOnly;\n }\n chart.displayBlanksAs = getFirstLocalChild(chartNode, \"dispBlanksAs\")?.getAttribute(\"val\") ?? chart.displayBlanksAs;\n const styleId = Number(styleIdNode?.getAttribute(\"val\") ?? Number.NaN);\n chart.chartStyleId = Number.isFinite(styleId) ? styleId : chart.chartStyleId;\n chart.firstSliceAngle = readChartNumericAttribute(chartTypeNode, \"firstSliceAng\") ?? chart.firstSliceAngle;\n chart.gapWidth = readChartNumericAttribute(chartTypeNode, \"gapWidth\") ?? chart.gapWidth;\n chart.overlap = readChartNumericAttribute(chartTypeNode, \"overlap\") ?? chart.overlap;\n chart.bubbleScale = readChartNumericAttribute(chartTypeNode, \"bubbleScale\") ?? chart.bubbleScale;\n chart.varyColors = readChartBooleanAttribute(chartTypeNode, \"varyColors\") ?? chart.varyColors;\n const bubble3dNode = getFirstLocalChild(chartTypeNode, \"bubble3D\");\n chart.bubble3d = bubble3dNode\n ? bubble3dNode.getAttribute(\"val\") !== \"0\"\n : chart.bubble3d;\n chart.holeSize = readChartNumericAttribute(chartTypeNode, \"holeSize\") ?? chart.holeSize;\n chart.radarStyle = getFirstLocalChild(chartTypeNode, \"radarStyle\")?.getAttribute(\"val\") ?? chart.radarStyle;\n chart.scatterStyle = getFirstLocalChild(chartTypeNode, \"scatterStyle\")?.getAttribute(\"val\") ?? chart.scatterStyle;\n chart.shape3d = getFirstLocalChild(chartTypeNode, \"shape\")?.getAttribute(\"val\") ?? chart.shape3d;\n const wireframeNode = getFirstLocalChild(chartTypeNode, \"wireframe\");\n chart.wireframe = wireframeNode\n ? wireframeNode.getAttribute(\"val\") !== \"0\"\n : chart.wireframe;\n const chartTypeDataLabels = parseChartDataLabelsFromXml(getFirstLocalChild(chartTypeNode, \"dLbls\"));\n const firstSeriesNode = getLocalChildren(chartTypeNode, \"ser\")[0] ?? null;\n const seriesDataLabels = parseChartDataLabelsFromXml(getFirstLocalChild(firstSeriesNode, \"dLbls\"));\n chart.dataLabels = chartTypeDataLabels ?? seriesDataLabels ?? chart.dataLabels;\n const seriesSp3dNode = firstSeriesNode ? getFirstLocalDescendant(firstSeriesNode, \"sp3d\") : null;\n chart.surfaceMaterial = seriesSp3dNode?.getAttribute(\"prstMaterial\") ?? chart.surfaceMaterial;\n const bandFormatsNode = getLocalChildren(chartTypeNode, \"bandFmts\")[0] ?? null;\n const bandFormatNodes = bandFormatsNode ? getLocalChildren(bandFormatsNode, \"bandFmt\") : [];\n const bandFormatColors: Record<number, string> = Object.create(null);\n const bandFormatLineColors: Record<number, string> = Object.create(null);\n const bandFormatLineWidths: Record<number, number> = Object.create(null);\n for (const bandFormatNode of bandFormatNodes) {\n const index = readChartNumericAttribute(bandFormatNode, \"idx\");\n if (index == null || !Number.isInteger(index) || index < 0 || index > 0xffffffff) {\n continue;\n }\n const shapeProperties = getFirstLocalChild(bandFormatNode, \"spPr\");\n const fillColor = getFirstLocalChild(shapeProperties, \"noFill\") ? \"transparent\" : resolveChartFillColor(shapeProperties, themePalette);\n const lineStyle = resolveChartLineStyle(shapeProperties, themePalette);\n const lineColor = lineStyle.hidden ? \"transparent\" : lineStyle.color;\n const lineWidth = Number(getFirstLocalChild(shapeProperties, \"ln\")?.getAttribute(\"w\") ?? Number.NaN);\n if (fillColor) bandFormatColors[index] = fillColor;\n if (lineColor) bandFormatLineColors[index] = lineColor;\n if (Number.isFinite(lineWidth) && lineWidth >= 0) bandFormatLineWidths[index] = lineWidth / EMU_PER_PIXEL;\n }\n\n chart.raw = {\n ...(chart.raw ?? {}),\n bandFormatColors: Object.keys(bandFormatColors).length > 0 ? bandFormatColors : undefined,\n bandFormatLineColors: Object.keys(bandFormatLineColors).length > 0 ? bandFormatLineColors : undefined,\n bandFormatLineWidths: Object.keys(bandFormatLineWidths).length > 0 ? bandFormatLineWidths : undefined,\n date1904: readChartBooleanAttribute(chartDocument?.documentElement ?? null, \"date1904\"),\n titleOverlay: readChartBooleanAttribute(getFirstLocalChild(chartNode, \"title\"), \"overlay\"),\n bubble3d: chart.bubble3d,\n grouping: getFirstLocalChild(chartTypeNode, \"grouping\")?.getAttribute(\"val\") ?? undefined,\n ofPieType: getFirstLocalChild(chartTypeNode, \"ofPieType\")?.getAttribute(\"val\") ?? undefined,\n shape: getFirstLocalChild(chartTypeNode, \"shape\")?.getAttribute(\"val\") ?? undefined,\n secondPieSize: readChartNumericAttribute(chartTypeNode, \"secondPieSize\"),\n scatterStyle: chart.scatterStyle,\n splitPos: readChartNumericAttribute(chartTypeNode, \"splitPos\"),\n splitType: getFirstLocalChild(chartTypeNode, \"splitType\")?.getAttribute(\"val\") ?? undefined,\n xmlChartType: chartTypeNode.localName\n };\n const view3dNode = getFirstLocalDescendant(chartNode, \"view3D\");\n if (view3dNode) {\n chart.view3d = {\n depthPercent: readChartNumericAttribute(view3dNode, \"depthPercent\"),\n heightPercent: readChartNumericAttribute(view3dNode, \"hPercent\"),\n perspective: readChartNumericAttribute(view3dNode, \"perspective\"),\n rAngAx: getFirstLocalChild(view3dNode, \"rAngAx\")?.getAttribute(\"val\") === \"1\",\n rotX: readChartNumericAttribute(view3dNode, \"rotX\"),\n rotY: readChartNumericAttribute(view3dNode, \"rotY\")\n };\n }\n for (const key of [\"floor\", \"sideWall\", \"backWall\"] as const) {\n const wall = readChartWallFromXml(getFirstLocalChild(chartNode, key), themePalette);\n if (wall) {\n chart[key] = wall;\n const defaults = chart.raw?.builtinSurfaceDefaults as Record<string, unknown> | undefined;\n if (defaults) chart.raw = { ...chart.raw, builtinSurfaceDefaults: { ...defaults, [key]: undefined } };\n }\n }\n\n const styleAppearance = applyRelationshipStyles();\n const chartTextTypeface = readChartTextTypeface(getFirstLocalChild(chartNode, \"txPr\"), themePalette);\n const titleTypeface = readChartTextTypeface(getFirstLocalDescendant(chartNode, \"title\"), themePalette);\n chart.fontFamily = chartTextTypeface ?? chart.fontFamily;\n chart.titleFontFamily = titleTypeface ?? chart.titleFontFamily ?? chart.fontFamily;\n\n const chartAreaShapeProperties = chartDocument?.documentElement\n ? getFirstLocalChild(chartDocument.documentElement, \"spPr\")\n : null;\n const plotAreaShapeProperties = getFirstLocalChild(plotArea, \"spPr\");\n const chartAreaNoFill = chartAreaShapeProperties ? getFirstLocalChild(chartAreaShapeProperties, \"noFill\") != null : false;\n const plotAreaNoFill = plotAreaShapeProperties ? getFirstLocalChild(plotAreaShapeProperties, \"noFill\") != null : false;\n chart.raw = {\n ...(chart.raw ?? {}),\n chartAreaNoFill: styleAppearance.chartAreaNoFill === true || chartAreaNoFill,\n plotAreaNoFill,\n plotAreaFillColor: resolveChartFillColor(plotAreaShapeProperties, themePalette) ?? undefined,\n plotAreaLineColor: resolveChartLineStyle(plotAreaShapeProperties, themePalette).color ?? undefined\n };\n if (chartAreaShapeProperties) {\n const chartAreaFillColor = resolveChartFillColor(chartAreaShapeProperties, themePalette);\n if (chartAreaFillColor) {\n chart.chartAreaFillColor = chartAreaFillColor;\n } else if (getFirstLocalChild(chartAreaShapeProperties, \"noFill\")) {\n chart.chartAreaFillColor = \"transparent\";\n }\n const chartAreaLineStyle = resolveChartLineStyle(chartAreaShapeProperties, themePalette);\n if (chartAreaLineStyle.hidden) {\n chart.chartAreaBorderColor = \"transparent\";\n } else if (chartAreaLineStyle.color) {\n chart.chartAreaBorderColor = chartAreaLineStyle.color;\n }\n }\n if (!chart.chartAreaFillColor && (styleAppearance.chartAreaNoFill === true || plotAreaNoFill)) {\n chart.chartAreaFillColor = \"transparent\";\n }\n const categoryAxisNodes = [\n ...getLocalChildren(plotArea, \"catAx\"),\n ...getLocalChildren(plotArea, \"dateAx\")\n ];\n const valueAxisNodes = getLocalChildren(plotArea, \"valAx\");\n const seriesAxisNode = getLocalChildren(plotArea, \"serAx\")[0] ?? null;\n const isScatterLikeChart = (\n chart.chartType === \"Scatter\"\n || chart.chartType === \"ScatterLines\"\n || chart.chartType === \"ScatterSmooth\"\n || chart.chartType === \"Bubble\"\n );\n let categoryAxisNode = categoryAxisNodes[0] ?? null;\n let valueAxisNode = valueAxisNodes[0] ?? null;\n if (!categoryAxisNode && isScatterLikeChart && valueAxisNodes.length >= 2) {\n categoryAxisNode = valueAxisNodes.find((axisNode) => {\n const position = getFirstLocalChild(axisNode, \"axPos\")?.getAttribute(\"val\");\n return position === \"b\" || position === \"t\";\n }) ?? valueAxisNodes[0];\n valueAxisNode = valueAxisNodes.find((axisNode) => {\n const position = getFirstLocalChild(axisNode, \"axPos\")?.getAttribute(\"val\");\n return position === \"l\" || position === \"r\";\n }) ?? valueAxisNodes[1] ?? valueAxisNodes[0];\n }\n chart.categoryAxis = mergeChartAxis(chart.categoryAxis, readChartAxisFromXml(categoryAxisNode, themePalette));\n chart.valueAxis = mergeChartAxis(chart.valueAxis, readChartAxisFromXml(valueAxisNode, themePalette));\n chart.seriesAxis = mergeChartAxis(chart.seriesAxis, readChartAxisFromXml(seriesAxisNode, themePalette));\n chart.axes = chart.axes.length > 0\n ? chart.axes.map((axis, index) => (\n index === 0 && categoryAxisNode\n ? { ...axis, ...readChartAxisFromXml(categoryAxisNode, themePalette) }\n : index === 1 && valueAxisNode\n ? { ...axis, ...readChartAxisFromXml(valueAxisNode, themePalette) }\n : axis\n ))\n : chart.axes;\n if (seriesAxisNode) {\n const seriesAxis = readChartAxisFromXml(seriesAxisNode, themePalette);\n if (seriesAxis && !chart.axes.some((axis) => axis.id != null && axis.id === seriesAxis.id)) {\n chart.axes = [...chart.axes, seriesAxis as XlsxChartAxis];\n }\n }\n\n applyChartSeriesStyleFromXml(chart, chartTypeNode, themePalette);\n applyFallbackSeriesStyles();\n applyBuiltinChartDefaults(chart, themePalette);\n}\n\nfunction normalizeArchivePath(path: string) {\n return path.replace(/^\\/+/, \"\").replace(/\\\\/g, \"/\");\n}\n\nfunction dirname(path: string) {\n const normalized = normalizeArchivePath(path);\n const index = normalized.lastIndexOf(\"/\");\n return index >= 0 ? normalized.slice(0, index) : \"\";\n}\n\nfunction resolveRelationshipPath(basePath: string, target: string) {\n if (!target) {\n return \"\";\n }\n\n const normalizedTarget = target.replace(/\\\\/g, \"/\");\n if (normalizedTarget.startsWith(\"/\")) {\n return normalizeArchivePath(normalizedTarget);\n }\n const normalizedBasePath = normalizeArchivePath(basePath);\n let baseDirectory = dirname(normalizedBasePath);\n if (normalizedBasePath.endsWith(\".rels\")) {\n const relsMarker = \"/_rels/\";\n const relsMarkerIndex = normalizedBasePath.lastIndexOf(relsMarker);\n if (relsMarkerIndex >= 0) {\n const ownerPrefix = normalizedBasePath.slice(0, relsMarkerIndex);\n const relFileName = normalizedBasePath.slice(relsMarkerIndex + relsMarker.length);\n const ownerFileName = relFileName.endsWith(\".rels\")\n ? relFileName.slice(0, -\".rels\".length)\n : relFileName;\n baseDirectory = dirname(`${ownerPrefix}/${ownerFileName}`);\n }\n }\n\n const segments = [...baseDirectory.split(\"/\").filter(Boolean), ...normalizedTarget.split(\"/\").filter(Boolean)];\n const resolved: string[] = [];\n for (const segment of segments) {\n if (segment === \".\") {\n continue;\n }\n if (segment === \"..\") {\n resolved.pop();\n continue;\n }\n resolved.push(segment);\n }\n\n return resolved.join(\"/\");\n}\n\nfunction readArchiveText(archive: Record<string, Uint8Array>, path: string | null | undefined) {\n if (!path) {\n return null;\n }\n\n const entry = archive[normalizeArchivePath(path)];\n return entry ? strFromU8(entry) : null;\n}\n\nfunction parseXml(xml: string) {\n if (typeof DOMParser === \"undefined\") {\n return null;\n }\n\n try {\n return new DOMParser().parseFromString(xml, \"application/xml\");\n } catch {\n return null;\n }\n}\n\nfunction serializeXml(document: XMLDocument) {\n return new XMLSerializer().serializeToString(document);\n}\n\nfunction getLocalChildren(parent: ParentNode | null | undefined, localName: string) {\n return Array.from(parent?.childNodes ?? []).filter(\n (node): node is Element => node.nodeType === Node.ELEMENT_NODE && (node as Element).localName === localName\n );\n}\n\nfunction removeLocalChildren(parent: ParentNode, localName: string) {\n getLocalChildren(parent, localName).forEach((node) => node.parentNode?.removeChild(node));\n}\n\nfunction getLocalDescendants(parent: ParentNode | null | undefined, localName: string) {\n return Array.from((parent as Element | Document | null | undefined)?.getElementsByTagName(\"*\") ?? []).filter(\n (node) => node.localName === localName\n );\n}\n\nfunction getFirstLocalChild(parent: ParentNode | null | undefined, localName: string) {\n return getLocalChildren(parent, localName)[0] ?? null;\n}\n\nfunction getFirstLocalDescendant(parent: ParentNode | null | undefined, localName: string) {\n return getLocalDescendants(parent, localName)[0] ?? null;\n}\n\nfunction ensureChild(parent: Element, localName: string, namespace = parent.namespaceURI ?? CHART_NS, prefix = \"c\") {\n const existing = getFirstLocalChild(parent, localName);\n if (existing) {\n return existing;\n }\n\n const document = parent.ownerDocument;\n const node = document.createElementNS(namespace, `${prefix}:${localName}`);\n parent.appendChild(node);\n return node;\n}\n\nfunction setLeafValue(parent: Element, localName: string, value: string, namespace = parent.namespaceURI ?? CHART_NS, prefix = \"c\") {\n const node = ensureChild(parent, localName, namespace, prefix);\n node.textContent = value;\n return node;\n}\n\nfunction setBooleanValue(parent: Element, localName: string, value: boolean) {\n const node = ensureChild(parent, localName);\n node.setAttribute(\"val\", value ? \"1\" : \"0\");\n return node;\n}\n\nfunction setNumericValue(parent: Element, localName: string, value: number) {\n const node = ensureChild(parent, localName);\n node.setAttribute(\"val\", String(Math.round(value)));\n return node;\n}\n\nfunction unquoteSheetName(value: string) {\n const trimmed = value.trim();\n if (trimmed.startsWith(\"'\") && trimmed.endsWith(\"'\")) {\n return trimmed.slice(1, -1).replace(/''/g, \"'\");\n }\n return trimmed;\n}\n\nfunction splitSheetReference(reference: string) {\n let bangIndex = -1;\n let quoted = false;\n for (let index = 0; index < reference.length; index += 1) {\n const char = reference[index];\n if (char === \"'\") {\n quoted = !quoted;\n } else if (char === \"!\" && !quoted) {\n bangIndex = index;\n break;\n }\n }\n\n if (bangIndex < 0) {\n return null;\n }\n\n return {\n range: reference.slice(bangIndex + 1),\n sheetName: unquoteSheetName(reference.slice(0, bangIndex))\n };\n}\n\nfunction parseA1Cell(reference: string) {\n const match = /^\\$?([A-Z]+)\\$?(\\d+)$/i.exec(reference.trim());\n if (!match) {\n return null;\n }\n\n let col = 0;\n for (const char of match[1].toUpperCase()) {\n col = col * 26 + (char.charCodeAt(0) - 64);\n }\n\n return {\n col: col - 1,\n row: Number(match[2]) - 1\n };\n}\n\nfunction parseA1Range(reference: string) {\n const [startRef, endRef = startRef] = reference.split(\":\");\n const start = parseA1Cell(startRef ?? \"\");\n const end = parseA1Cell(endRef ?? \"\");\n if (!start || !end) {\n return null;\n }\n\n return {\n end: {\n col: Math.max(start.col, end.col),\n row: Math.max(start.row, end.row)\n },\n start: {\n col: Math.min(start.col, end.col),\n row: Math.min(start.row, end.row)\n }\n };\n}\n\nfunction formatA1Column(col: number) {\n let current = col + 1;\n let label = \"\";\n while (current > 0) {\n const remainder = (current - 1) % 26;\n label = String.fromCharCode(65 + remainder) + label;\n current = Math.floor((current - 1) / 26);\n }\n return label;\n}\n\nfunction buildA1RangeFormula(sheetName: string, start: { col: number; row: number }, end: { col: number; row: number }) {\n const escapedSheetName = sheetName.replace(/'/g, \"''\");\n return `'${escapedSheetName}'!$${formatA1Column(start.col)}$${start.row + 1}:$${formatA1Column(end.col)}$${end.row + 1}`;\n}\n\nfunction resolveReferenceSheet(workbook: Workbook, fallbackSheetIndex: number, formula?: string | null) {\n if (!formula) {\n return {\n range: null,\n sheet: workbook.getSheet(fallbackSheetIndex),\n sheetName: workbook.getSheet(fallbackSheetIndex)?.name ?? \"\"\n };\n }\n\n const trimmedFormula = formula.trim();\n if (trimmedFormula.length > 0 && !trimmedFormula.includes(\"!\")) {\n try {\n const namedRange = workbook.getNamedRange(trimmedFormula);\n if (typeof namedRange === \"string\" && namedRange.length > 0 && namedRange !== trimmedFormula) {\n return resolveReferenceSheet(workbook, fallbackSheetIndex, namedRange);\n }\n } catch {\n // Fall back to direct A1 parsing when the workbook has no matching name.\n }\n }\n\n const split = splitSheetReference(trimmedFormula);\n if (!split) {\n return {\n range: parseA1Range(trimmedFormula),\n sheet: workbook.getSheet(fallbackSheetIndex),\n sheetName: workbook.getSheet(fallbackSheetIndex)?.name ?? \"\"\n };\n }\n\n try {\n return {\n range: parseA1Range(split.range),\n sheet: workbook.getSheetByName(split.sheetName),\n sheetName: split.sheetName\n };\n } catch {\n return {\n range: parseA1Range(split.range),\n sheet: workbook.getSheet(fallbackSheetIndex),\n sheetName: workbook.getSheet(fallbackSheetIndex)?.name ?? \"\"\n };\n }\n}\n\nfunction resolveChartReferenceLabel(\n workbook: Workbook,\n fallbackSheetIndex: number,\n reference: XlsxChartReference | null | undefined,\n fallbackLabel: string\n) {\n if (!reference?.formula) {\n return fallbackLabel;\n }\n\n const resolved = resolveReferenceSheet(workbook, fallbackSheetIndex, reference.formula);\n if (!resolved.sheet || !resolved.range) {\n return fallbackLabel;\n }\n\n const { start } = resolved.range;\n if (start.row > 0) {\n const headerDisplay = cellValueToDisplay(\n typeof resolved.sheet.getFormattedValueAt === \"function\"\n ? resolved.sheet.getFormattedValueAt(start.row - 1, start.col)\n : null\n );\n if (headerDisplay.length > 0) {\n return headerDisplay;\n }\n }\n\n const firstDisplay = cellValueToDisplay(\n typeof resolved.sheet.getFormattedValueAt === \"function\"\n ? resolved.sheet.getFormattedValueAt(start.row, start.col)\n : null\n );\n return firstDisplay.length > 0 ? firstDisplay : fallbackLabel;\n}\n\nfunction resolveReferenceRowPaths(\n workbook: Workbook,\n fallbackSheetIndex: number,\n reference: XlsxChartReference | null | undefined\n) {\n if (!reference?.formula) {\n return [] as string[][];\n }\n\n const resolved = resolveReferenceSheet(workbook, fallbackSheetIndex, reference.formula);\n if (!resolved.sheet || !resolved.range) {\n return [];\n }\n\n const rows: string[][] = [];\n for (let row = resolved.range.start.row; row <= resolved.range.end.row; row += 1) {\n const parts: string[] = [];\n for (let col = resolved.range.start.col; col <= resolved.range.end.col; col += 1) {\n const calculated = typeof resolved.sheet.getCalculatedValueAt === \"function\"\n ? resolved.sheet.getCalculatedValueAt(row, col)\n : null;\n const formatted = typeof resolved.sheet.getFormattedValueAt === \"function\"\n ? resolved.sheet.getFormattedValueAt(row, col)\n : calculated;\n const display = cellValueToDisplay(formatted ?? calculated);\n const numeric = cellValueToNumber(calculated ?? formatted);\n const label = display.length > 0 ? display : (numeric != null ? String(numeric) : \"\");\n if (label.length > 0) {\n parts.push(label);\n }\n }\n rows.push(parts);\n }\n return rows;\n}\n\nfunction normalizeChartExLegend(raw: unknown): XlsxChartLegend | null {\n if (!raw || typeof raw !== \"object\") {\n return null;\n }\n\n const legend = raw as Record<string, unknown>;\n const position = typeof legend.position === \"string\"\n ? normalizeLegendPosition(String(legend.position))\n : undefined;\n return {\n overlay: typeof legend.overlay === \"boolean\" ? legend.overlay : undefined,\n position,\n raw: legend\n };\n}\n\nfunction humanizeChartExLayoutLabel(layout: string | undefined) {\n if (!layout) {\n return undefined;\n }\n return layout\n .replace(/([a-z0-9])([A-Z])/g, \"$1 $2\")\n .replace(/[-_]+/g, \" \")\n .trim()\n .replace(/\\b\\w/g, (match) => match.toUpperCase());\n}\n\nfunction normalizeChartExAxis(raw: unknown): XlsxChartAxis | null {\n if (!raw || typeof raw !== \"object\") {\n return null;\n }\n\n const axis = raw as Record<string, unknown>;\n const scaling = axis.scaling && typeof axis.scaling === \"object\"\n ? axis.scaling as Record<string, unknown>\n : null;\n const numberFormat = axis.numberFormat && typeof axis.numberFormat === \"object\"\n ? axis.numberFormat as Record<string, unknown>\n : null;\n\n return {\n delete: typeof axis.hidden === \"boolean\" ? axis.hidden : undefined,\n id: typeof axis.id === \"number\" && Number.isFinite(axis.id) ? axis.id : undefined,\n crossId: typeof axis.crossId === \"number\" && Number.isFinite(axis.crossId) ? axis.crossId : undefined,\n majorGridlines: axis.majorGridlines != null ? true : undefined,\n majorUnit: typeof scaling?.majorUnit === \"number\" ? scaling.majorUnit : undefined,\n max: typeof scaling?.max === \"number\" ? scaling.max : undefined,\n min: typeof scaling?.min === \"number\" ? scaling.min : undefined,\n minorGridlines: axis.minorGridlines != null ? true : undefined,\n minorUnit: typeof scaling?.minorUnit === \"number\" ? scaling.minorUnit : undefined,\n numberFormat: numberFormat\n ? {\n formatCode: typeof numberFormat.formatCode === \"string\" ? numberFormat.formatCode : undefined,\n sourceLinked: typeof numberFormat.sourceLinked === \"boolean\" ? numberFormat.sourceLinked : undefined\n }\n : undefined,\n raw: axis,\n position: typeof axis.position === \"string\" ? axis.position : undefined,\n tickLabelSkip: typeof axis.tickLabelSkip === \"number\" ? axis.tickLabelSkip : undefined,\n tickMarkSkip: typeof axis.tickMarkSkip === \"number\" ? axis.tickMarkSkip : undefined\n };\n}\n\nfunction resolveChartExLayoutChartType(layout: string | undefined) {\n switch (layout) {\n case \"boxWhisker\":\n return \"BoxWhisker\";\n case \"clusteredColumn\":\n return \"ColumnClustered\";\n case \"funnel\":\n return \"Funnel\";\n case \"paretoLine\":\n return \"Line\";\n case \"regionMap\":\n return \"RegionMap\";\n case \"sunburst\":\n return \"Sunburst\";\n case \"treemap\":\n return \"Treemap\";\n case \"waterfall\":\n return \"Waterfall\";\n default:\n return layout ? `Unsupported(cx:${layout})` : \"ColumnClustered\";\n }\n}\n\nfunction resolveChartExSeriesLayout(raw: unknown) {\n if (!raw || typeof raw !== \"object\") {\n return undefined;\n }\n const record = raw as Record<string, unknown>;\n return typeof record.layout === \"string\"\n ? record.layout\n : typeof record.layoutId === \"string\"\n ? record.layoutId\n : undefined;\n}\n\nfunction resolveChartExSeriesAxisIds(raw: unknown) {\n if (!raw || typeof raw !== \"object\") {\n return [];\n }\n const record = raw as Record<string, unknown>;\n if (Array.isArray(record.axisIds)) {\n return record.axisIds.filter((value): value is number => typeof value === \"number\" && Number.isFinite(value));\n }\n if (Array.isArray(record.axisId)) {\n return record.axisId.flatMap((value) => {\n if (typeof value === \"number\" && Number.isFinite(value)) {\n return [value];\n }\n if (value && typeof value === \"object\" && typeof (value as { val?: unknown }).val === \"number\") {\n return [(value as { val: number }).val];\n }\n return [];\n });\n }\n if (typeof record.axisId === \"number\" && Number.isFinite(record.axisId)) {\n return [record.axisId];\n }\n return [];\n}\n\nfunction niceHistogramStep(value: number) {\n if (!Number.isFinite(value) || value <= 0) {\n return 1;\n }\n const exponent = Math.floor(Math.log10(value));\n const scale = 10 ** exponent;\n const normalized = value / scale;\n if (normalized <= 1) {\n return scale;\n }\n if (normalized <= 2) {\n return scale * 2;\n }\n if (normalized <= 5) {\n return scale * 5;\n }\n return scale * 10;\n}\n\nfunction formatHistogramBinLabel(lower: number, upper: number, index: number, closedRight: boolean) {\n const leftBracket = closedRight\n ? (index === 0 ? \"[\" : \"(\")\n : \"[\";\n const rightBracket = closedRight ? \"]\" : \")\";\n return `${leftBracket}${Number(lower.toFixed(6))},${Number(upper.toFixed(6))}${rightBracket}`;\n}\n\ntype ChartExHistogramBin = {\n count: number;\n label: string;\n lower: number;\n upper: number;\n};\n\nfunction buildChartExHistogramBins(values: number[], rawSeries: unknown, sortByFrequency: boolean) {\n if (values.length === 0) {\n return [] as ChartExHistogramBin[];\n }\n\n const rawRecord = rawSeries && typeof rawSeries === \"object\" ? rawSeries as Record<string, unknown> : null;\n const layoutProperties = rawRecord?.layoutProperties && typeof rawRecord.layoutProperties === \"object\"\n ? rawRecord.layoutProperties as Record<string, unknown>\n : null;\n const rawBinning = layoutProperties?.binning && typeof layoutProperties.binning === \"object\"\n ? layoutProperties.binning as Record<string, unknown>\n : null;\n const minValue = Math.min(...values);\n const maxValue = Math.max(...values);\n const explicitWidth = typeof rawBinning?.binSize === \"number\" && Number.isFinite(rawBinning.binSize) && rawBinning.binSize > 0\n ? rawBinning.binSize\n : undefined;\n const explicitCount = typeof rawBinning?.binCount === \"number\" && Number.isFinite(rawBinning.binCount) && rawBinning.binCount > 0\n ? rawBinning.binCount\n : typeof rawBinning?.count === \"number\" && Number.isFinite(rawBinning.count) && rawBinning.count > 0\n ? rawBinning.count\n : undefined;\n const closedRight = rawBinning?.intervalClosed === \"r\" || rawBinning?.intervalClosed === \"right\";\n const mean = values.reduce((sum, value) => sum + value, 0) / values.length;\n const variance = values.reduce((sum, value) => sum + ((value - mean) ** 2), 0) / Math.max(1, values.length);\n const standardDeviation = Math.sqrt(Math.max(0, variance));\n const allIntegers = values.every((value) => Math.abs(value - Math.round(value)) < 1e-9);\n const scottWidth = standardDeviation > 0\n ? (3.49 * standardDeviation) / Math.cbrt(values.length)\n : undefined;\n const fallbackWidth = explicitCount != null\n ? (maxValue - minValue) / Math.max(1, explicitCount)\n : scottWidth ?? ((maxValue - minValue) / Math.max(1, Math.ceil(Math.log2(values.length) + 1)));\n const roughWidth = explicitWidth\n ?? (allIntegers\n ? Math.max(1, Math.ceil(Math.max(fallbackWidth, 1e-6)))\n : niceHistogramStep(Math.max(fallbackWidth, 1e-6)));\n const binWidth = Math.max(roughWidth, 1e-6);\n const start = explicitWidth != null || explicitCount != null\n ? Math.floor(minValue / binWidth) * binWidth\n : minValue;\n const end = Math.max(start + binWidth, start + Math.ceil((maxValue - start) / binWidth) * binWidth);\n const binCount = Math.max(1, Math.ceil((end - start) / binWidth));\n const bins = Array.from({ length: binCount }, (_, index) => {\n const lower = start + binWidth * index;\n const upper = lower + binWidth;\n return {\n count: 0,\n label: formatHistogramBinLabel(lower, upper, index, closedRight),\n lower,\n upper\n } satisfies ChartExHistogramBin;\n });\n\n values.forEach((value) => {\n if (!Number.isFinite(value)) {\n return;\n }\n const offset = (value - start) / binWidth;\n let binIndex = Math.floor(offset);\n if (closedRight && Math.abs(offset - Math.round(offset)) < 1e-9 && value > start) {\n binIndex -= 1;\n }\n if (value >= end) {\n binIndex = bins.length - 1;\n }\n if (value <= start) {\n binIndex = 0;\n }\n const target = bins[Math.max(0, Math.min(bins.length - 1, binIndex))];\n if (target) {\n target.count += 1;\n }\n });\n\n if (sortByFrequency) {\n bins.sort((left, right) => (\n right.count - left.count\n || left.lower - right.lower\n ));\n }\n return bins;\n}\n\nfunction buildChartExHistogramSeries(\n series: XlsxChartSeries,\n rawSeries: unknown,\n sortByFrequency: boolean\n) {\n const layout = resolveChartExSeriesLayout(rawSeries);\n const rawRecord = rawSeries && typeof rawSeries === \"object\" ? rawSeries as Record<string, unknown> : null;\n const hasBinning = Boolean(\n layout === \"clusteredColumn\"\n && rawRecord?.layoutProperties\n && typeof rawRecord.layoutProperties === \"object\"\n && (rawRecord.layoutProperties as Record<string, unknown>).binning != null\n );\n if (!hasBinning) {\n return series;\n }\n\n const numericValues = series.values.filter((value): value is number => typeof value === \"number\" && Number.isFinite(value));\n if (numericValues.length === 0) {\n return series;\n }\n\n const bins = buildChartExHistogramBins(numericValues, rawSeries, sortByFrequency);\n if (bins.length === 0) {\n return series;\n }\n\n return {\n ...series,\n categories: bins.map((bin) => bin.label),\n categoriesRef: null,\n raw: {\n ...series.raw,\n chartExHistogramBins: bins,\n chartExSourceValues: numericValues\n },\n values: bins.map((bin) => bin.count)\n };\n}\n\nfunction buildChartExParetoLineSeries(series: XlsxChartSeries, sourceRaw: unknown, index: number) {\n const counts = series.values.map((value) => (\n typeof value === \"number\" && Number.isFinite(value) ? value : 0\n ));\n const total = counts.reduce((sum, value) => sum + value, 0);\n let running = 0;\n const cumulative = counts.map((value) => {\n running += value;\n return total > 0 ? (running / total) * 100 : 0;\n });\n return {\n ...series,\n color: undefined,\n lineColor: undefined,\n markerColor: undefined,\n markerLineColor: undefined,\n markerSize: 7,\n markerSymbol: \"circle\",\n name: typeof (sourceRaw as { text?: unknown } | null)?.text === \"string\"\n ? (sourceRaw as { text: string }).text\n : \"Pareto\",\n raw: {\n ...(series.raw ?? {}),\n chartExLayout: \"paretoLine\",\n source: sourceRaw && typeof sourceRaw === \"object\" ? sourceRaw as Record<string, unknown> : undefined\n },\n values: cumulative\n };\n}\n\nfunction resolveChartExTextFormula(raw: unknown) {\n if (typeof raw === \"string\" && raw.length > 0) {\n return raw;\n }\n if (!raw || typeof raw !== \"object\") {\n return undefined;\n }\n const record = raw as Record<string, unknown>;\n if (typeof record.formula === \"string\" && record.formula.length > 0) {\n return record.formula;\n }\n if (typeof record.text === \"string\" && record.text.length > 0) {\n return record.text;\n }\n if (typeof record.value === \"string\" && record.value.length > 0) {\n return record.value;\n }\n return undefined;\n}\n\nfunction resolveChartExTitleText(raw: unknown) {\n if (typeof raw === \"string\" && raw.length > 0) {\n return raw;\n }\n if (!raw || typeof raw !== \"object\") {\n return undefined;\n }\n const record = raw as Record<string, unknown>;\n if (typeof record.text === \"string\" && record.text.length > 0) {\n return record.text;\n }\n const nestedText = record.text && typeof record.text === \"object\"\n ? resolveChartExTextFormula(record.text)\n : undefined;\n if (nestedText) {\n return nestedText;\n }\n return typeof record.value === \"string\" && record.value.length > 0 ? record.value : undefined;\n}\n\nfunction resolveChartExFallbackCategoryReference(\n workbook: Workbook,\n fallbackSheetIndex: number,\n valueFormula: string | undefined\n) {\n if (!valueFormula) {\n return null;\n }\n\n const resolved = resolveReferenceSheet(workbook, fallbackSheetIndex, valueFormula);\n if (!resolved.sheet || !resolved.range || resolved.range.start.col <= 0) {\n return null;\n }\n\n return normalizeChartReference({\n formula: buildA1RangeFormula(\n resolved.sheetName,\n {\n col: resolved.range.start.col - 1,\n row: resolved.range.start.row\n },\n {\n col: resolved.range.start.col - 1,\n row: resolved.range.end.row\n }\n )\n });\n}\n\nfunction normalizeChartExSeries(\n workbook: Workbook,\n workbookSheetIndex: number,\n chartId: string,\n raw: unknown,\n dataById: Map<number, Record<string, unknown>>,\n index: number,\n chartType?: XlsxChart[\"chartType\"]\n): XlsxChartSeries {\n const series = raw && typeof raw === \"object\" ? raw as Record<string, unknown> : {};\n const dataId = typeof series.dataId === \"number\" ? series.dataId : null;\n const dataEntry = dataId != null ? dataById.get(dataId) ?? null : null;\n const dimensions = Array.isArray(dataEntry?.dimensions)\n ? dataEntry.dimensions.filter((value): value is Record<string, unknown> => Boolean(value && typeof value === \"object\"))\n : [];\n const categoryDimension = dimensions.find((dimension) => dimension.dimType === \"cat\")\n ?? dimensions.find((dimension) => dimension.dimType === \"name\")\n ?? null;\n const valueDimension = dimensions.find((dimension) => (\n dimension.dimType === \"val\"\n || dimension.dimType === \"y\"\n || dimension.dimType === \"colorVal\"\n || dimension.dimType === \"size\"\n ))\n ?? dimensions.find((dimension) => dimension !== categoryDimension)\n ?? categoryDimension;\n const categoryDimensionFormula = typeof categoryDimension?.formula === \"string\" ? categoryDimension.formula : undefined;\n const valueDimensionFormula = typeof valueDimension?.formula === \"string\" ? valueDimension.formula : undefined;\n const fallbackCategoryRef = (\n (chartType === \"Sunburst\" || chartType === \"Treemap\")\n && !categoryDimension\n && typeof valueDimensionFormula === \"string\"\n )\n ? resolveChartExFallbackCategoryReference(workbook, workbookSheetIndex, valueDimensionFormula)\n : null;\n const categoriesRef = categoryDimension\n ? normalizeChartReference({\n formula: categoryDimensionFormula\n })\n : fallbackCategoryRef;\n const valuesRef = valueDimension\n ? normalizeChartReference({\n formula: valueDimensionFormula\n })\n : null;\n const isCategoricalMap = chartType === \"RegionMap\" && valueDimension?.dimType === \"colorStr\";\n const resolvedValueCells = resolveReferenceValues(workbook, workbookSheetIndex, valuesRef, isCategoricalMap ? \"category\" : \"value\");\n const values = resolvedValueCells.map((value) => (\n typeof value === \"number\" && Number.isFinite(value) ? value : null\n ));\n const colorStrings = isCategoricalMap\n ? resolvedValueCells.map((value) => {\n if (typeof value === \"string\") {\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : null;\n }\n if (typeof value === \"number\" && Number.isFinite(value)) {\n return String(value);\n }\n return null;\n })\n : [];\n const categoryRows = chartType === \"RegionMap\"\n ? resolveReferenceRowPaths(workbook, workbookSheetIndex, categoriesRef)\n : [];\n const categories = categoryRows.length === resolvedValueCells.length && categoryRows.length > 0\n ? categoryRows.map((parts) => parts[0] ?? \"\")\n : resolveReferenceValues(workbook, workbookSheetIndex, categoriesRef, \"category\");\n const hierarchyCategories = (\n chartType === \"Sunburst\" || chartType === \"Treemap\"\n )\n ? resolveReferenceRowPaths(workbook, workbookSheetIndex, categoriesRef)\n : [];\n const seriesTextFormula = resolveChartExTextFormula(series.text);\n const shapeProperties = series.shapeProperties && typeof series.shapeProperties === \"object\"\n ? series.shapeProperties as Record<string, unknown>\n : undefined;\n const rawFillColor = typeof shapeProperties?.solidFillHex === \"string\"\n ? normalizeHexColor(shapeProperties.solidFillHex)\n : null;\n const rawLineColor = typeof shapeProperties?.lineColorHex === \"string\"\n ? normalizeHexColor(shapeProperties.lineColorHex)\n : null;\n\n return {\n bubbleSizeRef: null,\n bubbleSizes: [],\n categories,\n categoriesRef,\n color: rawFillColor ?? undefined,\n dataPoints: Array.isArray(series.dataPoints) ? series.dataPoints : [],\n dataPointStyles: undefined,\n formatIdx: typeof series.formatIdx === \"number\" ? series.formatIdx : undefined,\n hidden: typeof series.hidden === \"boolean\" ? series.hidden : undefined,\n id: `${chartId}-series-${index}`,\n invertIfNegative: undefined,\n lineColor: rawLineColor ?? rawFillColor ?? undefined,\n lineWidthPx: typeof shapeProperties?.lineWidth === \"number\"\n ? Math.max(1, Number(shapeProperties.lineWidth) / EMU_PER_PIXEL)\n : undefined,\n marker: undefined,\n markerColor: rawFillColor ?? undefined,\n markerLineColor: rawLineColor ?? rawFillColor ?? undefined,\n markerSize: undefined,\n markerSymbol: undefined,\n name: typeof series.text === \"string\"\n ? series.text\n : seriesTextFormula\n ? resolveSeriesName(workbook, workbookSheetIndex, seriesTextFormula)\n : resolveChartReferenceLabel(workbook, workbookSheetIndex, valuesRef, `Series ${index + 1}`),\n negativeColor: undefined,\n negativeLineColor: undefined,\n raw: {\n ...series,\n chartExColorStrings: colorStrings,\n chartExHierarchyCategories: hierarchyCategories,\n data: dataEntry,\n dimType: typeof valueDimension?.dimType === \"string\" ? valueDimension.dimType : undefined\n },\n shapeProperties,\n smooth: undefined,\n values,\n valuesRef\n };\n}\n\nfunction collapseChartExPointSeries(chartType: XlsxChart[\"chartType\"], series: XlsxChartSeries[]) {\n if (chartType !== \"Funnel\" && chartType !== \"Waterfall\") {\n if (\n (chartType === \"Sunburst\" || chartType === \"Treemap\")\n && series.length > 1\n && series.every((entry) => {\n const raw = entry.raw && typeof entry.raw === \"object\" ? entry.raw as Record<string, unknown> : null;\n return raw?.dimType === \"size\";\n })\n ) {\n const primarySeries = series.find((entry) => entry.hidden !== true) ?? series[0] ?? null;\n if (!primarySeries) {\n return series;\n }\n return [\n {\n ...primarySeries,\n dataPoints: [],\n hidden: false\n }\n ];\n }\n return series;\n }\n\n const primarySeries = series.find((entry) => entry.hidden !== true) ?? series[0] ?? null;\n if (!primarySeries) {\n return series;\n }\n\n return [\n {\n ...primarySeries,\n categories: [],\n categoriesRef: null,\n dataPoints: [],\n hidden: false\n }\n ];\n}\n\nfunction normalizeChartExChart(\n workbook: Workbook,\n workbookSheetIndex: number,\n visibleSheetIndex: number,\n raw: unknown,\n index: number,\n themePalette?: XlsxThemePalette | null\n): XlsxChart {\n const drawing = raw && typeof raw === \"object\" ? raw as Record<string, unknown> : {};\n const chart = drawing.chartEx && typeof drawing.chartEx === \"object\"\n ? drawing.chartEx as Record<string, unknown>\n : {};\n const plotArea = chart.plotArea && typeof chart.plotArea === \"object\"\n ? chart.plotArea as Record<string, unknown>\n : {};\n const rawSeries = Array.isArray(plotArea.series) ? plotArea.series : [];\n const seriesLayouts = rawSeries.map(resolveChartExSeriesLayout);\n const dataEntries = Array.isArray(chart.data) ? chart.data : [];\n const dataById = new Map<number, Record<string, unknown>>();\n dataEntries.forEach((entry) => {\n if (!entry || typeof entry !== \"object\") {\n return;\n }\n const record = entry as Record<string, unknown>;\n if (typeof record.id === \"number\") {\n dataById.set(record.id, record);\n }\n });\n const axes = Array.isArray(plotArea.axes)\n ? plotArea.axes.map(normalizeChartExAxis).filter((value): value is XlsxChartAxis => Boolean(value))\n : [];\n const primaryLayout = typeof chart.layout === \"string\"\n ? chart.layout\n : seriesLayouts.find((value): value is string => typeof value === \"string\" && value.length > 0);\n const fallbackTitle = humanizeChartExLayoutLabel(primaryLayout);\n const chartTitle = resolveChartExTitleText(chart.title) ?? (chart.title != null ? \"Chart Title\" : fallbackTitle);\n const chartType = resolveChartExLayoutChartType(primaryLayout);\n const normalizedSeries = rawSeries.map((entry, seriesIndex) => (\n normalizeChartExSeries(workbook, workbookSheetIndex, `chart-ex-${workbookSheetIndex}-${index}`, entry, dataById, seriesIndex, chartType)\n ));\n const clusteredColumnSeriesIndex = seriesLayouts.findIndex((layout) => layout === \"clusteredColumn\");\n const hasParetoLine = seriesLayouts.includes(\"paretoLine\");\n const clusteredColumnAxisIds = clusteredColumnSeriesIndex >= 0\n ? resolveChartExSeriesAxisIds(rawSeries[clusteredColumnSeriesIndex])\n : [];\n const paretoLineSeriesIndex = seriesLayouts.findIndex((layout) => layout === \"paretoLine\");\n const paretoLineAxisIds = paretoLineSeriesIndex >= 0\n ? resolveChartExSeriesAxisIds(rawSeries[paretoLineSeriesIndex])\n : [];\n const primaryHistogramSeries = clusteredColumnSeriesIndex >= 0\n ? buildChartExHistogramSeries(normalizedSeries[clusteredColumnSeriesIndex] ?? normalizedSeries[0], rawSeries[clusteredColumnSeriesIndex], hasParetoLine)\n : null;\n const synthesizedParetoSeries = (\n hasParetoLine\n && primaryHistogramSeries\n && primaryHistogramSeries.values.length > 0\n )\n ? buildChartExParetoLineSeries(primaryHistogramSeries, rawSeries[paretoLineSeriesIndex], paretoLineSeriesIndex)\n : null;\n const resolvedSeries = synthesizedParetoSeries\n ? [primaryHistogramSeries!, synthesizedParetoSeries]\n : primaryHistogramSeries\n ? [\n primaryHistogramSeries,\n ...normalizedSeries.filter((_, seriesIndex) => seriesIndex !== clusteredColumnSeriesIndex)\n ]\n : collapseChartExPointSeries(chartType, normalizedSeries);\n const resolvedChartType = primaryHistogramSeries ? \"ColumnClustered\" : chartType;\n const resolvedGapWidth = primaryHistogramSeries ? 0 : undefined;\n const typeGroups = synthesizedParetoSeries\n ? [\n {\n axisIds: clusteredColumnAxisIds,\n chartType: \"ColumnClustered\",\n gapWidth: 0,\n raw: {\n gapWidth: 0,\n layout: \"clusteredColumn\"\n },\n series: [primaryHistogramSeries!]\n },\n {\n axisIds: paretoLineAxisIds,\n chartType: \"Line\",\n raw: {\n layout: \"paretoLine\"\n },\n series: [synthesizedParetoSeries]\n }\n ]\n : [];\n const normalizedChart: XlsxChart = {\n anchor: normalizeChartAnchor(drawing.anchor),\n autoTitleDeleted: undefined,\n axes,\n axisLabelColor: undefined,\n axisLineColor: undefined,\n categoryAxis: axes[0] ?? null,\n chartAreaBorderColor: undefined,\n chartAreaFillColor: undefined,\n chartColorPalette: undefined,\n chartColorPaletteOffset: undefined,\n chartExLayout: primaryLayout,\n chartPath: undefined,\n chartStyleId: undefined,\n chartType: resolvedChartType,\n dataLabels: rawSeries.length > 0 && rawSeries[0] && typeof rawSeries[0] === \"object\"\n ? normalizeChartDataLabels((rawSeries[0] as Record<string, unknown>).dataLabels)\n : null,\n displayBlanksAs: undefined,\n editable: true,\n firstSliceAngle: undefined,\n fontFamily: undefined,\n gapWidth: resolvedGapWidth,\n holeSize: undefined,\n id: `chart-ex-${workbookSheetIndex}-${index}`,\n is3d: undefined,\n legend: normalizeChartExLegend(chart.legend),\n name: typeof drawing.name === \"string\" ? drawing.name : chartTitle,\n overlap: undefined,\n plotVisibleOnly: undefined,\n raw: chart,\n radarStyle: undefined,\n scatterStyle: undefined,\n roundedCorners: undefined,\n shape3d: undefined,\n seriesAxis: null,\n series: resolvedSeries,\n sheetIndex: visibleSheetIndex,\n showDlblsOverMax: undefined,\n sideWall: null,\n backWall: null,\n bubbleScale: undefined,\n bubble3d: undefined,\n floor: null,\n surfaceMaterial: undefined,\n textColor: undefined,\n title: chartTitle,\n titleColor: undefined,\n titleFontFamily: undefined,\n typeGroups,\n valueAxis: axes.find((axis) => axis.numberFormat || axis.majorGridlines) ?? axes[1] ?? null,\n varyColors: typeof chart.valueColors === \"boolean\" ? chart.valueColors : undefined,\n view3d: undefined,\n wireframe: undefined,\n workbookSheetIndex,\n zIndex: Array.isArray(drawing.drawingPath) && typeof drawing.drawingPath[0] === \"number\"\n ? drawing.drawingPath[0] + 1\n : index + 1\n };\n\n applyBuiltinChartDefaults(normalizedChart, themePalette);\n return normalizedChart;\n}\n\nfunction cellValueToNumber(value: unknown) {\n if (typeof value === \"number\" && Number.isFinite(value)) {\n return value;\n }\n if (value && typeof value === \"object\") {\n if ((value as { is_empty?: boolean }).is_empty) {\n return null;\n }\n const candidates: unknown[] = [];\n if (typeof (value as { asNumber?: () => unknown }).asNumber === \"function\") {\n candidates.push((value as { asNumber: () => unknown }).asNumber());\n }\n if (typeof (value as { toJs?: () => unknown }).toJs === \"function\") {\n candidates.push((value as { toJs: () => unknown }).toJs());\n }\n if (typeof (value as { asText?: () => unknown }).asText === \"function\") {\n candidates.push((value as { asText: () => unknown }).asText());\n }\n if (typeof (value as { toString?: () => unknown }).toString === \"function\") {\n candidates.push((value as { toString: () => unknown }).toString());\n }\n\n for (const candidate of candidates) {\n if (typeof candidate === \"number\" && Number.isFinite(candidate)) {\n return candidate;\n }\n if (typeof candidate === \"string\") {\n const parsed = Number(candidate.replace(/,/g, \"\"));\n if (Number.isFinite(parsed)) {\n return parsed;\n }\n }\n }\n }\n if (typeof value === \"string\") {\n const parsed = Number(value.replace(/,/g, \"\"));\n return Number.isFinite(parsed) ? parsed : null;\n }\n return null;\n}\n\nfunction cellValueToDisplay(value: unknown) {\n if (value === null || value === undefined) {\n return \"\";\n }\n if (typeof value === \"string\") {\n return value;\n }\n if (typeof value === \"number\" || typeof value === \"boolean\") {\n return String(value);\n }\n if (value && typeof value === \"object\") {\n if ((value as { is_empty?: boolean }).is_empty) {\n return \"\";\n }\n const candidates: unknown[] = [];\n if (typeof (value as { asText?: () => unknown }).asText === \"function\") {\n candidates.push((value as { asText: () => unknown }).asText());\n }\n if (typeof (value as { toJs?: () => unknown }).toJs === \"function\") {\n candidates.push((value as { toJs: () => unknown }).toJs());\n }\n if (typeof (value as { toString?: () => unknown }).toString === \"function\") {\n candidates.push((value as { toString: () => unknown }).toString());\n }\n\n for (const candidate of candidates) {\n if (candidate === null || candidate === undefined) {\n continue;\n }\n if (typeof candidate === \"string\") {\n return candidate;\n }\n return String(candidate);\n }\n }\n return String(value);\n}\n\nfunction resolveReferenceValues(\n workbook: Workbook,\n fallbackSheetIndex: number,\n reference: XlsxChartReference | null | undefined,\n mode: \"category\" | \"value\"\n): Array<number | string | null> {\n if (!reference?.formula) {\n return reference?.values ?? [];\n }\n\n const resolved = resolveReferenceSheet(workbook, fallbackSheetIndex, reference.formula);\n if (!resolved.sheet || !resolved.range) {\n return reference.values ?? [];\n }\n\n const values: Array<number | string | null> = [];\n for (let row = resolved.range.start.row; row <= resolved.range.end.row; row += 1) {\n for (let col = resolved.range.start.col; col <= resolved.range.end.col; col += 1) {\n const calculated = typeof resolved.sheet.getCalculatedValueAt === \"function\"\n ? resolved.sheet.getCalculatedValueAt(row, col)\n : null;\n const formatted = typeof resolved.sheet.getFormattedValueAt === \"function\"\n ? resolved.sheet.getFormattedValueAt(row, col)\n : calculated;\n if (mode === \"value\") {\n values.push(cellValueToNumber(calculated ?? formatted));\n } else {\n const display = cellValueToDisplay(formatted ?? calculated);\n const numeric = cellValueToNumber(calculated ?? formatted);\n values.push(display.length > 0 ? display : (numeric !== null ? numeric : null));\n }\n }\n }\n\n return values;\n}\n\nfunction resolveSeriesName(workbook: Workbook, fallbackSheetIndex: number, rawName: unknown) {\n if (typeof rawName !== \"string\" || !rawName) {\n return undefined;\n }\n\n const resolved = resolveReferenceSheet(workbook, fallbackSheetIndex, rawName);\n if (!resolved.sheet || !resolved.range) {\n return rawName;\n }\n\n const value = typeof resolved.sheet.getFormattedValueAt === \"function\"\n ? resolved.sheet.getFormattedValueAt(resolved.range.start.row, resolved.range.start.col)\n : null;\n const display = cellValueToDisplay(value);\n return display || rawName;\n}\n\nfunction normalizeChartReference(raw: unknown): XlsxChartReference | null {\n if (!raw || typeof raw !== \"object\") {\n return null;\n }\n\n const record = raw as Record<string, unknown>;\n const values = Array.isArray(record.numbers)\n ? record.numbers\n : Array.isArray(record.strings)\n ? record.strings\n : undefined;\n return {\n formula: typeof record.formula === \"string\" ? record.formula : undefined,\n refType: typeof record.refType === \"string\" ? record.refType : undefined,\n values: values as Array<number | string | null> | undefined\n };\n}\n\nfunction normalizeChartAxis(raw: unknown): XlsxChartAxis | null {\n if (!raw || typeof raw !== \"object\") {\n return null;\n }\n\n const rawAxis = raw as Record<string, unknown>;\n const axis = rawAxis.axis && typeof rawAxis.axis === \"object\"\n ? rawAxis.axis as Record<string, unknown>\n : rawAxis;\n const numberFormat = axis.numberFormat && typeof axis.numberFormat === \"object\"\n ? axis.numberFormat as Record<string, unknown>\n : null;\n\n return {\n crossId: typeof rawAxis.crossId === \"number\" && Number.isFinite(rawAxis.crossId) ? rawAxis.crossId : undefined,\n crosses: typeof axis.crosses === \"string\" ? axis.crosses : undefined,\n crossBetween: typeof axis.crossBetween === \"string\" ? axis.crossBetween : undefined,\n delete: typeof axis.delete === \"boolean\" ? axis.delete : undefined,\n id: typeof rawAxis.id === \"number\" && Number.isFinite(rawAxis.id) ? rawAxis.id : undefined,\n labelPosition: typeof axis.labelPosition === \"string\" ? axis.labelPosition : undefined,\n logBase: typeof axis.logBase === \"number\" ? axis.logBase : undefined,\n orientation: typeof axis.orientation === \"string\" ? axis.orientation : undefined,\n majorUnit: typeof axis.majorUnit === \"number\" ? axis.majorUnit : undefined,\n max: typeof axis.maximum === \"number\" ? axis.maximum : undefined,\n min: typeof axis.minimum === \"number\" ? axis.minimum : undefined,\n majorGridlines: typeof axis.majorGridlines === \"boolean\" ? axis.majorGridlines : undefined,\n majorTickMark: typeof axis.majorTickMark === \"string\" ? axis.majorTickMark : undefined,\n minorUnit: typeof axis.minorUnit === \"number\" ? axis.minorUnit : undefined,\n minorGridlines: typeof axis.minorGridlines === \"boolean\" ? axis.minorGridlines : undefined,\n minorTickMark: typeof axis.minorTickMark === \"string\" ? axis.minorTickMark : undefined,\n numberFormat: numberFormat ? {\n formatCode: typeof numberFormat.formatCode === \"string\" ? numberFormat.formatCode : undefined,\n sourceLinked: typeof numberFormat.sourceLinked === \"boolean\" ? numberFormat.sourceLinked : undefined\n } : undefined,\n position: typeof axis.position === \"string\" ? axis.position : undefined,\n raw: axis,\n shapeProperties: axis.shapeProperties && typeof axis.shapeProperties === \"object\"\n ? axis.shapeProperties as Record<string, unknown>\n : undefined,\n tickLabelSkip: typeof axis.tickLabelSkip === \"number\" && Number.isFinite(axis.tickLabelSkip) ? axis.tickLabelSkip : undefined,\n tickMarkSkip: typeof axis.tickMarkSkip === \"number\" && Number.isFinite(axis.tickMarkSkip) ? axis.tickMarkSkip : undefined\n };\n}\n\nfunction mergeChartAxis(target: XlsxChartAxis | null | undefined, patch: Partial<XlsxChartAxis> | null | undefined) {\n if (!patch) {\n return target ?? null;\n }\n return {\n ...(target ?? {}),\n ...patch\n };\n}\n\nfunction readChartAxisFromXml(axisNode: Element | null, themePalette?: XlsxThemePalette | null): Partial<XlsxChartAxis> | null {\n if (!axisNode) {\n return null;\n }\n\n const numFmt = getFirstLocalChild(axisNode, \"numFmt\");\n const scalingNode = getFirstLocalChild(axisNode, \"scaling\");\n return {\n crossId: readChartNumericAttribute(axisNode, \"crossAx\"),\n crosses: getFirstLocalChild(axisNode, \"crosses\")?.getAttribute(\"val\") ?? undefined,\n crossBetween: getFirstLocalChild(axisNode, \"crossBetween\")?.getAttribute(\"val\") ?? undefined,\n delete: getFirstLocalChild(axisNode, \"delete\")?.getAttribute(\"val\") === \"1\"\n ? true\n : getFirstLocalChild(axisNode, \"delete\")?.getAttribute(\"val\") === \"0\"\n ? false\n : undefined,\n id: readChartNumericAttribute(axisNode, \"axId\"),\n labelPosition: getFirstLocalChild(axisNode, \"tickLblPos\")?.getAttribute(\"val\") ?? undefined,\n logBase: readChartNumericAttribute(getFirstLocalChild(axisNode, \"scaling\"), \"logBase\"),\n orientation: getFirstLocalChild(scalingNode ?? axisNode, \"orientation\")?.getAttribute(\"val\") ?? undefined,\n majorGridlines: Boolean(getFirstLocalChild(axisNode, \"majorGridlines\")),\n majorGridlineColor: (() => {\n const style = resolveChartLineStyle(getFirstLocalChild(getFirstLocalChild(axisNode, \"majorGridlines\"), \"spPr\"), themePalette);\n return style.hidden ? \"transparent\" : style.color ?? undefined;\n })(),\n majorTickMark: getFirstLocalChild(axisNode, \"majorTickMark\")?.getAttribute(\"val\") ?? undefined,\n majorUnit: readChartNumericAttribute(axisNode, \"majorUnit\"),\n max: readChartNumericAttribute(scalingNode, \"max\"),\n min: readChartNumericAttribute(scalingNode, \"min\"),\n minorGridlines: Boolean(getFirstLocalChild(axisNode, \"minorGridlines\")),\n minorTickMark: getFirstLocalChild(axisNode, \"minorTickMark\")?.getAttribute(\"val\") ?? undefined,\n minorUnit: readChartNumericAttribute(axisNode, \"minorUnit\"),\n numberFormat: numFmt\n ? {\n formatCode: numFmt.getAttribute(\"formatCode\") ?? undefined,\n sourceLinked: numFmt.getAttribute(\"sourceLinked\") === \"1\"\n ? true\n : numFmt.getAttribute(\"sourceLinked\") === \"0\"\n ? false\n : undefined\n }\n : undefined,\n position: getFirstLocalChild(axisNode, \"axPos\")?.getAttribute(\"val\") ?? undefined,\n tickLabelSkip: readChartNumericAttribute(axisNode, \"tickLblSkip\"),\n tickMarkSkip: readChartNumericAttribute(axisNode, \"tickMarkSkip\")\n };\n}\n\nfunction readChartWallFromXml(wallNode: Element | null, themePalette?: XlsxThemePalette | null): XlsxChartWall | null {\n if (!wallNode) {\n return null;\n }\n const shapeProperties = getFirstLocalChild(wallNode, \"spPr\");\n const lineStyle = resolveChartLineStyle(shapeProperties, themePalette);\n return {\n fillColor: resolveChartFillColor(shapeProperties, themePalette) ?? undefined,\n hidden: shapeProperties ? getFirstLocalChild(shapeProperties, \"noFill\") != null : undefined,\n lineColor: lineStyle.color ?? undefined,\n thickness: readChartNumericAttribute(wallNode, \"thickness\")\n };\n}\n\nfunction normalizeChartDataLabels(raw: unknown): XlsxChartDataLabels | null {\n if (!raw || typeof raw !== \"object\") {\n return null;\n }\n\n const labels = raw as Record<string, unknown>;\n const pointLabels = Array.isArray(labels.pointLabels)\n ? (() => {\n const normalized: XlsxChartPointDataLabel[] = [];\n for (const entry of labels.pointLabels) {\n if (!entry || typeof entry !== \"object\") {\n continue;\n }\n const point = entry as Record<string, unknown>;\n const index = typeof point.index === \"number\" && Number.isFinite(point.index)\n ? point.index\n : null;\n if (index == null) {\n continue;\n }\n\n const nextPoint: XlsxChartPointDataLabel = { index };\n if (typeof point.deleted === \"boolean\") {\n nextPoint.deleted = point.deleted;\n }\n if (typeof point.fontSizePt === \"number\" && Number.isFinite(point.fontSizePt)) {\n nextPoint.fontSizePt = point.fontSizePt;\n }\n if (typeof point.showBubbleSize === \"boolean\") {\n nextPoint.showBubbleSize = point.showBubbleSize;\n }\n if (typeof point.showCategoryName === \"boolean\") {\n nextPoint.showCategoryName = point.showCategoryName;\n }\n if (typeof point.showPercent === \"boolean\") {\n nextPoint.showPercent = point.showPercent;\n }\n if (typeof point.showSeriesName === \"boolean\") {\n nextPoint.showSeriesName = point.showSeriesName;\n }\n if (typeof point.showValue === \"boolean\") {\n nextPoint.showValue = point.showValue;\n }\n if (typeof point.x === \"number\" && Number.isFinite(point.x)) {\n nextPoint.x = point.x;\n }\n if (typeof point.y === \"number\" && Number.isFinite(point.y)) {\n nextPoint.y = point.y;\n }\n normalized.push(nextPoint);\n }\n return normalized;\n })()\n : undefined;\n return {\n pointLabels: pointLabels && pointLabels.length > 0 ? pointLabels : undefined,\n raw: labels,\n showBubbleSize: typeof labels.showBubbleSize === \"boolean\" ? labels.showBubbleSize : undefined,\n showCategoryName: typeof (labels.showCategoryName ?? labels.visibilityCategoryName) === \"boolean\"\n ? Boolean(labels.showCategoryName ?? labels.visibilityCategoryName)\n : undefined,\n showLegendKey: typeof labels.showLegendKey === \"boolean\" ? labels.showLegendKey : undefined,\n showPercent: typeof labels.showPercent === \"boolean\" ? labels.showPercent : undefined,\n showSeriesName: typeof (labels.showSeriesName ?? labels.visibilitySeriesName) === \"boolean\"\n ? Boolean(labels.showSeriesName ?? labels.visibilitySeriesName)\n : undefined,\n showValue: typeof (labels.showValue ?? labels.visibilityValue) === \"boolean\"\n ? Boolean(labels.showValue ?? labels.visibilityValue)\n : undefined\n };\n}\n\nfunction normalizeChartAnchor(raw: unknown): XlsxImageAnchor {\n if (!raw || typeof raw !== \"object\") {\n return {\n kind: \"two-cell\",\n from: { col: 0, colOffsetEmu: 0, row: 0, rowOffsetEmu: 0 },\n to: { col: 8, colOffsetEmu: 0, row: 15, rowOffsetEmu: 0 }\n };\n }\n\n const anchor = raw as Record<string, unknown>;\n const from = anchor.from && typeof anchor.from === \"object\"\n ? anchor.from as Record<string, unknown>\n : null;\n\n if (anchor.type === \"oneCell\") {\n return {\n from: {\n col: typeof from?.col === \"number\" ? from.col : 0,\n colOffsetEmu: typeof from?.colOffsetEmu === \"number\" ? from.colOffsetEmu : 0,\n row: typeof from?.row === \"number\" ? from.row : 0,\n rowOffsetEmu: typeof from?.rowOffsetEmu === \"number\" ? from.rowOffsetEmu : 0\n },\n kind: \"one-cell\",\n sizeEmu: {\n cx: typeof anchor.widthEmu === \"number\" ? anchor.widthEmu : 0,\n cy: typeof anchor.heightEmu === \"number\" ? anchor.heightEmu : 0\n }\n };\n }\n\n if (anchor.type === \"absolute\") {\n return {\n kind: \"absolute\",\n positionEmu: {\n x: typeof anchor.xEmu === \"number\" ? anchor.xEmu : 0,\n y: typeof anchor.yEmu === \"number\" ? anchor.yEmu : 0\n },\n sizeEmu: {\n cx: typeof anchor.widthEmu === \"number\" ? anchor.widthEmu : 0,\n cy: typeof anchor.heightEmu === \"number\" ? anchor.heightEmu : 0\n }\n };\n }\n\n const to = anchor.to && typeof anchor.to === \"object\"\n ? anchor.to as Record<string, unknown>\n : null;\n const fromColValue = from?.col;\n const fromColOffsetValue = from?.colOffsetEmu;\n const fromRowValue = from?.row;\n const fromRowOffsetValue = from?.rowOffsetEmu;\n const toColValue = to?.col;\n const toColOffsetValue = to?.colOffsetEmu;\n const toRowValue = to?.row;\n const toRowOffsetValue = to?.rowOffsetEmu;\n const fromCol = typeof fromColValue === \"number\" ? fromColValue : 0;\n const fromColOffsetEmu = typeof fromColOffsetValue === \"number\" ? fromColOffsetValue : 0;\n const fromRow = typeof fromRowValue === \"number\" ? fromRowValue : 0;\n const fromRowOffsetEmu = typeof fromRowOffsetValue === \"number\" ? fromRowOffsetValue : 0;\n const rawToCol = typeof toColValue === \"number\" ? toColValue : 0;\n const rawToColOffsetEmu = typeof toColOffsetValue === \"number\" ? toColOffsetValue : 0;\n const rawToRow = typeof toRowValue === \"number\" ? toRowValue : 0;\n const rawToRowOffsetEmu = typeof toRowOffsetValue === \"number\" ? toRowOffsetValue : 0;\n return {\n kind: \"two-cell\",\n from: {\n col: fromCol,\n colOffsetEmu: fromColOffsetEmu,\n row: fromRow,\n rowOffsetEmu: fromRowOffsetEmu\n },\n to: {\n col: rawToCol,\n colOffsetEmu: rawToColOffsetEmu,\n row: rawToRow,\n rowOffsetEmu: rawToRowOffsetEmu\n }\n };\n}\n\nfunction parseMarkerNode(node: Element | null) {\n if (!node) {\n return null;\n }\n\n const col = Number(getFirstLocalChild(node, \"col\")?.textContent ?? Number.NaN);\n const row = Number(getFirstLocalChild(node, \"row\")?.textContent ?? Number.NaN);\n const colOffsetEmu = Number(getFirstLocalChild(node, \"colOff\")?.textContent ?? 0);\n const rowOffsetEmu = Number(getFirstLocalChild(node, \"rowOff\")?.textContent ?? 0);\n\n if (!Number.isFinite(col) || !Number.isFinite(row)) {\n return null;\n }\n\n return {\n col: Math.max(0, Math.round(col)),\n colOffsetEmu: Number.isFinite(colOffsetEmu) ? Math.max(0, Math.round(colOffsetEmu)) : 0,\n row: Math.max(0, Math.round(row)),\n rowOffsetEmu: Number.isFinite(rowOffsetEmu) ? Math.max(0, Math.round(rowOffsetEmu)) : 0\n };\n}\n\nfunction parseChartAnchorNode(anchorNode: Element): XlsxImageAnchor | null {\n if (anchorNode.localName === \"twoCellAnchor\") {\n const from = parseMarkerNode(getFirstLocalChild(anchorNode, \"from\"));\n const to = parseMarkerNode(getFirstLocalChild(anchorNode, \"to\"));\n return from && to ? { from, kind: \"two-cell\", to } : null;\n }\n\n if (anchorNode.localName === \"oneCellAnchor\") {\n const from = parseMarkerNode(getFirstLocalChild(anchorNode, \"from\"));\n const ext = getFirstLocalChild(anchorNode, \"ext\");\n const cx = Number(ext?.getAttribute(\"cx\") ?? Number.NaN);\n const cy = Number(ext?.getAttribute(\"cy\") ?? Number.NaN);\n return from && Number.isFinite(cx) && Number.isFinite(cy)\n ? {\n from,\n kind: \"one-cell\",\n sizeEmu: {\n cx: Math.max(0, Math.round(cx)),\n cy: Math.max(0, Math.round(cy))\n }\n }\n : null;\n }\n\n const pos = getFirstLocalChild(anchorNode, \"pos\");\n const ext = getFirstLocalChild(anchorNode, \"ext\");\n const x = Number(pos?.getAttribute(\"x\") ?? Number.NaN);\n const y = Number(pos?.getAttribute(\"y\") ?? Number.NaN);\n const cx = Number(ext?.getAttribute(\"cx\") ?? Number.NaN);\n const cy = Number(ext?.getAttribute(\"cy\") ?? Number.NaN);\n return Number.isFinite(x) && Number.isFinite(y) && Number.isFinite(cx) && Number.isFinite(cy)\n ? {\n kind: \"absolute\",\n positionEmu: {\n x: Math.round(x),\n y: Math.round(y)\n },\n sizeEmu: {\n cx: Math.max(0, Math.round(cx)),\n cy: Math.max(0, Math.round(cy))\n }\n }\n : null;\n}\n\nfunction isCollapsedChartAnchor(anchor: XlsxImageAnchor) {\n if (anchor.kind !== \"two-cell\") {\n return false;\n }\n\n const collapsedWidth = anchor.to.col < anchor.from.col\n || (anchor.to.col === anchor.from.col && anchor.to.colOffsetEmu <= anchor.from.colOffsetEmu);\n const collapsedHeight = anchor.to.row < anchor.from.row\n || (anchor.to.row === anchor.from.row && anchor.to.rowOffsetEmu <= anchor.from.rowOffsetEmu);\n return collapsedWidth || collapsedHeight;\n}\n\nfunction normalizeChartSeries(\n workbook: Workbook,\n workbookSheetIndex: number,\n chartId: string,\n raw: unknown,\n index: number\n): XlsxChartSeries {\n const series = raw && typeof raw === \"object\" ? raw as Record<string, unknown> : {};\n const categoriesRef = normalizeChartReference(series.categories);\n const valuesRef = normalizeChartReference(series.values);\n const shapeProperties = series.shapeProperties && typeof series.shapeProperties === \"object\"\n ? series.shapeProperties as Record<string, unknown>\n : undefined;\n const rawFillColor = typeof shapeProperties?.solidFillHex === \"string\"\n ? normalizeHexColor(shapeProperties.solidFillHex)\n : null;\n const rawLineColor = typeof shapeProperties?.lineColorHex === \"string\"\n ? normalizeHexColor(shapeProperties.lineColorHex)\n : null;\n const bubbleSizeRef = normalizeChartReference(series.bubbleSize ?? series.bubbleSizes ?? series.bubbles);\n\n return {\n bubbleSizeRef,\n bubbleSizes: resolveReferenceValues(workbook, workbookSheetIndex, bubbleSizeRef, \"value\").map((value) => (\n typeof value === \"number\" && Number.isFinite(value) ? value : null\n )),\n categories: resolveReferenceValues(workbook, workbookSheetIndex, categoriesRef, \"category\"),\n categoriesRef,\n color: rawFillColor ?? undefined,\n dataPoints: Array.isArray(series.dataPoints) ? series.dataPoints : [],\n dataPointStyles: undefined,\n id: `${chartId}-series-${index}`,\n invertIfNegative: typeof series.invertIfNegative === \"boolean\" ? series.invertIfNegative : undefined,\n lineColor: rawLineColor ?? rawFillColor ?? undefined,\n lineWidthPx: typeof shapeProperties?.lineWidth === \"number\"\n ? Math.max(1, Number(shapeProperties.lineWidth) / EMU_PER_PIXEL)\n : undefined,\n marker: series.marker && typeof series.marker === \"object\" ? series.marker as Record<string, unknown> : undefined,\n markerColor: undefined,\n markerLineColor: undefined,\n markerSize: series.marker && typeof series.marker === \"object\" && typeof (series.marker as Record<string, unknown>).size === \"number\"\n ? Number((series.marker as Record<string, unknown>).size)\n : undefined,\n markerSymbol: series.marker && typeof series.marker === \"object\" && typeof (series.marker as Record<string, unknown>).symbol === \"string\"\n ? String((series.marker as Record<string, unknown>).symbol)\n : undefined,\n name: resolveSeriesName(workbook, workbookSheetIndex, series.name),\n negativeColor: undefined,\n negativeLineColor: undefined,\n raw: series,\n shapeProperties,\n smooth: typeof series.smooth === \"boolean\" ? series.smooth : undefined,\n values: resolveReferenceValues(workbook, workbookSheetIndex, valuesRef, \"value\").map((value) => (\n typeof value === \"number\" && Number.isFinite(value) ? value : null\n )),\n valuesRef\n };\n}\n\nfunction normalizeChartTypeGroup(\n workbook: Workbook,\n workbookSheetIndex: number,\n chartId: string,\n raw: unknown,\n index: number\n): XlsxChartTypeGroup | null {\n if (!raw || typeof raw !== \"object\") {\n return null;\n }\n\n const group = raw as Record<string, unknown>;\n const rawSeries = Array.isArray(group.series) ? group.series : [];\n return {\n axisIds: Array.isArray(group.axisIds)\n ? group.axisIds.filter((value): value is number => typeof value === \"number\" && Number.isFinite(value))\n : undefined,\n chartType: typeof group.chartType === \"string\" ? group.chartType : \"ColumnClustered\",\n dataLabels: normalizeChartDataLabels(group.dataLabels),\n gapWidth: typeof group.gapWidth === \"number\" && Number.isFinite(group.gapWidth) ? group.gapWidth : undefined,\n is3d: typeof group.is3D === \"boolean\" ? group.is3D : undefined,\n overlap: typeof group.overlap === \"number\" && Number.isFinite(group.overlap) ? group.overlap : undefined,\n raw: group,\n series: rawSeries.map((entry, seriesIndex) => (\n normalizeChartSeries(workbook, workbookSheetIndex, `${chartId}-group-${index}`, entry, seriesIndex)\n )),\n varyColors: typeof group.varyColors === \"boolean\" ? group.varyColors : undefined\n };\n}\n\nfunction normalizeChartsheet(raw: unknown, index: number): XlsxChartsheet {\n const chartsheet = raw && typeof raw === \"object\" ? raw as Record<string, unknown> : {};\n return {\n chartIds: Array.isArray(chartsheet.chartIds) ? chartsheet.chartIds.filter((value): value is string => typeof value === \"string\") : [],\n chartPath: typeof chartsheet.chartPath === \"string\" ? chartsheet.chartPath : undefined,\n id: `chartsheet-${index}`,\n index,\n name: typeof chartsheet.name === \"string\" ? chartsheet.name : `Chart ${index + 1}`,\n raw: chartsheet,\n workbookSheetIndex: typeof chartsheet.workbookSheetIndex === \"number\" ? chartsheet.workbookSheetIndex : undefined\n };\n}\n\nfunction buildTabs(\n workbook: Workbook,\n chartsheets: XlsxChartsheet[],\n visibleSheetIndexByWorkbookSheetIndex: Map<number, number>,\n showHiddenSheets = false\n): XlsxWorkbookTab[] {\n const rawOrder = Array.isArray(workbook.sheetOrder) ? workbook.sheetOrder as Array<Record<string, unknown>> : [];\n if (rawOrder.length === 0) {\n return workbook.sheetNames.flatMap((name, index) => {\n const worksheet = workbook.getSheet(index);\n const visibility = normalizeWorksheetVisibility(worksheet.visibility);\n if (!showHiddenSheets && visibility !== \"visible\") {\n return [];\n }\n\n return [{\n id: `sheet-${index}`,\n index,\n kind: \"sheet\" as const,\n name,\n sheetIndex: visibleSheetIndexByWorkbookSheetIndex.get(index) ?? index,\n visibility,\n workbookSheetIndex: index\n }];\n });\n }\n\n return rawOrder.flatMap<XlsxWorkbookTab>((entry, index) => {\n const slotType = typeof entry.slotType === \"string\" ? entry.slotType : \"worksheet\";\n const slotIndex = typeof entry.index === \"number\" ? entry.index : index;\n if (slotType === \"chartsheet\") {\n const chartsheet = chartsheets[slotIndex];\n return chartsheet ? [{\n chartsheetIndex: slotIndex,\n id: `chartsheet-${slotIndex}`,\n index,\n kind: \"chartsheet\" as const,\n name: chartsheet.name\n }] : [];\n }\n\n const worksheet = workbook.getSheet(slotIndex);\n const visibility = normalizeWorksheetVisibility(worksheet.visibility);\n if (!showHiddenSheets && visibility !== \"visible\") {\n return [];\n }\n\n return [{\n id: `sheet-${slotIndex}`,\n index,\n kind: \"sheet\" as const,\n name: worksheet.name,\n sheetIndex: visibleSheetIndexByWorkbookSheetIndex.get(slotIndex) ?? slotIndex,\n visibility,\n workbookSheetIndex: slotIndex\n }];\n });\n}\n\nfunction collectChartOriginsForSheet(\n archive: Record<string, Uint8Array>,\n origin: WorkbookImageSheetOrigin | null\n) {\n if (!origin) {\n return [] as WorkbookChartOrigin[];\n }\n\n const chartOrigins: WorkbookChartOrigin[] = [];\n\n for (const attachment of origin.attachments) {\n const drawingXml = readArchiveText(archive, attachment.drawingPath);\n const relsXml = readArchiveText(archive, attachment.drawingRelsPath);\n if (!drawingXml || !relsXml) {\n continue;\n }\n\n const drawingDocument = parseXml(drawingXml);\n const relsDocument = parseXml(relsXml);\n if (!drawingDocument || !relsDocument) {\n continue;\n }\n\n const relationships = new Map<string, { target: string; type: string | null }>();\n for (const node of getLocalDescendants(relsDocument, \"Relationship\")) {\n const id = node.getAttribute(\"Id\");\n const target = node.getAttribute(\"Target\");\n const type = node.getAttribute(\"Type\");\n if (id && target) {\n relationships.set(id, {\n target: resolveRelationshipPath(attachment.drawingRelsPath ?? attachment.drawingPath, target),\n type\n });\n }\n }\n\n const anchorNodes = Array.from(drawingDocument.documentElement.childNodes).filter(\n (node): node is Element => (\n node.nodeType === Node.ELEMENT_NODE\n && (\n (node as Element).localName === \"twoCellAnchor\"\n || (node as Element).localName === \"oneCellAnchor\"\n || (node as Element).localName === \"absoluteAnchor\"\n )\n )\n );\n\n let chartAnchorIndex = 0;\n for (const anchorNode of anchorNodes) {\n const graphicFrame = getFirstLocalDescendant(anchorNode, \"graphicFrame\");\n const chartNode = graphicFrame ? getFirstLocalDescendant(graphicFrame, \"chart\") : null;\n const relationshipId = chartNode?.getAttributeNS(\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\", \"id\")\n ?? chartNode?.getAttribute(\"r:id\")\n ?? chartNode?.getAttribute(\"id\");\n if (!relationshipId) {\n continue;\n }\n const relationship = relationships.get(relationshipId);\n if (!relationship || (relationship.type !== CHART_REL_TYPE && relationship.type !== CHART_EX_REL_TYPE)) {\n continue;\n }\n\n chartOrigins.push({\n anchorIndex: chartAnchorIndex,\n anchor: parseChartAnchorNode(anchorNode),\n chartKind: relationship.type === CHART_EX_REL_TYPE ? \"modern\" : \"classic\",\n chartPath: relationship.target,\n drawingPath: attachment.drawingPath,\n workbookSheetIndex: origin.workbookSheetIndex\n });\n chartAnchorIndex += 1;\n }\n }\n\n return chartOrigins;\n}\n\nfunction applyChartOrigins(\n chartsByWorkbookSheetIndex: XlsxChart[][],\n chartOriginsById: Map<string, WorkbookChartOrigin>,\n archive: Record<string, Uint8Array>,\n sheetOrigins: Array<WorkbookImageSheetOrigin | null>\n) {\n for (let workbookSheetIndex = 0; workbookSheetIndex < chartsByWorkbookSheetIndex.length; workbookSheetIndex += 1) {\n const charts = chartsByWorkbookSheetIndex[workbookSheetIndex] ?? [];\n const origins = collectChartOriginsForSheet(archive, sheetOrigins[workbookSheetIndex] ?? null);\n const originsByKind = {\n classic: origins.filter((origin) => origin.chartKind === \"classic\"),\n modern: origins.filter((origin) => origin.chartKind === \"modern\")\n };\n const chartIndexByKind = {\n classic: 0,\n modern: 0\n };\n\n charts.forEach((chart) => {\n const chartKind = chart.id.startsWith(\"chart-ex-\") ? \"modern\" : \"classic\";\n const origin = originsByKind[chartKind][chartIndexByKind[chartKind]];\n chartIndexByKind[chartKind] += 1;\n if (!origin) {\n return;\n }\n if (origin.anchor && isCollapsedChartAnchor(chart.anchor)) {\n chart.anchor = origin.anchor;\n } else if (origin.anchor && chart.anchor.kind === \"two-cell\" && chart.anchor.from.col === 0 && chart.anchor.from.row === 0) {\n chart.anchor = origin.anchor;\n }\n chart.chartPath = origin.chartPath ?? undefined;\n chartOriginsById.set(chart.id, origin);\n });\n }\n}\n\nexport function hydrateWorkbookChartStyles(\n chartsByWorkbookSheetIndex: XlsxChart[][],\n imageAssets: Pick<WorkbookImageAssets, \"archive\" | \"sheetOrigins\" | \"themePalette\">\n) {\n const chartOriginsById = new Map<string, WorkbookChartOrigin>();\n applyChartOrigins(chartsByWorkbookSheetIndex, chartOriginsById, imageAssets.archive, imageAssets.sheetOrigins);\n for (const charts of chartsByWorkbookSheetIndex) {\n for (const chart of charts) {\n applyChartStyleFromXml(chart, chart.chartPath, imageAssets.archive, imageAssets.themePalette);\n applyBuiltinChartDefaults(chart, imageAssets.themePalette);\n }\n }\n return chartOriginsById;\n}\n\nexport function loadWorkbookChartAssets(\n workbook: Workbook,\n imageAssets: Pick<WorkbookImageAssets, \"archive\" | \"sheetOrigins\" | \"themePalette\"> | null,\n visibleSheetIndexByWorkbookSheetIndex: Map<number, number>,\n showHiddenSheets = false\n): WorkbookChartAssets {\n const excludedChartIds = new Set<string>();\n const chartsByWorkbookSheetIndex = Array.from({ length: workbook.sheetCount }, (_, workbookSheetIndex) => {\n const worksheet = workbook.getSheet(workbookSheetIndex);\n const rawCharts = worksheet.charts;\n const rawChartsEx = worksheet.chartsEx;\n const visibleSheetIndex = visibleSheetIndexByWorkbookSheetIndex.get(workbookSheetIndex) ?? workbookSheetIndex;\n\n const classicCharts = rawCharts.map((rawChart, chartIndex) => {\n const chartId = `chart-${workbookSheetIndex}-${chartIndex}`;\n if (rawChart.hidden || !rawChart.anchor) {\n excludedChartIds.add(chartId);\n }\n const drawing = rawChart && typeof rawChart === \"object\" ? rawChart as unknown as Record<string, unknown> : {};\n const chart = drawing.chart && typeof drawing.chart === \"object\"\n ? drawing.chart as Record<string, unknown>\n : {};\n const rawView3d = chart.view3D && typeof chart.view3D === \"object\"\n ? chart.view3D as Record<string, unknown>\n : null;\n const rawSeries = Array.isArray(chart.series) ? chart.series : [];\n const chartLevelDataLabels = normalizeChartDataLabels(chart.dataLabels);\n const firstSeriesDataLabels = rawSeries.length > 0 && rawSeries[0] && typeof rawSeries[0] === \"object\"\n ? normalizeChartDataLabels((rawSeries[0] as Record<string, unknown>).dataLabels)\n : null;\n return {\n anchor: normalizeChartAnchor(drawing.anchor),\n autoTitleDeleted: typeof chart.autoTitleDeleted === \"boolean\" ? chart.autoTitleDeleted : undefined,\n axes: Array.isArray(chart.axes) ? chart.axes.map(normalizeChartAxis).filter((value): value is XlsxChartAxis => Boolean(value)) : [],\n axisLabelColor: undefined,\n axisLineColor: undefined,\n categoryAxis: normalizeChartAxis(chart.categoryAxis),\n chartAreaBorderColor: undefined,\n chartAreaFillColor: undefined,\n chartColorPalette: undefined,\n chartColorPaletteOffset: undefined,\n chartPath: undefined,\n chartStyleId: undefined,\n chartType: typeof chart.chartType === \"string\" ? chart.chartType : \"ColumnClustered\",\n dataLabels: chartLevelDataLabels ?? firstSeriesDataLabels,\n displayBlanksAs: typeof chart.displayBlanksAs === \"string\" ? chart.displayBlanksAs : undefined,\n editable: true,\n firstSliceAngle: typeof chart.firstSliceAngle === \"number\" ? chart.firstSliceAngle : undefined,\n fontFamily: undefined,\n gapWidth: typeof chart.gapWidth === \"number\" ? chart.gapWidth : undefined,\n holeSize: typeof chart.holeSize === \"number\" ? chart.holeSize : undefined,\n id: chartId,\n is3d: typeof chart.is3D === \"boolean\" ? chart.is3D : undefined,\n legend: normalizeLegend(chart.legend)\n ? {\n ...normalizeLegend(chart.legend),\n position: normalizeLegendPosition(normalizeLegend(chart.legend)?.position)\n }\n : null,\n name: typeof drawing.name === \"string\" ? drawing.name : undefined,\n overlap: typeof chart.overlap === \"number\" ? chart.overlap : undefined,\n plotVisibleOnly: typeof chart.plotVisibleOnly === \"boolean\" ? chart.plotVisibleOnly : undefined,\n raw: chart,\n radarStyle: typeof chart.radarStyle === \"string\" ? chart.radarStyle : undefined,\n scatterStyle: typeof chart.scatterStyle === \"string\" ? chart.scatterStyle : undefined,\n roundedCorners: typeof chart.roundedCorners === \"boolean\" ? chart.roundedCorners : undefined,\n shape3d: typeof chart.shape === \"string\"\n ? chart.shape\n : typeof chart.shape3d === \"string\"\n ? chart.shape3d\n : undefined,\n seriesAxis: null,\n series: rawSeries.map((entry, seriesIndex) => normalizeChartSeries(workbook, workbookSheetIndex, chartId, entry, seriesIndex)),\n sheetIndex: visibleSheetIndex,\n showDlblsOverMax: typeof chart.showDlblsOverMax === \"boolean\" ? chart.showDlblsOverMax : undefined,\n sideWall: null,\n backWall: null,\n bubbleScale: typeof chart.bubbleScale === \"number\" ? chart.bubbleScale : undefined,\n bubble3d: typeof chart.bubble3d === \"boolean\" ? chart.bubble3d : undefined,\n floor: null,\n surfaceMaterial: undefined,\n textColor: undefined,\n title: typeof chart.title === \"string\" ? chart.title : undefined,\n titleColor: undefined,\n titleFontFamily: undefined,\n typeGroups: Array.isArray(chart.typeGroups)\n ? chart.typeGroups\n .map((entry, groupIndex) => normalizeChartTypeGroup(workbook, workbookSheetIndex, chartId, entry, groupIndex))\n .filter((value): value is XlsxChartTypeGroup => value != null)\n : [],\n valueAxis: normalizeChartAxis(chart.valueAxis),\n varyColors: typeof chart.varyColors === \"boolean\" ? chart.varyColors : undefined,\n view3d: rawView3d\n ? {\n depthPercent: typeof rawView3d.depthPercent === \"number\" ? rawView3d.depthPercent : undefined,\n heightPercent: typeof rawView3d.heightPercent === \"number\" ? rawView3d.heightPercent : undefined,\n perspective: typeof rawView3d.perspective === \"number\" ? rawView3d.perspective : undefined,\n rAngAx: typeof rawView3d.rAngAx === \"boolean\"\n ? rawView3d.rAngAx\n : typeof rawView3d.rightAngleAxes === \"boolean\"\n ? rawView3d.rightAngleAxes\n : undefined,\n rotX: typeof rawView3d.rotX === \"number\"\n ? rawView3d.rotX\n : typeof rawView3d.rotateX === \"number\"\n ? rawView3d.rotateX\n : undefined,\n rotY: typeof rawView3d.rotY === \"number\"\n ? rawView3d.rotY\n : typeof rawView3d.rotateY === \"number\"\n ? rawView3d.rotateY\n : undefined\n }\n : undefined,\n wireframe: typeof chart.wireframe === \"boolean\" ? chart.wireframe : undefined,\n workbookSheetIndex,\n zIndex: Array.isArray(drawing.drawingPath) && typeof drawing.drawingPath[0] === \"number\"\n ? drawing.drawingPath[0] + 1\n : chartIndex + 1\n } satisfies XlsxChart;\n });\n\n const modernCharts = rawChartsEx.map((rawChartEx, chartExIndex) => {\n const chartId = `chart-ex-${workbookSheetIndex}-${chartExIndex}`;\n if (rawChartEx.hidden || !rawChartEx.anchor) {\n excludedChartIds.add(chartId);\n }\n return normalizeChartExChart(\n workbook,\n workbookSheetIndex,\n visibleSheetIndex,\n rawChartEx,\n chartExIndex,\n imageAssets?.themePalette ?? null\n );\n });\n\n return [...classicCharts, ...modernCharts];\n });\n\n const chartsheets = Array.isArray(workbook.chartsheets)\n ? workbook.chartsheets.map((entry, index) => normalizeChartsheet(entry, index))\n : [];\n const tabs = buildTabs(workbook, chartsheets, visibleSheetIndexByWorkbookSheetIndex, showHiddenSheets);\n const chartOriginsById = imageAssets\n ? hydrateWorkbookChartStyles(chartsByWorkbookSheetIndex, imageAssets)\n : new Map<string, WorkbookChartOrigin>();\n\n if (imageAssets) {\n for (let index = 0; index < chartsByWorkbookSheetIndex.length; index += 1) {\n chartsByWorkbookSheetIndex[index] = (chartsByWorkbookSheetIndex[index] ?? [])\n .filter((chart) => !excludedChartIds.has(chart.id));\n }\n for (const id of excludedChartIds) {\n chartOriginsById.delete(id);\n }\n } else {\n for (let index = 0; index < chartsByWorkbookSheetIndex.length; index += 1) {\n chartsByWorkbookSheetIndex[index] = (chartsByWorkbookSheetIndex[index] ?? [])\n .filter((chart) => !excludedChartIds.has(chart.id));\n }\n for (const charts of chartsByWorkbookSheetIndex) {\n for (const chart of charts) {\n applyBuiltinChartDefaults(chart, null);\n }\n }\n }\n\n return {\n chartOriginsById,\n chartsByWorkbookSheetIndex,\n chartsheets,\n tabs\n };\n}\n\nfunction getChartAnchorNodes(drawingDocument: XMLDocument) {\n return Array.from(drawingDocument.documentElement.childNodes).filter(\n (node): node is Element => (\n node.nodeType === Node.ELEMENT_NODE\n && (\n (node as Element).localName === \"twoCellAnchor\"\n || (node as Element).localName === \"oneCellAnchor\"\n || (node as Element).localName === \"absoluteAnchor\"\n )\n )\n )\n .filter((anchorNode) => {\n const graphicFrame = getFirstLocalChild(anchorNode, \"graphicFrame\");\n return Boolean(graphicFrame && getFirstLocalDescendant(graphicFrame, \"chart\"));\n });\n}\n\nfunction updateMarkerNode(markerNode: Element | null, marker: { col: number; colOffsetEmu: number; row: number; rowOffsetEmu: number }) {\n if (!markerNode) {\n return;\n }\n\n setLeafValue(markerNode, \"col\", String(Math.max(0, Math.round(marker.col))));\n setLeafValue(markerNode, \"colOff\", String(Math.max(0, Math.round(marker.colOffsetEmu))));\n setLeafValue(markerNode, \"row\", String(Math.max(0, Math.round(marker.row))));\n setLeafValue(markerNode, \"rowOff\", String(Math.max(0, Math.round(marker.rowOffsetEmu))));\n}\n\nfunction updateAnchorNode(anchorNode: Element, anchor: XlsxImageAnchor) {\n if (anchor.kind === \"two-cell\") {\n updateMarkerNode(getFirstLocalChild(anchorNode, \"from\"), anchor.from);\n updateMarkerNode(getFirstLocalChild(anchorNode, \"to\"), anchor.to);\n return;\n }\n\n if (anchor.kind === \"one-cell\") {\n updateMarkerNode(getFirstLocalChild(anchorNode, \"from\"), anchor.from);\n const ext = getFirstLocalChild(anchorNode, \"ext\");\n if (ext) {\n ext.setAttribute(\"cx\", String(Math.max(0, Math.round(anchor.sizeEmu.cx))));\n ext.setAttribute(\"cy\", String(Math.max(0, Math.round(anchor.sizeEmu.cy))));\n }\n return;\n }\n\n const pos = getFirstLocalChild(anchorNode, \"pos\");\n if (pos) {\n pos.setAttribute(\"x\", String(Math.max(0, Math.round(anchor.positionEmu.x))));\n pos.setAttribute(\"y\", String(Math.max(0, Math.round(anchor.positionEmu.y))));\n }\n const ext = getFirstLocalChild(anchorNode, \"ext\");\n if (ext) {\n ext.setAttribute(\"cx\", String(Math.max(0, Math.round(anchor.sizeEmu.cx))));\n ext.setAttribute(\"cy\", String(Math.max(0, Math.round(anchor.sizeEmu.cy))));\n }\n}\n\nfunction setChartTitle(chartNode: Element, value: string | undefined) {\n const existing = getFirstLocalChild(chartNode, \"title\");\n if (!value) {\n existing?.remove();\n return;\n }\n\n const titleNode = existing ?? chartNode.insertBefore(\n chartNode.ownerDocument.createElementNS(CHART_NS, \"c:title\"),\n chartNode.firstChild\n );\n while (titleNode.firstChild) {\n titleNode.removeChild(titleNode.firstChild);\n }\n const tx = titleNode.ownerDocument.createElementNS(CHART_NS, \"c:tx\");\n const rich = titleNode.ownerDocument.createElementNS(CHART_NS, \"c:rich\");\n const bodyPr = titleNode.ownerDocument.createElementNS(DRAWINGML_NS, \"a:bodyPr\");\n const lstStyle = titleNode.ownerDocument.createElementNS(DRAWINGML_NS, \"a:lstStyle\");\n const p = titleNode.ownerDocument.createElementNS(DRAWINGML_NS, \"a:p\");\n const r = titleNode.ownerDocument.createElementNS(DRAWINGML_NS, \"a:r\");\n const t = titleNode.ownerDocument.createElementNS(DRAWINGML_NS, \"a:t\");\n t.textContent = value;\n r.appendChild(t);\n p.appendChild(r);\n rich.append(bodyPr, lstStyle, p);\n tx.appendChild(rich);\n titleNode.appendChild(tx);\n}\n\nfunction setRefFormula(parent: Element, refNodeName: string, formula: string | undefined) {\n if (!formula) {\n removeLocalChildren(parent, refNodeName);\n return;\n }\n\n const refNode = ensureChild(parent, refNodeName);\n setLeafValue(refNode, \"f\", formula);\n}\n\nfunction setSeriesText(seriesNode: Element, series: XlsxChartSeries) {\n const raw = series.raw && typeof series.raw === \"object\" ? series.raw as Record<string, unknown> : null;\n const nameFormula = typeof raw?.name === \"string\" && raw.name.length > 0 ? raw.name : undefined;\n if (!nameFormula && series.name === undefined) {\n return;\n }\n\n const tx = ensureChild(seriesNode, \"tx\");\n removeLocalChildren(tx, \"strRef\");\n removeLocalChildren(tx, \"v\");\n if (nameFormula) {\n const strRef = ensureChild(tx, \"strRef\");\n setLeafValue(strRef, \"f\", nameFormula);\n return;\n }\n\n setLeafValue(tx, \"v\", series.name ?? \"\");\n}\n\nfunction updateSeriesNodes(plotAreaNode: Element, chart: Partial<XlsxChart>) {\n if (!chart.series) {\n return;\n }\n\n const seriesNodes = getLocalDescendants(plotAreaNode, \"ser\");\n chart.series.forEach((series, index) => {\n const seriesNode = seriesNodes[index];\n if (!seriesNode) {\n return;\n }\n\n setSeriesText(seriesNode, series);\n if (series.categoriesRef?.formula) {\n const target = getFirstLocalChild(seriesNode, \"xVal\")\n ?? getFirstLocalChild(seriesNode, \"cat\")\n ?? (\n chart.chartType === \"Scatter\" || chart.chartType === \"ScatterLines\" || chart.chartType === \"ScatterSmooth\" || chart.chartType === \"Bubble\"\n ? ensureChild(seriesNode, \"xVal\")\n : ensureChild(seriesNode, \"cat\")\n );\n const categoryRefName = target.localName === \"xVal\" || getFirstLocalChild(target, \"numRef\") ? \"numRef\" : \"strRef\";\n setRefFormula(target, categoryRefName, series.categoriesRef.formula);\n }\n if (series.valuesRef?.formula) {\n const target = getFirstLocalChild(seriesNode, \"yVal\")\n ?? getFirstLocalChild(seriesNode, \"val\")\n ?? (\n chart.chartType === \"Scatter\" || chart.chartType === \"ScatterLines\" || chart.chartType === \"ScatterSmooth\" || chart.chartType === \"Bubble\"\n ? ensureChild(seriesNode, \"yVal\")\n : ensureChild(seriesNode, \"val\")\n );\n setRefFormula(target, \"numRef\", series.valuesRef.formula);\n }\n if (series.bubbleSizeRef) {\n const target = getFirstLocalChild(seriesNode, \"bubbleSize\") ?? ensureChild(seriesNode, \"bubbleSize\");\n setRefFormula(target, \"numRef\", series.bubbleSizeRef.formula);\n }\n if (series.invertIfNegative !== undefined) {\n setBooleanValue(seriesNode, \"invertIfNegative\", series.invertIfNegative);\n }\n if (series.smooth !== undefined) {\n setBooleanValue(seriesNode, \"smooth\", series.smooth);\n }\n });\n}\n\nfunction updateAxisNode(axisNode: Element | null, axis: XlsxChartAxis | null | undefined) {\n if (!axisNode || !axis) {\n return;\n }\n\n if (axis.position) {\n setLeafValue(ensureChild(axisNode, \"axPos\"), \"val\", axis.position);\n getFirstLocalChild(axisNode, \"axPos\")?.setAttribute(\"val\", axis.position);\n }\n if (axis.majorGridlines !== undefined) {\n const gridlines = getFirstLocalChild(axisNode, \"majorGridlines\");\n if (axis.majorGridlines && !gridlines) {\n axisNode.appendChild(axisNode.ownerDocument.createElementNS(CHART_NS, \"c:majorGridlines\"));\n } else if (!axis.majorGridlines) {\n gridlines?.remove();\n }\n }\n if (axis.minorGridlines !== undefined) {\n const gridlines = getFirstLocalChild(axisNode, \"minorGridlines\");\n if (axis.minorGridlines && !gridlines) {\n axisNode.appendChild(axisNode.ownerDocument.createElementNS(CHART_NS, \"c:minorGridlines\"));\n } else if (!axis.minorGridlines) {\n gridlines?.remove();\n }\n }\n if (axis.majorTickMark) {\n getFirstLocalChild(axisNode, \"majorTickMark\")?.setAttribute(\"val\", axis.majorTickMark)\n ?? setBooleanValue(axisNode, \"majorTickMark\", false).setAttribute(\"val\", axis.majorTickMark);\n }\n if (axis.minorTickMark) {\n getFirstLocalChild(axisNode, \"minorTickMark\")?.setAttribute(\"val\", axis.minorTickMark)\n ?? setBooleanValue(axisNode, \"minorTickMark\", false).setAttribute(\"val\", axis.minorTickMark);\n }\n if (axis.labelPosition) {\n getFirstLocalChild(axisNode, \"tickLblPos\")?.setAttribute(\"val\", axis.labelPosition)\n ?? setBooleanValue(axisNode, \"tickLblPos\", false).setAttribute(\"val\", axis.labelPosition);\n }\n if (axis.crosses) {\n getFirstLocalChild(axisNode, \"crosses\")?.setAttribute(\"val\", axis.crosses)\n ?? setBooleanValue(axisNode, \"crosses\", false).setAttribute(\"val\", axis.crosses);\n }\n if (axis.crossBetween) {\n getFirstLocalChild(axisNode, \"crossBetween\")?.setAttribute(\"val\", axis.crossBetween)\n ?? setBooleanValue(axisNode, \"crossBetween\", false).setAttribute(\"val\", axis.crossBetween);\n }\n if (axis.delete !== undefined) {\n setBooleanValue(axisNode, \"delete\", axis.delete);\n }\n if (axis.numberFormat?.formatCode) {\n const numFmt = ensureChild(axisNode, \"numFmt\");\n numFmt.setAttribute(\"formatCode\", axis.numberFormat.formatCode);\n if (axis.numberFormat.sourceLinked !== undefined) {\n numFmt.setAttribute(\"sourceLinked\", axis.numberFormat.sourceLinked ? \"1\" : \"0\");\n }\n }\n}\n\nfunction updateDataLabels(chartTypeNode: Element, labels: XlsxChartDataLabels | null | undefined) {\n if (!labels) {\n return;\n }\n\n const labelsNode = ensureChild(chartTypeNode, \"dLbls\");\n if (labels.showLegendKey !== undefined) {\n setBooleanValue(labelsNode, \"showLegendKey\", labels.showLegendKey);\n }\n if (labels.showValue !== undefined) {\n setBooleanValue(labelsNode, \"showVal\", labels.showValue);\n }\n if (labels.showCategoryName !== undefined) {\n setBooleanValue(labelsNode, \"showCatName\", labels.showCategoryName);\n }\n if (labels.showSeriesName !== undefined) {\n setBooleanValue(labelsNode, \"showSerName\", labels.showSeriesName);\n }\n if (labels.showPercent !== undefined) {\n setBooleanValue(labelsNode, \"showPercent\", labels.showPercent);\n }\n if (labels.showBubbleSize !== undefined) {\n setBooleanValue(labelsNode, \"showBubbleSize\", labels.showBubbleSize);\n }\n}\n\nexport function updateWorkbookChartAnchor(\n imageAssets: Pick<WorkbookImageAssets, \"archive\" | \"dirtyArchivePaths\">,\n chartAssets: WorkbookChartAssets,\n chartId: string,\n anchor: XlsxImageAnchor\n) {\n const origin = chartAssets.chartOriginsById.get(chartId);\n if (!origin) {\n return false;\n }\n\n const drawingXml = readArchiveText(imageAssets.archive, origin.drawingPath);\n if (!drawingXml) {\n return false;\n }\n\n const drawingDocument = parseXml(drawingXml);\n if (!drawingDocument) {\n return false;\n }\n\n const anchorNode = getChartAnchorNodes(drawingDocument)[origin.anchorIndex];\n if (!anchorNode) {\n return false;\n }\n\n updateAnchorNode(anchorNode, anchor);\n imageAssets.archive[normalizeArchivePath(origin.drawingPath)] = strToU8(serializeXml(drawingDocument));\n imageAssets.dirtyArchivePaths.add(normalizeArchivePath(origin.drawingPath));\n return true;\n}\n\nexport function updateWorkbookChartDefinition(\n imageAssets: Pick<WorkbookImageAssets, \"archive\" | \"dirtyArchivePaths\">,\n chartAssets: WorkbookChartAssets,\n chartId: string,\n patch: Partial<XlsxChart>\n) {\n const origin = chartAssets.chartOriginsById.get(chartId);\n if (!origin?.chartPath) {\n return false;\n }\n\n const chartXml = readArchiveText(imageAssets.archive, origin.chartPath);\n if (!chartXml) {\n return false;\n }\n\n const chartDocument = parseXml(chartXml);\n if (!chartDocument) {\n return false;\n }\n\n const chartNode = getFirstLocalDescendant(chartDocument, \"chart\");\n const plotAreaNode = chartNode ? getFirstLocalChild(chartNode, \"plotArea\") : null;\n const chartTypeNode = findPrimaryChartTypeNode(plotAreaNode);\n if (!chartNode || !plotAreaNode || !chartTypeNode) {\n return false;\n }\n\n if (patch.title !== undefined) {\n setChartTitle(chartNode, patch.title);\n }\n if (patch.displayBlanksAs) {\n const node = ensureChild(chartNode, \"dispBlanksAs\");\n node.setAttribute(\"val\", patch.displayBlanksAs);\n }\n if (patch.roundedCorners !== undefined) {\n setBooleanValue(chartNode, \"roundedCorners\", patch.roundedCorners);\n }\n if (patch.showDlblsOverMax !== undefined) {\n setBooleanValue(chartNode, \"showDLblsOverMax\", patch.showDlblsOverMax);\n }\n if (patch.varyColors !== undefined) {\n setBooleanValue(chartTypeNode, \"varyColors\", patch.varyColors);\n }\n if (patch.gapWidth !== undefined) {\n setNumericValue(chartTypeNode, \"gapWidth\", patch.gapWidth);\n }\n if (patch.overlap !== undefined) {\n const overlapNode = ensureChild(chartTypeNode, \"overlap\");\n overlapNode.setAttribute(\"val\", String(Math.round(patch.overlap)));\n }\n if (patch.dataLabels) {\n updateDataLabels(chartTypeNode, patch.dataLabels);\n }\n updateSeriesNodes(plotAreaNode, patch);\n updateAxisNode(\n getLocalChildren(plotAreaNode, \"catAx\")[0]\n ?? getLocalChildren(plotAreaNode, \"dateAx\")[0]\n ?? getLocalChildren(plotAreaNode, \"serAx\")[0]\n ?? null,\n patch.categoryAxis\n );\n updateAxisNode(getLocalChildren(plotAreaNode, \"valAx\")[0] ?? null, patch.valueAxis);\n\n imageAssets.archive[normalizeArchivePath(origin.chartPath)] = strToU8(serializeXml(chartDocument));\n imageAssets.dirtyArchivePaths.add(normalizeArchivePath(origin.chartPath));\n return true;\n}\n","import type { XlsxThemePalette } from \"./types\";\n\nfunction normalizeHexColor(value: string) {\n const hex = value.replace(/^#/, \"\");\n if (hex.length === 8) {\n return `#${hex.slice(2).toLowerCase()}`;\n }\n if (hex.length === 6) {\n return `#${hex.toLowerCase()}`;\n }\n return null;\n}\n\nfunction parseHexColor(color: string): [number, number, number] | null {\n const normalized = normalizeHexColor(color);\n const match = normalized ? /^#([0-9a-f]{6})$/.exec(normalized) : null;\n if (!match) {\n return null;\n }\n\n const hex = match[1];\n return [\n Number.parseInt(hex.slice(0, 2), 16),\n Number.parseInt(hex.slice(2, 4), 16),\n Number.parseInt(hex.slice(4, 6), 16)\n ];\n}\n\nfunction rgbToHsl(red: number, green: number, blue: number): [number, number, number] {\n const normalizedRed = red / 255;\n const normalizedGreen = green / 255;\n const normalizedBlue = blue / 255;\n const max = Math.max(normalizedRed, normalizedGreen, normalizedBlue);\n const min = Math.min(normalizedRed, normalizedGreen, normalizedBlue);\n const lightness = (max + min) / 2;\n\n if (max === min) {\n return [0, 0, lightness];\n }\n\n const delta = max - min;\n const saturation = lightness > 0.5 ? delta / (2 - max - min) : delta / (max + min);\n let hue = 0;\n\n switch (max) {\n case normalizedRed:\n hue = (normalizedGreen - normalizedBlue) / delta + (normalizedGreen < normalizedBlue ? 6 : 0);\n break;\n case normalizedGreen:\n hue = (normalizedBlue - normalizedRed) / delta + 2;\n break;\n default:\n hue = (normalizedRed - normalizedGreen) / delta + 4;\n break;\n }\n\n return [hue / 6, saturation, lightness];\n}\n\nfunction hueToRgb(p: number, q: number, t: number) {\n let nextT = t;\n if (nextT < 0) {\n nextT += 1;\n }\n if (nextT > 1) {\n nextT -= 1;\n }\n if (nextT < 1 / 6) {\n return p + (q - p) * 6 * nextT;\n }\n if (nextT < 1 / 2) {\n return q;\n }\n if (nextT < 2 / 3) {\n return p + (q - p) * (2 / 3 - nextT) * 6;\n }\n return p;\n}\n\nfunction hslToRgb(hue: number, saturation: number, lightness: number): [number, number, number] {\n if (saturation === 0) {\n const gray = Math.round(lightness * 255);\n return [gray, gray, gray];\n }\n\n const q = lightness < 0.5 ? lightness * (1 + saturation) : lightness + saturation - lightness * saturation;\n const p = 2 * lightness - q;\n\n return [\n Math.round(hueToRgb(p, q, hue + 1 / 3) * 255),\n Math.round(hueToRgb(p, q, hue) * 255),\n Math.round(hueToRgb(p, q, hue - 1 / 3) * 255)\n ];\n}\n\nfunction rgbToHex(red: number, green: number, blue: number) {\n return `#${[red, green, blue]\n .map((channel) => Math.max(0, Math.min(255, channel)).toString(16).padStart(2, \"0\"))\n .join(\"\")}`;\n}\n\nfunction applyExcelTint(baseColor: string, tint: number) {\n const rgb = parseHexColor(baseColor);\n if (!rgb || !Number.isFinite(tint) || tint === 0) {\n return normalizeHexColor(baseColor);\n }\n\n const [hue, saturation, lightness] = rgbToHsl(rgb[0], rgb[1], rgb[2]);\n const nextLightness = tint < 0\n ? lightness * (1 + tint)\n : lightness * (1 - tint) + tint;\n const [nextRed, nextGreen, nextBlue] = hslToRgb(hue, saturation, Math.max(0, Math.min(1, nextLightness)));\n return rgbToHex(nextRed, nextGreen, nextBlue);\n}\n\nexport function buildThemePaletteFromHex(hexColors: readonly string[]): XlsxThemePalette {\n const colorsByIndex: Record<number, string> = {};\n hexColors.forEach((hex, index) => {\n const color = normalizeHexColor(hex);\n if (color) {\n colorsByIndex[index] = color;\n }\n });\n return { colorsByIndex };\n}\n\nexport function resolveWorkbookColor(\n color: Record<string, unknown> | undefined,\n themePalette?: XlsxThemePalette | null\n): string | null {\n if (!color) {\n return null;\n }\n\n const directHex = [\"hex\", \"rgb\", \"argb\"]\n .map((key) => color[key])\n .find((value): value is string => typeof value === \"string\" && value.trim().length > 0);\n if (directHex) {\n return normalizeHexColor(directHex);\n }\n\n const themeValue = color.theme ?? color.themeIndex;\n const numericTheme = typeof themeValue === \"number\"\n ? themeValue\n : typeof themeValue === \"string\" && themeValue.trim().length > 0\n ? Number(themeValue)\n : Number.NaN;\n const themeColor = Number.isFinite(numericTheme) ? themePalette?.colorsByIndex[numericTheme] ?? null : null;\n if (!themeColor) {\n return null;\n }\n\n const tintValue = color.tint;\n const tint = typeof tintValue === \"number\"\n ? tintValue\n : typeof tintValue === \"string\" && tintValue.trim().length > 0\n ? Number(tintValue)\n : Number.NaN;\n\n return Number.isFinite(tint) ? applyExcelTint(themeColor, tint) : themeColor;\n}\n\nexport function resolveWorkbookFillColor(\n fill: Record<string, unknown> | undefined,\n themePalette?: XlsxThemePalette | null\n): string | null {\n if (!fill) {\n return null;\n }\n\n if (fill.fillType === \"solid\") {\n return resolveWorkbookColor(\n (fill.color as Record<string, unknown> | undefined)\n ?? (fill.foreground as Record<string, unknown> | undefined)\n ?? (fill.background as Record<string, unknown> | undefined),\n themePalette\n );\n }\n\n if (fill.fillType === \"pattern\") {\n return resolveWorkbookColor(\n (fill.foreground as Record<string, unknown> | undefined)\n ?? (fill.color as Record<string, unknown> | undefined)\n ?? (fill.background as Record<string, unknown> | undefined),\n themePalette\n );\n }\n\n return null;\n}\n\nexport function resolveWorkbookFillStyle(\n fill: Record<string, unknown> | undefined,\n themePalette?: XlsxThemePalette | null\n) {\n if (!fill) {\n return {\n backgroundColor: null,\n backgroundImage: null\n };\n }\n\n if (fill.fillType === \"gradient\") {\n const rawStops = Array.isArray(fill.stops) ? fill.stops as Array<Record<string, unknown>> : [];\n const stops = rawStops\n .map((stop) => ({\n color: resolveWorkbookColor(stop.color as Record<string, unknown> | undefined, themePalette),\n position: typeof stop.position === \"number\" ? stop.position : Number(stop.position)\n }))\n .filter((stop): stop is { color: string; position: number } => Boolean(stop.color) && Number.isFinite(stop.position))\n .sort((left, right) => left.position - right.position);\n if (stops.length > 0) {\n const gradientType = typeof fill.gradientType === \"string\" ? fill.gradientType : \"linear\";\n if (gradientType === \"path\") {\n const backgroundColor = stops[stops.length - 1]?.color ?? null;\n return {\n backgroundColor,\n backgroundImage: `radial-gradient(circle at center, ${stops.map((stop) => `${stop.color} ${Math.max(0, Math.min(100, stop.position * 100))}%`).join(\", \")})`\n };\n }\n\n const degree = typeof fill.degree === \"number\" ? fill.degree : Number(fill.degree ?? 0);\n const cssAngle = Number.isFinite(degree) ? 90 - degree : 90;\n return {\n backgroundColor: stops[stops.length - 1]?.color ?? null,\n backgroundImage: `linear-gradient(${cssAngle}deg, ${stops.map((stop) => `${stop.color} ${Math.max(0, Math.min(100, stop.position * 100))}%`).join(\", \")})`\n };\n }\n }\n\n return {\n backgroundColor: resolveWorkbookFillColor(fill, themePalette),\n backgroundImage: null\n };\n}\n","import type { Worksheet } from \"@dukelib/sheets-wasm\";\n\nexport type CellGeneralAlignment = \"left\" | \"center\" | \"right\";\n\nexport function getCellGeneralAlignment(worksheet: Worksheet, row: number, col: number): CellGeneralAlignment {\n const value = worksheet.getCalculatedValueAt(row, col);\n try {\n if (value.is_number) return \"right\";\n if (value.is_boolean || value.is_error) return \"center\";\n return \"left\";\n } finally {\n value.free();\n }\n}\n","import type {\n DrawingAnchor as DukeDrawingAnchor,\n DrawingColor as DukeDrawingColor,\n DrawingRunFont as DukeDrawingRunFont,\n DrawingText as DukeDrawingText,\n FormControlDrawing as DukeFormControlDrawing,\n FormControlKind as DukeFormControlKind,\n Workbook\n} from \"@dukelib/sheets-wasm\";\nimport { strFromU8, strToU8, unzipSync, zipSync } from \"fflate\";\nimport { resolveWorkbookColor } from \"./colors\";\nimport type {\n XlsxCellAddress,\n XlsxConditionalDataBarRule,\n XlsxConditionalFormatIcon,\n XlsxConditionalFormatRule,\n XlsxConditionalFormatValueObject,\n XlsxConditionalIconSetRule,\n XlsxCellRange,\n XlsxCellStyleColorInput,\n XlsxFormControl,\n XlsxFormControlCaption,\n XlsxImage,\n XlsxImageAnchor,\n XlsxImageRect,\n XlsxImageResizeHandlePosition,\n XlsxResolvedCellStyle,\n XlsxShape,\n XlsxSparkline,\n XlsxTableStyleDefinition,\n XlsxThemePalette\n} from \"./types\";\n\nconst REL_NS = \"http://schemas.openxmlformats.org/officeDocument/2006/relationships\";\nconst PKG_REL_NS = \"http://schemas.openxmlformats.org/package/2006/relationships\";\nconst SPREADSHEET_NS = \"http://schemas.openxmlformats.org/spreadsheetml/2006/main\";\nconst CONTENT_TYPES_NS = \"http://schemas.openxmlformats.org/package/2006/content-types\";\nconst DRAWING_REL_TYPE = \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/drawing\";\nconst IMAGE_REL_TYPE = \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/image\";\nconst HYPERLINK_REL_TYPE = \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink\";\nconst DRAWING_CONTENT_TYPE = \"application/vnd.openxmlformats-officedocument.drawing+xml\";\nconst EMU_PER_PIXEL = 9525;\nconst MIN_COL_WIDTH_PX = 30;\nconst MIN_ROW_HEIGHT_PX = 16;\nconst DEFAULT_COL_WIDTH_EMU = 64 * EMU_PER_PIXEL;\nconst DEFAULT_ROW_HEIGHT_EMU = 20 * EMU_PER_PIXEL;\nconst DEFAULT_COLUMN_CHARACTER_WIDTH_PX = 7;\nconst columnCharacterWidthCache = new Map<string, number>();\ntype DukeWorksheet = ReturnType<Workbook[\"getSheet\"]>;\n\nfunction resolveDeviceGridlineThicknessPx() {\n if (typeof window === \"undefined\") {\n return 1;\n }\n\n const devicePixelRatio = window.devicePixelRatio;\n if (!Number.isFinite(devicePixelRatio) || devicePixelRatio <= 0) {\n return 1;\n }\n\n return 1 / devicePixelRatio;\n}\n\nfunction measureColumnCharacterWidthPx(fontFamily?: string | null, fontSizePt?: number | null) {\n const normalizedFamily = typeof fontFamily === \"string\" && fontFamily.trim().length > 0\n ? fontFamily.trim()\n : \"Calibri\";\n const normalizedSizePt = typeof fontSizePt === \"number\" && Number.isFinite(fontSizePt) && fontSizePt > 0\n ? fontSizePt\n : 11;\n const cacheKey = `${normalizedFamily}|${normalizedSizePt}`;\n const cached = columnCharacterWidthCache.get(cacheKey);\n if (cached !== undefined) {\n return cached;\n }\n\n const fontSizePx = normalizedSizePt * (96 / 72);\n const family = JSON.stringify(normalizedFamily);\n const fallback = normalizedFamily.toLowerCase() === \"calibri\" || normalizedFamily.toLowerCase() === \"carlito\"\n ? ', \"Carlito\", \"React XLSX Carlito\"'\n : \"\";\n const font = `${fontSizePx}px ${family}${fallback}`;\n let width = DEFAULT_COLUMN_CHARACTER_WIDTH_PX;\n\n try {\n const context = typeof document !== \"undefined\"\n ? document.createElement(\"canvas\").getContext(\"2d\")\n : typeof OffscreenCanvas !== \"undefined\"\n ? new OffscreenCanvas(32, 32).getContext(\"2d\")\n : null;\n if (context) {\n context.font = font;\n width = Math.max(1, context.measureText(\"0\").width);\n }\n } catch {\n width = DEFAULT_COLUMN_CHARACTER_WIDTH_PX;\n }\n\n columnCharacterWidthCache.set(cacheKey, width);\n return width;\n}\n\nfunction sheetColumnWidthToPixels(width: number, columnCharacterWidthPx = DEFAULT_COLUMN_CHARACTER_WIDTH_PX) {\n if (!Number.isFinite(width) || width <= 0) {\n return MIN_COL_WIDTH_PX;\n }\n\n const digitWidth = Math.max(1, columnCharacterWidthPx);\n const pixels = width < 1\n ? Math.floor(width * (digitWidth + 5) + 0.5)\n : Math.floor(((256 * width + Math.floor(128 / digitWidth)) / 256) * digitWidth);\n return Math.max(MIN_COL_WIDTH_PX, pixels);\n}\n\nexport function resolveWorksheetDefaultColumnWidthPixels(\n worksheet: DukeWorksheet,\n columnCharacterWidthPx = DEFAULT_COLUMN_CHARACTER_WIDTH_PX,\n fallbackPx = sheetColumnWidthToPixels(8.43, columnCharacterWidthPx)\n) {\n const width = typeof worksheet.defaultColumnWidth === \"number\" ? worksheet.defaultColumnWidth : Number.NaN;\n return Number.isFinite(width) && width > 0\n ? sheetColumnWidthToPixels(width, columnCharacterWidthPx)\n : fallbackPx;\n}\n\nexport function resolveWorksheetDefaultRowHeightPixels(\n worksheet: DukeWorksheet,\n fallbackPx = Math.max(MIN_ROW_HEIGHT_PX, Math.round(15 * 1.33))\n) {\n const height = typeof worksheet.defaultRowHeight === \"number\" ? worksheet.defaultRowHeight : Number.NaN;\n return Number.isFinite(height) && height > 0\n ? Math.max(MIN_ROW_HEIGHT_PX, Math.round(height * 1.33))\n : fallbackPx;\n}\n\nexport function resolveWorksheetHiddenRows(worksheet: DukeWorksheet, maxRow: number) {\n if (!Number.isFinite(maxRow) || maxRow < 0 || typeof worksheet.isRowHidden !== \"function\") {\n return [] as number[];\n }\n\n const hiddenRows: number[] = [];\n for (let row = 0; row <= maxRow; row += 1) {\n if (worksheet.isRowHidden(row)) {\n hiddenRows.push(row);\n }\n }\n return hiddenRows;\n}\n\nexport function resolveWorksheetHiddenCols(worksheet: DukeWorksheet, maxCol: number) {\n if (!Number.isFinite(maxCol) || maxCol < 0 || typeof worksheet.isColumnHidden !== \"function\") {\n return [] as number[];\n }\n\n const hiddenCols: number[] = [];\n for (let col = 0; col <= maxCol; col += 1) {\n if (worksheet.isColumnHidden(col)) {\n hiddenCols.push(col);\n }\n }\n return hiddenCols;\n}\n\nexport function resolveWorksheetMergeMetadata(worksheet: DukeWorksheet) {\n const mergeMetadata = {\n hasHorizontalMerges: false,\n hasVerticalMerges: false,\n maxHorizontalMergeEndCol: -1,\n maxVerticalMergeEndRow: -1,\n mergedRanges: [] as XlsxCellRange[]\n };\n const mergedRegions = Array.isArray(worksheet.mergedRegions) ? worksheet.mergedRegions : [];\n\n for (const rawRegion of mergedRegions) {\n let range: XlsxCellRange | null = null;\n if (typeof rawRegion === \"string\") {\n range = parseA1RangeReference(rawRegion);\n } else if (rawRegion && typeof rawRegion === \"object\") {\n const region = rawRegion as Record<string, unknown>;\n const startRow = typeof region.startRow === \"number\" ? region.startRow : Number.NaN;\n const startCol = typeof region.startCol === \"number\" ? region.startCol : Number.NaN;\n const endRow = typeof region.endRow === \"number\" ? region.endRow : Number.NaN;\n const endCol = typeof region.endCol === \"number\" ? region.endCol : Number.NaN;\n if ([startRow, startCol, endRow, endCol].every((value) => Number.isFinite(value) && value >= 0)) {\n range = {\n end: {\n col: Math.max(startCol, endCol),\n row: Math.max(startRow, endRow)\n },\n start: {\n col: Math.min(startCol, endCol),\n row: Math.min(startRow, endRow)\n }\n };\n } else if (typeof region.range === \"string\") {\n range = parseA1RangeReference(region.range);\n }\n }\n\n if (!range) {\n continue;\n }\n\n mergeMetadata.mergedRanges.push(range);\n if (range.end.col > range.start.col) {\n mergeMetadata.hasHorizontalMerges = true;\n mergeMetadata.maxHorizontalMergeEndCol = Math.max(mergeMetadata.maxHorizontalMergeEndCol, range.end.col);\n }\n if (range.end.row > range.start.row) {\n mergeMetadata.hasVerticalMerges = true;\n mergeMetadata.maxVerticalMergeEndRow = Math.max(mergeMetadata.maxVerticalMergeEndRow, range.end.row);\n }\n }\n\n return mergeMetadata;\n}\n\ntype ArchiveEntries = Record<string, Uint8Array>;\n\ntype ContentTypesState = {\n defaultEntries: Map<string, string>;\n overrideEntries: Map<string, string>;\n};\n\ntype RelationshipRecord = {\n id: string;\n target: string;\n targetMode: string | null;\n type: string;\n};\n\ntype WorkbookSheetInfo = {\n name: string;\n path: string;\n};\n\ntype WorkbookSheetState = {\n cellStyleIds: Record<string, number>;\n autoFilterRanges: XlsxCellRange[];\n cachedFormulaValues: Record<string, string>;\n columnWidthCharacterWidthPx?: number;\n colWidthOverridesPx: Record<number, number>;\n colStyleIds: Record<number, number>;\n conditionalFormatRules: XlsxConditionalFormatRule[];\n defaultColWidthPx: number;\n defaultRowHeightPx: number;\n hasHorizontalMerges: boolean;\n hasVerticalMerges: boolean;\n maxHorizontalMergeEndCol: number;\n maxVerticalMergeEndRow: number;\n maxContentCol: number;\n maxContentRow: number;\n minContentCol: number;\n minContentRow: number;\n hiddenCols: number[];\n hiddenRows: number[];\n rowHeightOverridesPx: Record<number, number>;\n rowStyleIds: Record<number, number>;\n showGridLines: boolean;\n sparklines: XlsxSparkline[];\n zoomScale: number;\n};\n\ntype ParseWorkbookStructureOptions = {\n includeCachedFormulaValues?: boolean;\n themePalette?: XlsxThemePalette | null;\n};\n\ntype ThemeState = {\n colors: Map<string, string>;\n majorLatinFont: string | null;\n minorLatinFont: string | null;\n};\n\ntype DrawingColor = {\n color: string;\n opacity: number;\n};\n\ntype DrawingRectEmu = {\n cx: number;\n cy: number;\n x: number;\n y: number;\n};\n\ntype ShapeVectorPath = {\n path: string;\n viewBox: {\n height: number;\n width: number;\n };\n};\n\ntype GroupTransform = {\n chCx: number;\n chCy: number;\n chX: number;\n chY: number;\n cx: number;\n cy: number;\n scaleX: number;\n scaleY: number;\n x: number;\n y: number;\n};\n\ntype XlsxImageAttachment = {\n drawingPath: string;\n drawingRelsPath: string | null;\n mediaPaths: string[];\n};\n\ntype WorkbookImageOrigin = {\n anchorIndex: number;\n drawingPath: string;\n picturePath: number[];\n workbookSheetIndex: number;\n};\n\nexport type WorkbookImageSheetOrigin = {\n attachments: XlsxImageAttachment[];\n workbookSheetIndex: number;\n};\n\nexport type WorkbookTableMetadata = {\n displayName?: string;\n headerRowCount?: number;\n headerRowCellStyle?: string;\n name?: string;\n reference?: string;\n totalsRowCount?: number;\n totalsRowShown?: boolean;\n};\n\nexport type WorkbookImageAssets = {\n archive: ArchiveEntries;\n dirtyArchivePaths: Set<string>;\n formControlsByWorkbookSheetIndex: XlsxFormControl[][];\n imageOriginsById: Map<string, WorkbookImageOrigin>;\n imagesByWorkbookSheetIndex: XlsxImage[][];\n namedCellStyleByName: Record<string, XlsxResolvedCellStyle>;\n objectUrls: string[];\n shapesByWorkbookSheetIndex: XlsxShape[][];\n sheetStatesByWorkbookSheetIndex: Array<WorkbookSheetState | null>;\n sheetOrigins: Array<WorkbookImageSheetOrigin | null>;\n styleById: Record<number, XlsxResolvedCellStyle>;\n tableMetadataByWorkbookSheetIndex: WorkbookTableMetadata[][];\n tableStyleByName: Record<string, XlsxTableStyleDefinition>;\n themePalette: XlsxThemePalette;\n};\n\nexport type WorkbookStructureAssets = Pick<\n WorkbookImageAssets,\n | \"namedCellStyleByName\"\n | \"sheetStatesByWorkbookSheetIndex\"\n | \"styleById\"\n | \"tableMetadataByWorkbookSheetIndex\"\n | \"tableStyleByName\"\n | \"themePalette\"\n>;\n\nexport type WorkbookChartStyleAssets = Pick<\n WorkbookImageAssets,\n | \"archive\"\n | \"sheetOrigins\"\n | \"themePalette\"\n>;\n\nfunction buildThemePalette(theme: ThemeState): XlsxThemePalette {\n const themeOrder = [\"lt1\", \"dk1\", \"lt2\", \"dk2\", \"accent1\", \"accent2\", \"accent3\", \"accent4\", \"accent5\", \"accent6\", \"hlink\", \"folHlink\"];\n const colorsByIndex: Record<number, string> = {};\n\n themeOrder.forEach((key, index) => {\n const color = theme.colors.get(key);\n if (color) {\n colorsByIndex[index] = color;\n }\n });\n\n return {\n colorsByIndex,\n majorLatinFont: theme.majorLatinFont ?? undefined,\n minorLatinFont: theme.minorLatinFont ?? undefined\n };\n}\n\nfunction cloneBytes(bytes: Uint8Array) {\n const nextBytes = new Uint8Array(bytes.byteLength);\n nextBytes.set(bytes);\n return nextBytes;\n}\n\nfunction normalizeArchivePath(path: string) {\n return path.replace(/\\\\/g, \"/\").replace(/^\\/+/, \"\");\n}\n\nfunction joinArchivePath(...parts: string[]) {\n return normalizeArchivePath(parts.join(\"/\"));\n}\n\nfunction dirname(path: string) {\n const normalized = normalizeArchivePath(path);\n const lastSlash = normalized.lastIndexOf(\"/\");\n return lastSlash >= 0 ? normalized.slice(0, lastSlash) : \"\";\n}\n\nfunction resolveArchiveTarget(baseDocumentPath: string, target: string) {\n if (!target) {\n return normalizeArchivePath(baseDocumentPath);\n }\n\n if (target.startsWith(\"#\")) {\n return target;\n }\n\n if (target.startsWith(\"/\")) {\n return normalizeArchivePath(target);\n }\n\n const baseParts = dirname(baseDocumentPath).split(\"/\").filter(Boolean);\n for (const segment of target.split(\"/\")) {\n if (!segment || segment === \".\") {\n continue;\n }\n if (segment === \"..\") {\n baseParts.pop();\n continue;\n }\n baseParts.push(segment);\n }\n\n return normalizeArchivePath(baseParts.join(\"/\"));\n}\n\nfunction relativeArchivePath(fromDocumentPath: string, toPath: string) {\n const fromParts = dirname(fromDocumentPath).split(\"/\").filter(Boolean);\n const toParts = normalizeArchivePath(toPath).split(\"/\").filter(Boolean);\n let shared = 0;\n while (shared < fromParts.length && shared < toParts.length && fromParts[shared] === toParts[shared]) {\n shared += 1;\n }\n\n const upSegments = fromParts.slice(shared).map(() => \"..\");\n const downSegments = toParts.slice(shared);\n return [...upSegments, ...downSegments].join(\"/\") || \".\";\n}\n\nfunction relsPathForDocument(documentPath: string) {\n const baseName = documentPath.split(\"/\").pop();\n const parentDir = dirname(documentPath);\n return joinArchivePath(parentDir, \"_rels\", `${baseName}.rels`);\n}\n\nfunction parseXml(xml: string) {\n const parser = new DOMParser();\n const document = parser.parseFromString(xml, \"application/xml\");\n if (document.querySelector(\"parsererror\")) {\n return null;\n }\n return document;\n}\n\nfunction serializeXml(document: XMLDocument) {\n return new XMLSerializer().serializeToString(document);\n}\n\nfunction readArchiveText(archive: ArchiveEntries, path: string) {\n const entry = archive[path];\n return entry ? strFromU8(entry) : null;\n}\n\nfunction parseColumnReference(reference: string) {\n let value = 0;\n for (const character of reference.toUpperCase()) {\n if (character < \"A\" || character > \"Z\") {\n return null;\n }\n value = value * 26 + (character.charCodeAt(0) - 64);\n }\n return value > 0 ? value - 1 : null;\n}\n\nfunction parseA1CellReference(reference: string) {\n const match = /^\\$?([A-Za-z]+)\\$?(\\d+)$/.exec(reference.trim());\n if (!match) {\n return null;\n }\n\n const col = parseColumnReference(match[1] ?? \"\");\n const row = Number(match[2] ?? Number.NaN) - 1;\n if (col === null || !Number.isFinite(row) || row < 0) {\n return null;\n }\n\n return { col, row };\n}\n\nfunction parseA1RangeReference(reference: string) {\n const [startRef, endRef] = reference.split(\":\");\n const start = parseA1CellReference(startRef ?? \"\");\n const end = parseA1CellReference(endRef ?? startRef ?? \"\");\n return start && end ? { end, start } : null;\n}\n\nfunction stripSheetNameFromFormulaReference(reference: string) {\n const trimmed = reference.trim();\n const bangIndex = trimmed.lastIndexOf(\"!\");\n return bangIndex >= 0 ? trimmed.slice(bangIndex + 1) : trimmed;\n}\n\nfunction parseFormulaCellReference(reference: string) {\n const normalized = stripSheetNameFromFormulaReference(reference).split(/\\s+/)[0] ?? \"\";\n return parseA1CellReference(normalized);\n}\n\nfunction parseFormulaRangeReference(reference: string) {\n return parseA1RangeReference(stripSheetNameFromFormulaReference(reference));\n}\n\nfunction isElementNode(node: Node | null | undefined): node is Element {\n return Boolean(node && node.nodeType === 1);\n}\n\nfunction getLocalElements(parent: Document | Element, localName: string) {\n return Array.from(parent.getElementsByTagName(\"*\")).filter((node): node is Element => isElementNode(node) && node.localName === localName);\n}\n\nfunction getChildElements(parent: Element, localName: string) {\n return Array.from(parent.childNodes).filter((node): node is Element => isElementNode(node) && node.localName === localName);\n}\n\nfunction getFirstChild(parent: Element, localName: string) {\n return getChildElements(parent, localName)[0] ?? null;\n}\n\nfunction getFirstDescendant(parent: Document | Element, localName: string) {\n return getLocalElements(parent, localName)[0] ?? null;\n}\n\nfunction readFeaturePropertyBagCheckboxComplements(archive: ArchiveEntries) {\n const xml = readArchiveText(archive, \"xl/featurePropertyBag/featurePropertyBag.xml\");\n if (!xml) {\n return new Set<number>();\n }\n\n const document = parseXml(xml);\n if (!document?.documentElement) {\n return new Set<number>();\n }\n\n const bagNodes = getChildElements(document.documentElement, \"bag\");\n const bagTypeById = bagNodes.map((node) => node.getAttribute(\"type\") ?? \"\");\n const checkboxComplementIndices = new Set<number>();\n\n const xfComplementsBag = bagNodes.find((node) => node.getAttribute(\"type\") === \"XFComplements\") ?? null;\n const mappedBagIds = xfComplementsBag\n ? getLocalElements(xfComplementsBag, \"bagId\")\n .map((node) => Number(node.textContent ?? Number.NaN))\n .filter((value) => Number.isFinite(value))\n : [];\n\n mappedBagIds.forEach((bagId, complementIndex) => {\n const xfComplementBag = bagNodes[bagId];\n if (!xfComplementBag || bagTypeById[bagId] !== \"XFComplement\") {\n return;\n }\n\n const xfControlsBagId = getLocalElements(xfComplementBag, \"bagId\")\n .map((node) => Number(node.textContent ?? Number.NaN))\n .find((value) => Number.isFinite(value));\n if (xfControlsBagId === undefined) {\n return;\n }\n\n const xfControlsBag = bagNodes[xfControlsBagId];\n if (!xfControlsBag || bagTypeById[xfControlsBagId] !== \"XFControls\") {\n return;\n }\n\n const cellControlBagId = getLocalElements(xfControlsBag, \"bagId\")\n .map((node) => Number(node.textContent ?? Number.NaN))\n .find((value) => Number.isFinite(value));\n if (cellControlBagId === undefined) {\n return;\n }\n\n if (bagTypeById[cellControlBagId] === \"Checkbox\") {\n checkboxComplementIndices.add(complementIndex);\n }\n });\n\n return checkboxComplementIndices;\n}\n\nfunction getRelationshipId(element: Element) {\n return element.getAttributeNS(REL_NS, \"id\") ?? element.getAttribute(\"r:id\") ?? element.getAttribute(\"id\");\n}\n\nfunction getEmbeddedRelationshipId(element: Element) {\n return element.getAttributeNS(REL_NS, \"embed\") ?? element.getAttribute(\"r:embed\") ?? element.getAttribute(\"embed\");\n}\n\nfunction setChildText(parent: Element, localName: string, value: string) {\n const child = getFirstChild(parent, localName);\n if (child) {\n child.textContent = value;\n }\n}\n\nfunction updateMarkerElement(element: Element | null, marker: { col: number; colOffsetEmu: number; row: number; rowOffsetEmu: number }) {\n if (!element) {\n return;\n }\n\n setChildText(element, \"col\", String(Math.max(0, marker.col)));\n setChildText(element, \"colOff\", String(Math.max(0, Math.round(marker.colOffsetEmu))));\n setChildText(element, \"row\", String(Math.max(0, marker.row)));\n setChildText(element, \"rowOff\", String(Math.max(0, Math.round(marker.rowOffsetEmu))));\n}\n\nfunction parseContentTypes(archive: ArchiveEntries): ContentTypesState {\n const xml = readArchiveText(archive, \"[Content_Types].xml\");\n const defaultEntries = new Map<string, string>();\n const overrideEntries = new Map<string, string>();\n if (!xml) {\n return { defaultEntries, overrideEntries };\n }\n\n const document = parseXml(xml);\n if (!document) {\n return { defaultEntries, overrideEntries };\n }\n\n for (const defaultNode of getLocalElements(document, \"Default\")) {\n const extension = defaultNode.getAttribute(\"Extension\");\n const contentType = defaultNode.getAttribute(\"ContentType\");\n if (extension && contentType) {\n defaultEntries.set(extension.toLowerCase(), contentType);\n }\n }\n\n for (const overrideNode of getLocalElements(document, \"Override\")) {\n const partName = overrideNode.getAttribute(\"PartName\");\n const contentType = overrideNode.getAttribute(\"ContentType\");\n if (partName && contentType) {\n overrideEntries.set(normalizeArchivePath(partName), contentType);\n }\n }\n\n return { defaultEntries, overrideEntries };\n}\n\nfunction resolveContentType(contentTypes: ContentTypesState, path: string) {\n const normalized = normalizeArchivePath(path);\n const override = contentTypes.overrideEntries.get(normalized);\n if (override) {\n return override;\n }\n\n const extension = normalized.split(\".\").pop()?.toLowerCase();\n if (!extension) {\n return \"application/octet-stream\";\n }\n\n return contentTypes.defaultEntries.get(extension) ?? \"application/octet-stream\";\n}\n\nfunction parseRelationships(archive: ArchiveEntries, relsPath: string, baseDocumentPath: string) {\n const xml = readArchiveText(archive, relsPath);\n const relationships = new Map<string, RelationshipRecord>();\n if (!xml) {\n return relationships;\n }\n\n const document = parseXml(xml);\n if (!document) {\n return relationships;\n }\n\n for (const relationshipNode of getLocalElements(document, \"Relationship\")) {\n const id = relationshipNode.getAttribute(\"Id\");\n const target = relationshipNode.getAttribute(\"Target\");\n const type = relationshipNode.getAttribute(\"Type\");\n if (!id || !target || !type) {\n continue;\n }\n\n relationships.set(id, {\n id,\n target: resolveArchiveTarget(baseDocumentPath, target),\n targetMode: relationshipNode.getAttribute(\"TargetMode\"),\n type\n });\n }\n\n return relationships;\n}\n\nfunction parseWorkbookSheets(archive: ArchiveEntries) {\n const workbookXml = readArchiveText(archive, \"xl/workbook.xml\");\n if (!workbookXml) {\n return [];\n }\n\n const workbookDocument = parseXml(workbookXml);\n if (!workbookDocument) {\n return [];\n }\n\n const workbookRelationships = parseRelationships(archive, \"xl/_rels/workbook.xml.rels\", \"xl/workbook.xml\");\n const sheets: WorkbookSheetInfo[] = [];\n\n for (const sheetNode of getLocalElements(workbookDocument, \"sheet\")) {\n const relationshipId = getRelationshipId(sheetNode);\n if (!relationshipId) {\n continue;\n }\n\n const relationship = workbookRelationships.get(relationshipId);\n if (!relationship) {\n continue;\n }\n\n sheets.push({\n name: sheetNode.getAttribute(\"name\") ?? `Sheet ${sheets.length + 1}`,\n path: relationship.target\n });\n }\n\n return sheets;\n}\n\nfunction parseWorkbookTheme(archive: ArchiveEntries): ThemeState {\n const defaultTheme: ThemeState = {\n colors: new Map([\n [\"accent1\", \"#5b9bd5\"],\n [\"accent2\", \"#ed7d31\"],\n [\"accent3\", \"#a5a5a5\"],\n [\"accent4\", \"#ffc000\"],\n [\"accent5\", \"#4472c4\"],\n [\"accent6\", \"#70ad47\"],\n [\"bg1\", \"#ffffff\"],\n [\"bg2\", \"#e7e6e6\"],\n [\"dk1\", \"#000000\"],\n [\"dk2\", \"#6e747a\"],\n [\"folHlink\", \"#993366\"],\n [\"hlink\", \"#085296\"],\n [\"lt1\", \"#ffffff\"],\n [\"lt2\", \"#e7e6e6\"],\n [\"tx1\", \"#000000\"],\n [\"tx2\", \"#6e747a\"]\n ]),\n majorLatinFont: null,\n minorLatinFont: null\n };\n\n const themeXml = readArchiveText(archive, \"xl/theme/theme1.xml\");\n if (!themeXml) {\n return defaultTheme;\n }\n\n const themeDocument = parseXml(themeXml);\n if (!themeDocument) {\n return defaultTheme;\n }\n\n const colors = new Map(defaultTheme.colors);\n const colorSchemeNode = getLocalElements(themeDocument, \"clrScheme\")[0] ?? null;\n if (colorSchemeNode) {\n for (const colorNode of Array.from(colorSchemeNode.childNodes).filter(isElementNode)) {\n const key = colorNode.localName;\n const srgbNode = getFirstChild(colorNode, \"srgbClr\");\n const sysNode = getFirstChild(colorNode, \"sysClr\");\n const hex = srgbNode?.getAttribute(\"val\") ?? sysNode?.getAttribute(\"lastClr\");\n if (hex) {\n colors.set(key, normalizeHexColor(hex));\n }\n }\n }\n\n const fontSchemeNode = getLocalElements(themeDocument, \"fontScheme\")[0] ?? null;\n const majorLatinFont = getFirstChild(getFirstChild(fontSchemeNode, \"majorFont\"), \"latin\")?.getAttribute(\"typeface\") ?? null;\n const minorLatinFont = getFirstChild(getFirstChild(fontSchemeNode, \"minorFont\"), \"latin\")?.getAttribute(\"typeface\") ?? null;\n\n colors.set(\"bg1\", colors.get(\"lt1\") ?? defaultTheme.colors.get(\"bg1\") ?? \"#ffffff\");\n colors.set(\"tx1\", colors.get(\"dk1\") ?? defaultTheme.colors.get(\"tx1\") ?? \"#000000\");\n colors.set(\"bg2\", colors.get(\"lt2\") ?? defaultTheme.colors.get(\"bg2\") ?? \"#e7e6e6\");\n colors.set(\"tx2\", colors.get(\"dk2\") ?? defaultTheme.colors.get(\"tx2\") ?? \"#6e747a\");\n\n return {\n colors,\n majorLatinFont,\n minorLatinFont\n };\n}\n\nfunction parseSpreadsheetColor(node: Element | null) {\n if (!node) {\n return undefined;\n }\n\n const color: Record<string, unknown> = {};\n const rgb = node.getAttribute(\"rgb\");\n const theme = node.getAttribute(\"theme\");\n const tint = node.getAttribute(\"tint\");\n const indexed = node.getAttribute(\"indexed\");\n if (rgb) {\n color.rgb = normalizeHexColor(rgb);\n }\n if (theme !== null) {\n color.theme = Number(theme);\n }\n if (tint !== null) {\n color.tint = Number(tint);\n }\n if (indexed !== null) {\n color.indexed = Number(indexed);\n }\n\n return Object.keys(color).length > 0 ? color : undefined;\n}\n\nfunction hasEnabledSpreadsheetFlag(node: Element | null) {\n if (!node) {\n return false;\n }\n\n const value = node.getAttribute(\"val\");\n return value === null || (value !== \"0\" && value !== \"false\");\n}\n\nfunction parseSheetSparklines(\n document: XMLDocument,\n themePalette?: XlsxThemePalette | null\n) {\n const sparklines: XlsxSparkline[] = [];\n\n for (const groupNode of getLocalElements(document, \"sparklineGroup\")) {\n const rawType = groupNode.getAttribute(\"type\");\n const sparklineType: XlsxSparkline[\"type\"] = rawType === \"column\"\n ? \"column\"\n : rawType === \"stacked\"\n ? \"winLoss\"\n : \"line\";\n\n const markersNode = getFirstChild(groupNode, \"markers\");\n const negativeNode = getFirstChild(groupNode, \"negative\");\n const colorSeries = resolveWorkbookColor(parseSpreadsheetColor(getFirstChild(groupNode, \"colorSeries\")), themePalette);\n const colorNegative = resolveWorkbookColor(parseSpreadsheetColor(getFirstChild(groupNode, \"colorNegative\")), themePalette);\n const colorMarkers = resolveWorkbookColor(parseSpreadsheetColor(getFirstChild(groupNode, \"colorMarkers\")), themePalette);\n const colorFirst = resolveWorkbookColor(parseSpreadsheetColor(getFirstChild(groupNode, \"colorFirst\")), themePalette);\n const colorLast = resolveWorkbookColor(parseSpreadsheetColor(getFirstChild(groupNode, \"colorLast\")), themePalette);\n const colorHigh = resolveWorkbookColor(parseSpreadsheetColor(getFirstChild(groupNode, \"colorHigh\")), themePalette);\n const colorLow = resolveWorkbookColor(parseSpreadsheetColor(getFirstChild(groupNode, \"colorLow\")), themePalette);\n const sparklineCollectionNode = getFirstChild(groupNode, \"sparklines\");\n if (!sparklineCollectionNode) {\n continue;\n }\n\n for (const sparklineNode of getChildElements(sparklineCollectionNode, \"sparkline\")) {\n const formula = getFirstChild(sparklineNode, \"f\")?.textContent ?? \"\";\n const targetReference = getFirstChild(sparklineNode, \"sqref\")?.textContent ?? \"\";\n const range = parseFormulaRangeReference(formula);\n const target = parseFormulaCellReference(targetReference);\n if (!range || !target) {\n continue;\n }\n\n sparklines.push({\n color: colorSeries ?? undefined,\n firstColor: colorFirst ?? undefined,\n highColor: colorHigh ?? undefined,\n lastColor: colorLast ?? undefined,\n lowColor: colorLow ?? undefined,\n markerColor: colorMarkers ?? undefined,\n markers: hasEnabledSpreadsheetFlag(markersNode),\n negative: hasEnabledSpreadsheetFlag(negativeNode),\n negativeColor: colorNegative ?? undefined,\n range,\n target,\n type: sparklineType\n });\n }\n }\n\n return sparklines;\n}\n\nfunction parseSpreadsheetFont(node: Element | null): XlsxResolvedCellStyle[\"font\"] {\n if (!node) {\n return undefined;\n }\n\n const font: Record<string, unknown> = {};\n for (const [tag, property] of [[\"b\", \"bold\"], [\"i\", \"italic\"], [\"strike\", \"strikethrough\"]]) {\n const flag = getFirstChild(node, tag);\n if (flag) {\n font[property] = hasEnabledSpreadsheetFlag(flag);\n }\n }\n const size = getFirstChild(node, \"sz\")?.getAttribute(\"val\");\n const name = getFirstChild(node, \"name\")?.getAttribute(\"val\");\n const family = getFirstChild(node, \"family\")?.getAttribute(\"val\");\n const scheme = getFirstChild(node, \"scheme\")?.getAttribute(\"val\");\n const charset = getFirstChild(node, \"charset\")?.getAttribute(\"val\");\n const verticalAlign = getFirstChild(node, \"vertAlign\")?.getAttribute(\"val\");\n const color = parseSpreadsheetColor(getFirstChild(node, \"color\"));\n if (getFirstChild(node, \"u\")) {\n font.underline = getFirstChild(node, \"u\")?.getAttribute(\"val\") ?? \"single\";\n }\n if (size !== null && size !== undefined) {\n font.size = Number(size);\n }\n if (name) {\n font.name = name;\n }\n if (family !== null && family !== undefined) {\n font.family = Number(family);\n }\n if (scheme) {\n font.scheme = scheme;\n }\n if (charset !== null && charset !== undefined) {\n font.charset = Number(charset);\n }\n if (verticalAlign) {\n font.verticalAlign = verticalAlign;\n }\n if (hasEnabledSpreadsheetFlag(getFirstChild(node, \"shadow\"))) {\n font.shadow = true;\n }\n if (hasEnabledSpreadsheetFlag(getFirstChild(node, \"outline\"))) {\n font.outline = true;\n }\n if (hasEnabledSpreadsheetFlag(getFirstChild(node, \"condense\"))) {\n font.condense = true;\n }\n if (hasEnabledSpreadsheetFlag(getFirstChild(node, \"extend\"))) {\n font.extend = true;\n }\n if (color) {\n font.color = color;\n }\n\n return Object.keys(font).length > 0 ? font : undefined;\n}\n\nfunction parseSpreadsheetFill(node: Element | null): XlsxResolvedCellStyle[\"fill\"] {\n if (!node) {\n return undefined;\n }\n\n const gradientFill = getFirstChild(node, \"gradientFill\");\n if (gradientFill) {\n const stops = Array.from(gradientFill.childNodes)\n .filter(isElementNode)\n .filter((child) => child.localName === \"stop\")\n .map((stopNode) => ({\n color: parseSpreadsheetColor(Array.from(stopNode.childNodes).find(isElementNode) ?? null),\n position: Number(stopNode.getAttribute(\"position\") ?? Number.NaN)\n }))\n .filter((stop) => stop.color && Number.isFinite(stop.position));\n if (stops.length > 0) {\n return {\n degree: Number(gradientFill.getAttribute(\"degree\") ?? 0),\n fillType: \"gradient\",\n gradientType: gradientFill.getAttribute(\"type\") ?? \"linear\",\n stops\n };\n }\n }\n\n const patternFill = getFirstChild(node, \"patternFill\");\n if (!patternFill) {\n return undefined;\n }\n\n const patternType = patternFill.getAttribute(\"patternType\") ?? \"none\";\n const foreground = parseSpreadsheetColor(getFirstChild(patternFill, \"fgColor\"));\n const background = parseSpreadsheetColor(getFirstChild(patternFill, \"bgColor\"));\n const solidColor = foreground ?? background;\n if (patternType === \"solid\" && solidColor) {\n return {\n color: solidColor,\n fillType: \"solid\"\n };\n }\n // Differential table styles sometimes omit patternType and only set bgColor.\n // Preserve those fills so header/table overrides are not dropped during import.\n if ((patternType === \"none\" || patternType === \"gray125\") && (foreground || background)) {\n return {\n background,\n fillType: \"pattern\",\n foreground,\n patternType\n };\n }\n if (patternType !== \"none\" && patternType !== \"gray125\" && (foreground || background)) {\n return {\n background,\n fillType: \"pattern\",\n foreground,\n patternType\n };\n }\n\n return undefined;\n}\n\nfunction parseSpreadsheetBorderEdge(node: Element | null) {\n if (!node) {\n return undefined;\n }\n\n const style = node.getAttribute(\"style\");\n const color = parseSpreadsheetColor(getFirstChild(node, \"color\"));\n if (!style || style === \"none\") {\n return undefined;\n }\n\n return {\n color,\n style\n };\n}\n\nfunction parseSpreadsheetBorder(node: Element | null): XlsxResolvedCellStyle[\"border\"] {\n if (!node) {\n return undefined;\n }\n\n const border: Record<string, Record<string, unknown>> = {};\n ([\"top\", \"right\", \"bottom\", \"left\", \"horizontal\", \"vertical\"] as const).forEach((edge) => {\n const parsedEdge = parseSpreadsheetBorderEdge(getFirstChild(node, edge));\n if (parsedEdge) {\n border[edge] = parsedEdge;\n }\n });\n\n return Object.keys(border).length > 0 ? border : undefined;\n}\n\nfunction parseSpreadsheetAlignment(node: Element | null): XlsxResolvedCellStyle[\"alignment\"] {\n if (!node) {\n return undefined;\n }\n\n const alignment: Record<string, unknown> = {};\n const horizontal = node.getAttribute(\"horizontal\");\n const vertical = node.getAttribute(\"vertical\");\n const wrapText = node.getAttribute(\"wrapText\");\n const indent = node.getAttribute(\"indent\");\n const shrinkToFit = node.getAttribute(\"shrinkToFit\");\n const textRotation = node.getAttribute(\"textRotation\");\n if (horizontal) {\n alignment.horizontal = horizontal;\n }\n if (vertical) {\n alignment.vertical = vertical;\n }\n if (wrapText !== null) {\n alignment.wrapText = wrapText === \"1\";\n }\n if (shrinkToFit !== null) {\n alignment.shrinkToFit = shrinkToFit === \"1\";\n }\n if (indent !== null) {\n alignment.indent = Number(indent);\n }\n if (textRotation !== null) {\n const parsedRotation = Number(textRotation);\n if (Number.isFinite(parsedRotation)) {\n alignment.rotation = parsedRotation;\n }\n }\n\n return Object.keys(alignment).length > 0 ? alignment : undefined;\n}\n\nfunction parseDifferentialStyle(node: Element | null): XlsxResolvedCellStyle {\n if (!node) {\n return {};\n }\n\n const style: XlsxResolvedCellStyle = {};\n const font = parseSpreadsheetFont(getFirstChild(node, \"font\"));\n const fill = parseSpreadsheetFill(getFirstChild(node, \"fill\"));\n const border = parseSpreadsheetBorder(getFirstChild(node, \"border\"));\n const alignment = parseSpreadsheetAlignment(getFirstChild(node, \"alignment\"));\n\n if (font) {\n style.font = font;\n }\n if (fill) {\n style.fill = fill;\n }\n if (border) {\n style.border = border;\n }\n if (alignment) {\n style.alignment = alignment;\n }\n\n return style;\n}\n\nfunction parseResolvedXfStyle(\n xfNode: Element,\n fonts: Array<XlsxResolvedCellStyle[\"font\"]>,\n fills: Array<XlsxResolvedCellStyle[\"fill\"]>,\n borders: Array<XlsxResolvedCellStyle[\"border\"]>,\n checkboxComplementIndices?: Set<number>\n) {\n const style: XlsxResolvedCellStyle = {};\n const fontId = Number(xfNode.getAttribute(\"fontId\") ?? Number.NaN);\n const fillId = Number(xfNode.getAttribute(\"fillId\") ?? Number.NaN);\n const borderId = Number(xfNode.getAttribute(\"borderId\") ?? Number.NaN);\n const alignment = parseSpreadsheetAlignment(getFirstChild(xfNode, \"alignment\"));\n\n if (Number.isFinite(fontId) && fonts[fontId]) {\n style.font = fonts[fontId];\n }\n if (Number.isFinite(fillId) && fills[fillId]) {\n style.fill = fills[fillId];\n }\n if (Number.isFinite(borderId) && borders[borderId]) {\n style.border = borders[borderId];\n }\n if (alignment) {\n style.alignment = alignment;\n }\n const xfComplementNode = getFirstDescendant(xfNode, \"xfComplement\");\n const xfComplementIndex = Number(xfComplementNode?.getAttribute(\"i\") ?? Number.NaN);\n if (Number.isFinite(xfComplementIndex) && checkboxComplementIndices?.has(xfComplementIndex)) {\n style.cellControl = { kind: \"checkbox\" };\n }\n\n return style;\n}\n\nfunction parseWorkbookStyles(archive: ArchiveEntries) {\n const xml = readArchiveText(archive, \"xl/styles.xml\");\n if (!xml) {\n return {\n differentialStyles: [] as XlsxResolvedCellStyle[],\n defaultFont: null,\n namedCellStyleByName: {},\n styleById: {},\n tableStyleByName: {}\n };\n }\n\n const document = parseXml(xml);\n if (!document) {\n return {\n differentialStyles: [] as XlsxResolvedCellStyle[],\n defaultFont: null,\n namedCellStyleByName: {},\n styleById: {},\n tableStyleByName: {}\n };\n }\n\n const fontsNode = getFirstDescendant(document, \"fonts\");\n const fillsNode = getFirstDescendant(document, \"fills\");\n const bordersNode = getFirstDescendant(document, \"borders\");\n const cellStyleXfsNode = getFirstDescendant(document, \"cellStyleXfs\");\n const cellStylesNode = getFirstDescendant(document, \"cellStyles\");\n const cellXfsNode = getFirstDescendant(document, \"cellXfs\");\n const dxfsNode = getFirstDescendant(document, \"dxfs\");\n const tableStylesNode = getFirstDescendant(document, \"tableStyles\");\n if (!cellXfsNode) {\n return {\n differentialStyles: [] as XlsxResolvedCellStyle[],\n defaultFont: null,\n namedCellStyleByName: {},\n styleById: {},\n tableStyleByName: {}\n };\n }\n\n const checkboxComplementIndices = readFeaturePropertyBagCheckboxComplements(archive);\n const fonts = getChildElements(fontsNode ?? document.documentElement, \"font\").map((node) => parseSpreadsheetFont(node));\n const fills = getChildElements(fillsNode ?? document.documentElement, \"fill\").map((node) => parseSpreadsheetFill(node));\n const borders = getChildElements(bordersNode ?? document.documentElement, \"border\").map((node) => parseSpreadsheetBorder(node));\n const differentialStyles = getChildElements(dxfsNode ?? document.documentElement, \"dxf\").map((node) => parseDifferentialStyle(node));\n const cellStyleXfs = getChildElements(cellStyleXfsNode ?? document.documentElement, \"xf\").map(\n (node) => parseResolvedXfStyle(node, fonts, fills, borders, checkboxComplementIndices)\n );\n const namedCellStyleByName: Record<string, XlsxResolvedCellStyle> = {};\n const styleById: Record<number, XlsxResolvedCellStyle> = {};\n const tableStyleByName: Record<string, XlsxTableStyleDefinition> = {};\n\n getChildElements(cellXfsNode, \"xf\").forEach((xfNode, index) => {\n const style = parseResolvedXfStyle(xfNode, fonts, fills, borders, checkboxComplementIndices);\n const overrides: XlsxResolvedCellStyle = {};\n for (const component of [\"font\", \"fill\", \"border\"] as const) {\n if (Number(xfNode.getAttribute(`${component}Id`) ?? 0) > 0\n && xfNode.getAttribute(`apply${component[0].toUpperCase()}${component.slice(1)}`) !== \"0\") {\n Object.assign(overrides, { [component]: style[component] });\n }\n }\n styleById[index] = { ...style, tableStyleOverrides: overrides };\n });\n\n getChildElements(cellStylesNode ?? document.documentElement, \"cellStyle\").forEach((cellStyleNode) => {\n const name = cellStyleNode.getAttribute(\"name\");\n const xfId = Number(cellStyleNode.getAttribute(\"xfId\") ?? Number.NaN);\n if (!name || !Number.isFinite(xfId)) {\n return;\n }\n\n const resolvedStyle = cellStyleXfs[xfId];\n if (resolvedStyle) {\n namedCellStyleByName[name] = resolvedStyle;\n }\n });\n\n getChildElements(tableStylesNode ?? document.documentElement, \"tableStyle\").forEach((tableStyleNode) => {\n const name = tableStyleNode.getAttribute(\"name\");\n if (!name) {\n return;\n }\n\n const elements: XlsxTableStyleDefinition = {};\n getChildElements(tableStyleNode, \"tableStyleElement\").forEach((elementNode) => {\n const type = elementNode.getAttribute(\"type\");\n const dxfId = Number(elementNode.getAttribute(\"dxfId\") ?? Number.NaN);\n if (!type || !Number.isFinite(dxfId)) {\n return;\n }\n\n const differentialStyle = differentialStyles[dxfId];\n if (differentialStyle) {\n elements[type] = differentialStyle;\n }\n });\n tableStyleByName[name] = elements;\n });\n\n const normalFont = (namedCellStyleByName.Normal?.font ?? styleById[0]?.font ?? fonts[0]) as Record<string, unknown> | undefined;\n const defaultFont = normalFont ? {\n family: typeof normalFont.name === \"string\" ? normalFont.name : undefined,\n sizePt: typeof normalFont.size === \"number\" ? normalFont.size : undefined\n } : null;\n\n return {\n differentialStyles,\n defaultFont,\n namedCellStyleByName,\n styleById,\n tableStyleByName\n };\n}\n\nfunction parseSqrefRanges(sqref: string | null | undefined): XlsxCellRange[] {\n if (!sqref) {\n return [];\n }\n\n return sqref\n .trim()\n .split(/\\s+/)\n .flatMap((reference) => {\n const range = parseA1RangeReference(reference);\n return range ? [range] : [];\n });\n}\n\nfunction parseConditionalFormatValueObject(node: Element | null): XlsxConditionalFormatValueObject | null {\n if (!node) {\n return null;\n }\n\n const type = node.getAttribute(\"type\");\n if (!type) {\n return null;\n }\n\n const rawValue = node.getAttribute(\"val\") ?? getFirstChild(node, \"f\")?.textContent ?? undefined;\n const numericValue = rawValue !== undefined ? Number(rawValue) : Number.NaN;\n return {\n type,\n value: Number.isFinite(numericValue) ? numericValue : undefined\n };\n}\n\nfunction parseSpreadsheetBooleanAttribute(node: Element | null, name: string) {\n if (!node) {\n return undefined;\n }\n\n const value = node.getAttribute(name);\n if (value === null) {\n return undefined;\n }\n\n return value !== \"0\" && value !== \"false\";\n}\n\nfunction parseStandardConditionalFormatRule(\n cfRuleNode: Element,\n ranges: XlsxCellRange[],\n differentialStyles: XlsxResolvedCellStyle[] = []\n): (XlsxConditionalFormatRule & { id?: string }) | null {\n const type = cfRuleNode.getAttribute(\"type\");\n const rawPriority = Number(cfRuleNode.getAttribute(\"priority\") ?? Number.NaN);\n const priority = Number.isFinite(rawPriority) ? rawPriority : Number.MAX_SAFE_INTEGER;\n const formulas = getChildElements(cfRuleNode, \"formula\")\n .map((formulaNode) => (formulaNode.textContent ?? \"\").trim())\n .filter((formula) => formula.length > 0);\n\n if (type === \"colorScale\") {\n const colorScaleNode = getFirstChild(cfRuleNode, \"colorScale\");\n if (!colorScaleNode) {\n return null;\n }\n\n const cfvos = getChildElements(colorScaleNode, \"cfvo\")\n .map((node) => parseConditionalFormatValueObject(node))\n .filter((value): value is XlsxConditionalFormatValueObject => Boolean(value));\n const colors = getChildElements(colorScaleNode, \"color\")\n .map((node) => parseSpreadsheetColor(node))\n .filter((value): value is Record<string, unknown> => Boolean(value));\n if (cfvos.length === 0 || colors.length === 0) {\n return null;\n }\n\n return {\n cfvos,\n colors,\n kind: \"colorScale\",\n priority,\n ranges\n };\n }\n\n if (type === \"dataBar\") {\n const dataBarNode = getFirstChild(cfRuleNode, \"dataBar\");\n if (!dataBarNode) {\n return null;\n }\n\n const cfvos = getChildElements(dataBarNode, \"cfvo\")\n .map((node) => parseConditionalFormatValueObject(node))\n .filter((value): value is XlsxConditionalFormatValueObject => Boolean(value));\n if (cfvos.length === 0) {\n return null;\n }\n\n const extId = getFirstDescendant(cfRuleNode, \"id\")?.textContent?.trim() || undefined;\n return {\n cfvos,\n color: parseSpreadsheetColor(getFirstChild(dataBarNode, \"color\")),\n kind: \"dataBar\",\n priority,\n ranges,\n id: extId\n };\n }\n\n if (type === \"iconSet\") {\n const iconSetNode = getFirstChild(cfRuleNode, \"iconSet\");\n if (!iconSetNode) {\n return null;\n }\n\n const iconSetName = iconSetNode.getAttribute(\"iconSet\");\n const cfvos = getChildElements(iconSetNode, \"cfvo\")\n .map((node) => parseConditionalFormatValueObject(node))\n .filter((value): value is XlsxConditionalFormatValueObject => Boolean(value));\n if (!iconSetName || cfvos.length === 0) {\n return null;\n }\n\n return {\n cfvos,\n icons: cfvos.map((_, index) => ({\n iconId: index,\n iconSet: iconSetName\n })),\n kind: \"iconSet\",\n priority,\n ranges,\n reverse: parseSpreadsheetBooleanAttribute(iconSetNode, \"reverse\"),\n showValue: parseSpreadsheetBooleanAttribute(iconSetNode, \"showValue\")\n };\n }\n\n const rawDxfId = Number(cfRuleNode.getAttribute(\"dxfId\") ?? Number.NaN);\n if (!type || !Number.isFinite(rawDxfId)) {\n return null;\n }\n\n const style = differentialStyles[rawDxfId];\n if (!style) {\n return null;\n }\n\n const rawRank = Number(cfRuleNode.getAttribute(\"rank\") ?? Number.NaN);\n const rawStdDev = Number(cfRuleNode.getAttribute(\"stdDev\") ?? Number.NaN);\n return {\n aboveAverage: parseSpreadsheetBooleanAttribute(cfRuleNode, \"aboveAverage\"),\n bottom: parseSpreadsheetBooleanAttribute(cfRuleNode, \"bottom\"),\n equalAverage: parseSpreadsheetBooleanAttribute(cfRuleNode, \"equalAverage\"),\n formulas,\n kind: \"styled\",\n operator: cfRuleNode.getAttribute(\"operator\") ?? undefined,\n percent: parseSpreadsheetBooleanAttribute(cfRuleNode, \"percent\"),\n priority,\n rank: Number.isFinite(rawRank) ? rawRank : undefined,\n ranges,\n ruleType: type,\n stdDev: Number.isFinite(rawStdDev) ? rawStdDev : undefined,\n stopIfTrue: parseSpreadsheetBooleanAttribute(cfRuleNode, \"stopIfTrue\"),\n style,\n text: cfRuleNode.getAttribute(\"text\") ?? undefined,\n timePeriod: cfRuleNode.getAttribute(\"timePeriod\") ?? undefined\n };\n}\n\nfunction parseExtendedConditionalFormatRule(\n cfRuleNode: Element,\n ranges: XlsxCellRange[]\n): (XlsxConditionalFormatRule & { id?: string }) | null {\n const type = cfRuleNode.getAttribute(\"type\");\n const ruleId = cfRuleNode.getAttribute(\"id\") ?? undefined;\n const rawPriority = Number(cfRuleNode.getAttribute(\"priority\") ?? Number.NaN);\n const priority = Number.isFinite(rawPriority) ? rawPriority : Number.MAX_SAFE_INTEGER;\n\n if (type === \"dataBar\") {\n const dataBarNode = getFirstChild(cfRuleNode, \"dataBar\");\n if (!dataBarNode) {\n return null;\n }\n\n const cfvos = getChildElements(dataBarNode, \"cfvo\")\n .map((node) => parseConditionalFormatValueObject(node))\n .filter((value): value is XlsxConditionalFormatValueObject => Boolean(value));\n if (cfvos.length === 0) {\n return null;\n }\n\n return {\n axisColor: parseSpreadsheetColor(getFirstChild(dataBarNode, \"axisColor\")),\n border: parseSpreadsheetBooleanAttribute(dataBarNode, \"border\"),\n borderColor: parseSpreadsheetColor(getFirstChild(dataBarNode, \"borderColor\")),\n cfvos,\n color: parseSpreadsheetColor(getFirstChild(dataBarNode, \"fillColor\")),\n gradient: parseSpreadsheetBooleanAttribute(dataBarNode, \"gradient\"),\n kind: \"dataBar\",\n maxLength: Number(dataBarNode.getAttribute(\"maxLength\") ?? Number.NaN),\n minLength: Number(dataBarNode.getAttribute(\"minLength\") ?? Number.NaN),\n negativeBarBorderColorSameAsPositive: parseSpreadsheetBooleanAttribute(dataBarNode, \"negativeBarBorderColorSameAsPositive\"),\n negativeBorderColor: parseSpreadsheetColor(getFirstChild(dataBarNode, \"negativeBorderColor\")),\n negativeFillColor: parseSpreadsheetColor(getFirstChild(dataBarNode, \"negativeFillColor\")),\n priority,\n ranges,\n showValue: parseSpreadsheetBooleanAttribute(dataBarNode, \"showValue\"),\n id: ruleId\n };\n }\n\n if (type === \"iconSet\") {\n const iconSetNode = getFirstChild(cfRuleNode, \"iconSet\");\n if (!iconSetNode) {\n return null;\n }\n\n const cfvos = getChildElements(iconSetNode, \"cfvo\")\n .map((node) => parseConditionalFormatValueObject(node))\n .filter((value): value is XlsxConditionalFormatValueObject => Boolean(value));\n const icons = getChildElements(iconSetNode, \"cfIcon\")\n .map((iconNode) => {\n const iconSet = iconNode.getAttribute(\"iconSet\");\n const rawIconId = Number(iconNode.getAttribute(\"iconId\") ?? Number.NaN);\n if (!iconSet || !Number.isFinite(rawIconId)) {\n return null;\n }\n\n return {\n iconId: rawIconId,\n iconSet\n } satisfies XlsxConditionalFormatIcon;\n })\n .filter((icon): icon is XlsxConditionalFormatIcon => Boolean(icon));\n\n if (cfvos.length === 0 || icons.length === 0) {\n return null;\n }\n\n return {\n cfvos,\n icons,\n kind: \"iconSet\",\n priority,\n ranges,\n reverse: parseSpreadsheetBooleanAttribute(iconSetNode, \"reverse\"),\n showValue: parseSpreadsheetBooleanAttribute(iconSetNode, \"showValue\"),\n id: ruleId\n };\n }\n\n return null;\n}\n\nfunction mergeConditionalFormatRule(\n baseRule: XlsxConditionalFormatRule & { id?: string },\n extendedRule: XlsxConditionalFormatRule & { id?: string }\n) {\n if (baseRule.kind !== extendedRule.kind) {\n return baseRule;\n }\n\n if (baseRule.kind === \"colorScale\" && extendedRule.kind === \"colorScale\") {\n return {\n ...baseRule,\n ...extendedRule,\n cfvos: extendedRule.cfvos.length > 0 ? extendedRule.cfvos : baseRule.cfvos,\n colors: extendedRule.colors.length > 0 ? extendedRule.colors : baseRule.colors,\n priority: Number.isFinite(extendedRule.priority) ? extendedRule.priority : baseRule.priority,\n ranges: extendedRule.ranges.length > 0 ? extendedRule.ranges : baseRule.ranges\n };\n }\n\n if (baseRule.kind === \"dataBar\" && extendedRule.kind === \"dataBar\") {\n const merged: XlsxConditionalDataBarRule & { id?: string } = {\n ...baseRule,\n ...extendedRule,\n axisColor: extendedRule.axisColor ?? baseRule.axisColor,\n border: extendedRule.border ?? baseRule.border,\n cfvos: extendedRule.cfvos.length > 0 ? extendedRule.cfvos : baseRule.cfvos,\n color: extendedRule.color ?? baseRule.color,\n negativeBarBorderColorSameAsPositive: extendedRule.negativeBarBorderColorSameAsPositive ?? baseRule.negativeBarBorderColorSameAsPositive,\n negativeBorderColor: extendedRule.negativeBorderColor ?? baseRule.negativeBorderColor,\n negativeFillColor: extendedRule.negativeFillColor ?? baseRule.negativeFillColor,\n priority: Number.isFinite(extendedRule.priority) ? extendedRule.priority : baseRule.priority,\n ranges: extendedRule.ranges.length > 0 ? extendedRule.ranges : baseRule.ranges\n };\n return merged;\n }\n\n if (baseRule.kind === \"iconSet\" && extendedRule.kind === \"iconSet\") {\n const merged: XlsxConditionalIconSetRule & { id?: string } = {\n ...baseRule,\n ...extendedRule,\n cfvos: extendedRule.cfvos.length > 0 ? extendedRule.cfvos : baseRule.cfvos,\n icons: extendedRule.icons.length > 0 ? extendedRule.icons : baseRule.icons,\n priority: Number.isFinite(extendedRule.priority) ? extendedRule.priority : baseRule.priority,\n ranges: extendedRule.ranges.length > 0 ? extendedRule.ranges : baseRule.ranges\n };\n return merged;\n }\n\n return baseRule;\n}\n\nfunction parseConditionalFormatRules(document: Document, differentialStyles: XlsxResolvedCellStyle[] = []) {\n const standardRules: Array<XlsxConditionalFormatRule & { id?: string }> = [];\n const extendedRules: Array<XlsxConditionalFormatRule & { id?: string }> = [];\n\n getLocalElements(document, \"conditionalFormatting\").forEach((conditionalFormattingNode) => {\n const isExtended = conditionalFormattingNode.namespaceURI !== SPREADSHEET_NS;\n const ranges = isExtended\n ? parseSqrefRanges(getFirstChild(conditionalFormattingNode, \"sqref\")?.textContent ?? \"\")\n : parseSqrefRanges(conditionalFormattingNode.getAttribute(\"sqref\"));\n\n getChildElements(conditionalFormattingNode, \"cfRule\").forEach((cfRuleNode) => {\n const parsedRule = isExtended\n ? parseExtendedConditionalFormatRule(cfRuleNode, ranges)\n : parseStandardConditionalFormatRule(cfRuleNode, ranges, differentialStyles);\n if (parsedRule) {\n if (isExtended) {\n extendedRules.push(parsedRule);\n } else {\n standardRules.push(parsedRule);\n }\n }\n });\n });\n\n const mergedRules: XlsxConditionalFormatRule[] = [];\n const usedExtendedRuleIds = new Set<string>();\n const extendedRulesById = new Map(\n extendedRules\n .filter((rule) => typeof rule.id === \"string\" && rule.id.length > 0)\n .map((rule) => [rule.id as string, rule])\n );\n\n standardRules.forEach((rule) => {\n const matchingExtendedRule = rule.id ? extendedRulesById.get(rule.id) : undefined;\n if (matchingExtendedRule) {\n usedExtendedRuleIds.add(rule.id as string);\n mergedRules.push(mergeConditionalFormatRule(rule, matchingExtendedRule));\n return;\n }\n\n mergedRules.push(rule);\n });\n\n extendedRules.forEach((rule) => {\n if (rule.id && usedExtendedRuleIds.has(rule.id)) {\n return;\n }\n\n mergedRules.push(rule);\n });\n\n return mergedRules\n .map((rule) => {\n const nextRule = { ...rule } as XlsxConditionalFormatRule & { id?: string };\n delete nextRule.id;\n return nextRule;\n })\n .filter((rule) => rule.ranges.length > 0)\n .sort((left, right) => left.priority - right.priority);\n}\n\nfunction parseSheetState(\n archive: ArchiveEntries,\n path: string,\n options?: ParseWorkbookStructureOptions & {\n differentialStyles?: XlsxResolvedCellStyle[];\n defaultFont?: {\n family?: string;\n sizePt?: number;\n } | null;\n }\n): WorkbookSheetState | null {\n const xml = readArchiveText(archive, path);\n if (!xml) {\n return null;\n }\n\n const document = parseXml(xml);\n if (!document) {\n return null;\n }\n\n const includeCachedFormulaValues = options?.includeCachedFormulaValues ?? true;\n const autoFilterRanges = parseSqrefRanges(getLocalElements(document, \"autoFilter\")[0]?.getAttribute(\"ref\"));\n const cachedFormulaValues: Record<string, string> = {};\n const conditionalFormatRules = parseConditionalFormatRules(document, options?.differentialStyles ?? []);\n const sparklines = parseSheetSparklines(document, options?.themePalette);\n const sheetFormatNode = getLocalElements(document, \"sheetFormatPr\")[0] ?? null;\n const sheetViewNode = getLocalElements(document, \"sheetView\")[0] ?? null;\n const rowHeightOverridesPx: Record<number, number> = {};\n const colWidthOverridesPx: Record<number, number> = {};\n const rowStyleIds: Record<number, number> = {};\n const cellStyleIds: Record<string, number> = {};\n const colStyleIds: Record<number, number> = {};\n let minContentCol = Number.POSITIVE_INFINITY;\n let minContentRow = Number.POSITIVE_INFINITY;\n let maxContentCol = -1;\n let maxContentRow = -1;\n const columnWidthCharacterWidthPx = measureColumnCharacterWidthPx(\n options?.defaultFont?.family,\n options?.defaultFont?.sizePt\n );\n\n const defaultRowHeight = Number(sheetFormatNode?.getAttribute(\"defaultRowHeight\") ?? 15);\n const defaultColWidth = Number(\n sheetFormatNode?.getAttribute(\"defaultColWidth\")\n ?? sheetFormatNode?.getAttribute(\"baseColWidth\")\n ?? 8.43\n );\n const rawZoomScale = Number(\n sheetViewNode?.getAttribute(\"zoomScale\")\n ?? sheetViewNode?.getAttribute(\"zoomScaleNormal\")\n ?? Number.NaN\n );\n const zoomScale = Number.isFinite(rawZoomScale) && rawZoomScale > 0\n ? rawZoomScale\n : 100;\n const trackContentCell = (cellRef: string | null) => {\n if (!cellRef) {\n return;\n }\n\n const cell = parseA1CellReference(cellRef);\n if (!cell) {\n return;\n }\n\n minContentCol = Math.min(minContentCol, cell.col);\n minContentRow = Math.min(minContentRow, cell.row);\n maxContentCol = Math.max(maxContentCol, cell.col);\n maxContentRow = Math.max(maxContentRow, cell.row);\n };\n const isMeaningfulCellNode = (cellNode: Element) => {\n if (getFirstChild(cellNode, \"f\") || getFirstChild(cellNode, \"is\")) {\n return true;\n }\n\n const valueNode = getFirstChild(cellNode, \"v\");\n return Boolean(valueNode && (valueNode.textContent ?? \"\").length > 0);\n };\n\n getLocalElements(document, \"row\").forEach((rowNode) => {\n const rowIndex = Number(rowNode.getAttribute(\"r\") ?? 0) - 1;\n const height = Number(rowNode.getAttribute(\"ht\") ?? Number.NaN);\n const styleId = Number(rowNode.getAttribute(\"s\") ?? Number.NaN);\n if (rowIndex >= 0 && Number.isFinite(height)) {\n rowHeightOverridesPx[rowIndex] = Math.max(MIN_ROW_HEIGHT_PX, Math.round(height * 1.33));\n }\n if (rowIndex >= 0 && Number.isFinite(styleId)) {\n rowStyleIds[rowIndex] = styleId;\n }\n\n getChildElements(rowNode, \"c\").forEach((cellNode) => {\n const cellRef = cellNode.getAttribute(\"r\");\n const cellStyleId = Number(cellNode.getAttribute(\"s\") ?? Number.NaN);\n if (cellRef && Number.isFinite(cellStyleId)) {\n cellStyleIds[cellRef] = cellStyleId;\n }\n if (isMeaningfulCellNode(cellNode)) {\n trackContentCell(cellRef);\n }\n\n if (includeCachedFormulaValues) {\n const formulaNode = getFirstChild(cellNode, \"f\");\n const valueNode = getFirstChild(cellNode, \"v\");\n if (formulaNode && valueNode && cellRef) {\n cachedFormulaValues[cellRef] = valueNode.textContent ?? \"\";\n }\n }\n });\n });\n\n const maxMetadataCol = Math.max(maxContentCol, 0) + 256;\n getLocalElements(document, \"col\").forEach((colNode) => {\n const min = Number(colNode.getAttribute(\"min\") ?? 0) - 1;\n const max = Number(colNode.getAttribute(\"max\") ?? 0) - 1;\n const width = Number(colNode.getAttribute(\"width\") ?? Number.NaN);\n const styleId = Number(colNode.getAttribute(\"style\") ?? Number.NaN);\n if (!Number.isFinite(width)) {\n if (!Number.isFinite(styleId)) {\n return;\n }\n }\n\n for (let col = min; col <= Math.min(max, maxMetadataCol); col += 1) {\n if (col >= 0) {\n if (Number.isFinite(width)) {\n const widthPx = sheetColumnWidthToPixels(width, columnWidthCharacterWidthPx);\n colWidthOverridesPx[col] = widthPx;\n }\n if (Number.isFinite(styleId)) {\n colStyleIds[col] = styleId;\n }\n }\n }\n });\n\n return {\n autoFilterRanges,\n cachedFormulaValues,\n cellStyleIds,\n columnWidthCharacterWidthPx,\n colWidthOverridesPx,\n colStyleIds,\n conditionalFormatRules,\n defaultColWidthPx: sheetColumnWidthToPixels(defaultColWidth, columnWidthCharacterWidthPx),\n defaultRowHeightPx: Math.max(MIN_ROW_HEIGHT_PX, Math.round(defaultRowHeight * 1.33)),\n hasHorizontalMerges: false,\n hasVerticalMerges: false,\n maxHorizontalMergeEndCol: -1,\n maxVerticalMergeEndRow: -1,\n maxContentCol,\n maxContentRow,\n minContentCol: Number.isFinite(minContentCol) ? minContentCol : -1,\n minContentRow: Number.isFinite(minContentRow) ? minContentRow : -1,\n hiddenCols: [],\n hiddenRows: [],\n rowHeightOverridesPx,\n rowStyleIds,\n showGridLines: (sheetViewNode?.getAttribute(\"showGridLines\") ?? \"1\") !== \"0\",\n sparklines,\n zoomScale\n };\n}\n\nfunction clampChannel(value: number) {\n return Math.max(0, Math.min(255, Math.round(value)));\n}\n\nfunction normalizeHexColor(value: string) {\n const hex = value.replace(/^#/, \"\");\n if (hex.length === 8) {\n return `#${hex.slice(2).toLowerCase()}`;\n }\n if (hex.length === 6) {\n return `#${hex.toLowerCase()}`;\n }\n return \"#000000\";\n}\n\nfunction hexToRgb(hex: string) {\n const normalized = normalizeHexColor(hex);\n return {\n b: Number.parseInt(normalized.slice(5, 7), 16),\n g: Number.parseInt(normalized.slice(3, 5), 16),\n r: Number.parseInt(normalized.slice(1, 3), 16)\n };\n}\n\nfunction rgbToHex(red: number, green: number, blue: number) {\n return `#${[red, green, blue]\n .map((value) => clampChannel(value).toString(16).padStart(2, \"0\"))\n .join(\"\")}`;\n}\n\nfunction applyDrawingColorTransforms(\n baseColor: string,\n transformNodes: Element[]\n): DrawingColor {\n let { r, g, b } = hexToRgb(baseColor);\n let opacity = 1;\n let lumMod = 1;\n let lumOff = 0;\n\n transformNodes.forEach((node) => {\n const rawValue = Number(node.getAttribute(\"val\") ?? 0);\n const value = Number.isFinite(rawValue) ? rawValue / 100000 : 0;\n switch (node.localName) {\n case \"alpha\":\n opacity *= value;\n break;\n case \"lumMod\":\n lumMod *= value;\n break;\n case \"lumOff\":\n lumOff += value;\n break;\n case \"shade\":\n r *= value;\n g *= value;\n b *= value;\n break;\n case \"tint\":\n r = r + (255 - r) * value;\n g = g + (255 - g) * value;\n b = b + (255 - b) * value;\n break;\n default:\n break;\n }\n });\n\n if (lumMod !== 1 || lumOff !== 0) {\n r = r * lumMod + 255 * lumOff;\n g = g * lumMod + 255 * lumOff;\n b = b * lumMod + 255 * lumOff;\n }\n\n return {\n color: rgbToHex(r, g, b),\n opacity: Math.max(0, Math.min(1, opacity))\n };\n}\n\nfunction resolveThemeColorName(theme: ThemeState, name: string | null) {\n if (!name) {\n return null;\n }\n\n const aliases: Record<string, string> = {\n bg1: \"bg1\",\n bg2: \"bg2\",\n tx1: \"tx1\",\n tx2: \"tx2\"\n };\n const key = aliases[name] ?? name;\n return theme.colors.get(key) ?? null;\n}\n\nfunction resolveColorValue(colorNode: Element | null, theme: ThemeState): DrawingColor | null {\n if (!colorNode) {\n return null;\n }\n\n let baseColor: string | null = null;\n if (colorNode.localName === \"srgbClr\") {\n baseColor = normalizeHexColor(colorNode.getAttribute(\"val\") ?? \"\");\n } else if (colorNode.localName === \"schemeClr\") {\n baseColor = resolveThemeColorName(theme, colorNode.getAttribute(\"val\"));\n } else if (colorNode.localName === \"scrgbClr\") {\n const r = Number(colorNode.getAttribute(\"r\") ?? 0) * 255 / 100000;\n const g = Number(colorNode.getAttribute(\"g\") ?? 0) * 255 / 100000;\n const b = Number(colorNode.getAttribute(\"b\") ?? 0) * 255 / 100000;\n baseColor = rgbToHex(r, g, b);\n } else if (colorNode.localName === \"sysClr\") {\n baseColor = normalizeHexColor(colorNode.getAttribute(\"lastClr\") ?? \"\");\n }\n\n if (!baseColor) {\n return null;\n }\n\n return applyDrawingColorTransforms(baseColor, Array.from(colorNode.childNodes).filter(isElementNode));\n}\n\nfunction resolveFillColor(fillParent: Element | null, theme: ThemeState): DrawingColor | null {\n if (!fillParent) {\n return null;\n }\n\n const solidFillNode = getFirstChild(fillParent, \"solidFill\");\n if (!solidFillNode) {\n return null;\n }\n\n return resolveColorValue(Array.from(solidFillNode.childNodes).filter(isElementNode)[0] ?? null, theme);\n}\n\nfunction resolveTextTypeface(typeface: string | null, theme: ThemeState) {\n if (!typeface) {\n return undefined;\n }\n\n if (typeface === \"+mn-lt\" || typeface === \"+mn-ea\" || typeface === \"+mn-cs\") {\n return theme.minorLatinFont ?? undefined;\n }\n if (typeface === \"+mj-lt\" || typeface === \"+mj-ea\" || typeface === \"+mj-cs\") {\n return theme.majorLatinFont ?? undefined;\n }\n\n return typeface;\n}\n\nfunction isThemeTypeface(typeface: string | null | undefined) {\n return Boolean(typeface && typeface.startsWith(\"+\"));\n}\n\nfunction resolvePreferredTextTypeface(node: Element | null, theme: ThemeState) {\n if (!node) {\n return undefined;\n }\n\n const latin = getFirstChild(node, \"latin\")?.getAttribute(\"typeface\") ?? null;\n const eastAsian = getFirstChild(node, \"ea\")?.getAttribute(\"typeface\") ?? null;\n const complexScript = getFirstChild(node, \"cs\")?.getAttribute(\"typeface\") ?? null;\n const candidates = [latin, eastAsian, complexScript];\n const explicit = candidates.find((candidate) => candidate && !isThemeTypeface(candidate));\n if (explicit) {\n return explicit;\n }\n\n return resolveTextTypeface(candidates.find(Boolean) ?? null, theme);\n}\n\ntype ShapeTextStyle = {\n bold?: boolean;\n color?: string;\n fontFamily?: string;\n fontSizePt?: number;\n italic?: boolean;\n underline?: boolean;\n};\n\nfunction parseShapeTextStyle(node: Element | null, theme: ThemeState, fallbackColor?: DrawingColor | null): ShapeTextStyle {\n if (!node) {\n return {\n color: fallbackColor?.color\n };\n }\n\n const fillColor = resolveFillColor(node, theme) ?? fallbackColor ?? null;\n const underlineValue = node.getAttribute(\"u\");\n return {\n bold: node.getAttribute(\"b\") === \"1\" || undefined,\n color: fillColor?.color,\n fontFamily: resolvePreferredTextTypeface(node, theme),\n fontSizePt: node.getAttribute(\"sz\") ? Number(node.getAttribute(\"sz\")) / 100 : undefined,\n italic: node.getAttribute(\"i\") === \"1\" || undefined,\n underline: underlineValue && underlineValue !== \"none\" ? true : undefined\n };\n}\n\nfunction mergeShapeTextStyles(...styles: Array<ShapeTextStyle | undefined>): ShapeTextStyle {\n return styles.reduce<ShapeTextStyle>((acc, style) => {\n if (!style) {\n return acc;\n }\n return {\n bold: style.bold ?? acc.bold,\n color: style.color ?? acc.color,\n fontFamily: style.fontFamily ?? acc.fontFamily,\n fontSizePt: style.fontSizePt ?? acc.fontSizePt,\n italic: style.italic ?? acc.italic,\n underline: style.underline ?? acc.underline\n };\n }, {});\n}\n\nfunction parseMarker(node: Element | null) {\n if (!node) {\n return null;\n }\n\n const col = Number(getFirstChild(node, \"col\")?.textContent ?? 0);\n const row = Number(getFirstChild(node, \"row\")?.textContent ?? 0);\n const colOffsetEmu = Number(getFirstChild(node, \"colOff\")?.textContent ?? 0);\n const rowOffsetEmu = Number(getFirstChild(node, \"rowOff\")?.textContent ?? 0);\n\n return {\n col,\n colOffsetEmu,\n row,\n rowOffsetEmu\n };\n}\n\nexport function dukeDrawingAnchorToXlsxAnchor(anchor: DukeDrawingAnchor): XlsxImageAnchor {\n if (anchor.type === \"absolute\") {\n return {\n kind: \"absolute\",\n positionEmu: { x: anchor.xEmu, y: anchor.yEmu },\n sizeEmu: { cx: anchor.widthEmu, cy: anchor.heightEmu }\n };\n }\n\n const from = {\n col: anchor.from.col,\n colOffsetEmu: anchor.from.colOffsetEmu ?? 0,\n row: anchor.from.row,\n rowOffsetEmu: anchor.from.rowOffsetEmu ?? 0\n };\n if (anchor.type === \"oneCell\") {\n return {\n from,\n kind: \"one-cell\",\n sizeEmu: { cx: anchor.widthEmu, cy: anchor.heightEmu }\n };\n }\n\n return {\n from,\n kind: \"two-cell\",\n to: {\n col: anchor.to.col,\n colOffsetEmu: anchor.to.colOffsetEmu ?? 0,\n row: anchor.to.row,\n rowOffsetEmu: anchor.to.rowOffsetEmu ?? 0\n }\n };\n}\n\nexport function xlsxAnchorToDukeDrawingAnchor(\n anchor: XlsxImageAnchor,\n editAs?: \"twoCell\" | \"oneCell\" | \"absolute\"\n): DukeDrawingAnchor {\n if (anchor.kind === \"absolute\") {\n return {\n heightEmu: anchor.sizeEmu.cy,\n type: \"absolute\",\n widthEmu: anchor.sizeEmu.cx,\n xEmu: anchor.positionEmu.x,\n yEmu: anchor.positionEmu.y\n };\n }\n\n const from = {\n col: anchor.from.col,\n colOffsetEmu: anchor.from.colOffsetEmu,\n row: anchor.from.row,\n rowOffsetEmu: anchor.from.rowOffsetEmu\n };\n if (anchor.kind === \"one-cell\") {\n return {\n from,\n heightEmu: anchor.sizeEmu.cy,\n type: \"oneCell\",\n widthEmu: anchor.sizeEmu.cx\n };\n }\n\n return {\n editAs,\n from,\n to: {\n col: anchor.to.col,\n colOffsetEmu: anchor.to.colOffsetEmu,\n row: anchor.to.row,\n rowOffsetEmu: anchor.to.rowOffsetEmu\n },\n type: \"twoCell\"\n };\n}\n\nfunction mapDukeDrawingColor(color: DukeDrawingColor | undefined): XlsxCellStyleColorInput | undefined {\n if (!color) {\n return undefined;\n }\n switch (color.colorType) {\n case \"auto\":\n return { colorType: \"auto\" };\n case \"rgb\":\n return { b: color.b, colorType: \"rgb\", g: color.g, r: color.r };\n case \"argb\":\n return { a: color.a, b: color.b, colorType: \"argb\", g: color.g, r: color.r };\n case \"theme\":\n return { colorType: \"theme\", themeIndex: color.index, tint: color.tint };\n case \"indexed\":\n return { colorType: \"indexed\", paletteIndex: color.index };\n }\n}\n\nfunction mapDukeDrawingFont(font: DukeDrawingRunFont | undefined) {\n if (!font) {\n return undefined;\n }\n return {\n bold: font.bold,\n charset: font.charset,\n color: mapDukeDrawingColor(font.color),\n family: font.family,\n italic: font.italic,\n name: font.name,\n scheme: font.scheme,\n size: font.size,\n strikethrough: font.strikethrough,\n underline: font.underline,\n verticalAlign: font.verticalAlign\n };\n}\n\nfunction mapDukeDrawingText(text: DukeDrawingText): XlsxFormControlCaption {\n return {\n horizontalAlignment: text.horizontalAlignment,\n runs: text.runs.map((run) => ({ font: mapDukeDrawingFont(run.font), text: run.text })),\n verticalAlignment: text.verticalAlignment\n };\n}\n\nfunction resolveDukeDrawingColor(color: DukeDrawingColor | undefined, themePalette?: XlsxThemePalette | null) {\n if (!color) {\n return undefined;\n }\n switch (color.colorType) {\n case \"rgb\":\n return resolveWorkbookColor({ rgb: [color.r, color.g, color.b].map((value) => value.toString(16).padStart(2, \"0\")).join(\"\") }) ?? undefined;\n case \"argb\":\n return resolveWorkbookColor({ argb: [color.a, color.r, color.g, color.b].map((value) => value.toString(16).padStart(2, \"0\")).join(\"\") }) ?? undefined;\n case \"theme\":\n return resolveWorkbookColor({ theme: color.index, tint: color.tint }, themePalette) ?? undefined;\n default:\n return undefined;\n }\n}\n\nfunction resolveDukeDrawingText(\n text: DukeDrawingText,\n themePalette?: XlsxThemePalette | null\n) {\n const caption = mapDukeDrawingText(text);\n const label = normalizeControlLabel(text.runs.map((run) => run.text).join(\"\"));\n const firstStyledRun = text.runs.find((run) => run.font)?.font;\n const horizontalAlignment = text.horizontalAlignment;\n return {\n caption,\n fontFamily: firstStyledRun?.name,\n fontSizePt: firstStyledRun?.size,\n label,\n textAlign: horizontalAlignment === \"left\" || horizontalAlignment === \"center\" || horizontalAlignment === \"right\"\n ? horizontalAlignment\n : undefined,\n textColor: resolveDukeDrawingColor(firstStyledRun?.color, themePalette)\n };\n}\n\nfunction mapDukeFormControlKind(\n kind: DukeFormControlKind,\n themePalette?: XlsxThemePalette | null\n): Pick<XlsxFormControl, \"kind\"> & Partial<XlsxFormControl> {\n switch (kind.kind) {\n case \"button\":\n return { ...resolveDukeDrawingText(kind.caption, themePalette), kind: \"button\" };\n case \"checkbox\":\n return {\n ...resolveDukeDrawingText(kind.caption, themePalette),\n checked: kind.state === \"checked\",\n kind: \"checkbox\",\n linkedCell: kind.cellLink,\n no3D: kind.no3D,\n state: kind.state\n };\n case \"optionButton\":\n return {\n ...resolveDukeDrawingText(kind.caption, themePalette),\n checked: kind.state === \"checked\",\n firstInGroup: kind.firstInGroup,\n kind: \"radio\",\n linkedCell: kind.cellLink,\n no3D: kind.no3D,\n state: kind.state\n };\n case \"label\":\n return { ...resolveDukeDrawingText(kind.caption, themePalette), kind: \"label\" };\n case \"groupBox\":\n return {\n ...resolveDukeDrawingText(kind.caption, themePalette),\n kind: \"group-box\",\n no3D: kind.no3D\n };\n case \"listBox\":\n return {\n inputRange: kind.inputRange,\n kind: \"listbox\",\n linkedCell: kind.cellLink,\n no3D: kind.no3D,\n selected: [...kind.selected],\n selection: kind.selection\n };\n case \"dropdown\":\n return {\n inputRange: kind.inputRange,\n kind: \"dropdown\",\n lines: kind.lines,\n linkedCell: kind.cellLink,\n no3D: kind.no3D,\n selected: kind.selected\n };\n case \"scrollbar\":\n return {\n horizontal: kind.horizontal,\n increment: kind.increment,\n kind: \"scrollbar\",\n linkedCell: kind.cellLink,\n max: kind.max,\n min: kind.min,\n page: kind.page,\n value: kind.value\n };\n case \"spinner\":\n return {\n increment: kind.increment,\n kind: \"spinner\",\n linkedCell: kind.cellLink,\n max: kind.max,\n min: kind.min,\n value: kind.value\n };\n case \"unknown\":\n return {\n ...resolveDukeDrawingText(kind.caption, themePalette),\n kind: kind.objectType.toLowerCase() === \"editbox\" ? \"editbox\" : \"unknown\",\n legacyObjectType: kind.legacyObjectType,\n objectType: kind.objectType\n };\n }\n}\n\nfunction mapDukeFormControl(\n control: DukeFormControlDrawing & { anchor: DukeDrawingAnchor },\n controlIndex: number,\n workbookSheetIndex: number,\n themePalette?: XlsxThemePalette | null\n): XlsxFormControl {\n return {\n altText: control.altText,\n anchor: dukeDrawingAnchorToXlsxAnchor(control.anchor),\n controlIndex,\n editAs: control.anchor.type === \"twoCell\" ? control.anchor.editAs : undefined,\n hidden: control.hidden,\n id: `form-control-${workbookSheetIndex}-${controlIndex}`,\n locked: control.locked,\n macroName: control.formControl.macroName,\n name: control.name,\n printable: control.printable,\n rawClientData: control.formControl.rawClientData,\n rawObj: control.formControl.rawObj,\n rawProperties: control.formControl.rawProperties,\n sheetIndex: workbookSheetIndex,\n title: control.title,\n workbookSheetIndex,\n zIndex: (control.drawingPath[0] ?? controlIndex) + 1,\n ...mapDukeFormControlKind(control.formControl.kind, themePalette)\n };\n}\n\nexport function collectWorkbookFormControls(\n workbook: Workbook,\n themePalette?: XlsxThemePalette | null\n): XlsxFormControl[][] {\n return Array.from({ length: workbook.sheetCount }, (_, workbookSheetIndex) => {\n try {\n const controls = workbook.getSheet(workbookSheetIndex).formControls;\n return Array.isArray(controls)\n ? controls.flatMap((control, controlIndex) => control.anchor\n ? [mapDukeFormControl(control, controlIndex, workbookSheetIndex, themePalette)]\n : [])\n : [];\n } catch {\n return [];\n }\n });\n}\n\nfunction normalizeControlLabel(label: string | null | undefined) {\n if (!label) {\n return undefined;\n }\n\n const normalized = label\n .replace(/\\u00a0/g, \" \")\n .replace(/\\s+/g, \" \")\n .trim();\n return normalized.length > 0 ? normalized : undefined;\n}\n\nfunction parseAnchor(anchorNode: Element) {\n if (anchorNode.localName === \"anchor\") {\n const from = parseMarker(getFirstChild(anchorNode, \"from\"));\n const to = parseMarker(getFirstChild(anchorNode, \"to\"));\n return from && to ? { from, kind: \"two-cell\" as const, to } : null;\n }\n\n if (anchorNode.localName === \"twoCellAnchor\") {\n const from = parseMarker(getFirstChild(anchorNode, \"from\"));\n const to = parseMarker(getFirstChild(anchorNode, \"to\"));\n return from && to ? { from, kind: \"two-cell\" as const, to } : null;\n }\n\n if (anchorNode.localName === \"oneCellAnchor\") {\n const from = parseMarker(getFirstChild(anchorNode, \"from\"));\n const extNode = getFirstChild(anchorNode, \"ext\");\n return from && extNode\n ? {\n from,\n kind: \"one-cell\" as const,\n sizeEmu: {\n cx: Number(extNode.getAttribute(\"cx\") ?? 0),\n cy: Number(extNode.getAttribute(\"cy\") ?? 0)\n }\n }\n : null;\n }\n\n const positionNode = getFirstChild(anchorNode, \"pos\");\n const extNode = getFirstChild(anchorNode, \"ext\");\n return positionNode && extNode\n ? {\n kind: \"absolute\" as const,\n positionEmu: {\n x: Number(positionNode.getAttribute(\"x\") ?? 0),\n y: Number(positionNode.getAttribute(\"y\") ?? 0)\n },\n sizeEmu: {\n cx: Number(extNode.getAttribute(\"cx\") ?? 0),\n cy: Number(extNode.getAttribute(\"cy\") ?? 0)\n }\n }\n : null;\n}\n\nfunction anchorToRect(anchor: XlsxImage[\"anchor\"]): DrawingRectEmu {\n if (anchor.kind === \"absolute\") {\n return {\n cx: anchor.sizeEmu.cx,\n cy: anchor.sizeEmu.cy,\n x: anchor.positionEmu.x,\n y: anchor.positionEmu.y\n };\n }\n\n if (anchor.kind === \"one-cell\") {\n return {\n cx: anchor.sizeEmu.cx,\n cy: anchor.sizeEmu.cy,\n x: anchor.from.colOffsetEmu,\n y: anchor.from.rowOffsetEmu\n };\n }\n\n return {\n cx: Math.max(0, (anchor.to.col - anchor.from.col) * DEFAULT_COL_WIDTH_EMU + anchor.to.colOffsetEmu - anchor.from.colOffsetEmu),\n cy: Math.max(0, (anchor.to.row - anchor.from.row) * DEFAULT_ROW_HEIGHT_EMU + anchor.to.rowOffsetEmu - anchor.from.rowOffsetEmu),\n x: anchor.from.colOffsetEmu,\n y: anchor.from.rowOffsetEmu\n };\n}\n\nfunction resolveSheetColumnWidthPx(sheetState: WorkbookSheetState | null, col: number) {\n if (col < 0) {\n return 0;\n }\n return sheetState?.colWidthOverridesPx[col] ?? sheetState?.defaultColWidthPx ?? emuToPixels(DEFAULT_COL_WIDTH_EMU);\n}\n\nfunction resolveSheetRowHeightPx(sheetState: WorkbookSheetState | null, row: number) {\n if (row < 0) {\n return 0;\n }\n return sheetState?.rowHeightOverridesPx[row] ?? sheetState?.defaultRowHeightPx ?? emuToPixels(DEFAULT_ROW_HEIGHT_EMU);\n}\n\nfunction sumSheetColumnWidthsEmu(sheetState: WorkbookSheetState | null, beforeCol: number) {\n let total = 0;\n for (let col = 0; col < beforeCol; col += 1) {\n total += pixelsToEmu(resolveSheetColumnWidthPx(sheetState, col));\n }\n return total;\n}\n\nfunction sumSheetRowHeightsEmu(sheetState: WorkbookSheetState | null, beforeRow: number) {\n let total = 0;\n for (let row = 0; row < beforeRow; row += 1) {\n total += pixelsToEmu(resolveSheetRowHeightPx(sheetState, row));\n }\n return total;\n}\n\nfunction anchorToAbsoluteRect(anchor: XlsxImage[\"anchor\"], sheetState: WorkbookSheetState | null): DrawingRectEmu {\n if (anchor.kind === \"absolute\") {\n return anchorToRect(anchor);\n }\n\n if (anchor.kind === \"one-cell\") {\n return {\n cx: anchor.sizeEmu.cx,\n cy: anchor.sizeEmu.cy,\n x: sumSheetColumnWidthsEmu(sheetState, anchor.from.col) + anchor.from.colOffsetEmu,\n y: sumSheetRowHeightsEmu(sheetState, anchor.from.row) + anchor.from.rowOffsetEmu\n };\n }\n\n const left = sumSheetColumnWidthsEmu(sheetState, anchor.from.col) + anchor.from.colOffsetEmu;\n const top = sumSheetRowHeightsEmu(sheetState, anchor.from.row) + anchor.from.rowOffsetEmu;\n const right = sumSheetColumnWidthsEmu(sheetState, anchor.to.col) + anchor.to.colOffsetEmu;\n const bottom = sumSheetRowHeightsEmu(sheetState, anchor.to.row) + anchor.to.rowOffsetEmu;\n\n return {\n cx: Math.max(0, right - left),\n cy: Math.max(0, bottom - top),\n x: left,\n y: top\n };\n}\n\nfunction rectToAbsoluteAnchor(rect: DrawingRectEmu): XlsxImage[\"anchor\"] {\n return {\n kind: \"absolute\",\n positionEmu: {\n x: rect.x,\n y: rect.y\n },\n sizeEmu: {\n cx: rect.cx,\n cy: rect.cy\n }\n };\n}\n\nfunction parseTransformRect(xfrmNode: Element | null) {\n if (!xfrmNode) {\n return null;\n }\n\n const offNode = getFirstChild(xfrmNode, \"off\");\n const extNode = getFirstChild(xfrmNode, \"ext\");\n if (!offNode || !extNode) {\n return null;\n }\n\n return {\n cx: Number(extNode.getAttribute(\"cx\") ?? 0),\n cy: Number(extNode.getAttribute(\"cy\") ?? 0),\n flipH: xfrmNode.getAttribute(\"flipH\") === \"1\",\n flipV: xfrmNode.getAttribute(\"flipV\") === \"1\",\n rot: Number(xfrmNode.getAttribute(\"rot\") ?? 0) / 60000,\n x: Number(offNode.getAttribute(\"x\") ?? 0),\n y: Number(offNode.getAttribute(\"y\") ?? 0)\n };\n}\n\nfunction applyGroupTransform(rect: DrawingRectEmu, group: GroupTransform): DrawingRectEmu {\n return {\n cx: rect.cx * group.scaleX,\n cy: rect.cy * group.scaleY,\n x: group.x + (rect.x - group.chX) * group.scaleX,\n y: group.y + (rect.y - group.chY) * group.scaleY\n };\n}\n\nfunction parseGroupTransform(\n groupNode: Element,\n parentGroup: GroupTransform | null,\n fallbackAnchor: XlsxImage[\"anchor\"],\n sheetState: WorkbookSheetState | null\n) {\n const xfrmNode = getFirstDescendant(getFirstChild(groupNode, \"grpSpPr\") ?? groupNode, \"xfrm\");\n const anchorRect = anchorToAbsoluteRect(fallbackAnchor, sheetState);\n const rect = parseTransformRect(xfrmNode) ?? anchorRect;\n const rootRectMatchesAnchorOrigin = Math.abs(rect.x - anchorRect.x) <= EMU_PER_PIXEL\n && Math.abs(rect.y - anchorRect.y) <= EMU_PER_PIXEL;\n const chOffNode = getFirstChild(xfrmNode ?? groupNode, \"chOff\");\n const chExtNode = getFirstChild(xfrmNode ?? groupNode, \"chExt\");\n const rootScaleX = rect.cx !== 0 ? anchorRect.cx / rect.cx : 1;\n const rootScaleY = rect.cy !== 0 ? anchorRect.cy / rect.cy : 1;\n const useRectFrameForRoot = !parentGroup && (\n rootScaleX < 0.85\n || rootScaleX > 1.15\n || rootScaleY < 0.85\n || rootScaleY > 1.15\n );\n const absoluteRect = parentGroup\n ? applyGroupTransform(rect, parentGroup)\n : rootRectMatchesAnchorOrigin\n ? rect\n : anchorRect;\n const childRectX = parentGroup\n ? Number(chOffNode?.getAttribute(\"x\") ?? 0)\n : useRectFrameForRoot\n ? rect.x\n : Number(chOffNode?.getAttribute(\"x\") ?? 0);\n const childRectY = parentGroup\n ? Number(chOffNode?.getAttribute(\"y\") ?? 0)\n : useRectFrameForRoot\n ? rect.y\n : Number(chOffNode?.getAttribute(\"y\") ?? 0);\n const childRectCx = parentGroup\n ? Number(chExtNode?.getAttribute(\"cx\") ?? rect.cx)\n : useRectFrameForRoot\n ? rect.cx\n : Number(chExtNode?.getAttribute(\"cx\") ?? rect.cx);\n const childRectCy = parentGroup\n ? Number(chExtNode?.getAttribute(\"cy\") ?? rect.cy)\n : useRectFrameForRoot\n ? rect.cy\n : Number(chExtNode?.getAttribute(\"cy\") ?? rect.cy);\n return {\n chCx: childRectCx,\n chCy: childRectCy,\n chX: childRectX,\n chY: childRectY,\n cx: absoluteRect.cx,\n cy: absoluteRect.cy,\n scaleX: childRectCx !== 0 ? absoluteRect.cx / childRectCx : (parentGroup?.scaleX ?? 1),\n scaleY: childRectCy !== 0 ? absoluteRect.cy / childRectCy : (parentGroup?.scaleY ?? 1),\n x: absoluteRect.x,\n y: absoluteRect.y\n };\n}\n\nfunction anchorFromNodeOrFallback(\n node: Element,\n fallbackAnchor: XlsxImage[\"anchor\"],\n parentGroup: GroupTransform | null\n) {\n const xfrmNode = getFirstDescendant(node, \"xfrm\");\n const rect = parseTransformRect(xfrmNode);\n if (rect) {\n const scaleX = parentGroup?.scaleX ?? 1;\n const scaleY = parentGroup?.scaleY ?? 1;\n return {\n anchor: parentGroup ? rectToAbsoluteAnchor(applyGroupTransform(rect, parentGroup)) : fallbackAnchor,\n flipH: rect.flipH,\n flipV: rect.flipV,\n rotationDeg: rect.rot,\n scaleX,\n scaleY\n };\n }\n\n return {\n anchor: fallbackAnchor,\n flipH: false,\n flipV: false,\n rotationDeg: 0,\n scaleX: parentGroup?.scaleX ?? 1,\n scaleY: parentGroup?.scaleY ?? 1\n };\n}\n\nfunction mapParagraphAlign(value: string | null | undefined): XlsxShape[\"paragraphs\"][number][\"align\"] | undefined {\n switch (value) {\n case \"ctr\":\n return \"center\";\n case \"just\":\n return \"justify\";\n case \"r\":\n return \"right\";\n case \"l\":\n return \"left\";\n default:\n return undefined;\n }\n}\n\nfunction mapVerticalAnchor(value: string | null | undefined): \"bottom\" | \"middle\" | \"top\" {\n switch (value) {\n case \"b\":\n return \"bottom\";\n case \"ctr\":\n return \"middle\";\n default:\n return \"top\";\n }\n}\n\nfunction createImageAnchorNodes(document: XMLDocument) {\n return document.documentElement\n ? Array.from(document.documentElement.childNodes).filter(\n (node): node is Element =>\n isElementNode(node) &&\n (node.localName === \"twoCellAnchor\" || node.localName === \"oneCellAnchor\" || node.localName === \"absoluteAnchor\")\n )\n : [];\n}\n\nfunction createImageSource(bytes: Uint8Array, mimeType: string, objectUrls: string[]) {\n if (typeof URL !== \"undefined\" && typeof Blob !== \"undefined\") {\n const objectUrl = URL.createObjectURL(new Blob([cloneBytes(bytes)], { type: mimeType }));\n objectUrls.push(objectUrl);\n return objectUrl;\n }\n\n let binary = \"\";\n for (const value of bytes) {\n binary += String.fromCharCode(value);\n }\n const base64 = typeof btoa === \"function\" ? btoa(binary) : \"\";\n return `data:${mimeType};base64,${base64}`;\n}\n\nfunction isStrokeOnlyGeometry(geometry: string) {\n return geometry === \"line\" || geometry === \"arc\" || geometry === \"leftBrace\";\n}\n\nfunction parseShapeStroke(node: Element, styleNode: Element | null, theme: ThemeState): XlsxShape[\"stroke\"] | undefined {\n const lineNode = getFirstDescendant(node, \"ln\");\n const lineRefNode = styleNode ? getFirstChild(styleNode, \"lnRef\") : null;\n if (!lineNode && !lineRefNode) {\n return undefined;\n }\n\n if (lineNode && getFirstChild(lineNode, \"noFill\")) {\n return { none: true };\n }\n\n const color = resolveFillColor(lineNode, theme)\n ?? resolveColorValue(Array.from(lineRefNode?.childNodes ?? []).filter(isElementNode)[0] ?? null, theme);\n const widthEmu = Number(lineNode?.getAttribute(\"w\") ?? 0);\n return {\n color: color?.color,\n dash: getFirstChild(lineNode ?? node, \"prstDash\")?.getAttribute(\"val\") ?? undefined,\n headEndType: getFirstChild(lineNode ?? node, \"headEnd\")?.getAttribute(\"type\") ?? undefined,\n none: false,\n opacity: color?.opacity,\n tailEndType: getFirstChild(lineNode ?? node, \"tailEnd\")?.getAttribute(\"type\") ?? undefined,\n widthPx: widthEmu > 0 ? emuToPixels(widthEmu) : undefined\n };\n}\n\nfunction parseShapeFill(\n node: Element,\n styleNode: Element | null,\n theme: ThemeState,\n geometry: string\n): XlsxShape[\"fill\"] | undefined {\n const shapePropsNode = getFirstChild(node, \"spPr\") ?? node;\n const noFillNode = getFirstChild(shapePropsNode, \"noFill\");\n if (noFillNode) {\n return { none: true };\n }\n\n if (isStrokeOnlyGeometry(geometry)) {\n return { none: true };\n }\n\n const fillRefNode = styleNode ? getFirstChild(styleNode, \"fillRef\") : null;\n const fillColor = resolveFillColor(shapePropsNode, theme)\n ?? resolveColorValue(Array.from(fillRefNode?.childNodes ?? []).filter(isElementNode)[0] ?? null, theme);\n if (!fillColor) {\n return undefined;\n }\n\n return {\n color: fillColor.color,\n none: false,\n opacity: fillColor.opacity\n };\n}\n\nfunction parsePointNode(pointNode: Element | null) {\n if (!pointNode) {\n return null;\n }\n\n const x = Number(pointNode.getAttribute(\"x\") ?? Number.NaN);\n const y = Number(pointNode.getAttribute(\"y\") ?? Number.NaN);\n return Number.isFinite(x) && Number.isFinite(y) ? { x, y } : null;\n}\n\nfunction parseCustomGeometryPath(shapeNode: Element): ShapeVectorPath | undefined {\n const pathNode = getFirstDescendant(shapeNode, \"path\");\n if (!pathNode) {\n return undefined;\n }\n\n const width = Number(pathNode.getAttribute(\"w\") ?? Number.NaN);\n const height = Number(pathNode.getAttribute(\"h\") ?? Number.NaN);\n if (!Number.isFinite(width) || !Number.isFinite(height) || width <= 0 || height <= 0) {\n return undefined;\n }\n\n const commands: string[] = [];\n let lastPoint: { x: number; y: number } | null = null;\n for (const child of Array.from(pathNode.childNodes).filter(isElementNode)) {\n if (child.localName === \"moveTo\") {\n const point = parsePointNode(getFirstChild(child, \"pt\"));\n if (point) {\n commands.push(`M ${point.x} ${point.y}`);\n lastPoint = point;\n }\n continue;\n }\n\n if (child.localName === \"lnTo\") {\n const point = parsePointNode(getFirstChild(child, \"pt\"));\n if (point && (!lastPoint || point.x !== lastPoint.x || point.y !== lastPoint.y)) {\n commands.push(`L ${point.x} ${point.y}`);\n lastPoint = point;\n }\n continue;\n }\n\n if (child.localName === \"cubicBezTo\") {\n const points = getChildElements(child, \"pt\").map(parsePointNode).filter((point): point is { x: number; y: number } => point !== null);\n if (points.length === 3) {\n commands.push(`C ${points[0].x} ${points[0].y} ${points[1].x} ${points[1].y} ${points[2].x} ${points[2].y}`);\n lastPoint = points[2];\n }\n continue;\n }\n\n if (child.localName === \"close\") {\n commands.push(\"Z\");\n lastPoint = null;\n }\n }\n\n if (commands.length === 0) {\n return undefined;\n }\n\n return {\n path: commands.join(\" \"),\n viewBox: {\n height,\n width\n }\n };\n}\n\nfunction parseShapeGeometryAdjustments(shapeNode: Element) {\n const presetGeometry = getFirstDescendant(shapeNode, \"prstGeom\");\n if (!presetGeometry) {\n return undefined;\n }\n\n const adjustments: Record<string, number> = {};\n getChildElements(getFirstChild(presetGeometry, \"avLst\"), \"gd\").forEach((adjustmentNode) => {\n const name = adjustmentNode.getAttribute(\"name\");\n const formula = adjustmentNode.getAttribute(\"fmla\") ?? \"\";\n const match = formula.match(/^val\\s+(-?\\d+(?:\\.\\d+)?)$/);\n if (!name || !match) {\n return;\n }\n\n const value = Number.parseFloat(match[1] ?? \"\");\n if (Number.isFinite(value)) {\n adjustments[name] = value;\n }\n });\n\n return Object.keys(adjustments).length > 0 ? adjustments : undefined;\n}\n\nfunction parseShapeParagraphs(\n shapeNode: Element,\n styleNode: Element | null,\n theme: ThemeState\n): XlsxShape[\"paragraphs\"] {\n const txBodyNode = getFirstChild(shapeNode, \"txBody\");\n if (!txBodyNode) {\n return [];\n }\n\n const defaultFontRef = styleNode ? getFirstChild(styleNode, \"fontRef\") : null;\n const defaultFontColor = resolveColorValue(Array.from(defaultFontRef?.childNodes ?? []).filter(isElementNode)[0] ?? null, theme);\n const listStyleNode = getFirstChild(txBodyNode, \"lstStyle\");\n const paragraphs: XlsxShape[\"paragraphs\"] = [];\n\n getChildElements(txBodyNode, \"p\").forEach((paragraphNode) => {\n const paragraphProps = getFirstChild(paragraphNode, \"pPr\");\n const paragraphLevel = Number(paragraphProps?.getAttribute(\"lvl\") ?? 0);\n const listLevelProps = getFirstChild(listStyleNode ?? txBodyNode, `lvl${paragraphLevel + 1}pPr`);\n const inheritedStyle = mergeShapeTextStyles(\n parseShapeTextStyle(getFirstChild(listLevelProps ?? txBodyNode, \"defRPr\"), theme, defaultFontColor),\n parseShapeTextStyle(getFirstChild(paragraphProps ?? paragraphNode, \"defRPr\"), theme, defaultFontColor)\n );\n const runs: XlsxShape[\"paragraphs\"][number][\"runs\"] = [];\n let sawRenderableChild = false;\n\n Array.from(paragraphNode.childNodes).filter(isElementNode).forEach((child) => {\n if (child.localName === \"br\") {\n sawRenderableChild = true;\n runs.push({ text: \"\\n\" });\n return;\n }\n if (child.localName !== \"r\") {\n return;\n }\n\n sawRenderableChild = true;\n const text = getFirstChild(child, \"t\")?.textContent ?? \"\";\n const runProps = getFirstChild(child, \"rPr\");\n const runStyle = mergeShapeTextStyles(\n inheritedStyle,\n parseShapeTextStyle(runProps, theme, defaultFontColor)\n );\n\n runs.push({\n bold: runStyle.bold,\n color: runStyle.color,\n fontFamily: runStyle.fontFamily,\n fontSizePt: runStyle.fontSizePt,\n italic: runStyle.italic,\n text,\n underline: runStyle.underline\n });\n });\n\n if (runs.length === 0) {\n if (!sawRenderableChild && !getFirstChild(paragraphNode, \"endParaRPr\")) {\n return;\n }\n\n runs.push({\n bold: inheritedStyle.bold,\n color: inheritedStyle.color,\n fontFamily: inheritedStyle.fontFamily,\n fontSizePt: inheritedStyle.fontSizePt,\n italic: inheritedStyle.italic,\n text: \" \",\n underline: inheritedStyle.underline\n });\n }\n\n paragraphs.push({\n align: mapParagraphAlign(paragraphProps?.getAttribute(\"algn\")),\n runs\n });\n });\n\n return paragraphs;\n}\n\nfunction parseTextBox(shapeNode: Element): XlsxShape[\"textBox\"] | undefined {\n const txBodyNode = getFirstChild(shapeNode, \"txBody\");\n if (!txBodyNode) {\n return undefined;\n }\n\n const bodyProps = getFirstChild(txBodyNode, \"bodyPr\");\n const leftInset = emuToPixels(Number(bodyProps?.getAttribute(\"lIns\") ?? 91440));\n const rightInset = emuToPixels(Number(bodyProps?.getAttribute(\"rIns\") ?? 91440));\n const topInset = emuToPixels(Number(bodyProps?.getAttribute(\"tIns\") ?? 45720));\n const bottomInset = emuToPixels(Number(bodyProps?.getAttribute(\"bIns\") ?? 45720));\n\n return {\n horizontalAlign: bodyProps?.getAttribute(\"anchorCtr\") === \"1\" ? \"center\" : \"left\",\n insetPx: {\n bottom: bottomInset,\n left: leftInset,\n right: rightInset,\n top: topInset\n },\n verticalAlign: mapVerticalAnchor(bodyProps?.getAttribute(\"anchor\"))\n };\n}\n\nfunction getHyperlinkTarget(\n node: Element | null,\n drawingRelationships: Map<string, RelationshipRecord>\n) {\n const hyperlinkNode = node ? getFirstDescendant(node, \"hlinkClick\") : null;\n const hyperlinkTargetNode = hyperlinkNode ?? node;\n const hyperlinkId = hyperlinkTargetNode ? getRelationshipId(hyperlinkTargetNode) : null;\n return hyperlinkId ? drawingRelationships.get(hyperlinkId)?.target ?? undefined : undefined;\n}\n\nfunction parsePictureNode(\n pictureNode: Element,\n fallbackAnchor: XlsxImage[\"anchor\"],\n drawingRelationships: Map<string, RelationshipRecord>,\n archive: ArchiveEntries,\n contentTypes: ContentTypesState,\n objectUrls: string[],\n workbookSheetIndex: number,\n imageId: string,\n zIndex: number,\n parentGroup: GroupTransform | null\n) {\n const blipNode = getFirstDescendant(pictureNode, \"blip\");\n const svgBlipNode = blipNode ? getFirstDescendant(blipNode, \"svgBlip\") : null;\n const embedId = (svgBlipNode ? getEmbeddedRelationshipId(svgBlipNode) : null) ?? (blipNode ? getEmbeddedRelationshipId(blipNode) : null);\n if (!embedId) {\n return null;\n }\n\n const mediaRelationship = drawingRelationships.get(embedId);\n if (!mediaRelationship || mediaRelationship.type !== IMAGE_REL_TYPE) {\n return null;\n }\n\n const mediaBytes = archive[mediaRelationship.target];\n if (!mediaBytes) {\n return null;\n }\n\n const nonVisualProps = getFirstDescendant(pictureNode, \"cNvPr\");\n const transform = anchorFromNodeOrFallback(pictureNode, fallbackAnchor, parentGroup);\n return {\n image: {\n anchor: transform.anchor,\n description: nonVisualProps?.getAttribute(\"descr\") ?? undefined,\n hyperlink: getHyperlinkTarget(nonVisualProps ?? pictureNode, drawingRelationships),\n id: imageId,\n mediaPath: mediaRelationship.target,\n mimeType: resolveContentType(contentTypes, mediaRelationship.target),\n name: nonVisualProps?.getAttribute(\"name\") ?? undefined,\n sheetIndex: workbookSheetIndex,\n src: createImageSource(mediaBytes, resolveContentType(contentTypes, mediaRelationship.target), objectUrls),\n workbookSheetIndex,\n zIndex\n } satisfies XlsxImage,\n mediaPath: mediaRelationship.target\n };\n}\n\nfunction parseShapeNode(\n shapeNode: Element,\n fallbackAnchor: XlsxImage[\"anchor\"],\n drawingRelationships: Map<string, RelationshipRecord>,\n theme: ThemeState,\n workbookSheetIndex: number,\n shapeId: string,\n zIndex: number,\n parentGroup: GroupTransform | null\n) {\n const nonVisualProps = getFirstDescendant(shapeNode, \"cNvPr\");\n const styleNode = getFirstChild(shapeNode, \"style\");\n const transform = anchorFromNodeOrFallback(shapeNode, fallbackAnchor, parentGroup);\n const geometry = getFirstDescendant(shapeNode, \"prstGeom\")?.getAttribute(\"prst\")\n ?? (getFirstDescendant(shapeNode, \"custGeom\") ? \"custom\" : \"rect\");\n const customPath = geometry === \"custom\" ? parseCustomGeometryPath(shapeNode) : undefined;\n const geometryAdjustments = parseShapeGeometryAdjustments(shapeNode);\n return {\n anchor: transform.anchor,\n description: nonVisualProps?.getAttribute(\"descr\") ?? undefined,\n fill: parseShapeFill(shapeNode, styleNode, theme, geometry),\n flipH: transform.flipH,\n flipV: transform.flipV,\n geometry,\n geometryAdjustments,\n hidden: nonVisualProps?.getAttribute(\"hidden\") === \"1\" || undefined,\n hyperlink: getHyperlinkTarget(nonVisualProps ?? shapeNode, drawingRelationships),\n id: shapeId,\n name: nonVisualProps?.getAttribute(\"name\") ?? undefined,\n paragraphs: parseShapeParagraphs(shapeNode, styleNode, theme),\n rotationDeg: transform.rotationDeg,\n scaleX: transform.scaleX,\n scaleY: transform.scaleY,\n sheetIndex: workbookSheetIndex,\n svgPath: customPath?.path,\n svgViewBox: customPath?.viewBox,\n stroke: parseShapeStroke(shapeNode, styleNode, theme),\n textBox: parseTextBox(shapeNode),\n workbookSheetIndex,\n zIndex\n } satisfies XlsxShape;\n}\n\nfunction parseAnchorContents(\n anchorNode: Element,\n fallbackAnchor: XlsxImage[\"anchor\"],\n drawingRelationships: Map<string, RelationshipRecord>,\n archive: ArchiveEntries,\n contentTypes: ContentTypesState,\n objectUrls: string[],\n workbookSheetIndex: number,\n theme: ThemeState,\n ids: { image: number; shape: number; z: number },\n imageOriginsById: Map<string, WorkbookImageOrigin>,\n anchorIndex: number,\n sheetState: WorkbookSheetState | null,\n drawingPath: string,\n parentGroup: GroupTransform | null = null,\n picturePath: number[] = []\n) {\n const images: XlsxImage[] = [];\n const shapes: XlsxShape[] = [];\n const mediaPaths = new Set<string>();\n\n Array.from(anchorNode.childNodes).filter(isElementNode).forEach((child, childIndex) => {\n if (child.localName === \"pic\") {\n const imageId = `sheet-${workbookSheetIndex}-${ids.image}`;\n const parsed = parsePictureNode(\n child,\n fallbackAnchor,\n drawingRelationships,\n archive,\n contentTypes,\n objectUrls,\n workbookSheetIndex,\n imageId,\n ids.z++,\n parentGroup\n );\n ids.image += 1;\n if (parsed) {\n images.push(parsed.image);\n mediaPaths.add(parsed.mediaPath);\n imageOriginsById.set(imageId, {\n anchorIndex,\n drawingPath,\n picturePath: [...picturePath, childIndex],\n workbookSheetIndex\n });\n }\n return;\n }\n\n if (child.localName === \"sp\") {\n shapes.push(parseShapeNode(\n child,\n fallbackAnchor,\n drawingRelationships,\n theme,\n workbookSheetIndex,\n `shape-${workbookSheetIndex}-${ids.shape++}`,\n ids.z++,\n parentGroup\n ));\n return;\n }\n\n if (child.localName === \"cxnSp\") {\n shapes.push(parseShapeNode(\n child,\n fallbackAnchor,\n drawingRelationships,\n theme,\n workbookSheetIndex,\n `shape-${workbookSheetIndex}-${ids.shape++}`,\n ids.z++,\n parentGroup\n ));\n return;\n }\n\n if (child.localName !== \"grpSp\") {\n return;\n }\n\n const nextGroup = parseGroupTransform(\n child,\n parentGroup,\n fallbackAnchor,\n sheetState\n );\n const groupFallbackAnchor = rectToAbsoluteAnchor({\n cx: nextGroup.cx,\n cy: nextGroup.cy,\n x: nextGroup.x,\n y: nextGroup.y\n });\n const parsedGroup = parseAnchorContents(\n child,\n groupFallbackAnchor,\n drawingRelationships,\n archive,\n contentTypes,\n objectUrls,\n workbookSheetIndex,\n theme,\n ids,\n imageOriginsById,\n anchorIndex,\n sheetState,\n drawingPath,\n nextGroup,\n [...picturePath, childIndex]\n );\n parsedGroup.images.forEach((image) => images.push(image));\n parsedGroup.shapes.forEach((shape) => shapes.push(shape));\n parsedGroup.mediaPaths.forEach((path) => mediaPaths.add(path));\n });\n\n return {\n images,\n mediaPaths,\n shapes\n };\n}\n\nfunction parseDrawingObjects(\n archive: ArchiveEntries,\n contentTypes: ContentTypesState,\n drawingPath: string,\n objectUrls: string[],\n workbookSheetIndex: number,\n zIndexBase: number,\n theme: ThemeState,\n sheetState: WorkbookSheetState | null,\n imageOriginsById: Map<string, WorkbookImageOrigin>\n) {\n const drawingXml = readArchiveText(archive, drawingPath);\n if (!drawingXml) {\n return {\n images: [] as XlsxImage[],\n mediaPaths: [] as string[],\n shapes: [] as XlsxShape[]\n };\n }\n\n const drawingDocument = parseXml(drawingXml);\n if (!drawingDocument) {\n return {\n images: [] as XlsxImage[],\n mediaPaths: [] as string[],\n shapes: [] as XlsxShape[]\n };\n }\n\n const drawingRelationships = parseRelationships(archive, relsPathForDocument(drawingPath), drawingPath);\n const images: XlsxImage[] = [];\n const shapes: XlsxShape[] = [];\n const mediaPaths = new Set<string>();\n const anchorNodes = createImageAnchorNodes(drawingDocument);\n const ids = {\n image: zIndexBase,\n shape: zIndexBase,\n z: zIndexBase\n };\n\n anchorNodes.forEach((anchorNode, anchorIndex) => {\n const anchor = parseAnchor(anchorNode);\n if (!anchor) {\n return;\n }\n\n const parsed = parseAnchorContents(\n anchorNode,\n anchor,\n drawingRelationships,\n archive,\n contentTypes,\n objectUrls,\n workbookSheetIndex,\n theme,\n ids,\n imageOriginsById,\n anchorIndex,\n sheetState,\n drawingPath\n );\n parsed.images.forEach((image) => images.push(image));\n parsed.shapes.forEach((shape) => shapes.push(shape));\n parsed.mediaPaths.forEach((path) => mediaPaths.add(path));\n });\n\n return {\n images,\n mediaPaths: [...mediaPaths],\n shapes\n };\n}\n\nexport function refreshWorkbookFormControls(\n workbook: Workbook,\n _currentControlsByWorkbookSheetIndex: XlsxFormControl[][],\n themePalette?: XlsxThemePalette | null\n) {\n return collectWorkbookFormControls(workbook, themePalette);\n}\n\nexport function revokeWorkbookImageAssets(assets: WorkbookImageAssets | null) {\n if (!assets) {\n return;\n }\n\n for (const objectUrl of assets.objectUrls) {\n if (objectUrl.startsWith(\"blob:\")) {\n URL.revokeObjectURL(objectUrl);\n }\n }\n}\n\nfunction parseWorkbookStructureAssetsFromArchive(\n archive: ArchiveEntries,\n options?: ParseWorkbookStructureOptions\n): WorkbookStructureAssets & {\n contentTypes: ContentTypesState;\n theme: ThemeState;\n workbookSheets: WorkbookSheetInfo[];\n} {\n const contentTypes = parseContentTypes(archive);\n const workbookSheets = parseWorkbookSheets(archive);\n const theme = parseWorkbookTheme(archive);\n const themePalette = buildThemePalette(theme);\n const { defaultFont, differentialStyles, namedCellStyleByName, styleById, tableStyleByName } = parseWorkbookStyles(archive);\n return {\n contentTypes,\n namedCellStyleByName,\n sheetStatesByWorkbookSheetIndex: workbookSheets.map((sheet) => parseSheetState(archive, sheet.path, {\n ...options,\n differentialStyles,\n defaultFont,\n themePalette\n })),\n styleById,\n tableMetadataByWorkbookSheetIndex: workbookSheets.map(() => [] as WorkbookTableMetadata[]),\n tableStyleByName,\n theme,\n themePalette,\n workbookSheets\n };\n}\n\nexport function parseWorkbookStructureAssets(\n bytes: Uint8Array,\n options?: ParseWorkbookStructureOptions\n): WorkbookStructureAssets {\n const archive = unzipSync(bytes);\n const {\n namedCellStyleByName,\n sheetStatesByWorkbookSheetIndex,\n styleById,\n tableMetadataByWorkbookSheetIndex,\n tableStyleByName,\n themePalette\n } = parseWorkbookStructureAssetsFromArchive(archive, options);\n\n return {\n namedCellStyleByName,\n sheetStatesByWorkbookSheetIndex,\n styleById,\n tableMetadataByWorkbookSheetIndex,\n tableStyleByName,\n themePalette\n };\n}\n\nexport function parseWorkbookChartStyleAssets(bytes: Uint8Array): WorkbookChartStyleAssets {\n const archive = unzipSync(bytes);\n const {\n themePalette,\n workbookSheets\n } = parseWorkbookStructureAssetsFromArchive(archive);\n const sheetOrigins: Array<WorkbookImageSheetOrigin | null> = [];\n\n workbookSheets.forEach((sheet, workbookSheetIndex) => {\n const sheetRelationships = parseRelationships(archive, relsPathForDocument(sheet.path), sheet.path);\n const attachments: XlsxImageAttachment[] = [];\n\n for (const relationship of sheetRelationships.values()) {\n if (relationship.type !== DRAWING_REL_TYPE) {\n continue;\n }\n\n const drawingPath = relationship.target;\n const drawingRelsPath = relsPathForDocument(drawingPath);\n attachments.push({\n drawingPath,\n drawingRelsPath: archive[drawingRelsPath] ? drawingRelsPath : null,\n mediaPaths: []\n });\n }\n\n sheetOrigins[workbookSheetIndex] = attachments.length > 0\n ? {\n attachments,\n workbookSheetIndex\n }\n : null;\n });\n\n return {\n archive,\n sheetOrigins,\n themePalette\n };\n}\n\nexport function parseWorkbookImageAssets(\n bytes: Uint8Array,\n workbook?: Workbook\n): WorkbookImageAssets {\n const archive = unzipSync(bytes);\n const {\n contentTypes,\n namedCellStyleByName,\n sheetStatesByWorkbookSheetIndex,\n styleById,\n tableMetadataByWorkbookSheetIndex,\n tableStyleByName,\n theme,\n themePalette,\n workbookSheets\n } = parseWorkbookStructureAssetsFromArchive(archive);\n const objectUrls: string[] = [];\n const formControlsByWorkbookSheetIndex: XlsxFormControl[][] = [];\n const imagesByWorkbookSheetIndex: XlsxImage[][] = [];\n const shapesByWorkbookSheetIndex: XlsxShape[][] = [];\n const sheetOrigins: Array<WorkbookImageSheetOrigin | null> = [];\n const imageOriginsById = new Map<string, WorkbookImageOrigin>();\n const formControls = workbook\n ? collectWorkbookFormControls(workbook, themePalette)\n : [];\n\n workbookSheets.forEach((sheet, workbookSheetIndex) => {\n const sheetRelationships = parseRelationships(archive, relsPathForDocument(sheet.path), sheet.path);\n const attachments: XlsxImageAttachment[] = [];\n const imageList: XlsxImage[] = [];\n const shapeList: XlsxShape[] = [];\n let zIndexBase = 1;\n\n for (const relationship of sheetRelationships.values()) {\n if (relationship.type !== DRAWING_REL_TYPE) {\n continue;\n }\n\n const drawingPath = relationship.target;\n const drawingRelsPath = relsPathForDocument(drawingPath);\n const drawingImages = parseDrawingObjects(\n archive,\n contentTypes,\n drawingPath,\n objectUrls,\n workbookSheetIndex,\n zIndexBase,\n theme,\n sheetStatesByWorkbookSheetIndex[workbookSheetIndex] ?? null,\n imageOriginsById\n );\n imageList.push(...drawingImages.images);\n shapeList.push(...drawingImages.shapes);\n zIndexBase += drawingImages.images.length + drawingImages.shapes.length + 10;\n attachments.push({\n drawingPath,\n drawingRelsPath: archive[drawingRelsPath] ? drawingRelsPath : null,\n mediaPaths: drawingImages.mediaPaths\n });\n }\n\n const visibleShapeList = shapeList.filter((shape) => !shape.hidden);\n formControlsByWorkbookSheetIndex[workbookSheetIndex] = formControls[workbookSheetIndex] ?? [];\n imagesByWorkbookSheetIndex[workbookSheetIndex] = imageList;\n shapesByWorkbookSheetIndex[workbookSheetIndex] = visibleShapeList;\n sheetOrigins[workbookSheetIndex] = attachments.length > 0\n ? {\n attachments,\n workbookSheetIndex\n }\n : null;\n });\n\n return {\n archive,\n dirtyArchivePaths: new Set(),\n formControlsByWorkbookSheetIndex,\n imageOriginsById,\n imagesByWorkbookSheetIndex,\n namedCellStyleByName,\n objectUrls,\n shapesByWorkbookSheetIndex,\n sheetOrigins,\n sheetStatesByWorkbookSheetIndex,\n styleById,\n tableMetadataByWorkbookSheetIndex,\n tableStyleByName,\n themePalette\n };\n}\n\nfunction updateAnchorNode(anchorNode: Element, anchor: XlsxImage[\"anchor\"]) {\n if (anchor.kind === \"two-cell\") {\n updateMarkerElement(getFirstChild(anchorNode, \"from\"), anchor.from);\n updateMarkerElement(getFirstChild(anchorNode, \"to\"), anchor.to);\n return;\n }\n\n if (anchor.kind === \"one-cell\") {\n updateMarkerElement(getFirstChild(anchorNode, \"from\"), anchor.from);\n const extNode = getFirstChild(anchorNode, \"ext\");\n if (extNode) {\n extNode.setAttribute(\"cx\", String(Math.max(0, Math.round(anchor.sizeEmu.cx))));\n extNode.setAttribute(\"cy\", String(Math.max(0, Math.round(anchor.sizeEmu.cy))));\n }\n return;\n }\n\n const positionNode = getFirstChild(anchorNode, \"pos\");\n if (positionNode) {\n positionNode.setAttribute(\"x\", String(Math.max(0, Math.round(anchor.positionEmu.x))));\n positionNode.setAttribute(\"y\", String(Math.max(0, Math.round(anchor.positionEmu.y))));\n }\n const extNode = getFirstChild(anchorNode, \"ext\");\n if (extNode) {\n extNode.setAttribute(\"cx\", String(Math.max(0, Math.round(anchor.sizeEmu.cx))));\n extNode.setAttribute(\"cy\", String(Math.max(0, Math.round(anchor.sizeEmu.cy))));\n }\n}\n\nexport function updateWorkbookImageAnchor(\n assets: WorkbookImageAssets,\n imageId: string,\n anchor: XlsxImage[\"anchor\"]\n) {\n const origin = assets.imageOriginsById.get(imageId);\n if (!origin) {\n return false;\n }\n\n const attachments = assets.sheetOrigins[origin.workbookSheetIndex]?.attachments ?? [];\n for (const attachment of attachments) {\n if (attachment.drawingPath !== origin.drawingPath) {\n continue;\n }\n const drawingXml = readArchiveText(assets.archive, attachment.drawingPath);\n if (!drawingXml) {\n continue;\n }\n\n const drawingDocument = parseXml(drawingXml);\n if (!drawingDocument) {\n continue;\n }\n\n const anchorNodes = createImageAnchorNodes(drawingDocument);\n const anchorNode = anchorNodes[origin.anchorIndex];\n if (!anchorNode) {\n continue;\n }\n\n let pictureNode = anchorNode;\n let parentGroup: GroupTransform | null = null;\n let groupAnchor = parseAnchor(anchorNode);\n for (const childIndex of origin.picturePath) {\n const child = Array.from(pictureNode.childNodes).filter(isElementNode)[childIndex];\n if (!child || !groupAnchor) {\n break;\n }\n pictureNode = child;\n if (child.localName === \"grpSp\") {\n parentGroup = parseGroupTransform(\n child,\n parentGroup,\n groupAnchor,\n assets.sheetStatesByWorkbookSheetIndex[origin.workbookSheetIndex] ?? null\n );\n groupAnchor = rectToAbsoluteAnchor(parentGroup);\n }\n }\n if (pictureNode.localName !== \"pic\") {\n continue;\n }\n\n if (parentGroup) {\n const transform = getFirstDescendant(pictureNode, \"xfrm\");\n const off = transform ? getFirstChild(transform, \"off\") : null;\n const ext = transform ? getFirstChild(transform, \"ext\") : null;\n if (anchor.kind !== \"absolute\" || !off || !ext || !parentGroup.scaleX || !parentGroup.scaleY) {\n continue;\n }\n off.setAttribute(\"x\", String(Math.round(parentGroup.chX + (anchor.positionEmu.x - parentGroup.x) / parentGroup.scaleX)));\n off.setAttribute(\"y\", String(Math.round(parentGroup.chY + (anchor.positionEmu.y - parentGroup.y) / parentGroup.scaleY)));\n ext.setAttribute(\"cx\", String(Math.max(0, Math.round(anchor.sizeEmu.cx / parentGroup.scaleX))));\n ext.setAttribute(\"cy\", String(Math.max(0, Math.round(anchor.sizeEmu.cy / parentGroup.scaleY))));\n } else {\n updateAnchorNode(anchorNode, anchor);\n }\n assets.archive[attachment.drawingPath] = strToU8(serializeXml(drawingDocument));\n assets.dirtyArchivePaths.add(normalizeArchivePath(attachment.drawingPath));\n const imageList = assets.imagesByWorkbookSheetIndex[origin.workbookSheetIndex] ?? [];\n const imageIndex = imageList.findIndex((image) => image.id === imageId);\n if (imageIndex >= 0) {\n imageList[imageIndex] = {\n ...imageList[imageIndex],\n anchor\n };\n }\n return true;\n }\n\n return false;\n}\n\nfunction ensureRelationshipsDocument(archive: ArchiveEntries, relsPath: string) {\n const existing = readArchiveText(archive, relsPath);\n if (existing) {\n const parsed = parseXml(existing);\n if (parsed) {\n return parsed;\n }\n }\n\n return parseXml(\n `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?><Relationships xmlns=\"${PKG_REL_NS}\"></Relationships>`\n );\n}\n\nfunction ensureContentTypesDocument(archive: ArchiveEntries) {\n const existing = readArchiveText(archive, \"[Content_Types].xml\");\n if (existing) {\n const parsed = parseXml(existing);\n if (parsed) {\n return parsed;\n }\n }\n\n return parseXml(\n `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?><Types xmlns=\"${CONTENT_TYPES_NS}\"></Types>`\n );\n}\n\nfunction mergeContentTypeForPath(\n targetDocument: XMLDocument,\n originalDocument: XMLDocument | null,\n partPath: string\n) {\n const normalizedPartName = `/${normalizeArchivePath(partPath)}`;\n const targetRoot = targetDocument.documentElement;\n if (!targetRoot) {\n return;\n }\n\n const existingOverride = getLocalElements(targetDocument, \"Override\").find(\n (node) => node.getAttribute(\"PartName\") === normalizedPartName\n );\n if (!existingOverride && originalDocument) {\n const sourceOverride = getLocalElements(originalDocument, \"Override\").find(\n (node) => node.getAttribute(\"PartName\") === normalizedPartName\n );\n if (sourceOverride) {\n targetRoot.appendChild(sourceOverride.cloneNode(true));\n return;\n }\n }\n\n const extension = normalizedPartName.split(\".\").pop()?.toLowerCase();\n if (!extension) {\n return;\n }\n\n const existingDefault = getLocalElements(targetDocument, \"Default\").find(\n (node) => (node.getAttribute(\"Extension\") ?? \"\").toLowerCase() === extension\n );\n if (existingDefault) {\n return;\n }\n\n if (originalDocument) {\n const sourceDefault = getLocalElements(originalDocument, \"Default\").find(\n (node) => (node.getAttribute(\"Extension\") ?? \"\").toLowerCase() === extension\n );\n if (sourceDefault) {\n targetRoot.appendChild(sourceDefault.cloneNode(true));\n return;\n }\n }\n\n if (extension === \"xml\") {\n const defaultNode = targetDocument.createElementNS(CONTENT_TYPES_NS, \"Default\");\n defaultNode.setAttribute(\"Extension\", extension);\n defaultNode.setAttribute(\"ContentType\", \"application/xml\");\n targetRoot.appendChild(defaultNode);\n return;\n }\n\n if (extension === \"rels\") {\n const defaultNode = targetDocument.createElementNS(CONTENT_TYPES_NS, \"Default\");\n defaultNode.setAttribute(\"Extension\", extension);\n defaultNode.setAttribute(\"ContentType\", \"application/vnd.openxmlformats-package.relationships+xml\");\n targetRoot.appendChild(defaultNode);\n }\n}\n\nfunction removeDrawingReferences(sheetDocument: XMLDocument, relDocument: XMLDocument) {\n getLocalElements(sheetDocument, \"drawing\").forEach((node) => node.remove());\n getLocalElements(relDocument, \"Relationship\")\n .filter((node) => node.getAttribute(\"Type\") === DRAWING_REL_TYPE)\n .forEach((node) => node.remove());\n}\n\nfunction nextRelationshipId(relDocument: XMLDocument) {\n const existingIds = new Set(\n getLocalElements(relDocument, \"Relationship\")\n .map((node) => node.getAttribute(\"Id\"))\n .filter((value): value is string => Boolean(value))\n );\n\n let index = 1;\n while (existingIds.has(`rIdReactXlsxImage${index}`)) {\n index += 1;\n }\n\n return `rIdReactXlsxImage${index}`;\n}\n\nfunction appendSheetDrawingReference(\n sheetDocument: XMLDocument,\n relationshipId: string\n) {\n const worksheet = sheetDocument.documentElement;\n if (!worksheet) {\n return;\n }\n\n const drawingNode = sheetDocument.createElementNS(SPREADSHEET_NS, \"drawing\");\n drawingNode.setAttributeNS(REL_NS, \"r:id\", relationshipId);\n\n const successorNames = new Set([\n \"legacyDrawing\",\n \"legacyDrawingHF\",\n \"picture\",\n \"oleObjects\",\n \"controls\",\n \"webPublishItems\",\n \"tableParts\",\n \"extLst\"\n ]);\n const successor = Array.from(worksheet.childNodes).find((node) => (\n isElementNode(node) && node.namespaceURI === SPREADSHEET_NS && successorNames.has(node.localName)\n ));\n worksheet.insertBefore(drawingNode, successor ?? null);\n}\n\nexport function mergeWorkbookImageAssets(\n savedBytes: Uint8Array,\n sourceAssets: WorkbookImageAssets | null,\n sheetOrigins: Array<WorkbookImageSheetOrigin | null>\n) {\n if (!sourceAssets) {\n return cloneBytes(savedBytes);\n }\n\n try {\n const archive = unzipSync(savedBytes);\n const workbookSheets = parseWorkbookSheets(archive);\n const originalContentTypesDocument = parseXml(readArchiveText(sourceAssets.archive, \"[Content_Types].xml\") ?? \"\");\n const targetContentTypesDocument = ensureContentTypesDocument(archive);\n if (!targetContentTypesDocument) {\n return cloneBytes(savedBytes);\n }\n\n const copiedParts = new Set<string>();\n const copyDrawingPart = (path: string) => {\n const normalizedPath = normalizeArchivePath(path);\n const bytes = sourceAssets.archive[normalizedPath];\n if (!bytes || copiedParts.has(normalizedPath)) {\n return;\n }\n copiedParts.add(normalizedPath);\n archive[normalizedPath] = cloneBytes(bytes);\n mergeContentTypeForPath(targetContentTypesDocument, originalContentTypesDocument, normalizedPath);\n\n const relsPath = relsPathForDocument(normalizedPath);\n const relsBytes = sourceAssets.archive[relsPath];\n if (!relsBytes) {\n return;\n }\n archive[relsPath] = cloneBytes(relsBytes);\n mergeContentTypeForPath(targetContentTypesDocument, originalContentTypesDocument, relsPath);\n for (const relationship of parseRelationships(sourceAssets.archive, relsPath, normalizedPath).values()) {\n if (relationship.targetMode !== \"External\" && !relationship.type.endsWith(\"/hyperlink\")) {\n copyDrawingPart(relationship.target);\n }\n }\n };\n\n sheetOrigins.forEach((origin, workbookSheetIndex) => {\n if (!origin?.attachments.length) {\n return;\n }\n\n const currentSheet = workbookSheets[workbookSheetIndex];\n if (!currentSheet) {\n return;\n }\n\n const sheetXml = readArchiveText(archive, currentSheet.path);\n if (!sheetXml) {\n return;\n }\n\n const sheetDocument = parseXml(sheetXml);\n const relsPath = relsPathForDocument(currentSheet.path);\n const relDocument = ensureRelationshipsDocument(archive, relsPath);\n if (!sheetDocument || !relDocument) {\n return;\n }\n\n removeDrawingReferences(sheetDocument, relDocument);\n\n origin.attachments.forEach((attachment) => {\n const drawingBytes = sourceAssets.archive[attachment.drawingPath];\n if (!drawingBytes) {\n return;\n }\n\n copyDrawingPart(attachment.drawingPath);\n\n const relationshipId = nextRelationshipId(relDocument);\n const relationshipNode = relDocument.createElementNS(PKG_REL_NS, \"Relationship\");\n relationshipNode.setAttribute(\"Id\", relationshipId);\n relationshipNode.setAttribute(\"Type\", DRAWING_REL_TYPE);\n relationshipNode.setAttribute(\"Target\", relativeArchivePath(currentSheet.path, attachment.drawingPath));\n relDocument.documentElement?.appendChild(relationshipNode);\n appendSheetDrawingReference(sheetDocument, relationshipId);\n });\n\n archive[currentSheet.path] = strToU8(serializeXml(sheetDocument));\n archive[relsPath] = strToU8(serializeXml(relDocument));\n mergeContentTypeForPath(targetContentTypesDocument, originalContentTypesDocument, relsPath);\n });\n\n for (const dirtyPath of sourceAssets.dirtyArchivePaths) {\n const bytes = sourceAssets.archive[dirtyPath];\n if (!bytes) {\n continue;\n }\n archive[dirtyPath] = cloneBytes(bytes);\n mergeContentTypeForPath(targetContentTypesDocument, originalContentTypesDocument, dirtyPath);\n }\n\n const hasDrawingOverride = getLocalElements(targetContentTypesDocument, \"Override\").some(\n (node) => node.getAttribute(\"ContentType\") === DRAWING_CONTENT_TYPE\n );\n if (!hasDrawingOverride) {\n for (const path of Object.keys(archive)) {\n if (path.startsWith(\"xl/drawings/\") && path.endsWith(\".xml\")) {\n mergeContentTypeForPath(targetContentTypesDocument, originalContentTypesDocument, path);\n }\n }\n }\n\n archive[\"[Content_Types].xml\"] = strToU8(serializeXml(targetContentTypesDocument));\n return zipSync(archive, { level: 6 });\n } catch {\n return cloneBytes(savedBytes);\n }\n}\n\nexport function emuToPixels(value: number) {\n return value / EMU_PER_PIXEL;\n}\n\nexport function pixelsToEmu(value: number) {\n return value * EMU_PER_PIXEL;\n}\n\nexport function pxToSheetColumnWidth(widthPx: number) {\n return (Math.max(widthPx, MIN_COL_WIDTH_PX) - 5) / 7;\n}\n\nexport function resolveSheetColumnWidthPixels(width: number, columnWidthCharacterWidthPx?: number) {\n return sheetColumnWidthToPixels(width, columnWidthCharacterWidthPx);\n}\n\nexport function resolveSheetRowHeightPixels(height: number) {\n return Math.max(Math.round(height * 1.33), MIN_ROW_HEIGHT_PX);\n}\n\nexport function resolveRenderedSheetAxisPixels(sizePx: number, showGridLines = true) {\n return Math.max(0, sizePx) + (showGridLines ? resolveDeviceGridlineThicknessPx() : 0);\n}\n\nexport function resolveContentSheetAxisPixels(sizePx: number, showGridLines = true) {\n return Math.max(0, sizePx - (showGridLines ? resolveDeviceGridlineThicknessPx() : 0));\n}\n\nfunction markerFromOffset(offsetPx: number, getSizePx: (index: number) => number) {\n let remaining = Math.max(0, offsetPx);\n let index = 0;\n while (remaining > 0) {\n const size = Math.max(0, getSizePx(index));\n if (remaining < size) {\n break;\n }\n remaining -= size;\n index += 1;\n }\n\n return {\n index,\n offsetPx: remaining\n };\n}\n\nexport function rectToImageAnchor(\n rect: XlsxImageRect,\n currentAnchor: XlsxImage[\"anchor\"],\n options: {\n contentOffsetLeft: number;\n contentOffsetTop: number;\n getColumnWidthPx: (col: number) => number;\n getRowHeightPx: (row: number) => number;\n }\n): XlsxImage[\"anchor\"] {\n const contentLeft = Math.max(0, rect.left - options.contentOffsetLeft);\n const contentTop = Math.max(0, rect.top - options.contentOffsetTop);\n const contentRight = Math.max(contentLeft + 1, rect.left + rect.width - options.contentOffsetLeft);\n const contentBottom = Math.max(contentTop + 1, rect.top + rect.height - options.contentOffsetTop);\n\n if (currentAnchor.kind === \"absolute\") {\n return {\n kind: \"absolute\",\n positionEmu: {\n x: pixelsToEmu(contentLeft),\n y: pixelsToEmu(contentTop)\n },\n sizeEmu: {\n cx: pixelsToEmu(rect.width),\n cy: pixelsToEmu(rect.height)\n }\n };\n }\n\n const fromCol = markerFromOffset(contentLeft, options.getColumnWidthPx);\n const fromRow = markerFromOffset(contentTop, options.getRowHeightPx);\n if (currentAnchor.kind === \"one-cell\") {\n return {\n from: {\n col: fromCol.index,\n colOffsetEmu: pixelsToEmu(fromCol.offsetPx),\n row: fromRow.index,\n rowOffsetEmu: pixelsToEmu(fromRow.offsetPx)\n },\n kind: \"one-cell\",\n sizeEmu: {\n cx: pixelsToEmu(rect.width),\n cy: pixelsToEmu(rect.height)\n }\n };\n }\n\n const toCol = markerFromOffset(contentRight, options.getColumnWidthPx);\n const toRow = markerFromOffset(contentBottom, options.getRowHeightPx);\n return {\n from: {\n col: fromCol.index,\n colOffsetEmu: pixelsToEmu(fromCol.offsetPx),\n row: fromRow.index,\n rowOffsetEmu: pixelsToEmu(fromRow.offsetPx)\n },\n kind: \"two-cell\",\n to: {\n col: toCol.index,\n colOffsetEmu: pixelsToEmu(toCol.offsetPx),\n row: toRow.index,\n rowOffsetEmu: pixelsToEmu(toRow.offsetPx)\n }\n };\n}\n\nexport function resizeImageRect(\n rect: XlsxImageRect,\n handle: XlsxImageResizeHandlePosition,\n deltaX: number,\n deltaY: number,\n minimumSize = 16\n) {\n let left = rect.left;\n let top = rect.top;\n let width = rect.width;\n let height = rect.height;\n\n if (handle.includes(\"w\")) {\n left += deltaX;\n width -= deltaX;\n }\n if (handle.includes(\"e\")) {\n width += deltaX;\n }\n if (handle.includes(\"n\")) {\n top += deltaY;\n height -= deltaY;\n }\n if (handle.includes(\"s\")) {\n height += deltaY;\n }\n\n if (width < minimumSize) {\n if (handle.includes(\"w\")) {\n left -= minimumSize - width;\n }\n width = minimumSize;\n }\n if (height < minimumSize) {\n if (handle.includes(\"n\")) {\n top -= minimumSize - height;\n }\n height = minimumSize;\n }\n\n return { height, left, top, width };\n}\n","import type { Workbook } from \"@dukelib/sheets-wasm\";\n\nconst SHEET_REF_REGEX = /'((?:[^']|'')+)'!|([A-Za-z_\\u0080-\\uFFFF][\\w.\\u0080-\\uFFFF]*)!/g;\n\ntype FormulaCell = { formula?: string | null; row?: number; col?: number };\n\ntype CellPosition = { sheetIdx: number; row: number; col: number };\n\nfunction collectReferencedSheetNames(workbook: Workbook): Set<string> {\n const referenced = new Set<string>();\n for (let sheetIdx = 0; sheetIdx < workbook.sheetCount; sheetIdx += 1) {\n let sheet;\n try {\n sheet = workbook.getSheet(sheetIdx);\n } catch {\n continue;\n }\n const cells = sheet.formulaCells as FormulaCell[] | null | undefined;\n if (!Array.isArray(cells)) {\n continue;\n }\n for (const cell of cells) {\n const formula = cell?.formula;\n if (!formula) {\n continue;\n }\n SHEET_REF_REGEX.lastIndex = 0;\n let match: RegExpExecArray | null;\n while ((match = SHEET_REF_REGEX.exec(formula)) !== null) {\n const raw = match[1] ?? match[2];\n if (!raw) {\n continue;\n }\n referenced.add(raw.replace(/''/g, \"'\"));\n }\n }\n }\n return referenced;\n}\n\nfunction hasUnresolvedSheetReferences(workbook: Workbook): boolean {\n let names: string[];\n try {\n names = workbook.sheetNames;\n } catch {\n return false;\n }\n const known = new Set(names);\n const referenced = collectReferencedSheetNames(workbook);\n for (const name of referenced) {\n if (!known.has(name)) {\n return true;\n }\n }\n return false;\n}\n\nfunction collectFormulaCellsWithSavedValues(workbook: Workbook): CellPosition[] {\n const positions: CellPosition[] = [];\n for (let sheetIdx = 0; sheetIdx < workbook.sheetCount; sheetIdx += 1) {\n let sheet;\n try {\n sheet = workbook.getSheet(sheetIdx);\n } catch {\n continue;\n }\n const cells = sheet.formulaCells as FormulaCell[] | null | undefined;\n if (!Array.isArray(cells)) {\n continue;\n }\n for (const cell of cells) {\n if (typeof cell?.row !== \"number\" || typeof cell?.col !== \"number\") {\n continue;\n }\n let saved;\n try {\n saved = sheet.getCalculatedValueAt(cell.row, cell.col);\n } catch {\n continue;\n }\n if (!saved.is_empty && !saved.is_error) {\n positions.push({ sheetIdx, row: cell.row, col: cell.col });\n }\n }\n }\n return positions;\n}\n\nfunction anyBecameError(workbook: Workbook, positions: CellPosition[]): boolean {\n return positions.some(({ sheetIdx, row, col }) => {\n try {\n return workbook.getSheet(sheetIdx).getCalculatedValueAt(row, col).is_error;\n } catch {\n return false;\n }\n });\n}\n\nexport type SafeCalculateSkipReason = \"unresolved-sheet-refs\" | \"calculate-trapped\" | \"calculate-regressed\";\n\nexport type SafeCalculateResult = {\n workbook: Workbook;\n calculated: boolean;\n skipReason: SafeCalculateSkipReason | null;\n};\n\nexport type SafeCalculateOptions = {\n reparse?: () => Workbook;\n};\n\n// Pre-scans for formulas referencing missing sheets (which cause the Rust\n// engine to panic into a wasm `unreachable` trap that poisons the Workbook\n// instance). On trap, `reparse` is used to return a fresh usable instance.\n//\n// Also falls back to the saved values when calculating turns a formula that\n// had a saved value into an error — e.g. a reference to a name defined as a\n// formula (`Total = SUM(A1:A3)`), which the engine evaluates to #VALUE! —\n// instead of showing errors the file never had.\nexport function safeCalculate(workbook: Workbook, options: SafeCalculateOptions = {}): SafeCalculateResult {\n if (hasUnresolvedSheetReferences(workbook)) {\n return { workbook, calculated: false, skipReason: \"unresolved-sheet-refs\" };\n }\n const withSavedValues = options.reparse ? collectFormulaCellsWithSavedValues(workbook) : [];\n try {\n workbook.calculate();\n } catch (err) {\n console.warn(\"[react-xlsx] workbook.calculate() trapped; falling back to cached formula values\", err);\n if (options.reparse) {\n try {\n return { workbook: options.reparse(), calculated: false, skipReason: \"calculate-trapped\" };\n } catch (reparseErr) {\n console.warn(\"[react-xlsx] workbook reparse after calculate trap failed\", reparseErr);\n }\n }\n return { workbook, calculated: false, skipReason: \"calculate-trapped\" };\n }\n if (options.reparse && anyBecameError(workbook, withSavedValues)) {\n try {\n return { workbook: options.reparse(), calculated: false, skipReason: \"calculate-regressed\" };\n } catch (reparseErr) {\n console.warn(\"[react-xlsx] workbook reparse after calculate regression failed\", reparseErr);\n }\n }\n return { workbook, calculated: true, skipReason: null };\n}\n\nexport function tryRecalculate(workbook: Workbook): { calculated: boolean; error: unknown } {\n try {\n workbook.calculate();\n return { calculated: true, error: null };\n } catch (err) {\n console.warn(\"[react-xlsx] workbook.calculate() trapped during recalculation\", err);\n return { calculated: false, error: err };\n }\n}\n","let wasmModulePromise: Promise<typeof import(\"@dukelib/sheets-wasm\")> | null = null;\n\nexport type XlsxWasmSource =\n | string\n | URL\n | Request\n | Response\n | BufferSource\n | WebAssembly.Module;\n\nexport type WorkerWasmSource = string | ArrayBuffer | WebAssembly.Module;\n\nlet hasConfiguredWasmSource = false;\nlet configuredWasmSource: XlsxWasmSource | undefined;\nlet configuredWorkerWasmSource: WorkerWasmSource | undefined;\n\nfunction bufferSourceToArrayBuffer(source: ArrayBuffer | ArrayBufferView<ArrayBufferLike>): ArrayBuffer {\n if (source instanceof ArrayBuffer) {\n return source.slice(0);\n }\n\n const bytes = new Uint8Array(source.buffer, source.byteOffset, source.byteLength);\n const copy = new Uint8Array(bytes);\n return copy.buffer;\n}\n\nfunction sourceToWorkerSource(source: XlsxWasmSource): WorkerWasmSource | undefined {\n if (typeof source === \"string\") {\n return source;\n }\n if (typeof URL !== \"undefined\" && source instanceof URL) {\n return source.href;\n }\n if (typeof Request !== \"undefined\" && source instanceof Request) {\n return source.url;\n }\n if (source instanceof ArrayBuffer || ArrayBuffer.isView(source)) {\n return bufferSourceToArrayBuffer(source);\n }\n if (typeof WebAssembly !== \"undefined\" && source instanceof WebAssembly.Module) {\n return source;\n }\n\n return undefined;\n}\n\nexport function setWasmSource(source: XlsxWasmSource): void {\n hasConfiguredWasmSource = true;\n configuredWasmSource = source;\n configuredWorkerWasmSource = sourceToWorkerSource(source);\n}\n\nexport function initWasm(source?: XlsxWasmSource) {\n if (source !== undefined) {\n setWasmSource(source);\n }\n\n return getSheetsWasmModule();\n}\n\nexport function canUseConfiguredWasmSourceInWorker(): boolean {\n return !hasConfiguredWasmSource || configuredWorkerWasmSource !== undefined;\n}\n\nexport function getConfiguredWorkerWasmSource(): WorkerWasmSource | undefined {\n return configuredWorkerWasmSource;\n}\n\nexport function getSheetsWasmModule() {\n if (!wasmModulePromise) {\n wasmModulePromise = import(\"@dukelib/sheets-wasm\").then(async (mod) => {\n if (configuredWasmSource !== undefined) {\n await mod.default({ module_or_path: configuredWasmSource });\n } else {\n await mod.default();\n }\n return mod;\n });\n }\n\n return wasmModulePromise;\n}\n","import type { Workbook } from \"@dukelib/sheets-wasm\";\nimport { strFromU8, unzipSync } from \"fflate\";\nimport { loadWorkbookChartAssets } from \"./charts\";\nimport { buildThemePaletteFromHex } from \"./colors\";\nimport { getCellGeneralAlignment } from \"./cell-alignment\";\nimport {\n collectWorkbookFormControls,\n parseWorkbookChartStyleAssets,\n parseWorkbookStructureAssets,\n resolveSheetColumnWidthPixels,\n resolveWorksheetDefaultColumnWidthPixels,\n resolveWorksheetDefaultRowHeightPixels,\n resolveWorksheetMergeMetadata\n} from \"./images\";\nimport type { WorkbookStructureAssets } from \"./images\";\nimport { safeCalculate } from \"./safe-calculate\";\nimport { getSheetsWasmModule, setWasmSource, type WorkerWasmSource } from \"./wasm\";\nimport type {\n XlsxChart,\n XlsxChartsheet,\n XlsxCellAddress,\n XlsxCellRange,\n XlsxDataValidation,\n XlsxFormControl,\n XlsxFreezePanes,\n XlsxResolvedCellStyle,\n XlsxSheetData,\n XlsxSheetVisibility,\n XlsxTable,\n XlsxTableStyleDefinition,\n XlsxThemePalette,\n XlsxWorkbookTab\n} from \"./types\";\n\nconst DEFAULT_ROW_HEIGHT = 24;\nconst DEFAULT_COL_WIDTH = 80;\nconst DEFAULT_ZOOM_SCALE = 100;\nconst FORMULA_COUNT_THRESHOLD = 1000;\nconst FAST_STRUCTURE_PARSE_THRESHOLD_BYTES = 5 * 1024 * 1024;\nconst MIN_ROW_HEIGHT_PX = 16;\n\ntype WorkerSheetState = Partial<NonNullable<WorkbookStructureAssets[\"sheetStatesByWorkbookSheetIndex\"][number]>>;\n\nfunction isLegacyXlsWorkbook(bytes: Uint8Array) {\n return bytes.byteLength >= 8\n && bytes[0] === 0xd0\n && bytes[1] === 0xcf\n && bytes[2] === 0x11\n && bytes[3] === 0xe0\n && bytes[4] === 0xa1\n && bytes[5] === 0xb1\n && bytes[6] === 0x1a\n && bytes[7] === 0xe1;\n}\n\nfunction shouldSkipXmlParsingForWorkbook(bytes: Uint8Array, skipXmlParsing = false) {\n return skipXmlParsing || isLegacyXlsWorkbook(bytes);\n}\n\nfunction normalizeWorksheetVisibility(value: unknown): XlsxSheetVisibility {\n return value === \"hidden\" || value === \"veryHidden\" ? value : \"visible\";\n}\n\ntype WorkerRequest =\n | {\n id: number;\n type: \"load\";\n payload: {\n buffer: ArrayBuffer;\n showHiddenSheets?: boolean;\n skipXmlParsing?: boolean;\n wasmSource?: WorkerWasmSource;\n };\n }\n | {\n id: number;\n type: \"parseCharts\";\n payload: {\n buffer: ArrayBuffer;\n showHiddenSheets?: boolean;\n skipXmlParsing?: boolean;\n wasmSource?: WorkerWasmSource;\n };\n }\n | {\n id: number;\n type: \"getCellSnapshot\";\n payload: {\n workbookSheetIndex: number;\n row: number;\n col: number;\n };\n }\n | {\n id: number;\n type: \"getRowsBatch\";\n payload: {\n workbookSheetIndex: number;\n startRow: number;\n rowCount: number;\n };\n };\n\ntype WorkerSuccessResponse = {\n id: number;\n success: true;\n result:\n | {\n chartsByWorkbookSheetIndex: XlsxChart[][];\n chartsheets: XlsxChartsheet[];\n tabs: XlsxWorkbookTab[];\n }\n | {\n chartsByWorkbookSheetIndex: XlsxChart[][];\n chartsheets: XlsxChartsheet[];\n formControlsByWorkbookSheetIndex: XlsxFormControl[][];\n sheets: XlsxSheetData[];\n tablesByWorkbookSheetIndex: XlsxTable[][];\n tabs: XlsxWorkbookTab[];\n }\n | {\n displayValue: string;\n formula: string;\n }\n | unknown[]\n | null;\n};\n\ntype WorkerErrorResponse = {\n id: number;\n success: false;\n error: string;\n};\n\ntype WorkerResponse = WorkerSuccessResponse | WorkerErrorResponse;\n\nlet workbook: Workbook | null = null;\nlet chartsByWorkbookSheetIndex: XlsxChart[][] = [];\nlet chartsheets: XlsxChartsheet[] = [];\nlet formControlsByWorkbookSheetIndex: XlsxFormControl[][] = [];\nlet sheets: XlsxSheetData[] = [];\nlet tablesByWorkbookSheetIndex: XlsxTable[][] = [];\nlet tabs: XlsxWorkbookTab[] = [];\n\nfunction canParseXmlInWorker() {\n return typeof DOMParser !== \"undefined\";\n}\n\nfunction decodeXmlAttribute(value: string) {\n return value\n .replace(/&quot;/g, \"\\\"\")\n .replace(/&apos;/g, \"'\")\n .replace(/&lt;/g, \"<\")\n .replace(/&gt;/g, \">\")\n .replace(/&amp;/g, \"&\");\n}\n\nfunction readXmlAttribute(tag: string, name: string) {\n const escapedName = name.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n const match = new RegExp(`(?:^|\\\\s)${escapedName}=\"([^\"]*)\"`).exec(tag);\n return match ? decodeXmlAttribute(match[1] ?? \"\") : null;\n}\n\nfunction readArchiveText(archive: Record<string, Uint8Array>, path: string) {\n const entry = archive[path];\n return entry ? strFromU8(entry) : \"\";\n}\n\nfunction normalizeWorkbookRelationshipTarget(target: string) {\n if (target.startsWith(\"/\")) {\n return target.replace(/^\\/+/, \"\");\n }\n\n return target.startsWith(\"xl/\")\n ? target\n : `xl/${target.replace(/^\\.?\\//, \"\")}`;\n}\n\nfunction parseWorkbookSheetPathsFromArchive(archive: Record<string, Uint8Array>) {\n const workbookXml = readArchiveText(archive, \"xl/workbook.xml\");\n const workbookRelationshipsXml = readArchiveText(archive, \"xl/_rels/workbook.xml.rels\");\n if (!workbookXml || !workbookRelationshipsXml) {\n return [] as string[];\n }\n\n const relationshipTargetById = new Map<string, string>();\n for (const match of workbookRelationshipsXml.matchAll(/<Relationship\\b[^>]*>/g)) {\n const tag = match[0];\n const id = readXmlAttribute(tag, \"Id\");\n const target = readXmlAttribute(tag, \"Target\");\n if (id && target) {\n relationshipTargetById.set(id, normalizeWorkbookRelationshipTarget(target));\n }\n }\n\n const paths: string[] = [];\n for (const match of workbookXml.matchAll(/<sheet\\b[^>]*>/g)) {\n const tag = match[0];\n const relationshipId = readXmlAttribute(tag, \"r:id\") ?? readXmlAttribute(tag, \"id\");\n const target = relationshipId ? relationshipTargetById.get(relationshipId) : null;\n if (target) {\n paths.push(target);\n }\n }\n\n return paths;\n}\n\nfunction parseWorkerSheetLayoutAssets(bytes: Uint8Array, sheetCount: number): Array<WorkerSheetState | null> {\n try {\n const archive = unzipSync(bytes);\n const workbookSheetPaths = parseWorkbookSheetPathsFromArchive(archive);\n const sheetPaths = workbookSheetPaths.length > 0\n ? workbookSheetPaths\n : Array.from({ length: sheetCount }, (_, index) => `xl/worksheets/sheet${index + 1}.xml`);\n\n return sheetPaths.slice(0, sheetCount).map((path) => {\n const xml = readArchiveText(archive, path);\n if (!xml) {\n return null;\n }\n\n const sheetFormatTag = /<(?:[\\w.-]+:)?sheetFormatPr\\b[^>]*>/.exec(xml)?.[0] ?? \"\";\n const defaultRowHeight = Number(readXmlAttribute(sheetFormatTag, \"defaultRowHeight\") ?? Number.NaN);\n const defaultColWidth = Number(readXmlAttribute(sheetFormatTag, \"defaultColWidth\")\n ?? readXmlAttribute(sheetFormatTag, \"baseColWidth\") ?? Number.NaN);\n const rowHeightOverridesPx: Record<number, number> = {};\n for (const match of xml.matchAll(/<row\\b[^>]*>/g)) {\n const tag = match[0];\n const rowNumber = Number(readXmlAttribute(tag, \"r\") ?? Number.NaN);\n const height = Number(readXmlAttribute(tag, \"ht\") ?? Number.NaN);\n const rowIndex = rowNumber - 1;\n if (rowIndex >= 0 && Number.isFinite(height)) {\n rowHeightOverridesPx[rowIndex] = Math.max(MIN_ROW_HEIGHT_PX, Math.round(height * 1.33));\n }\n }\n\n return {\n defaultRowHeightPx: Number.isFinite(defaultRowHeight) && defaultRowHeight > 0\n ? Math.max(MIN_ROW_HEIGHT_PX, Math.round(defaultRowHeight * 1.33))\n : undefined,\n defaultColWidthPx: Number.isFinite(defaultColWidth) && defaultColWidth > 0\n ? resolveSheetColumnWidthPixels(defaultColWidth)\n : undefined,\n rowHeightOverridesPx\n };\n });\n } catch {\n return [];\n }\n}\n\nfunction buildVisibleSheetIndexByWorkbookSheetIndex(nextWorkbook: Workbook, showHiddenSheets = false) {\n const mapping = new Map<number, number>();\n let visibleIndex = 0;\n for (let workbookSheetIndex = 0; workbookSheetIndex < nextWorkbook.sheetCount; workbookSheetIndex += 1) {\n const worksheet = nextWorkbook.getSheet(workbookSheetIndex);\n const visibility = normalizeWorksheetVisibility(worksheet.visibility);\n if (!showHiddenSheets && visibility !== \"visible\") {\n continue;\n }\n mapping.set(workbookSheetIndex, visibleIndex);\n visibleIndex += 1;\n }\n return mapping;\n}\n\nfunction normalizeRange(range: XlsxCellRange): XlsxCellRange {\n return {\n start: {\n col: Math.min(range.start.col, range.end.col),\n row: Math.min(range.start.row, range.end.row)\n },\n end: {\n col: Math.max(range.start.col, range.end.col),\n row: Math.max(range.start.row, range.end.row)\n }\n };\n}\n\nfunction parseA1CellReference(reference: string): XlsxCellAddress | null {\n const match = /^([A-Z]+)(\\d+)$/i.exec(reference.trim());\n if (!match) {\n return null;\n }\n\n const [, columnPart, rowPart] = match;\n let col = 0;\n for (const char of columnPart.toUpperCase()) {\n col = col * 26 + (char.charCodeAt(0) - 64);\n }\n\n return {\n col: col - 1,\n row: Number(rowPart) - 1\n };\n}\n\nfunction parseA1RangeReference(reference: string): XlsxCellRange | null {\n const [startRef, endRef = startRef] = reference.split(\":\");\n const start = parseA1CellReference(startRef ?? \"\");\n const end = parseA1CellReference(endRef ?? \"\");\n if (!start || !end) {\n return null;\n }\n\n return normalizeRange({ end, start });\n}\n\ntype ResolvedWorkbookReference = {\n range: XlsxCellRange;\n worksheet: ReturnType<Workbook[\"getSheet\"]>;\n};\n\nfunction resolveWorkbookReference(\n targetWorkbook: Workbook,\n defaultWorkbookSheetIndex: number,\n rawReference: string,\n resolvingNamedRange = false\n): ResolvedWorkbookReference | null {\n const reference = rawReference.trim().replace(/^=/, \"\");\n if (!reference) {\n return null;\n }\n\n let workbookSheetIndex = defaultWorkbookSheetIndex;\n let rangeReference = reference;\n const bangIndex = reference.lastIndexOf(\"!\");\n if (bangIndex >= 0) {\n let sheetName = reference.slice(0, bangIndex).trim();\n rangeReference = reference.slice(bangIndex + 1).trim();\n if (sheetName.startsWith(\"'\") && sheetName.endsWith(\"'\")) {\n sheetName = sheetName.slice(1, -1).replace(/''/g, \"'\");\n }\n const resolvedSheetIndex = targetWorkbook.sheetIndex(sheetName);\n if (resolvedSheetIndex === undefined) {\n return null;\n }\n workbookSheetIndex = resolvedSheetIndex;\n } else if (!resolvingNamedRange) {\n const namedRange = targetWorkbook.getNamedRange(reference);\n if (namedRange) {\n return resolveWorkbookReference(targetWorkbook, defaultWorkbookSheetIndex, namedRange, true);\n }\n }\n\n const range = parseA1RangeReference(rangeReference.replace(/\\$/g, \"\"));\n if (!range || workbookSheetIndex < 0 || workbookSheetIndex >= targetWorkbook.sheetCount) {\n return null;\n }\n\n try {\n return {\n range,\n worksheet: targetWorkbook.getSheet(workbookSheetIndex)\n };\n } catch {\n return null;\n }\n}\n\nfunction resolveFormControlItems(\n targetWorkbook: Workbook,\n workbookSheetIndex: number,\n control: XlsxFormControl\n) {\n if ((control.kind !== \"dropdown\" && control.kind !== \"listbox\") || !control.inputRange) {\n return [];\n }\n\n const source = resolveWorkbookReference(targetWorkbook, workbookSheetIndex, control.inputRange);\n if (!source) {\n return [];\n }\n\n const items: string[] = [];\n for (let row = source.range.start.row; row <= source.range.end.row; row += 1) {\n for (let col = source.range.start.col; col <= source.range.end.col; col += 1) {\n items.push(source.worksheet.getFormattedValueAt(row, col));\n }\n }\n return items;\n}\n\nfunction parseWorksheetFreezePanes(worksheet: ReturnType<Workbook[\"getSheet\"]>): XlsxFreezePanes | null {\n const rawFreezePanes = worksheet.freezePanes as Record<string, unknown> | null | undefined;\n const row = typeof rawFreezePanes?.row === \"number\" && rawFreezePanes.row >= 0 ? rawFreezePanes.row : null;\n const col = typeof rawFreezePanes?.col === \"number\" && rawFreezePanes.col >= 0 ? rawFreezePanes.col : null;\n if (row === null && col === null) {\n return null;\n }\n\n return {\n col: col ?? 0,\n row: row ?? 0\n };\n}\n\nfunction parseWorksheetDataValidations(worksheet: ReturnType<Workbook[\"getSheet\"]>): XlsxDataValidation[] {\n const rawDataValidations = Array.isArray(worksheet.dataValidations) ? worksheet.dataValidations : [];\n\n return rawDataValidations.flatMap((entry) => {\n if (!entry || typeof entry !== \"object\") {\n return [];\n }\n\n const validation = entry as Record<string, unknown>;\n const ranges = Array.isArray(validation.ranges)\n ? validation.ranges.flatMap((range) => {\n if (typeof range !== \"string\") {\n return [];\n }\n\n const parsedRange = parseA1RangeReference(range);\n return parsedRange ? [parsedRange] : [];\n })\n : [];\n const validationType = typeof validation.validationType === \"string\" ? validation.validationType : null;\n if (!validationType || ranges.length === 0) {\n return [];\n }\n\n return [{\n allowBlank: typeof validation.allowBlank === \"boolean\" ? validation.allowBlank : undefined,\n errorMessage: typeof validation.errorMessage === \"string\" ? validation.errorMessage : undefined,\n errorStyle: typeof validation.errorStyle === \"string\" ? validation.errorStyle : undefined,\n inputMessage: typeof validation.inputMessage === \"string\" ? validation.inputMessage : undefined,\n listSource: typeof validation.listSource === \"string\" ? validation.listSource : undefined,\n ranges,\n showDropdown: typeof validation.showDropdown === \"boolean\" ? validation.showDropdown : undefined,\n showErrorAlert: typeof validation.showErrorAlert === \"boolean\" ? validation.showErrorAlert : undefined,\n showInputMessage: typeof validation.showInputMessage === \"boolean\" ? validation.showInputMessage : undefined,\n validationType\n } satisfies XlsxDataValidation];\n });\n}\n\nfunction resolveWorksheetZoomScale(\n worksheet: ReturnType<Workbook[\"getSheet\"]>,\n sheetState?: { zoomScale?: number } | null\n) {\n const candidates = [\n sheetState?.zoomScale,\n typeof worksheet.zoomScale === \"number\" ? worksheet.zoomScale : undefined\n ];\n const value = candidates.find((entry): entry is number => typeof entry === \"number\" && Number.isFinite(entry) && entry > 0);\n return value ?? DEFAULT_ZOOM_SCALE;\n}\n\nfunction resolveSheetDisplayUsedRange(\n usedRange: [number, number, number, number],\n sheetState?: {\n maxContentCol?: number;\n maxContentRow?: number;\n maxHorizontalMergeEndCol?: number;\n maxVerticalMergeEndRow?: number;\n minContentCol?: number;\n minContentRow?: number;\n } | null\n): [number, number, number, number] {\n const [minRow, minCol, maxRow, maxCol] = usedRange;\n const maxContentRow = sheetState?.maxContentRow ?? -1;\n const maxContentCol = sheetState?.maxContentCol ?? -1;\n const maxVerticalMergeEndRow = sheetState?.maxVerticalMergeEndRow ?? -1;\n const maxHorizontalMergeEndCol = sheetState?.maxHorizontalMergeEndCol ?? -1;\n const maxMeaningfulRow = Math.max(maxContentRow, maxVerticalMergeEndRow);\n const maxMeaningfulCol = Math.max(maxContentCol, maxHorizontalMergeEndCol);\n\n if (maxMeaningfulRow < 0 && maxMeaningfulCol < 0) {\n return usedRange;\n }\n\n return [\n sheetState?.minContentRow !== undefined && sheetState.minContentRow >= 0 ? Math.min(minRow, sheetState.minContentRow) : minRow,\n sheetState?.minContentCol !== undefined && sheetState.minContentCol >= 0 ? Math.min(minCol, sheetState.minContentCol) : minCol,\n maxMeaningfulRow >= 0\n ? (maxContentRow >= 0 ? Math.min(maxRow, maxMeaningfulRow) : Math.max(maxRow, maxMeaningfulRow))\n : maxRow,\n maxMeaningfulCol >= 0\n ? (maxContentCol >= 0 ? Math.min(maxCol, maxMeaningfulCol) : Math.max(maxCol, maxMeaningfulCol))\n : maxCol\n ];\n}\n\nfunction buildSheetList(\n nextWorkbook: Workbook,\n themePalette: XlsxThemePalette,\n structureAssets?: WorkbookStructureAssets | null,\n sheetLayoutStates?: Array<WorkerSheetState | null>,\n showHiddenSheets = false\n) {\n const sheetsByWorkbookSheetIndex: XlsxSheetData[] = [];\n\n for (let index = 0; index < nextWorkbook.sheetCount; index += 1) {\n const worksheet = nextWorkbook.getSheet(index);\n const sheetState = structureAssets?.sheetStatesByWorkbookSheetIndex[index] ?? sheetLayoutStates?.[index] ?? null;\n const mergeMetadata = resolveWorksheetMergeMetadata(worksheet);\n const effectiveSheetState = {\n ...sheetState,\n ...mergeMetadata\n };\n const defaultColWidthPx = sheetState?.defaultColWidthPx ?? resolveWorksheetDefaultColumnWidthPixels(\n worksheet,\n sheetState?.columnWidthCharacterWidthPx,\n DEFAULT_COL_WIDTH\n );\n const defaultRowHeightPx = sheetState?.defaultRowHeightPx ?? resolveWorksheetDefaultRowHeightPixels(\n worksheet,\n DEFAULT_ROW_HEIGHT\n );\n const visibility = normalizeWorksheetVisibility(worksheet.visibility);\n if (!showHiddenSheets && visibility !== \"visible\") {\n continue;\n }\n\n const resolveColumnWidthPx = (col: number) => {\n const width = worksheet.getColumnWidth(col);\n if (width !== undefined && width !== null) {\n return resolveSheetColumnWidthPixels(width, sheetState?.columnWidthCharacterWidthPx);\n }\n\n return sheetState?.colWidthOverridesPx?.[col] ?? defaultColWidthPx;\n };\n\n const resolveRowHeightPx = (row: number) => {\n const height = worksheet.getRowHeight(row);\n if (height !== undefined && height !== null) {\n return Math.max(Math.round(height * 1.33), 16);\n }\n\n return sheetState?.rowHeightOverridesPx?.[row] ?? defaultRowHeightPx;\n };\n\n const usedRange = worksheet.usedRange() as [number, number, number, number] | null;\n if (!usedRange) {\n sheetsByWorkbookSheetIndex.push({\n autoFilterRanges: sheetState?.autoFilterRanges ?? [],\n cachedFormulaValues: sheetState?.cachedFormulaValues ?? {},\n columnWidthCharacterWidthPx: sheetState?.columnWidthCharacterWidthPx,\n colCount: 0,\n colStyleIds: sheetState?.colStyleIds ?? {},\n colWidthOverridesPx: sheetState?.colWidthOverridesPx ?? {},\n colWidths: [],\n conditionalFormatRules: sheetState?.conditionalFormatRules ?? [],\n dataValidations: parseWorksheetDataValidations(worksheet),\n defaultColWidthPx,\n defaultRowHeightPx,\n freezePanes: parseWorksheetFreezePanes(worksheet),\n hasHorizontalMerges: mergeMetadata.hasHorizontalMerges,\n hasVerticalMerges: mergeMetadata.hasVerticalMerges,\n maxHorizontalMergeEndCol: mergeMetadata.maxHorizontalMergeEndCol,\n maxVerticalMergeEndRow: mergeMetadata.maxVerticalMergeEndRow,\n mergedRanges: mergeMetadata.mergedRanges,\n hiddenCols: sheetState?.hiddenCols ?? [],\n hiddenRows: sheetState?.hiddenRows ?? [],\n minUsedCol: -1,\n minUsedRow: -1,\n maxUsedCol: -1,\n maxUsedRow: -1,\n name: worksheet.name,\n visibility,\n namedCellStyleByName: structureAssets?.namedCellStyleByName ?? {},\n rowCount: 0,\n rowHeightOverridesPx: sheetState?.rowHeightOverridesPx ?? {},\n rowHeights: [],\n rowStyleIds: sheetState?.rowStyleIds ?? {},\n cellStyleIds: sheetState?.cellStyleIds ?? {},\n showGridLines: sheetState?.showGridLines ?? true,\n sparklines: sheetState?.sparklines ?? [],\n styleById: structureAssets?.styleById ?? {},\n tableStyleByName: structureAssets?.tableStyleByName ?? {},\n themePalette,\n visibleCols: [],\n visibleRows: [],\n workbookSheetIndex: index,\n zoomScale: resolveWorksheetZoomScale(worksheet, sheetState)\n });\n continue;\n }\n\n const [minRow, minCol, maxRow, maxCol] = resolveSheetDisplayUsedRange(usedRange, effectiveSheetState);\n const visibleRows: number[] = [];\n const hiddenRows: number[] = [];\n for (let row = 0; row <= maxRow; row += 1) {\n if (worksheet.isRowHidden(row)) {\n hiddenRows.push(row);\n } else {\n visibleRows.push(row);\n }\n }\n\n const visibleCols: number[] = [];\n const hiddenCols: number[] = [];\n for (let col = 0; col <= maxCol; col += 1) {\n if (worksheet.isColumnHidden(col)) {\n hiddenCols.push(col);\n } else {\n visibleCols.push(col);\n }\n }\n\n sheetsByWorkbookSheetIndex.push({\n autoFilterRanges: sheetState?.autoFilterRanges ?? [],\n cachedFormulaValues: sheetState?.cachedFormulaValues ?? {},\n columnWidthCharacterWidthPx: sheetState?.columnWidthCharacterWidthPx,\n colCount: visibleCols.length,\n colStyleIds: sheetState?.colStyleIds ?? {},\n colWidthOverridesPx: sheetState?.colWidthOverridesPx ?? {},\n colWidths: visibleCols.map(resolveColumnWidthPx),\n conditionalFormatRules: sheetState?.conditionalFormatRules ?? [],\n dataValidations: parseWorksheetDataValidations(worksheet),\n defaultColWidthPx,\n defaultRowHeightPx,\n freezePanes: parseWorksheetFreezePanes(worksheet),\n hasHorizontalMerges: mergeMetadata.hasHorizontalMerges,\n hasVerticalMerges: mergeMetadata.hasVerticalMerges,\n maxHorizontalMergeEndCol: mergeMetadata.maxHorizontalMergeEndCol,\n maxVerticalMergeEndRow: mergeMetadata.maxVerticalMergeEndRow,\n mergedRanges: mergeMetadata.mergedRanges,\n hiddenCols,\n hiddenRows,\n minUsedCol: minCol,\n minUsedRow: minRow,\n maxUsedCol: maxCol,\n maxUsedRow: maxRow,\n name: worksheet.name,\n visibility,\n namedCellStyleByName: structureAssets?.namedCellStyleByName ?? {},\n rowCount: visibleRows.length,\n rowHeightOverridesPx: sheetState?.rowHeightOverridesPx ?? {},\n rowHeights: visibleRows.map(resolveRowHeightPx),\n rowStyleIds: sheetState?.rowStyleIds ?? {},\n cellStyleIds: sheetState?.cellStyleIds ?? {},\n showGridLines: sheetState?.showGridLines ?? true,\n sparklines: sheetState?.sparklines ?? [],\n styleById: structureAssets?.styleById ?? {},\n tableStyleByName: structureAssets?.tableStyleByName ?? {},\n themePalette,\n visibleCols,\n visibleRows,\n workbookSheetIndex: index,\n zoomScale: resolveWorksheetZoomScale(worksheet, sheetState)\n });\n }\n\n return sheetsByWorkbookSheetIndex;\n}\n\nfunction mapWorksheetTables(\n worksheet: ReturnType<Workbook[\"getSheet\"]> | null,\n autoFilterRanges: XlsxCellRange[] = []\n): XlsxTable[] {\n const rawTables = (worksheet?.tables ?? []) as Array<Record<string, unknown>>;\n const mappedTables = rawTables.flatMap((table, index) => {\n const rawColumns = Array.isArray(table.columns) ? table.columns : [];\n const rawName = typeof table.name === \"string\" ? table.name : `Table${index + 1}`;\n const rawDisplayName =\n typeof table.displayName === \"string\"\n ? table.displayName\n : typeof table.name === \"string\"\n ? table.name\n : `Table ${index + 1}`;\n const rawReference = typeof table.reference === \"string\" ? table.reference : \"\";\n const reference = rawReference;\n const parsedRange = parseA1RangeReference(reference);\n if (!parsedRange) {\n return [];\n }\n\n return [{\n columns: rawColumns.map((column, columnIndex) => ({\n id: typeof (column as { id?: unknown }).id === \"number\" ? ((column as { id?: number }).id ?? columnIndex + 1) : columnIndex + 1,\n index: columnIndex,\n name: typeof (column as { name?: unknown }).name === \"string\" ? ((column as { name?: string }).name ?? `Column ${columnIndex + 1}`) : `Column ${columnIndex + 1}`\n })),\n displayName: rawDisplayName,\n end: parsedRange.end,\n headerRowCount: resolveWorkbookTableCount(table.headerRowCount, 1),\n headerRowCellStyle: typeof table.headerRowCellStyle === \"string\" ? table.headerRowCellStyle : undefined,\n name: rawName,\n reference,\n start: parsedRange.start,\n styleInfo: table.styleInfo as XlsxTable[\"styleInfo\"] | undefined,\n totalsRowCount: resolveWorkbookTableCount(table.totalsRowCount, 0),\n totalsRowShown: resolveWorkbookTableBoolean(table.totalsRowShown)\n }];\n });\n\n const existingReferences = new Set(mappedTables.map((table) => table.reference));\n const mappedAutoFilterTables = autoFilterRanges.flatMap((range, index) => {\n const reference = `${cellAddressToA1(range.start)}:${cellAddressToA1(range.end)}`;\n if (existingReferences.has(reference)) {\n return [];\n }\n\n const columnCount = Math.max(0, range.end.col - range.start.col + 1);\n const columns = Array.from({ length: columnCount }, (_, columnIndex) => {\n const headerValue = worksheet\n ? decodeHtmlEntities(worksheet.getFormattedValueAt(range.start.row, range.start.col + columnIndex) ?? \"\")\n : \"\";\n return {\n id: columnIndex + 1,\n index: columnIndex,\n name: headerValue.trim().length > 0 ? headerValue : `Column ${columnIndex + 1}`\n };\n });\n\n return [{\n columns,\n displayName: `AutoFilter ${index + 1}`,\n end: range.end,\n headerRowCount: 1,\n name: `__autofilter_${index + 1}_${reference}`,\n reference,\n start: range.start,\n totalsRowCount: 0,\n totalsRowShown: false\n } satisfies XlsxTable];\n });\n\n return [...mappedTables, ...mappedAutoFilterTables];\n}\n\nfunction resolveWorkbookTableCount(value: unknown, fallback: number) {\n if (typeof value === \"number\" && Number.isFinite(value) && value >= 0) {\n return value;\n }\n\n if (typeof value === \"string\") {\n const parsed = Number.parseInt(value, 10);\n if (Number.isFinite(parsed) && parsed >= 0) {\n return parsed;\n }\n }\n\n return fallback;\n}\n\nfunction resolveWorkbookTableBoolean(value: unknown) {\n if (typeof value === \"boolean\") {\n return value;\n }\n\n if (typeof value === \"number\") {\n return value !== 0;\n }\n\n if (typeof value === \"string\") {\n const normalized = value.trim().toLowerCase();\n if (normalized === \"0\" || normalized === \"false\" || normalized === \"\") {\n return false;\n }\n if (normalized === \"1\" || normalized === \"true\") {\n return true;\n }\n }\n\n return false;\n}\n\nfunction decodeHtmlEntities(value: string): string {\n return value\n .replace(/&quot;/g, \"\\\"\")\n .replace(/&#34;/g, \"\\\"\")\n .replace(/&apos;/g, \"'\")\n .replace(/&#39;/g, \"'\")\n .replace(/&lt;/g, \"<\")\n .replace(/&gt;/g, \">\")\n .replace(/&amp;/g, \"&\");\n}\n\nfunction getCellDisplayValue(worksheet: ReturnType<Workbook[\"getSheet\"]>, row: number, col: number, activeSheet?: XlsxSheetData | null) {\n const formula = worksheet.getFormulaAt(row, col);\n const cachedFormulaValue = formula ? activeSheet?.cachedFormulaValues?.[cellAddressToA1({ row, col })] : undefined;\n const formatted = worksheet.getFormattedValueAt(row, col);\n if (formatted && !(formula && cachedFormulaValue !== undefined && formatted.startsWith(\"#\"))) {\n return decodeHtmlEntities(formatted);\n }\n\n const cellValue = worksheet.getCalculatedValueAt(row, col);\n if (formula && cachedFormulaValue !== undefined && cellValue.is_error) {\n return cachedFormulaValue;\n }\n if (cellValue.is_error) {\n return cellValue.asError() ?? \"\";\n }\n if (cellValue.is_empty) {\n return \"\";\n }\n\n return cellValue.toString();\n}\n\nfunction cellAddressToA1(cell: XlsxCellAddress) {\n let col = cell.col + 1;\n let label = \"\";\n while (col > 0) {\n const remainder = (col - 1) % 26;\n label = String.fromCharCode(65 + remainder) + label;\n col = Math.floor((col - 1) / 26);\n }\n return `${label}${cell.row + 1}`;\n}\n\nasync function loadWorkbook(buffer: ArrayBuffer, skipXmlParsing = false, showHiddenSheets = false) {\n const wasmModule = await getSheetsWasmModule();\n const bytes = new Uint8Array(buffer);\n const effectiveSkipXmlParsing = shouldSkipXmlParsingForWorkbook(bytes, skipXmlParsing);\n let activeWorkbook = wasmModule.Workbook.fromBytes(bytes);\n let totalFormulas = 0;\n for (let index = 0; index < activeWorkbook.sheetCount; index += 1) {\n totalFormulas += activeWorkbook.getSheet(index).formulaCount;\n }\n\n if (totalFormulas <= FORMULA_COUNT_THRESHOLD) {\n const result = safeCalculate(activeWorkbook, {\n reparse: () => wasmModule.Workbook.fromBytes(bytes)\n });\n activeWorkbook = result.workbook;\n }\n\n const nextWorkbook = activeWorkbook;\n const shouldUseFastStructureParse =\n bytes.byteLength >= FAST_STRUCTURE_PARSE_THRESHOLD_BYTES && totalFormulas <= FORMULA_COUNT_THRESHOLD;\n const structureAssets = effectiveSkipXmlParsing || shouldUseFastStructureParse || !canParseXmlInWorker()\n ? null\n : parseWorkbookStructureAssets(bytes, {\n includeCachedFormulaValues: true\n });\n // Workers have no DOMParser, so theme1.xml is not parsed there; the engine\n // reads the same palette.\n const themePalette = structureAssets?.themePalette ?? buildThemePaletteFromHex(nextWorkbook.themePalette);\n formControlsByWorkbookSheetIndex = collectWorkbookFormControls(\n nextWorkbook,\n themePalette\n ).map(\n (controls, workbookSheetIndex) => controls.map((control) => ({\n ...control,\n items: resolveFormControlItems(nextWorkbook, workbookSheetIndex, control)\n }))\n );\n const sheetLayoutStates = structureAssets ? undefined : parseWorkerSheetLayoutAssets(bytes, nextWorkbook.sheetCount);\n workbook = nextWorkbook;\n sheets = buildSheetList(nextWorkbook, themePalette, structureAssets, sheetLayoutStates, showHiddenSheets);\n tablesByWorkbookSheetIndex = Array.from({ length: nextWorkbook.sheetCount }, (_, workbookSheetIndex) =>\n mapWorksheetTables(\n nextWorkbook.getSheet(workbookSheetIndex),\n structureAssets?.sheetStatesByWorkbookSheetIndex[workbookSheetIndex]?.autoFilterRanges ?? []\n )\n );\n const visibleSheetIndexByWorkbookSheetIndex = new Map(sheets.map((sheet, index) => [sheet.workbookSheetIndex, index]));\n const hasCharts = Array.from({ length: nextWorkbook.sheetCount }, (_, workbookSheetIndex) => {\n const worksheet = nextWorkbook.getSheet(workbookSheetIndex);\n const hasClassicCharts = Array.isArray(worksheet.charts) && worksheet.charts.length > 0;\n const hasModernCharts = Array.isArray(worksheet.chartsEx) && worksheet.chartsEx.length > 0;\n return hasClassicCharts || hasModernCharts;\n }).some(Boolean);\n const chartStyleAssets = effectiveSkipXmlParsing || !hasCharts || !canParseXmlInWorker()\n ? null\n : parseWorkbookChartStyleAssets(bytes);\n const chartAssets = loadWorkbookChartAssets(\n nextWorkbook,\n chartStyleAssets,\n visibleSheetIndexByWorkbookSheetIndex,\n showHiddenSheets\n );\n chartsByWorkbookSheetIndex = chartAssets.chartsByWorkbookSheetIndex;\n chartsheets = chartAssets.chartsheets;\n tabs = chartAssets.tabs;\n return {\n chartsByWorkbookSheetIndex,\n chartsheets,\n formControlsByWorkbookSheetIndex,\n sheets,\n tablesByWorkbookSheetIndex,\n tabs\n };\n}\n\nasync function parseCharts(buffer: ArrayBuffer, skipXmlParsing = false, showHiddenSheets = false) {\n const wasmModule = await getSheetsWasmModule();\n const bytes = new Uint8Array(buffer);\n const effectiveSkipXmlParsing = shouldSkipXmlParsingForWorkbook(bytes, skipXmlParsing);\n let activeWorkbook = wasmModule.Workbook.fromBytes(bytes);\n let totalFormulas = 0;\n for (let index = 0; index < activeWorkbook.sheetCount; index += 1) {\n totalFormulas += activeWorkbook.getSheet(index).formulaCount;\n }\n if (totalFormulas <= FORMULA_COUNT_THRESHOLD) {\n const result = safeCalculate(activeWorkbook, {\n reparse: () => wasmModule.Workbook.fromBytes(bytes)\n });\n activeWorkbook = result.workbook;\n }\n\n const nextWorkbook = activeWorkbook;\n const visibleSheetIndexByWorkbookSheetIndex = buildVisibleSheetIndexByWorkbookSheetIndex(nextWorkbook, showHiddenSheets);\n const chartStyleAssets = effectiveSkipXmlParsing || !canParseXmlInWorker()\n ? null\n : parseWorkbookChartStyleAssets(bytes);\n const chartAssets = loadWorkbookChartAssets(\n nextWorkbook,\n chartStyleAssets,\n visibleSheetIndexByWorkbookSheetIndex,\n showHiddenSheets\n );\n return {\n chartsByWorkbookSheetIndex: chartAssets.chartsByWorkbookSheetIndex,\n chartsheets: chartAssets.chartsheets,\n tabs: chartAssets.tabs\n };\n}\n\nfunction respond(message: WorkerResponse) {\n self.postMessage(message);\n}\n\nasync function handleMessage(message: WorkerRequest) {\n switch (message.type) {\n case \"load\": {\n if (message.payload.wasmSource !== undefined) {\n setWasmSource(message.payload.wasmSource);\n }\n return loadWorkbook(message.payload.buffer, message.payload.skipXmlParsing, message.payload.showHiddenSheets);\n }\n case \"parseCharts\": {\n if (message.payload.wasmSource !== undefined) {\n setWasmSource(message.payload.wasmSource);\n }\n return parseCharts(message.payload.buffer, message.payload.skipXmlParsing, message.payload.showHiddenSheets);\n }\n case \"getCellSnapshot\": {\n if (!workbook) {\n return {\n displayValue: \"\",\n formula: \"\"\n };\n }\n\n const targetSheet = sheets.find((sheet) => sheet.workbookSheetIndex === message.payload.workbookSheetIndex) ?? null;\n const worksheet = workbook.getSheet(message.payload.workbookSheetIndex);\n return {\n displayValue: getCellDisplayValue(worksheet, message.payload.row, message.payload.col, targetSheet),\n formula: worksheet.getFormulaAt(message.payload.row, message.payload.col) ?? \"\"\n };\n }\n case \"getRowsBatch\": {\n if (!workbook) {\n return null;\n }\n\n const worksheet = workbook.getSheet(message.payload.workbookSheetIndex) as ReturnType<Workbook[\"getSheet\"]> & {\n getRowsBatch?: (startRow: number, maxRows: number, options?: unknown) => unknown;\n };\n if (typeof worksheet.getRowsBatch !== \"function\") {\n return null;\n }\n\n const rows = worksheet.getRowsBatch(message.payload.startRow, message.payload.rowCount, {\n includeFormulas: true,\n includeHyperlinks: true,\n includeMergeInfo: true,\n includeStyles: true,\n useFormattedValues: true\n }) as Array<{ index: number; cells: Array<{ col: number; isMergedSecondary?: boolean; generalAlignment?: string }> }> | null;\n for (const row of rows ?? []) {\n for (const cell of row.cells) {\n if (!cell.isMergedSecondary) {\n cell.generalAlignment = getCellGeneralAlignment(worksheet, row.index, cell.col);\n }\n }\n }\n return rows;\n }\n default:\n return null;\n }\n}\n\nself.addEventListener(\"message\", (event: MessageEvent<WorkerRequest>) => {\n const message = event.data;\n void handleMessage(message)\n .then((result) => {\n respond({\n id: message.id,\n result,\n success: true\n });\n })\n .catch((error: unknown) => {\n respond({\n error: error instanceof Error ? error.message : \"Worker request failed.\",\n id: message.id,\n success: false\n } satisfies WorkerErrorResponse);\n });\n});\n\nself.postMessage({ type: \"ready\" });\n"],"mappings":"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","names":["ptr","module","l","_a","_a","_a","max","styleAppearance","plotAreaShapeProperties","workbook","primarySeries","ext","cx","cy","chartsheets","chartsByWorkbookSheetIndex","tabs","normalizeHexColor","parseHexColor","rgbToHsl","max","hueToRgb","hslToRgb","rgbToHex","themeColor","EMU_PER_PIXEL","normalizeArchivePath","dirname","dirname","parseXml","document","readArchiveText","isElementNode","document","parseXml","readArchiveText","document","parseXml","normalizeArchivePath","readArchiveText","document","parseXml","sheets","isElementNode","normalizeHexColor","max","normalizeHexColor","workbook","workbook","err","MIN_ROW_HEIGHT_PX","normalizeWorksheetVisibility","readArchiveText","parseA1CellReference","parseA1RangeReference","wasmModule"]}