{"version":3,"file":"workbook.mjs","names":[],"sources":["../src/workbook/protection.ts","../src/workbook/views.ts","../src/workbook/calc-properties.ts","../src/workbook/workbook-properties.ts","../src/workbook/file-version.ts","../src/workbook/file-sharing.ts","../src/workbook/file-recovery.ts","../src/workbook/smart-tags.ts","../src/workbook/function-groups.ts"],"sourcesContent":["// Workbook-level <workbookProtection>. Per ECMA-376 §18.2.29 and (workbook\n// side).\n//\n// Two parallel password-hash quadruples cover Excel's \"Protect Workbook\"\n// dialog: one set locks structure / window resize, the other locks the\n// revision-tracking history. The wire-form attrs round-trip verbatim —\n// computing a fresh hash from a plaintext password lives behind a future helper\n// (D-tier in the roadmap).\n//\n// Note: the non-hash `workbookPassword` / `revisionsPassword` attrs are the\n// legacy Excel 97/2000 hex hash form. Modern files use the `*HashValue` +\n// `*SaltValue` + `*SpinCount` + `*AlgorithmName` quad instead.\n\nexport interface WorkbookProtection {\n  /** Legacy 16-bit hex hash of the workbook password (\"CC1A\" etc.). */\n  workbookPassword?: string;\n  workbookPasswordCharacterSet?: string;\n  workbookAlgorithmName?: string;\n  workbookHashValue?: string;\n  workbookSaltValue?: string;\n  workbookSpinCount?: number;\n  /** Legacy 16-bit hex hash of the revisions-tracking password. */\n  revisionsPassword?: string;\n  revisionsPasswordCharacterSet?: string;\n  revisionsAlgorithmName?: string;\n  revisionsHashValue?: string;\n  revisionsSaltValue?: string;\n  revisionsSpinCount?: number;\n  /** Lock add/delete/move/rename/hide of sheets. */\n  lockStructure?: boolean;\n  /** Lock the workbook window size and position. */\n  lockWindows?: boolean;\n  /** Lock revision tracking — enabled with the \"Track Changes\" feature. */\n  lockRevision?: boolean;\n}\n\nexport const makeWorkbookProtection = (opts: WorkbookProtection = {}): WorkbookProtection => {\n  const out: WorkbookProtection = {};\n  for (const k of [\n    'workbookPassword',\n    'workbookPasswordCharacterSet',\n    'workbookAlgorithmName',\n    'workbookHashValue',\n    'workbookSaltValue',\n    'revisionsPassword',\n    'revisionsPasswordCharacterSet',\n    'revisionsAlgorithmName',\n    'revisionsHashValue',\n    'revisionsSaltValue',\n  ] as const) {\n    if (opts[k] !== undefined) out[k] = opts[k];\n  }\n  if (opts.workbookSpinCount !== undefined) out.workbookSpinCount = opts.workbookSpinCount;\n  if (opts.revisionsSpinCount !== undefined) out.revisionsSpinCount = opts.revisionsSpinCount;\n  if (opts.lockStructure !== undefined) out.lockStructure = opts.lockStructure;\n  if (opts.lockWindows !== undefined) out.lockWindows = opts.lockWindows;\n  if (opts.lockRevision !== undefined) out.lockRevision = opts.lockRevision;\n  return out;\n};\n\n// ---- Workbook ergonomic helpers -----------------------------------------\n\nimport type { Workbook } from './workbook';\n\n/**\n * Lock the workbook with Excel's \"Protect Workbook → Structure\" default\n * (lockStructure=true). Pass `overrides` to also lock windows /\n * revision-tracking, or to attach a password-hash quad. Plaintext password\n * support is deferred until the D-tier hashing helper lands.\n */\nexport const protectWorkbook = (\n  wb: Workbook,\n  overrides: Partial<WorkbookProtection> = {},\n): WorkbookProtection => {\n  wb.workbookProtection = { lockStructure: true, ...overrides };\n  return wb.workbookProtection;\n};\n\n/** Drop the workbook-protection record entirely. */\nexport const unprotectWorkbook = (wb: Workbook): void => {\n  delete (wb as { workbookProtection?: WorkbookProtection }).workbookProtection;\n};\n\n/** True iff `lockStructure === true`. */\nexport const isWorkbookProtected = (wb: Workbook): boolean =>\n  wb.workbookProtection?.lockStructure === true;\n","// Workbook-level <bookViews> typed model. Per ECMA-376 §18.2.30 and\n// openpyxl/openpyxl/workbook/views.py.\n//\n// `<bookViews>` carries one or more `<workbookView>` entries. The\n// first entry drives Excel's default tab strip (firstSheet / activeTab)\n// and window position. Most workbooks have exactly one entry.\n\nexport type WorkbookViewVisibility = 'visible' | 'hidden' | 'veryHidden';\n\nexport interface WorkbookView {\n  visibility?: WorkbookViewVisibility;\n  minimized?: boolean;\n  showHorizontalScroll?: boolean;\n  showVerticalScroll?: boolean;\n  showSheetTabs?: boolean;\n  /** Window x position in screen pixels — Excel restores it when re-opening. */\n  xWindow?: number;\n  /** Window y position. */\n  yWindow?: number;\n  windowWidth?: number;\n  windowHeight?: number;\n  /** Width of the sheet tab strip relative to the horizontal scroll bar (0..1000, default 600). */\n  tabRatio?: number;\n  /** Index of the leftmost visible sheet tab (0-based). */\n  firstSheet?: number;\n  /** Index of the currently active sheet tab (0-based). */\n  activeTab?: number;\n  autoFilterDateGrouping?: boolean;\n}\n\nexport const makeWorkbookView = (opts: WorkbookView = {}): WorkbookView => ({ ...opts });\n\nexport type CustomViewShowComments = 'commNone' | 'commIndicator' | 'commIndAndComment';\nexport type CustomViewShowObjects = 'all' | 'placeholders' | 'none';\n\nexport interface CustomWorkbookView {\n  name: string;\n  guid: string;\n  /** Window width in screen pixels — required when the element is present. */\n  windowWidth: number;\n  windowHeight: number;\n  /** Index (0-based) of the sheet active in this saved view. */\n  activeSheetId: number;\n  autoUpdate?: boolean;\n  /** Auto-merge interval in minutes (for shared workbooks). */\n  mergeInterval?: number;\n  changesSavedWin?: boolean;\n  onlySync?: boolean;\n  personalView?: boolean;\n  includePrintSettings?: boolean;\n  includeHiddenRowCol?: boolean;\n  maximized?: boolean;\n  minimized?: boolean;\n  showHorizontalScroll?: boolean;\n  showVerticalScroll?: boolean;\n  showSheetTabs?: boolean;\n  xWindow?: number;\n  yWindow?: number;\n  tabRatio?: number;\n  showFormulaBar?: boolean;\n  showStatusbar?: boolean;\n  showComments?: CustomViewShowComments;\n  showObjects?: CustomViewShowObjects;\n}\n\nexport const makeCustomWorkbookView = (\n  opts: Pick<CustomWorkbookView, 'name' | 'guid' | 'windowWidth' | 'windowHeight' | 'activeSheetId'> &\n    Partial<CustomWorkbookView>,\n): CustomWorkbookView => ({ ...opts });\n\nimport type { Workbook } from './workbook';\n\n/**\n * Get-or-create the primary `<workbookView>` entry. Most workbooks have\n * exactly one `<workbookView>`; this helper is the right place to hang\n * tab-strip / window state edits without forcing the caller to allocate\n * the array themselves.\n */\nconst ensurePrimaryView = (wb: Workbook): WorkbookView => {\n  const existing = wb.bookViews?.[0];\n  if (existing) return existing;\n  const fresh = makeWorkbookView();\n  wb.bookViews = [fresh];\n  return fresh;\n};\n\n/** Get the index of the active sheet tab (0-based) from the primary workbookView, or 0 if unset. */\nexport const getActiveTab = (wb: Workbook): number => wb.bookViews?.[0]?.activeTab ?? 0;\n\n/** Set the active sheet tab (0-based) on the primary workbookView. */\nexport const setActiveTab = (wb: Workbook, index: number): void => {\n  ensurePrimaryView(wb).activeTab = index;\n};\n\n/** Get the index of the leftmost visible sheet tab from the primary workbookView, or 0 if unset. */\nexport const getFirstSheet = (wb: Workbook): number => wb.bookViews?.[0]?.firstSheet ?? 0;\n\n/** Set the leftmost visible sheet tab on the primary workbookView. */\nexport const setFirstSheet = (wb: Workbook, index: number): void => {\n  ensurePrimaryView(wb).firstSheet = index;\n};\n\n/** Set the tab strip width ratio (0..1000, Excel default 600). */\nexport const setTabRatio = (wb: Workbook, ratio: number): void => {\n  ensurePrimaryView(wb).tabRatio = ratio;\n};\n\n/** Toggle the sheet tab strip visibility. */\nexport const setShowSheetTabs = (wb: Workbook, show: boolean): void => {\n  ensurePrimaryView(wb).showSheetTabs = show;\n};\n\n/** Toggle the horizontal scroll bar in Excel's window chrome. */\nexport const setShowHorizontalScroll = (wb: Workbook, show: boolean): void => {\n  ensurePrimaryView(wb).showHorizontalScroll = show;\n};\n\n/** Toggle the vertical scroll bar in Excel's window chrome. */\nexport const setShowVerticalScroll = (wb: Workbook, show: boolean): void => {\n  ensurePrimaryView(wb).showVerticalScroll = show;\n};\n\n/**\n * Toggle the workbook window minimised state. Excel honours this on\n * reopen so the file restores into the minimised state it was saved\n * with.\n */\nexport const setWorkbookMinimized = (wb: Workbook, minimized: boolean): void => {\n  ensurePrimaryView(wb).minimized = minimized;\n};\n\n/** Set the visibility of the workbook window itself ('visible' / 'hidden' / 'veryHidden'). */\nexport const setWorkbookVisibility = (wb: Workbook, visibility: WorkbookViewVisibility): void => {\n  ensurePrimaryView(wb).visibility = visibility;\n};\n\n/**\n * Set window position + size on the primary workbookView in one call.\n * Pass `undefined` for any axis to leave it untouched.\n */\nexport const setWorkbookWindow = (\n  wb: Workbook,\n  opts: { xWindow?: number; yWindow?: number; windowWidth?: number; windowHeight?: number },\n): void => {\n  const v = ensurePrimaryView(wb);\n  if (opts.xWindow !== undefined) v.xWindow = opts.xWindow;\n  if (opts.yWindow !== undefined) v.yWindow = opts.yWindow;\n  if (opts.windowWidth !== undefined) v.windowWidth = opts.windowWidth;\n  if (opts.windowHeight !== undefined) v.windowHeight = opts.windowHeight;\n};\n","// Workbook-level <calcPr>. Per ECMA-376 §18.2.2.\n//\n// `calcId` is a build identifier Excel uses to decide whether to force\n// a recalc when re-opening; modern Excel treats any value as \"use\n// what's there\". The other attrs cover Excel's calculation options\n// (Tools → Options → Formulas).\n\nexport type CalcMode = 'manual' | 'auto' | 'autoNoTable';\nexport type RefMode = 'A1' | 'R1C1';\n\nexport interface CalcProperties {\n  /** Excel build/calc-engine identifier; OpenOffice sets 191621, Excel 2016+ 162913 etc. */\n  calcId?: number;\n  calcMode?: CalcMode;\n  /** Force a full recalc when the workbook is loaded. Excel default `true` for safety. */\n  fullCalcOnLoad?: boolean;\n  refMode?: RefMode;\n  /** Allow circular references via iterative calculation. */\n  iterate?: boolean;\n  iterateCount?: number;\n  iterateDelta?: number;\n  /** Use full 15-digit precision (vs. displayed precision). */\n  fullPrecision?: boolean;\n  calcCompleted?: boolean;\n  /** Run a recalc on save. */\n  calcOnSave?: boolean;\n  /** Use multi-threaded calculation. */\n  concurrentCalc?: boolean;\n  concurrentManualCount?: number;\n  /** Force a full recalc on next interaction. */\n  forceFullCalc?: boolean;\n}\n\nexport const makeCalcProperties = (opts: CalcProperties = {}): CalcProperties => ({ ...opts });\n\n// ---- Workbook ergonomic helpers ----------------------------------------\n\nimport type { Workbook } from './workbook';\n\nconst ensureCalcProperties = (wb: Workbook): CalcProperties => {\n  if (!wb.calcProperties) wb.calcProperties = {};\n  return wb.calcProperties;\n};\n\n/**\n * Set the recalculation mode. `'auto'` is Excel's default;\n * `'manual'` requires F9 to recompute formulas; `'autoNoTable'`\n * recomputes everything except data-table cells.\n */\nexport const setCalcMode = (wb: Workbook, mode: CalcMode): void => {\n  ensureCalcProperties(wb).calcMode = mode;\n};\n\n/**\n * Toggle iterative calculation (Excel's \"Enable iterative calculation\"\n * option). When `enable` is true and `count` / `delta` are provided,\n * they replace the default Excel limits (100 iterations, 0.001 delta).\n */\nexport const setIterativeCalc = (\n  wb: Workbook,\n  enable: boolean,\n  opts: { count?: number; delta?: number } = {},\n): void => {\n  const calc = ensureCalcProperties(wb);\n  calc.iterate = enable;\n  if (opts.count !== undefined) calc.iterateCount = opts.count;\n  if (opts.delta !== undefined) calc.iterateDelta = opts.delta;\n};\n\n/** Toggle \"Recalculate workbook before saving\" (workbook-level). */\nexport const setCalcOnSave = (wb: Workbook, on: boolean): void => {\n  ensureCalcProperties(wb).calcOnSave = on;\n};\n\n/** Toggle \"Recalculate workbook on load\" — forces a full recalc on open. */\nexport const setFullCalcOnLoad = (wb: Workbook, on: boolean): void => {\n  ensureCalcProperties(wb).fullCalcOnLoad = on;\n};\n\n/** Toggle \"Set precision as displayed\" (false = full 15-digit precision). */\nexport const setFullPrecision = (wb: Workbook, on: boolean): void => {\n  ensureCalcProperties(wb).fullPrecision = on;\n};\n","// Workbook-level <workbookPr>. Per ECMA-376 §18.2.28.\n//\n// Mirrors openpyxl/openpyxl/workbook/properties.py WorkbookProperties.\n// `date1904` is already lifted via wb.date1904; everything else lived\n// in workbookXmlExtras passthrough until now. This typed shell promotes\n// all 19 attrs into the modeled workbook so consumers can edit them\n// without rebuilding the XmlNode.\n\nexport type ShowObjectsMode = 'all' | 'placeholders' | 'none';\nexport type UpdateLinksMode = 'userSet' | 'never' | 'always';\n\nexport interface WorkbookProperties {\n  /**\n   * Mac 1904 epoch flag. Mirrored from `Workbook.date1904` — the\n   * canonical source. Setting it here has no effect on the cell-serial\n   * conversion path, which keys off the top-level field.\n   */\n  date1904?: boolean;\n  /** Excel 5/95 ↔ 2007 compatibility hint. */\n  dateCompatibility?: boolean;\n  showObjects?: ShowObjectsMode;\n  showBorderUnselectedTables?: boolean;\n  filterPrivacy?: boolean;\n  promptedSolutions?: boolean;\n  showInkAnnotation?: boolean;\n  backupFile?: boolean;\n  /** Cache external-link values when saving. */\n  saveExternalLinkValues?: boolean;\n  /** \"Update remote links\" prompt mode. */\n  updateLinks?: UpdateLinksMode;\n  /** VBA codeName for the workbook (e.g. \"ThisWorkbook\" / \"ЭтаКнига\"). */\n  codeName?: string;\n  hidePivotFieldList?: boolean;\n  showPivotChartFilter?: boolean;\n  allowRefreshQuery?: boolean;\n  publishItems?: boolean;\n  checkCompatibility?: boolean;\n  autoCompressPictures?: boolean;\n  refreshAllConnections?: boolean;\n  /** Theme schema version (Excel 2007 = 124226, 2013+ = 153222). */\n  defaultThemeVersion?: number;\n}\n\nexport const makeWorkbookProperties = (opts: WorkbookProperties = {}): WorkbookProperties => ({ ...opts });\n\n// ---- Workbook ergonomic helpers ----------------------------------------\n\nimport type { Workbook } from './workbook';\n\nconst ensureWorkbookProperties = (wb: Workbook): WorkbookProperties => {\n  if (!wb.workbookProperties) wb.workbookProperties = {};\n  return wb.workbookProperties;\n};\n\n/**\n * Set the workbook-level VBA codeName (\"ThisWorkbook\" by default in\n * Excel; localised forms like \"ЭтаКнига\" round-trip too). Empty string\n * is allowed — Excel writes it that way for codename-stripped files.\n */\nexport const setWorkbookCodeName = (wb: Workbook, codeName: string): void => {\n  ensureWorkbookProperties(wb).codeName = codeName;\n};\n\n/**\n * Toggle the Mac 1904 epoch. The canonical flag is `wb.date1904`\n * (drives cell-serial conversion); this helper writes both the\n * canonical field and the mirror on `workbookProperties` so a save\n * emits a consistent `<workbookPr date1904=\"…\">` attribute.\n */\nexport const setDate1904 = (wb: Workbook, on: boolean): void => {\n  wb.date1904 = on;\n  ensureWorkbookProperties(wb).date1904 = on;\n};\n\n/**\n * Set the \"Update remote links\" prompt mode. `'userSet'` keeps\n * Excel's per-user preference; `'never'` disables the prompt;\n * `'always'` forces it. Mirrors the Trust Center \"External Content\"\n * dropdown.\n */\nexport const setUpdateLinksMode = (wb: Workbook, mode: UpdateLinksMode): void => {\n  ensureWorkbookProperties(wb).updateLinks = mode;\n};\n\n/** Toggle the \"filterPrivacy\" hint Excel writes to indicate filter contents may be sensitive. */\nexport const setFilterPrivacy = (wb: Workbook, on: boolean): void => {\n  ensureWorkbookProperties(wb).filterPrivacy = on;\n};\n","// Workbook-level <fileVersion>. Per ECMA-376 §18.2.13.\n//\n// Carries Microsoft Office app/version metadata that Excel writes\n// when it saves; round-tripping these values keeps the file looking\n// like Excel's own output to downstream tools that sniff them.\n\nexport interface FileVersion {\n  /** Application that last saved the workbook (\"xl\" for Excel). */\n  appName?: string;\n  /** Build number of the last editor (e.g. \"7.5210\"). */\n  lastEdited?: string;\n  /** Build number of the lowest editor (oldest Excel that touched the file). */\n  lowestEdited?: string;\n  /** Internal \"rolled-up build\" number. */\n  rupBuild?: string;\n  /** GUID identifying the file content (Excel uses it to detect re-saves). */\n  codeName?: string;\n}\n\nexport const makeFileVersion = (opts: FileVersion = {}): FileVersion => ({ ...opts });\n","// Workbook-level <fileSharing>. Per ECMA-376 §18.2.12.\n//\n// Carries the workbook's read-only / write-protection settings (Save\n// As → Tools → General Options → \"Modify password\" / \"Read-only\n// recommended\"). The hash quad mirrors sheetProtection / workbookProtection.\n\nexport interface FileSharing {\n  /** Mark the workbook as \"Read-only recommended\" — Excel pops a dialog on open. */\n  readOnlyRecommended?: boolean;\n  /** Author name attached to the read/write password. */\n  userName?: string;\n  /** Legacy 16-bit hex hash of the reservation password. */\n  reservationPassword?: string;\n  /** Modern hash quad — algorithmName + hashValue + saltValue + spinCount. */\n  algorithmName?: string;\n  hashValue?: string;\n  saltValue?: string;\n  spinCount?: number;\n}\n\nexport const makeFileSharing = (opts: FileSharing = {}): FileSharing => ({ ...opts });\n","// Workbook-level <fileRecoveryPr>. Per ECMA-376 §18.2.11.\n//\n// Excel writes this element after an autorecover sequence to mark the\n// workbook with the recovery state so subsequent opens can prompt the\n// user. Almost always absent in fresh files.\n\nexport interface FileRecoveryProperties {\n  /** True after an autorecover save — Excel uses it to display the recovery banner. */\n  autoRecover?: boolean;\n  /** Persisted crash-recovery flag. */\n  crashSave?: boolean;\n  /** Mark the file as \"data extracted from a damaged workbook\". */\n  dataExtractLoad?: boolean;\n  /** Workbook was repaired during load. */\n  repairLoad?: boolean;\n}\n\nexport const makeFileRecoveryProperties = (\n  opts: FileRecoveryProperties = {},\n): FileRecoveryProperties => ({ ...opts });\n","// Workbook-level <smartTagPr> + <smartTagTypes>. Per ECMA-376 §18.2.26\n// / §18.2.27. Smart tags were Excel 2003's auto-recognized data\n// (stock symbols, dates, names) and are deprecated, but the elements\n// still appear in some legacy workbooks.\n\nexport type SmartTagShowMode = 'all' | 'noIndicator';\n\nexport interface SmartTagProperties {\n  /** Embed smart tags into the workbook on save. */\n  embed?: boolean;\n  show?: SmartTagShowMode;\n}\n\nexport interface SmartTagType {\n  namespaceUri?: string;\n  name?: string;\n  url?: string;\n}\n\nexport const makeSmartTagProperties = (opts: SmartTagProperties = {}): SmartTagProperties => ({ ...opts });\n\nexport const makeSmartTagType = (opts: SmartTagType = {}): SmartTagType => ({ ...opts });\n","// Workbook-level <functionGroups>. Per ECMA-376 §18.2.14.\n//\n// Excel registers built-in function groups (Math/Statistical/Logical/...)\n// implicitly with a `builtInGroupCount` count and supports user-defined\n// XLL function groups appended after that count. Most workbooks don't\n// carry this element at all.\n\nexport interface FunctionGroup {\n  name: string;\n}\n\nexport interface FunctionGroups {\n  /** Number of built-in groups Excel reserves before user entries (default 16). */\n  builtInGroupCount?: number;\n  groups: FunctionGroup[];\n}\n\nexport const makeFunctionGroup = (name: string): FunctionGroup => ({ name });\n\nexport const makeFunctionGroups = (opts: Partial<FunctionGroups> = {}): FunctionGroups => ({\n  groups: opts.groups?.slice() ?? [],\n  ...(opts.builtInGroupCount !== undefined ? { builtInGroupCount: opts.builtInGroupCount } : {}),\n});\n"],"mappings":";;;AAoCA,MAAa,0BAA0B,OAA2B,CAAC,MAA0B;CAC3F,MAAM,MAA0B,CAAC;CACjC,KAAK,MAAM,KAAK;EACd;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF,GACE,IAAI,KAAK,OAAO,KAAA,GAAW,IAAI,KAAK,KAAK;CAE3C,IAAI,KAAK,sBAAsB,KAAA,GAAW,IAAI,oBAAoB,KAAK;CACvE,IAAI,KAAK,uBAAuB,KAAA,GAAW,IAAI,qBAAqB,KAAK;CACzE,IAAI,KAAK,kBAAkB,KAAA,GAAW,IAAI,gBAAgB,KAAK;CAC/D,IAAI,KAAK,gBAAgB,KAAA,GAAW,IAAI,cAAc,KAAK;CAC3D,IAAI,KAAK,iBAAiB,KAAA,GAAW,IAAI,eAAe,KAAK;CAC7D,OAAO;AACT;;;AC5BA,MAAa,oBAAoB,OAAqB,CAAC,OAAqB,EAAE,GAAG,KAAK;AAmCtF,MAAa,0BACX,UAEwB,EAAE,GAAG,KAAK;;;ACnCpC,MAAa,sBAAsB,OAAuB,CAAC,OAAuB,EAAE,GAAG,KAAK;;;ACU5F,MAAa,0BAA0B,OAA2B,CAAC,OAA2B,EAAE,GAAG,KAAK;;;ACxBxG,MAAa,mBAAmB,OAAoB,CAAC,OAAoB,EAAE,GAAG,KAAK;;;ACCnF,MAAa,mBAAmB,OAAoB,CAAC,OAAoB,EAAE,GAAG,KAAK;;;ACHnF,MAAa,8BACX,OAA+B,CAAC,OACJ,EAAE,GAAG,KAAK;;;ACAxC,MAAa,0BAA0B,OAA2B,CAAC,OAA2B,EAAE,GAAG,KAAK;AAExG,MAAa,oBAAoB,OAAqB,CAAC,OAAqB,EAAE,GAAG,KAAK;;;ACJtF,MAAa,qBAAqB,UAAiC,EAAE,KAAK;AAE1E,MAAa,sBAAsB,OAAgC,CAAC,OAAuB;CACzF,QAAQ,KAAK,QAAQ,MAAM,KAAK,CAAC;CACjC,GAAI,KAAK,sBAAsB,KAAA,IAAY,EAAE,mBAAmB,KAAK,kBAAkB,IAAI,CAAC;AAC9F"}